From 18b915b0c3833ab65adcdd8e2e1bb6911605df2c Mon Sep 17 00:00:00 2001
From: oblomov <102328295+oblomov-dev@users.noreply.github.com>
Date: Mon, 6 Nov 2023 10:42:11 +0100
Subject: [PATCH] map container and xml view updates (#624)
* test view
* Update README.md
* Update README.md
* Update README.md
* Update README.md
* Update README.md
* Update README.md
* Update README.md
* update
---
README.md | 26 ++---
src/01/00/package.devc.xml | 10 ++
src/01/00/z2ui5_cl_view.clas.abap | 130 +++++++++++++++++++++++++
src/01/00/z2ui5_cl_view.clas.xml | 16 ++++
src/01/00/z2ui5_cl_view_m.clas.abap | 137 +++++++++++++++++++++++++++
src/01/00/z2ui5_cl_view_m.clas.xml | 16 ++++
src/01/00/z2ui5_cl_view_ui.clas.abap | 57 +++++++++++
src/01/00/z2ui5_cl_view_ui.clas.xml | 16 ++++
src/z2ui5_cl_xml_view.clas.abap | 1 +
9 files changed, 396 insertions(+), 13 deletions(-)
create mode 100644 src/01/00/package.devc.xml
create mode 100644 src/01/00/z2ui5_cl_view.clas.abap
create mode 100644 src/01/00/z2ui5_cl_view.clas.xml
create mode 100644 src/01/00/z2ui5_cl_view_m.clas.abap
create mode 100644 src/01/00/z2ui5_cl_view_m.clas.xml
create mode 100644 src/01/00/z2ui5_cl_view_ui.clas.abap
create mode 100644 src/01/00/z2ui5_cl_view_ui.clas.xml
diff --git a/README.md b/README.md
index 77a30561..8a018680 100644
--- a/README.md
+++ b/README.md
@@ -10,11 +10,11 @@
-*...offers a pure ABAP approach for developing UI5 apps, entirely without JavaScript, OData and RAP — similar to the past, when only a few lines of ABAP sufficed to display inputs and tables using Selection Screens & ALVs. Designed with a minimal system footprint, it works in both on-premise and cloud environments.*
+*...offers a pure ABAP approach for developing UI5 apps, entirely without JavaScript, OData and RAP — similar to the past, when only a few lines of ABAP sufficed to display input forms and tables using Selection Screens & ALVs. Designed with a minimal system footprint, it works in both on-premise and cloud environments.*
#### Key Features
-* **User-Friendly:** Implement just one interface for a standalone UI5 application
-* **100% ABAP:** Developing using pure ABAP (no JavaScript, DDL, EML or Customizing)
+* **User-Friendly:** Implement just a single interface for a standalone UI5 application
+* **100% ABAP:** Developing in pure ABAP (no JavaScript, DDL, EML or Customizing)
* **Minimal System Footprint:** Based on a plain HTTP handler (no BSP, OData, CDS, BOPF or RAP)
* **Cloud and On-Premise Ready:** Works with both language versions (ABAP for Cloud, Standard ABAP)
* **Broad System Compatibility:** Runs on all ABAP releases (from NW 7.02 to ABAP 2311)
@@ -39,28 +39,28 @@
9. Community Feedback & New Features I [(SCN - 11.09.2023)](https://blogs.sap.com/2023/09/11/abap2ui5-a2-community-feedback-new-features/)
#### References
-* Find abap2UI5 in the ABAP Open Source Projects [(dotabap.org)](https://dotabap.org/)
-* Featured in the SAP Developer News [(youtube - 26.01.2023)](https://www.youtube.com/watch?v=6BDK55xYttM)
-* Featured in the Boring Enterprise Nerdletter [(newsletter - 08.03.2023)](https://boringenterprisenerds.substack.com/p/34-abap2ui5-sap-cva-burnout-c2c-shortwave)
+* Find abap2UI5 on ABAP Open Source Projects [(dotabap.org)](https://dotabap.org/)
+* Featured on SAP Developer News [(youtube - 26.01.2023)](https://www.youtube.com/watch?v=6BDK55xYttM)
+* Highlighted in the Boring Enterprise Nerdletter [(newsletter - 08.03.2023)](https://boringenterprisenerds.substack.com/p/34-abap2ui5-sap-cva-burnout-c2c-shortwave)
* Part of the SAP Developer Code Challenge [(SCN - 17.05.2023)](https://groups.community.sap.com/t5/application-development/sap-developer-code-challenge-open-source-abap-week-2/m-p/260727#M1372)
* Showcased at SAP TechEd 2023 [(youtube - 02.11.2023)](https://www.youtube.com/watch?v=kLbF0ooStZs&t=3052s)
#### Apps & Extensions
-* Add your apps to SAP Fiori On-Premise Launchpad [(ext-fiori_launchpad)](https://github.com/abap2UI5/ext-service_integration)
-* Integrate your apps with the SAP Business Technology Platform [(ext-btp)](https://github.com/abap2UI5/ext-business_technology_platform)
+* Integrate your apps to SAP Fiori On-Premise Launchpad [(ext-fiori_launchpad)](https://github.com/abap2UI5/ext-service_integration)
+* Connect with the SAP Business Technology Platform [(ext-btp)](https://github.com/abap2UI5/ext-business_technology_platform)
* Explore abap2UI5-tools, a collection of tools & utility functions [(abap2UI5-tools)](https://github.com/abap2UI5/abap2ui5-tools)
-* Add more functions with Custom Controls & External Libraries [(custom controls)](https://github.com/abap2UI5/abap2UI5-documentation/blob/main/docs/custom_controls.md)
+* Enhance functionality with Custom Controls & External Libraries [(custom controls)](https://github.com/abap2UI5/abap2UI5-documentation/blob/main/docs/custom_controls.md)
* Discover other projects using abap2UI5 [(abap2UI5/links)](https://github.com/abap2UI5/abap2UI5-documentation/blob/main/docs/links.md)
#### More
-* Try out abap2UI5 compiled to JS on open-abap under Node.js [(abap2UI5-web)](https://twitter.com/LarsHvam/status/1648575595897405446)
+* Experiment with abap2UI5 compiled to JS on open-abap under Node.js [(abap2UI5-web)](https://twitter.com/LarsHvam/status/1648575595897405446)
* Install S-RTTI to create apps with dynamically typed tables [(github/s-rtti)](https://github.com/sandraros/S-RTTI)
* Import & Export Excel files in pure ABAP with abap2xslt [(twitter/xslt)](https://twitter.com/abap2UI5/status/1703787345588162907)
* Analyse your Views & Models with this Codesandbox [(abap2UI5-debug-tools)](https://codesandbox.io/p/sandbox/abap2ui5-debug-tool-ppyfcs)
* And finally, don't forget to explore the [Samples Repository](https://github.com/abap2UI5/abap2UI5-samples) 🧭
#### Installation
-Install with [abapGit](https://abapgit.org)  and create a new HTTP service with the following handler:
+Install with [abapGit](https://abapgit.org)  and set up a new HTTP service with the following handler:
##### Standard ABAP 🏠
```abap
METHOD if_http_extension~handle_request.
@@ -90,7 +90,7 @@ METHOD if_http_service_extension~handle_request.
ENDMETHOD.
```
#### Usage
-Develop UI5 Apps by implementing the abap2UI5 interface:
+Implement the abap2UI5 interface as shown in the following example:
```abap
CLASS z2ui5_cl_app_hello_world DEFINITION PUBLIC.
@@ -122,7 +122,7 @@ CLASS z2ui5_cl_app_hello_world IMPLEMENTATION.
ENDCLASS.
```
#### FAQ
-* Check out the [documentation](https://github.com/abap2UI5/abap2UI5-documentation/) for installation & configuration guidelines
+* Check out the [documentation](https://github.com/abap2UI5/abap2UI5-documentation/) for more installation & configuration guidelines
* Still have open questions? Find an answer in the [FAQ](https://github.com/abap2UI5/abap2UI5-documentation/blob/main/docs/faq.md)
* Want to help out? Check out the contribution [guidelines](https://github.com/abap2UI5/abap2UI5-documentation/blob/main/CONTRIBUTING.md)
* As always - your comments, questions, wishes and bug reports are welcome, please create an [issue](https://github.com/abap2UI5/abap2UI5/issues)
diff --git a/src/01/00/package.devc.xml b/src/01/00/package.devc.xml
new file mode 100644
index 00000000..9bd9bf7f
--- /dev/null
+++ b/src/01/00/package.devc.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+ test
+
+
+
+
diff --git a/src/01/00/z2ui5_cl_view.clas.abap b/src/01/00/z2ui5_cl_view.clas.abap
new file mode 100644
index 00000000..0c473a88
--- /dev/null
+++ b/src/01/00/z2ui5_cl_view.clas.abap
@@ -0,0 +1,130 @@
+CLASS z2ui5_cl_view DEFINITION
+ PUBLIC
+ FINAL
+ CREATE PUBLIC .
+
+ PUBLIC SECTION.
+
+ CLASS-DATA mt_prop TYPE z2ui5_if_client=>ty_t_name_value.
+
+ CLASS-METHODS class_constructor.
+
+ CLASS-METHODS factory
+ IMPORTING
+ t_ns TYPE z2ui5_if_client=>ty_t_name_value DEFAULT mt_prop
+ RETURNING
+ VALUE(result) TYPE REF TO z2ui5_cl_view.
+
+ METHODS add
+ IMPORTING
+ !name TYPE clike
+ !ns TYPE clike OPTIONAL
+ !t_prop TYPE z2ui5_if_client=>ty_t_name_value OPTIONAL
+ RETURNING
+ VALUE(result) TYPE REF TO z2ui5_cl_view.
+
+ METHODS add_property
+ IMPORTING
+ !val TYPE z2ui5_if_client=>ty_s_name_value OPTIONAL
+ RETURNING
+ VALUE(result) TYPE REF TO z2ui5_cl_view.
+
+ METHODS _cc_plain_xml
+ IMPORTING
+ !val TYPE clike OPTIONAL
+ RETURNING
+ VALUE(result) TYPE REF TO z2ui5_cl_view.
+
+ METHODS get_m
+ RETURNING
+ VALUE(result) TYPE REF TO z2ui5_cl_view_m.
+
+ METHODS get_ui
+ RETURNING
+ VALUE(result) TYPE REF TO z2ui5_cl_view_ui.
+
+ PROTECTED SECTION.
+
+ DATA mv_name TYPE string.
+ DATA mv_ns TYPE string.
+ DATA mo_root TYPE REF TO z2ui5_cl_view.
+ DATA mo_previous TYPE REF TO z2ui5_cl_view.
+ DATA mo_parent TYPE REF TO z2ui5_cl_view.
+ DATA mt_child TYPE STANDARD TABLE OF REF TO z2ui5_cl_view WITH EMPTY KEY.
+
+ PRIVATE SECTION.
+ENDCLASS.
+
+
+
+CLASS z2ui5_cl_view IMPLEMENTATION.
+
+
+ METHOD class_constructor.
+
+ mt_prop = VALUE #( BASE mt_prop
+ ( n = 'displayBlock' v = 'true' )
+ ( n = 'height' v = '100%' ) ).
+
+ ENDMETHOD.
+
+
+ METHOD add_property.
+
+ INSERT val INTO TABLE mt_prop.
+ result = me.
+
+ ENDMETHOD.
+
+ METHOD _cc_plain_xml.
+
+ result = me.
+ add( name = `ZZPLAIN`
+ t_prop = VALUE #( ( n = `VALUE` v = val ) ) ).
+
+ ENDMETHOD.
+
+ METHOD factory.
+
+ result = NEW #( ).
+
+ IF t_ns IS NOT INITIAL.
+ result->mt_prop = t_ns.
+ ENDIF.
+
+ result->mv_name = `View`.
+ result->mv_ns = `mvc`.
+ result->mo_root = result.
+ result->mo_parent = result.
+
+ ENDMETHOD.
+
+
+ METHOD add.
+
+ DATA(result2) = NEW z2ui5_cl_view( ).
+ result2->mv_name = name.
+ result2->mv_ns = ns.
+ result2->mt_prop = t_prop.
+ result2->mo_parent = me.
+ result2->mo_root = mo_root.
+ INSERT result2 INTO TABLE mt_child.
+
+ mo_root->mo_previous = result2.
+ result = result2.
+
+ ENDMETHOD.
+
+ METHOD get_m.
+
+ result = new #( ).
+
+ ENDMETHOD.
+
+ METHOD get_ui.
+
+ result = new #( ).
+
+ ENDMETHOD.
+
+ENDCLASS.
diff --git a/src/01/00/z2ui5_cl_view.clas.xml b/src/01/00/z2ui5_cl_view.clas.xml
new file mode 100644
index 00000000..1c56d48f
--- /dev/null
+++ b/src/01/00/z2ui5_cl_view.clas.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ Z2UI5_CL_VIEW
+ E
+ test - view
+ 1
+ X
+ X
+ X
+
+
+
+
diff --git a/src/01/00/z2ui5_cl_view_m.clas.abap b/src/01/00/z2ui5_cl_view_m.clas.abap
new file mode 100644
index 00000000..6c3a1b7c
--- /dev/null
+++ b/src/01/00/z2ui5_cl_view_m.clas.abap
@@ -0,0 +1,137 @@
+CLASS z2ui5_cl_view_m DEFINITION
+ PUBLIC
+ FINAL
+ CREATE PUBLIC .
+
+ PUBLIC SECTION.
+
+ METHODS input
+ IMPORTING
+ !id TYPE clike OPTIONAL
+ !value TYPE clike OPTIONAL
+ !placeholder TYPE clike OPTIONAL
+ !type TYPE clike OPTIONAL
+ !showclearicon TYPE clike OPTIONAL
+ !valuestate TYPE clike OPTIONAL
+ !valuestatetext TYPE clike OPTIONAL
+ !showtablesuggestionvaluehelp TYPE clike OPTIONAL
+ !description TYPE clike OPTIONAL
+ !editable TYPE clike OPTIONAL
+ !enabled TYPE clike OPTIONAL
+ !suggestionitems TYPE clike OPTIONAL
+ !suggestionrows TYPE clike OPTIONAL
+ !showsuggestion TYPE clike OPTIONAL
+ !showvaluehelp TYPE clike OPTIONAL
+ !valuehelprequest TYPE clike OPTIONAL
+ !required TYPE clike OPTIONAL
+ !suggest TYPE clike OPTIONAL
+ !class TYPE clike OPTIONAL
+ !visible TYPE clike OPTIONAL
+ !submit TYPE clike OPTIONAL
+ !valueliveupdate TYPE clike OPTIONAL
+ !autocomplete TYPE clike OPTIONAL
+ !maxsuggestionwidth TYPE clike OPTIONAL
+ !fieldwidth TYPE clike OPTIONAL
+ !valuehelponly TYPE clike OPTIONAL
+ !width TYPE clike OPTIONAL
+ !change TYPE clike OPTIONAL
+ !valuehelpiconsrc TYPE clike OPTIONAL
+ !textformatter TYPE clike OPTIONAL
+ !textformatmode TYPE clike OPTIONAL
+ !maxlength TYPE clike OPTIONAL
+ !startsuggestion TYPE clike OPTIONAL
+ !enablesuggestionshighlighting TYPE clike OPTIONAL
+ !enabletableautopopinmode TYPE clike OPTIONAL
+ PREFERRED PARAMETER value
+ RETURNING
+ VALUE(result) TYPE REF TO z2ui5_cl_view .
+
+ PROTECTED SECTION.
+
+ DATA mo_view TYPE REF TO z2ui5_cl_view.
+
+ PRIVATE SECTION.
+ENDCLASS.
+
+
+
+CLASS z2ui5_cl_view_m IMPLEMENTATION.
+
+ METHOD input.
+
+ result = mo_view.
+
+ mo_view->add( name = `Input`
+ t_prop = VALUE #( ( n = `id` v = id )
+ ( n = `placeholder` v = placeholder )
+ ( n = `type` v = type )
+ ( n = `maxLength` v = maxlength )
+ ( n = `showClearIcon` v = z2ui5_cl_fw_utility=>boolean_abap_2_json( showclearicon ) )
+ ( n = `description` v = description )
+ ( n = `editable` v = z2ui5_cl_fw_utility=>boolean_abap_2_json( editable ) )
+ ( n = `enabled` v = z2ui5_cl_fw_utility=>boolean_abap_2_json( enabled ) )
+ ( n = `visible` v = z2ui5_cl_fw_utility=>boolean_abap_2_json( visible ) )
+ ( n = `enableTableAutoPopinMode` v = z2ui5_cl_fw_utility=>boolean_abap_2_json( enabletableautopopinmode ) )
+ ( n = `enableSuggestionsHighlighting` v = z2ui5_cl_fw_utility=>boolean_abap_2_json( enablesuggestionshighlighting ) )
+ ( n = `showTableSuggestionValueHelp` v = z2ui5_cl_fw_utility=>boolean_abap_2_json( showtablesuggestionvaluehelp ) )
+ ( n = `valueState` v = valuestate )
+ ( n = `valueStateText` v = valuestatetext )
+ ( n = `value` v = value )
+ ( n = `required` v = z2ui5_cl_fw_utility=>boolean_abap_2_json( required ) )
+ ( n = `suggest` v = suggest )
+ ( n = `suggestionItems` v = suggestionitems )
+ ( n = `suggestionRows` v = suggestionrows )
+ ( n = `showSuggestion` v = z2ui5_cl_fw_utility=>boolean_abap_2_json( showsuggestion ) )
+ ( n = `valueHelpRequest` v = valuehelprequest )
+ ( n = `autocomplete` v = z2ui5_cl_fw_utility=>boolean_abap_2_json( autocomplete ) )
+ ( n = `valueLiveUpdate` v = z2ui5_cl_fw_utility=>boolean_abap_2_json( valueliveupdate ) )
+ ( n = `submit` v = z2ui5_cl_fw_utility=>boolean_abap_2_json( submit ) )
+ ( n = `showValueHelp` v = z2ui5_cl_fw_utility=>boolean_abap_2_json( showvaluehelp ) )
+ ( n = `valueHelpOnly` v = z2ui5_cl_fw_utility=>boolean_abap_2_json( valuehelponly ) )
+ ( n = `class` v = class )
+ ( n = `change` v = change )
+ ( n = `maxSuggestionWidth` v = maxsuggestionwidth )
+ ( n = `width` v = width )
+ ( n = `textFormatter` v = textformatter )
+ ( n = `startSuggestion` v = startsuggestion )
+ ( n = `valueHelpIconSrc` v = valuehelpiconsrc )
+ ( n = `textFormatMode` v = textformatmode )
+ ( n = `fieldWidth` v = fieldwidth ) ) ).
+
+
+* DATA(test) = `!function(){"use strict";const t="undefined"!=typeof window?window:Function("return this;")(),e=(e,o)=>((e,o)=>{let n=null!=o?o:t;for(let t=0;tn.call(t,e);let i=0;const r=t=>{const e=(new Date).getTime(),o=Math.floor(1e9*Math.random());return i++,t+"_"+o+i+String(e)},a=()=>({listeners:[],scriptId:r("tiny-script"),scriptLoaded:!1}),l=(()=>{let t=` &&
+*`a();return{load:(e,o,n)=>{t.scriptLoaded?n():(t.listeners.push(n),e.getElementById(t.scriptId)||((t,e,o,n)=>{const s=e.createElement("script");s.referrerPolicy="origin",s.type="application/javascript",s.id=t,s.src=o;const i=()=>{s.removeEventListen` &&
+*`er("load",i),n()};s.addEventListener("load",i),e.head&&e.head.appendChild(s)})(t.scriptId,e,o,(()=>{t.listeners.forEach((t=>t())),t.scriptLoaded=!0})))},reinitialize:()=>{t=a()}}})();var d;!function(t){t[t.Raw=0]="Raw",t[t.Initializing=1]="Initiali` &&
+*`zing",t[t.Ready=2]="Ready"}(d||(d={}));const u=(t,e)=>{const o=e.closest(t);if(null!==o)return o;const n=e.getRootNode().host;return null!=n?u(t,n):null},h=t=>e=>((t,e)=>s(t,e))(t,e)?t[e]:e,c=e,m=t=>t,_=h({false:!1}),p=h({true:!0,false:!1}),f=t=>/^` &&
+*`\d+$/.test(t)?Number.parseInt(t,10):t,g={setup:c,toolbar:_,menubar:_,plugins:m,content_css:m,content_style:m,width:f,height:f,toolbar_mode:m,contextmenu:_,quickbars_insert_toolbar:_,quickbars_selection_toolbar:_,powerpaste_word_import:m,powerpaste_` &&
+*`html_import:m,powerpaste_allow_local_images:p,resize:p,skin:m,skin_url:m,images_upload_url:m,images_upload_handler:c,images_upload_base_path:m,images_upload_credentials:p,images_reuse_filename:p,icons:m,icons_url:m,promotion:p},v={};class b extends` &&
+*` HTMLElement{static get formAssociated(){return!0}static get observedAttributes(){return["form","readonly","autofocus","placeholder"].concat(["on-BeforePaste","on-Blur","on-Click","on-ContextMenu","on-Copy","on-Cut","on-Dblclick","on-Drag","on-Drag` &&
+*`Drop","on-DragEnd","on-DragGesture","on-DragOver","on-Drop","on-Focus","on-FocusIn","on-FocusOut","on-KeyDown","on-KeyPress","on-KeyUp","on-MouseDown","on-MouseEnter","on-MouseLeave","on-MouseMove","on-MouseOut","on-MouseOver","on-MouseUp","on-Past` &&
+*`e","on-SelectionChange"]).concat(["on-Activate","on-AddUndo","on-BeforeAddUndo","on-BeforeExecCommand","on-BeforeGetContent","on-BeforeRenderUI","on-BeforeSetContent","on-Change","on-ClearUndos","on-Deactivate","on-Dirty","on-ExecCommand","on-GetCo` &&
+*`ntent","on-Hide","on-Init","on-LoadContent","on-NodeChange","on-PostProcess","on-PostRender","on-PreProcess","on-ProgressState","on-Redo","on-Remove","on-Reset","on-SaveContent","on-SetAttrib","on-ObjectResizeStart","on-ObjectResized","on-ObjectSel` &&
+*`ected","on-SetContent","on-Show","on-Submit","on-Undo","on-VisualAid"])}constructor(){super(),this._eventAttrHandler=t=>{t.forEach((t=>{var e;"attributes"===t.type&&t.target===this&&(null===(e=t.attributeName)||void 0===e?void 0:e.toLowerCase().sta` &&
+*`rtsWith("on-"))&&this._updateEventAttr(t.attributeName,this.getAttribute(t.attributeName))}))},this._formDataHandler=t=>{const e=this.name;if(null!=e){const o=this.value;if(null!=o){t.formData.append(e,o)}}},this._status=d.Raw,this._shadowDom=this.` &&
+*`attachShadow({mode:"open"}),this._form=null,this._eventHandlers={},this._mutationObserver=new MutationObserver(this._eventAttrHandler)}_updateEventAttr(t,o){const n=t.substring("on-".length).toLowerCase(),s=null!==o?e(o):void 0,i="function"==typeof` &&
+*` s?s:void 0;this._eventHandlers[n]!==i&&(this._editor&&this._eventHandlers[n]&&this._editor.off(n,this._eventHandlers[n]),i?(this._editor&&this._editor.on(n,i),this._eventHandlers[n]=i):delete this._eventHandlers[n])}_updateForm(){if(this.isConnect` &&
+*`ed){const t=this.getAttribute("form"),e=null!==t?this.ownerDocument.querySelector("form#"+t):u("form",this);this._form!==e&&(null!==this._form&&this._form.removeEventListener("formdata",this._formDataHandler),this._form=e,null!==this._form&&this._f` &&
+*`orm.addEventListener("formdata",this._formDataHandler))}else null!==this._form&&(this._form.removeEventListener("formdata",this._formDataHandler),this._form=null)}_getTinymce(){return t.tinymce}_getConfig(){var t,e;const o=null!==(e=c(null!==(t=thi` &&
+*`s.getAttribute("config"))&&void 0!==t?t:""))&&void 0!==e?e:{};for(let t=0;t{this._editor=t,t.on("init",(t=>{this._status=d.Ready})),t.on("SwitchMode",(t=>{this.readonly=t` &&
+*`his.readonly})),((t,e)=>{const n=o(t);for(let o=0,s=n.length;o{void 0!==e&&t.on(o,e)})),"function"==typeof n.setup&&n.setup(t)}});this._getTinymce().init(s)}_getTinymceSrc(){var t;const ` &&
+*`e=this.getAttribute("src");if(e)return e;const o=null!==(t=this.getAttribute("channel"))&&void 0!==t?t:"6";return``https://cdn.tiny.cloud/1/${this.hasAttribute("api-key")?this.getAttribute("api-key"):"no-api-key"}/tinymce/${o}/tinymce.min.js``}_loa` &&
+*`dTinyDoInit(){this._getTinymce()?this._doInit():l.load(this.ownerDocument,this._getTinymceSrc(),(()=>this._doInit()))}attributeChangedCallback(t,e,o){e!==o&&("form"===t?this._updateForm():"readonly"===t?this.readonly=null!==o:"autofocus"===t?this.a` &&
+*`utofocus=null!==o:"placeholder"===t?this.placeholder=o:t.toLowerCase().startsWith("on-")&&this._updateEventAttr(t,o))}connectedCallback(){this._eventHandlers=this._getEventHandlers(),this._mutationObserver.observe(this,{attributes:!0,childList:!1,s` &&
+*`ubtree:!1}),this._updateForm(),this._status===d.Raw&&this._loadTinyDoInit()}disconnectedCallback(){this._mutationObserver.disconnect(),this._updateForm()}get value(){var t,e;return null!==(e=this._status===d.Ready?null===(t=this._editor)||void 0===` &&
+*`t?void 0:t.getContent():void 0)&&void 0!==e?e:null}set value(t){var e;this._status===d.Ready&&null!=t&&(null===(e=this._editor)||void 0===e||e.setContent(t))}get readonly(){return this._editor?"readonly"===this._editor.mode.get():this.hasAttribute(` &&
+*`"readonly")}set readonly(t){t?(this._editor&&"readonly"!==this._editor.mode.get()&&this._editor.mode.set("readonly"),this.hasAttribute("readonly")||this.setAttribute("readonly","")):(this._editor&&"readonly"===this._editor.mode.get()&&this._editor.` &&
+*`mode.set("design"),this.hasAttribute("readonly")&&this.removeAttribute("readonly"))}get placeholder(){return this.getAttribute("placeholder")}set placeholder(t){if(this._editor){const e=this._editor.getElement();null!==e&&(null!==t?e.setAttribute("` &&
+*`placeholder",t):e.removeAttribute("placeholder"))}null!==t?this.getAttribute("placeholder")!==t&&this.setAttribute("placeholder",t):this.hasAttribute("placeholder")&&this.removeAttribute("placeholder")}get autofocus(){return this.hasAttribute("auto` &&
+*`focus")}set autofocus(t){t?this.hasAttribute("autofocus")||this.setAttribute("autofocus",""):this.hasAttribute("autofocus")&&this.removeAttribute("autofocus")}get form(){return this._form}get name(){return this.getAttribute("name")}get type(){retur` &&
+*`n this.localName}}window.customElements.define("tinymce-editor",b)}();`.
+
+ ENDMETHOD.
+
+ENDCLASS.
diff --git a/src/01/00/z2ui5_cl_view_m.clas.xml b/src/01/00/z2ui5_cl_view_m.clas.xml
new file mode 100644
index 00000000..f02fa8ad
--- /dev/null
+++ b/src/01/00/z2ui5_cl_view_m.clas.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ Z2UI5_CL_VIEW_M
+ E
+ test - view m
+ 1
+ X
+ X
+ X
+
+
+
+
diff --git a/src/01/00/z2ui5_cl_view_ui.clas.abap b/src/01/00/z2ui5_cl_view_ui.clas.abap
new file mode 100644
index 00000000..c98514af
--- /dev/null
+++ b/src/01/00/z2ui5_cl_view_ui.clas.abap
@@ -0,0 +1,57 @@
+CLASS z2ui5_cl_view_ui DEFINITION
+ PUBLIC
+ FINAL
+ CREATE PUBLIC .
+
+ PUBLIC SECTION.
+
+ CLASS-DATA mt_prop TYPE z2ui5_if_client=>ty_t_name_value.
+
+ CLASS-METHODS class_constructor.
+
+ CLASS-METHODS factory
+ IMPORTING
+ t_ns TYPE z2ui5_if_client=>ty_t_name_value DEFAULT mt_prop
+ RETURNING
+ VALUE(result) TYPE REF TO z2ui5_cl_view_ui.
+
+ PROTECTED SECTION.
+
+ DATA mv_name TYPE string.
+ DATA mv_ns TYPE string.
+
+
+ DATA mo_root TYPE REF TO z2ui5_cl_view_ui.
+ DATA mo_parent TYPE REF TO z2ui5_cl_view_ui.
+
+ PRIVATE SECTION.
+ENDCLASS.
+
+
+
+CLASS z2ui5_cl_view_ui IMPLEMENTATION.
+
+ METHOD class_constructor.
+
+ mt_prop = VALUE #( BASE mt_prop
+ ( n = 'displayBlock' v = 'true' )
+ ( n = 'height' v = '100%' ) ).
+
+ ENDMETHOD.
+
+ METHOD factory.
+
+ result = NEW #( ).
+
+ IF t_ns IS NOT INITIAL.
+ result->mt_prop = t_ns.
+ ENDIF.
+
+ result->mv_name = `View`.
+ result->mv_ns = `mvc`.
+ result->mo_root = result.
+ result->mo_parent = result.
+
+ ENDMETHOD.
+
+ENDCLASS.
diff --git a/src/01/00/z2ui5_cl_view_ui.clas.xml b/src/01/00/z2ui5_cl_view_ui.clas.xml
new file mode 100644
index 00000000..96d63f2a
--- /dev/null
+++ b/src/01/00/z2ui5_cl_view_ui.clas.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ Z2UI5_CL_VIEW_UI
+ E
+ test - view ui
+ 1
+ X
+ X
+ X
+
+
+
+
diff --git a/src/z2ui5_cl_xml_view.clas.abap b/src/z2ui5_cl_xml_view.clas.abap
index 9e552df4..f967d2ad 100644
--- a/src/z2ui5_cl_xml_view.clas.abap
+++ b/src/z2ui5_cl_xml_view.clas.abap
@@ -2859,6 +2859,7 @@ CLASS z2ui5_cl_xml_view DEFINITION
IMPORTING
!id TYPE clike OPTIONAL
!items TYPE clike OPTIONAL
+ PREFERRED PARAMETER items
RETURNING
VALUE(result) TYPE REF TO z2ui5_cl_xml_view.