From b0caecb3f7d41e4e61ce8507d492c6b5b5222141 Mon Sep 17 00:00:00 2001
From: oblomov <102328295+oblomov-dev@users.noreply.github.com>
Date: Thu, 15 Jun 2023 16:22:56 +0000
Subject: [PATCH] project reorganization
---
.abapgit.xml | 20 +
LICENSE | 21 +
README.md | 84 +
abaplint.jsonc | 262 ++
src/00/package.devc.xml | 10 +
src/00/z2ui5_cl_app_demo_00.clas.abap | 176 +
src/00/z2ui5_cl_app_demo_00.clas.xml | 16 +
src/00/z2ui5_cl_app_demo_01.clas.abap | 54 +
src/00/z2ui5_cl_app_demo_01.clas.xml | 16 +
src/00/z2ui5_cl_app_demo_02.clas.abap | 198 ++
src/00/z2ui5_cl_app_demo_02.clas.xml | 16 +
src/00/z2ui5_cl_app_demo_03.clas.abap | 72 +
src/00/z2ui5_cl_app_demo_03.clas.xml | 16 +
src/00/z2ui5_cl_app_demo_04.clas.abap | 122 +
src/00/z2ui5_cl_app_demo_04.clas.xml | 16 +
src/00/z2ui5_cl_app_demo_05.clas.abap | 190 ++
src/00/z2ui5_cl_app_demo_05.clas.xml | 16 +
src/00/z2ui5_cl_app_demo_06.clas.abap | 94 +
src/00/z2ui5_cl_app_demo_06.clas.xml | 16 +
src/00/z2ui5_cl_app_demo_07.clas.abap | 90 +
src/00/z2ui5_cl_app_demo_07.clas.xml | 16 +
src/00/z2ui5_cl_app_demo_08.clas.abap | 92 +
src/00/z2ui5_cl_app_demo_08.clas.xml | 16 +
src/00/z2ui5_cl_app_demo_10.clas.abap | 103 +
src/00/z2ui5_cl_app_demo_10.clas.xml | 16 +
src/00/z2ui5_cl_app_demo_11.clas.abap | 132 +
src/00/z2ui5_cl_app_demo_11.clas.xml | 16 +
src/00/z2ui5_cl_app_demo_13.clas.abap | 269 ++
.../z2ui5_cl_app_demo_13.clas.locals_imp.abap | 312 ++
src/00/z2ui5_cl_app_demo_13.clas.xml | 16 +
src/00/z2ui5_cl_app_demo_14.clas.abap | 102 +
.../z2ui5_cl_app_demo_14.clas.locals_imp.abap | 190 ++
src/00/z2ui5_cl_app_demo_14.clas.xml | 16 +
src/00/z2ui5_cl_app_demo_16.clas.abap | 261 ++
.../z2ui5_cl_app_demo_16.clas.locals_imp.abap | 194 ++
src/00/z2ui5_cl_app_demo_16.clas.xml | 16 +
src/00/z2ui5_cl_app_demo_17.clas.abap | 98 +
.../z2ui5_cl_app_demo_17.clas.locals_imp.abap | 193 ++
src/00/z2ui5_cl_app_demo_17.clas.xml | 16 +
src/00/z2ui5_cl_app_demo_18.clas.abap | 79 +
.../z2ui5_cl_app_demo_18.clas.locals_imp.abap | 194 ++
src/00/z2ui5_cl_app_demo_18.clas.xml | 16 +
src/00/z2ui5_cl_app_demo_19.clas.abap | 108 +
src/00/z2ui5_cl_app_demo_19.clas.xml | 16 +
src/00/z2ui5_cl_app_demo_20.clas.abap | 87 +
src/00/z2ui5_cl_app_demo_20.clas.xml | 16 +
src/00/z2ui5_cl_app_demo_21.clas.abap | 243 ++
src/00/z2ui5_cl_app_demo_21.clas.xml | 16 +
src/00/z2ui5_cl_app_demo_22.clas.abap | 143 +
src/00/z2ui5_cl_app_demo_22.clas.xml | 16 +
src/00/z2ui5_cl_app_demo_23.clas.abap | 95 +
src/00/z2ui5_cl_app_demo_23.clas.xml | 16 +
src/00/z2ui5_cl_app_demo_24.clas.abap | 82 +
src/00/z2ui5_cl_app_demo_24.clas.xml | 16 +
src/00/z2ui5_cl_app_demo_25.clas.abap | 117 +
src/00/z2ui5_cl_app_demo_25.clas.xml | 16 +
src/package.devc.xml | 10 +
src/z2ui5_cl_http_handler.clas.abap | 435 +++
...z2ui5_cl_http_handler.clas.locals_imp.abap | 3031 +++++++++++++++++
...2ui5_cl_http_handler.clas.testclasses.abap | 26 +
src/z2ui5_cl_http_handler.clas.xml | 17 +
src/z2ui5_if_app.intf.abap | 10 +
src/z2ui5_if_app.intf.xml | 15 +
src/z2ui5_if_client.intf.abap | 91 +
src/z2ui5_if_client.intf.xml | 15 +
src/z2ui5_if_view.intf.abap | 653 ++++
src/z2ui5_if_view.intf.xml | 15 +
src/z2ui5_t_draft.tabl.xml | 94 +
68 files changed, 9267 insertions(+)
create mode 100644 .abapgit.xml
create mode 100644 LICENSE
create mode 100644 README.md
create mode 100644 abaplint.jsonc
create mode 100644 src/00/package.devc.xml
create mode 100644 src/00/z2ui5_cl_app_demo_00.clas.abap
create mode 100644 src/00/z2ui5_cl_app_demo_00.clas.xml
create mode 100644 src/00/z2ui5_cl_app_demo_01.clas.abap
create mode 100644 src/00/z2ui5_cl_app_demo_01.clas.xml
create mode 100644 src/00/z2ui5_cl_app_demo_02.clas.abap
create mode 100644 src/00/z2ui5_cl_app_demo_02.clas.xml
create mode 100644 src/00/z2ui5_cl_app_demo_03.clas.abap
create mode 100644 src/00/z2ui5_cl_app_demo_03.clas.xml
create mode 100644 src/00/z2ui5_cl_app_demo_04.clas.abap
create mode 100644 src/00/z2ui5_cl_app_demo_04.clas.xml
create mode 100644 src/00/z2ui5_cl_app_demo_05.clas.abap
create mode 100644 src/00/z2ui5_cl_app_demo_05.clas.xml
create mode 100644 src/00/z2ui5_cl_app_demo_06.clas.abap
create mode 100644 src/00/z2ui5_cl_app_demo_06.clas.xml
create mode 100644 src/00/z2ui5_cl_app_demo_07.clas.abap
create mode 100644 src/00/z2ui5_cl_app_demo_07.clas.xml
create mode 100644 src/00/z2ui5_cl_app_demo_08.clas.abap
create mode 100644 src/00/z2ui5_cl_app_demo_08.clas.xml
create mode 100644 src/00/z2ui5_cl_app_demo_10.clas.abap
create mode 100644 src/00/z2ui5_cl_app_demo_10.clas.xml
create mode 100644 src/00/z2ui5_cl_app_demo_11.clas.abap
create mode 100644 src/00/z2ui5_cl_app_demo_11.clas.xml
create mode 100644 src/00/z2ui5_cl_app_demo_13.clas.abap
create mode 100644 src/00/z2ui5_cl_app_demo_13.clas.locals_imp.abap
create mode 100644 src/00/z2ui5_cl_app_demo_13.clas.xml
create mode 100644 src/00/z2ui5_cl_app_demo_14.clas.abap
create mode 100644 src/00/z2ui5_cl_app_demo_14.clas.locals_imp.abap
create mode 100644 src/00/z2ui5_cl_app_demo_14.clas.xml
create mode 100644 src/00/z2ui5_cl_app_demo_16.clas.abap
create mode 100644 src/00/z2ui5_cl_app_demo_16.clas.locals_imp.abap
create mode 100644 src/00/z2ui5_cl_app_demo_16.clas.xml
create mode 100644 src/00/z2ui5_cl_app_demo_17.clas.abap
create mode 100644 src/00/z2ui5_cl_app_demo_17.clas.locals_imp.abap
create mode 100644 src/00/z2ui5_cl_app_demo_17.clas.xml
create mode 100644 src/00/z2ui5_cl_app_demo_18.clas.abap
create mode 100644 src/00/z2ui5_cl_app_demo_18.clas.locals_imp.abap
create mode 100644 src/00/z2ui5_cl_app_demo_18.clas.xml
create mode 100644 src/00/z2ui5_cl_app_demo_19.clas.abap
create mode 100644 src/00/z2ui5_cl_app_demo_19.clas.xml
create mode 100644 src/00/z2ui5_cl_app_demo_20.clas.abap
create mode 100644 src/00/z2ui5_cl_app_demo_20.clas.xml
create mode 100644 src/00/z2ui5_cl_app_demo_21.clas.abap
create mode 100644 src/00/z2ui5_cl_app_demo_21.clas.xml
create mode 100644 src/00/z2ui5_cl_app_demo_22.clas.abap
create mode 100644 src/00/z2ui5_cl_app_demo_22.clas.xml
create mode 100644 src/00/z2ui5_cl_app_demo_23.clas.abap
create mode 100644 src/00/z2ui5_cl_app_demo_23.clas.xml
create mode 100644 src/00/z2ui5_cl_app_demo_24.clas.abap
create mode 100644 src/00/z2ui5_cl_app_demo_24.clas.xml
create mode 100644 src/00/z2ui5_cl_app_demo_25.clas.abap
create mode 100644 src/00/z2ui5_cl_app_demo_25.clas.xml
create mode 100644 src/package.devc.xml
create mode 100644 src/z2ui5_cl_http_handler.clas.abap
create mode 100644 src/z2ui5_cl_http_handler.clas.locals_imp.abap
create mode 100644 src/z2ui5_cl_http_handler.clas.testclasses.abap
create mode 100644 src/z2ui5_cl_http_handler.clas.xml
create mode 100644 src/z2ui5_if_app.intf.abap
create mode 100644 src/z2ui5_if_app.intf.xml
create mode 100644 src/z2ui5_if_client.intf.abap
create mode 100644 src/z2ui5_if_client.intf.xml
create mode 100644 src/z2ui5_if_view.intf.abap
create mode 100644 src/z2ui5_if_view.intf.xml
create mode 100644 src/z2ui5_t_draft.tabl.xml
diff --git a/.abapgit.xml b/.abapgit.xml
new file mode 100644
index 00000000..3f9057ff
--- /dev/null
+++ b/.abapgit.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ E
+ /src/
+ PREFIX
+
+ - /.gitignore
+ - /LICENSE
+ - /README.md
+ - /package.json
+ - /.travis.yml
+ - /.gitlab-ci.yml
+ - /abaplint.json
+ - /azure-pipelines.yml
+
+
+
+
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 00000000..bbc5bd8d
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2022 oblomov
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/README.md b/README.md
new file mode 100644
index 00000000..0f001b08
--- /dev/null
+++ b/README.md
@@ -0,0 +1,84 @@
+# abap2UI5
+
+Development of UI5 Apps in pure ABAP. Follow this project on [twitter](https://twitter.com/OblomovDev) to keep up to date!
+
+### Project Features
+* easy to use – implement just one interface for a standalone UI5 application
+* pure ABAP – development in 100% ABAP source code (no JavaScript, EML, DDL or Customizing)
+* low system footprint - based on a plain http handler (no BSP, OData, BOPF, CDS, FE or RAP)
+* cloud and on-premise ready – works with both language versions (ABAP for Cloud, Standard ABAP)
+* high system compatibility – runs on all available ABAP stacks (NW 7.02 to ABAP 2302)
+* easy installation – abapGit project, no additional app deployment needed
+
+### Information
+##### SCN Blog Series - Introduction to abap2UI5
+* (1/3) Development of UI5 Apps in pure ABAP [(Blog SCN - 22.02.2023)](https://blogs.sap.com/2023/02/22/abap2ui5-development-of-ui5-apps-in-pure-abap-1-3/)
+* (2/3) Output of Lists & Tables – add toolbars and make editable [(Blog SCN - 22.02.2023)](https://blogs.sap.com/2023/02/22/abap2ui5-output-of-lists-and-tables-toolbar-and-editable-2-3/)
+* (3/3) Demo Applications developed with abap2UI5 (...)
+
+##### More
+* Find abap2UI5 in the ABAP Open Source Projects [(dotabap.org)](https://dotabap.org/)
+* Static Analysis & Continuous Integration with abaplint [(abaplint.app/abap2UI5)](https://abaplint.app/stats/oblomov-dev/abap2UI5)
+* Featured in the Boring Enterprise Nerdletter [(newsletter - 08.03.2023)](https://boringenterprisenerds.substack.com/p/34-abap2ui5-sap-cva-burnout-c2c-shortwave)
+* Featured in the SAP Developer News [(youtube - 26.01.2023)](https://www.youtube.com/watch?v=6BDK55xYttM)
+* Development of UI5 Selection-Screens in pure ABAP (former version) [(Blog SCN - 22.01.2023)](https://blogs.sap.com/2023/01/22/abap2ui5-project-development-of-ui5-selection-screens-in-pure-abap-no-app-deployment-or-javascript-needed/)
+
+### Demo Application [(Source Code)](https://github.com/oblomov-dev/ABAP2UI5/blob/main/src/00/z2ui5_cl_app_demo_01.clas.abap)
+
+
+## Installation
+Works with all available ABAP stacks and language versions:
+* BTP ABAP Environment (ABAP for Cloud)
+* S/4 Public Cloud ABAP Environment (ABAP for Cloud)
+* S/4 Private Cloud or On-Premise (ABAP for Cloud, Standard ABAP)
+* R/3 NetWeaver AS ABAP 7.50 or higher (Standard ABAP)
+* R/3 NetWeaver AS ABAP 7.02 to 7.40 - use the low syntax [branch](https://github.com/oblomov-dev/ABAP2UI5/tree/main_v702)
+
+Install with [abapGit](https://abapgit.org), create a new HTTP service and call abap2UI5 [(more information)](https://github.com/oblomov-dev/abap2ui5/wiki).
+
+#### ABAP for Cloud:
+```abap
+METHOD if_http_service_extension~handle_request.
+
+ z2ui5_cl_http_handler=>client = VALUE #(
+ t_header = request->get_header_fields( )
+ t_param = request->get_form_fields( )
+ body = request->get_text( ) ).
+
+ DATA(lv_resp) = SWITCH #( request->get_method( )
+ WHEN 'GET' THEN z2ui5_cl_http_handler=>main_index_html( )
+ WHEN 'POST' THEN z2ui5_cl_http_handler=>main_roundtrip( ) ).
+
+ response->set_status( 200 )->set_text( lv_resp ).
+
+ENDMETHOD.
+```
+
+#### Standard ABAP:
+```abap
+METHOD if_http_extension~handle_request.
+
+ DATA lt_header TYPE tihttpnvp.
+ server->request->get_header_fields( CHANGING fields = lt_header ).
+
+ DATA lt_param TYPE tihttpnvp.
+ server->request->get_form_fields( CHANGING fields = lt_param ).
+
+ z2ui5_cl_http_handler=>client = VALUE #(
+ t_header = lt_header
+ t_param = lt_param
+ body = server->request->get_cdata( ) ).
+
+ DATA(lv_resp) = SWITCH #( server->request->get_method( )
+ WHEN 'GET' THEN z2ui5_cl_http_handler=>main_index_html( )
+ WHEN 'POST' THEN z2ui5_cl_http_handler=>main_roundtrip( ) ).
+
+ server->response->set_cdata( lv_resp ).
+ server->response->set_status( code = 200 reason = 'success' ).
+
+ENDMETHOD.
+```
+## FAQ
+* read these [instructions](https://github.com/oblomov-dev/ABAP2UI5/wiki/First-App) when you develop your first app
+* running into problems with your app? see [debugging & troubleshooting](https://github.com/oblomov-dev/ABAP2UI5/wiki/Debugging-&-Troubleshooting)
+* as always - your comments, questions, wishes and bugs are welcome, please create an [issue](https://github.com/oblomov-dev/ABAP2UI5/issues)
diff --git a/abaplint.jsonc b/abaplint.jsonc
new file mode 100644
index 00000000..b7c7b58a
--- /dev/null
+++ b/abaplint.jsonc
@@ -0,0 +1,262 @@
+{
+ "global": {
+ "files": "/src/**/*.*"
+ },
+ "dependencies": [
+ {
+ "url": "https://github.com/abapedia/steampunk-2302-api",
+ "folder": "/deps",
+ "files": "/src/**/*.*"
+ }
+ ],
+ "syntax": {
+ "version": "v750",
+ "errorNamespace": "."
+ },
+ "rules": {
+ "7bit_ascii": false,
+ "abapdoc": false,
+ "align_parameters": false,
+ "allowed_object_naming": true,
+ "allowed_object_types": true,
+ "ambiguous_statement": true,
+ "avoid_use": true,
+ "begin_end_names": true,
+ "begin_single_include": true,
+ "call_transaction_authority_check": true,
+ "cds_comment_style": true,
+ "cds_legacy_view": true,
+ "cds_parser_error": true,
+ "chain_mainly_declarations": true,
+ "change_if_to_case": {
+ "exclude": [],
+ "severity": "Error",
+ "skipNames": []
+ },
+ "check_abstract": true,
+ "check_comments": {
+ "exclude": [],
+ "severity": "Warning"
+ },
+ "check_ddic": true,
+ "check_include": true,
+ "check_subrc": true,
+ "check_syntax": true,
+ "check_text_elements": true,
+ "check_transformation_exists": true,
+ "class_attribute_names": false,
+ "classic_exceptions_overlap": true,
+ "cloud_types": true,
+ "colon_missing_space": true,
+ "commented_code": false,
+ "constant_classes": {
+ "exclude": [],
+ "severity": "Error",
+ "mapping": []
+ },
+ "constructor_visibility_public": true,
+ "contains_tab": {
+ "exclude": [],
+ "severity": "Error",
+ "spaces": 1
+ },
+ "cyclic_oo": false,
+ "cyclomatic_complexity": {
+ "exclude": [],
+ "severity": "Error",
+ "max": 20
+ },
+ "dangerous_statement": true,
+ "db_operation_in_loop": true,
+ "definitions_top": false,
+ "description_empty": true,
+ "double_space": {
+ "exclude": [],
+ "severity": "Warning",
+ "keywords": true,
+ "startParen": true,
+ "endParen": true,
+ "afterColon": true
+ },
+ "downport": true,
+ "empty_line_in_statement": false,
+ "empty_statement": true,
+ "empty_structure": {
+ "loop": true,
+ "if": true,
+ "while": true,
+ "case": true,
+ "select": true,
+ "do": true,
+ "at": true,
+ "try": true,
+ "when": false
+ },
+ "exit_or_check": true,
+ "expand_macros": true,
+ "exporting": true,
+ "forbidden_identifier": true,
+ "forbidden_pseudo_and_pragma": {
+ "exclude": [],
+ "severity": "Error",
+ "pseudo": [],
+ "pragmas": [],
+ "ignoreGlobalClassDefinition": false,
+ "ignoreGlobalInterface": false
+ },
+ "forbidden_void_type": true,
+ "form_tables_obsolete": true,
+ "fully_type_constants": {
+ "checkData": true
+ },
+ "function_module_recommendations": true,
+ "functional_writing": {
+ "ignoreExceptions": true
+ },
+ "global_class": true,
+ "identical_conditions": true,
+ "identical_contents": true,
+ "identical_descriptions": true,
+ "identical_form_names": true,
+ "if_in_if": true,
+ "implement_methods": true,
+ "in_statement_indentation": false,
+ "indentation": false,
+ "inline_data_old_versions": true,
+ "intf_referencing_clas": true,
+ "keep_single_parameter_on_one_line": false,
+ "keyword_case": false,
+ "line_break_multiple_parameters": false,
+ "line_break_style": false,
+ "line_length": false,
+ "line_only_punc": false,
+ "local_class_naming": false,
+ "local_testclass_consistency": true,
+ "local_variable_names": false,
+ "main_file_contents": true,
+ "many_parentheses": true,
+ "max_one_method_parameter_per_line": true,
+ "max_one_statement": true,
+ "message_exists": true,
+ "method_implemented_twice": true,
+ "method_length": false,
+ "method_overwrites_builtin": false,
+ "method_parameter_names": false,
+ "mix_returning": true,
+ "modify_only_own_db_tables": {
+ "reportDynamic": true,
+ "ownTables": "^[yz]"
+ },
+ "msag_consistency": true,
+ "names_no_dash": true,
+ "nesting": {
+ "depth": 5
+ },
+ "newline_between_methods": true,
+ "no_aliases": true,
+ "no_chained_assignment": true,
+ "no_external_form_calls": true,
+ "no_inline_in_optional_branches": false,
+ "no_public_attributes": false,
+ "no_yoda_conditions": false,
+ "nrob_consistency": true,
+ "object_naming": {
+ "exclude": [],
+ "severity": "Error",
+ "patternKind": "required",
+ "ignoreNames": [],
+ "ignorePatterns": [],
+ "clas": "^Z2UI5_C(L|X)",
+ "intf": "^Z2UI5_IF",
+ "prog": "^Z",
+ "fugr": "^Z",
+ "tabl": "^Z",
+ "ttyp": "^Z",
+ "dtel": "^Z",
+ "doma": "^Z",
+ "msag": "^Z",
+ "tran": "^Z",
+ "enqu": "^EZ",
+ "auth": "^Z",
+ "pinf": "^Z",
+ "idoc": "^Z",
+ "xslt": "^Z",
+ "ssfo": "^Z",
+ "ssst": "^Z",
+ "shlp": "^Z"
+ },
+ "obsolete_statement": true,
+ "omit_parameter_name": false,
+ "omit_preceding_zeros": true,
+ "omit_receiving": true,
+ "parser_702_chaining": true,
+ "parser_error": true,
+ "parser_missing_space": true,
+ "pragma_style": true,
+ "prefer_corresponding": true,
+ "prefer_inline": {
+ "severity": "Warning"
+ },
+ "prefer_is_not": true,
+ "prefer_raise_exception_new": true,
+ "prefer_returning_to_exporting": false,
+ "prefer_xsdbool": true,
+ "preferred_compare_operator": true,
+ "prefix_is_current_class": {
+ "severity": "Warning"
+ },
+ "reduce_string_templates": true,
+ "release_idoc": true,
+ "remove_descriptions": {
+ "exclude": [],
+ "severity": "Error",
+ "ignoreExceptions": false,
+ "ignoreWorkflow": true
+ },
+ "rfc_error_handling": true,
+ "select_add_order_by": true,
+ "select_performance": true,
+ "selection_screen_naming": true,
+ "sequential_blank": {
+ "severity": "Warning"
+ },
+ "short_case": false,
+ "sicf_consistency": true,
+ "slow_parameter_passing": true,
+ "space_before_colon": true,
+ "space_before_dot": true,
+ "sql_escape_host_variables": true,
+ "start_at_tab": false,
+ "static_call_via_instance": {
+ "allowInTestclassIncludes": false
+ },
+ "superclass_final": true,
+ "superfluous_value": true,
+ "sy_modification": true,
+ "tabl_enhancement_category": true,
+ "try_without_catch": true,
+ "type_form_parameters": true,
+ "types_naming": false,
+ "uncaught_exception": true,
+ "unknown_types": true,
+ "unnecessary_chaining": true,
+ "unnecessary_pragma": true,
+ "unnecessary_return": true,
+ "unreachable_code": true,
+ "unsecure_fae": true,
+ "unused_ddic": true,
+ "unused_methods": true,
+ "unused_types": true,
+ "unused_variables": {
+ "severity": "Warning",
+ "skipNames": [ "lv_dummy", "i_mv_editor" ]
+ },
+ "use_bool_expression": true,
+ "use_class_based_exceptions": true,
+ "use_line_exists": true,
+ "use_new": true,
+ "when_others_last": true,
+ "whitespace_end": true,
+ "xml_consistency": true
+ }
+}
\ No newline at end of file
diff --git a/src/00/package.devc.xml b/src/00/package.devc.xml
new file mode 100644
index 00000000..cf4dde1d
--- /dev/null
+++ b/src/00/package.devc.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+ abap2UI5 - apps and demos
+
+
+
+
diff --git a/src/00/z2ui5_cl_app_demo_00.clas.abap b/src/00/z2ui5_cl_app_demo_00.clas.abap
new file mode 100644
index 00000000..9bff19d1
--- /dev/null
+++ b/src/00/z2ui5_cl_app_demo_00.clas.abap
@@ -0,0 +1,176 @@
+CLASS z2ui5_cl_app_demo_00 DEFINITION PUBLIC.
+
+ PUBLIC SECTION.
+
+ INTERFACES z2ui5_if_app.
+
+ PROTECTED SECTION.
+ PRIVATE SECTION.
+ENDCLASS.
+
+
+
+CLASS Z2UI5_CL_APP_DEMO_00 IMPLEMENTATION.
+
+
+ METHOD z2ui5_if_app~controller.
+
+ CASE client->get( )-lifecycle_method.
+
+ WHEN client->cs-lifecycle_method-on_event.
+
+ CASE client->get( )-event.
+
+ WHEN '0101'.
+ client->nav_app_call( NEW z2ui5_cl_app_demo_01( ) ).
+
+ WHEN '0102'.
+ client->nav_app_call( NEW z2ui5_cl_app_demo_04( ) ).
+
+ WHEN '0103'.
+ client->nav_app_call( NEW z2ui5_cl_app_demo_08( ) ).
+
+ WHEN '0104'.
+ client->nav_app_call( NEW z2ui5_cl_app_demo_10( ) ).
+
+ WHEN '0201'.
+ client->nav_app_call( NEW z2ui5_cl_app_demo_02( ) ).
+
+ WHEN '0202'.
+ client->nav_app_call( NEW z2ui5_cl_app_demo_05( ) ).
+
+ WHEN '0301'.
+ client->nav_app_call( NEW z2ui5_cl_app_demo_03( ) ).
+
+ WHEN '0302'.
+ client->nav_app_call( NEW z2ui5_cl_app_demo_19( ) ).
+
+ WHEN '0303'.
+ client->nav_app_call( NEW z2ui5_cl_app_demo_06( ) ).
+
+ WHEN '0304'.
+ client->nav_app_call( NEW z2ui5_cl_app_demo_11( ) ).
+
+ WHEN '0100'.
+ client->nav_app_call( NEW z2ui5_cl_app_demo_22( ) ).
+
+ WHEN '2400'.
+ client->nav_app_call( NEW z2ui5_cl_app_demo_24( ) ).
+
+ WHEN 'MIME_EDITOR'.
+ client->nav_app_call( NEW z2ui5_cl_app_demo_14( ) ).
+
+ WHEN 'TABLE_MAINTENANCE'.
+ client->nav_app_call( NEW z2ui5_cl_app_demo_13( ) ).
+
+ WHEN 'BACK'.
+ client->nav_app_leave( client->get( )-id_prev_app_stack ).
+
+ ENDCASE.
+
+
+ WHEN client->cs-lifecycle_method-on_rendering.
+
+ DATA(view) = client->factory_view( ).
+
+ DATA(page) = view->page( title = 'abap2UI5 - Demo Section'
+ navbuttontap = view->_event( 'BACK' ) ).
+
+
+ page->header_content(
+ )->link( text = 'SCN' href = 'https://blogs.sap.com/tag/abap2ui5/'
+ )->link( text = 'Twitter' href = 'https://twitter.com/OblomovDev'
+ )->link( text = 'GitHub' href = 'https://github.com/oblomov-dev/abap2ui5' ).
+
+ DATA(grid) = page->grid( default_span = 'L3 M6 S12' )->content( 'l' ).
+
+ grid->simple_form( 'HowTo - General' )->content( 'f'
+ )->button( text = 'Communication & Data Binding' press = view->_event( '0101' )
+ )->button( text = 'Events, Error & Change View' press = view->_event( '0102' )
+ )->button( text = 'Call new app and go back' press = view->_event( '2400' )
+ )->button( text = 'Messages (Toast, Box, Strip)' press = view->_event( '0103' )
+
+ ).
+
+ grid->simple_form( 'HowTo - General II' )->content( 'f'
+ )->button( text = 'Layout (Header, Footer, Grid)' press = view->_event( '0104' )
+ )->button( text = 'Scrolling & Focus' press = view->_event( '0100' )
+ " )->button( text = 'Popups I' press = view->_event( '0101' )
+ " )->button( text = 'Popups II (F4 Help)' press = view->_event( '0101' )
+ ).
+
+ grid->simple_form( 'HowTo - Selection-Screen' )->content( 'f'
+ )->button( text = 'Basic' press = view->_event( '0201' )
+ )->button( text = 'More Controls' press = view->_event( '0202' ) ).
+
+ grid->simple_form( 'HowTo - Tables' )->content( 'f'
+ )->button( text = 'List' press = view->_event( '0301' )
+ )->button( text = 'Toolbar, Scroll Container' press = view->_event( '0303' )
+ " )->button( text = 'Selection Modes' press = view->_event( '0302' )
+ )->button( text = 'Editable' press = view->_event( '0304' )
+ " )->button( text = 'Cell changes' press = view->_event( '0304' )
+ ).
+
+ grid = page->grid( default_span = 'L12 M12 S12' ).
+
+
+ DATA(form) = grid->simple_form( 'Applications and Examples' )->vbox( ).
+
+ form->flex_box( class = 'columns'
+ )->button( text = 'MIME Editor' press = view->_event( 'MIME_EDITOR' )
+ )->get(
+ )->layout_data(
+ )->flex_item_data(
+ growFactor = '1'
+ styleclass = 'sapUiTinyMargin'
+ )->get_parent( )->get_parent(
+ )->text( text = 'Use the sap.ui.codeeditor to develop editor apps - for instance edit files form the MIME Repository'
+ )->get(
+ )->layout_data(
+ )->flex_item_data(
+ growFactor = '3'
+ styleclass = 'sapUiTinyMargin'
+ ).
+
+ form->flex_box( class = 'columns'
+ )->button( text = 'Table Maintenance' press = view->_event( 'TABLE_MAINTENANCE' )
+ )->get(
+ )->layout_data(
+ )->flex_item_data(
+ growFactor = '1'
+ styleclass = 'sapUiTinyMargin'
+ )->get_parent( )->get_parent(
+ )->text( text = 'Use the sap.ui.table to develop table maintenance apps - import/export data in csv/json/xml, edit entries in the table control and save it to database'
+ )->get(
+ )->layout_data(
+ )->flex_item_data(
+ growFactor = '3'
+ styleclass = 'sapUiTinyMargin'
+ ).
+*
+* form->flex_box( class = 'columns'
+* )->button( text = 'File Upload/Download' press = view->_event( 'TABLE_MAINTENANCE' ) )->get(
+* )->layout_data(
+* )->flex_item_data( grow_Factor = '1' style_class = 'sapUiTinyMargin' )->get_parent( )->get_parent(
+* )->text( text = 'Use the sap.ui.fileuploader to develop file transfer apps - upload files of jpeg/pdf/zip, display the content or download the data again'
+* )->get( )->layout_data( )->flex_item_data( grow_Factor = '3' style_class = 'sapUiTinyMargin' ).
+*
+* form->flex_box( class = 'columns'
+* )->button( text = 'Visualisation 1' press = view->_event( 'TABLE_MAINTENANCE' ) )->get(
+* )->layout_data(
+* )->flex_item_data( grow_Factor = '1' style_class = 'sapUiTinyMargin' )->get_parent( )->get_parent(
+* )->text( text = 'Use the sap.ui.fileuploader to develop file transfer apps - upload files of jpeg/pdf/zip, display the content or download the data again'
+* )->get( )->layout_data( )->flex_item_data( grow_Factor = '3' style_class = 'sapUiTinyMargin' ).
+*
+* form->flex_box( class = 'columns'
+* )->button( text = 'Visualisation 2' press = view->_event( 'TABLE_MAINTENANCE' ) )->get(
+* )->layout_data(
+* )->flex_item_data( grow_Factor = '1' style_class = 'sapUiTinyMargin' )->get_parent( )->get_parent(
+* )->text( text = 'Use the sap.ui.fileuploader to develop file transfer apps - upload files of jpeg/pdf/zip, display the content or download the data again'
+* )->get( )->layout_data( )->flex_item_data( grow_Factor = '3' style_class = 'sapUiTinyMargin' ).
+*
+
+ ENDCASE.
+
+ ENDMETHOD.
+ENDCLASS.
diff --git a/src/00/z2ui5_cl_app_demo_00.clas.xml b/src/00/z2ui5_cl_app_demo_00.clas.xml
new file mode 100644
index 00000000..f764cd1d
--- /dev/null
+++ b/src/00/z2ui5_cl_app_demo_00.clas.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ Z2UI5_CL_APP_DEMO_00
+ E
+ start
+ 1
+ X
+ X
+ X
+
+
+
+
diff --git a/src/00/z2ui5_cl_app_demo_01.clas.abap b/src/00/z2ui5_cl_app_demo_01.clas.abap
new file mode 100644
index 00000000..7f93d88c
--- /dev/null
+++ b/src/00/z2ui5_cl_app_demo_01.clas.abap
@@ -0,0 +1,54 @@
+CLASS z2ui5_cl_app_demo_01 DEFINITION PUBLIC.
+
+ PUBLIC SECTION.
+
+ INTERFACES z2ui5_if_app.
+
+ DATA product TYPE string.
+ DATA quantity TYPE string.
+
+ PROTECTED SECTION.
+ PRIVATE SECTION.
+ENDCLASS.
+
+
+
+CLASS z2ui5_cl_app_demo_01 IMPLEMENTATION.
+
+
+ METHOD z2ui5_if_app~controller.
+
+ CASE client->get( )-lifecycle_method.
+
+ WHEN client->cs-lifecycle_method-on_init.
+ product = 'tomato'.
+ quantity = '500'.
+
+ WHEN client->cs-lifecycle_method-on_event.
+ CASE client->get( )-event.
+ WHEN 'BUTTON_POST'.
+ client->popup_message_toast( |{ product } { quantity } ST - send to the server| ).
+ WHEN 'BACK'.
+ client->nav_app_leave( client->get( )-id_prev_app_stack ).
+ ENDCASE.
+
+ WHEN client->cs-lifecycle_method-on_rendering.
+
+ DATA(view) = client->factory_view( ).
+ DATA(page) = view->page( title = 'abap2UI5 - First Example' navbuttontap = view->_event( 'BACK' ) ).
+
+ page->header_content( )->link( text = 'Go to Source Code' href = client->get( )-s_request-url_source_code ).
+
+ page->simple_form( 'Form Title'
+ )->content( 'f'
+ )->title( 'Input'
+ )->label( 'quantity'
+ )->input( view->_bind( quantity )
+ )->label( 'product'
+ )->input( value = product editable = abap_False
+ )->button( text = 'post' press = view->_event( 'BUTTON_POST' ) ).
+
+ ENDCASE.
+
+ ENDMETHOD.
+ENDCLASS.
diff --git a/src/00/z2ui5_cl_app_demo_01.clas.xml b/src/00/z2ui5_cl_app_demo_01.clas.xml
new file mode 100644
index 00000000..15f2b1b3
--- /dev/null
+++ b/src/00/z2ui5_cl_app_demo_01.clas.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ Z2UI5_CL_APP_DEMO_01
+ E
+ basic example
+ 1
+ X
+ X
+ X
+
+
+
+
diff --git a/src/00/z2ui5_cl_app_demo_02.clas.abap b/src/00/z2ui5_cl_app_demo_02.clas.abap
new file mode 100644
index 00000000..2162744e
--- /dev/null
+++ b/src/00/z2ui5_cl_app_demo_02.clas.abap
@@ -0,0 +1,198 @@
+CLASS z2ui5_cl_app_demo_02 DEFINITION PUBLIC.
+
+ PUBLIC SECTION.
+
+ INTERFACES z2ui5_if_app.
+
+ DATA:
+ BEGIN OF screen,
+ check_is_active TYPE abap_bool,
+ colour TYPE string,
+ combo_key TYPE string,
+ segment_key TYPE string,
+ date TYPE string,
+ date_time TYPE string,
+ time_start TYPE string,
+ time_end TYPE string,
+ check_switch_01 TYPE abap_bool VALUE abap_false,
+ check_switch_02 TYPE abap_bool VALUE abap_false,
+ END OF screen.
+
+ TYPES:
+ BEGIN OF s_suggestion_items,
+ value TYPE string,
+ descr TYPE string,
+ END OF s_suggestion_items.
+
+ TYPES:
+ BEGIN OF s_combobox,
+ key TYPE string,
+ text TYPE string,
+ END OF s_combobox.
+
+ TYPES ty_t_combo TYPE STANDARD TABLE OF s_combobox WITH EMPTY KEY.
+
+ DATA mt_suggestion TYPE STANDARD TABLE OF s_suggestion_items WITH EMPTY KEY.
+
+
+ PROTECTED SECTION.
+
+ METHODS z2ui5_on_rendering
+ IMPORTING
+ client TYPE REF TO z2ui5_if_client.
+ METHODS z2ui5_on_event
+ IMPORTING
+ client TYPE REF TO z2ui5_if_client.
+ METHODS z2ui5_on_init.
+
+ PRIVATE SECTION.
+ENDCLASS.
+
+
+
+CLASS z2ui5_cl_app_demo_02 IMPLEMENTATION.
+
+
+ METHOD z2ui5_if_app~controller.
+
+ CASE client->get( )-lifecycle_method.
+
+ WHEN client->cs-lifecycle_method-on_init.
+ z2ui5_on_init( ).
+
+ WHEN client->cs-lifecycle_method-on_event.
+ z2ui5_on_event( client ).
+
+ WHEN client->cs-lifecycle_method-on_rendering.
+ z2ui5_on_rendering( client ).
+
+ ENDCASE.
+
+ ENDMETHOD.
+
+
+ METHOD z2ui5_on_rendering.
+
+ DATA(view) = client->factory_view( ).
+ DATA(page) = view->page( title = 'abap2UI5 - Selection-Screen Example' navbuttontap = view->_event( 'BACK' ) ).
+ page->header_content( )->link( text = 'Go to Source Code' href = client->get( )-s_request-url_source_code ).
+
+ DATA(grid) = page->grid( 'L6 M12 S12' )->content( 'l' ).
+
+ grid->simple_form( 'Input' )->content( 'f'
+ )->label( 'Input with value help'
+ )->input(
+ value = view->_bind( screen-colour )
+ placeholder = 'fill in your favorite colour'
+ suggestionitems = view->_bind_one_way( mt_suggestion )
+ showsuggestion = abap_true
+ )->get(
+ )->suggestion_items( )->get(
+ )->list_item( text = '{VALUE}' additionalText = '{DESCR}'
+ ).
+
+
+ grid->simple_form( 'Time Inputs' )->content( 'f'
+ )->label( 'Date'
+ )->date_picker( view->_bind( screen-date )
+
+ )->label( 'Date and Time'
+ )->date_time_picker( view->_bind( screen-date_time )
+
+ )->label( 'Time Begin/End'
+ )->time_picker( view->_bind( screen-time_start )
+ )->time_picker( view->_bind( screen-time_end ) ).
+
+
+ data(form) = page->grid( default_span = 'L12 M12 S12' )->content( 'l'
+ )->simple_form( 'Input with select options' )->content( 'f' ).
+
+ form->label( 'Checkbox'
+ )->checkbox(
+ selected = view->_bind( screen-check_is_active )
+ text = 'this is a checkbox'
+ enabled = abap_true
+
+ )->label( 'Combobox'
+ )->combobox(
+ selectedkey = view->_bind( screen-combo_key )
+ items = view->_bind_one_way( VALUE ty_t_combo(
+ ( key = 'BLUE' text = 'green' )
+ ( key = 'GREEN' text = 'blue' )
+ ( key = 'BLACK' text = 'red' )
+ ( key = 'GRAY' text = 'gray' ) )
+ ) )->get( )->item( key = '{KEY}' text = '{TEXT}'
+ )->get_parent( )->get_parent(
+
+ )->label( 'Segmented Button'
+ )->segmented_button( view->_bind( screen-segment_key ) )->get(
+ )->items( )->get(
+ )->segmented_button_item( key = 'BLUE' icon = 'sap-icon://accept' text = 'blue'
+ )->segmented_button_item( key = 'GREEN' icon = 'sap-icon://add-favorite' text = 'green'
+ )->segmented_button_item( key = 'BLACK' icon = 'sap-icon://attachment' text = 'black'
+ )->get_parent( )->get_parent( ).
+
+ form->label( 'Switch disabled' ).
+ form->switch( enabled = abap_false customtexton = 'A' customtextoff = 'B' ).
+
+ form->label( 'Switch accept/reject' ).
+ form->switch( state = view->_bind( screen-check_switch_01 ) customtexton = 'on' customtextoff = 'off' type = 'AcceptReject' ).
+ form->label( 'Switch normal' ).
+ form->switch( state = view->_bind( screen-check_switch_02 ) customtexton = 'YES' customtextoff = 'NO' ).
+
+
+ page->footer( )->overflow_toolbar(
+ )->toolbar_spacer(
+ )->button(
+ text = 'Clear'
+ press = view->_event( 'BUTTON_CLEAR' )
+ type = 'Reject'
+ icon = 'sap-icon://delete'
+ )->button(
+ text = 'Send to Server'
+ press = view->_event( 'BUTTON_SEND' )
+ type = 'Success' ).
+
+ ENDMETHOD.
+
+
+ METHOD z2ui5_on_event.
+
+ CASE client->get( )-event.
+
+ WHEN 'BUTTON_SEND'.
+ client->popup_message_box( 'Values were send to the server successfully' ).
+ WHEN 'BUTTON_CLEAR'.
+ CLEAR screen.
+ client->popup_message_toast( 'View initialized' ).
+ WHEN 'BACK'.
+ client->nav_app_leave( client->get( )-id_prev_app_stack ).
+
+ ENDCASE.
+
+ ENDMETHOD.
+
+
+ METHOD z2ui5_on_init.
+
+ screen = VALUE #(
+ check_is_active = abap_true
+ colour = 'BLUE'
+ combo_key = 'GRAY'
+ segment_key = 'GREEN'
+ date = '07.12.22'
+ date_time = '23.12.2022, 19:27:20'
+ time_start = '05:24:00'
+ time_end = '17:23:57'
+ ).
+
+ mt_suggestion = VALUE #(
+ ( descr = 'Green' value = 'GREEN' )
+ ( descr = 'Blue' value = 'BLUE' )
+ ( descr = 'Black' value = 'BLACK' )
+ ( descr = 'Grey' value = 'GREY' )
+ ( descr = 'Blue2' value = 'BLUE2' )
+ ( descr = 'Blue3' value = 'BLUE3' ) ).
+
+ ENDMETHOD.
+ENDCLASS.
diff --git a/src/00/z2ui5_cl_app_demo_02.clas.xml b/src/00/z2ui5_cl_app_demo_02.clas.xml
new file mode 100644
index 00000000..d120c121
--- /dev/null
+++ b/src/00/z2ui5_cl_app_demo_02.clas.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ Z2UI5_CL_APP_DEMO_02
+ E
+ selscreen - basic
+ 1
+ X
+ X
+ X
+
+
+
+
diff --git a/src/00/z2ui5_cl_app_demo_03.clas.abap b/src/00/z2ui5_cl_app_demo_03.clas.abap
new file mode 100644
index 00000000..c4532849
--- /dev/null
+++ b/src/00/z2ui5_cl_app_demo_03.clas.abap
@@ -0,0 +1,72 @@
+CLASS z2ui5_cl_app_demo_03 DEFINITION PUBLIC.
+
+ PUBLIC SECTION.
+
+ INTERFACES z2ui5_if_app.
+
+ TYPES:
+ BEGIN OF ty_row,
+ title TYPE string,
+ value TYPE string,
+ descr TYPE string,
+ icon TYPE string,
+ info TYPE string,
+ checkbox TYPE abap_bool,
+ END OF ty_row.
+
+ DATA t_tab TYPE STANDARD TABLE OF ty_row WITH EMPTY KEY.
+
+ PROTECTED SECTION.
+ PRIVATE SECTION.
+ENDCLASS.
+
+
+
+CLASS z2ui5_cl_app_demo_03 IMPLEMENTATION.
+
+
+ METHOD z2ui5_if_app~controller.
+
+ CASE client->get( )-lifecycle_method.
+
+
+ WHEN client->cs-lifecycle_method-on_init.
+
+ t_tab = VALUE #(
+ ( title = 'Hans' info = 'completed' descr = 'this is a description' icon = 'sap-icon://account' )
+ ( title = 'Hans' info = 'incompleted' descr = 'this is a description' icon = 'sap-icon://account' )
+ ( title = 'Hans' info = 'working' descr = 'this is a description' icon = 'sap-icon://account' )
+ ( title = 'Hans' info = 'working' descr = 'this is a description' icon = 'sap-icon://account' )
+ ( title = 'Hans' info = 'completed' descr = 'this is a description' icon = 'sap-icon://account' )
+ ( title = 'Hans' info = 'completed' descr = 'this is a description' icon = 'sap-icon://account' )
+ ).
+
+
+ WHEN client->cs-lifecycle_method-on_event.
+
+ CASE client->get( )-event.
+ WHEN 'BACK'.
+ client->nav_app_leave( client->get( )-id_prev_app_stack ).
+ ENDCASE.
+
+ WHEN client->cs-lifecycle_method-on_rendering.
+
+ DATA(view) = client->factory_view( ).
+ DATA(page) = view->page( title = 'abap2UI5 - List' navbuttontap = view->_event( 'BACK' ) ).
+
+ page->header_content( )->link( text = 'Go to Source Code' href = client->get( )-s_request-url_source_code ).
+
+ page->list(
+ headertext = 'List Ouput'
+ items = view->_bind_one_way( t_tab )
+ )->standard_list_item(
+ title = '{TITLE}'
+ description = '{DESCR}'
+ icon = '{ICON}'
+ info = '{INFO}'
+ ).
+
+ ENDCASE.
+
+ ENDMETHOD.
+ENDCLASS.
diff --git a/src/00/z2ui5_cl_app_demo_03.clas.xml b/src/00/z2ui5_cl_app_demo_03.clas.xml
new file mode 100644
index 00000000..43918d62
--- /dev/null
+++ b/src/00/z2ui5_cl_app_demo_03.clas.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ Z2UI5_CL_APP_DEMO_03
+ E
+ tab - list
+ 1
+ X
+ X
+ X
+
+
+
+
diff --git a/src/00/z2ui5_cl_app_demo_04.clas.abap b/src/00/z2ui5_cl_app_demo_04.clas.abap
new file mode 100644
index 00000000..12f0514e
--- /dev/null
+++ b/src/00/z2ui5_cl_app_demo_04.clas.abap
@@ -0,0 +1,122 @@
+CLASS z2ui5_cl_app_demo_04 DEFINITION PUBLIC.
+
+ PUBLIC SECTION.
+
+ INTERFACES z2ui5_if_app.
+ CLASS-METHODS factory
+ IMPORTING
+ i_app TYPE REF TO z2ui5_if_app
+ i_name_attri TYPE string
+ RETURNING
+ VALUE(r_result) TYPE REF TO z2ui5_cl_app_demo_04.
+
+
+ DATA mo_app TYPE REF TO z2ui5_if_app.
+ DATA mv_name_attri TYPE string.
+
+ PROTECTED SECTION.
+ PRIVATE SECTION.
+ENDCLASS.
+
+
+
+CLASS z2ui5_cl_app_demo_04 IMPLEMENTATION.
+
+
+ METHOD factory.
+
+ r_result = NEW #( ).
+
+ r_result->mo_app = i_app.
+ r_result->mv_name_attri = i_name_attri.
+
+ ENDMETHOD.
+
+
+ METHOD z2ui5_if_app~controller.
+
+ CASE client->get( )-lifecycle_method.
+
+
+ "when the app starts for the first time, this part is calles
+ WHEN client->cs-lifecycle_method-on_init.
+
+ "set init values or view here
+ client->view_show( 'MAIN' ).
+ client->popup_message_box( 'method on_init of the abap controller was called' ).
+
+
+ "every event raised by an ui5 control , is send to this part
+ WHEN client->cs-lifecycle_method-on_event.
+
+ CASE client->get( )-event.
+
+ WHEN 'BUTTON_ROUNDTRIP'.
+ client->popup_message_box( 'server-client roundtrip, method on_event of the abap controller was called' ).
+
+ WHEN 'BUTTON_RESTART'.
+ client->nav_app_call( NEW z2ui5_cl_app_demo_04( ) ).
+
+ WHEN 'BUTTON_CHANGE_APP'.
+ client->nav_app_call( NEW z2ui5_cl_app_demo_01( ) ).
+
+ WHEN 'BUTTON_CHANGE_VIEW'.
+
+ "read the active view
+ CASE client->get( )-view_active.
+ WHEN 'MAIN'.
+ client->view_show( 'SECOND' ).
+ WHEN 'SECOND'.
+ client->view_show( 'MAIN' ).
+ ENDCASE.
+
+ WHEN 'BUTTON_ERROR'.
+ DATA(lv_dummy) = 1 / 0.
+
+ WHEN 'BACK'.
+ client->nav_app_leave( client->get( )-id_prev_app_stack ).
+
+ ENDCASE.
+
+
+ "when the server is called, in the end this part is called to get the actual view of the app
+ WHEN client->cs-lifecycle_method-on_rendering.
+
+ "Definition of View Main
+ DATA(view) = client->factory_view( 'MAIN' ).
+
+ view->page( title = 'abap2UI5 - Controller' navbuttontap = view->_event( 'BACK' )
+ )->header_content( )->link( text = 'Go to Source Code' href = client->get( )-s_request-url_source_code )->get_parent(
+
+ )->grid( 'L6 M12 S12' )->content( 'l'
+ )->simple_form( 'Controller' )->content( 'f'
+
+ )->label( 'Roundtrip'
+ )->button( text = 'Client/Server Interaction' press = view->_event( 'BUTTON_ROUNDTRIP' )
+
+ )->label( 'System'
+ )->button( text = 'Restart App' press = view->_event( 'BUTTON_RESTART' )
+
+ )->label( 'Change View'
+ )->button( text = 'Display View SECOND' press = view->_event( 'BUTTON_CHANGE_VIEW' )
+
+ )->label( 'CX_SY_ZERO_DIVIDE'
+ )->button( text = 'Error not catched by the user' press = view->_event( 'BUTTON_ERROR' )
+ ).
+
+
+
+ "Definition of View Second
+ view = client->factory_view( 'SECOND' ).
+ view->page( title = 'ABAP2UI5 - Controller' navbuttontap = view->_event( 'BACK' )
+
+ )->grid( default_span = 'L12 M12 S12' )->content( 'l'
+ )->simple_form( 'View Second' )->content( 'f'
+
+ )->label( 'Change View'
+ )->button( text = 'Display View MAIN' press = view->_event( 'BUTTON_CHANGE_VIEW' ) ).
+
+ ENDCASE.
+
+ ENDMETHOD.
+ENDCLASS.
diff --git a/src/00/z2ui5_cl_app_demo_04.clas.xml b/src/00/z2ui5_cl_app_demo_04.clas.xml
new file mode 100644
index 00000000..277dfeec
--- /dev/null
+++ b/src/00/z2ui5_cl_app_demo_04.clas.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ Z2UI5_CL_APP_DEMO_04
+ E
+ basic - controller
+ 1
+ X
+ X
+ X
+
+
+
+
diff --git a/src/00/z2ui5_cl_app_demo_05.clas.abap b/src/00/z2ui5_cl_app_demo_05.clas.abap
new file mode 100644
index 00000000..a635e7dd
--- /dev/null
+++ b/src/00/z2ui5_cl_app_demo_05.clas.abap
@@ -0,0 +1,190 @@
+CLASS z2ui5_cl_app_demo_05 DEFINITION PUBLIC.
+
+ PUBLIC SECTION.
+
+ INTERFACES z2ui5_if_app.
+
+ DATA:
+ BEGIN OF screen,
+ check_initialized TYPE abap_bool,
+ check_is_active TYPE abap_bool,
+ colour TYPE string,
+ combo_key TYPE string,
+ segment_key TYPE string,
+ date TYPE string,
+ date_time TYPE string,
+ time_start TYPE string,
+ time_end TYPE string,
+ check_switch_01 TYPE abap_bool VALUE abap_false,
+ check_switch_02 TYPE abap_bool VALUE abap_false,
+ progress_value TYPE string VALUE '3',
+ step_val_01 TYPE string VALUE '4',
+ step_val_02 TYPE string VALUE '10',
+ text_area TYPE string,
+ END OF screen.
+
+ PROTECTED SECTION.
+ PRIVATE SECTION.
+ENDCLASS.
+
+
+
+CLASS z2ui5_cl_app_demo_05 IMPLEMENTATION.
+
+
+ METHOD z2ui5_if_app~controller.
+
+ CASE client->get( )-lifecycle_method.
+
+ WHEN client->cs-lifecycle_method-on_init.
+
+ screen = VALUE #(
+ check_initialized = abap_true
+ check_is_active = abap_true
+ colour = 'BLUE'
+ combo_key = 'GRAY'
+ segment_key = 'GREEN'
+ date = '07.12.22'
+ date_time = '23.12.2022, 19:27:20'
+ time_start = '05:24:00'
+ time_end = '17:23:57' ).
+
+
+ WHEN client->cs-lifecycle_method-on_event.
+
+ "user event handling
+ CASE client->get( )-event.
+
+ WHEN 'BUTTON_ROUNDTRIP'.
+ DATA(lv_dummy) = 'user pressed a button, your custom implementation can be called here'.
+
+ WHEN 'BUTTON_MSG_BOX'.
+ client->popup_message_box(
+ text = 'this is a message box with a custom text'
+ type = 'success' ).
+
+ WHEN 'BACK'.
+ client->nav_app_leave( client->get( )-id_prev_app_stack ).
+
+ ENDCASE.
+
+
+ WHEN client->cs-lifecycle_method-on_rendering.
+
+ DATA(view) = client->factory_view( ).
+ DATA(page) = view->page( title = 'abap2UI5 - Selection-Screen more Controls' navbuttontap = view->_event( 'BACK' ) ).
+ page->header_content( )->link( text = 'Go to Source Code' href = client->get( )-s_request-url_source_code ).
+
+ page->generic_tag(
+ arialabelledby = 'genericTagLabel'
+ text = 'Project Cost'
+ design = 'StatusIconHidden'
+ status = 'Error'
+ class = 'sapUiSmallMarginBottom'
+ )->object_number(
+ state = 'Error'
+ emphasized = 'false'
+ number = '3.5M'
+ unit = 'EUR'
+ ).
+
+ page->generic_tag(
+ arialabelledby = 'genericTagLabel'
+ text = 'Project Cost'
+ design = 'StatusIconHidden'
+ status = 'Success'
+ class = 'sapUiSmallMarginBottom'
+ )->object_number(
+ state = 'Success'
+ emphasized = 'false'
+ number = '3.5M'
+ unit = 'EUR'
+ ).
+
+ page->generic_tag(
+ arialabelledby = 'genericTagLabel'
+ text = 'Input'
+ design = 'StatusIconHidden'
+ " status = 'Error'
+ class = 'sapUiSmallMarginBottom'
+ )->object_number(
+ " state = 'Error'
+ emphasized = 'true'
+ number = '3.5M'
+ unit = 'EUR'
+ ).
+ DATA(grid) = page->grid( 'L12 M12 S12' )->content( 'l' ).
+
+ grid->simple_form( 'More Controls' )->content( 'f'
+
+
+ )->label( 'ProgressIndicator'
+ )->progress_indicator( percentvalue = screen-progress_value displayvalue = '0,44GB of 32GB used' showvalue = abap_true state = 'Success'
+
+ )->label( 'StepInput'
+ )->step_input( value = view->_bind( screen-step_val_01 ) step = '2' min = '0' max = '20'
+ )->step_input( value = view->_bind( screen-step_val_02 ) step = '10' min = '0' max = '100'
+
+ )->label( 'Range Slider'
+ )->range_slider(
+ max = '100'
+ min = '0'
+ step = '10'
+ startvalue = '10'
+ endvalue = '20'
+ showtickmarks = abap_true
+ labelinterval = '2'
+ width = '80%'
+ class = 'sapUiTinyMargin' ).
+
+
+ grid->simple_form( 'Text Area' )->label( 'text area'
+ )->text_area(
+ " value = view->_bind( screen-text_area )
+ value = `Lorem ipsum dolor st amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd` &&
+` gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. Lorem ipsum dolor sit am` &&
+`et, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Lorem ipsum dolor st amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat,` &&
+` sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor i` &&
+`nvidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat.`
+ growing = abap_true
+ growingMaxLines = '7' width = '100%' ).
+
+
+ page->footer( )->overflow_toolbar(
+ )->button(
+ text = 'Button with Badge'
+ class = 'sapUiTinyMarginBeginEnd'
+ icon = 'sap-icon://cart'
+ )->get(
+ )->custom_data(
+ )->badge_custom_data(
+ key = 'badge'
+ value = '5'
+ visible = abap_true
+ )->get_parent( )->get_parent(
+ )->button(
+ text = 'Emphasized Button with Badge'
+ type = 'Emphasized'
+ class = 'sapUiTinyMarginBeginEnd'
+ icon = 'sap-icon://cart'
+ )->get(
+ )->custom_data(
+ )->badge_custom_data(
+ key = 'badge'
+ value = '23'
+ visible = abap_true
+ )->get_parent( )->get_parent(
+ )->toolbar_spacer(
+ )->overflow_toolbar_button(
+ text = 'Clear'
+ press = view->_event( 'BUTTON_CLEAR' )
+ type = 'Reject'
+ icon = 'sap-icon://delete'
+ )->overflow_toolbar_button(
+ text = 'Send to Server'
+ press = view->_event( 'BUTTON_SEND' )
+ type = 'Success' ).
+ ENDCASE.
+
+ ENDMETHOD.
+ENDCLASS.
diff --git a/src/00/z2ui5_cl_app_demo_05.clas.xml b/src/00/z2ui5_cl_app_demo_05.clas.xml
new file mode 100644
index 00000000..7fecf2ec
--- /dev/null
+++ b/src/00/z2ui5_cl_app_demo_05.clas.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ Z2UI5_CL_APP_DEMO_05
+ E
+ selscreen - more controls
+ 1
+ X
+ X
+ X
+
+
+
+
diff --git a/src/00/z2ui5_cl_app_demo_06.clas.abap b/src/00/z2ui5_cl_app_demo_06.clas.abap
new file mode 100644
index 00000000..82fcfde9
--- /dev/null
+++ b/src/00/z2ui5_cl_app_demo_06.clas.abap
@@ -0,0 +1,94 @@
+CLASS z2ui5_cl_app_demo_06 DEFINITION PUBLIC.
+
+ PUBLIC SECTION.
+
+ INTERFACES z2ui5_if_app.
+
+ TYPES:
+ BEGIN OF ty_row,
+ title TYPE string,
+ value TYPE string,
+ descr TYPE string,
+ icon TYPE string,
+ info TYPE string,
+ checkbox TYPE abap_bool,
+ END OF ty_row.
+
+ DATA t_tab TYPE STANDARD TABLE OF ty_row WITH EMPTY KEY.
+
+ PROTECTED SECTION.
+ PRIVATE SECTION.
+ENDCLASS.
+
+
+
+CLASS Z2UI5_CL_APP_DEMO_06 IMPLEMENTATION.
+
+
+ METHOD z2ui5_if_app~controller.
+
+ CASE client->get( )-lifecycle_method.
+
+ WHEN client->cs-lifecycle_method-on_init.
+
+ t_tab = REDUCE #( INIT ret = VALUE #( ) FOR n = 1 WHILE n < 101 NEXT ret =
+ VALUE #( BASE ret ( title = 'Hans' value = 'red' info = 'completed' descr = 'this is a description' checkbox = abap_true ) ) ).
+
+
+ WHEN client->cs-lifecycle_method-on_event.
+
+ CASE client->get( )-event.
+
+ WHEN 'BUTTON_SORT'.
+ SORT t_tab BY value.
+
+ WHEN 'BUTTON_POST'.
+ client->popup_message_box( 'button post was pressed' ).
+
+ WHEN 'BACK'.
+ client->nav_app_leave( client->get( )-id_prev_app_stack ).
+
+ ENDCASE.
+
+
+ WHEN client->cs-lifecycle_method-on_rendering.
+
+ DATA(view) = client->factory_view( ).
+ DATA(page) = view->page( title = 'abap2UI5 - Scroll Container with Table and Toolbar' navbuttontap = view->_event( 'BACK' ) ).
+
+ page->header_content( )->link( text = 'Go to Source Code' href = client->get( )-s_request-url_source_code ).
+
+ "set table and container
+ DATA(tab) = page->scroll_container( '70%' )->table(
+ items = view->_bind_one_way( t_tab )
+ sticky = 'ColumnHeaders,HeaderToolbar'
+ ).
+
+ "set toolbar
+ tab->header_toolbar( )->overflow_toolbar(
+ )->title( 'title of the table'
+ )->toolbar_spacer(
+ )->button( text = 'Sort' press = view->_event( 'BUTTON_SORT' )
+ )->button( text = 'Post' press = view->_event( 'BUTTON_POST' )
+ ).
+
+ "set header
+ tab->columns(
+ )->column( )->text( 'Title' )->get_parent(
+ )->column( )->text( 'Color' )->get_parent(
+ )->column( )->text( 'Info' )->get_parent(
+ )->column( )->text( 'Description' )->get_parent(
+ )->column( )->text( 'Checkbox' ).
+
+ "set content
+ tab->items( )->column_list_item( )->cells(
+ )->text( '{TITLE}'
+ )->text( '{VALUE}'
+ )->text( '{INFO}'
+ )->text( '{DESCR}'
+ )->checkbox( '{CHECKBOX}' ).
+
+ ENDCASE.
+
+ ENDMETHOD.
+ENDCLASS.
diff --git a/src/00/z2ui5_cl_app_demo_06.clas.xml b/src/00/z2ui5_cl_app_demo_06.clas.xml
new file mode 100644
index 00000000..5ba06ac9
--- /dev/null
+++ b/src/00/z2ui5_cl_app_demo_06.clas.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ Z2UI5_CL_APP_DEMO_06
+ E
+ tab - toolbar a container
+ 1
+ X
+ X
+ X
+
+
+
+
diff --git a/src/00/z2ui5_cl_app_demo_07.clas.abap b/src/00/z2ui5_cl_app_demo_07.clas.abap
new file mode 100644
index 00000000..93d72a41
--- /dev/null
+++ b/src/00/z2ui5_cl_app_demo_07.clas.abap
@@ -0,0 +1,90 @@
+CLASS z2ui5_cl_app_demo_07 DEFINITION PUBLIC.
+
+ PUBLIC SECTION.
+
+ INTERFACES z2ui5_if_app.
+
+ TYPES:
+ BEGIN OF ty_row,
+ selkz TYPE abap_bool,
+ title TYPE string,
+ value TYPE string,
+ descr TYPE string,
+ info TYPE string,
+ checkbox TYPE abap_bool,
+ END OF ty_row.
+
+ DATA t_tab TYPE STANDARD TABLE OF ty_row WITH EMPTY KEY.
+
+ DATA mv_value TYPE string VALUE 'button'.
+
+ PROTECTED SECTION.
+ PRIVATE SECTION.
+ENDCLASS.
+
+
+
+CLASS Z2UI5_CL_APP_DEMO_07 IMPLEMENTATION.
+
+
+ METHOD z2ui5_if_app~controller.
+
+ CASE client->get( )-lifecycle_method.
+
+ WHEN client->cs-lifecycle_method-on_init.
+
+ t_tab = REDUCE #( INIT ret = VALUE #( ) FOR n = 1 WHILE n < 10000 NEXT
+ ret = VALUE #( BASE ret ( title = 'Hans' value = 'red' info = 'completed' descr = 'this is a description' checkbox = abap_true ) ) ).
+
+
+ WHEN client->cs-lifecycle_method-on_event.
+
+ CASE client->get( )-event.
+ WHEN 'BACK'.
+ client->nav_app_leave( client->get( )-id_prev_app_stack ).
+ ENDCASE.
+
+
+
+ WHEN client->cs-lifecycle_method-on_rendering.
+
+ DATA(view) = client->factory_view( ).
+ DATA(page) = view->page( title = 'Example - ZZ2UI5_CL_APP_DEMO_07' navbuttontap = view->_event( 'BACK' ) ).
+ page->header_content( )->link( text = 'Go to Source Code' href = client->get( )-s_request-url_source_code ).
+
+ page->input( value = view->_bind( mv_value ) ).
+
+ DATA(tab) = page->table(
+ headertext = 'Table with 100 entries'
+ mode = 'MultiSelect'
+ items = view->_bind( t_tab ) ).
+
+ "set header
+ tab->columns(
+ )->column( )->text( 'Title' )->get_parent(
+ )->column( )->text( 'Color' )->get_parent(
+ )->column( )->text( 'Info' )->get_parent(
+ )->column( )->text( 'Description' )->get_parent(
+ )->column( )->text( 'Checkbox' ).
+
+ "set content
+ tab->items( )->column_list_item(
+ selected = '{SELKZ}'
+ )->cells(
+ )->text( '{TITLE}'
+ )->text( '{VALUE}'
+ )->text( '{INFO}'
+ )->text( '{DESCR}'
+ )->checkbox( selected = '{CHECKBOX}' enabled = abap_false ).
+
+
+ page->footer( )->overflow_toolbar(
+ )->toolbar_spacer(
+ )->button(
+ text = 'Send to Server'
+ press = view->_event( 'BUTTON_SEND' )
+ type = 'Success' ).
+ ENDCASE.
+
+ ENDMETHOD.
+ENDCLASS.
diff --git a/src/00/z2ui5_cl_app_demo_07.clas.xml b/src/00/z2ui5_cl_app_demo_07.clas.xml
new file mode 100644
index 00000000..4604b25a
--- /dev/null
+++ b/src/00/z2ui5_cl_app_demo_07.clas.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ Z2UI5_CL_APP_DEMO_07
+ E
+ tab - table
+ 1
+ X
+ X
+ X
+
+
+
+
diff --git a/src/00/z2ui5_cl_app_demo_08.clas.abap b/src/00/z2ui5_cl_app_demo_08.clas.abap
new file mode 100644
index 00000000..42ab9839
--- /dev/null
+++ b/src/00/z2ui5_cl_app_demo_08.clas.abap
@@ -0,0 +1,92 @@
+CLASS z2ui5_cl_app_demo_08 DEFINITION PUBLIC.
+
+ PUBLIC SECTION.
+
+ INTERFACES z2ui5_if_app.
+
+ DATA check_strip_active TYPE abap_bool.
+ DATA strip_type TYPE string.
+
+ PROTECTED SECTION.
+ PRIVATE SECTION.
+ENDCLASS.
+
+
+
+CLASS z2ui5_cl_app_demo_08 IMPLEMENTATION.
+
+
+ METHOD z2ui5_if_app~controller.
+
+ CASE client->get( )-lifecycle_method.
+
+ WHEN client->cs-lifecycle_method-on_event.
+
+ CASE client->get( )-event.
+
+ WHEN 'BUTTON_MESSAGE_BOX'.
+ client->popup_message_box( 'this is a message box' ).
+
+ WHEN 'BUTTON_MESSAGE_BOX_ERROR'.
+ client->popup_message_box( text = 'this is a message box' type = 'error' ).
+
+ WHEN 'BUTTON_MESSAGE_BOX_SUCCESS'.
+ client->popup_message_box( text = 'this is a message box' type = 'success' ).
+
+ WHEN 'BUTTON_MESSAGE_BOX_WARNING'.
+ client->popup_message_box( text = 'this is a message box' type = 'warning' ).
+
+ WHEN 'BUTTON_MESSAGE_TOAST'.
+ client->popup_message_toast( 'this is a message toast' ).
+
+ WHEN 'BUTTON_MESSAGE_STRIP_INFO'.
+ check_strip_active = xsdbool( check_strip_active = abap_false ).
+ strip_type = 'Information'.
+
+ WHEN 'BUTTON_MESSAGE_STRIP_ERROR'.
+ check_strip_active = xsdbool( check_strip_active = abap_false ).
+ strip_type = 'Error'.
+
+ WHEN 'BUTTON_MESSAGE_STRIP_SUCCESS'.
+ check_strip_active = xsdbool( check_strip_active = abap_false ).
+ strip_type = 'Success'.
+
+ WHEN 'BACK'.
+ client->nav_app_leave( client->get( )-id_prev_app_stack ).
+
+
+ ENDCASE.
+
+ WHEN client->cs-lifecycle_method-on_rendering.
+
+ "Definition of View Main
+ DATA(view) = client->factory_view( 'MAIN' ).
+ DATA(page) = view->page( title = 'abap2UI5 - Messages' navbuttontap = view->_event( 'BACK' ) ).
+ page->header_content( )->link( text = 'Go to Source Code' href = client->get( )-s_request-url_source_code ).
+
+ IF check_strip_active = abap_true.
+ page->message_strip( text = 'This is a Message Strip' type = strip_type ).
+ ENDIF.
+
+ page->grid( 'L6 M12 S12' )->content( 'l'
+ )->simple_form( 'Message Box' )->content( 'f'
+ )->button( text = 'information' press = view->_event( 'BUTTON_MESSAGE_BOX' )
+ )->button( text = 'success' press = view->_event( 'BUTTON_MESSAGE_BOX_SUCCESS' )
+ )->button( text = 'error' press = view->_event( 'BUTTON_MESSAGE_BOX_ERROR' )
+ )->button( text = 'warning' press = view->_event( 'BUTTON_MESSAGE_BOX_WARNING' ) ).
+
+ page->grid( 'L6 M12 S12' )->content( 'l'
+ )->simple_form( 'Message Strip' )->content( 'f'
+ )->button( text = 'success' press = view->_event( 'BUTTON_MESSAGE_STRIP_SUCCESS' )
+ )->button( text = 'error' press = view->_event( 'BUTTON_MESSAGE_STRIP_ERROR' )
+ )->button( text = 'information' press = view->_event( 'BUTTON_MESSAGE_STRIP_INFO' ) ).
+
+ page->grid( 'L6 M12 S12' )->content( 'l'
+ )->simple_form( 'Display' )->content( 'f'
+ )->button( text = 'Message Toast' press = view->_event( 'BUTTON_MESSAGE_TOAST' ) ).
+
+
+ ENDCASE.
+
+ ENDMETHOD.
+ENDCLASS.
diff --git a/src/00/z2ui5_cl_app_demo_08.clas.xml b/src/00/z2ui5_cl_app_demo_08.clas.xml
new file mode 100644
index 00000000..b76bde0d
--- /dev/null
+++ b/src/00/z2ui5_cl_app_demo_08.clas.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ Z2UI5_CL_APP_DEMO_08
+ E
+ basic - messages
+ 1
+ X
+ X
+ X
+
+
+
+
diff --git a/src/00/z2ui5_cl_app_demo_10.clas.abap b/src/00/z2ui5_cl_app_demo_10.clas.abap
new file mode 100644
index 00000000..fe3ec807
--- /dev/null
+++ b/src/00/z2ui5_cl_app_demo_10.clas.abap
@@ -0,0 +1,103 @@
+CLASS z2ui5_cl_app_demo_10 DEFINITION PUBLIC.
+
+ PUBLIC SECTION.
+ INTERFACES z2ui5_if_app.
+
+PROTECTED SECTION.
+PRIVATE SECTION.
+ENDCLASS.
+
+
+
+CLASS Z2UI5_CL_APP_DEMO_10 IMPLEMENTATION.
+
+
+ METHOD z2ui5_if_app~controller.
+
+ CASE client->get( )-lifecycle_method.
+
+ WHEN client->cs-lifecycle_method-on_init.
+ "implement init actions here...
+
+
+ WHEN client->cs-lifecycle_method-on_event.
+
+ CASE client->get( )-event.
+
+ WHEN '...'.
+ "implement event handling here...
+
+ WHEN 'BACK'.
+ client->nav_app_leave( client->get( )-id_prev_app_stack ).
+
+ ENDCASE.
+
+
+ WHEN client->cs-lifecycle_method-on_rendering.
+
+ DATA(view) = client->factory_view( ).
+
+ DATA(page) = view->page( title = 'abap2UI5 - Demo Layout' navbuttontap = view->_event( 'BACK' ) ).
+
+ page->header_content(
+ )->button( text = 'button'
+ )->text( 'text'
+ )->link( text = 'link' href = 'https://twitter.com/OblomovDev'
+ )->link( text = 'Go to Source Code' href = client->get( )-s_request-url_source_code
+ ).
+
+
+ page->sub_header( )->overflow_toolbar(
+ )->button( text = 'button'
+ )->text( 'text'
+ )->link( text = 'link' href = 'https://twitter.com/OblomovDev'
+ )->toolbar_spacer(
+ )->text( 'subheader'
+ )->toolbar_spacer(
+ )->button( text = 'button'
+ )->text( 'text'
+ )->link( text = 'link' href = 'https://twitter.com/OblomovDev' ).
+
+
+ DATA(grid) = page->grid( 'L4 M4 S4' )->content( 'l' ).
+ grid->simple_form( 'Grid width 33%' )->content( 'f'
+ )->button( text = 'button'
+ )->text( 'text'
+ )->link( text = 'link' href = 'https://twitter.com/OblomovDev' ).
+
+ grid->simple_form( 'Grid width 33%' )->content( 'f'
+ )->button( text = 'button'
+ )->text( 'text'
+ )->link( text = 'link' href = 'https://twitter.com/OblomovDev' ).
+
+ grid->simple_form( 'Grid width 33%' )->content( 'f'
+ )->button( text = 'button'
+ )->text( 'text'
+ )->link( text = 'link' href = 'https://twitter.com/OblomovDev' ).
+
+
+ grid = page->grid( 'L12 M12 S12' )->content( 'l' ).
+
+ grid->simple_form( 'grid width 100%' )->content( 'f'
+ )->button( text = 'button'
+ )->text( 'text'
+ )->link( text = 'link' href = 'https://twitter.com/OblomovDev' ).
+
+
+ page->footer( )->overflow_toolbar(
+ )->button( text = 'button'
+ )->text( 'text'
+ )->link( text = 'link' href = 'https://twitter.com/OblomovDev'
+ )->toolbar_spacer(
+ )->text( 'footer'
+ )->toolbar_spacer(
+ )->text( 'text'
+ )->link( text = 'link' href = 'https://twitter.com/OblomovDev'
+ )->button( text = 'reject' type = 'Reject'
+ )->button( text = 'accept' type = 'Success'
+ ).
+
+ ENDCASE.
+
+ ENDMETHOD.
+ENDCLASS.
diff --git a/src/00/z2ui5_cl_app_demo_10.clas.xml b/src/00/z2ui5_cl_app_demo_10.clas.xml
new file mode 100644
index 00000000..3b47ae62
--- /dev/null
+++ b/src/00/z2ui5_cl_app_demo_10.clas.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ Z2UI5_CL_APP_DEMO_10
+ E
+ basic - layout
+ 1
+ X
+ X
+ X
+
+
+
+
diff --git a/src/00/z2ui5_cl_app_demo_11.clas.abap b/src/00/z2ui5_cl_app_demo_11.clas.abap
new file mode 100644
index 00000000..bf2a59a2
--- /dev/null
+++ b/src/00/z2ui5_cl_app_demo_11.clas.abap
@@ -0,0 +1,132 @@
+CLASS z2ui5_cl_app_demo_11 DEFINITION PUBLIC.
+
+ PUBLIC SECTION.
+
+ INTERFACES z2ui5_if_app.
+
+ TYPES:
+ BEGIN OF ty_row,
+ selkz TYPE abap_bool,
+ title TYPE string,
+ value TYPE string,
+ descr TYPE string,
+ icon TYPE string,
+ info TYPE string,
+ checkbox TYPE abap_bool,
+ END OF ty_row.
+
+ DATA t_tab TYPE STANDARD TABLE OF ty_row WITH EMPTY KEY.
+ DATA check_editable_active TYPE abap_bool.
+
+ PROTECTED SECTION.
+ PRIVATE SECTION.
+ENDCLASS.
+
+
+
+CLASS z2ui5_cl_app_demo_11 IMPLEMENTATION.
+
+
+ METHOD z2ui5_if_app~controller.
+
+ CASE client->get( )-lifecycle_method.
+
+ WHEN client->cs-lifecycle_method-on_init.
+
+ check_editable_active = abap_false.
+
+ t_tab = VALUE #(
+ ( title = 'entry 01' value = 'red' info = 'completed' descr = 'this is a description' checkbox = abap_true )
+ ( title = 'entry 02' value = 'blue' info = 'completed' descr = 'this is a description' checkbox = abap_true )
+ ( title = 'entry 03' value = 'green' info = 'completed' descr = 'this is a description' checkbox = abap_true )
+ ( title = 'entry 04' value = 'orange' info = 'completed' descr = 'this is a description' checkbox = abap_true )
+ ( title = 'entry 05' value = 'grey' info = 'completed' descr = 'this is a description' checkbox = abap_true )
+ ).
+
+
+ WHEN client->cs-lifecycle_method-on_event.
+
+ CASE client->get( )-event.
+
+ WHEN 'BUTTON_EDIT'.
+ check_editable_active = xsdbool( check_editable_active = abap_false ).
+
+ WHEN 'BUTTON_DELETE'.
+ DELETE t_tab WHERE selkz = abap_true.
+
+ WHEN 'BUTTON_ADD'.
+ INSERT VALUE #( ) INTO TABLE t_tab.
+
+ WHEN 'BACK'.
+ client->nav_app_leave( client->get( )-id_prev_app_stack ).
+
+ ENDCASE.
+
+
+ WHEN client->cs-lifecycle_method-on_rendering.
+
+ DATA(view) = client->factory_view( ).
+ DATA(page) = view->page( title = 'abap2UI5 - Tables and editable' navbuttontap = view->_event( 'BACK' ) ).
+
+ page->header_content( )->link( text = 'Go to Source Code' href = client->get( )-s_request-url_source_code ).
+
+
+
+ DATA(tab) = page->table(
+ items = view->_bind( t_tab )
+ mode = 'MultiSelect'
+ ).
+
+ "set toolbar
+ tab->header_toolbar( )->overflow_toolbar(
+ )->title( 'title of the table'
+ )->toolbar_spacer(
+ )->button(
+ icon = 'sap-icon://delete'
+ text = 'delete selected row'
+ press = view->_event( 'BUTTON_DELETE' )
+ )->button(
+ icon = 'sap-icon://add'
+ text = 'add'
+ press = view->_event( 'BUTTON_ADD' )
+ )->button(
+ icon = 'sap-icon://edit'
+ text = SWITCH #( check_editable_active WHEN abap_true THEN 'display' ELSE 'edit' )
+ press = view->_event( 'BUTTON_EDIT' )
+
+ ).
+
+ "set header
+ tab->columns(
+ )->column( )->text( 'Title' )->get_parent(
+ )->column( )->text( 'Color' )->get_parent(
+ )->column( )->text( 'Info' )->get_parent(
+ )->column( )->text( 'Description' )->get_parent(
+ )->column( )->text( 'Checkbox' ).
+
+
+ "set toolbar
+ IF check_editable_active = abap_true.
+
+ tab->items( )->column_list_item( selected = '{SELKZ}' )->cells(
+ )->input( '{TITLE}'
+ )->input( '{VALUE}'
+ )->input( '{INFO}'
+ )->input( '{DESCR}'
+ )->checkbox( selected = '{CHECKBOX}' ).
+
+ ELSE.
+
+ tab->items( )->column_list_item( selected = '{SELKZ}' )->cells(
+ )->text( '{TITLE}'
+ )->text( '{VALUE}'
+ )->text( '{INFO}'
+ )->text( '{DESCR}'
+ )->checkbox( selected = '{CHECKBOX}' enabled = abap_false ).
+
+ ENDIF.
+
+ ENDCASE.
+
+ ENDMETHOD.
+ENDCLASS.
diff --git a/src/00/z2ui5_cl_app_demo_11.clas.xml b/src/00/z2ui5_cl_app_demo_11.clas.xml
new file mode 100644
index 00000000..99e27a91
--- /dev/null
+++ b/src/00/z2ui5_cl_app_demo_11.clas.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ Z2UI5_CL_APP_DEMO_11
+ E
+ tab - editable
+ 1
+ X
+ X
+ X
+
+
+
+
diff --git a/src/00/z2ui5_cl_app_demo_13.clas.abap b/src/00/z2ui5_cl_app_demo_13.clas.abap
new file mode 100644
index 00000000..67065c59
--- /dev/null
+++ b/src/00/z2ui5_cl_app_demo_13.clas.abap
@@ -0,0 +1,269 @@
+CLASS z2ui5_cl_app_demo_13 DEFINITION PUBLIC.
+
+ PUBLIC SECTION.
+
+ INTERFACES z2ui5_if_app.
+
+ TYPES:
+ BEGIN OF ty_s_spfli,
+ carrid TYPE c LENGTH 3,
+ connid TYPE n LENGTH 4,
+ countryfr TYPE c LENGTH 3,
+ cityfrom TYPE c LENGTH 20,
+ airpfrom TYPE c LENGTH 3,
+ countryto TYPE c LENGTH 3,
+ cityto TYPE c LENGTH 20,
+ airpto TYPE c LENGTH 3,
+ END OF ty_s_spfli.
+
+ TYPES ty_t_table TYPE STANDARD TABLE OF ty_s_spfli WITH EMPTY KEY.
+
+ DATA:
+ BEGIN OF ms_import,
+ t_table TYPE ty_t_table,
+ segment_key TYPE string,
+ editor TYPE string,
+ END OF ms_import.
+
+ DATA:
+ BEGIN OF ms_export,
+ t_table TYPE ty_t_table,
+ segment_key TYPE string,
+ editor TYPE string,
+ END OF ms_export.
+
+ DATA:
+ BEGIN OF ms_edit,
+ t_table TYPE ty_t_table,
+ delete_index TYPE i,
+ check_active TYPE abap_bool,
+ END OF ms_edit.
+
+ "dummy helper - not needed when using db
+ DATA st_db TYPE ty_T_table.
+
+ PROTECTED SECTION.
+
+ METHODS z2ui5_on_event
+ IMPORTING
+ client TYPE REF TO z2ui5_if_client.
+
+ METHODS z2ui5_on_render_view_import
+ IMPORTING
+ client TYPE REF TO z2ui5_if_client.
+
+ METHODS z2ui5_on_render_view_edit
+ IMPORTING
+ client TYPE REF TO z2ui5_if_client.
+
+ METHODS z2ui5_on_render_view_export
+ IMPORTING
+ client TYPE REF TO z2ui5_if_client.
+
+ PRIVATE SECTION.
+
+ENDCLASS.
+
+
+
+CLASS z2ui5_cl_app_demo_13 IMPLEMENTATION.
+
+
+ METHOD z2ui5_if_app~controller.
+ "dummy helper - not needed when using db
+ lcl_db=>app = me.
+
+ CASE client->get( )-lifecycle_method.
+
+ WHEN client->cs-lifecycle_method-on_init.
+ ms_import-segment_key = 'json'.
+ ms_import-editor = lcl_db=>get_test_data_json( ).
+ ms_export-segment_key = 'json'.
+ client->view_show( 'IMPORT_TABLE' ).
+
+ WHEN client->cs-lifecycle_method-on_event.
+ z2ui5_on_event( client ).
+
+ WHEN client->cs-lifecycle_method-on_rendering.
+ z2ui5_on_render_view_import( client ).
+ z2ui5_on_render_view_edit( client ).
+ z2ui5_on_render_view_export( client ).
+
+ ENDCASE.
+
+ ENDMETHOD.
+
+
+ METHOD z2ui5_on_event.
+
+ CASE client->get( )-event.
+
+ WHEN 'IMPORT_DB'.
+ ms_import-t_table = SWITCH #( ms_import-segment_key
+ WHEN 'json' THEN lcl_db=>get_table_by_json( ms_import-editor )
+ WHEN 'csv' THEN lcl_db=>get_table_by_csv( ms_import-editor )
+ WHEN 'xml' THEN lcl_db=>get_table_by_xml( ms_import-editor ) ).
+
+ lcl_db=>db_save( ms_import-t_table ).
+ client->popup_message_box( 'Table data imported successfully' ).
+
+ WHEN 'EXPORT_DB'.
+ ms_export-t_table = lcl_db=>db_read( ).
+ ms_export-editor = SWITCH #( ms_export-segment_key
+ WHEN 'json' THEN lcl_db=>get_json_by_table( ms_export-t_table )
+ WHEN 'csv' THEN lcl_db=>get_csv_by_table( ms_export-t_table )
+ WHEN 'xml' THEN lcl_db=>get_xml_by_table( ms_export-t_table ) ).
+
+ client->popup_message_box( 'Table data exported successfully' ).
+
+ WHEN 'IMPORT_CLEAR'.
+ CLEAR ms_import-editor.
+
+ WHEN 'EDIT_DB_READ'.
+ ms_edit-t_table = lcl_db=>db_read( ).
+ client->popup_message_box( 'Table read successfully' ).
+
+ WHEN 'EDIT_DB_SAVE'.
+ lcl_db=>db_save( ms_edit-t_table ).
+ client->popup_message_box( 'Table data saved to database successfully' ).
+
+ WHEN 'EDIT_ROW_DELETE'.
+ DELETE ms_edit-t_table INDEX ms_edit-delete_index + 1.
+
+ WHEN 'EDIT_CHANGE_MODE'.
+ ms_edit-check_active = xsdbool( ms_edit-check_active = abap_false ).
+
+ WHEN 'EDIT_ROW_ADD'.
+ INSERT VALUE #( ) INTO TABLE ms_edit-t_table.
+
+ WHEN 'BTN_IMPORT'.
+ client->view_show( 'IMPORT_TABLE' ).
+ WHEN 'BTN_EDIT'.
+ client->view_show( 'EDIT_TABLE' ).
+ WHEN 'BTN_EXPORT'.
+ client->view_show( 'EXPORT_TABLE' ).
+ WHEN 'BACK'.
+ client->nav_app_leave( client->get( )-id_prev_app_stack ).
+
+ ENDCASE.
+
+ ENDMETHOD.
+
+
+ METHOD z2ui5_on_render_view_import.
+
+ DATA(view) = client->factory_view( 'IMPORT_TABLE' ).
+ DATA(page) = view->page( title = 'abap2ui5 - Table Maintenance' navbuttontap = view->_event( 'BACK' ) ).
+
+ page->header_content( )->link( text = 'Demo' href = `https://twitter.com/OblomovDev/status/1634206964291911682`
+ )->link( text = 'Source_Code' href = client->get( )-s_request-url_source_code ).
+
+ page->sub_header( )->overflow_toolbar(
+ )->button( text = '(1) Import Data' press = view->_event( 'BTN_IMPORT' ) enabled = abap_false
+ )->button( text = '(2) Edit Data' press = view->_event( 'BTN_EDIT' )
+ )->button( text = '(3) Export Data' press = view->_event( 'BTN_EXPORT' ) ).
+
+ DATA(grid) = page->grid( default_span = 'L12 M12 S12' )->content( 'l' ).
+
+ grid->simple_form( '1. Import Data'
+ )->content( 'f'
+ )->label( 'Table' )->input( 'SPFLI'
+ )->label( 'Format'
+ )->segmented_button( view->_bind( ms_import-segment_key ) )->get(
+ )->items( )->get(
+ )->segmented_button_item( key = 'json' text = 'json'
+ )->segmented_button_item( key = 'csv' text = 'csv'
+ )->segmented_button_item( key = 'xml' text = 'xml' ).
+
+ grid->scroll_container( '75%' )->code_editor(
+ type = COND #( WHEN ms_import-segment_key = 'csv' THEN 'plain_text' ELSE ms_import-segment_key )
+ value = view->_bind( ms_import-editor )
+ editable = abap_true ).
+
+ page->footer( )->overflow_toolbar(
+ )->button( text = 'Clear' press = view->_event( 'IMPORT_CLEAR' ) icon = 'sap-icon://delete'
+ )->toolbar_spacer(
+ )->button( text = 'Import' press = view->_event( 'IMPORT_DB' ) type = 'Emphasized' icon = 'sap-icon://upload-to-cloud' ).
+
+ ENDMETHOD.
+
+
+ METHOD z2ui5_on_render_view_edit.
+
+ DATA(view) = client->factory_view( 'EDIT_TABLE' ).
+ DATA(page) = view->page( title = 'abap2ui5 - Table Maintenance' navbuttontap = view->_event( 'BACK' ) ).
+
+ page->sub_header( )->overflow_toolbar(
+ )->button( text = '(1) Import Data' press = view->_event( 'BTN_IMPORT' )
+ )->button( text = '(2) Edit Data' press = view->_event( 'BTN_EDIT' ) enabled = abap_false
+ )->button( text = '(3) Export Data' press = view->_event( 'BTN_EXPORT' ) ).
+
+ DATA(grid) = page->grid( default_span = 'L12 M12 S12' )->content( 'l' ).
+
+ grid->simple_form( '2. Edit Data'
+ )->content( 'f' )->label( 'Table' )->input( 'SPFLI' ).
+
+ DATA(table) = grid->ui_table(
+ rows = view->_bind( ms_edit-t_table )
+ selectionmode = 'Single'
+ selectedindex = view->_bind( ms_edit-delete_index ) ).
+
+ table->ui_extension( )->overflow_toolbar(
+ )->toolbar_spacer(
+ )->button( text = 'Reload' icon = 'sap-icon://refresh' press = view->_event( 'EDIT_DB_READ' )
+ )->button( text = 'Delete Row' icon = 'sap-icon://delete' press = view->_event( 'EDIT_ROW_DELETE' )
+ )->button( text = 'Add Row' icon = 'sap-icon://add' press = view->_event( 'EDIT_ROW_ADD' ) ).
+
+ DATA(columns) = table->ui_columns( ).
+ DATA(lt_fields) = lcl_db=>get_fieldlist_by_table( ms_edit-t_table ).
+
+ LOOP AT lt_fields INTO DATA(lv_field).
+ DATA(templ) = columns->ui_column( )->label( lv_field )->ui_template( ).
+ IF ms_edit-check_active = abap_true.
+ templ->input( value = `{` && lv_field && `}` ).
+ ELSE.
+ templ->text( `{` && lv_field && `}` ).
+ ENDIF.
+ ENDLOOP.
+
+ page->footer( )->overflow_toolbar(
+ )->button( text = 'Edit' press = view->_event( 'EDIT_CHANGE_MODE' ) icon = 'sap-icon://edit'
+ )->toolbar_spacer(
+ )->button( text = 'Save' press = view->_event( 'EDIT_DB_SAVE' ) type = 'Emphasized' icon = 'sap-icon://upload-to-cloud' ).
+
+ ENDMETHOD.
+
+
+ METHOD z2ui5_on_render_view_export.
+
+ DATA(view) = client->factory_view( 'EXPORT_TABLE' ).
+ DATA(page) = view->page( title = 'abap2ui5 - Table Maintenance' navbuttontap = view->_event( 'BACK' ) ).
+
+ page->sub_header( )->overflow_toolbar(
+ )->button( text = '(1) Import Data' press = view->_event( 'BTN_IMPORT' )
+ )->button( text = '(2) Edit Data' press = view->_event( 'BTN_EDIT' )
+ )->button( text = '(3) Export Data' press = view->_event( 'BTN_EXPORT' ) enabled = abap_false ).
+
+ DATA(grid) = page->grid( default_span = 'L12 M12 S12' )->content( 'l' ).
+
+ grid->simple_form( '3. Export Data'
+ )->content( 'f'
+ )->label( 'Table' )->input( 'SPFLI'
+ )->label( 'Format'
+ )->segmented_button( view->_bind( ms_export-segment_key ) )->get(
+ )->items( )->get(
+ )->segmented_button_item( key = 'json' text = 'json'
+ )->segmented_button_item( key = 'csv' text = 'csv'
+ )->segmented_button_item( key = 'xml' text = 'xml' ).
+
+ grid->scroll_container( '75%' )->code_editor(
+ type = COND #( WHEN ms_export-segment_key = 'csv' THEN 'plain_text' ELSE ms_import-segment_key )
+ value = view->_bind( ms_export-editor )
+ editable = abap_false ).
+
+ page->footer( )->overflow_toolbar(
+ )->toolbar_spacer(
+ )->button( text = 'Export' press = view->_event( 'EXPORT_DB' ) type = 'Emphasized' icon = 'sap-icon://download-from-cloud' ).
+
+ ENDMETHOD.
+ENDCLASS.
diff --git a/src/00/z2ui5_cl_app_demo_13.clas.locals_imp.abap b/src/00/z2ui5_cl_app_demo_13.clas.locals_imp.abap
new file mode 100644
index 00000000..a804f78d
--- /dev/null
+++ b/src/00/z2ui5_cl_app_demo_13.clas.locals_imp.abap
@@ -0,0 +1,312 @@
+CLASS lcl_db DEFINITION.
+
+
+ PUBLIC SECTION.
+
+
+ TYPES ty_t_table TYPE z2ui5_cl_app_demo_13=>ty_T_table.
+
+ CLASS-DATA app TYPE REF TO z2ui5_cl_app_demo_13.
+ "CLASS-DATA st_table TYPE ty_t_table.
+
+ CLASS-METHODS generate_test_data.
+
+ CLASS-METHODS get_table_by_json
+ IMPORTING
+ val TYPE string
+ RETURNING
+ VALUE(result) TYPE ty_T_table.
+
+ CLASS-METHODS get_table_by_xml
+ IMPORTING
+ val TYPE string
+ RETURNING
+ VALUE(result) TYPE ty_T_table.
+
+ CLASS-METHODS get_table_by_csv
+ IMPORTING
+ val TYPE string
+ RETURNING
+ VALUE(result) TYPE ty_T_table.
+
+ CLASS-METHODS get_csv_by_table
+ IMPORTING
+ val TYPE ty_T_table
+ RETURNING
+ VALUE(result) TYPE string.
+
+ CLASS-METHODS get_xml_by_table
+ IMPORTING
+ val TYPE ty_T_table
+ RETURNING
+ VALUE(result) TYPE string.
+
+ CLASS-METHODS get_json_by_table
+ IMPORTING
+ val TYPE ty_T_table
+ RETURNING
+ VALUE(result) TYPE string.
+
+ CLASS-METHODS get_fieldlist_by_table
+ IMPORTING
+ it_table TYPE ty_T_table
+ RETURNING
+ VALUE(result) TYPE string_table.
+
+ CLASS-METHODS db_save
+ IMPORTING
+ value TYPE ty_T_table.
+
+ CLASS-METHODS db_read
+ RETURNING
+ VALUE(result) TYPE ty_T_table.
+ CLASS-METHODS get_test_data_json
+ RETURNING
+ value(result) TYPE string.
+
+ PROTECTED SECTION.
+ PRIVATE SECTION.
+
+ENDCLASS.
+
+CLASS lcl_db IMPLEMENTATION.
+
+ METHOD generate_test_data.
+
+ app->st_db = VALUE #(
+ ( carrid = 'DL' connid = '0106' countryfr = 'US' cityfrom = 'NEW YORK' airpfrom = 'JFK' countryto = 'DE' cityto = 'FRANKFURT' airpto = 'FR' )
+ ( carrid = 'DL' connid = '0106' countryfr = 'US' cityfrom = 'NEW YORK' airpfrom = 'JFK' countryto = 'DE' cityto = 'FRANKFURT' airpto = 'FR' )
+ ( carrid = 'DL' connid = '0106' countryfr = 'US' cityfrom = 'NEW YORK' airpfrom = 'JFK' countryto = 'DE' cityto = 'FRANKFURT' airpto = 'FR' )
+ ( carrid = 'DL' connid = '0106' countryfr = 'US' cityfrom = 'NEW YORK' airpfrom = 'JFK' countryto = 'DE' cityto = 'FRANKFURT' airpto = 'FR' )
+ ( carrid = 'DL' connid = '0106' countryfr = 'US' cityfrom = 'NEW YORK' airpfrom = 'JFK' countryto = 'DE' cityto = 'FRANKFURT' airpto = 'FR' )
+ ( carrid = 'DL' connid = '0106' countryfr = 'US' cityfrom = 'NEW YORK' airpfrom = 'JFK' countryto = 'DE' cityto = 'FRANKFURT' airpto = 'FR' )
+ ( carrid = 'DL' connid = '0106' countryfr = 'US' cityfrom = 'NEW YORK' airpfrom = 'JFK' countryto = 'DE' cityto = 'FRANKFURT' airpto = 'FR' )
+ ( carrid = 'DL' connid = '0106' countryfr = 'US' cityfrom = 'NEW YORK' airpfrom = 'JFK' countryto = 'DE' cityto = 'FRANKFURT' airpto = 'FR' )
+ ).
+
+ ENDMETHOD.
+
+
+ METHOD get_table_by_json.
+
+ DATA lt_tab TYPE ty_T_table.
+
+ /ui2/cl_json=>deserialize(
+ EXPORTING
+ json = val
+* jsonx =
+* pretty_name =
+* assoc_arrays =
+* assoc_arrays_opt =
+* name_mappings =
+* conversion_exits =
+* hex_as_base64 =
+ CHANGING
+ data = lt_tab
+ ).
+
+ result = lt_tab.
+
+ ENDMETHOD.
+
+
+ METHOD get_table_by_xml.
+
+ DATA lt_tab TYPE ty_T_table.
+
+ CALL TRANSFORMATION id SOURCE xml = val RESULT data = lt_tab.
+
+ result = lt_tab.
+
+ ENDMETHOD.
+
+ METHOD get_table_by_csv.
+
+ SPLIT val AT ';' INTO TABLE DATA(lt_cols).
+
+ LOOP AT lt_cols INTO DATA(lv_field).
+
+ DATA(ls_row) = VALUE z2ui5_cl_app_demo_13=>ty_S_spfli( ).
+ DATA(lv_index) = 1.
+ DO.
+ ASSIGN COMPONENT lv_index OF STRUCTURE ls_row TO FIELD-SYMBOL().
+ IF sy-subrc <> 0.
+ EXIT.
+ ENDIF.
+ = lv_field.
+ lv_index = lv_index + 1.
+ ENDDO.
+ INSERT ls_row INTO TABLE result.
+
+ ENDLOOP.
+
+ ENDMETHOD.
+
+ METHOD db_save.
+
+ "normally modify database here
+
+ "test scenario, therefore write internal table instead
+ app->st_db = value.
+
+ ENDMETHOD.
+
+ METHOD db_read.
+
+ "normally read database here
+
+ "test scenario, therefore read internal table instead
+
+ result = app->st_db.
+
+ ENDMETHOD.
+
+ METHOD get_csv_by_table.
+
+ LOOP AT val INTO DATA(ls_row).
+
+ DATA(lv_index) = 1.
+ DO.
+ ASSIGN COMPONENT lv_index OF STRUCTURE ls_row TO FIELD-SYMBOL().
+ IF sy-subrc <> 0.
+ EXIT.
+ ENDIF.
+ lv_index = lv_index + 1.
+ result = result && && ';'.
+ ENDDO.
+ result = result && CL_ABAP_CHAR_UTILITIES=>CR_LF.
+ ENDLOOP.
+
+
+ ENDMETHOD.
+
+ METHOD get_json_by_table.
+
+ result = /ui2/cl_json=>serialize(
+ data = val
+* compress =
+* name =
+* pretty_name =
+* type_descr =
+* assoc_arrays =
+* ts_as_iso8601 =
+* expand_includes =
+* assoc_arrays_opt =
+* numc_as_string =
+* name_mappings =
+* conversion_exits =
+ " format_output = abap_true
+* hex_as_base64 =
+ ).
+
+
+ ENDMETHOD.
+
+ METHOD get_xml_by_table.
+
+ CALL TRANSFORMATION id SOURCE values = val RESULT XML result.
+
+ ENDMETHOD.
+
+ METHOD get_fieldlist_by_table.
+
+ DATA(lo_tab) = CAST cl_abap_tabledescr( cl_abap_datadescr=>describe_by_data( it_table ) ).
+ DATA(lo_struc) = CAST cl_abap_structdescr( lo_tab->get_table_line_type( ) ).
+
+ DATA(lt_comp) = lo_struc->get_components( ).
+
+ LOOP AT lt_comp INTO DATA(ls_comp).
+ INSERT ls_comp-name INTO TABLE result.
+ ENDLOOP.
+
+ ENDMETHOD.
+
+
+ METHOD get_test_data_json.
+
+ result = `[` && |\n| &&
+ ` {` && |\n| &&
+ ` "CARRID": "DL",` && |\n| &&
+ ` "CONNID": 106,` && |\n| &&
+ ` "COUNTRYFR": "US",` && |\n| &&
+ ` "CITYFROM": "NEW YORK",` && |\n| &&
+ ` "AIRPFROM": "JFK",` && |\n| &&
+ ` "COUNTRYTO": "DE",` && |\n| &&
+ ` "CITYTO": "FRANKFURT",` && |\n| &&
+ ` "AIRPTO": "FR"` && |\n| &&
+ ` },` && |\n| &&
+ ` {` && |\n| &&
+ ` "CARRID": "DL",` && |\n| &&
+ ` "CONNID": 106,` && |\n| &&
+ ` "COUNTRYFR": "US",` && |\n| &&
+ ` "CITYFROM": "NEW YORK",` && |\n| &&
+ ` "AIRPFROM": "JFK",` && |\n| &&
+ ` "COUNTRYTO": "DE",` && |\n| &&
+ ` "CITYTO": "FRANKFURT",` && |\n| &&
+ ` "AIRPTO": "FR"` && |\n| &&
+ ` },` && |\n| &&
+ ` {` && |\n| &&
+ ` "CARRID": "DL",` && |\n| &&
+ ` "CONNID": 106,` && |\n| &&
+ ` "COUNTRYFR": "US",` && |\n| &&
+ ` "CITYFROM": "NEW YORK",` && |\n| &&
+ ` "AIRPFROM": "JFK",` && |\n| &&
+ ` "COUNTRYTO": "DE",` && |\n| &&
+ ` "CITYTO": "FRANKFURT",` && |\n| &&
+ ` "AIRPTO": "FR"` && |\n| &&
+ ` },` && |\n| &&
+ ` {` && |\n| &&
+ ` "CARRID": "DL",` && |\n| &&
+ ` "CONNID": 106,` && |\n| &&
+ ` "COUNTRYFR": "US",` && |\n| &&
+ ` "CITYFROM": "NEW YORK",` && |\n| &&
+ ` "AIRPFROM": "JFK",` && |\n| &&
+ ` "COUNTRYTO": "DE",` && |\n| &&
+ ` "CITYTO": "FRANKFURT",` && |\n| &&
+ ` "AIRPTO": "FR"` && |\n| &&
+ ` },` && |\n| &&
+ ` {` && |\n| &&
+ ` "CARRID": "DL",` && |\n| &&
+ ` "CONNID": 106,` && |\n| &&
+ ` "COUNTRYFR": "US",` && |\n| &&
+ ` "CITYFROM": "NEW YORK",` && |\n| &&
+ ` "AIRPFROM": "JFK",` && |\n| &&
+ ` "COUNTRYTO": "DE",` && |\n| &&
+ ` "CITYTO": "FRANKFURT",` && |\n| &&
+ ` "AIRPTO": "FR"` && |\n| &&
+ ` },` && |\n| &&
+ ` {` && |\n| &&
+ ` "CARRID": "DL",` && |\n| &&
+ ` "CONNID": 106,` && |\n| &&
+ ` "COUNTRYFR": "US",` && |\n| &&
+ ` "CITYFROM": "NEW YORK",` && |\n| &&
+ ` "AIRPFROM": "JFK",` && |\n| &&
+ ` "COUNTRYTO": "DE",` && |\n| &&
+ ` "CITYTO": "FRANKFURT",` && |\n| &&
+ ` "AIRPTO": "FR"` && |\n| &&
+ ` },` && |\n| &&
+ ` {` && |\n| &&
+ ` "CARRID": "DL",` && |\n| &&
+ ` "CONNID": 106,` && |\n| &&
+ ` "COUNTRYFR": "US",` && |\n| &&
+ ` "CITYFROM": "NEW YORK",` && |\n| &&
+ ` "AIRPFROM": "JFK",` && |\n| &&
+ ` "COUNTRYTO": "DE",` && |\n| &&
+ ` "CITYTO": "FRANKFURT",` && |\n| &&
+ ` "AIRPTO": "FR"` && |\n| &&
+ ` },` && |\n| &&
+ ` {` && |\n| &&
+ ` "CARRID": "DL",` && |\n| &&
+ ` "CONNID": 106,` && |\n| &&
+ ` "COUNTRYFR": "US",` && |\n| &&
+ ` "CITYFROM": "NEW YORK",` && |\n| &&
+ ` "AIRPFROM": "JFK",` && |\n| &&
+ ` "COUNTRYTO": "DE",` && |\n| &&
+ ` "CITYTO": "FRANKFURT",` && |\n| &&
+ ` "AIRPTO": "FR"` && |\n| &&
+ ` }` && |\n| &&
+ `]`.
+
+ ENDMETHOD.
+
+ENDCLASS.
diff --git a/src/00/z2ui5_cl_app_demo_13.clas.xml b/src/00/z2ui5_cl_app_demo_13.clas.xml
new file mode 100644
index 00000000..baa76f3f
--- /dev/null
+++ b/src/00/z2ui5_cl_app_demo_13.clas.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ Z2UI5_CL_APP_DEMO_13
+ E
+ demo - table maintenance
+ 1
+ X
+ X
+ X
+
+
+
+
diff --git a/src/00/z2ui5_cl_app_demo_14.clas.abap b/src/00/z2ui5_cl_app_demo_14.clas.abap
new file mode 100644
index 00000000..477fec69
--- /dev/null
+++ b/src/00/z2ui5_cl_app_demo_14.clas.abap
@@ -0,0 +1,102 @@
+CLASS z2ui5_cl_app_demo_14 DEFINITION PUBLIC.
+
+ PUBLIC SECTION.
+
+ INTERFACES z2ui5_if_app.
+
+ DATA mv_type TYPE string.
+ DATA mv_path TYPE string.
+ DATA mv_editor TYPE string.
+ DATA mv_check_editable TYPE abap_bool.
+
+ PROTECTED SECTION.
+ PRIVATE SECTION.
+ENDCLASS.
+
+
+
+CLASS z2ui5_cl_app_demo_14 IMPLEMENTATION.
+
+
+ METHOD z2ui5_if_app~controller.
+
+ CASE client->get( )-lifecycle_method.
+
+ WHEN client->cs-lifecycle_method-on_init.
+ mv_path = '../../demo/text'.
+ mv_type = 'plain_text'.
+
+ WHEN client->cs-lifecycle_method-on_event.
+
+ CASE client->get( )-event.
+
+ WHEN 'DB_LOAD'.
+
+ mv_editor = COND #(
+ WHEN mv_path CS 'abap' THEN lcl_mime_api=>read_abap( )
+ WHEN mv_path CS 'json' THEN lcl_mime_api=>read_json( )
+ WHEN mv_path CS 'yaml' THEN lcl_mime_api=>read_yaml( )
+ WHEN mv_path CS 'text' THEN lcl_mime_api=>read_text( )
+ WHEN mv_path CS 'js' THEN lcl_mime_api=>read_js( )
+ ).
+ client->popup_message_toast( 'Download successfull' ).
+
+ WHEN 'DB_SAVE'.
+ lcl_mime_api=>save_data( ).
+ client->popup_message_box( text = 'Upload successfull. File saved!' type = 'success' ).
+
+ WHEN 'EDIT'.
+ mv_check_editable = xsdbool( mv_check_editable = abap_False ).
+ WHEN 'CLEAR'.
+ mv_editor = ``.
+ WHEN 'BACK'.
+ client->nav_app_leave( client->get( )-id_prev_app_stack ).
+
+ ENDCASE.
+
+ WHEN client->cs-lifecycle_method-on_rendering.
+
+ DATA(view) = client->factory_view( 'VIEW_INPUT' ).
+ DATA(page) = view->page( title = 'abap2UI5 - MIME Editor' navbuttontap = view->_event( 'BACK' ) ).
+
+ page->header_content( )->link( text = 'Demo' href = 'https://twitter.com/OblomovDev/status/1631562906570575875'
+ )->link( text = 'Source_Code' href = client->get( )-s_request-url_source_code ).
+
+ DATA(grid) = page->grid( 'L12 M12 S12' )->content( 'l' ).
+
+ grid->simple_form( 'File' )->content( 'f'
+ )->label( 'path'
+ )->input( view->_bind( mv_path )
+ )->label( 'Option'
+ )->input( value = view->_bind( mv_type ) suggestionitems = view->_bind_one_way( lcl_mime_api=>get_editor_type( ) )
+ )->get( )->suggestion_items( )->get(
+ )->list_item( text = '{NAME}' additionalText = '{VALUE}' )->get_parent( )->get_parent(
+ )->button( text = 'Download' press = view->_event( 'DB_LOAD' ) icon = 'sap-icon://download-from-cloud' ).
+
+ grid->simple_form( 'Editor' )->content( 'f'
+ )->scroll_container( '75%' )->code_editor(
+ type = mv_type
+ editable = mv_check_editable
+ value = view->_bind( mv_editor ) ).
+
+ page->footer( )->overflow_toolbar(
+ )->button(
+ text = 'Clear'
+ press = view->_event( 'CLEAR' )
+ icon = 'sap-icon://delete'
+ )->toolbar_spacer(
+ )->button(
+ text = 'Edit'
+ press = view->_event( 'EDIT' )
+ icon = 'sap-icon://edit'
+ )->button(
+ text = 'Upload'
+ press = view->_event( 'DB_SAVE' )
+ type = 'Emphasized'
+ icon = 'sap-icon://upload-to-cloud'
+ enabled = xsdbool( mv_editor IS NOT INITIAL ) ).
+
+ ENDCASE.
+
+ ENDMETHOD.
+ENDCLASS.
diff --git a/src/00/z2ui5_cl_app_demo_14.clas.locals_imp.abap b/src/00/z2ui5_cl_app_demo_14.clas.locals_imp.abap
new file mode 100644
index 00000000..e28604d0
--- /dev/null
+++ b/src/00/z2ui5_cl_app_demo_14.clas.locals_imp.abap
@@ -0,0 +1,190 @@
+CLASS lcl_mime_api DEFINITION FINAL.
+
+ PUBLIC SECTION.
+ CLASS-METHODS read_abap
+ RETURNING
+ VALUE(r_result) TYPE string.
+ CLASS-METHODS read_json
+ RETURNING
+ VALUE(r_result) TYPE string.
+ CLASS-METHODS read_js
+ RETURNING
+ VALUE(r_result) TYPE string.
+ CLASS-METHODS read_yaml
+ RETURNING
+ VALUE(r_result) TYPE string.
+ CLASS-METHODS read_text
+ RETURNING
+ VALUE(r_result) TYPE string.
+
+ TYPES:
+ BEGIN OF ty_S_suggest,
+ name TYPE string,
+ value TYPE string,
+ END OF ty_s_suggest.
+ TYPES ty_T_suggest TYPE STANDARD TABLE OF ty_s_suggest WITH EMPTY KEY.
+
+ CLASS-METHODS get_editor_type
+ RETURNING
+ VALUE(r_result) TYPE ty_t_suggest.
+ CLASS-METHODS save_data.
+
+ PROTECTED SECTION.
+
+ PRIVATE SECTION.
+
+ENDCLASS.
+
+CLASS lcl_mime_api IMPLEMENTATION.
+
+
+ METHOD read_abap.
+
+r_result = `METHOD SELECT_FILES.` && |\n| &&
+ |\n| &&
+ ` DATA: LV_RET_CODE TYPE I,` && |\n| &&
+ ` LV_USR_AXN TYPE I.` && |\n| &&
+ |\n| &&
+ ` CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG(` && |\n| &&
+ ` EXPORTING` && |\n| &&
+ ` WINDOW_TITLE = 'Select file'` && |\n| &&
+ ` MULTISELECTION = 'X'` && |\n| &&
+ ` CHANGING` && |\n| &&
+ ` FILE_TABLE = ME->PT_FILETAB` && |\n| &&
+ ` RC = LV_RET_CODE` && |\n| &&
+ ` USER_ACTION = LV_USR_AXN` && |\n| &&
+ ` EXCEPTIONS` && |\n| &&
+ ` FILE_OPEN_DIALOG_FAILED = 1` && |\n| &&
+ ` CNTL_ERROR = 2` && |\n| &&
+ ` ERROR_NO_GUI = 3` && |\n| &&
+ ` NOT_SUPPORTED_BY_GUI = 4` && |\n| &&
+ ` OTHERS = 5` && |\n| &&
+ ` ).` && |\n| &&
+ ` IF SY-SUBRC <> 0 OR` && |\n| &&
+ ` LV_USR_AXN = CL_GUI_FRONTEND_SERVICES=>ACTION_CANCEL.` && |\n| &&
+ ` RAISE EX_FILE_SEL_ERR.` && |\n| &&
+ ` ENDIF.` && |\n| &&
+ |\n| &&
+ ` ENDMETHOD. `.
+
+ ENDMETHOD.
+
+
+ METHOD read_json.
+
+ r_result = `{` && |\n| &&
+ ` "quiz": {` && |\n| &&
+ ` "sport": {` && |\n| &&
+ ` "q1": {` && |\n| &&
+ ` "test" : false,` && |\n| &&
+ ` "question": "Which one is correct team name in NBA?",` && |\n| &&
+ ` "options": [` && |\n| &&
+ ` "New York Bulls",` && |\n| &&
+ ` "Los Angeles Kings",` && |\n| &&
+ ` "Golden State Warriros",` && |\n| &&
+ ` "Huston Rocket"` && |\n| &&
+ ` ],` && |\n| &&
+ ` "answer": "Huston Rocket"` && |\n| &&
+ ` }` && |\n| &&
+ ` },` && |\n| &&
+ ` "maths": {` && |\n| &&
+ ` "q1": {` && |\n| &&
+ ` "question": "5 + 7 = ?",` && |\n| &&
+ ` "options": [` && |\n| &&
+ ` "10",` && |\n| &&
+ ` "11",` && |\n| &&
+ ` "12",` && |\n| &&
+ ` "13"` && |\n| &&
+ ` ],` && |\n| &&
+ ` "answer": "12"` && |\n| &&
+ ` },` && |\n| &&
+ ` "q2": {` && |\n| &&
+ ` "question": true,` && |\n| &&
+ ` "options": [` && |\n| &&
+ ` "1",` && |\n| &&
+ ` "2",` && |\n| &&
+ ` "3",` && |\n| &&
+ ` "4"` && |\n| &&
+ ` ],` && |\n| &&
+ ` "answer": 487829` && |\n| &&
+ ` }` && |\n| &&
+ ` }` && |\n| &&
+ ` }` && |\n| &&
+ `}`.
+
+ ENDMETHOD.
+
+
+ METHOD read_js.
+
+ r_result = `function showAlert() {` && |\n| &&
+ ` alert("Alert from JS file");` && |\n| &&
+ `}` && |\n| &&
+ |\n| &&
+ `function updateHeading() {` && |\n| &&
+ ` document.getElementById('heading').innerHTML = 'Heading changed with JS';` && |\n| &&
+ `}`.
+
+ ENDMETHOD.
+
+
+ METHOD read_yaml.
+
+ r_result = `# Employee records` && |\n| &&
+ `- martin:` && |\n| &&
+ ` name: Martin Developer` && |\n| &&
+ ` job: Developer` && |\n| &&
+ ` skills:` && |\n| &&
+ ` - python` && |\n| &&
+ ` - perl` && |\n| &&
+ ` - pascal` && |\n| &&
+ `- tabitha:` && |\n| &&
+ ` name: Tabitha Bitumen` && |\n| &&
+ ` job: Developer` && |\n| &&
+ ` skills:` && |\n| &&
+ ` - lisp` && |\n| &&
+ ` - fortran` && |\n| &&
+ ` - erlang`.
+
+ ENDMETHOD.
+
+
+ METHOD read_text.
+ r_result = `TXT test file` && |\n| &&
+ `Purpose: Provide example of this file type` && |\n| &&
+ `Document file type: TXT` && |\n| &&
+ `Version: 1.0` && |\n| &&
+ `Remark:` && |\n| &&
+ |\n| &&
+ `Example content:` && |\n| &&
+ `The names "John Doe" for males, "Jane Doe" or "Jane Roe" for females, or "Jonnie Doe" and "Janie Doe" for children, or just "Doe" non-gender-specifically are used as placeholder names for a party whose true identity is unknown or mus` &&
+`t be withheld in a legal action, case, or discussion. The names are also used to refer to acorpse or hospital patient whose identity is unknown. This practice is widely used in the United States and Canada, but is rarely used in other English-speak` &&
+`ing countries including the United Kingdom itself, from where the use of "John Doe" in a legal context originates. The names Joe Bloggs or John Smith are used in the UK instead, as well as in Australia and New Zealand.` && |\n| &&
+ |\n| &&
+ `John Doe is sometimes used to refer to a typical male in other contexts as well, in a similar manner to John Q. Public, known in Great Britain as Joe Public, John Smith or Joe Bloggs. For example, the first name listed on a form is o` &&
+`ften John Doe, along with a fictional address or other fictional information to provide an example of how to fill in the form. The name is also used frequently in popular culture, for example in the Frank Capra film Meet John Doe. John Doe was also` &&
+` the name of a 2002 American television series.`.
+ ENDMETHOD.
+
+ METHOD get_editor_type.
+
+ DATA(lv_types) = `abap, abc, actionscript, ada, apache_conf, applescript, asciidoc, assembly_x86, autohotkey, batchfile, bro, c9search, c_cpp, cirru, clojure, cobol, coffee, coldfusion, csharp, css, curly, d, dart, diff, django, dockerfile, ` &&
+`dot, drools, eiffel, yaml, ejs, elixir, elm, erlang, forth, fortran, ftl, gcode, gherkin, gitignore, glsl, gobstones, golang, groovy, haml, handlebars, haskell, haskell_cabal, haxe, hjson, html, html_elixir, html_ruby, ini, io, jack, jade, java, ja` &&
+`vascri` &&
+`pt, json, jsoniq, jsp, jsx, julia, kotlin, latex, lean, less, liquid, lisp, live_script, livescript, logiql, lsl, lua, luapage, lucene, makefile, markdown, mask, matlab, mavens_mate_log, maze, mel, mips_assembler, mipsassembler, mushcode, mysql, ni` &&
+`x, nsis, objectivec, ocaml, pascal, perl, pgsql, php, plain_text, powershell, praat, prolog, properties, protobuf, python, r, razor, rdoc, rhtml, rst, ruby, rust, sass, scad, scala, scheme, scss, sh, sjs, smarty, snippets, soy_template, space, sql,` &&
+` sqlserver, stylus, svg, swift, swig, tcl, tex, text, textile, toml, tsx, twig, typescript, vala, vbscript, velocity, verilog, vhdl, wollok, xml, xquery, terraform, slim, redshift, red, puppet, php_laravel_blade, mixal, jssm, fsharp, edifact,` &&
+` csp, cssound_score, cssound_orchestra, cssound_document`.
+ SPLIT lv_types AT ',' INTO TABLE DATA(lt_types).
+
+
+ r_result = VALUE #( FOR row IN lt_types ( name = shift_right( shift_left( row ) ) value = shift_right( shift_left( row ) ) ) ).
+
+ ENDMETHOD.
+
+
+ METHOD save_data.
+ "save data here
+ ENDMETHOD.
+
+ENDCLASS.
diff --git a/src/00/z2ui5_cl_app_demo_14.clas.xml b/src/00/z2ui5_cl_app_demo_14.clas.xml
new file mode 100644
index 00000000..c07f1d19
--- /dev/null
+++ b/src/00/z2ui5_cl_app_demo_14.clas.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ Z2UI5_CL_APP_DEMO_14
+ E
+ demo - code/mime editor
+ 1
+ X
+ X
+ X
+
+
+
+
diff --git a/src/00/z2ui5_cl_app_demo_16.clas.abap b/src/00/z2ui5_cl_app_demo_16.clas.abap
new file mode 100644
index 00000000..65d25f3d
--- /dev/null
+++ b/src/00/z2ui5_cl_app_demo_16.clas.abap
@@ -0,0 +1,261 @@
+CLASS z2ui5_cl_app_demo_16 DEFINITION PUBLIC.
+
+ PUBLIC SECTION.
+
+ INTERFACES z2ui5_if_app.
+
+ DATA mv_type TYPE string.
+ DATA mv_path TYPE string.
+ DATA mv_editor TYPE string.
+ DATA mv_check_editable TYPE abap_bool.
+
+ DATA mv_sel1 TYPE abap_bool.
+ DATA mv_sel2 TYPE abap_bool.
+ DATA mv_sel3 TYPE abap_bool.
+
+ DATA mv_tab_bar_active TYPE abap_bool.
+ DATA mv_tab_donut_active TYPE abap_bool.
+ DATA mv_tab_line_active TYPE abap_bool.
+ DATA mv_tab_radial_active TYPE abap_bool.
+
+ METHODS render_tab_bar
+ IMPORTING
+ view TYPE REF TO z2ui5_if_view
+ container TYPE REF TO z2ui5_if_view.
+
+ METHODS render_tab_donut
+ IMPORTING
+ view TYPE REF TO z2ui5_if_view
+ container TYPE REF TO z2ui5_if_view.
+
+ METHODS render_tab_line
+ IMPORTING
+ view TYPE REF TO z2ui5_if_view
+ container TYPE REF TO z2ui5_if_view.
+
+ METHODS render_tab_radial
+ IMPORTING
+ view TYPE REF TO z2ui5_if_view
+ container TYPE REF TO z2ui5_if_view.
+
+
+ENDCLASS.
+
+
+
+CLASS Z2UI5_CL_APP_DEMO_16 IMPLEMENTATION.
+
+
+ METHOD render_tab_bar.
+
+ DATA(tab) = container->tab( text = 'Bar Chart' selected = view->_bind( mv_tab_bar_active ) ).
+ DATA(grid) = tab->grid( default_span = 'XL6 L6 M6 S12' ).
+
+ grid->link(
+ text = 'Go to the SAP Demos for Interactive bar Charts here...'
+ href = 'https://sapui5.hana.ondemand.com/#/entity/sap.suite.ui.microchart.InteractiveBarChart/sample/sap.suite.ui.microchart.sample.InteractiveBarChart'
+ ).
+
+ grid->text( text = 'Absolute and Percentage value' class = 'sapUiSmallMargin'
+ )->get( )->layout_data( )->grid_data( span = 'XL12 L12 M12 S12' ).
+
+
+ "Example with absolute and percentage values
+ DATA(bar) = grid->flex_box( width = '22rem' height = '13rem' alignitems = 'Center' class = 'sapUiSmallMargin'
+ )->items( )->interact_bar_chart(
+ selectionchanged = view->_event( 'BAR_CHANGED' )
+ press = view->_event( 'BAR_PRESS' )
+ )->bars( ).
+ bar->interact_bar_chart_bar( selected = view->_bind( mv_sel1 ) label = 'Product 1' value = '10' ).
+ bar->interact_bar_chart_bar( selected = view->_bind( mv_sel2 ) label = 'Product 2' value = '20' ).
+ bar->interact_bar_chart_bar( selected = view->_bind( mv_sel3 ) label = 'Product 3' value = '70' ).
+
+
+ bar = grid->flex_box( width = '22rem' height = '13rem' alignitems = 'Center' class = 'sapUiSmallMargin'
+ )->items( )->interact_bar_chart(
+ selectionchanged = view->_event( 'BAR_CHANGED' )
+ press = view->_event( 'BAR_PRESS' )
+ )->bars( ).
+ bar->interact_bar_chart_bar( selected = view->_bind( mv_sel1 ) label = 'Product 1' value = '10' displayedValue = '10%' ).
+ bar->interact_bar_chart_bar( selected = view->_bind( mv_sel2 ) label = 'Product 2' value = '20' displayedValue = '20%' ).
+ bar->interact_bar_chart_bar( selected = view->_bind( mv_sel3 ) label = 'Product 3' value = '70' displayedValue = '70%' ).
+
+
+ DATA(layout) = grid->vertical_layout( )->layout_data( ns = 'l' )->grid_data( span = 'XL12 L12 M12 S12' )->get_parent( )->get_parent( ).
+
+ layout->text( text = 'Positive and Negative values' class = 'sapUiSmallMargin' ).
+ bar = layout->flex_box( width = '20rem' height = '10rem' alignitems = 'Center' class = 'sapUiSmallMargin'
+ )->items( )->interact_bar_chart(
+ selectionchanged = view->_event( 'BAR_CHANGED' )
+ press = view->_event( 'BAR_PRESS' )
+ labelwidth = '25%'
+ )->bars( ).
+ bar->interact_bar_chart_bar( label = 'Product 1' value = '25' ).
+ bar->interact_bar_chart_bar( label = 'Product 2' value = '-50' ).
+ bar->interact_bar_chart_bar( label = 'Product 3' value = '-100' ).
+
+ ENDMETHOD.
+
+
+ METHOD render_tab_donut.
+
+ DATA(tab) = container->tab( text = 'Donut Chart' selected = view->_bind( mv_tab_donut_active ) ).
+ DATA(grid) = tab->grid( default_span = 'XL6 L6 M6 S12' ).
+
+ grid->link(
+ text = 'Go to the SAP Demos for Interactive Donut Charts here...'
+ href = 'https://sapui5.hana.ondemand.com/#/entity/sap.suite.ui.microchart.InteractiveDonutChart/sample/sap.suite.ui.microchart.sample.InteractiveDonutChart'
+ ).
+ grid->text( text = 'Three segments' class = 'sapUiSmallMargin'
+ )->get( )->layout_data( )->grid_data( span = 'XL12 L12 M12 S12' ).
+
+ DATA(seg) = grid->flex_box(
+ width = '22rem' height = '13rem' alignitems = 'Start' justifycontent = 'SpaceBetween'
+ )->items(
+ )->interact_donut_chart(
+ selectionchanged = view->_event( 'DONUT_CHANGED' )
+ )->segments( ).
+ seg->interact_donut_chart_segment( selected = view->_bind( mv_sel1 ) label = 'Implementation Phase' value = '40.0' displayedvalue = '40.0%' ).
+ seg->interact_donut_chart_segment( selected = view->_bind( mv_sel2 )
+ label = 'Design Phase' value = '21.5' displayedvalue = '21.5%' ).
+ seg->interact_donut_chart_segment( selected = view->_bind( mv_sel3 )
+ label = 'Test Phase' value = '38.5' displayedvalue = '38.5%' ).
+
+
+ grid->text( text = 'Four segments' class = 'sapUiSmallMargin'
+ )->get( )->layout_data( )->grid_data( span = 'XL12 L12 M12 S12' ).
+
+ seg = grid->flex_box( width = '22rem' height = '13rem' alignitems = 'Start' justifycontent = 'SpaceBetween'
+ )->items(
+ )->interact_donut_chart(
+ selectionchanged = view->_event( 'DONUT_CHANGED' )
+ press = view->_event( 'DONUT_PRESS' )
+ displayedsegments = '4'
+ )->segments( ).
+ seg->interact_donut_chart_segment( label = 'Design Phase' value = '32.0' displayedvalue = '32.0%' ).
+ seg->interact_donut_chart_segment( label = 'Implementation Phase' value = '28' displayedvalue = '28%' ).
+ seg->interact_donut_chart_segment( label = 'Test Phase' value = '25' displayedvalue = '25%' ).
+ seg->interact_donut_chart_segment( label = 'Launch Phase' value = '15' displayedvalue = '15%' ).
+
+
+ grid->text( text = 'Error Messages' class = 'sapUiSmallMargin'
+ )->get( )->layout_data( )->grid_data( span = 'XL12 L12 M12 S12' ).
+
+ seg = grid->flex_box( width = '22rem' height = '13rem' alignitems = 'Start' justifycontent = 'SpaceBetween'
+ )->items( )->interact_donut_chart(
+ selectionchanged = view->_event( 'DONUT_CHANGED' )
+ showerror = abap_true
+ errormessagetitle = 'No data'
+ errormessage = 'Currently no data is available'
+ )->segments( ).
+ seg->interact_donut_chart_segment( label = 'Implementation Phase' value = '40.0' displayedvalue = '40.0%' ).
+ seg->interact_donut_chart_segment( label = 'Design Phase' value = '21.5' displayedvalue = '21.5%' ).
+ seg->interact_donut_chart_segment( label = 'Test Phase' value = '38.5' displayedvalue = '38.5%' ).
+
+
+
+ ENDMETHOD.
+
+
+ METHOD render_tab_line.
+
+ DATA(tab) = container->tab( text = 'Line Chart' selected = view->_bind( mv_tab_line_active ) ).
+ DATA(grid) = tab->grid( default_span = 'XL6 L6 M6 S12' ).
+
+ grid->link(
+ text = 'Go to the SAP Demos for Interactive Line Charts here...'
+ href = 'https://sapui5.hana.ondemand.com/#/entity/sap.suite.ui.microchart.InteractiveLineChart/sample/sap.suite.ui.microchart.sample.InteractiveLineChart'
+ ).
+
+
+ ENDMETHOD.
+
+
+ METHOD render_tab_radial.
+
+ DATA(tab) = container->tab( text = 'Radial Chart' selected = view->_bind( mv_tab_radial_active ) ).
+ DATA(grid) = tab->grid( default_span = 'XL6 L6 M6 S12' ).
+
+ grid->link(
+ text = 'Go to the SAP Demos for Radial Charts here...'
+ href = 'https://sapui5.hana.ondemand.com/#/entity/sap.suite.ui.microchart.RadialMicroChart/sample/sap.suite.ui.microchart.sample.RadialMicroChart'
+ ).
+
+
+ ENDMETHOD.
+
+
+ METHOD z2ui5_if_app~controller.
+
+ CASE client->get( )-lifecycle_method.
+
+ WHEN client->cs-lifecycle_method-on_init.
+ mv_path = '../../demo/text'.
+ mv_type = 'plain_text'.
+ mv_sel1 = abap_true.
+
+ WHEN client->cs-lifecycle_method-on_event.
+
+ CASE client->get( )-event.
+
+ WHEN 'DONUT_CHANGED'.
+ mv_type = 'plain_text'.
+
+ WHEN 'DB_LOAD'.
+
+ mv_editor = COND #(
+ WHEN mv_path CS 'abap' THEN lcl_mime_api=>read_abap( )
+ WHEN mv_path CS 'json' THEN lcl_mime_api=>read_json( )
+ WHEN mv_path CS 'yaml' THEN lcl_mime_api=>read_yaml( )
+ WHEN mv_path CS 'text' THEN lcl_mime_api=>read_text( ) ).
+ client->popup_message_toast( 'Download successfull' ).
+
+ WHEN 'DB_SAVE'.
+ lcl_mime_api=>save_data( mv_editor ).
+ client->popup_message_box( text = 'Upload successfull. File saved!' type = 'success' ).
+
+ WHEN 'EDIT'.
+ mv_check_editable = xsdbool( mv_check_editable = abap_False ).
+ WHEN 'CLEAR'.
+ mv_editor = ``.
+ WHEN 'BACK'.
+ client->nav_app_leave( client->get( )-id_prev_app_stack ).
+
+ ENDCASE.
+
+ WHEN client->cs-lifecycle_method-on_rendering.
+
+ DATA(view) = client->factory_view( 'VIEW_INPUT' ).
+ DATA(page) = view->page( title = 'abap2UI5 - Visualization with Charts' navbuttontap = view->_event( 'BACK' ) ).
+ page->header_content(
+ ")->link( text = 'Demo' href = `https://twitter.com/OblomovDev/status/1634206964291911682`
+ )->link( text = 'Source_Code' href = client->get( )-s_request-url_source_code
+ ).
+
+ DATA(container) = page->tab_container( ).
+
+ render_tab_donut( view = view container = container ).
+ render_tab_bar( view = view container = container ).
+ render_tab_line( view = view container = container ).
+ render_tab_radial( view = view container = container ).
+
+ " tab = container->tab( 'Interactive Line Chart' ).
+ " tab = container->tab( 'Radial Micro Chart' ).
+
+ page->footer( )->overflow_toolbar(
+ )->overflow_toolbar_button(
+ text = 'Delete'
+ icon = 'sap-icon://delete'
+ )->toolbar_spacer(
+ )->overflow_toolbar_button(
+ text = 'Edit'
+ icon = 'sap-icon://edit'
+ )->overflow_toolbar_button(
+ text = 'Upload'
+ type = 'Emphasized'
+ icon = 'sap-icon://upload-to-cloud' ).
+
+ ENDCASE.
+
+ ENDMETHOD.
+ENDCLASS.
diff --git a/src/00/z2ui5_cl_app_demo_16.clas.locals_imp.abap b/src/00/z2ui5_cl_app_demo_16.clas.locals_imp.abap
new file mode 100644
index 00000000..09992b29
--- /dev/null
+++ b/src/00/z2ui5_cl_app_demo_16.clas.locals_imp.abap
@@ -0,0 +1,194 @@
+CLASS lcl_mime_api DEFINITION FINAL.
+
+ PUBLIC SECTION.
+ CLASS-METHODS read_abap
+ RETURNING
+ VALUE(r_result) TYPE string.
+ CLASS-METHODS read_json
+ RETURNING
+ VALUE(r_result) TYPE string.
+ CLASS-METHODS read_js
+ RETURNING
+ VALUE(r_result) TYPE string.
+ CLASS-METHODS read_yaml
+ RETURNING
+ VALUE(r_result) TYPE string.
+ CLASS-METHODS read_text
+ RETURNING
+ VALUE(r_result) TYPE string.
+
+ TYPES:
+ BEGIN OF ty_S_suggest,
+ name TYPE string,
+ value TYPE string,
+ END OF ty_s_suggest.
+ TYPES ty_T_suggest TYPE STANDARD TABLE OF ty_s_suggest WITH EMPTY KEY.
+
+ CLASS-METHODS get_editor_type
+ RETURNING
+ VALUE(r_result) TYPE ty_t_suggest.
+
+ CLASS-METHODS save_data
+ IMPORTING
+ i_mv_editor TYPE string.
+
+
+ PROTECTED SECTION.
+
+ PRIVATE SECTION.
+
+ENDCLASS.
+
+CLASS lcl_mime_api IMPLEMENTATION.
+
+
+ METHOD read_abap.
+
+r_result = `METHOD SELECT_FILES.` && |\n| &&
+ |\n| &&
+ ` DATA: LV_RET_CODE TYPE I,` && |\n| &&
+ ` LV_USR_AXN TYPE I.` && |\n| &&
+ |\n| &&
+ ` CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG(` && |\n| &&
+ ` EXPORTING` && |\n| &&
+ ` WINDOW_TITLE = 'Select file'` && |\n| &&
+ ` MULTISELECTION = 'X'` && |\n| &&
+ ` CHANGING` && |\n| &&
+ ` FILE_TABLE = ME->PT_FILETAB` && |\n| &&
+ ` RC = LV_RET_CODE` && |\n| &&
+ ` USER_ACTION = LV_USR_AXN` && |\n| &&
+ ` EXCEPTIONS` && |\n| &&
+ ` FILE_OPEN_DIALOG_FAILED = 1` && |\n| &&
+ ` CNTL_ERROR = 2` && |\n| &&
+ ` ERROR_NO_GUI = 3` && |\n| &&
+ ` NOT_SUPPORTED_BY_GUI = 4` && |\n| &&
+ ` OTHERS = 5` && |\n| &&
+ ` ).` && |\n| &&
+ ` IF SY-SUBRC <> 0 OR` && |\n| &&
+ ` LV_USR_AXN = CL_GUI_FRONTEND_SERVICES=>ACTION_CANCEL.` && |\n| &&
+ ` RAISE EX_FILE_SEL_ERR.` && |\n| &&
+ ` ENDIF.` && |\n| &&
+ |\n| &&
+ ` ENDMETHOD. `.
+
+ ENDMETHOD.
+
+
+ METHOD read_json.
+
+ r_result = `{` && |\n| &&
+ ` "quiz": {` && |\n| &&
+ ` "sport": {` && |\n| &&
+ ` "q1": {` && |\n| &&
+ ` "test" : false,` && |\n| &&
+ ` "question": "Which one is correct team name in NBA?",` && |\n| &&
+ ` "options": [` && |\n| &&
+ ` "New York Bulls",` && |\n| &&
+ ` "Los Angeles Kings",` && |\n| &&
+ ` "Golden State Warriros",` && |\n| &&
+ ` "Huston Rocket"` && |\n| &&
+ ` ],` && |\n| &&
+ ` "answer": "Huston Rocket"` && |\n| &&
+ ` }` && |\n| &&
+ ` },` && |\n| &&
+ ` "maths": {` && |\n| &&
+ ` "q1": {` && |\n| &&
+ ` "question": "5 + 7 = ?",` && |\n| &&
+ ` "options": [` && |\n| &&
+ ` "10",` && |\n| &&
+ ` "11",` && |\n| &&
+ ` "12",` && |\n| &&
+ ` "13"` && |\n| &&
+ ` ],` && |\n| &&
+ ` "answer": "12"` && |\n| &&
+ ` },` && |\n| &&
+ ` "q2": {` && |\n| &&
+ ` "question": true,` && |\n| &&
+ ` "options": [` && |\n| &&
+ ` "1",` && |\n| &&
+ ` "2",` && |\n| &&
+ ` "3",` && |\n| &&
+ ` "4"` && |\n| &&
+ ` ],` && |\n| &&
+ ` "answer": 487829` && |\n| &&
+ ` }` && |\n| &&
+ ` }` && |\n| &&
+ ` }` && |\n| &&
+ `}`.
+
+ ENDMETHOD.
+
+
+ METHOD read_js.
+
+ r_result = `function showAlert() {` && |\n| &&
+ ` alert("Alert from JS file");` && |\n| &&
+ `}` && |\n| &&
+ |\n| &&
+ `function updateHeading() {` && |\n| &&
+ ` document.getElementById('heading').innerHTML = 'Heading changed with JS';` && |\n| &&
+ `}`.
+
+ ENDMETHOD.
+
+
+ METHOD read_yaml.
+
+ r_result = `# Employee records` && |\n| &&
+ `- martin:` && |\n| &&
+ ` name: Martin Developer` && |\n| &&
+ ` job: Developer` && |\n| &&
+ ` skills:` && |\n| &&
+ ` - python` && |\n| &&
+ ` - perl` && |\n| &&
+ ` - pascal` && |\n| &&
+ `- tabitha:` && |\n| &&
+ ` name: Tabitha Bitumen` && |\n| &&
+ ` job: Developer` && |\n| &&
+ ` skills:` && |\n| &&
+ ` - lisp` && |\n| &&
+ ` - fortran` && |\n| &&
+ ` - erlang`.
+
+ ENDMETHOD.
+
+
+ METHOD read_text.
+ r_result = `TXT test file` && |\n| &&
+ `Purpose: Provide example of this file type` && |\n| &&
+ `Document file type: TXT` && |\n| &&
+ `Version: 1.0` && |\n| &&
+ `Remark:` && |\n| &&
+ |\n| &&
+ `Example content:` && |\n| &&
+ `The names "John Doe" for males, "Jane Doe" or "Jane Roe" for females, or "Jonnie Doe" and "Janie Doe" for children, or just "Doe" non-gender-specifically are used as placeholder names for a party whose true identity is unknown or mus` &&
+`t be withheld in a legal action, case, or discussion. The names are also used to refer to acorpse or hospital patient whose identity is unknown. This practice is widely used in the United States and Canada, but is rarely used in other English-speak` &&
+`ing countries including the United Kingdom itself, from where the use of "John Doe" in a legal context originates. The names Joe Bloggs or John Smith are used in the UK instead, as well as in Australia and New Zealand.` && |\n| &&
+ |\n| &&
+ `John Doe is sometimes used to refer to a typical male in other contexts as well, in a similar manner to John Q. Public, known in Great Britain as Joe Public, John Smith or Joe Bloggs. For example, the first name listed on a form is o` &&
+`ften John Doe, along with a fictional address or other fictional information to provide an example of how to fill in the form. The name is also used frequently in popular culture, for example in the Frank Capra film Meet John Doe. John Doe was also` &&
+` the name of a 2002 American television series.`.
+ ENDMETHOD.
+
+ METHOD get_editor_type.
+
+ DATA(lv_types) = `abap, abc, actionscript, ada, apache_conf, applescript, asciidoc, assembly_x86, autohotkey, batchfile, bro, c9search, c_cpp, cirru, clojure, cobol, coffee, coldfusion, csharp, css, curly, d, dart, diff, django, dockerfile, ` &&
+`dot, drools, eiffel, yaml, ejs, elixir, elm, erlang, forth, fortran, ftl, gcode, gherkin, gitignore, glsl, gobstones, golang, groovy, haml, handlebars, haskell, haskell_cabal, haxe, hjson, html, html_elixir, html_ruby, ini, io, jack, jade, java, ja` &&
+`vascri` &&
+`pt, json, jsoniq, jsp, jsx, julia, kotlin, latex, lean, less, liquid, lisp, live_script, livescript, logiql, lsl, lua, luapage, lucene, makefile, markdown, mask, matlab, mavens_mate_log, maze, mel, mips_assembler, mipsassembler, mushcode, mysql, ni` &&
+`x, nsis, objectivec, ocaml, pascal, perl, pgsql, php, plain_text, powershell, praat, prolog, properties, protobuf, python, r, razor, rdoc, rhtml, rst, ruby, rust, sass, scad, scala, scheme, scss, sh, sjs, smarty, snippets, soy_template, space, sql,` &&
+` sqlserver, stylus, svg, swift, swig, tcl, tex, text, textile, toml, tsx, twig, typescript, vala, vbscript, velocity, verilog, vhdl, wollok, xml, xquery, terraform, slim, redshift, red, puppet, php_laravel_blade, mixal, jssm, fsharp, edifact,` &&
+` csp, cssound_score, cssound_orchestra, cssound_document`.
+ SPLIT lv_types AT ',' INTO TABLE DATA(lt_types).
+
+
+ r_result = VALUE #( FOR row IN lt_types ( name = shift_right( shift_left( row ) ) value = shift_right( shift_left( row ) ) ) ).
+
+ ENDMETHOD.
+
+
+ METHOD save_data.
+ "save data here
+ ENDMETHOD.
+
+ENDCLASS.
diff --git a/src/00/z2ui5_cl_app_demo_16.clas.xml b/src/00/z2ui5_cl_app_demo_16.clas.xml
new file mode 100644
index 00000000..734c765c
--- /dev/null
+++ b/src/00/z2ui5_cl_app_demo_16.clas.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ Z2UI5_CL_APP_DEMO_16
+ E
+ demo - charts a diagrams
+ 1
+ X
+ X
+ X
+
+
+
+
diff --git a/src/00/z2ui5_cl_app_demo_17.clas.abap b/src/00/z2ui5_cl_app_demo_17.clas.abap
new file mode 100644
index 00000000..11368fec
--- /dev/null
+++ b/src/00/z2ui5_cl_app_demo_17.clas.abap
@@ -0,0 +1,98 @@
+CLASS z2ui5_cl_app_demo_17 DEFINITION PUBLIC.
+
+ PUBLIC SECTION.
+
+ INTERFACES z2ui5_if_app.
+
+ DATA mv_type TYPE string.
+ DATA mv_path TYPE string.
+ DATA mv_editor TYPE string.
+ DATA mv_check_editable TYPE abap_bool.
+
+ PROTECTED SECTION.
+ PRIVATE SECTION.
+ENDCLASS.
+
+
+
+CLASS Z2UI5_CL_APP_DEMO_17 IMPLEMENTATION.
+
+
+ METHOD z2ui5_if_app~controller.
+
+ CASE client->get( )-lifecycle_method.
+
+ WHEN client->cs-lifecycle_method-on_init.
+ mv_path = '../../demo/text'.
+ mv_type = 'plain_text'.
+
+ WHEN client->cs-lifecycle_method-on_event.
+
+ CASE client->get( )-event.
+
+ WHEN 'DB_LOAD'.
+
+ mv_editor = COND #(
+ WHEN mv_path CS 'abap' THEN lcl_mime_api=>read_abap( )
+ WHEN mv_path CS 'json' THEN lcl_mime_api=>read_json( )
+ WHEN mv_path CS 'yaml' THEN lcl_mime_api=>read_yaml( )
+ WHEN mv_path CS 'text' THEN lcl_mime_api=>read_text( ) ).
+ client->popup_message_toast( 'Download successfull' ).
+
+ WHEN 'DB_SAVE'.
+ lcl_mime_api=>save_data( mv_editor ).
+ client->popup_message_box( text = 'Upload successfull. File saved!' type = 'success' ).
+
+ WHEN 'EDIT'.
+ mv_check_editable = xsdbool( mv_check_editable = abap_False ).
+ WHEN 'CLEAR'.
+ mv_editor = ``.
+ WHEN 'BACK'.
+ client->nav_app_leave( client->get( )-id_prev_app_stack ).
+
+ ENDCASE.
+
+ WHEN client->cs-lifecycle_method-on_rendering.
+
+ DATA(view) = client->factory_view( 'VIEW_INPUT' ).
+ DATA(page) = view->page( title = 'ABAP2UI5 - MIME Editor' navbuttontap = view->_event( 'BACK' ) ).
+ DATA(grid) = page->grid( 'L12 M12 S12' )->content( 'l' ).
+
+ grid->simple_form( 'File' )->content( 'f'
+ )->label( 'path'
+ )->input( view->_bind( mv_path )
+ )->label( 'Option'
+ )->input( value = view->_bind( mv_type ) suggestionitems = view->_bind_one_way( lcl_mime_api=>get_editor_type( ) )
+ )->get( )->suggestion_items( )->get(
+ )->list_item( text = '{NAME}' additionalText = '{VALUE}' )->get_parent( )->get_parent(
+ )->button( text = 'Download' press = view->_event( 'DB_LOAD' ) icon = 'sap-icon://download-from-cloud' ).
+
+ grid->simple_form( 'Editor' )->content( 'f'
+ )->code_editor(
+ type = mv_type
+ editable = mv_check_editable
+ value = view->_bind( mv_editor ) ).
+
+ page->footer( )->overflow_toolbar(
+ )->button(
+ text = 'Clear'
+ press = view->_event( 'CLEAR' )
+ icon = 'sap-icon://delete'
+ )->toolbar_spacer(
+ )->button(
+ text = 'Edit'
+ press = view->_event( 'EDIT' )
+ icon = 'sap-icon://edit'
+ )->button(
+ text = 'Upload'
+ press = view->_event( 'DB_SAVE' )
+ type = 'Emphasized'
+ icon = 'sap-icon://upload-to-cloud'
+ enabled = xsdbool( mv_editor IS NOT INITIAL ) ).
+
+ mv_editor = escape( val = mv_editor format = cl_abap_format=>e_json_string ).
+
+ ENDCASE.
+
+ ENDMETHOD.
+ENDCLASS.
diff --git a/src/00/z2ui5_cl_app_demo_17.clas.locals_imp.abap b/src/00/z2ui5_cl_app_demo_17.clas.locals_imp.abap
new file mode 100644
index 00000000..4faca2b9
--- /dev/null
+++ b/src/00/z2ui5_cl_app_demo_17.clas.locals_imp.abap
@@ -0,0 +1,193 @@
+CLASS lcl_mime_api DEFINITION FINAL.
+
+ PUBLIC SECTION.
+ CLASS-METHODS read_abap
+ RETURNING
+ VALUE(r_result) TYPE string.
+ CLASS-METHODS read_json
+ RETURNING
+ VALUE(r_result) TYPE string.
+ CLASS-METHODS read_js
+ RETURNING
+ VALUE(r_result) TYPE string.
+ CLASS-METHODS read_yaml
+ RETURNING
+ VALUE(r_result) TYPE string.
+ CLASS-METHODS read_text
+ RETURNING
+ VALUE(r_result) TYPE string.
+
+ TYPES:
+ BEGIN OF ty_S_suggest,
+ name TYPE string,
+ value TYPE string,
+ END OF ty_s_suggest.
+ TYPES ty_T_suggest TYPE STANDARD TABLE OF ty_s_suggest WITH EMPTY KEY.
+
+ CLASS-METHODS get_editor_type
+ RETURNING
+ VALUE(r_result) TYPE ty_t_suggest.
+ CLASS-METHODS save_data
+ IMPORTING
+ i_mv_editor TYPE string.
+
+
+ PROTECTED SECTION.
+
+ PRIVATE SECTION.
+
+ENDCLASS.
+
+CLASS lcl_mime_api IMPLEMENTATION.
+
+
+ METHOD read_abap.
+
+r_result = `METHOD SELECT_FILES.` && |\n| &&
+ |\n| &&
+ ` DATA: LV_RET_CODE TYPE I,` && |\n| &&
+ ` LV_USR_AXN TYPE I.` && |\n| &&
+ |\n| &&
+ ` CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG(` && |\n| &&
+ ` EXPORTING` && |\n| &&
+ ` WINDOW_TITLE = 'Select file'` && |\n| &&
+ ` MULTISELECTION = 'X'` && |\n| &&
+ ` CHANGING` && |\n| &&
+ ` FILE_TABLE = ME->PT_FILETAB` && |\n| &&
+ ` RC = LV_RET_CODE` && |\n| &&
+ ` USER_ACTION = LV_USR_AXN` && |\n| &&
+ ` EXCEPTIONS` && |\n| &&
+ ` FILE_OPEN_DIALOG_FAILED = 1` && |\n| &&
+ ` CNTL_ERROR = 2` && |\n| &&
+ ` ERROR_NO_GUI = 3` && |\n| &&
+ ` NOT_SUPPORTED_BY_GUI = 4` && |\n| &&
+ ` OTHERS = 5` && |\n| &&
+ ` ).` && |\n| &&
+ ` IF SY-SUBRC <> 0 OR` && |\n| &&
+ ` LV_USR_AXN = CL_GUI_FRONTEND_SERVICES=>ACTION_CANCEL.` && |\n| &&
+ ` RAISE EX_FILE_SEL_ERR.` && |\n| &&
+ ` ENDIF.` && |\n| &&
+ |\n| &&
+ ` ENDMETHOD. `.
+
+ ENDMETHOD.
+
+
+ METHOD read_json.
+
+ r_result = `{` && |\n| &&
+ ` "quiz": {` && |\n| &&
+ ` "sport": {` && |\n| &&
+ ` "q1": {` && |\n| &&
+ ` "test" : false,` && |\n| &&
+ ` "question": "Which one is correct team name in NBA?",` && |\n| &&
+ ` "options": [` && |\n| &&
+ ` "New York Bulls",` && |\n| &&
+ ` "Los Angeles Kings",` && |\n| &&
+ ` "Golden State Warriros",` && |\n| &&
+ ` "Huston Rocket"` && |\n| &&
+ ` ],` && |\n| &&
+ ` "answer": "Huston Rocket"` && |\n| &&
+ ` }` && |\n| &&
+ ` },` && |\n| &&
+ ` "maths": {` && |\n| &&
+ ` "q1": {` && |\n| &&
+ ` "question": "5 + 7 = ?",` && |\n| &&
+ ` "options": [` && |\n| &&
+ ` "10",` && |\n| &&
+ ` "11",` && |\n| &&
+ ` "12",` && |\n| &&
+ ` "13"` && |\n| &&
+ ` ],` && |\n| &&
+ ` "answer": "12"` && |\n| &&
+ ` },` && |\n| &&
+ ` "q2": {` && |\n| &&
+ ` "question": true,` && |\n| &&
+ ` "options": [` && |\n| &&
+ ` "1",` && |\n| &&
+ ` "2",` && |\n| &&
+ ` "3",` && |\n| &&
+ ` "4"` && |\n| &&
+ ` ],` && |\n| &&
+ ` "answer": 487829` && |\n| &&
+ ` }` && |\n| &&
+ ` }` && |\n| &&
+ ` }` && |\n| &&
+ `}`.
+
+ ENDMETHOD.
+
+
+ METHOD read_js.
+
+ r_result = `function showAlert() {` && |\n| &&
+ ` alert("Alert from JS file");` && |\n| &&
+ `}` && |\n| &&
+ |\n| &&
+ `function updateHeading() {` && |\n| &&
+ ` document.getElementById('heading').innerHTML = 'Heading changed with JS';` && |\n| &&
+ `}`.
+
+ ENDMETHOD.
+
+
+ METHOD read_yaml.
+
+ r_result = `# Employee records` && |\n| &&
+ `- martin:` && |\n| &&
+ ` name: Martin Developer` && |\n| &&
+ ` job: Developer` && |\n| &&
+ ` skills:` && |\n| &&
+ ` - python` && |\n| &&
+ ` - perl` && |\n| &&
+ ` - pascal` && |\n| &&
+ `- tabitha:` && |\n| &&
+ ` name: Tabitha Bitumen` && |\n| &&
+ ` job: Developer` && |\n| &&
+ ` skills:` && |\n| &&
+ ` - lisp` && |\n| &&
+ ` - fortran` && |\n| &&
+ ` - erlang`.
+
+ ENDMETHOD.
+
+
+ METHOD read_text.
+ r_result = `TXT test file` && |\n| &&
+ `Purpose: Provide example of this file type` && |\n| &&
+ `Document file type: TXT` && |\n| &&
+ `Version: 1.0` && |\n| &&
+ `Remark:` && |\n| &&
+ |\n| &&
+ `Example content:` && |\n| &&
+ `The names "John Doe" for males, "Jane Doe" or "Jane Roe" for females, or "Jonnie Doe" and "Janie Doe" for children, or just "Doe" non-gender-specifically are used as placeholder names for a party whose true identity is unknown or mus` &&
+`t be withheld in a legal action, case, or discussion. The names are also used to refer to acorpse or hospital patient whose identity is unknown. This practice is widely used in the United States and Canada, but is rarely used in other English-speak` &&
+`ing countries including the United Kingdom itself, from where the use of "John Doe" in a legal context originates. The names Joe Bloggs or John Smith are used in the UK instead, as well as in Australia and New Zealand.` && |\n| &&
+ |\n| &&
+ `John Doe is sometimes used to refer to a typical male in other contexts as well, in a similar manner to John Q. Public, known in Great Britain as Joe Public, John Smith or Joe Bloggs. For example, the first name listed on a form is o` &&
+`ften John Doe, along with a fictional address or other fictional information to provide an example of how to fill in the form. The name is also used frequently in popular culture, for example in the Frank Capra film Meet John Doe. John Doe was also` &&
+` the name of a 2002 American television series.`.
+ ENDMETHOD.
+
+ METHOD get_editor_type.
+
+ DATA(lv_types) = `abap, abc, actionscript, ada, apache_conf, applescript, asciidoc, assembly_x86, autohotkey, batchfile, bro, c9search, c_cpp, cirru, clojure, cobol, coffee, coldfusion, csharp, css, curly, d, dart, diff, django, dockerfile, ` &&
+`dot, drools, eiffel, yaml, ejs, elixir, elm, erlang, forth, fortran, ftl, gcode, gherkin, gitignore, glsl, gobstones, golang, groovy, haml, handlebars, haskell, haskell_cabal, haxe, hjson, html, html_elixir, html_ruby, ini, io, jack, jade, java, ja` &&
+`vascri` &&
+`pt, json, jsoniq, jsp, jsx, julia, kotlin, latex, lean, less, liquid, lisp, live_script, livescript, logiql, lsl, lua, luapage, lucene, makefile, markdown, mask, matlab, mavens_mate_log, maze, mel, mips_assembler, mipsassembler, mushcode, mysql, ni` &&
+`x, nsis, objectivec, ocaml, pascal, perl, pgsql, php, plain_text, powershell, praat, prolog, properties, protobuf, python, r, razor, rdoc, rhtml, rst, ruby, rust, sass, scad, scala, scheme, scss, sh, sjs, smarty, snippets, soy_template, space, sql,` &&
+` sqlserver, stylus, svg, swift, swig, tcl, tex, text, textile, toml, tsx, twig, typescript, vala, vbscript, velocity, verilog, vhdl, wollok, xml, xquery, terraform, slim, redshift, red, puppet, php_laravel_blade, mixal, jssm, fsharp, edifact,` &&
+` csp, cssound_score, cssound_orchestra, cssound_document`.
+ SPLIT lv_types AT ',' INTO TABLE DATA(lt_types).
+
+
+ r_result = VALUE #( FOR row IN lt_types ( name = shift_right( shift_left( row ) ) value = shift_right( shift_left( row ) ) ) ).
+
+ ENDMETHOD.
+
+
+ METHOD save_data.
+ "save data here
+ ENDMETHOD.
+
+ENDCLASS.
diff --git a/src/00/z2ui5_cl_app_demo_17.clas.xml b/src/00/z2ui5_cl_app_demo_17.clas.xml
new file mode 100644
index 00000000..264af0bf
--- /dev/null
+++ b/src/00/z2ui5_cl_app_demo_17.clas.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ Z2UI5_CL_APP_DEMO_17
+ E
+ demo - timeline
+ 1
+ X
+ X
+ X
+
+
+
+
diff --git a/src/00/z2ui5_cl_app_demo_18.clas.abap b/src/00/z2ui5_cl_app_demo_18.clas.abap
new file mode 100644
index 00000000..d99bd9ae
--- /dev/null
+++ b/src/00/z2ui5_cl_app_demo_18.clas.abap
@@ -0,0 +1,79 @@
+CLASS z2ui5_cl_app_demo_18 DEFINITION PUBLIC.
+
+ PUBLIC SECTION.
+
+ INTERFACES z2ui5_if_app.
+
+ DATA mv_path TYPE string.
+ DATA mv_value TYPE string.
+ PROTECTED SECTION.
+ PRIVATE SECTION.
+ENDCLASS.
+
+
+
+CLASS Z2UI5_CL_APP_DEMO_18 IMPLEMENTATION.
+
+
+ METHOD z2ui5_if_app~controller.
+
+ CASE client->get( )-lifecycle_method.
+
+ WHEN client->cs-lifecycle_method-on_init.
+* mv_path = '../../demo/text'.
+* mv_type = 'plain_text'.
+*
+ WHEN client->cs-lifecycle_method-on_event.
+*
+ CASE client->get( )-event.
+*
+* WHEN 'DB_LOAD'.
+*
+* mv_editor = COND #(
+* WHEN mv_path CS 'abap' THEN lcl_mime_api=>read_abap( )
+* WHEN mv_path CS 'json' THEN lcl_mime_api=>read_json( )
+* WHEN mv_path CS 'yaml' THEN lcl_mime_api=>read_yaml( )
+* WHEN mv_path CS 'text' THEN lcl_mime_api=>read_text( ) ).
+* client->display_message_toast( 'Download successfull').
+*
+* WHEN 'DB_SAVE'.
+* lcl_mime_api=>save_data( mv_editor ).
+* client->display_message_box( text = 'Upload successfull. File saved!' type = 'success' ).
+*
+* WHEN 'EDIT'.
+* mv_check_editable = xsdbool( mv_check_editable = abap_False ).
+* WHEN 'CLEAR'.
+* mv_editor = ``.
+
+ WHEN 'UPLOAD'.
+ DATA(lv_dummy) = ''.
+ WHEN 'BACK'.
+ client->nav_app_leave( client->get( )-id_prev_app_stack ).
+
+ ENDCASE.
+
+ WHEN client->cs-lifecycle_method-on_rendering.
+
+ DATA(view) = client->factory_view( 'VIEW_INPUT' ).
+ DATA(page) = view->page( title = 'abap2UI5 - Upload/Download Files' navbuttontap = view->_event( 'BACK' ) ).
+ " DATA(grid) = page->grid( 'L12 M12 S12' )->content( 'l' ).
+
+ page->zz_file_uploader(
+ value = view->_bind( mv_value )
+ path = view->_bind( mv_path )
+ placeholder = 'filepath here...'
+ upload = view->_event( 'UPLOAD' )
+ ).
+
+ IF mv_value IS NOT INITIAL.
+ page->zz_html( '' ).
+ CLEAR mv_value.
+ ENDIF.
+ RETURN.
+
+ " mv_editor = escape( val = mv_editor format = cl_abap_format=>e_json_string ).
+
+ ENDCASE.
+
+ ENDMETHOD.
+ENDCLASS.
diff --git a/src/00/z2ui5_cl_app_demo_18.clas.locals_imp.abap b/src/00/z2ui5_cl_app_demo_18.clas.locals_imp.abap
new file mode 100644
index 00000000..09992b29
--- /dev/null
+++ b/src/00/z2ui5_cl_app_demo_18.clas.locals_imp.abap
@@ -0,0 +1,194 @@
+CLASS lcl_mime_api DEFINITION FINAL.
+
+ PUBLIC SECTION.
+ CLASS-METHODS read_abap
+ RETURNING
+ VALUE(r_result) TYPE string.
+ CLASS-METHODS read_json
+ RETURNING
+ VALUE(r_result) TYPE string.
+ CLASS-METHODS read_js
+ RETURNING
+ VALUE(r_result) TYPE string.
+ CLASS-METHODS read_yaml
+ RETURNING
+ VALUE(r_result) TYPE string.
+ CLASS-METHODS read_text
+ RETURNING
+ VALUE(r_result) TYPE string.
+
+ TYPES:
+ BEGIN OF ty_S_suggest,
+ name TYPE string,
+ value TYPE string,
+ END OF ty_s_suggest.
+ TYPES ty_T_suggest TYPE STANDARD TABLE OF ty_s_suggest WITH EMPTY KEY.
+
+ CLASS-METHODS get_editor_type
+ RETURNING
+ VALUE(r_result) TYPE ty_t_suggest.
+
+ CLASS-METHODS save_data
+ IMPORTING
+ i_mv_editor TYPE string.
+
+
+ PROTECTED SECTION.
+
+ PRIVATE SECTION.
+
+ENDCLASS.
+
+CLASS lcl_mime_api IMPLEMENTATION.
+
+
+ METHOD read_abap.
+
+r_result = `METHOD SELECT_FILES.` && |\n| &&
+ |\n| &&
+ ` DATA: LV_RET_CODE TYPE I,` && |\n| &&
+ ` LV_USR_AXN TYPE I.` && |\n| &&
+ |\n| &&
+ ` CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG(` && |\n| &&
+ ` EXPORTING` && |\n| &&
+ ` WINDOW_TITLE = 'Select file'` && |\n| &&
+ ` MULTISELECTION = 'X'` && |\n| &&
+ ` CHANGING` && |\n| &&
+ ` FILE_TABLE = ME->PT_FILETAB` && |\n| &&
+ ` RC = LV_RET_CODE` && |\n| &&
+ ` USER_ACTION = LV_USR_AXN` && |\n| &&
+ ` EXCEPTIONS` && |\n| &&
+ ` FILE_OPEN_DIALOG_FAILED = 1` && |\n| &&
+ ` CNTL_ERROR = 2` && |\n| &&
+ ` ERROR_NO_GUI = 3` && |\n| &&
+ ` NOT_SUPPORTED_BY_GUI = 4` && |\n| &&
+ ` OTHERS = 5` && |\n| &&
+ ` ).` && |\n| &&
+ ` IF SY-SUBRC <> 0 OR` && |\n| &&
+ ` LV_USR_AXN = CL_GUI_FRONTEND_SERVICES=>ACTION_CANCEL.` && |\n| &&
+ ` RAISE EX_FILE_SEL_ERR.` && |\n| &&
+ ` ENDIF.` && |\n| &&
+ |\n| &&
+ ` ENDMETHOD. `.
+
+ ENDMETHOD.
+
+
+ METHOD read_json.
+
+ r_result = `{` && |\n| &&
+ ` "quiz": {` && |\n| &&
+ ` "sport": {` && |\n| &&
+ ` "q1": {` && |\n| &&
+ ` "test" : false,` && |\n| &&
+ ` "question": "Which one is correct team name in NBA?",` && |\n| &&
+ ` "options": [` && |\n| &&
+ ` "New York Bulls",` && |\n| &&
+ ` "Los Angeles Kings",` && |\n| &&
+ ` "Golden State Warriros",` && |\n| &&
+ ` "Huston Rocket"` && |\n| &&
+ ` ],` && |\n| &&
+ ` "answer": "Huston Rocket"` && |\n| &&
+ ` }` && |\n| &&
+ ` },` && |\n| &&
+ ` "maths": {` && |\n| &&
+ ` "q1": {` && |\n| &&
+ ` "question": "5 + 7 = ?",` && |\n| &&
+ ` "options": [` && |\n| &&
+ ` "10",` && |\n| &&
+ ` "11",` && |\n| &&
+ ` "12",` && |\n| &&
+ ` "13"` && |\n| &&
+ ` ],` && |\n| &&
+ ` "answer": "12"` && |\n| &&
+ ` },` && |\n| &&
+ ` "q2": {` && |\n| &&
+ ` "question": true,` && |\n| &&
+ ` "options": [` && |\n| &&
+ ` "1",` && |\n| &&
+ ` "2",` && |\n| &&
+ ` "3",` && |\n| &&
+ ` "4"` && |\n| &&
+ ` ],` && |\n| &&
+ ` "answer": 487829` && |\n| &&
+ ` }` && |\n| &&
+ ` }` && |\n| &&
+ ` }` && |\n| &&
+ `}`.
+
+ ENDMETHOD.
+
+
+ METHOD read_js.
+
+ r_result = `function showAlert() {` && |\n| &&
+ ` alert("Alert from JS file");` && |\n| &&
+ `}` && |\n| &&
+ |\n| &&
+ `function updateHeading() {` && |\n| &&
+ ` document.getElementById('heading').innerHTML = 'Heading changed with JS';` && |\n| &&
+ `}`.
+
+ ENDMETHOD.
+
+
+ METHOD read_yaml.
+
+ r_result = `# Employee records` && |\n| &&
+ `- martin:` && |\n| &&
+ ` name: Martin Developer` && |\n| &&
+ ` job: Developer` && |\n| &&
+ ` skills:` && |\n| &&
+ ` - python` && |\n| &&
+ ` - perl` && |\n| &&
+ ` - pascal` && |\n| &&
+ `- tabitha:` && |\n| &&
+ ` name: Tabitha Bitumen` && |\n| &&
+ ` job: Developer` && |\n| &&
+ ` skills:` && |\n| &&
+ ` - lisp` && |\n| &&
+ ` - fortran` && |\n| &&
+ ` - erlang`.
+
+ ENDMETHOD.
+
+
+ METHOD read_text.
+ r_result = `TXT test file` && |\n| &&
+ `Purpose: Provide example of this file type` && |\n| &&
+ `Document file type: TXT` && |\n| &&
+ `Version: 1.0` && |\n| &&
+ `Remark:` && |\n| &&
+ |\n| &&
+ `Example content:` && |\n| &&
+ `The names "John Doe" for males, "Jane Doe" or "Jane Roe" for females, or "Jonnie Doe" and "Janie Doe" for children, or just "Doe" non-gender-specifically are used as placeholder names for a party whose true identity is unknown or mus` &&
+`t be withheld in a legal action, case, or discussion. The names are also used to refer to acorpse or hospital patient whose identity is unknown. This practice is widely used in the United States and Canada, but is rarely used in other English-speak` &&
+`ing countries including the United Kingdom itself, from where the use of "John Doe" in a legal context originates. The names Joe Bloggs or John Smith are used in the UK instead, as well as in Australia and New Zealand.` && |\n| &&
+ |\n| &&
+ `John Doe is sometimes used to refer to a typical male in other contexts as well, in a similar manner to John Q. Public, known in Great Britain as Joe Public, John Smith or Joe Bloggs. For example, the first name listed on a form is o` &&
+`ften John Doe, along with a fictional address or other fictional information to provide an example of how to fill in the form. The name is also used frequently in popular culture, for example in the Frank Capra film Meet John Doe. John Doe was also` &&
+` the name of a 2002 American television series.`.
+ ENDMETHOD.
+
+ METHOD get_editor_type.
+
+ DATA(lv_types) = `abap, abc, actionscript, ada, apache_conf, applescript, asciidoc, assembly_x86, autohotkey, batchfile, bro, c9search, c_cpp, cirru, clojure, cobol, coffee, coldfusion, csharp, css, curly, d, dart, diff, django, dockerfile, ` &&
+`dot, drools, eiffel, yaml, ejs, elixir, elm, erlang, forth, fortran, ftl, gcode, gherkin, gitignore, glsl, gobstones, golang, groovy, haml, handlebars, haskell, haskell_cabal, haxe, hjson, html, html_elixir, html_ruby, ini, io, jack, jade, java, ja` &&
+`vascri` &&
+`pt, json, jsoniq, jsp, jsx, julia, kotlin, latex, lean, less, liquid, lisp, live_script, livescript, logiql, lsl, lua, luapage, lucene, makefile, markdown, mask, matlab, mavens_mate_log, maze, mel, mips_assembler, mipsassembler, mushcode, mysql, ni` &&
+`x, nsis, objectivec, ocaml, pascal, perl, pgsql, php, plain_text, powershell, praat, prolog, properties, protobuf, python, r, razor, rdoc, rhtml, rst, ruby, rust, sass, scad, scala, scheme, scss, sh, sjs, smarty, snippets, soy_template, space, sql,` &&
+` sqlserver, stylus, svg, swift, swig, tcl, tex, text, textile, toml, tsx, twig, typescript, vala, vbscript, velocity, verilog, vhdl, wollok, xml, xquery, terraform, slim, redshift, red, puppet, php_laravel_blade, mixal, jssm, fsharp, edifact,` &&
+` csp, cssound_score, cssound_orchestra, cssound_document`.
+ SPLIT lv_types AT ',' INTO TABLE DATA(lt_types).
+
+
+ r_result = VALUE #( FOR row IN lt_types ( name = shift_right( shift_left( row ) ) value = shift_right( shift_left( row ) ) ) ).
+
+ ENDMETHOD.
+
+
+ METHOD save_data.
+ "save data here
+ ENDMETHOD.
+
+ENDCLASS.
diff --git a/src/00/z2ui5_cl_app_demo_18.clas.xml b/src/00/z2ui5_cl_app_demo_18.clas.xml
new file mode 100644
index 00000000..69cadcd2
--- /dev/null
+++ b/src/00/z2ui5_cl_app_demo_18.clas.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ Z2UI5_CL_APP_DEMO_18
+ E
+ demo - xxx up/do
+ 1
+ X
+ X
+ X
+
+
+
+
diff --git a/src/00/z2ui5_cl_app_demo_19.clas.abap b/src/00/z2ui5_cl_app_demo_19.clas.abap
new file mode 100644
index 00000000..20cc2fa2
--- /dev/null
+++ b/src/00/z2ui5_cl_app_demo_19.clas.abap
@@ -0,0 +1,108 @@
+CLASS z2ui5_cl_app_demo_19 DEFINITION PUBLIC.
+
+ PUBLIC SECTION.
+
+ INTERFACES z2ui5_if_app.
+
+ TYPES:
+ BEGIN OF ty_row,
+ selkz TYPE abap_bool,
+ title TYPE string,
+ value TYPE string,
+ descr TYPE string,
+ END OF ty_row.
+
+ DATA t_tab TYPE STANDARD TABLE OF ty_row WITH EMPTY KEY.
+ DATA t_tab_sel TYPE STANDARD TABLE OF ty_row WITH EMPTY KEY.
+ DATA mv_sel_mode TYPE string.
+
+ PROTECTED SECTION.
+ PRIVATE SECTION.
+ENDCLASS.
+
+
+
+CLASS Z2UI5_CL_APP_DEMO_19 IMPLEMENTATION.
+
+
+ METHOD z2ui5_if_app~controller.
+
+ CASE client->get( )-lifecycle_method.
+
+ WHEN client->cs-lifecycle_method-on_init.
+ mv_sel_mode = 'None'.
+ t_tab = VALUE #( descr = 'this is a description'
+ ( title = 'title_01' value = 'value_01' )
+ ( title = 'title_02' value = 'value_02' )
+ ( title = 'title_03' value = 'value_03' )
+ ( title = 'title_04' value = 'value_04' )
+ ( title = 'title_05' value = 'value_05' ) ).
+
+ WHEN client->cs-lifecycle_method-on_event.
+
+ CASE client->get( )-event.
+ WHEN 'BUTTON_SEGMENT_CHANGE'.
+ client->popup_message_toast( `Selection Mode changed` ).
+
+ WHEN 'BUTTON_READ_SEL'.
+ t_tab_sel = t_tab.
+ DELETE t_tab_sel WHERE selkz <> abap_true.
+
+ WHEN 'BACK'.
+ client->nav_app_leave( client->get( )-id_prev_app_stack ).
+
+ ENDCASE.
+
+ WHEN client->cs-lifecycle_method-on_rendering.
+
+ DATA(view) = client->factory_view( ).
+ DATA(page) = view->page( title = 'abap2ui5 - Table with different Selection-Modes' navbuttontap = view->_event( 'BACK' ) ).
+
+ page->header_content( )->link( text = 'Go to Source Code' href = client->get( )-s_request-url_source_code ).
+
+ page->segmented_button(
+ selected_key = view->_bind( mv_sel_mode )
+ selection_change = view->_event( 'BUTTON_SEGMENT_CHANGE' )
+ )->get( )->items( )->get(
+ )->segmented_button_item( key = 'None' text = 'None'
+ )->segmented_button_item( key = 'SingleSelect' text = 'SingleSelect'
+ )->segmented_button_item( key = 'SingleSelectLeft' text = 'SingleSelectLeft'
+ )->segmented_button_item( key = 'SingleSelectMaster' text = 'SingleSelectMaster'
+ )->segmented_button_item( key = 'MultiSelect' text = 'MultiSelect' ).
+
+ DATA(tab) = page->table(
+ headertext = 'Table'
+ mode = mv_sel_mode
+ items = view->_bind( t_tab ) ).
+
+ tab->columns(
+ )->column( )->text( 'Title' )->get_parent(
+ )->column( )->text( 'Value' )->get_parent(
+ )->column( )->text( 'Description' ).
+
+ tab->items( )->column_list_item( selected = '{SELKZ}' )->cells(
+ )->text( '{TITLE}'
+ )->text( '{VALUE}'
+ )->text( '{DESCR}' ).
+
+ DATA(tab2) = page->table( view->_bind_one_way( t_tab_sel ) ).
+
+ tab2->header_toolbar( )->overflow_toolbar(
+ )->title( 'Selected Entries'
+ )->button( icon = 'sap-icon://pull-down' text = 'copy selected entries' press = view->_event( 'BUTTON_READ_SEL' )
+ ).
+
+ tab2->columns(
+ )->column( )->text( 'Title' )->get_parent(
+ )->column( )->text( 'Value' )->get_parent(
+ )->column( )->text( 'Description' ).
+
+ tab2->items( )->column_list_item( )->cells(
+ )->text( '{TITLE}'
+ )->text( '{VALUE}'
+ )->text( '{DESCR}' ).
+
+ ENDCASE.
+
+ ENDMETHOD.
+ENDCLASS.
diff --git a/src/00/z2ui5_cl_app_demo_19.clas.xml b/src/00/z2ui5_cl_app_demo_19.clas.xml
new file mode 100644
index 00000000..313cc61c
--- /dev/null
+++ b/src/00/z2ui5_cl_app_demo_19.clas.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ Z2UI5_CL_APP_DEMO_19
+ E
+ tab - selection modes
+ 1
+ X
+ X
+ X
+
+
+
+
diff --git a/src/00/z2ui5_cl_app_demo_20.clas.abap b/src/00/z2ui5_cl_app_demo_20.clas.abap
new file mode 100644
index 00000000..f297a42f
--- /dev/null
+++ b/src/00/z2ui5_cl_app_demo_20.clas.abap
@@ -0,0 +1,87 @@
+CLASS z2ui5_cl_app_demo_20 DEFINITION PUBLIC.
+
+ PUBLIC SECTION.
+
+ INTERFACES z2ui5_if_app.
+ CLASS-METHODS factory
+ IMPORTING
+ i_text TYPE string
+ i_cancel_text TYPE string
+ i_cancel_event TYPE string
+ i_confirm_text TYPE string
+ i_confirm_event TYPE string
+ i_check_show_previous_view type abap_bool optional
+ RETURNING
+ VALUE(r_result) TYPE REF TO z2ui5_cl_app_demo_20.
+
+ DATA mv_text TYPE string.
+ DATA mv_cancel_text TYPE string.
+ DATA mv_cancel_event TYPE string.
+ DATA mv_confirm_text TYPE string.
+ DATA mv_confirm_event TYPE string.
+
+ data mv_check_show_previous_view type abap_bool.
+
+ PROTECTED SECTION.
+ PRIVATE SECTION.
+ENDCLASS.
+
+
+
+CLASS z2ui5_cl_app_demo_20 IMPLEMENTATION.
+
+ METHOD factory.
+
+ r_result = NEW #( ).
+
+ r_result->mv_text = i_text.
+ r_result->mv_cancel_text = i_cancel_text.
+ r_result->mv_cancel_event = i_cancel_event.
+ r_result->mv_confirm_text = i_confirm_text.
+ r_result->mv_confirm_event = i_confirm_event.
+ r_result->mv_check_show_previous_view = i_check_show_previous_view.
+
+ ENDMETHOD.
+
+
+ METHOD z2ui5_if_app~controller.
+
+ CASE client->get( )-lifecycle_method.
+
+ WHEN client->cs-lifecycle_method-on_init.
+ if mv_check_show_previous_view = abap_true.
+ client->set( set_prev_view = abap_true ).
+ endif.
+ client->view_popup( 'POPUP_DECIDE' ).
+
+ WHEN client->cs-lifecycle_method-on_event.
+
+ CASE client->get( )-event.
+
+ WHEN mv_cancel_event OR mv_confirm_event.
+ client->set( event = client->get( )-event ).
+ client->nav_app_leave( client->get( )-id_prev_app_stack ).
+
+ ENDCASE.
+
+ WHEN client->cs-lifecycle_method-on_rendering.
+
+ DATA(view) = client->factory_view( 'POPUP_DECIDE' ).
+
+ DATA(page) = view->dialog( title = 'Example - ZZ2UI5_CL_APP_DEMO_07' ).
+
+ page->text( text = mv_text ).
+ page->button( text = mv_cancel_text press = view->_event( mv_cancel_event ) ).
+ page->button( text = mv_confirm_text press = view->_event( mv_confirm_event ) ).
+
+
+ page->footer( )->overflow_toolbar(
+ )->toolbar_spacer(
+ )->button(
+ text = 'Send to Server'
+ press = view->_event( 'BUTTON_SEND' )
+ type = 'Success' ).
+ ENDCASE.
+
+ ENDMETHOD.
+ENDCLASS.
diff --git a/src/00/z2ui5_cl_app_demo_20.clas.xml b/src/00/z2ui5_cl_app_demo_20.clas.xml
new file mode 100644
index 00000000..07b0856c
--- /dev/null
+++ b/src/00/z2ui5_cl_app_demo_20.clas.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ Z2UI5_CL_APP_DEMO_20
+ E
+ POPUP - decide
+ 1
+ X
+ X
+ X
+
+
+
+
diff --git a/src/00/z2ui5_cl_app_demo_21.clas.abap b/src/00/z2ui5_cl_app_demo_21.clas.abap
new file mode 100644
index 00000000..afb8f241
--- /dev/null
+++ b/src/00/z2ui5_cl_app_demo_21.clas.abap
@@ -0,0 +1,243 @@
+CLASS z2ui5_cl_app_demo_21 DEFINITION PUBLIC.
+
+ PUBLIC SECTION.
+
+ INTERFACES z2ui5_if_app.
+
+
+ TYPES:
+ BEGIN OF ty_row,
+ title TYPE string,
+ value TYPE string,
+ descr TYPE string,
+ icon TYPE string,
+ info TYPE string,
+ checkbox TYPE abap_bool,
+ END OF ty_row.
+
+ DATA t_tab TYPE STANDARD TABLE OF ty_row WITH EMPTY KEY.
+
+ DATA mv_value TYPE string VALUE 'value'.
+
+ PROTECTED SECTION.
+ PRIVATE SECTION.
+ENDCLASS.
+
+
+
+CLASS Z2UI5_CL_APP_DEMO_21 IMPLEMENTATION.
+
+
+ METHOD z2ui5_if_app~controller.
+
+ CASE client->get( )-lifecycle_method.
+
+ WHEN client->cs-lifecycle_method-on_init.
+ t_tab = REDUCE #( INIT ret = VALUE #( ) FOR n = 1 WHILE n < 11 NEXT ret =
+ VALUE #( BASE ret ( title = 'Hans' value = 'red' info = 'completed' descr = 'this is a description' checkbox = abap_true ) ) ).
+
+
+
+ WHEN client->cs-lifecycle_method-on_event.
+
+ CASE client->get( )-event.
+
+ WHEN 'BUTTON_POPUP_DECIDE'.
+
+ client->nav_app_call( z2ui5_cl_app_demo_20=>factory(
+ i_text = 'Do really want to continue?'
+ i_cancel_text = 'No'
+ i_cancel_event = 'POPUP_CONFIRM_NO'
+ i_confirm_text = 'Yes'
+ i_confirm_event = 'POPUP_CONFIRM_YES' )
+ ).
+
+ WHEN 'BUTTON_POPUP_SELECT'.
+ DATA(lo_popup_select) = z2ui5_cl_app_demo_23=>factory(
+ event_callback = 'POPUP_SELECT_RETURN'
+ i_tab = VALUE #( descr = 'this is a description'
+ ( title = 'title_01' value = 'value_01' )
+ ( title = 'title_02' value = 'value_02' )
+ ( title = 'title_03' value = 'value_03' )
+ ( title = 'title_04' value = 'value_04' ) ) ).
+ client->nav_app_call( lo_popup_select ).
+
+ WHEN 'POPUP_SELECT_RETURN'.
+ lo_popup_select = CAST z2ui5_cl_app_demo_23( client->get_app_by_id( client->get( )-id_prev_app ) ).
+ DELETE lo_popup_select->t_tab WHERE selkz <> abap_true.
+ client->popup_message_box( 'Entry selected: ' && lo_popup_select->t_tab[ 1 ]-title ).
+
+ WHEN 'POPUP_CONFIRM_YES'.
+ client->popup_message_box( 'decide yes' ).
+
+ WHEN 'POPUP_CONFIRM_NO'.
+ client->popup_message_box( 'decide no' ).
+
+ WHEN 'F4HELP'.
+ client->popup_message_box( 'F4HELP' ).
+
+ WHEN 'BUTTON_POPUP_01'.
+ client->view_popup( 'BAL_POPUP' ).
+
+ WHEN 'BUTTON_POPUP_02'.
+ client->view_show( 'MAIN' ).
+ client->view_popup( 'BAL_POPUP' ).
+
+ WHEN 'BUTTON_POPUP_03'.
+ client->view_show( 'MAIN' ).
+ client->view_popup( 'BAL_POPUP2' ).
+
+ WHEN 'BUTTON_POPUP_04'.
+ client->set( set_prev_view = abap_true ).
+ client->view_popup( 'BAL_POPUP2' ).
+
+ WHEN 'BUTTON_POPUP_05'.
+ client->nav_app_call( z2ui5_cl_app_demo_20=>factory(
+
+ i_text = 'Do really want to continue?'
+ i_cancel_text = 'No'
+ i_cancel_event = 'POPUP_CONFIRM_NO'
+ i_confirm_text = 'Yes'
+ i_confirm_event = 'POPUP_CONFIRM_YES' )
+ ).
+
+ WHEN 'BUTTON_POPUP_06'.
+ " client->set( set_prev_view = abap_true ).
+ client->view_popup( 'POPUP_TABLE' ).
+
+ WHEN 'POPUP_TABLE_SEND'.
+ client->popup_message_box( 'entries edited' ).
+
+ WHEN 'BACK'.
+ client->nav_app_leave( client->get( )-id_prev_app_stack ).
+
+ ENDCASE.
+
+
+ WHEN client->cs-lifecycle_method-on_rendering.
+
+ DATA(view) = client->factory_view( 'MAIN' ).
+ DATA(page) = view->page( title = 'Example - ZZ2UI5_CL_APP_DEMO_07' navbuttontap = view->_event( 'BACK' ) ).
+
+
+ page->input(
+ value = view->_bind( mv_value )
+ showvaluehelp = abap_true
+ valuehelprequest = view->_event( 'F4HELP' )
+ ).
+
+ page->button(
+ text = 'Popup new app - popup renderung, no view'
+ press = view->_event( 'BUTTON_POPUP_DECIDE' )
+ ).
+
+ page->button(
+ text = 'Popup same app - popup rendering, no view rendering'
+ press = view->_event( 'BUTTON_POPUP_01' )
+ ).
+
+ page->button(
+ text = 'Popup same app - popup rendering, view rendering'
+ press = view->_event( 'BUTTON_POPUP_02' )
+ ).
+
+ page->button(
+ text = 'Popup same app - popup rendering, view rendering - frontend close'
+ press = view->_event( 'BUTTON_POPUP_03' )
+ ).
+
+ page->button(
+ text = 'Popup same app - popup rendering, view previous'
+ press = view->_event( 'BUTTON_POPUP_04' )
+ ).
+
+
+ page->button(
+ text = 'Popup next app - popup rendering, view previous'
+ press = view->_event( 'BUTTON_POPUP_05' )
+ ).
+
+ page->button(
+ text = 'Popup select'
+ press = view->_event( 'BUTTON_POPUP_06' )
+ ).
+
+
+ " client->set( focus = mv_value ).
+
+ page->footer( )->overflow_toolbar(
+ )->toolbar_spacer(
+ )->button(
+ text = 'Send to Server'
+ press = view->_event( 'BUTTON_SEND' )
+ type = 'Success' ).
+
+
+ view = client->factory_view( 'BAL_POPUP' ).
+
+ DATA(popup) = view->dialog( title = 'Example - ZZ2UI5_CL_APP_DEMO_07' ).
+
+ popup->text( text = 'this is a message' ).
+ popup->button( text = 'YES' press = view->_event( 'POPUP_CONFIRM_YES' ) ).
+ popup->button( text = 'NO' press = view->_event( 'POPUP_CONFIRM_NO' ) ).
+
+ popup->footer( )->overflow_toolbar(
+ )->toolbar_spacer(
+ )->button(
+ text = 'Send to Server'
+ press = view->_event( 'BUTTON_SEND' )
+ type = 'Success' ).
+
+ view = client->factory_view( 'BAL_POPUP2' ).
+
+ popup = view->dialog( title = 'Example - ZZ2UI5_CL_APP_DEMO_07' ).
+
+ popup->text( text = 'this popup frontend close' ).
+ popup->button( text = 'YES' press = view->_event( 'POPUP_CONFIRM_YES' ) ).
+ popup->button( text = 'NO' press = view->_event( 'POPUP_CONFIRM_NO' ) ).
+
+ popup->footer( )->overflow_toolbar(
+ )->toolbar_spacer(
+ )->button(
+ text = 'frontend close'
+ press = view->_event_close_popup( )
+ type = 'Success' ).
+
+
+
+
+ view = client->factory_view( 'POPUP_TABLE' ).
+
+ popup = view->dialog( title = 'Example - ZZ2UI5_CL_APP_DEMO_07' ).
+
+ DATA(tab) = popup->table( view->_bind( t_tab ) ).
+
+ "set toolbar
+ tab->header_toolbar( )->overflow_toolbar(
+ )->title( 'title of the table' ).
+
+ "set header
+ tab->columns(
+ )->column( )->text( 'Title' )->get_parent(
+ )->column( )->text( 'Color' )->get_parent(
+ )->column( )->text( 'Info' )->get_parent(
+ )->column( )->text( 'Description' )->get_parent(
+ )->column( )->text( 'Checkbox' ).
+
+ tab->items( )->column_list_item( )->cells(
+ )->input( '{TITLE}'
+ )->input( '{VALUE}'
+ )->input( '{INFO}'
+ )->input( '{DESCR}'
+ )->checkbox( selected = '{CHECKBOX}' enabled = abap_true ).
+
+ popup->footer( )->overflow_toolbar(
+ )->toolbar_spacer(
+ )->button(
+ text = 'Commit'
+ press = view->_event( 'POPUP_TABLE_SEND' )
+ type = 'Success' ).
+ ENDCASE.
+
+ ENDMETHOD.
+ENDCLASS.
diff --git a/src/00/z2ui5_cl_app_demo_21.clas.xml b/src/00/z2ui5_cl_app_demo_21.clas.xml
new file mode 100644
index 00000000..674ed11f
--- /dev/null
+++ b/src/00/z2ui5_cl_app_demo_21.clas.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ Z2UI5_CL_APP_DEMO_21
+ E
+ basic - popups
+ 1
+ X
+ X
+ X
+
+
+
+
diff --git a/src/00/z2ui5_cl_app_demo_22.clas.abap b/src/00/z2ui5_cl_app_demo_22.clas.abap
new file mode 100644
index 00000000..1cc5c473
--- /dev/null
+++ b/src/00/z2ui5_cl_app_demo_22.clas.abap
@@ -0,0 +1,143 @@
+CLASS z2ui5_cl_app_demo_22 DEFINITION PUBLIC.
+
+ PUBLIC SECTION.
+
+ INTERFACES z2ui5_if_app.
+
+ TYPES:
+ BEGIN OF ty_row,
+ title TYPE string,
+ value TYPE string,
+ descr TYPE string,
+ info TYPE string,
+ END OF ty_row.
+ DATA t_tab TYPE STANDARD TABLE OF ty_row WITH EMPTY KEY.
+
+ DATA mv_value1 TYPE string.
+ DATA mv_value2 TYPE string.
+ DATA mv_value3 TYPE string.
+
+ PROTECTED SECTION.
+ PRIVATE SECTION.
+
+ENDCLASS.
+
+
+
+CLASS z2ui5_cl_app_demo_22 IMPLEMENTATION.
+
+
+ METHOD z2ui5_if_app~controller.
+
+ CASE client->get( )-lifecycle_method.
+
+ WHEN client->cs-lifecycle_method-on_init.
+
+ mv_value1 = 'value1'.
+ mv_value2 = 'this is a long text this is a long text this is a long text tis is a long text.'.
+ DO 4 TIMES.
+ mv_value2 = mv_value2 && mv_value2.
+ ENDDO.
+ mv_value3 = mv_value2.
+
+ DATA(ls_row) = VALUE ty_row( title = 'Hans' value = 'red' info = 'completed' descr = 'this is a description' ).
+ DO 100 TIMES.
+ INSERT ls_row INTO TABLE t_tab.
+ ENDDO.
+
+
+ WHEN client->cs-lifecycle_method-on_event.
+
+ CASE client->get( )-event.
+
+ WHEN 'BUTTON_SCROLL_TOP'.
+ "nothing to do, default mode
+
+ WHEN 'BUTTON_SCROLL_BOTTOM'.
+ client->set( t_scroll_pos = VALUE #( ( n = 'id_page' v = '99999' ) ) ).
+
+ " WHEN 'BUTTON_SCROLL_UP'.
+ " DATA(lv_pos) = client->get( )-page_scroll_pos - 500.
+ " client->set( page_scroll_pos = COND #( WHEN lv_pos < 0 THEN 0 ELSE lv_pos ) ).
+
+ " WHEN 'BUTTON_SCROLL_DOWN'.
+ " client->set( page_scroll_pos = client->get( )-page_scroll_pos + 500 ).
+
+ " WHEN 'BUTTON_SCROLL_HOLD'.
+ " client->set( page_scroll_pos = client->get( )-page_scroll_pos ).
+
+ WHEN 'BUTTON_FOCUS_FIRST'.
+ client->set( s_cursor_pos = VALUE #( id = 'id_text1' cursorpos = '5' selectionstart = '5' selectionend = '5' ) ).
+
+ WHEN 'BUTTON_FOCUS_SECOND'.
+ client->set( s_cursor_pos = VALUE #( id = 'id_text2' cursorpos = '5' selectionstart = '5' selectionend = '10' ) ).
+
+ WHEN 'BUTTON_FOCUS_END'.
+ client->set( s_cursor_pos = VALUE #( id = 'id_text3' cursorpos = '99999' selectionstart = '99999' selectionend = '999999' ) ).
+ client->set( t_scroll_pos = VALUE #(
+ ( n = 'id_page' v = '99999' )
+ ( n = 'id_text3' v = '99999' )
+ ) ).
+
+
+ WHEN 'BACK'.
+ client->nav_app_leave( client->get( )-id_prev_app_stack ).
+
+ ENDCASE.
+
+
+ WHEN client->cs-lifecycle_method-on_rendering.
+
+ DATA(view) = client->factory_view( ).
+ DATA(page) = view->page( id = 'id_page' title = 'abap2ui5 - Scrolling and Focus' navbuttontap = view->_event( 'BACK' ) ).
+
+ page->header_content( )->link( text = 'Go to Source Code' href = client->get( )-s_request-url_source_code ).
+
+
+ page->input(
+ id = 'id_text1'
+ value = view->_bind( mv_value1 )
+ ).
+ page->text_area(
+ width = '100%'
+ height = '10%'
+ id = 'id_text2'
+ value = view->_bind( mv_value2 ) ).
+
+ page->button( text = 'focus input pos 3' press = view->_event( 'BUTTON_FOCUS_FIRST' ) ).
+ page->button( text = 'focus text area pos 20' press = view->_event( 'BUTTON_FOCUS_SECOND' ) ).
+ page->button( text = 'scroll end + focus end' press = view->_event( 'BUTTON_FOCUS_END' ) ).
+
+ DATA(tab) = page->table( sticky = 'ColumnHeaders,HeaderToolbar' headertext = 'Table with some entries' items = view->_bind_one_way( t_tab ) ).
+
+ tab->columns(
+ )->column( )->text( 'Title' )->get_parent(
+ )->column( )->text( 'Color' )->get_parent(
+ )->column( )->text( 'Info' )->get_parent(
+ )->column( )->text( 'Description' ).
+
+ tab->items( )->column_list_item( )->cells(
+ )->text( '{TITLE}'
+ )->text( '{VALUE}'
+ )->text( '{INFO}'
+ )->text( '{DESCR}' ).
+
+ page->text_area(
+ id = 'id_text3'
+ width = '100%'
+ height = '10%'
+ value = view->_bind( mv_value3 ) ).
+
+ page->footer( )->overflow_toolbar(
+ )->button( text = 'Scroll Top' press = view->_event( 'BUTTON_SCROLL_TOP' )
+ " )->button( text = 'Scroll 500 up' press = view->_event( 'BUTTON_SCROLL_UP' )
+ " )->button( text = 'Scroll 500 down' press = view->_event( 'BUTTON_SCROLL_DOWN' )
+ )->button( text = 'Scroll Bottom' press = view->_event( 'BUTTON_SCROLL_BOTTOM' )
+ " )->toolbar_spacer(
+ " )->button( text = 'Server Event and hold position' press = view->_event( 'BUTTON_SCROLL_HOLD' )
+ ).
+
+ ENDCASE.
+
+ ENDMETHOD.
+ENDCLASS.
diff --git a/src/00/z2ui5_cl_app_demo_22.clas.xml b/src/00/z2ui5_cl_app_demo_22.clas.xml
new file mode 100644
index 00000000..e0b8f2f4
--- /dev/null
+++ b/src/00/z2ui5_cl_app_demo_22.clas.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ Z2UI5_CL_APP_DEMO_22
+ E
+ basic - scrolling and focus
+ 1
+ X
+ X
+ X
+
+
+
+
diff --git a/src/00/z2ui5_cl_app_demo_23.clas.abap b/src/00/z2ui5_cl_app_demo_23.clas.abap
new file mode 100644
index 00000000..4ce89c6d
--- /dev/null
+++ b/src/00/z2ui5_cl_app_demo_23.clas.abap
@@ -0,0 +1,95 @@
+CLASS z2ui5_cl_app_demo_23 DEFINITION PUBLIC.
+
+ PUBLIC SECTION.
+
+ INTERFACES z2ui5_if_app.
+
+ TYPES:
+ BEGIN OF ty_row,
+ selkz TYPE abap_bool,
+ title TYPE string,
+ value TYPE string,
+ descr TYPE string,
+ END OF ty_row,
+ ty_tab TYPE STANDARD TABLE OF ty_row WITH EMPTY KEY.
+
+ CLASS-METHODS factory
+ IMPORTING
+ i_tab TYPE ty_tab
+ event_callback type clike
+ RETURNING
+ VALUE(r_result) TYPE REF TO z2ui5_cl_app_demo_23.
+
+ data mv_event_return type string.
+ DATA t_tab TYPE STANDARD TABLE OF ty_row WITH EMPTY KEY.
+
+ PROTECTED SECTION.
+ PRIVATE SECTION.
+ENDCLASS.
+
+
+
+CLASS Z2UI5_CL_APP_DEMO_23 IMPLEMENTATION.
+
+
+ METHOD factory.
+
+ r_result = NEW #( ).
+ r_result->t_tab = i_tab.
+ r_result->mv_event_return = event_callback.
+
+ ENDMETHOD.
+
+
+ METHOD z2ui5_if_app~controller.
+
+ CASE client->get( )-lifecycle_method.
+
+ WHEN client->cs-lifecycle_method-on_init.
+
+ WHEN client->cs-lifecycle_method-on_event.
+
+ CASE client->get( )-event.
+
+ WHEN 'BUTTON_SEND'.
+ client->set( event = mv_event_return ).
+ client->nav_app_leave( client->get( )-id_prev_app_stack ).
+
+ WHEN 'BACK'.
+ client->nav_app_leave( client->get( )-id_prev_app_stack ).
+ ENDCASE.
+
+ WHEN client->cs-lifecycle_method-on_rendering.
+
+ DATA(view) = client->factory_view( ).
+ DATA(page) = view->page( title = 'abap2ui5 - Table with different Selection-Modes' navbuttontap = view->_event( 'BACK' ) ).
+
+ page->header_content( )->link( text = 'Go to Source Code' href = client->get( )-s_request-url_source_code ).
+
+ DATA(tab) = page->table(
+ headertext = 'Table'
+ mode = 'SingleSelectLeft'
+ items = view->_bind( t_tab ) ).
+
+ tab->columns(
+ )->column( )->text( 'Title' )->get_parent(
+ )->column( )->text( 'Value' )->get_parent(
+ )->column( )->text( 'Description' ).
+
+ tab->items( )->column_list_item( selected = '{SELKZ}' )->cells(
+ )->text( '{TITLE}'
+ )->text( '{VALUE}'
+ )->text( '{DESCR}' ).
+
+ page->footer( )->overflow_toolbar(
+ )->toolbar_spacer(
+ )->button(
+ text = 'Confirm'
+ press = view->_event( 'BUTTON_SEND' )
+ type = 'Success' ).
+
+
+ ENDCASE.
+
+ ENDMETHOD.
+ENDCLASS.
diff --git a/src/00/z2ui5_cl_app_demo_23.clas.xml b/src/00/z2ui5_cl_app_demo_23.clas.xml
new file mode 100644
index 00000000..d37c77a8
--- /dev/null
+++ b/src/00/z2ui5_cl_app_demo_23.clas.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ Z2UI5_CL_APP_DEMO_23
+ E
+ POPUP - select entries
+ 1
+ X
+ X
+ X
+
+
+
+
diff --git a/src/00/z2ui5_cl_app_demo_24.clas.abap b/src/00/z2ui5_cl_app_demo_24.clas.abap
new file mode 100644
index 00000000..3968a9f4
--- /dev/null
+++ b/src/00/z2ui5_cl_app_demo_24.clas.abap
@@ -0,0 +1,82 @@
+CLASS z2ui5_cl_app_demo_24 DEFINITION PUBLIC.
+
+ PUBLIC SECTION.
+
+ INTERFACES z2ui5_if_app.
+
+ DATA mv_input TYPE string.
+ DATA mv_input2 TYPE string.
+
+
+ PROTECTED SECTION.
+ PRIVATE SECTION.
+ENDCLASS.
+
+
+
+CLASS Z2UI5_CL_APP_DEMO_24 IMPLEMENTATION.
+
+
+ METHOD z2ui5_if_app~controller.
+
+ CASE client->get( )-lifecycle_method.
+
+ WHEN client->cs-lifecycle_method-on_init.
+
+ WHEN client->cs-lifecycle_method-on_event.
+
+ CASE client->get( )-event.
+
+ WHEN 'CALL_NEW_APP'.
+ client->nav_app_call( NEW z2ui5_cl_app_demo_25( ) ).
+
+ WHEN 'CALL_NEW_APP_VIEW'.
+ client->nav_app_call( NEW z2ui5_cl_app_demo_25( ) ).
+ client->view_show( 'SECOND' ).
+
+ WHEN 'CALL_NEW_APP_READ'.
+ DATA(lo_app_next) = NEW z2ui5_cl_app_demo_25( ).
+ lo_app_next->mv_input_previous_set = mv_input.
+ client->nav_app_call( lo_app_next ).
+
+ WHEN 'CALL_NEW_APP_EVENT'.
+ client->nav_app_call( NEW z2ui5_cl_app_demo_25( ) ).
+ client->set( event = 'NEW_APP_EVENT' ).
+
+ WHEN 'CALL_PREVIOUS_APP_INPUT_RETURN'.
+ DATA(lo_called_app) = CAST z2ui5_cl_app_demo_25( client->get_app_by_id( client->get( )-id_prev_app ) ).
+ client->popup_message_box( `Input made in the previous app:` && lo_called_app->mv_input ).
+
+ WHEN 'BACK'.
+ client->nav_app_leave( client->get( )-id_prev_app_stack ).
+
+ ENDCASE.
+
+
+ WHEN client->cs-lifecycle_method-on_rendering.
+
+ DATA(view) = client->factory_view( ).
+ view->page( title = 'abap2UI5 - flow logic 1' navbuttontap = view->_event( 'BACK' )
+ )->header_content( )->link( text = 'Go to Source Code' href = client->get( )-s_request-url_source_code )->get_parent(
+
+ )->grid( 'L6 M12 S12' )->content( 'l'
+
+ )->simple_form( 'Controller' )->content( 'f'
+
+ )->label( 'Demo'
+ )->button( text = 'call new app (default View)' press = view->_event( 'CALL_NEW_APP' )
+ )->label( 'Demo'
+ )->button( text = 'call new app with view SECOND' press = view->_event( 'CALL_NEW_APP_VIEW' )
+ )->label( 'Demo'
+ )->button( text = 'call new app and set event' press = view->_event( 'CALL_NEW_APP_EVENT' )
+ )->label( 'call new app and set this data'
+ )->input( view->_bind( mv_input )
+ )->button( text = 'call' press = view->_event( 'CALL_NEW_APP_READ' )
+ )->label( 'some data, you can read it in the next app'
+ )->input( view->_bind( mv_input2 )
+ ).
+
+ ENDCASE.
+
+ ENDMETHOD.
+ENDCLASS.
diff --git a/src/00/z2ui5_cl_app_demo_24.clas.xml b/src/00/z2ui5_cl_app_demo_24.clas.xml
new file mode 100644
index 00000000..6c9a4f28
--- /dev/null
+++ b/src/00/z2ui5_cl_app_demo_24.clas.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ Z2UI5_CL_APP_DEMO_24
+ E
+ basic - flow logic new app
+ 1
+ X
+ X
+ X
+
+
+
+
diff --git a/src/00/z2ui5_cl_app_demo_25.clas.abap b/src/00/z2ui5_cl_app_demo_25.clas.abap
new file mode 100644
index 00000000..f103d697
--- /dev/null
+++ b/src/00/z2ui5_cl_app_demo_25.clas.abap
@@ -0,0 +1,117 @@
+CLASS z2ui5_cl_app_demo_25 DEFINITION PUBLIC.
+
+ PUBLIC SECTION.
+
+ INTERFACES z2ui5_if_app.
+ CLASS-METHODS factory
+ IMPORTING
+ i_app TYPE REF TO z2ui5_if_app
+ i_name_attri TYPE string
+ RETURNING
+ VALUE(r_result) TYPE REF TO z2ui5_cl_app_demo_25.
+
+
+ DATA mv_input TYPE string.
+ DATA mv_input_previous TYPE string.
+ DATA mv_input_previous_set TYPE string.
+
+ DATA mo_app TYPE REF TO z2ui5_if_app.
+ DATA mv_name_attri TYPE string.
+
+ PROTECTED SECTION.
+ PRIVATE SECTION.
+ENDCLASS.
+
+
+
+CLASS z2ui5_cl_app_demo_25 IMPLEMENTATION.
+
+
+ METHOD factory.
+
+ r_result = NEW #( ).
+
+ r_result->mo_app = i_app.
+ r_result->mv_name_attri = i_name_attri.
+
+ ENDMETHOD.
+
+
+ METHOD z2ui5_if_app~controller.
+
+ CASE client->get( )-lifecycle_method.
+
+ WHEN client->cs-lifecycle_method-on_init.
+
+ WHEN client->cs-lifecycle_method-on_event.
+
+ CASE client->get( )-event.
+
+ WHEN 'BUTTON_ROUNDTRIP'.
+ client->popup_message_box( 'server-client roundtrip, method on_event of the abap controller was called' ).
+
+ WHEN 'BUTTON_RESTART'.
+ client->nav_app_call( NEW z2ui5_cl_app_demo_25( ) ).
+
+ WHEN 'BUTTON_CHANGE_APP'.
+ client->nav_app_call( NEW z2ui5_cl_app_demo_01( ) ).
+
+ WHEN 'BUTTON_READ_PREVIOUS'.
+ DATA(lo_previous_app) = CAST z2ui5_cl_app_demo_24( client->get_app_by_id( client->get( )-id_prev_app ) ).
+ mv_input_previous = lo_previous_app->mv_input2.
+ client->popup_message_toast( `data of previous app read` ).
+
+ WHEN 'NEW_APP_EVENT'.
+ client->popup_message_box( 'new app called and event NEW_APP_EVENT raised' ).
+
+ WHEN 'SHOW_VIEW_MAIN'.
+ client->view_show( 'MAIN' ).
+
+ WHEN 'BACK_WITH_EVENT'.
+ client->nav_app_leave( client->get( )-id_prev_app_stack ).
+ client->set( event = 'CALL_PREVIOUS_APP_INPUT_RETURN' ).
+
+ WHEN 'BACK'.
+ client->nav_app_leave( client->get( )-id_prev_app_stack ).
+
+ ENDCASE.
+
+ WHEN client->cs-lifecycle_method-on_rendering.
+
+ DATA(view) = client->factory_view( 'MAIN' ).
+ view->page( title = 'abap2UI5 - flow logic 2' navbuttontap = view->_event( 'BACK' )
+ )->header_content( )->link( text = 'Go to Source Code' href = client->get( )-s_request-url_source_code )->get_parent(
+
+ )->grid( 'L6 M12 S12' )->content( 'l'
+
+ )->simple_form( 'MAIN View' )->content( 'f'
+
+ )->label( 'Input set by previous app'
+ )->input( value = mv_input_previous_set
+
+ )->label( 'Data of previous app'
+ )->input( mv_input_previous
+ )->button( text = 'read' press = view->_event( 'BUTTON_READ_PREVIOUS' )
+
+ )->label( 'Call previous app and show data of this app'
+ )->input( view->_bind( mv_input )
+ )->button( text = 'back' press = view->_event( 'BACK_WITH_EVENT' )
+ ).
+
+ view = client->factory_view( 'SECOND' ).
+ view->page( title = 'abap2UI5 - flow logic 2' navbuttontap = view->_event( 'BACK' )
+ )->header_content( )->link( text = 'Go to Source Code' href = client->get( )-s_request-url_source_code )->get_parent(
+
+ )->grid( 'L6 M12 S12' )->content( 'l'
+
+ )->simple_form( 'second view set by previous app' )->content( 'f'
+ )->label( 'Demo'
+ )->button( text = 'leave to previous app' press = view->_event( 'BACK' )
+ )->label( 'Demo'
+ )->button( text = 'show view main' press = view->_event( 'SHOW_VIEW_MAIN' )
+ ).
+
+ ENDCASE.
+
+ ENDMETHOD.
+ENDCLASS.
diff --git a/src/00/z2ui5_cl_app_demo_25.clas.xml b/src/00/z2ui5_cl_app_demo_25.clas.xml
new file mode 100644
index 00000000..6550f4af
--- /dev/null
+++ b/src/00/z2ui5_cl_app_demo_25.clas.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ Z2UI5_CL_APP_DEMO_25
+ E
+ basic - flow logic new app (called)
+ 1
+ X
+ X
+ X
+
+
+
+
diff --git a/src/package.devc.xml b/src/package.devc.xml
new file mode 100644
index 00000000..968ac676
--- /dev/null
+++ b/src/package.devc.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+ abap2UI5
+
+
+
+
diff --git a/src/z2ui5_cl_http_handler.clas.abap b/src/z2ui5_cl_http_handler.clas.abap
new file mode 100644
index 00000000..922721bd
--- /dev/null
+++ b/src/z2ui5_cl_http_handler.clas.abap
@@ -0,0 +1,435 @@
+CLASS z2ui5_cl_http_handler DEFINITION
+ PUBLIC
+ FINAL
+ CREATE PUBLIC .
+
+ PUBLIC SECTION.
+
+ CONSTANTS:
+ BEGIN OF cs_config,
+ theme TYPE string VALUE 'sap_horizon',
+ browser_title TYPE string VALUE 'abap2UI5',
+ repository TYPE string VALUE 'https://ui5.sap.com/resources/sap-ui-core.js',
+ letterboxing TYPE abap_bool VALUE abap_true,
+ check_debug_mode TYPE abap_bool VALUE abap_true,
+ END OF cs_config.
+
+ TYPES:
+ BEGIN OF ty_S_name_value,
+ name TYPE string,
+ value TYPE string,
+ END OF ty_S_name_value.
+ TYPES ty_t_name_value TYPE STANDARD TABLE OF ty_S_name_value.
+
+ CLASS-DATA:
+ BEGIN OF client,
+ body TYPE string,
+ t_header TYPE ty_t_name_value,
+ t_param TYPE ty_t_name_value,
+ END OF client.
+
+ CLASS-METHODS main_index_html
+ RETURNING
+ VALUE(r_result) TYPE string.
+
+ CLASS-METHODS main_roundtrip
+ RETURNING
+ VALUE(result) TYPE string.
+
+ PROTECTED SECTION.
+ PRIVATE SECTION.
+
+ENDCLASS.
+
+
+
+CLASS Z2UI5_CL_HTTP_HANDLER IMPLEMENTATION.
+
+
+ METHOD main_roundtrip.
+
+ DATA(lo_runtime) = z2ui5_lcl_system_runtime=>execute_init( ).
+
+ DO.
+ TRY.
+
+ DATA(li_client) = lo_runtime->execute_before_app( ).
+
+ IF lo_runtime->ms_actual-lifecycle_method = z2ui5_if_client=>cs-lifecycle_method-on_init.
+ ROLLBACK WORK.
+ CAST z2ui5_if_app( lo_runtime->ms_db-o_app )->controller( li_client ).
+ ROLLBACK WORK.
+ lo_runtime->ms_actual-lifecycle_method = z2ui5_if_client=>cs-lifecycle_method-on_event.
+ ENDIF.
+
+ ROLLBACK WORK.
+ CAST z2ui5_if_app( lo_runtime->ms_db-o_app )->controller( li_client ).
+ ROLLBACK WORK.
+
+ CATCH cx_root INTO DATA(cx).
+ lo_runtime = lo_runtime->set_app_system_error( kind = 'ON_EVENT' ix = cx ).
+ CONTINUE.
+ ENDTRY.
+
+
+ IF lo_runtime->ms_next-s_nav_app_call_new IS NOT INITIAL.
+ lo_runtime = lo_runtime->set_app_call_new( ).
+ CONTINUE.
+ ENDIF.
+
+ IF lo_runtime->ms_next-nav_app_leave_to_id IS NOT INITIAL.
+ lo_runtime = lo_runtime->set_app_leave_to_id( ).
+ CONTINUE.
+ ENDIF.
+
+
+ TRY.
+
+ li_client = lo_runtime->execute_before_app( z2ui5_if_client=>cs-lifecycle_method-on_rendering ).
+ ROLLBACK WORK.
+ CAST z2ui5_if_app( lo_runtime->ms_db-o_app )->controller( li_client ).
+ ROLLBACK WORK.
+
+ result = lo_runtime->execute_finish( ).
+
+ CATCH cx_root INTO cx.
+ lo_runtime = lo_runtime->set_app_system_error( kind = 'ON_RENDERING' ix = cx ).
+ CONTINUE.
+ ENDTRY.
+
+ RETURN.
+ ENDDO.
+
+ ENDMETHOD.
+
+
+ METHOD main_index_html.
+
+ client-t_param = VALUE #( LET tab = client-t_param IN FOR row IN tab
+ ( name = to_upper( row-name ) value = to_upper( row-value ) ) ).
+
+ DATA(lv_url) = client-t_header[ name = '~path' ]-value.
+ TRY.
+ DATA(lv_app) = client-t_param[ name = 'APP' ]-value.
+ lv_url = lv_url && `?app=` && lv_app.
+ CATCH cx_root.
+ ENDTRY.
+
+ z2ui5_lcl_db=>cleanup( ).
+
+ r_result = `` && |\n| &&
+ `` && |\n| &&
+ ` ` && |\n| &&
+ ` ` && cs_config-browser_title && `` && |\n| &&
+ ` ` && |\n| &&
+ `` && |\n| &&
+ ` ` && |\n| &&
+ `` && |\n| &&
+ `` && |\n|.
+
+ r_result = r_result && `` && |\n| &&
+ |\n| &&
+ `