From b9d31241bf2cbaed17c55883a42a2d72745fcea8 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 15 Aug 2026 13:39:08 +0000 Subject: [PATCH] Follow the upstream 2026-08 rename wave and unbreak the sync pipeline MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The three nightly pipelines have been red since 2026-07-30, so the core package — and with it the published CAP app — stopped moving while upstream reworked its class names and the samples repository restructured. Three independent breaks, all fixed here. 1. transpile_abap2ui5 failed: three upstream constructs produced JS that does not parse — TRY … CLEANUP … ENDTRY (now a catch-and-rethrow, or the else branch of the multi-CATCH chain), REF #( tab[ … ] OPTIONAL ) (same lowering VALUE #( ) already had) and a DEFAULT literal in an interface method (qualifying `1` as z2ui5_if_client=>1). 2. mirror_samples cloned the `cloud` branch, which upstream deleted on 2026-08-12 — ABAP Cloud systems install `main` itself now. The mirror follows `main` and skips the two packages upstream itself strips from its published build (00/97 experimental, 00/98 testing). 3. build_core failed on the ratchets because the whole framework layer was renamed (z2ui5_cl_core_* → z2ui5_cl_ui5_*, z2ui5_cl_a2ui5_* → z2ui5_cl_ui5_util_*, z2ui5_cl_app_*_js → z2ui5_cl_ui5f_*, the framework apps into 01/04) while the hand-ported port layer kept the old names, so the transpiler filled in raw transpiles beside orphaned hand-ports. The 47 hand-ports follow the rename, and the exports map, the transpiler's require resolution, the jest module mapper, the app lookup paths and the web registry follow them. Making the renamed classes actually run needed five transpiler fixes: table and structure aware IS INITIAL (an empty table is truthy in JS), the PREFERRED PARAMETER call style for the new view builder (its ele( )/tag( ) chain is called positionally), offset/length access on an attribute (cls=>const(1) is not a call), INITIAL values for unpassed OPTIONAL parameters, and the concat_lines_of / shift_left / shift_right / substring_after / substring_before builtins. The client hand-port gains get_event( ), the new interface shortcut 14 samples use. Also fixes the browser bundle, which has been broken since async_hooks entered the user-exit class: adapters/web now shims AsyncLocalStorage. Both known-failure baselines are rebased onto the new names. apps-smoke is comparable to before (8 of 104 samples, same failures as the old 13 of 208 where the sample survived); upstream-units grew from 25 to 128 entries, the new ones recording upstream API the JS port does not implement yet (get_event_client_json, session_merge) and tests asserting on abap-internal state the port models differently. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01VHRfng5K6Yc8c4j7hBytXo --- README.md | 7 +- adapters/cap/README.md | 2 +- adapters/express/README.md | 2 +- adapters/node/README.md | 4 +- adapters/node/server.js | 2 +- adapters/web/README.md | 2 +- adapters/web/build.js | 4 +- adapters/web/shims/async_hooks.js | 50 + core/app/z2ui5/webapp/Component.js | 151 +- core/app/z2ui5/webapp/cc/CameraPicture.js | 1 - core/app/z2ui5/webapp/cc/Dirty.js | 6 +- core/app/z2ui5/webapp/cc/Favicon.js | 8 +- core/app/z2ui5/webapp/cc/Focus.js | 20 +- core/app/z2ui5/webapp/cc/History.js | 4 +- core/app/z2ui5/webapp/cc/Info.js | 10 +- core/app/z2ui5/webapp/cc/LPTitle.js | 4 +- core/app/z2ui5/webapp/cc/MessageManager.js | 23 +- core/app/z2ui5/webapp/cc/MultiInputExt.js | 3 +- core/app/z2ui5/webapp/cc/Scrolling.js | 4 +- .../app/z2ui5/webapp/cc/SmartMultiInputExt.js | 6 +- core/app/z2ui5/webapp/cc/Storage.js | 48 +- core/app/z2ui5/webapp/cc/Title.js | 4 +- core/app/z2ui5/webapp/cc/UploadSetExt.js | 15 +- core/app/z2ui5/webapp/cc/Websocket.js | 201 +++ .../z2ui5/webapp/controller/App.controller.js | 16 +- .../webapp/controller/View1.controller.js | 610 ++----- core/app/z2ui5/webapp/core/AppState.js | 60 +- .../webapp/core/DeveloperTools.fragment.xml | 144 -- core/app/z2ui5/webapp/core/DeveloperTools.js | 761 -------- core/app/z2ui5/webapp/core/ErrorView.js | 407 +++-- core/app/z2ui5/webapp/core/FrontendAction.js | 1574 ++--------------- core/app/z2ui5/webapp/core/Lib.js | 175 +- core/app/z2ui5/webapp/core/Messages.js | 149 -- core/app/z2ui5/webapp/core/Router.js | 404 +++++ core/app/z2ui5/webapp/core/ScrollFocus.js | 197 +++ core/app/z2ui5/webapp/core/Server.js | 525 ++---- core/app/z2ui5/webapp/core/Session.js | 136 ++ core/app/z2ui5/webapp/core/ViewSlots.js | 81 +- core/app/z2ui5/webapp/core/actions/Browser.js | 311 ++++ .../z2ui5/webapp/core/actions/ControlCall.js | 940 ++++++++++ .../z2ui5/webapp/core/actions/Launchpad.js | 90 + .../webapp/core/actions/LegacyCustomJs.js | 114 ++ .../z2ui5/webapp/core/actions/Shortcuts.js | 188 ++ core/app/z2ui5/webapp/core/actions/Slots.js | 404 +++++ .../app/z2ui5/webapp/core/actions/Variants.js | 307 ++++ core/app/z2ui5/webapp/core/actions/ViewOps.js | 322 ++++ core/app/z2ui5/webapp/devtools/Console.js | 388 ++++ core/app/z2ui5/webapp/devtools/DevTools.js | 178 ++ .../devtools/DeveloperTools.fragment.xml | 249 +++ .../z2ui5/webapp/devtools/DeveloperTools.js | 1241 +++++++++++++ core/app/z2ui5/webapp/devtools/Inspect.js | 1020 +++++++++++ core/app/z2ui5/webapp/devtools/LiveEdit.js | 114 ++ core/app/z2ui5/webapp/devtools/Picker.js | 256 +++ core/app/z2ui5/webapp/devtools/Recorder.js | 1010 +++++++++++ core/app/z2ui5/webapp/manifest.json | 12 +- core/app/z2ui5/webapp/model/formatter.js | 159 +- core/app/z2ui5/webapp/model/models.js | 49 + core/package.json | 24 +- core/srv/app/samples/z2ui5_cl_demo_app_004.js | 86 - core/srv/app/samples/z2ui5_cl_demo_app_005.js | 30 - core/srv/app/samples/z2ui5_cl_demo_app_006.js | 94 - core/srv/app/samples/z2ui5_cl_demo_app_008.js | 69 - core/srv/app/samples/z2ui5_cl_demo_app_009.js | 159 -- core/srv/app/samples/z2ui5_cl_demo_app_011.js | 79 - core/srv/app/samples/z2ui5_cl_demo_app_012.js | 122 -- core/srv/app/samples/z2ui5_cl_demo_app_015.js | 25 - core/srv/app/samples/z2ui5_cl_demo_app_017.js | 129 -- core/srv/app/samples/z2ui5_cl_demo_app_019.js | 87 - core/srv/app/samples/z2ui5_cl_demo_app_020.js | 49 - core/srv/app/samples/z2ui5_cl_demo_app_022.js | 90 - core/srv/app/samples/z2ui5_cl_demo_app_024.js | 80 - core/srv/app/samples/z2ui5_cl_demo_app_025.js | 89 - core/srv/app/samples/z2ui5_cl_demo_app_026.js | 72 - core/srv/app/samples/z2ui5_cl_demo_app_027.js | 61 - core/srv/app/samples/z2ui5_cl_demo_app_028.js | 55 - core/srv/app/samples/z2ui5_cl_demo_app_030.js | 144 -- core/srv/app/samples/z2ui5_cl_demo_app_038.js | 84 - core/srv/app/samples/z2ui5_cl_demo_app_045.js | 77 - core/srv/app/samples/z2ui5_cl_demo_app_047.js | 66 - core/srv/app/samples/z2ui5_cl_demo_app_048.js | 37 - core/srv/app/samples/z2ui5_cl_demo_app_051.js | 32 - core/srv/app/samples/z2ui5_cl_demo_app_053.js | 72 - core/srv/app/samples/z2ui5_cl_demo_app_059.js | 70 - core/srv/app/samples/z2ui5_cl_demo_app_061.js | 67 - core/srv/app/samples/z2ui5_cl_demo_app_064.js | 79 - core/srv/app/samples/z2ui5_cl_demo_app_065.js | 55 - core/srv/app/samples/z2ui5_cl_demo_app_067.js | 56 - core/srv/app/samples/z2ui5_cl_demo_app_070.js | 210 --- core/srv/app/samples/z2ui5_cl_demo_app_071.js | 54 - core/srv/app/samples/z2ui5_cl_demo_app_073.js | 39 - core/srv/app/samples/z2ui5_cl_demo_app_074.js | 91 - core/srv/app/samples/z2ui5_cl_demo_app_078.js | 56 - core/srv/app/samples/z2ui5_cl_demo_app_081.js | 103 -- core/srv/app/samples/z2ui5_cl_demo_app_088.js | 56 - core/srv/app/samples/z2ui5_cl_demo_app_097.js | 85 - core/srv/app/samples/z2ui5_cl_demo_app_098.js | 102 -- core/srv/app/samples/z2ui5_cl_demo_app_101.js | 64 - core/srv/app/samples/z2ui5_cl_demo_app_103.js | 102 -- core/srv/app/samples/z2ui5_cl_demo_app_104.js | 120 -- core/srv/app/samples/z2ui5_cl_demo_app_105.js | 33 - core/srv/app/samples/z2ui5_cl_demo_app_109.js | 90 - core/srv/app/samples/z2ui5_cl_demo_app_110.js | 76 - core/srv/app/samples/z2ui5_cl_demo_app_112.js | 33 - core/srv/app/samples/z2ui5_cl_demo_app_114.js | 56 - core/srv/app/samples/z2ui5_cl_demo_app_120.js | 54 - core/srv/app/samples/z2ui5_cl_demo_app_122.js | 110 -- core/srv/app/samples/z2ui5_cl_demo_app_125.js | 30 - core/srv/app/samples/z2ui5_cl_demo_app_126.js | 111 -- core/srv/app/samples/z2ui5_cl_demo_app_133.js | 55 - core/srv/app/samples/z2ui5_cl_demo_app_140.js | 53 - core/srv/app/samples/z2ui5_cl_demo_app_143.js | 78 - core/srv/app/samples/z2ui5_cl_demo_app_144.js | 63 - core/srv/app/samples/z2ui5_cl_demo_app_160.js | 67 - core/srv/app/samples/z2ui5_cl_demo_app_161.js | 64 - core/srv/app/samples/z2ui5_cl_demo_app_163.js | 48 - core/srv/app/samples/z2ui5_cl_demo_app_166.js | 46 - core/srv/app/samples/z2ui5_cl_demo_app_167.js | 44 - core/srv/app/samples/z2ui5_cl_demo_app_170.js | 96 - core/srv/app/samples/z2ui5_cl_demo_app_173.js | 59 - core/srv/app/samples/z2ui5_cl_demo_app_176.js | 47 - core/srv/app/samples/z2ui5_cl_demo_app_181.js | 73 - core/srv/app/samples/z2ui5_cl_demo_app_189.js | 51 - core/srv/app/samples/z2ui5_cl_demo_app_202.js | 46 - core/srv/app/samples/z2ui5_cl_demo_app_205.js | 85 - core/srv/app/samples/z2ui5_cl_demo_app_206.js | 32 - core/srv/app/samples/z2ui5_cl_demo_app_207.js | 75 - core/srv/app/samples/z2ui5_cl_demo_app_208.js | 63 - core/srv/app/samples/z2ui5_cl_demo_app_209.js | 73 - core/srv/app/samples/z2ui5_cl_demo_app_210.js | 34 - core/srv/app/samples/z2ui5_cl_demo_app_213.js | 26 - core/srv/app/samples/z2ui5_cl_demo_app_214.js | 32 - core/srv/app/samples/z2ui5_cl_demo_app_215.js | 27 - core/srv/app/samples/z2ui5_cl_demo_app_216.js | 33 - core/srv/app/samples/z2ui5_cl_demo_app_217.js | 29 - core/srv/app/samples/z2ui5_cl_demo_app_218.js | 27 - core/srv/app/samples/z2ui5_cl_demo_app_219.js | 55 - core/srv/app/samples/z2ui5_cl_demo_app_220.js | 46 - core/srv/app/samples/z2ui5_cl_demo_app_221.js | 36 - core/srv/app/samples/z2ui5_cl_demo_app_222.js | 36 - core/srv/app/samples/z2ui5_cl_demo_app_223.js | 36 - core/srv/app/samples/z2ui5_cl_demo_app_224.js | 36 - core/srv/app/samples/z2ui5_cl_demo_app_225.js | 79 - core/srv/app/samples/z2ui5_cl_demo_app_226.js | 107 -- core/srv/app/samples/z2ui5_cl_demo_app_227.js | 44 - core/srv/app/samples/z2ui5_cl_demo_app_228.js | 33 - core/srv/app/samples/z2ui5_cl_demo_app_229.js | 29 - core/srv/app/samples/z2ui5_cl_demo_app_230.js | 30 - core/srv/app/samples/z2ui5_cl_demo_app_232.js | 30 - core/srv/app/samples/z2ui5_cl_demo_app_233.js | 29 - core/srv/app/samples/z2ui5_cl_demo_app_234.js | 29 - core/srv/app/samples/z2ui5_cl_demo_app_235.js | 108 -- core/srv/app/samples/z2ui5_cl_demo_app_236.js | 35 - core/srv/app/samples/z2ui5_cl_demo_app_237.js | 65 - core/srv/app/samples/z2ui5_cl_demo_app_238.js | 52 - core/srv/app/samples/z2ui5_cl_demo_app_239.js | 78 - core/srv/app/samples/z2ui5_cl_demo_app_240.js | 120 -- core/srv/app/samples/z2ui5_cl_demo_app_241.js | 61 - core/srv/app/samples/z2ui5_cl_demo_app_242.js | 45 - core/srv/app/samples/z2ui5_cl_demo_app_243.js | 46 - core/srv/app/samples/z2ui5_cl_demo_app_245.js | 82 - core/srv/app/samples/z2ui5_cl_demo_app_246.js | 51 - core/srv/app/samples/z2ui5_cl_demo_app_247.js | 54 - core/srv/app/samples/z2ui5_cl_demo_app_248.js | 54 - core/srv/app/samples/z2ui5_cl_demo_app_249.js | 64 - core/srv/app/samples/z2ui5_cl_demo_app_250.js | 93 - core/srv/app/samples/z2ui5_cl_demo_app_251.js | 49 - core/srv/app/samples/z2ui5_cl_demo_app_252.js | 84 - core/srv/app/samples/z2ui5_cl_demo_app_257.js | 81 - core/srv/app/samples/z2ui5_cl_demo_app_258.js | 131 -- core/srv/app/samples/z2ui5_cl_demo_app_259.js | 116 -- core/srv/app/samples/z2ui5_cl_demo_app_260.js | 121 -- core/srv/app/samples/z2ui5_cl_demo_app_261.js | 50 - core/srv/app/samples/z2ui5_cl_demo_app_262.js | 54 - core/srv/app/samples/z2ui5_cl_demo_app_263.js | 49 - core/srv/app/samples/z2ui5_cl_demo_app_264.js | 58 - core/srv/app/samples/z2ui5_cl_demo_app_265.js | 43 - core/srv/app/samples/z2ui5_cl_demo_app_266.js | 102 -- core/srv/app/samples/z2ui5_cl_demo_app_267.js | 54 - core/srv/app/samples/z2ui5_cl_demo_app_270.js | 17 - core/srv/app/samples/z2ui5_cl_demo_app_271.js | 53 - core/srv/app/samples/z2ui5_cl_demo_app_272.js | 50 - core/srv/app/samples/z2ui5_cl_demo_app_273.js | 157 -- core/srv/app/samples/z2ui5_cl_demo_app_274.js | 68 - core/srv/app/samples/z2ui5_cl_demo_app_275.js | 50 - core/srv/app/samples/z2ui5_cl_demo_app_276.js | 57 - core/srv/app/samples/z2ui5_cl_demo_app_278.js | 66 - core/srv/app/samples/z2ui5_cl_demo_app_279.js | 78 - core/srv/app/samples/z2ui5_cl_demo_app_280.js | 93 - core/srv/app/samples/z2ui5_cl_demo_app_281.js | 108 -- core/srv/app/samples/z2ui5_cl_demo_app_282.js | 115 -- core/srv/app/samples/z2ui5_cl_demo_app_283.js | 62 - core/srv/app/samples/z2ui5_cl_demo_app_287.js | 56 - core/srv/app/samples/z2ui5_cl_demo_app_288.js | 93 - core/srv/app/samples/z2ui5_cl_demo_app_289.js | 68 - core/srv/app/samples/z2ui5_cl_demo_app_290.js | 104 -- core/srv/app/samples/z2ui5_cl_demo_app_291.js | 56 - core/srv/app/samples/z2ui5_cl_demo_app_292.js | 56 - core/srv/app/samples/z2ui5_cl_demo_app_293.js | 60 - core/srv/app/samples/z2ui5_cl_demo_app_294.js | 63 - core/srv/app/samples/z2ui5_cl_demo_app_295.js | 56 - core/srv/app/samples/z2ui5_cl_demo_app_296.js | 60 - core/srv/app/samples/z2ui5_cl_demo_app_297.js | 62 - core/srv/app/samples/z2ui5_cl_demo_app_298.js | 90 - core/srv/app/samples/z2ui5_cl_demo_app_299.js | 61 - core/srv/app/samples/z2ui5_cl_demo_app_300.js | 192 -- core/srv/app/samples/z2ui5_cl_demo_app_302.js | 68 - core/srv/app/samples/z2ui5_cl_demo_app_303.js | 248 --- core/srv/app/samples/z2ui5_cl_demo_app_306.js | 122 -- core/srv/app/samples/z2ui5_cl_demo_app_307.js | 87 - core/srv/app/samples/z2ui5_cl_demo_app_315.js | 67 - core/srv/app/samples/z2ui5_cl_demo_app_316.js | 54 - core/srv/app/samples/z2ui5_cl_demo_app_325.js | 56 - core/srv/app/samples/z2ui5_cl_demo_app_330.js | 224 --- core/srv/app/samples/z2ui5_cl_demo_app_352.js | 41 - core/srv/app/samples/z2ui5_cl_demo_app_361.js | 27 - core/srv/app/samples/z2ui5_cl_demo_app_362.js | 87 - core/srv/app/samples/z2ui5_cl_demo_app_363.js | 84 - core/srv/app/samples/z2ui5_cl_demo_app_366.js | 67 - core/srv/app/samples/z2ui5_cl_demo_app_367.js | 49 - core/srv/app/samples/z2ui5_cl_demo_app_368.js | 101 -- core/srv/app/samples/z2ui5_cl_demo_app_369.js | 64 - core/srv/app/samples/z2ui5_cl_demo_app_371.js | 50 - core/srv/app/samples/z2ui5_cl_demo_app_372.js | 88 - core/srv/app/samples/z2ui5_cl_demo_app_374.js | 62 - core/srv/app/samples/z2ui5_cl_demo_app_375.js | 103 -- core/srv/app/samples/z2ui5_cl_demo_app_376.js | 61 - core/srv/app/samples/z2ui5_cl_demo_app_377.js | 56 - core/srv/app/samples/z2ui5_cl_demo_app_378.js | 51 - core/srv/app/samples/z2ui5_cl_demo_app_379.js | 63 - core/srv/app/samples/z2ui5_cl_demo_app_381.js | 94 - core/srv/app/samples/z2ui5_cl_demo_app_382.js | 69 - core/srv/app/samples/z2ui5_cl_demo_app_421.js | 142 -- core/srv/app/samples/z2ui5_cl_demo_app_445.js | 71 - core/srv/app/samples/z2ui5_cl_demo_app_446.js | 51 - core/srv/app/samples/z2ui5_cl_demo_app_447.js | 52 - core/srv/app/samples/z2ui5_cl_demo_app_448.js | 42 - core/srv/app/samples/z2ui5_cl_demo_app_449.js | 40 - core/srv/app/samples/z2ui5_cl_demo_app_450.js | 36 - core/srv/app/samples/z2ui5_cl_demo_app_452.js | 85 - core/srv/app/samples/z2ui5_cl_demo_app_453.js | 59 - core/srv/app/samples/z2ui5_cl_demo_app_454.js | 50 - core/srv/app/samples/z2ui5_cl_demo_app_455.js | 33 - core/srv/app/samples/z2ui5_cl_demo_app_456.js | 36 - core/srv/app/samples/z2ui5_cl_demo_app_457.js | 31 - core/srv/app/samples/z2ui5_cl_demo_app_458.js | 32 - core/srv/app/samples/z2ui5_cl_demo_app_459.js | 67 - core/srv/app/samples/z2ui5_cl_demo_app_460.js | 30 - core/srv/app/samples/z2ui5_cl_demo_app_462.js | 53 - core/srv/app/samples/z2ui5_cl_demo_app_463.js | 51 - core/srv/app/samples/z2ui5_cl_demo_app_464.js | 47 - core/srv/app/samples/z2ui5_cl_demo_app_465.js | 42 - core/srv/app/samples/z2ui5_cl_demo_app_466.js | 29 - core/srv/app/samples/z2ui5_cl_demo_app_467.js | 33 - core/srv/app/samples/z2ui5_cl_demo_app_469.js | 26 - core/srv/app/samples/z2ui5_cl_demo_app_470.js | 72 - core/srv/app/samples/z2ui5_cl_demo_app_471.js | 79 - core/srv/app/samples/z2ui5_cl_demo_app_472.js | 55 - core/srv/app/samples/z2ui5_cl_demo_app_473.js | 38 - core/srv/app/samples/z2ui5_cl_demo_app_474.js | 60 - core/srv/app/samples/z2ui5_cl_demo_app_g00.js | 173 -- core/srv/app/samples/z2ui5_cl_smp_app_000.js | 380 ++++ core/srv/app/samples/z2ui5_cl_smp_app_004.js | 132 ++ core/srv/app/samples/z2ui5_cl_smp_app_006.js | 141 ++ core/srv/app/samples/z2ui5_cl_smp_app_008.js | 88 + core/srv/app/samples/z2ui5_cl_smp_app_009.js | 268 +++ core/srv/app/samples/z2ui5_cl_smp_app_011.js | 121 ++ core/srv/app/samples/z2ui5_cl_smp_app_012.js | 181 ++ core/srv/app/samples/z2ui5_cl_smp_app_019.js | 131 ++ .../srv/app/samples}/z2ui5_cl_smp_app_020.js | 37 +- core/srv/app/samples/z2ui5_cl_smp_app_024.js | 113 ++ core/srv/app/samples/z2ui5_cl_smp_app_025.js | 126 ++ core/srv/app/samples/z2ui5_cl_smp_app_026.js | 127 ++ core/srv/app/samples/z2ui5_cl_smp_app_027.js | 89 + core/srv/app/samples/z2ui5_cl_smp_app_028.js | 73 + core/srv/app/samples/z2ui5_cl_smp_app_045.js | 116 ++ core/srv/app/samples/z2ui5_cl_smp_app_047.js | 122 ++ core/srv/app/samples/z2ui5_cl_smp_app_048.js | 65 + core/srv/app/samples/z2ui5_cl_smp_app_050.js | 77 + .../srv/app/samples}/z2ui5_cl_smp_app_052.js | 113 +- core/srv/app/samples/z2ui5_cl_smp_app_053.js | 93 + core/srv/app/samples/z2ui5_cl_smp_app_059.js | 92 + core/srv/app/samples/z2ui5_cl_smp_app_061.js | 94 + .../srv/app/samples}/z2ui5_cl_smp_app_064.js | 44 +- core/srv/app/samples/z2ui5_cl_smp_app_065.js | 87 + core/srv/app/samples/z2ui5_cl_smp_app_067.js | 104 ++ core/srv/app/samples/z2ui5_cl_smp_app_070.js | 309 ++++ core/srv/app/samples/z2ui5_cl_smp_app_071.js | 83 + core/srv/app/samples/z2ui5_cl_smp_app_073.js | 57 + core/srv/app/samples/z2ui5_cl_smp_app_074.js | 111 ++ core/srv/app/samples/z2ui5_cl_smp_app_078.js | 92 + core/srv/app/samples/z2ui5_cl_smp_app_081.js | 166 ++ core/srv/app/samples/z2ui5_cl_smp_app_088.js | 92 + core/srv/app/samples/z2ui5_cl_smp_app_097.js | 143 ++ core/srv/app/samples/z2ui5_cl_smp_app_098.js | 172 ++ core/srv/app/samples/z2ui5_cl_smp_app_104.js | 158 ++ core/srv/app/samples/z2ui5_cl_smp_app_105.js | 57 + core/srv/app/samples/z2ui5_cl_smp_app_109.js | 154 ++ core/srv/app/samples/z2ui5_cl_smp_app_112.js | 55 + core/srv/app/samples/z2ui5_cl_smp_app_120.js | 96 + core/srv/app/samples/z2ui5_cl_smp_app_122.js | 183 ++ core/srv/app/samples/z2ui5_cl_smp_app_125.js | 50 + core/srv/app/samples/z2ui5_cl_smp_app_133.js | 86 + core/srv/app/samples/z2ui5_cl_smp_app_143.js | 120 ++ core/srv/app/samples/z2ui5_cl_smp_app_144.js | 87 + core/srv/app/samples/z2ui5_cl_smp_app_160.js | 108 ++ core/srv/app/samples/z2ui5_cl_smp_app_161.js | 93 + core/srv/app/samples/z2ui5_cl_smp_app_163.js | 87 + core/srv/app/samples/z2ui5_cl_smp_app_166.js | 61 + core/srv/app/samples/z2ui5_cl_smp_app_167.js | 69 + core/srv/app/samples/z2ui5_cl_smp_app_170.js | 134 ++ core/srv/app/samples/z2ui5_cl_smp_app_173.js | 91 + core/srv/app/samples/z2ui5_cl_smp_app_176.js | 78 + .../srv/app/samples}/z2ui5_cl_smp_app_186.js | 59 +- core/srv/app/samples/z2ui5_cl_smp_app_189.js | 76 + .../srv/app/samples}/z2ui5_cl_smp_app_197.js | 147 +- core/srv/app/samples/z2ui5_cl_smp_app_202.js | 73 + core/srv/app/samples/z2ui5_cl_smp_app_255.js | 122 ++ core/srv/app/samples/z2ui5_cl_smp_app_279.js | 120 ++ core/srv/app/samples/z2ui5_cl_smp_app_305.js | 76 + core/srv/app/samples/z2ui5_cl_smp_app_306.js | 126 ++ core/srv/app/samples/z2ui5_cl_smp_app_316.js | 119 ++ core/srv/app/samples/z2ui5_cl_smp_app_325.js | 109 ++ core/srv/app/samples/z2ui5_cl_smp_app_327.js | 117 ++ core/srv/app/samples/z2ui5_cl_smp_app_352.js | 62 + core/srv/app/samples/z2ui5_cl_smp_app_361.js | 63 + core/srv/app/samples/z2ui5_cl_smp_app_362.js | 127 ++ core/srv/app/samples/z2ui5_cl_smp_app_363.js | 109 ++ core/srv/app/samples/z2ui5_cl_smp_app_381.js | 147 ++ core/srv/app/samples/z2ui5_cl_smp_app_382.js | 112 ++ core/srv/app/samples/z2ui5_cl_smp_app_421.js | 193 ++ core/srv/app/samples/z2ui5_cl_smp_app_445.js | 131 ++ core/srv/app/samples/z2ui5_cl_smp_app_448.js | 65 + core/srv/app/samples/z2ui5_cl_smp_app_449.js | 61 + core/srv/app/samples/z2ui5_cl_smp_app_450.js | 68 + core/srv/app/samples/z2ui5_cl_smp_app_452.js | 147 ++ core/srv/app/samples/z2ui5_cl_smp_app_453.js | 106 ++ core/srv/app/samples/z2ui5_cl_smp_app_454.js | 81 + core/srv/app/samples/z2ui5_cl_smp_app_455.js | 56 + core/srv/app/samples/z2ui5_cl_smp_app_456.js | 60 + core/srv/app/samples/z2ui5_cl_smp_app_457.js | 49 + core/srv/app/samples/z2ui5_cl_smp_app_459.js | 100 ++ core/srv/app/samples/z2ui5_cl_smp_app_460.js | 47 + .../srv/app/samples}/z2ui5_cl_smp_app_461.js | 44 +- core/srv/app/samples/z2ui5_cl_smp_app_462.js | 81 + core/srv/app/samples/z2ui5_cl_smp_app_463.js | 72 + core/srv/app/samples/z2ui5_cl_smp_app_464.js | 76 + core/srv/app/samples/z2ui5_cl_smp_app_465.js | 64 + core/srv/app/samples/z2ui5_cl_smp_app_466.js | 47 + core/srv/app/samples/z2ui5_cl_smp_app_467.js | 66 + core/srv/app/samples/z2ui5_cl_smp_app_469.js | 45 + core/srv/app/samples/z2ui5_cl_smp_app_470.js | 105 ++ core/srv/app/samples/z2ui5_cl_smp_app_471.js | 106 ++ core/srv/app/samples/z2ui5_cl_smp_app_472.js | 81 + core/srv/app/samples/z2ui5_cl_smp_app_473.js | 61 + core/srv/app/samples/z2ui5_cl_smp_app_474.js | 92 + core/srv/app/samples/z2ui5_cl_smp_app_488.js | 91 + core/srv/app/samples/z2ui5_cl_smp_app_489.js | 65 + core/srv/app/samples/z2ui5_cl_smp_app_490.js | 76 + core/srv/app/samples/z2ui5_cl_smp_app_491.js | 50 + core/srv/app/samples/z2ui5_cl_smp_app_492.js | 59 + core/srv/app/samples/z2ui5_cl_smp_app_493.js | 37 + core/srv/app/samples/z2ui5_cl_smp_app_494.js | 59 + core/srv/app/samples/z2ui5_cl_smp_app_495.js | 70 + core/srv/app/samples/z2ui5_cl_smp_app_496.js | 85 + ...ple_context.js => z2ui5_cl_smp_context.js} | 330 ++-- core/srv/app/samples/z2ui5_cx_sample_error.js | 44 - .../srv/app/samples/z2ui5_cx_smp_error.js | 16 +- ...ontext.js => z2ui5_cl_ui5_util_context.js} | 566 +++--- .../srv/z2ui5/00/03/z2ui5_cl_ui5_util_http.js | 30 +- .../z2ui5/00/03/z2ui5_cl_ui5_util_json_fl.js | 6 +- core/srv/z2ui5/00/03/z2ui5_cl_util.js | 22 +- core/srv/z2ui5/00/03/z2ui5_cx_a2ui5_error.js | 44 - .../z2ui5/00/03/z2ui5_cx_ui5_util_error.js | 142 ++ .../srv/z2ui5/01/01/z2ui5_cl_ui5_srv_draft.js | 43 +- .../srv/z2ui5/01/02/z2ui5_cl_ui5_action.js | 78 +- ...l_core_app.js => z2ui5_cl_ui5_app_cont.js} | 44 +- ..._core_client.js => z2ui5_cl_ui5_client.js} | 77 +- core/srv/z2ui5/01/02/z2ui5_cl_ui5_frontend.js | 247 +++ ...ore_handler.js => z2ui5_cl_ui5_handler.js} | 52 +- .../srv/z2ui5/01/02/z2ui5_cl_ui5_srv_bind.js | 74 +- ...srv_event.js => z2ui5_cl_ui5_srv_event.js} | 12 +- ...srv_model.js => z2ui5_cl_ui5_srv_model.js} | 60 +- ...if_core_types.js => z2ui5_if_ui5_types.js} | 14 +- .../01/03/z2ui5_cl_app_developertool_xml.js | 11 - .../01/03/z2ui5_cl_app_developertools_js.js | 774 -------- .../z2ui5/01/03/z2ui5_cl_app_formatter_js.js | 159 -- core/srv/z2ui5/01/03/z2ui5_cl_app_preload.js | 87 - ..._app_app_js.js => z2ui5_cl_ui5f_app_js.js} | 8 +- ...pp_app_xml.js => z2ui5_cl_ui5f_app_xml.js} | 6 +- ...ate_js.js => z2ui5_cl_ui5f_appstate_js.js} | 4 +- .../z2ui5/01/03/z2ui5_cl_ui5f_browser_js.js | 323 ++++ .../z2ui5/01/03/z2ui5_cl_ui5f_campic_js.js | 4 +- .../z2ui5/01/03/z2ui5_cl_ui5f_camsel_js.js | 4 +- .../srv/z2ui5/01/03/z2ui5_cl_ui5f_comp_js.js | 8 +- .../z2ui5/01/03/z2ui5_cl_ui5f_console_js.js | 400 +++++ .../z2ui5/01/03/z2ui5_cl_ui5f_ctrlcall_js.js | 954 ++++++++++ .../z2ui5/01/03/z2ui5_cl_ui5f_devtools_js.js | 190 ++ ..._dirty_js.js => z2ui5_cl_ui5f_dirty_js.js} | 4 +- .../z2ui5/01/03/z2ui5_cl_ui5f_dtools_js.js | 1256 +++++++++++++ .../z2ui5/01/03/z2ui5_cl_ui5f_dtools_xml.js | 11 + ...view_js.js => z2ui5_cl_ui5f_errview_js.js} | 4 +- ...icon_js.js => z2ui5_cl_ui5f_favicon_js.js} | 4 +- .../srv/z2ui5/01/03/z2ui5_cl_ui5f_focus_js.js | 4 +- .../z2ui5/01/03/z2ui5_cl_ui5f_format_js.js | 170 ++ .../z2ui5/01/03/z2ui5_cl_ui5f_frontact_js.js | 4 +- ...ation_js.js => z2ui5_cl_ui5f_geoloc_js.js} | 4 +- .../z2ui5/01/03/z2ui5_cl_ui5f_history_js.js | 4 +- ...ex_html.js => z2ui5_cl_ui5f_index_html.js} | 14 +- ...pp_info_js.js => z2ui5_cl_ui5f_info_js.js} | 4 +- .../z2ui5/01/03/z2ui5_cl_ui5f_inspect_js.js | 1034 +++++++++++ .../z2ui5/01/03/z2ui5_cl_ui5f_launchpd_js.js | 102 ++ .../z2ui5/01/03/z2ui5_cl_ui5f_legacy_js.js | 126 ++ .../srv/z2ui5/01/03/z2ui5_cl_ui5f_lib_js.js | 4 +- .../z2ui5/01/03/z2ui5_cl_ui5f_liveedit_js.js | 126 ++ ...itle_js.js => z2ui5_cl_ui5f_lptitle_js.js} | 4 +- .../srv/z2ui5/01/03/z2ui5_cl_ui5f_manifest.js | 8 +- .../z2ui5/01/03/z2ui5_cl_ui5f_models_js.js | 8 +- .../z2ui5/01/03/z2ui5_cl_ui5f_msgmgr_js.js | 27 +- .../z2ui5/01/03/z2ui5_cl_ui5f_multiinp_js.js | 4 +- .../z2ui5/01/03/z2ui5_cl_ui5f_picker_js.js | 268 +++ core/srv/z2ui5/01/03/z2ui5_cl_ui5f_preload.js | 131 ++ .../z2ui5/01/03/z2ui5_cl_ui5f_recorder_js.js | 1024 +++++++++++ .../z2ui5/01/03/z2ui5_cl_ui5f_router_js.js | 417 +++++ .../z2ui5/01/03/z2ui5_cl_ui5f_scrfocus_js.js | 209 +++ ...lling_js.js => z2ui5_cl_ui5f_scroll_js.js} | 4 +- ...erver_js.js => z2ui5_cl_ui5f_server_js.js} | 8 +- .../z2ui5/01/03/z2ui5_cl_ui5f_session_js.js | 148 ++ .../z2ui5/01/03/z2ui5_cl_ui5f_shortcut_js.js | 200 +++ .../srv/z2ui5/01/03/z2ui5_cl_ui5f_slots_js.js | 417 +++++ .../z2ui5/01/03/z2ui5_cl_ui5f_smartinp_js.js | 4 +- ...rage_js.js => z2ui5_cl_ui5f_storage_js.js} | 4 +- .../z2ui5/01/03/z2ui5_cl_ui5f_style_css.js | 8 +- ..._timer_js.js => z2ui5_cl_ui5f_timer_js.js} | 4 +- ..._title_js.js => z2ui5_cl_ui5f_title_js.js} | 4 +- .../srv/z2ui5/01/03/z2ui5_cl_ui5f_tree_js.js | 4 +- ...eext_js.js => z2ui5_cl_ui5f_uitable_js.js} | 4 +- ...text_js.js => z2ui5_cl_ui5f_upldset_js.js} | 4 +- .../z2ui5/01/03/z2ui5_cl_ui5f_uploader_js.js | 4 +- .../srv/z2ui5/01/03/z2ui5_cl_ui5f_util_js.js | 4 +- .../z2ui5/01/03/z2ui5_cl_ui5f_variants_js.js | 319 ++++ ..._view1_js.js => z2ui5_cl_ui5f_view1_js.js} | 8 +- .../z2ui5/01/03/z2ui5_cl_ui5f_viewops_js.js | 334 ++++ ...ots_js.js => z2ui5_cl_ui5f_viewslot_js.js} | 4 +- .../z2ui5/01/03/z2ui5_cl_ui5f_websock_js.js | 213 +++ .../04/z2ui5_cl_ui5_app_hi_world.js} | 4 +- .../04/z2ui5_cl_ui5_app_start.js} | 46 +- .../04/z2ui5_cl_ui5_user_exit.js} | 48 +- ...andler.js => z2ui5_cl_ui5_http_handler.js} | 16 +- .../srv/z2ui5/02/z2ui5_cl_ui5_view_builder.js | 124 ++ core/srv/z2ui5/02/z2ui5_if_client.js | 5 +- core/srv/z2ui5/02/z2ui5_if_exit.js | 2 +- core/srv/z2ui5/99/02/z2ui5_cl_pop_data.js | 2 +- .../z2ui5/99/02/z2ui5_cl_pop_demo_output.js | 2 +- core/srv/z2ui5/99/02/z2ui5_cl_pop_error.js | 2 +- core/srv/z2ui5/99/02/z2ui5_cl_pop_file_dl.js | 10 +- core/srv/z2ui5/99/02/z2ui5_cl_pop_file_ul.js | 8 +- .../srv/z2ui5/99/02/z2ui5_cl_pop_get_range.js | 2 +- .../z2ui5/99/02/z2ui5_cl_pop_get_range_m.js | 6 +- core/srv/z2ui5/99/02/z2ui5_cl_pop_html.js | 2 +- .../z2ui5/99/02/z2ui5_cl_pop_image_editor.js | 4 +- .../srv/z2ui5/99/02/z2ui5_cl_pop_input_val.js | 4 +- .../srv/z2ui5/99/02/z2ui5_cl_pop_js_loader.js | 4 +- core/srv/z2ui5/99/02/z2ui5_cl_pop_messages.js | 8 +- core/srv/z2ui5/99/02/z2ui5_cl_pop_pdf.js | 4 +- core/srv/z2ui5/99/02/z2ui5_cl_pop_table.js | 2 +- core/srv/z2ui5/99/02/z2ui5_cl_pop_textedit.js | 4 +- .../z2ui5/99/02/z2ui5_cl_pop_to_confirm.js | 2 +- .../srv/z2ui5/99/02/z2ui5_cl_pop_to_inform.js | 2 +- .../srv/z2ui5/99/02/z2ui5_cl_pop_to_select.js | 2 +- .../z2ui5/99/02/z2ui5_pop_preferred_param.js | 7 +- core/srv/z2ui5/99/z2ui5_cl_http_handler.js | 11 + core/srv/z2ui5/engine.js | 24 +- docs/HANDOFF.md | 2 +- docs/transpiler-roadmap.md | 4 +- jest.config.js | 14 +- run/input/abap2UI5/UPSTREAM_COMMIT | 2 +- .../01/01/z2ui5_cl_ui5_srv_draft.clas.abap | 2 +- .../01/04/z2ui5_cl_ui5_app_start.clas.abap | 104 +- ..._cl_ui5_view_builder.clas.testclasses.abap | 10 +- run/input/app/UPSTREAM_COMMIT | 2 +- .../.claude/skills/view-chain-layout/SKILL.md | 177 ++ .../.github/abaplint/rename_test.jsonc | 13 +- .../samples/.github/badges/abap2ui5.json | 8 + .../.github/badges/check-abap2ui5.json | 8 + .../samples/.github/workflows/abap-cloud.yaml | 5 +- .../.github/workflows/check-abap2UI5.yaml | 79 +- .../samples/.github/workflows/check-docs.yaml | 17 +- .../.github/workflows/publish-702.yaml | 50 +- .../.github/workflows/publish-branch.yaml | 69 - .../.github/workflows/publish-cloud.yaml | 25 - .../workflows/publish-overview-apps.yaml | 2 +- run/input/samples/AGENTS.md | 933 +++++++--- run/input/samples/CLAUDE.md | 2 +- run/input/samples/README.md | 101 +- run/input/samples/UPSTREAM_COMMIT | 2 +- run/input/samples/abap2ui5lint-baseline.json | 146 ++ run/input/samples/abap2ui5lint.jsonc | 94 + run/input/samples/abaplint.jsonc | 32 +- run/input/samples/package-lock.json | 175 +- run/input/samples/package.json | 7 +- run/input/samples/scripts/chain-format.mjs | 257 +++ .../samples/scripts/check-agents-structure.js | 4 +- .../samples/scripts/check-strip-lists.js | 41 +- .../samples/scripts/generate-launchpad.js | 88 +- .../src/00/01/z2ui5_cl_smp_context.clas.abap | 96 +- run/input/samples/src/01/01/package.devc.xml | 10 - .../src/01/01/z2ui5_cl_smp_app_004.clas.abap | 132 -- .../src/01/01/z2ui5_cl_smp_app_008.clas.abap | 96 - .../src/01/01/z2ui5_cl_smp_app_009.clas.abap | 322 ---- .../src/01/01/z2ui5_cl_smp_app_012.clas.abap | 184 -- .../src/01/01/z2ui5_cl_smp_app_024.clas.abap | 120 -- .../src/01/01/z2ui5_cl_smp_app_025.clas.abap | 127 -- .../src/01/01/z2ui5_cl_smp_app_026.clas.abap | 140 -- .../src/01/01/z2ui5_cl_smp_app_027.clas.abap | 123 -- .../src/01/01/z2ui5_cl_smp_app_047.clas.abap | 111 -- .../src/01/01/z2ui5_cl_smp_app_050.clas.abap | 93 - .../src/01/01/z2ui5_cl_smp_app_061.clas.abap | 94 - .../src/01/01/z2ui5_cl_smp_app_065.clas.abap | 91 - .../src/01/01/z2ui5_cl_smp_app_067.clas.abap | 118 -- .../src/01/01/z2ui5_cl_smp_app_071.clas.abap | 87 - .../src/01/01/z2ui5_cl_smp_app_073.clas.abap | 74 - .../src/01/01/z2ui5_cl_smp_app_081.clas.abap | 194 -- .../src/01/01/z2ui5_cl_smp_app_097.clas.abap | 153 -- .../src/01/01/z2ui5_cl_smp_app_098.clas.abap | 190 -- .../src/01/01/z2ui5_cl_smp_app_104.clas.abap | 166 -- .../src/01/01/z2ui5_cl_smp_app_105.clas.abap | 59 - .../src/01/01/z2ui5_cl_smp_app_109.clas.abap | 160 -- .../src/01/01/z2ui5_cl_smp_app_112.clas.abap | 59 - .../src/01/01/z2ui5_cl_smp_app_122.clas.abap | 180 -- .../src/01/01/z2ui5_cl_smp_app_125.clas.abap | 55 - .../src/01/01/z2ui5_cl_smp_app_126.clas.abap | 168 -- .../src/01/01/z2ui5_cl_smp_app_133.clas.abap | 95 - .../src/01/01/z2ui5_cl_smp_app_144.clas.abap | 88 - .../src/01/01/z2ui5_cl_smp_app_161.clas.abap | 119 -- .../src/01/01/z2ui5_cl_smp_app_163.clas.abap | 98 - .../src/01/01/z2ui5_cl_smp_app_166.clas.abap | 94 - .../src/01/01/z2ui5_cl_smp_app_167.clas.abap | 85 - .../src/01/01/z2ui5_cl_smp_app_173.clas.abap | 113 -- .../src/01/01/z2ui5_cl_smp_app_176.clas.abap | 105 -- .../src/01/01/z2ui5_cl_smp_app_189.clas.abap | 87 - .../src/01/01/z2ui5_cl_smp_app_255.clas.abap | 161 -- .../src/01/01/z2ui5_cl_smp_app_305.clas.abap | 111 -- .../src/01/01/z2ui5_cl_smp_app_315.clas.abap | 80 - .../src/01/01/z2ui5_cl_smp_app_316.clas.abap | 158 -- .../src/01/01/z2ui5_cl_smp_app_325.clas.abap | 99 -- .../src/01/01/z2ui5_cl_smp_app_352.clas.abap | 83 - .../src/01/01/z2ui5_cl_smp_app_361.clas.abap | 70 - .../src/01/01/z2ui5_cl_smp_app_362.clas.abap | 156 -- .../src/01/01/z2ui5_cl_smp_app_363.clas.abap | 127 -- .../src/01/01/z2ui5_cl_smp_app_381.clas.abap | 176 -- .../src/01/01/z2ui5_cl_smp_app_382.clas.abap | 132 -- .../src/01/01/z2ui5_cl_smp_app_445.clas.abap | 165 -- .../src/01/01/z2ui5_cl_smp_app_446.clas.abap | 104 -- .../src/01/01/z2ui5_cl_smp_app_447.clas.abap | 116 -- .../src/01/01/z2ui5_cl_smp_app_450.clas.abap | 96 - .../src/01/01/z2ui5_cl_smp_app_452.clas.abap | 241 --- .../src/01/01/z2ui5_cl_smp_app_457.clas.abap | 69 - .../src/01/01/z2ui5_cl_smp_app_458.clas.abap | 69 - .../src/01/01/z2ui5_cl_smp_app_458.clas.xml | 16 - .../src/01/01/z2ui5_cl_smp_app_464.clas.abap | 86 - .../src/01/01/z2ui5_cl_smp_app_466.clas.abap | 74 - .../src/01/01/z2ui5_cl_smp_app_467.clas.abap | 98 - .../src/01/01/z2ui5_cl_smp_app_468.clas.abap | 114 -- .../src/01/01/z2ui5_cl_smp_app_468.clas.xml | 16 - .../src/01/01/z2ui5_cl_smp_app_472.clas.abap | 102 -- .../src/01/01/z2ui5_cl_smp_app_473.clas.abap | 80 - .../src/01/01/z2ui5_cl_smp_app_480.clas.abap | 113 -- .../src/01/01/z2ui5_cl_smp_app_480.clas.xml | 16 - run/input/samples/src/01/02/package.devc.xml | 10 - .../src/01/02/z2ui5_cl_smp_app_006.clas.abap | 166 -- .../src/01/02/z2ui5_cl_smp_app_011.clas.abap | 145 -- .../src/01/02/z2ui5_cl_smp_app_019.clas.abap | 132 -- .../src/01/02/z2ui5_cl_smp_app_045.clas.abap | 122 -- .../src/01/02/z2ui5_cl_smp_app_048.clas.abap | 100 -- .../src/01/02/z2ui5_cl_smp_app_053.clas.abap | 137 -- .../src/01/02/z2ui5_cl_smp_app_059.clas.abap | 141 -- .../src/01/02/z2ui5_cl_smp_app_070.clas.abap | 278 --- .../src/01/02/z2ui5_cl_smp_app_074.clas.abap | 123 -- .../src/01/02/z2ui5_cl_smp_app_078.clas.abap | 103 -- .../src/01/02/z2ui5_cl_smp_app_088.clas.abap | 97 - .../src/01/02/z2ui5_cl_smp_app_120.clas.abap | 110 -- .../src/01/02/z2ui5_cl_smp_app_143.clas.abap | 136 -- .../src/01/02/z2ui5_cl_smp_app_160.clas.abap | 159 -- .../src/01/02/z2ui5_cl_smp_app_170.clas.abap | 163 -- .../src/01/02/z2ui5_cl_smp_app_202.clas.abap | 100 -- .../src/01/02/z2ui5_cl_smp_app_279.clas.abap | 141 -- .../src/01/02/z2ui5_cl_smp_app_306.clas.abap | 211 --- .../src/01/02/z2ui5_cl_smp_app_448.clas.abap | 85 - .../src/01/02/z2ui5_cl_smp_app_449.clas.abap | 83 - .../samples/src/01/03/01/package.devc.xml | 10 - .../01/03/01/z2ui5_cl_smp_app_005.clas.abap | 60 - .../01/03/01/z2ui5_cl_smp_app_005.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_015.clas.abap | 46 - .../01/03/01/z2ui5_cl_smp_app_015.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_022.clas.abap | 233 --- .../01/03/01/z2ui5_cl_smp_app_022.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_038.clas.abap | 236 --- .../01/03/01/z2ui5_cl_smp_app_038.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_051.clas.abap | 71 - .../01/03/01/z2ui5_cl_smp_app_051.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_101.clas.abap | 158 -- .../01/03/01/z2ui5_cl_smp_app_101.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_110.clas.abap | 112 -- .../01/03/01/z2ui5_cl_smp_app_110.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_114.clas.abap | 127 -- .../01/03/01/z2ui5_cl_smp_app_114.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_140.clas.abap | 103 -- .../01/03/01/z2ui5_cl_smp_app_140.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_205.clas.abap | 156 -- .../01/03/01/z2ui5_cl_smp_app_205.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_206.clas.abap | 82 - .../01/03/01/z2ui5_cl_smp_app_206.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_207.clas.abap | 94 - .../01/03/01/z2ui5_cl_smp_app_207.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_208.clas.abap | 101 -- .../01/03/01/z2ui5_cl_smp_app_208.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_210.clas.abap | 84 - .../01/03/01/z2ui5_cl_smp_app_210.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_213.clas.abap | 55 - .../01/03/01/z2ui5_cl_smp_app_213.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_214.clas.abap | 59 - .../01/03/01/z2ui5_cl_smp_app_214.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_215.clas.abap | 57 - .../01/03/01/z2ui5_cl_smp_app_215.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_216.clas.abap | 53 - .../01/03/01/z2ui5_cl_smp_app_216.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_217.clas.abap | 56 - .../01/03/01/z2ui5_cl_smp_app_217.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_218.clas.abap | 55 - .../01/03/01/z2ui5_cl_smp_app_218.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_219.clas.abap | 81 - .../01/03/01/z2ui5_cl_smp_app_219.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_220.clas.abap | 141 -- .../01/03/01/z2ui5_cl_smp_app_220.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_221.clas.abap | 65 - .../01/03/01/z2ui5_cl_smp_app_221.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_222.clas.abap | 67 - .../01/03/01/z2ui5_cl_smp_app_222.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_223.clas.abap | 68 - .../01/03/01/z2ui5_cl_smp_app_223.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_224.clas.abap | 63 - .../01/03/01/z2ui5_cl_smp_app_224.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_225.clas.abap | 134 -- .../01/03/01/z2ui5_cl_smp_app_225.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_226.clas.abap | 115 -- .../01/03/01/z2ui5_cl_smp_app_226.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_227.clas.abap | 78 - .../01/03/01/z2ui5_cl_smp_app_227.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_228.clas.abap | 95 - .../01/03/01/z2ui5_cl_smp_app_228.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_229.clas.abap | 65 - .../01/03/01/z2ui5_cl_smp_app_229.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_230.clas.abap | 56 - .../01/03/01/z2ui5_cl_smp_app_230.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_232.clas.abap | 69 - .../01/03/01/z2ui5_cl_smp_app_232.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_233.clas.abap | 68 - .../01/03/01/z2ui5_cl_smp_app_233.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_234.clas.abap | 63 - .../01/03/01/z2ui5_cl_smp_app_234.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_235.clas.abap | 117 -- .../01/03/01/z2ui5_cl_smp_app_235.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_236.clas.abap | 121 -- .../01/03/01/z2ui5_cl_smp_app_236.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_237.clas.abap | 161 -- .../01/03/01/z2ui5_cl_smp_app_237.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_238.clas.abap | 134 -- .../01/03/01/z2ui5_cl_smp_app_238.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_239.clas.abap | 154 -- .../01/03/01/z2ui5_cl_smp_app_239.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_240.clas.abap | 151 -- .../01/03/01/z2ui5_cl_smp_app_240.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_241.clas.abap | 117 -- .../01/03/01/z2ui5_cl_smp_app_241.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_243.clas.abap | 61 - .../01/03/01/z2ui5_cl_smp_app_243.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_245.clas.abap | 136 -- .../01/03/01/z2ui5_cl_smp_app_245.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_246.clas.abap | 111 -- .../01/03/01/z2ui5_cl_smp_app_246.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_250.clas.abap | 160 -- .../01/03/01/z2ui5_cl_smp_app_250.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_251.clas.abap | 128 -- .../01/03/01/z2ui5_cl_smp_app_251.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_252.clas.abap | 123 -- .../01/03/01/z2ui5_cl_smp_app_252.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_257.clas.abap | 192 -- .../01/03/01/z2ui5_cl_smp_app_257.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_259.clas.abap | 196 -- .../01/03/01/z2ui5_cl_smp_app_259.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_261.clas.abap | 99 -- .../01/03/01/z2ui5_cl_smp_app_261.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_262.clas.abap | 129 -- .../01/03/01/z2ui5_cl_smp_app_262.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_263.clas.abap | 107 -- .../01/03/01/z2ui5_cl_smp_app_263.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_264.clas.abap | 128 -- .../01/03/01/z2ui5_cl_smp_app_264.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_266.clas.abap | 170 -- .../01/03/01/z2ui5_cl_smp_app_266.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_267.clas.abap | 121 -- .../01/03/01/z2ui5_cl_smp_app_267.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_271.clas.abap | 109 -- .../01/03/01/z2ui5_cl_smp_app_271.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_272.clas.abap | 121 -- .../01/03/01/z2ui5_cl_smp_app_272.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_273.clas.abap | 239 --- .../01/03/01/z2ui5_cl_smp_app_273.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_274.clas.abap | 130 -- .../01/03/01/z2ui5_cl_smp_app_274.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_275.clas.abap | 104 -- .../01/03/01/z2ui5_cl_smp_app_275.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_276.clas.abap | 113 -- .../01/03/01/z2ui5_cl_smp_app_276.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_278.clas.abap | 126 -- .../01/03/01/z2ui5_cl_smp_app_278.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_280.clas.abap | 167 -- .../01/03/01/z2ui5_cl_smp_app_280.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_281.clas.abap | 198 --- .../01/03/01/z2ui5_cl_smp_app_281.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_283.clas.abap | 141 -- .../01/03/01/z2ui5_cl_smp_app_283.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_287.clas.abap | 172 -- .../01/03/01/z2ui5_cl_smp_app_287.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_288.clas.abap | 190 -- .../01/03/01/z2ui5_cl_smp_app_288.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_289.clas.abap | 137 -- .../01/03/01/z2ui5_cl_smp_app_289.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_290.clas.abap | 173 -- .../01/03/01/z2ui5_cl_smp_app_290.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_291.clas.abap | 132 -- .../01/03/01/z2ui5_cl_smp_app_291.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_292.clas.abap | 115 -- .../01/03/01/z2ui5_cl_smp_app_292.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_293.clas.abap | 132 -- .../01/03/01/z2ui5_cl_smp_app_293.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_294.clas.abap | 141 -- .../01/03/01/z2ui5_cl_smp_app_294.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_295.clas.abap | 126 -- .../01/03/01/z2ui5_cl_smp_app_295.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_296.clas.abap | 110 -- .../01/03/01/z2ui5_cl_smp_app_296.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_297.clas.abap | 141 -- .../01/03/01/z2ui5_cl_smp_app_297.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_298.clas.abap | 203 --- .../01/03/01/z2ui5_cl_smp_app_298.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_299.clas.abap | 143 -- .../01/03/01/z2ui5_cl_smp_app_299.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_300.clas.abap | 422 ----- .../01/03/01/z2ui5_cl_smp_app_300.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_302.clas.abap | 134 -- .../01/03/01/z2ui5_cl_smp_app_302.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_366.clas.abap | 118 -- .../01/03/01/z2ui5_cl_smp_app_366.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_368.clas.abap | 181 -- .../01/03/01/z2ui5_cl_smp_app_368.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_369.clas.abap | 124 -- .../01/03/01/z2ui5_cl_smp_app_369.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_371.clas.abap | 105 -- .../01/03/01/z2ui5_cl_smp_app_371.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_372.clas.abap | 175 -- .../01/03/01/z2ui5_cl_smp_app_372.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_374.clas.abap | 122 -- .../01/03/01/z2ui5_cl_smp_app_374.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_375.clas.abap | 290 --- .../01/03/01/z2ui5_cl_smp_app_375.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_376.clas.abap | 124 -- .../01/03/01/z2ui5_cl_smp_app_376.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_377.clas.abap | 111 -- .../01/03/01/z2ui5_cl_smp_app_377.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_378.clas.abap | 102 -- .../01/03/01/z2ui5_cl_smp_app_378.clas.xml | 16 - .../01/03/01/z2ui5_cl_smp_app_379.clas.abap | 128 -- .../01/03/01/z2ui5_cl_smp_app_379.clas.xml | 16 - .../samples/src/01/03/02/package.devc.xml | 10 - .../01/03/02/z2ui5_cl_smp_app_017.clas.abap | 209 --- .../01/03/02/z2ui5_cl_smp_app_017.clas.xml | 16 - .../01/03/02/z2ui5_cl_smp_app_303.clas.abap | 433 ----- .../01/03/02/z2ui5_cl_smp_app_303.clas.xml | 16 - .../01/03/02/z2ui5_cl_smp_app_330.clas.abap | 371 ---- .../01/03/02/z2ui5_cl_smp_app_330.clas.xml | 16 - .../samples/src/01/03/03/package.devc.xml | 10 - .../01/03/03/z2ui5_cl_smp_app_030.clas.abap | 320 ---- .../01/03/03/z2ui5_cl_smp_app_030.clas.xml | 16 - .../01/03/03/z2ui5_cl_smp_app_181.clas.abap | 153 -- .../01/03/03/z2ui5_cl_smp_app_181.clas.xml | 16 - .../01/03/03/z2ui5_cl_smp_app_307.clas.abap | 290 --- .../01/03/03/z2ui5_cl_smp_app_307.clas.xml | 16 - .../samples/src/01/03/04/package.devc.xml | 10 - .../01/03/04/z2ui5_cl_smp_app_242.clas.abap | 101 -- .../01/03/04/z2ui5_cl_smp_app_242.clas.xml | 16 - .../01/03/04/z2ui5_cl_smp_app_282.clas.abap | 194 -- .../01/03/04/z2ui5_cl_smp_app_282.clas.xml | 16 - .../samples/src/01/03/05/package.devc.xml | 10 - .../01/03/05/z2ui5_cl_smp_app_103.clas.abap | 202 --- .../01/03/05/z2ui5_cl_smp_app_103.clas.xml | 16 - .../01/03/05/z2ui5_cl_smp_app_247.clas.abap | 99 -- .../01/03/05/z2ui5_cl_smp_app_247.clas.xml | 16 - .../01/03/05/z2ui5_cl_smp_app_248.clas.abap | 98 - .../01/03/05/z2ui5_cl_smp_app_248.clas.xml | 16 - .../01/03/05/z2ui5_cl_smp_app_249.clas.abap | 105 -- .../01/03/05/z2ui5_cl_smp_app_249.clas.xml | 16 - .../01/03/05/z2ui5_cl_smp_app_260.clas.abap | 136 -- .../01/03/05/z2ui5_cl_smp_app_260.clas.xml | 16 - .../01/03/05/z2ui5_cl_smp_app_367.clas.abap | 109 -- .../samples/src/01/03/06/package.devc.xml | 10 - .../01/03/06/z2ui5_cl_smp_app_209.clas.abap | 137 -- .../01/03/06/z2ui5_cl_smp_app_209.clas.xml | 16 - .../01/03/06/z2ui5_cl_smp_app_258.clas.abap | 197 --- .../01/03/06/z2ui5_cl_smp_app_258.clas.xml | 16 - .../samples/src/01/03/07/package.devc.xml | 10 - .../01/03/07/z2ui5_cl_smp_app_265.clas.abap | 106 -- .../01/03/07/z2ui5_cl_smp_app_265.clas.xml | 16 - .../samples/src/01/03/08/package.devc.xml | 10 - .../01/03/08/z2ui5_cl_smp_app_270.clas.abap | 37 - .../01/03/08/z2ui5_cl_smp_app_270.clas.xml | 16 - run/input/samples/src/01/03/package.devc.xml | 10 - run/input/samples/src/01/package.devc.xml | 2 +- .../src/01/z2ui5_cl_smp_app_000.clas.abap | 472 ----- .../src/01/z2ui5_cl_smp_app_004.clas.abap | 157 ++ .../01/{01 => }/z2ui5_cl_smp_app_004.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_006.clas.abap | 191 ++ .../01/{02 => }/z2ui5_cl_smp_app_006.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_008.clas.abap | 108 ++ .../01/{01 => }/z2ui5_cl_smp_app_008.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_009.clas.abap | 378 ++++ .../01/{01 => }/z2ui5_cl_smp_app_009.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_011.clas.abap | 162 ++ .../01/{02 => }/z2ui5_cl_smp_app_011.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_012.clas.abap | 221 +++ .../01/{01 => }/z2ui5_cl_smp_app_012.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_019.clas.abap | 169 ++ .../01/{02 => }/z2ui5_cl_smp_app_019.clas.xml | 2 +- .../{01 => }/z2ui5_cl_smp_app_020.clas.abap | 46 +- .../01/{01 => }/z2ui5_cl_smp_app_020.clas.xml | 0 .../src/01/z2ui5_cl_smp_app_024.clas.abap | 139 ++ .../01/{01 => }/z2ui5_cl_smp_app_024.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_025.clas.abap | 149 ++ .../01/{01 => }/z2ui5_cl_smp_app_025.clas.xml | 0 .../src/01/z2ui5_cl_smp_app_026.clas.abap | 163 ++ .../01/{01 => }/z2ui5_cl_smp_app_026.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_027.clas.abap | 142 ++ .../01/{01 => }/z2ui5_cl_smp_app_027.clas.xml | 2 +- .../{01 => }/z2ui5_cl_smp_app_028.clas.abap | 53 +- .../01/{01 => }/z2ui5_cl_smp_app_028.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_045.clas.abap | 152 ++ .../01/{02 => }/z2ui5_cl_smp_app_045.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_047.clas.abap | 145 ++ .../01/{01 => }/z2ui5_cl_smp_app_047.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_048.clas.abap | 100 ++ .../01/{02 => }/z2ui5_cl_smp_app_048.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_050.clas.abap | 118 ++ .../01/{01 => }/z2ui5_cl_smp_app_050.clas.xml | 2 +- .../{01 => }/z2ui5_cl_smp_app_052.clas.abap | 161 +- .../01/{01 => }/z2ui5_cl_smp_app_052.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_053.clas.abap | 164 ++ .../01/{02 => }/z2ui5_cl_smp_app_053.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_059.clas.abap | 168 ++ .../01/{02 => }/z2ui5_cl_smp_app_059.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_061.clas.abap | 116 ++ .../01/{01 => }/z2ui5_cl_smp_app_061.clas.xml | 2 +- .../{01 => }/z2ui5_cl_smp_app_064.clas.abap | 70 +- .../01/{01 => }/z2ui5_cl_smp_app_064.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_065.clas.abap | 111 ++ .../01/{01 => }/z2ui5_cl_smp_app_065.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_067.clas.abap | 148 ++ .../01/{01 => }/z2ui5_cl_smp_app_067.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_070.clas.abap | 375 ++++ .../01/{02 => }/z2ui5_cl_smp_app_070.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_071.clas.abap | 119 ++ .../01/{01 => }/z2ui5_cl_smp_app_071.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_073.clas.abap | 83 + .../01/{01 => }/z2ui5_cl_smp_app_073.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_074.clas.abap | 140 ++ .../01/{02 => }/z2ui5_cl_smp_app_074.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_078.clas.abap | 119 ++ .../01/{02 => }/z2ui5_cl_smp_app_078.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_081.clas.abap | 223 +++ .../01/{01 => }/z2ui5_cl_smp_app_081.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_088.clas.abap | 119 ++ .../01/{02 => }/z2ui5_cl_smp_app_088.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_097.clas.abap | 195 ++ .../01/{01 => }/z2ui5_cl_smp_app_097.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_098.clas.abap | 241 +++ .../01/{01 => }/z2ui5_cl_smp_app_098.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_104.clas.abap | 183 ++ .../01/{01 => }/z2ui5_cl_smp_app_104.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_105.clas.abap | 84 + .../01/{01 => }/z2ui5_cl_smp_app_105.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_109.clas.abap | 188 ++ .../01/{01 => }/z2ui5_cl_smp_app_109.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_112.clas.abap | 87 + .../01/{01 => }/z2ui5_cl_smp_app_112.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_120.clas.abap | 138 ++ .../01/{02 => }/z2ui5_cl_smp_app_120.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_122.clas.abap | 207 +++ .../01/{01 => }/z2ui5_cl_smp_app_122.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_125.clas.abap | 65 + .../01/{01 => }/z2ui5_cl_smp_app_125.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_133.clas.abap | 110 ++ .../01/{01 => }/z2ui5_cl_smp_app_133.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_143.clas.abap | 169 ++ .../01/{02 => }/z2ui5_cl_smp_app_143.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_144.clas.abap | 113 ++ .../01/{01 => }/z2ui5_cl_smp_app_144.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_160.clas.abap | 192 ++ .../01/{02 => }/z2ui5_cl_smp_app_160.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_161.clas.abap | 136 ++ .../01/{01 => }/z2ui5_cl_smp_app_161.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_163.clas.abap | 118 ++ .../01/{01 => }/z2ui5_cl_smp_app_163.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_166.clas.abap | 109 ++ .../01/{01 => }/z2ui5_cl_smp_app_166.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_167.clas.abap | 96 + .../01/{01 => }/z2ui5_cl_smp_app_167.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_170.clas.abap | 179 ++ .../01/{02 => }/z2ui5_cl_smp_app_170.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_173.clas.abap | 138 ++ .../01/{01 => }/z2ui5_cl_smp_app_173.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_176.clas.abap | 129 ++ .../01/{01 => }/z2ui5_cl_smp_app_176.clas.xml | 2 +- .../{01 => }/z2ui5_cl_smp_app_186.clas.abap | 78 +- .../01/{01 => }/z2ui5_cl_smp_app_186.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_189.clas.abap | 103 ++ .../01/{01 => }/z2ui5_cl_smp_app_189.clas.xml | 2 +- .../{01 => }/z2ui5_cl_smp_app_197.clas.abap | 210 ++- .../01/{01 => }/z2ui5_cl_smp_app_197.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_202.clas.abap | 125 ++ .../01/{02 => }/z2ui5_cl_smp_app_202.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_255.clas.abap | 206 +++ .../01/{01 => }/z2ui5_cl_smp_app_255.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_279.clas.abap | 153 ++ .../01/{02 => }/z2ui5_cl_smp_app_279.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_305.clas.abap | 135 ++ .../01/{01 => }/z2ui5_cl_smp_app_305.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_306.clas.abap | 194 ++ .../01/{02 => }/z2ui5_cl_smp_app_306.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_316.clas.abap | 189 ++ .../01/{01 => }/z2ui5_cl_smp_app_316.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_325.clas.abap | 127 ++ .../01/{01 => }/z2ui5_cl_smp_app_325.clas.xml | 2 +- .../{02 => }/z2ui5_cl_smp_app_327.clas.abap | 113 +- .../01/{02 => }/z2ui5_cl_smp_app_327.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_352.clas.abap | 93 + .../01/{01 => }/z2ui5_cl_smp_app_352.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_361.clas.abap | 84 + .../01/{01 => }/z2ui5_cl_smp_app_361.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_362.clas.abap | 187 ++ .../01/{01 => }/z2ui5_cl_smp_app_362.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_363.clas.abap | 151 ++ .../01/{01 => }/z2ui5_cl_smp_app_363.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_381.clas.abap | 212 +++ .../01/{01 => }/z2ui5_cl_smp_app_381.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_382.clas.abap | 148 ++ .../01/{01 => }/z2ui5_cl_smp_app_382.clas.xml | 2 +- .../{01 => }/z2ui5_cl_smp_app_421.clas.abap | 179 +- .../01/{01 => }/z2ui5_cl_smp_app_421.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_445.clas.abap | 194 ++ .../01/{01 => }/z2ui5_cl_smp_app_445.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_448.clas.abap | 96 + .../01/{02 => }/z2ui5_cl_smp_app_448.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_449.clas.abap | 92 + .../01/{02 => }/z2ui5_cl_smp_app_449.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_450.clas.abap | 104 ++ .../01/{01 => }/z2ui5_cl_smp_app_450.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_452.clas.abap | 249 +++ .../01/{01 => }/z2ui5_cl_smp_app_452.clas.xml | 2 +- .../{01 => }/z2ui5_cl_smp_app_453.clas.abap | 115 +- .../01/{01 => }/z2ui5_cl_smp_app_453.clas.xml | 2 +- .../{02 => }/z2ui5_cl_smp_app_454.clas.abap | 89 +- .../01/{02 => }/z2ui5_cl_smp_app_454.clas.xml | 2 +- .../{02 => }/z2ui5_cl_smp_app_455.clas.abap | 60 +- .../01/{02 => }/z2ui5_cl_smp_app_455.clas.xml | 2 +- .../{01 => }/z2ui5_cl_smp_app_456.clas.abap | 63 +- .../01/{01 => }/z2ui5_cl_smp_app_456.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_457.clas.abap | 78 + .../01/{01 => }/z2ui5_cl_smp_app_457.clas.xml | 2 +- .../{02 => }/z2ui5_cl_smp_app_459.clas.abap | 88 +- .../01/{02 => }/z2ui5_cl_smp_app_459.clas.xml | 2 +- .../{02 => }/z2ui5_cl_smp_app_460.clas.abap | 45 +- .../01/{02 => }/z2ui5_cl_smp_app_460.clas.xml | 2 +- .../{02 => }/z2ui5_cl_smp_app_461.clas.abap | 79 +- .../01/{02 => }/z2ui5_cl_smp_app_461.clas.xml | 2 +- .../{02 => }/z2ui5_cl_smp_app_462.clas.abap | 77 +- .../01/{02 => }/z2ui5_cl_smp_app_462.clas.xml | 2 +- .../{02 => }/z2ui5_cl_smp_app_463.clas.abap | 67 +- .../01/{02 => }/z2ui5_cl_smp_app_463.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_464.clas.abap | 99 ++ .../01/{01 => }/z2ui5_cl_smp_app_464.clas.xml | 2 +- .../{01 => }/z2ui5_cl_smp_app_465.clas.abap | 61 +- .../01/{01 => }/z2ui5_cl_smp_app_465.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_466.clas.abap | 80 + .../01/{01 => }/z2ui5_cl_smp_app_466.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_467.clas.abap | 119 ++ .../01/{01 => }/z2ui5_cl_smp_app_467.clas.xml | 2 +- .../{01 => }/z2ui5_cl_smp_app_469.clas.abap | 41 +- .../01/{01 => }/z2ui5_cl_smp_app_469.clas.xml | 0 .../{01 => }/z2ui5_cl_smp_app_470.clas.abap | 134 +- .../01/{01 => }/z2ui5_cl_smp_app_470.clas.xml | 2 +- .../{02 => }/z2ui5_cl_smp_app_471.clas.abap | 88 +- .../01/{02 => }/z2ui5_cl_smp_app_471.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_472.clas.abap | 113 ++ .../01/{01 => }/z2ui5_cl_smp_app_472.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_473.clas.abap | 94 + .../01/{01 => }/z2ui5_cl_smp_app_473.clas.xml | 2 +- .../{02 => }/z2ui5_cl_smp_app_474.clas.abap | 99 +- .../01/{02 => }/z2ui5_cl_smp_app_474.clas.xml | 2 +- .../src/01/z2ui5_cl_smp_app_488.clas.abap | 138 ++ .../src/01/z2ui5_cl_smp_app_488.clas.xml | 16 + .../src/01/z2ui5_cl_smp_app_489.clas.abap | 110 ++ .../src/01/z2ui5_cl_smp_app_489.clas.xml | 16 + .../src/01/z2ui5_cl_smp_app_490.clas.abap | 116 ++ ...clas.xml => z2ui5_cl_smp_app_490.clas.xml} | 4 +- .../src/01/z2ui5_cl_smp_app_491.clas.abap | 63 + ...clas.xml => z2ui5_cl_smp_app_491.clas.xml} | 4 +- .../src/01/z2ui5_cl_smp_app_492.clas.abap | 73 + ...clas.xml => z2ui5_cl_smp_app_492.clas.xml} | 4 +- .../src/01/z2ui5_cl_smp_app_493.clas.abap | 50 + ...clas.xml => z2ui5_cl_smp_app_493.clas.xml} | 4 +- .../src/01/z2ui5_cl_smp_app_494.clas.abap | 73 + .../src/01/z2ui5_cl_smp_app_494.clas.xml | 16 + .../src/01/z2ui5_cl_smp_app_495.clas.abap | 110 ++ .../src/01/z2ui5_cl_smp_app_495.clas.xml | 16 + .../src/01/z2ui5_cl_smp_app_496.clas.abap | 153 ++ ...clas.xml => z2ui5_cl_smp_app_496.clas.xml} | 4 +- .../src/z2ui5_cl_smp_app_000.clas.abap | 909 ++++++++++ .../{01 => }/z2ui5_cl_smp_app_000.clas.xml | 0 ...ontext.js => z2ui5_cl_ui5_util_context.js} | 566 +++--- .../abap2UI5/00/03/z2ui5_cl_ui5_util_http.js | 30 +- .../00/03/z2ui5_cl_ui5_util_json_fl.js | 6 +- .../abap2UI5/00/03/z2ui5_cx_ui5_util_error.js | 142 ++ .../abap2UI5/01/02/z2ui5_cl_ui5_frontend.js | 247 +++ .../01/03/z2ui5_cl_app_developertool_xml.js | 11 - .../01/03/z2ui5_cl_app_developertools_js.js | 774 -------- .../01/03/z2ui5_cl_app_formatter_js.js | 159 -- .../abap2UI5/01/03/z2ui5_cl_app_preload.js | 87 - .../01/03/z2ui5_cl_ui5f_browser_js.js | 323 ++++ .../01/03/z2ui5_cl_ui5f_console_js.js | 400 +++++ .../01/03/z2ui5_cl_ui5f_ctrlcall_js.js | 954 ++++++++++ .../01/03/z2ui5_cl_ui5f_devtools_js.js | 190 ++ .../abap2UI5/01/03/z2ui5_cl_ui5f_dtools_js.js | 1256 +++++++++++++ .../01/03/z2ui5_cl_ui5f_dtools_xml.js | 11 + .../abap2UI5/01/03/z2ui5_cl_ui5f_format_js.js | 170 ++ .../01/03/z2ui5_cl_ui5f_inspect_js.js | 1034 +++++++++++ .../01/03/z2ui5_cl_ui5f_launchpd_js.js | 102 ++ .../abap2UI5/01/03/z2ui5_cl_ui5f_legacy_js.js | 126 ++ .../01/03/z2ui5_cl_ui5f_liveedit_js.js | 126 ++ .../abap2UI5/01/03/z2ui5_cl_ui5f_msgmgr_js.js | 27 +- .../abap2UI5/01/03/z2ui5_cl_ui5f_picker_js.js | 268 +++ .../abap2UI5/01/03/z2ui5_cl_ui5f_preload.js | 131 ++ .../01/03/z2ui5_cl_ui5f_recorder_js.js | 1024 +++++++++++ .../abap2UI5/01/03/z2ui5_cl_ui5f_router_js.js | 417 +++++ .../01/03/z2ui5_cl_ui5f_scrfocus_js.js | 209 +++ .../01/03/z2ui5_cl_ui5f_session_js.js | 148 ++ .../01/03/z2ui5_cl_ui5f_shortcut_js.js | 200 +++ .../abap2UI5/01/03/z2ui5_cl_ui5f_slots_js.js | 417 +++++ .../01/03/z2ui5_cl_ui5f_variants_js.js | 319 ++++ .../01/03/z2ui5_cl_ui5f_viewops_js.js | 334 ++++ .../01/03/z2ui5_cl_ui5f_websock_js.js | 213 +++ .../abap2UI5/02/z2ui5_cl_ui5_view_builder.js | 124 ++ .../abap2UI5/99/02/z2ui5_cl_pop_error.js | 2 +- .../abap2UI5/99/02/z2ui5_cl_pop_file_dl.js | 10 +- .../abap2UI5/99/02/z2ui5_cl_pop_file_ul.js | 8 +- .../99/02/z2ui5_cl_pop_get_range_m.js | 6 +- .../abap2UI5/99/02/z2ui5_cl_pop_html.js | 2 +- .../99/02/z2ui5_cl_pop_image_editor.js | 4 +- .../abap2UI5/99/02/z2ui5_cl_pop_input_val.js | 4 +- .../abap2UI5/99/02/z2ui5_cl_pop_js_loader.js | 4 +- .../abap2UI5/99/02/z2ui5_cl_pop_messages.js | 8 +- run/output/abap2UI5/99/02/z2ui5_cl_pop_pdf.js | 4 +- .../abap2UI5/99/02/z2ui5_cl_pop_textedit.js | 4 +- .../abap2UI5/99/02/z2ui5_cl_pop_to_confirm.js | 2 +- .../abap2UI5/99/02/z2ui5_cl_pop_to_inform.js | 2 +- run/output/abap2UI5/transpile-report.json | 168 +- .../samples/00/01/z2ui5_cl_smp_context.js | 132 +- .../samples/00/01/z2ui5_cx_smp_error.js | 8 +- .../samples/01/01/z2ui5_cl_smp_app_004.js | 86 - .../samples/01/01/z2ui5_cl_smp_app_008.js | 69 - .../samples/01/01/z2ui5_cl_smp_app_009.js | 159 -- .../samples/01/01/z2ui5_cl_smp_app_012.js | 122 -- .../samples/01/01/z2ui5_cl_smp_app_024.js | 80 - .../samples/01/01/z2ui5_cl_smp_app_025.js | 89 - .../samples/01/01/z2ui5_cl_smp_app_026.js | 72 - .../samples/01/01/z2ui5_cl_smp_app_027.js | 61 - .../samples/01/01/z2ui5_cl_smp_app_028.js | 55 - .../samples/01/01/z2ui5_cl_smp_app_047.js | 66 - .../samples/01/01/z2ui5_cl_smp_app_050.js | 56 - .../samples/01/01/z2ui5_cl_smp_app_061.js | 67 - .../samples/01/01/z2ui5_cl_smp_app_065.js | 55 - .../samples/01/01/z2ui5_cl_smp_app_067.js | 56 - .../samples/01/01/z2ui5_cl_smp_app_071.js | 54 - .../samples/01/01/z2ui5_cl_smp_app_073.js | 39 - .../samples/01/01/z2ui5_cl_smp_app_081.js | 103 -- .../samples/01/01/z2ui5_cl_smp_app_097.js | 85 - .../samples/01/01/z2ui5_cl_smp_app_098.js | 102 -- .../samples/01/01/z2ui5_cl_smp_app_104.js | 120 -- .../samples/01/01/z2ui5_cl_smp_app_105.js | 33 - .../samples/01/01/z2ui5_cl_smp_app_109.js | 90 - .../samples/01/01/z2ui5_cl_smp_app_112.js | 33 - .../samples/01/01/z2ui5_cl_smp_app_122.js | 110 -- .../samples/01/01/z2ui5_cl_smp_app_125.js | 30 - .../samples/01/01/z2ui5_cl_smp_app_126.js | 111 -- .../samples/01/01/z2ui5_cl_smp_app_133.js | 55 - .../samples/01/01/z2ui5_cl_smp_app_144.js | 63 - .../samples/01/01/z2ui5_cl_smp_app_161.js | 64 - .../samples/01/01/z2ui5_cl_smp_app_163.js | 48 - .../samples/01/01/z2ui5_cl_smp_app_166.js | 46 - .../samples/01/01/z2ui5_cl_smp_app_167.js | 44 - .../samples/01/01/z2ui5_cl_smp_app_173.js | 59 - .../samples/01/01/z2ui5_cl_smp_app_176.js | 47 - .../samples/01/01/z2ui5_cl_smp_app_189.js | 51 - .../samples/01/01/z2ui5_cl_smp_app_255.js | 74 - .../samples/01/01/z2ui5_cl_smp_app_305.js | 46 - .../samples/01/01/z2ui5_cl_smp_app_315.js | 67 - .../samples/01/01/z2ui5_cl_smp_app_316.js | 54 - .../samples/01/01/z2ui5_cl_smp_app_325.js | 56 - .../samples/01/01/z2ui5_cl_smp_app_352.js | 41 - .../samples/01/01/z2ui5_cl_smp_app_361.js | 27 - .../samples/01/01/z2ui5_cl_smp_app_362.js | 87 - .../samples/01/01/z2ui5_cl_smp_app_363.js | 84 - .../samples/01/01/z2ui5_cl_smp_app_381.js | 94 - .../samples/01/01/z2ui5_cl_smp_app_382.js | 69 - .../samples/01/01/z2ui5_cl_smp_app_421.js | 142 -- .../samples/01/01/z2ui5_cl_smp_app_445.js | 71 - .../samples/01/01/z2ui5_cl_smp_app_446.js | 51 - .../samples/01/01/z2ui5_cl_smp_app_447.js | 52 - .../samples/01/01/z2ui5_cl_smp_app_450.js | 40 - .../samples/01/01/z2ui5_cl_smp_app_452.js | 85 - .../samples/01/01/z2ui5_cl_smp_app_453.js | 73 - .../samples/01/01/z2ui5_cl_smp_app_456.js | 36 - .../samples/01/01/z2ui5_cl_smp_app_457.js | 31 - .../samples/01/01/z2ui5_cl_smp_app_458.js | 32 - .../samples/01/01/z2ui5_cl_smp_app_464.js | 47 - .../samples/01/01/z2ui5_cl_smp_app_465.js | 42 - .../samples/01/01/z2ui5_cl_smp_app_466.js | 29 - .../samples/01/01/z2ui5_cl_smp_app_467.js | 33 - .../samples/01/01/z2ui5_cl_smp_app_468.js | 53 - .../samples/01/01/z2ui5_cl_smp_app_469.js | 28 - .../samples/01/01/z2ui5_cl_smp_app_470.js | 72 - .../samples/01/01/z2ui5_cl_smp_app_472.js | 55 - .../samples/01/01/z2ui5_cl_smp_app_473.js | 38 - .../samples/01/01/z2ui5_cl_smp_app_480.js | 53 - .../samples/01/02/z2ui5_cl_smp_app_006.js | 94 - .../samples/01/02/z2ui5_cl_smp_app_011.js | 79 - .../samples/01/02/z2ui5_cl_smp_app_019.js | 87 - .../samples/01/02/z2ui5_cl_smp_app_045.js | 77 - .../samples/01/02/z2ui5_cl_smp_app_048.js | 37 - .../samples/01/02/z2ui5_cl_smp_app_053.js | 72 - .../samples/01/02/z2ui5_cl_smp_app_059.js | 70 - .../samples/01/02/z2ui5_cl_smp_app_070.js | 210 --- .../samples/01/02/z2ui5_cl_smp_app_074.js | 91 - .../samples/01/02/z2ui5_cl_smp_app_078.js | 56 - .../samples/01/02/z2ui5_cl_smp_app_088.js | 56 - .../samples/01/02/z2ui5_cl_smp_app_120.js | 54 - .../samples/01/02/z2ui5_cl_smp_app_143.js | 78 - .../samples/01/02/z2ui5_cl_smp_app_160.js | 67 - .../samples/01/02/z2ui5_cl_smp_app_170.js | 96 - .../samples/01/02/z2ui5_cl_smp_app_202.js | 46 - .../samples/01/02/z2ui5_cl_smp_app_279.js | 78 - .../samples/01/02/z2ui5_cl_smp_app_306.js | 122 -- .../samples/01/02/z2ui5_cl_smp_app_327.js | 78 - .../samples/01/02/z2ui5_cl_smp_app_448.js | 42 - .../samples/01/02/z2ui5_cl_smp_app_449.js | 40 - .../samples/01/02/z2ui5_cl_smp_app_454.js | 50 - .../samples/01/02/z2ui5_cl_smp_app_455.js | 33 - .../samples/01/02/z2ui5_cl_smp_app_459.js | 67 - .../samples/01/02/z2ui5_cl_smp_app_460.js | 30 - .../samples/01/02/z2ui5_cl_smp_app_462.js | 53 - .../samples/01/02/z2ui5_cl_smp_app_463.js | 51 - .../samples/01/02/z2ui5_cl_smp_app_471.js | 79 - .../samples/01/02/z2ui5_cl_smp_app_474.js | 60 - .../samples/01/03/01/z2ui5_cl_smp_app_005.js | 30 - .../samples/01/03/01/z2ui5_cl_smp_app_015.js | 25 - .../samples/01/03/01/z2ui5_cl_smp_app_022.js | 90 - .../samples/01/03/01/z2ui5_cl_smp_app_038.js | 84 - .../samples/01/03/01/z2ui5_cl_smp_app_051.js | 32 - .../samples/01/03/01/z2ui5_cl_smp_app_101.js | 64 - .../samples/01/03/01/z2ui5_cl_smp_app_110.js | 76 - .../samples/01/03/01/z2ui5_cl_smp_app_114.js | 56 - .../samples/01/03/01/z2ui5_cl_smp_app_140.js | 53 - .../samples/01/03/01/z2ui5_cl_smp_app_205.js | 85 - .../samples/01/03/01/z2ui5_cl_smp_app_206.js | 32 - .../samples/01/03/01/z2ui5_cl_smp_app_207.js | 75 - .../samples/01/03/01/z2ui5_cl_smp_app_208.js | 63 - .../samples/01/03/01/z2ui5_cl_smp_app_210.js | 34 - .../samples/01/03/01/z2ui5_cl_smp_app_213.js | 26 - .../samples/01/03/01/z2ui5_cl_smp_app_214.js | 32 - .../samples/01/03/01/z2ui5_cl_smp_app_215.js | 27 - .../samples/01/03/01/z2ui5_cl_smp_app_216.js | 33 - .../samples/01/03/01/z2ui5_cl_smp_app_217.js | 29 - .../samples/01/03/01/z2ui5_cl_smp_app_218.js | 27 - .../samples/01/03/01/z2ui5_cl_smp_app_219.js | 55 - .../samples/01/03/01/z2ui5_cl_smp_app_220.js | 46 - .../samples/01/03/01/z2ui5_cl_smp_app_221.js | 36 - .../samples/01/03/01/z2ui5_cl_smp_app_222.js | 36 - .../samples/01/03/01/z2ui5_cl_smp_app_223.js | 36 - .../samples/01/03/01/z2ui5_cl_smp_app_224.js | 36 - .../samples/01/03/01/z2ui5_cl_smp_app_225.js | 79 - .../samples/01/03/01/z2ui5_cl_smp_app_226.js | 107 -- .../samples/01/03/01/z2ui5_cl_smp_app_227.js | 44 - .../samples/01/03/01/z2ui5_cl_smp_app_228.js | 33 - .../samples/01/03/01/z2ui5_cl_smp_app_229.js | 29 - .../samples/01/03/01/z2ui5_cl_smp_app_230.js | 30 - .../samples/01/03/01/z2ui5_cl_smp_app_232.js | 30 - .../samples/01/03/01/z2ui5_cl_smp_app_233.js | 29 - .../samples/01/03/01/z2ui5_cl_smp_app_234.js | 29 - .../samples/01/03/01/z2ui5_cl_smp_app_235.js | 108 -- .../samples/01/03/01/z2ui5_cl_smp_app_236.js | 35 - .../samples/01/03/01/z2ui5_cl_smp_app_237.js | 65 - .../samples/01/03/01/z2ui5_cl_smp_app_238.js | 52 - .../samples/01/03/01/z2ui5_cl_smp_app_239.js | 78 - .../samples/01/03/01/z2ui5_cl_smp_app_240.js | 120 -- .../samples/01/03/01/z2ui5_cl_smp_app_241.js | 61 - .../samples/01/03/01/z2ui5_cl_smp_app_243.js | 46 - .../samples/01/03/01/z2ui5_cl_smp_app_245.js | 82 - .../samples/01/03/01/z2ui5_cl_smp_app_246.js | 51 - .../samples/01/03/01/z2ui5_cl_smp_app_250.js | 93 - .../samples/01/03/01/z2ui5_cl_smp_app_251.js | 49 - .../samples/01/03/01/z2ui5_cl_smp_app_252.js | 84 - .../samples/01/03/01/z2ui5_cl_smp_app_257.js | 81 - .../samples/01/03/01/z2ui5_cl_smp_app_259.js | 116 -- .../samples/01/03/01/z2ui5_cl_smp_app_261.js | 50 - .../samples/01/03/01/z2ui5_cl_smp_app_262.js | 54 - .../samples/01/03/01/z2ui5_cl_smp_app_263.js | 49 - .../samples/01/03/01/z2ui5_cl_smp_app_264.js | 58 - .../samples/01/03/01/z2ui5_cl_smp_app_266.js | 102 -- .../samples/01/03/01/z2ui5_cl_smp_app_267.js | 54 - .../samples/01/03/01/z2ui5_cl_smp_app_271.js | 53 - .../samples/01/03/01/z2ui5_cl_smp_app_272.js | 50 - .../samples/01/03/01/z2ui5_cl_smp_app_273.js | 157 -- .../samples/01/03/01/z2ui5_cl_smp_app_274.js | 68 - .../samples/01/03/01/z2ui5_cl_smp_app_275.js | 50 - .../samples/01/03/01/z2ui5_cl_smp_app_276.js | 57 - .../samples/01/03/01/z2ui5_cl_smp_app_278.js | 66 - .../samples/01/03/01/z2ui5_cl_smp_app_280.js | 93 - .../samples/01/03/01/z2ui5_cl_smp_app_281.js | 108 -- .../samples/01/03/01/z2ui5_cl_smp_app_283.js | 62 - .../samples/01/03/01/z2ui5_cl_smp_app_287.js | 56 - .../samples/01/03/01/z2ui5_cl_smp_app_288.js | 93 - .../samples/01/03/01/z2ui5_cl_smp_app_289.js | 68 - .../samples/01/03/01/z2ui5_cl_smp_app_290.js | 104 -- .../samples/01/03/01/z2ui5_cl_smp_app_291.js | 56 - .../samples/01/03/01/z2ui5_cl_smp_app_292.js | 56 - .../samples/01/03/01/z2ui5_cl_smp_app_293.js | 60 - .../samples/01/03/01/z2ui5_cl_smp_app_294.js | 63 - .../samples/01/03/01/z2ui5_cl_smp_app_295.js | 56 - .../samples/01/03/01/z2ui5_cl_smp_app_296.js | 60 - .../samples/01/03/01/z2ui5_cl_smp_app_297.js | 62 - .../samples/01/03/01/z2ui5_cl_smp_app_298.js | 90 - .../samples/01/03/01/z2ui5_cl_smp_app_299.js | 61 - .../samples/01/03/01/z2ui5_cl_smp_app_300.js | 192 -- .../samples/01/03/01/z2ui5_cl_smp_app_302.js | 68 - .../samples/01/03/01/z2ui5_cl_smp_app_366.js | 67 - .../samples/01/03/01/z2ui5_cl_smp_app_368.js | 101 -- .../samples/01/03/01/z2ui5_cl_smp_app_369.js | 64 - .../samples/01/03/01/z2ui5_cl_smp_app_371.js | 50 - .../samples/01/03/01/z2ui5_cl_smp_app_372.js | 88 - .../samples/01/03/01/z2ui5_cl_smp_app_374.js | 62 - .../samples/01/03/01/z2ui5_cl_smp_app_375.js | 103 -- .../samples/01/03/01/z2ui5_cl_smp_app_376.js | 61 - .../samples/01/03/01/z2ui5_cl_smp_app_377.js | 56 - .../samples/01/03/01/z2ui5_cl_smp_app_378.js | 51 - .../samples/01/03/01/z2ui5_cl_smp_app_379.js | 63 - .../samples/01/03/02/z2ui5_cl_smp_app_017.js | 129 -- .../samples/01/03/02/z2ui5_cl_smp_app_303.js | 248 --- .../samples/01/03/02/z2ui5_cl_smp_app_330.js | 224 --- .../samples/01/03/03/z2ui5_cl_smp_app_030.js | 144 -- .../samples/01/03/03/z2ui5_cl_smp_app_181.js | 73 - .../samples/01/03/03/z2ui5_cl_smp_app_307.js | 87 - .../samples/01/03/04/z2ui5_cl_smp_app_242.js | 45 - .../samples/01/03/04/z2ui5_cl_smp_app_282.js | 115 -- .../samples/01/03/05/z2ui5_cl_smp_app_103.js | 102 -- .../samples/01/03/05/z2ui5_cl_smp_app_247.js | 54 - .../samples/01/03/05/z2ui5_cl_smp_app_248.js | 54 - .../samples/01/03/05/z2ui5_cl_smp_app_249.js | 64 - .../samples/01/03/05/z2ui5_cl_smp_app_260.js | 121 -- .../samples/01/03/05/z2ui5_cl_smp_app_367.js | 49 - .../samples/01/03/06/z2ui5_cl_smp_app_209.js | 73 - .../samples/01/03/06/z2ui5_cl_smp_app_258.js | 131 -- .../samples/01/03/07/z2ui5_cl_smp_app_265.js | 43 - .../samples/01/03/08/z2ui5_cl_smp_app_270.js | 17 - run/output/samples/01/z2ui5_cl_smp_app_000.js | 153 -- run/output/samples/01/z2ui5_cl_smp_app_004.js | 132 ++ run/output/samples/01/z2ui5_cl_smp_app_006.js | 141 ++ run/output/samples/01/z2ui5_cl_smp_app_008.js | 88 + run/output/samples/01/z2ui5_cl_smp_app_009.js | 268 +++ run/output/samples/01/z2ui5_cl_smp_app_011.js | 121 ++ run/output/samples/01/z2ui5_cl_smp_app_012.js | 181 ++ run/output/samples/01/z2ui5_cl_smp_app_019.js | 131 ++ run/output/samples/01/z2ui5_cl_smp_app_020.js | 62 + run/output/samples/01/z2ui5_cl_smp_app_024.js | 113 ++ run/output/samples/01/z2ui5_cl_smp_app_025.js | 126 ++ run/output/samples/01/z2ui5_cl_smp_app_026.js | 127 ++ run/output/samples/01/z2ui5_cl_smp_app_027.js | 89 + run/output/samples/01/z2ui5_cl_smp_app_028.js | 73 + run/output/samples/01/z2ui5_cl_smp_app_045.js | 116 ++ run/output/samples/01/z2ui5_cl_smp_app_047.js | 122 ++ run/output/samples/01/z2ui5_cl_smp_app_048.js | 65 + run/output/samples/01/z2ui5_cl_smp_app_050.js | 77 + .../output/samples/01/z2ui5_cl_smp_app_052.js | 117 +- run/output/samples/01/z2ui5_cl_smp_app_053.js | 93 + run/output/samples/01/z2ui5_cl_smp_app_059.js | 92 + run/output/samples/01/z2ui5_cl_smp_app_061.js | 94 + run/output/samples/01/z2ui5_cl_smp_app_064.js | 103 ++ run/output/samples/01/z2ui5_cl_smp_app_065.js | 87 + run/output/samples/01/z2ui5_cl_smp_app_067.js | 104 ++ run/output/samples/01/z2ui5_cl_smp_app_070.js | 309 ++++ run/output/samples/01/z2ui5_cl_smp_app_071.js | 83 + run/output/samples/01/z2ui5_cl_smp_app_073.js | 57 + run/output/samples/01/z2ui5_cl_smp_app_074.js | 111 ++ run/output/samples/01/z2ui5_cl_smp_app_078.js | 92 + run/output/samples/01/z2ui5_cl_smp_app_081.js | 166 ++ run/output/samples/01/z2ui5_cl_smp_app_088.js | 92 + run/output/samples/01/z2ui5_cl_smp_app_097.js | 143 ++ run/output/samples/01/z2ui5_cl_smp_app_098.js | 172 ++ run/output/samples/01/z2ui5_cl_smp_app_104.js | 158 ++ run/output/samples/01/z2ui5_cl_smp_app_105.js | 57 + run/output/samples/01/z2ui5_cl_smp_app_109.js | 154 ++ run/output/samples/01/z2ui5_cl_smp_app_112.js | 55 + run/output/samples/01/z2ui5_cl_smp_app_120.js | 96 + run/output/samples/01/z2ui5_cl_smp_app_122.js | 183 ++ run/output/samples/01/z2ui5_cl_smp_app_125.js | 50 + run/output/samples/01/z2ui5_cl_smp_app_133.js | 86 + run/output/samples/01/z2ui5_cl_smp_app_143.js | 120 ++ run/output/samples/01/z2ui5_cl_smp_app_144.js | 87 + run/output/samples/01/z2ui5_cl_smp_app_160.js | 108 ++ run/output/samples/01/z2ui5_cl_smp_app_161.js | 93 + run/output/samples/01/z2ui5_cl_smp_app_163.js | 87 + run/output/samples/01/z2ui5_cl_smp_app_166.js | 61 + run/output/samples/01/z2ui5_cl_smp_app_167.js | 69 + run/output/samples/01/z2ui5_cl_smp_app_170.js | 134 ++ run/output/samples/01/z2ui5_cl_smp_app_173.js | 91 + run/output/samples/01/z2ui5_cl_smp_app_176.js | 78 + run/output/samples/01/z2ui5_cl_smp_app_186.js | 82 + run/output/samples/01/z2ui5_cl_smp_app_189.js | 76 + .../output/samples/01/z2ui5_cl_smp_app_197.js | 151 +- run/output/samples/01/z2ui5_cl_smp_app_202.js | 73 + run/output/samples/01/z2ui5_cl_smp_app_255.js | 122 ++ run/output/samples/01/z2ui5_cl_smp_app_279.js | 120 ++ run/output/samples/01/z2ui5_cl_smp_app_305.js | 76 + run/output/samples/01/z2ui5_cl_smp_app_306.js | 126 ++ run/output/samples/01/z2ui5_cl_smp_app_316.js | 119 ++ run/output/samples/01/z2ui5_cl_smp_app_325.js | 109 ++ run/output/samples/01/z2ui5_cl_smp_app_327.js | 117 ++ run/output/samples/01/z2ui5_cl_smp_app_352.js | 62 + run/output/samples/01/z2ui5_cl_smp_app_361.js | 63 + run/output/samples/01/z2ui5_cl_smp_app_362.js | 127 ++ run/output/samples/01/z2ui5_cl_smp_app_363.js | 109 ++ run/output/samples/01/z2ui5_cl_smp_app_381.js | 147 ++ run/output/samples/01/z2ui5_cl_smp_app_382.js | 112 ++ run/output/samples/01/z2ui5_cl_smp_app_421.js | 193 ++ run/output/samples/01/z2ui5_cl_smp_app_445.js | 131 ++ run/output/samples/01/z2ui5_cl_smp_app_448.js | 65 + run/output/samples/01/z2ui5_cl_smp_app_449.js | 61 + run/output/samples/01/z2ui5_cl_smp_app_450.js | 68 + run/output/samples/01/z2ui5_cl_smp_app_452.js | 147 ++ run/output/samples/01/z2ui5_cl_smp_app_453.js | 106 ++ run/output/samples/01/z2ui5_cl_smp_app_454.js | 81 + run/output/samples/01/z2ui5_cl_smp_app_455.js | 56 + run/output/samples/01/z2ui5_cl_smp_app_456.js | 60 + run/output/samples/01/z2ui5_cl_smp_app_457.js | 49 + run/output/samples/01/z2ui5_cl_smp_app_459.js | 100 ++ run/output/samples/01/z2ui5_cl_smp_app_460.js | 47 + .../output/samples/01/z2ui5_cl_smp_app_461.js | 48 +- run/output/samples/01/z2ui5_cl_smp_app_462.js | 81 + run/output/samples/01/z2ui5_cl_smp_app_463.js | 72 + run/output/samples/01/z2ui5_cl_smp_app_464.js | 76 + run/output/samples/01/z2ui5_cl_smp_app_465.js | 64 + run/output/samples/01/z2ui5_cl_smp_app_466.js | 47 + run/output/samples/01/z2ui5_cl_smp_app_467.js | 66 + run/output/samples/01/z2ui5_cl_smp_app_469.js | 45 + run/output/samples/01/z2ui5_cl_smp_app_470.js | 105 ++ run/output/samples/01/z2ui5_cl_smp_app_471.js | 106 ++ run/output/samples/01/z2ui5_cl_smp_app_472.js | 81 + run/output/samples/01/z2ui5_cl_smp_app_473.js | 61 + run/output/samples/01/z2ui5_cl_smp_app_474.js | 92 + run/output/samples/01/z2ui5_cl_smp_app_488.js | 91 + run/output/samples/01/z2ui5_cl_smp_app_489.js | 65 + run/output/samples/01/z2ui5_cl_smp_app_490.js | 76 + run/output/samples/01/z2ui5_cl_smp_app_491.js | 50 + run/output/samples/01/z2ui5_cl_smp_app_492.js | 59 + run/output/samples/01/z2ui5_cl_smp_app_493.js | 37 + run/output/samples/01/z2ui5_cl_smp_app_494.js | 59 + run/output/samples/01/z2ui5_cl_smp_app_495.js | 70 + run/output/samples/01/z2ui5_cl_smp_app_496.js | 85 + run/output/samples/transpile-report.json | 1161 +++--------- run/output/samples/z2ui5_cl_smp_app_000.js | 380 ++++ run/output/tests/units-report.json | 68 +- .../tests/z2ui5_cl_a2ui5_context.units.js | 58 - run/output/tests/z2ui5_cl_ajson.units.js | 4 +- .../tests/z2ui5_cl_ajson_utilities.units.js | 2 +- .../tests/z2ui5_cl_app_startup.units.js | 19 - .../tests/z2ui5_cl_core_action.units.js | 226 --- .../tests/z2ui5_cl_core_handler.units.js | 266 --- .../tests/z2ui5_cl_core_srv_event.units.js | 201 --- run/output/tests/z2ui5_cl_exit.units.js | 67 - .../tests/z2ui5_cl_http_handler.units.js | 141 -- run/output/tests/z2ui5_cl_ui5_action.units.js | 283 +++ ...nits.js => z2ui5_cl_ui5_app_cont.units.js} | 49 +- ....js => z2ui5_cl_ui5_app_hi_world.units.js} | 12 +- .../tests/z2ui5_cl_ui5_app_start.units.js | 28 + ....units.js => z2ui5_cl_ui5_client.units.js} | 251 ++- .../tests/z2ui5_cl_ui5_frontend.units.js | 124 ++ .../tests/z2ui5_cl_ui5_handler.units.js | 597 +++++++ .../tests/z2ui5_cl_ui5_http_handler.units.js | 190 ++ ...nits.js => z2ui5_cl_ui5_srv_bind.units.js} | 79 +- ...its.js => z2ui5_cl_ui5_srv_draft.units.js} | 52 +- .../tests/z2ui5_cl_ui5_srv_event.units.js | 283 +++ ...its.js => z2ui5_cl_ui5_srv_model.units.js} | 254 ++- .../tests/z2ui5_cl_ui5_util_context.units.js | 338 ++++ ...its.js => z2ui5_cl_ui5_util_http.units.js} | 10 +- ....js => z2ui5_cl_ui5_util_json_fl.units.js} | 10 +- .../tests/z2ui5_cl_ui5_view_builder.units.js | 73 + .../tests/z2ui5_cx_a2ui5_error.units.js | 91 - .../tests/z2ui5_cx_ui5_util_error.units.js | 153 ++ scripts/abap2js.js | 204 ++- scripts/assemble-core.js | 2 +- scripts/mirror-input.js | 25 +- scripts/ratchet-update.js | 2 +- scripts/smoke-apps.js | 4 +- scripts/transpile-tests.js | 4 +- src/package.json | 24 +- src/srv/z2ui5/00/03/z2ui5_cl_util.js | 22 +- .../srv/z2ui5/01/01/z2ui5_cl_ui5_srv_draft.js | 43 +- .../srv/z2ui5/01/02/z2ui5_cl_ui5_action.js | 78 +- ...l_core_app.js => z2ui5_cl_ui5_app_cont.js} | 44 +- ..._core_client.js => z2ui5_cl_ui5_client.js} | 77 +- ...ore_handler.js => z2ui5_cl_ui5_handler.js} | 52 +- .../srv/z2ui5/01/02/z2ui5_cl_ui5_srv_bind.js | 74 +- ...srv_event.js => z2ui5_cl_ui5_srv_event.js} | 12 +- ...srv_model.js => z2ui5_cl_ui5_srv_model.js} | 60 +- ...if_core_types.js => z2ui5_if_ui5_types.js} | 14 +- ..._app_app_js.js => z2ui5_cl_ui5f_app_js.js} | 8 +- ...pp_app_xml.js => z2ui5_cl_ui5f_app_xml.js} | 6 +- ...ate_js.js => z2ui5_cl_ui5f_appstate_js.js} | 4 +- .../z2ui5/01/03/z2ui5_cl_ui5f_campic_js.js | 4 +- .../z2ui5/01/03/z2ui5_cl_ui5f_camsel_js.js | 4 +- .../srv/z2ui5/01/03/z2ui5_cl_ui5f_comp_js.js | 8 +- ..._dirty_js.js => z2ui5_cl_ui5f_dirty_js.js} | 4 +- ...view_js.js => z2ui5_cl_ui5f_errview_js.js} | 4 +- ...icon_js.js => z2ui5_cl_ui5f_favicon_js.js} | 4 +- .../srv/z2ui5/01/03/z2ui5_cl_ui5f_focus_js.js | 4 +- .../z2ui5/01/03/z2ui5_cl_ui5f_frontact_js.js | 4 +- ...ation_js.js => z2ui5_cl_ui5f_geoloc_js.js} | 4 +- .../z2ui5/01/03/z2ui5_cl_ui5f_history_js.js | 4 +- ...ex_html.js => z2ui5_cl_ui5f_index_html.js} | 14 +- ...pp_info_js.js => z2ui5_cl_ui5f_info_js.js} | 4 +- .../srv/z2ui5/01/03/z2ui5_cl_ui5f_lib_js.js | 4 +- ...itle_js.js => z2ui5_cl_ui5f_lptitle_js.js} | 4 +- .../srv/z2ui5/01/03/z2ui5_cl_ui5f_manifest.js | 8 +- .../z2ui5/01/03/z2ui5_cl_ui5f_models_js.js | 8 +- .../z2ui5/01/03/z2ui5_cl_ui5f_multiinp_js.js | 4 +- ...lling_js.js => z2ui5_cl_ui5f_scroll_js.js} | 4 +- ...erver_js.js => z2ui5_cl_ui5f_server_js.js} | 8 +- .../z2ui5/01/03/z2ui5_cl_ui5f_smartinp_js.js | 4 +- ...rage_js.js => z2ui5_cl_ui5f_storage_js.js} | 4 +- .../z2ui5/01/03/z2ui5_cl_ui5f_style_css.js | 8 +- ..._timer_js.js => z2ui5_cl_ui5f_timer_js.js} | 4 +- ..._title_js.js => z2ui5_cl_ui5f_title_js.js} | 4 +- .../srv/z2ui5/01/03/z2ui5_cl_ui5f_tree_js.js | 4 +- ...eext_js.js => z2ui5_cl_ui5f_uitable_js.js} | 4 +- ...text_js.js => z2ui5_cl_ui5f_upldset_js.js} | 4 +- .../z2ui5/01/03/z2ui5_cl_ui5f_uploader_js.js | 4 +- .../srv/z2ui5/01/03/z2ui5_cl_ui5f_util_js.js | 4 +- ..._view1_js.js => z2ui5_cl_ui5f_view1_js.js} | 8 +- ...ots_js.js => z2ui5_cl_ui5f_viewslot_js.js} | 4 +- .../04/z2ui5_cl_ui5_app_hi_world.js} | 4 +- .../04/z2ui5_cl_ui5_app_start.js} | 46 +- .../04/z2ui5_cl_ui5_user_exit.js} | 48 +- ...andler.js => z2ui5_cl_ui5_http_handler.js} | 16 +- src/srv/z2ui5/02/z2ui5_if_client.js | 5 +- src/srv/z2ui5/02/z2ui5_if_exit.js | 2 +- src/srv/z2ui5/99/02/z2ui5_cl_pop_data.js | 2 +- .../z2ui5/99/02/z2ui5_cl_pop_demo_output.js | 2 +- src/srv/z2ui5/99/02/z2ui5_cl_pop_get_range.js | 2 +- src/srv/z2ui5/99/02/z2ui5_cl_pop_table.js | 2 +- src/srv/z2ui5/99/02/z2ui5_cl_pop_to_select.js | 2 +- .../z2ui5/99/02/z2ui5_pop_preferred_param.js | 7 +- src/srv/z2ui5/99/z2ui5_cl_http_handler.js | 11 + src/srv/z2ui5/engine.js | 24 +- test/abap2js.test.js | 10 +- test/adapters.test.js | 24 +- test/apps-smoke.known-failures.json | 53 +- test/apps-smoke.test.js | 9 +- test/apps.test.js | 16 +- ...ap => z2ui5_cl_ui5_app_hi_world.clas.abap} | 4 +- test/sample-nav-scroll.test.js | 28 +- test/security.test.js | 10 +- test/upstream-units.known-failures.json | 480 ++++- test/web-store-registry.test.js | 12 +- test/z2ui5_cl_db.test.js | 22 +- ...nt.test.js => z2ui5_cl_ui5_client.test.js} | 12 +- ...r.test.js => z2ui5_cl_ui5_handler.test.js} | 26 +- test/z2ui5_if_app.test.js | 4 +- test/z2ui5_util_modules.test.js | 26 +- 1495 files changed, 69429 insertions(+), 66638 deletions(-) create mode 100644 adapters/web/shims/async_hooks.js create mode 100644 core/app/z2ui5/webapp/cc/Websocket.js delete mode 100644 core/app/z2ui5/webapp/core/DeveloperTools.fragment.xml delete mode 100644 core/app/z2ui5/webapp/core/DeveloperTools.js delete mode 100644 core/app/z2ui5/webapp/core/Messages.js create mode 100644 core/app/z2ui5/webapp/core/Router.js create mode 100644 core/app/z2ui5/webapp/core/ScrollFocus.js create mode 100644 core/app/z2ui5/webapp/core/Session.js create mode 100644 core/app/z2ui5/webapp/core/actions/Browser.js create mode 100644 core/app/z2ui5/webapp/core/actions/ControlCall.js create mode 100644 core/app/z2ui5/webapp/core/actions/Launchpad.js create mode 100644 core/app/z2ui5/webapp/core/actions/LegacyCustomJs.js create mode 100644 core/app/z2ui5/webapp/core/actions/Shortcuts.js create mode 100644 core/app/z2ui5/webapp/core/actions/Slots.js create mode 100644 core/app/z2ui5/webapp/core/actions/Variants.js create mode 100644 core/app/z2ui5/webapp/core/actions/ViewOps.js create mode 100644 core/app/z2ui5/webapp/devtools/Console.js create mode 100644 core/app/z2ui5/webapp/devtools/DevTools.js create mode 100644 core/app/z2ui5/webapp/devtools/DeveloperTools.fragment.xml create mode 100644 core/app/z2ui5/webapp/devtools/DeveloperTools.js create mode 100644 core/app/z2ui5/webapp/devtools/Inspect.js create mode 100644 core/app/z2ui5/webapp/devtools/LiveEdit.js create mode 100644 core/app/z2ui5/webapp/devtools/Picker.js create mode 100644 core/app/z2ui5/webapp/devtools/Recorder.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_004.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_005.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_006.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_008.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_009.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_011.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_012.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_015.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_017.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_019.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_020.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_022.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_024.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_025.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_026.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_027.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_028.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_030.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_038.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_045.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_047.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_048.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_051.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_053.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_059.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_061.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_064.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_065.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_067.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_070.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_071.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_073.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_074.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_078.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_081.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_088.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_097.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_098.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_101.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_103.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_104.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_105.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_109.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_110.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_112.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_114.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_120.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_122.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_125.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_126.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_133.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_140.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_143.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_144.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_160.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_161.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_163.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_166.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_167.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_170.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_173.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_176.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_181.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_189.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_202.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_205.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_206.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_207.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_208.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_209.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_210.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_213.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_214.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_215.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_216.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_217.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_218.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_219.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_220.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_221.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_222.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_223.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_224.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_225.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_226.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_227.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_228.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_229.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_230.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_232.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_233.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_234.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_235.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_236.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_237.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_238.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_239.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_240.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_241.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_242.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_243.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_245.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_246.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_247.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_248.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_249.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_250.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_251.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_252.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_257.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_258.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_259.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_260.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_261.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_262.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_263.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_264.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_265.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_266.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_267.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_270.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_271.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_272.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_273.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_274.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_275.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_276.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_278.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_279.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_280.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_281.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_282.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_283.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_287.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_288.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_289.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_290.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_291.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_292.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_293.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_294.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_295.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_296.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_297.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_298.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_299.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_300.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_302.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_303.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_306.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_307.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_315.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_316.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_325.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_330.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_352.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_361.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_362.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_363.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_366.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_367.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_368.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_369.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_371.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_372.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_374.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_375.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_376.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_377.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_378.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_379.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_381.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_382.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_421.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_445.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_446.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_447.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_448.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_449.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_450.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_452.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_453.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_454.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_455.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_456.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_457.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_458.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_459.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_460.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_462.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_463.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_464.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_465.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_466.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_467.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_469.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_470.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_471.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_472.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_473.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_474.js delete mode 100644 core/srv/app/samples/z2ui5_cl_demo_app_g00.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_000.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_004.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_006.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_008.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_009.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_011.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_012.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_019.js rename {run/output/samples/01/01 => core/srv/app/samples}/z2ui5_cl_smp_app_020.js (52%) create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_024.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_025.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_026.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_027.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_028.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_045.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_047.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_048.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_050.js rename {run/output/samples/01/01 => core/srv/app/samples}/z2ui5_cl_smp_app_052.js (63%) create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_053.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_059.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_061.js rename {run/output/samples/01/01 => core/srv/app/samples}/z2ui5_cl_smp_app_064.js (50%) create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_065.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_067.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_070.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_071.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_073.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_074.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_078.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_081.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_088.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_097.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_098.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_104.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_105.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_109.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_112.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_120.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_122.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_125.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_133.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_143.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_144.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_160.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_161.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_163.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_166.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_167.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_170.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_173.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_176.js rename {run/output/samples/01/01 => core/srv/app/samples}/z2ui5_cl_smp_app_186.js (51%) create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_189.js rename {run/output/samples/01/01 => core/srv/app/samples}/z2ui5_cl_smp_app_197.js (61%) create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_202.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_255.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_279.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_305.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_306.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_316.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_325.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_327.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_352.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_361.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_362.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_363.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_381.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_382.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_421.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_445.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_448.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_449.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_450.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_452.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_453.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_454.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_455.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_456.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_457.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_459.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_460.js rename {run/output/samples/01/02 => core/srv/app/samples}/z2ui5_cl_smp_app_461.js (58%) create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_462.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_463.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_464.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_465.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_466.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_467.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_469.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_470.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_471.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_472.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_473.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_474.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_488.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_489.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_490.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_491.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_492.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_493.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_494.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_495.js create mode 100644 core/srv/app/samples/z2ui5_cl_smp_app_496.js rename core/srv/app/samples/{z2ui5_cl_sample_context.js => z2ui5_cl_smp_context.js} (79%) delete mode 100644 core/srv/app/samples/z2ui5_cx_sample_error.js rename run/output/abap2UI5/00/03/z2ui5_cx_a2ui5_error.js => core/srv/app/samples/z2ui5_cx_smp_error.js (63%) rename core/srv/z2ui5/00/03/{z2ui5_cl_a2ui5_context.js => z2ui5_cl_ui5_util_context.js} (72%) rename run/output/abap2UI5/00/03/z2ui5_cl_a2ui5_http.js => core/srv/z2ui5/00/03/z2ui5_cl_ui5_util_http.js (93%) rename run/output/abap2UI5/00/03/z2ui5_cl_a2ui5_json_fltr.js => core/srv/z2ui5/00/03/z2ui5_cl_ui5_util_json_fl.js (88%) delete mode 100644 core/srv/z2ui5/00/03/z2ui5_cx_a2ui5_error.js create mode 100644 core/srv/z2ui5/00/03/z2ui5_cx_ui5_util_error.js rename src/srv/z2ui5/01/01/z2ui5_cl_core_srv_draft.js => core/srv/z2ui5/01/01/z2ui5_cl_ui5_srv_draft.js (87%) rename src/srv/z2ui5/01/02/z2ui5_cl_core_action.js => core/srv/z2ui5/01/02/z2ui5_cl_ui5_action.js (87%) rename core/srv/z2ui5/01/02/{z2ui5_cl_core_app.js => z2ui5_cl_ui5_app_cont.js} (84%) rename core/srv/z2ui5/01/02/{z2ui5_cl_core_client.js => z2ui5_cl_ui5_client.js} (93%) create mode 100644 core/srv/z2ui5/01/02/z2ui5_cl_ui5_frontend.js rename core/srv/z2ui5/01/02/{z2ui5_cl_core_handler.js => z2ui5_cl_ui5_handler.js} (94%) rename src/srv/z2ui5/01/02/z2ui5_cl_core_srv_bind.js => core/srv/z2ui5/01/02/z2ui5_cl_ui5_srv_bind.js (89%) rename core/srv/z2ui5/01/02/{z2ui5_cl_core_srv_event.js => z2ui5_cl_ui5_srv_event.js} (96%) rename core/srv/z2ui5/01/02/{z2ui5_cl_core_srv_model.js => z2ui5_cl_ui5_srv_model.js} (93%) rename core/srv/z2ui5/01/02/{z2ui5_if_core_types.js => z2ui5_if_ui5_types.js} (94%) delete mode 100644 core/srv/z2ui5/01/03/z2ui5_cl_app_developertool_xml.js delete mode 100644 core/srv/z2ui5/01/03/z2ui5_cl_app_developertools_js.js delete mode 100644 core/srv/z2ui5/01/03/z2ui5_cl_app_formatter_js.js delete mode 100644 core/srv/z2ui5/01/03/z2ui5_cl_app_preload.js rename core/srv/z2ui5/01/03/{z2ui5_cl_app_app_js.js => z2ui5_cl_ui5f_app_js.js} (76%) rename core/srv/z2ui5/01/03/{z2ui5_cl_app_app_xml.js => z2ui5_cl_ui5f_app_xml.js} (83%) rename core/srv/z2ui5/01/03/{z2ui5_cl_app_appstate_js.js => z2ui5_cl_ui5f_appstate_js.js} (99%) create mode 100644 core/srv/z2ui5/01/03/z2ui5_cl_ui5f_browser_js.js rename src/srv/z2ui5/01/03/z2ui5_cl_app_camerapicture_js.js => core/srv/z2ui5/01/03/z2ui5_cl_ui5f_campic_js.js (99%) rename src/srv/z2ui5/01/03/z2ui5_cl_app_cameraselector_js.js => core/srv/z2ui5/01/03/z2ui5_cl_ui5f_camsel_js.js (94%) rename src/srv/z2ui5/01/03/z2ui5_cl_app_component_js.js => core/srv/z2ui5/01/03/z2ui5_cl_ui5f_comp_js.js (72%) create mode 100644 core/srv/z2ui5/01/03/z2ui5_cl_ui5f_console_js.js create mode 100644 core/srv/z2ui5/01/03/z2ui5_cl_ui5f_ctrlcall_js.js create mode 100644 core/srv/z2ui5/01/03/z2ui5_cl_ui5f_devtools_js.js rename core/srv/z2ui5/01/03/{z2ui5_cl_app_dirty_js.js => z2ui5_cl_ui5f_dirty_js.js} (96%) create mode 100644 core/srv/z2ui5/01/03/z2ui5_cl_ui5f_dtools_js.js create mode 100644 core/srv/z2ui5/01/03/z2ui5_cl_ui5f_dtools_xml.js rename core/srv/z2ui5/01/03/{z2ui5_cl_app_errorview_js.js => z2ui5_cl_ui5f_errview_js.js} (99%) rename core/srv/z2ui5/01/03/{z2ui5_cl_app_favicon_js.js => z2ui5_cl_ui5f_favicon_js.js} (93%) rename src/srv/z2ui5/01/03/z2ui5_cl_app_focus_js.js => core/srv/z2ui5/01/03/z2ui5_cl_ui5f_focus_js.js (97%) create mode 100644 core/srv/z2ui5/01/03/z2ui5_cl_ui5f_format_js.js rename src/srv/z2ui5/01/03/z2ui5_cl_app_frontendaction_js.js => core/srv/z2ui5/01/03/z2ui5_cl_ui5f_frontact_js.js (99%) rename core/srv/z2ui5/01/03/{z2ui5_cl_app_geolocation_js.js => z2ui5_cl_ui5f_geoloc_js.js} (97%) rename src/srv/z2ui5/01/03/z2ui5_cl_app_history_js.js => core/srv/z2ui5/01/03/z2ui5_cl_ui5f_history_js.js (94%) rename core/srv/z2ui5/01/03/{z2ui5_cl_app_index_html.js => z2ui5_cl_ui5f_index_html.js} (84%) rename core/srv/z2ui5/01/03/{z2ui5_cl_app_info_js.js => z2ui5_cl_ui5f_info_js.js} (98%) create mode 100644 core/srv/z2ui5/01/03/z2ui5_cl_ui5f_inspect_js.js create mode 100644 core/srv/z2ui5/01/03/z2ui5_cl_ui5f_launchpd_js.js create mode 100644 core/srv/z2ui5/01/03/z2ui5_cl_ui5f_legacy_js.js rename src/srv/z2ui5/01/03/z2ui5_cl_app_lib_js.js => core/srv/z2ui5/01/03/z2ui5_cl_ui5f_lib_js.js (99%) create mode 100644 core/srv/z2ui5/01/03/z2ui5_cl_ui5f_liveedit_js.js rename core/srv/z2ui5/01/03/{z2ui5_cl_app_lptitle_js.js => z2ui5_cl_ui5f_lptitle_js.js} (96%) rename src/srv/z2ui5/01/03/z2ui5_cl_app_manifest_json.js => core/srv/z2ui5/01/03/z2ui5_cl_ui5f_manifest.js (72%) rename src/srv/z2ui5/01/03/z2ui5_cl_app_models_js.js => core/srv/z2ui5/01/03/z2ui5_cl_ui5f_models_js.js (74%) rename run/output/abap2UI5/01/03/z2ui5_cl_app_messagemanager_js.js => core/srv/z2ui5/01/03/z2ui5_cl_ui5f_msgmgr_js.js (81%) rename src/srv/z2ui5/01/03/z2ui5_cl_app_multiinputext_js.js => core/srv/z2ui5/01/03/z2ui5_cl_ui5f_multiinp_js.js (96%) create mode 100644 core/srv/z2ui5/01/03/z2ui5_cl_ui5f_picker_js.js create mode 100644 core/srv/z2ui5/01/03/z2ui5_cl_ui5f_preload.js create mode 100644 core/srv/z2ui5/01/03/z2ui5_cl_ui5f_recorder_js.js create mode 100644 core/srv/z2ui5/01/03/z2ui5_cl_ui5f_router_js.js create mode 100644 core/srv/z2ui5/01/03/z2ui5_cl_ui5f_scrfocus_js.js rename core/srv/z2ui5/01/03/{z2ui5_cl_app_scrolling_js.js => z2ui5_cl_ui5f_scroll_js.js} (98%) rename core/srv/z2ui5/01/03/{z2ui5_cl_app_server_js.js => z2ui5_cl_ui5f_server_js.js} (74%) create mode 100644 core/srv/z2ui5/01/03/z2ui5_cl_ui5f_session_js.js create mode 100644 core/srv/z2ui5/01/03/z2ui5_cl_ui5f_shortcut_js.js create mode 100644 core/srv/z2ui5/01/03/z2ui5_cl_ui5f_slots_js.js rename src/srv/z2ui5/01/03/z2ui5_cl_app_smartmultiinpu_js.js => core/srv/z2ui5/01/03/z2ui5_cl_ui5f_smartinp_js.js (98%) rename core/srv/z2ui5/01/03/{z2ui5_cl_app_storage_js.js => z2ui5_cl_ui5f_storage_js.js} (97%) rename src/srv/z2ui5/01/03/z2ui5_cl_app_style_css.js => core/srv/z2ui5/01/03/z2ui5_cl_ui5f_style_css.js (73%) rename core/srv/z2ui5/01/03/{z2ui5_cl_app_timer_js.js => z2ui5_cl_ui5f_timer_js.js} (97%) rename core/srv/z2ui5/01/03/{z2ui5_cl_app_title_js.js => z2ui5_cl_ui5f_title_js.js} (91%) rename src/srv/z2ui5/01/03/z2ui5_cl_app_tree_js.js => core/srv/z2ui5/01/03/z2ui5_cl_ui5f_tree_js.js (97%) rename core/srv/z2ui5/01/03/{z2ui5_cl_app_uitableext_js.js => z2ui5_cl_ui5f_uitable_js.js} (99%) rename core/srv/z2ui5/01/03/{z2ui5_cl_app_uploadsetext_js.js => z2ui5_cl_ui5f_upldset_js.js} (97%) rename src/srv/z2ui5/01/03/z2ui5_cl_app_fileuploader_js.js => core/srv/z2ui5/01/03/z2ui5_cl_ui5f_uploader_js.js (98%) rename src/srv/z2ui5/01/03/z2ui5_cl_app_util_js.js => core/srv/z2ui5/01/03/z2ui5_cl_ui5f_util_js.js (95%) create mode 100644 core/srv/z2ui5/01/03/z2ui5_cl_ui5f_variants_js.js rename core/srv/z2ui5/01/03/{z2ui5_cl_app_view1_js.js => z2ui5_cl_ui5f_view1_js.js} (75%) create mode 100644 core/srv/z2ui5/01/03/z2ui5_cl_ui5f_viewops_js.js rename core/srv/z2ui5/01/03/{z2ui5_cl_app_viewslots_js.js => z2ui5_cl_ui5f_viewslot_js.js} (98%) create mode 100644 core/srv/z2ui5/01/03/z2ui5_cl_ui5f_websock_js.js rename core/srv/z2ui5/{02/z2ui5_cl_app_hello_world.js => 01/04/z2ui5_cl_ui5_app_hi_world.js} (88%) rename core/srv/z2ui5/{02/z2ui5_cl_app_startup.js => 01/04/z2ui5_cl_ui5_app_start.js} (88%) rename core/srv/z2ui5/{02/z2ui5_cl_exit.js => 01/04/z2ui5_cl_ui5_user_exit.js} (82%) rename core/srv/z2ui5/02/{z2ui5_cl_http_handler.js => z2ui5_cl_ui5_http_handler.js} (92%) create mode 100644 core/srv/z2ui5/02/z2ui5_cl_ui5_view_builder.js create mode 100644 core/srv/z2ui5/99/z2ui5_cl_http_handler.js create mode 100644 run/input/samples/.claude/skills/view-chain-layout/SKILL.md create mode 100644 run/input/samples/.github/badges/abap2ui5.json create mode 100644 run/input/samples/.github/badges/check-abap2ui5.json delete mode 100644 run/input/samples/.github/workflows/publish-branch.yaml delete mode 100644 run/input/samples/.github/workflows/publish-cloud.yaml create mode 100644 run/input/samples/abap2ui5lint-baseline.json create mode 100644 run/input/samples/scripts/chain-format.mjs delete mode 100644 run/input/samples/src/01/01/package.devc.xml delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_004.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_008.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_009.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_012.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_024.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_025.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_026.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_027.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_047.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_050.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_061.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_065.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_067.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_071.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_073.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_081.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_097.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_098.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_104.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_105.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_109.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_112.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_122.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_125.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_126.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_133.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_144.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_161.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_163.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_166.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_167.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_173.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_176.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_189.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_255.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_305.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_315.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_316.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_325.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_352.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_361.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_362.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_363.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_381.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_382.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_445.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_446.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_447.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_450.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_452.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_457.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_458.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_458.clas.xml delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_464.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_466.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_467.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_468.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_468.clas.xml delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_472.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_473.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_480.clas.abap delete mode 100644 run/input/samples/src/01/01/z2ui5_cl_smp_app_480.clas.xml delete mode 100644 run/input/samples/src/01/02/package.devc.xml delete mode 100644 run/input/samples/src/01/02/z2ui5_cl_smp_app_006.clas.abap delete mode 100644 run/input/samples/src/01/02/z2ui5_cl_smp_app_011.clas.abap delete mode 100644 run/input/samples/src/01/02/z2ui5_cl_smp_app_019.clas.abap delete mode 100644 run/input/samples/src/01/02/z2ui5_cl_smp_app_045.clas.abap delete mode 100644 run/input/samples/src/01/02/z2ui5_cl_smp_app_048.clas.abap delete mode 100644 run/input/samples/src/01/02/z2ui5_cl_smp_app_053.clas.abap delete mode 100644 run/input/samples/src/01/02/z2ui5_cl_smp_app_059.clas.abap delete mode 100644 run/input/samples/src/01/02/z2ui5_cl_smp_app_070.clas.abap delete mode 100644 run/input/samples/src/01/02/z2ui5_cl_smp_app_074.clas.abap delete mode 100644 run/input/samples/src/01/02/z2ui5_cl_smp_app_078.clas.abap delete mode 100644 run/input/samples/src/01/02/z2ui5_cl_smp_app_088.clas.abap delete mode 100644 run/input/samples/src/01/02/z2ui5_cl_smp_app_120.clas.abap delete mode 100644 run/input/samples/src/01/02/z2ui5_cl_smp_app_143.clas.abap delete mode 100644 run/input/samples/src/01/02/z2ui5_cl_smp_app_160.clas.abap delete mode 100644 run/input/samples/src/01/02/z2ui5_cl_smp_app_170.clas.abap delete mode 100644 run/input/samples/src/01/02/z2ui5_cl_smp_app_202.clas.abap delete mode 100644 run/input/samples/src/01/02/z2ui5_cl_smp_app_279.clas.abap delete mode 100644 run/input/samples/src/01/02/z2ui5_cl_smp_app_306.clas.abap delete mode 100644 run/input/samples/src/01/02/z2ui5_cl_smp_app_448.clas.abap delete mode 100644 run/input/samples/src/01/02/z2ui5_cl_smp_app_449.clas.abap delete mode 100644 run/input/samples/src/01/03/01/package.devc.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_005.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_005.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_015.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_015.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_022.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_022.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_038.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_038.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_051.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_051.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_101.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_101.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_110.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_110.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_114.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_114.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_140.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_140.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_205.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_205.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_206.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_206.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_207.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_207.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_208.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_208.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_210.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_210.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_213.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_213.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_214.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_214.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_215.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_215.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_216.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_216.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_217.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_217.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_218.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_218.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_219.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_219.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_220.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_220.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_221.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_221.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_222.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_222.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_223.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_223.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_224.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_224.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_225.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_225.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_226.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_226.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_227.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_227.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_228.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_228.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_229.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_229.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_230.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_230.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_232.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_232.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_233.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_233.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_234.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_234.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_235.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_235.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_236.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_236.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_237.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_237.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_238.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_238.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_239.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_239.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_240.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_240.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_241.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_241.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_243.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_243.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_245.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_245.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_246.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_246.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_250.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_250.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_251.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_251.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_252.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_252.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_257.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_257.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_259.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_259.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_261.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_261.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_262.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_262.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_263.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_263.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_264.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_264.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_266.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_266.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_267.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_267.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_271.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_271.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_272.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_272.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_273.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_273.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_274.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_274.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_275.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_275.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_276.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_276.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_278.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_278.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_280.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_280.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_281.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_281.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_283.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_283.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_287.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_287.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_288.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_288.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_289.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_289.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_290.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_290.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_291.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_291.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_292.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_292.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_293.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_293.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_294.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_294.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_295.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_295.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_296.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_296.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_297.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_297.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_298.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_298.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_299.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_299.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_300.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_300.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_302.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_302.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_366.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_366.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_368.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_368.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_369.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_369.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_371.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_371.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_372.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_372.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_374.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_374.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_375.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_375.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_376.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_376.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_377.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_377.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_378.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_378.clas.xml delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_379.clas.abap delete mode 100644 run/input/samples/src/01/03/01/z2ui5_cl_smp_app_379.clas.xml delete mode 100644 run/input/samples/src/01/03/02/package.devc.xml delete mode 100644 run/input/samples/src/01/03/02/z2ui5_cl_smp_app_017.clas.abap delete mode 100644 run/input/samples/src/01/03/02/z2ui5_cl_smp_app_017.clas.xml delete mode 100644 run/input/samples/src/01/03/02/z2ui5_cl_smp_app_303.clas.abap delete mode 100644 run/input/samples/src/01/03/02/z2ui5_cl_smp_app_303.clas.xml delete mode 100644 run/input/samples/src/01/03/02/z2ui5_cl_smp_app_330.clas.abap delete mode 100644 run/input/samples/src/01/03/02/z2ui5_cl_smp_app_330.clas.xml delete mode 100644 run/input/samples/src/01/03/03/package.devc.xml delete mode 100644 run/input/samples/src/01/03/03/z2ui5_cl_smp_app_030.clas.abap delete mode 100644 run/input/samples/src/01/03/03/z2ui5_cl_smp_app_030.clas.xml delete mode 100644 run/input/samples/src/01/03/03/z2ui5_cl_smp_app_181.clas.abap delete mode 100644 run/input/samples/src/01/03/03/z2ui5_cl_smp_app_181.clas.xml delete mode 100644 run/input/samples/src/01/03/03/z2ui5_cl_smp_app_307.clas.abap delete mode 100644 run/input/samples/src/01/03/03/z2ui5_cl_smp_app_307.clas.xml delete mode 100644 run/input/samples/src/01/03/04/package.devc.xml delete mode 100644 run/input/samples/src/01/03/04/z2ui5_cl_smp_app_242.clas.abap delete mode 100644 run/input/samples/src/01/03/04/z2ui5_cl_smp_app_242.clas.xml delete mode 100644 run/input/samples/src/01/03/04/z2ui5_cl_smp_app_282.clas.abap delete mode 100644 run/input/samples/src/01/03/04/z2ui5_cl_smp_app_282.clas.xml delete mode 100644 run/input/samples/src/01/03/05/package.devc.xml delete mode 100644 run/input/samples/src/01/03/05/z2ui5_cl_smp_app_103.clas.abap delete mode 100644 run/input/samples/src/01/03/05/z2ui5_cl_smp_app_103.clas.xml delete mode 100644 run/input/samples/src/01/03/05/z2ui5_cl_smp_app_247.clas.abap delete mode 100644 run/input/samples/src/01/03/05/z2ui5_cl_smp_app_247.clas.xml delete mode 100644 run/input/samples/src/01/03/05/z2ui5_cl_smp_app_248.clas.abap delete mode 100644 run/input/samples/src/01/03/05/z2ui5_cl_smp_app_248.clas.xml delete mode 100644 run/input/samples/src/01/03/05/z2ui5_cl_smp_app_249.clas.abap delete mode 100644 run/input/samples/src/01/03/05/z2ui5_cl_smp_app_249.clas.xml delete mode 100644 run/input/samples/src/01/03/05/z2ui5_cl_smp_app_260.clas.abap delete mode 100644 run/input/samples/src/01/03/05/z2ui5_cl_smp_app_260.clas.xml delete mode 100644 run/input/samples/src/01/03/05/z2ui5_cl_smp_app_367.clas.abap delete mode 100644 run/input/samples/src/01/03/06/package.devc.xml delete mode 100644 run/input/samples/src/01/03/06/z2ui5_cl_smp_app_209.clas.abap delete mode 100644 run/input/samples/src/01/03/06/z2ui5_cl_smp_app_209.clas.xml delete mode 100644 run/input/samples/src/01/03/06/z2ui5_cl_smp_app_258.clas.abap delete mode 100644 run/input/samples/src/01/03/06/z2ui5_cl_smp_app_258.clas.xml delete mode 100644 run/input/samples/src/01/03/07/package.devc.xml delete mode 100644 run/input/samples/src/01/03/07/z2ui5_cl_smp_app_265.clas.abap delete mode 100644 run/input/samples/src/01/03/07/z2ui5_cl_smp_app_265.clas.xml delete mode 100644 run/input/samples/src/01/03/08/package.devc.xml delete mode 100644 run/input/samples/src/01/03/08/z2ui5_cl_smp_app_270.clas.abap delete mode 100644 run/input/samples/src/01/03/08/z2ui5_cl_smp_app_270.clas.xml delete mode 100644 run/input/samples/src/01/03/package.devc.xml delete mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_000.clas.abap create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_004.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_004.clas.xml (86%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_006.clas.abap rename run/input/samples/src/01/{02 => }/z2ui5_cl_smp_app_006.clas.xml (84%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_008.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_008.clas.xml (85%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_009.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_009.clas.xml (86%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_011.clas.abap rename run/input/samples/src/01/{02 => }/z2ui5_cl_smp_app_011.clas.xml (86%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_012.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_012.clas.xml (86%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_019.clas.abap rename run/input/samples/src/01/{02 => }/z2ui5_cl_smp_app_019.clas.xml (84%) rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_020.clas.abap (53%) rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_020.clas.xml (100%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_024.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_024.clas.xml (85%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_025.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_025.clas.xml (100%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_026.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_026.clas.xml (87%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_027.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_027.clas.xml (84%) rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_028.clas.abap (57%) rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_028.clas.xml (85%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_045.clas.abap rename run/input/samples/src/01/{02 => }/z2ui5_cl_smp_app_045.clas.xml (87%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_047.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_047.clas.xml (84%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_048.clas.abap rename run/input/samples/src/01/{02 => }/z2ui5_cl_smp_app_048.clas.xml (86%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_050.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_050.clas.xml (87%) rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_052.clas.abap (64%) rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_052.clas.xml (88%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_053.clas.abap rename run/input/samples/src/01/{02 => }/z2ui5_cl_smp_app_053.clas.xml (86%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_059.clas.abap rename run/input/samples/src/01/{02 => }/z2ui5_cl_smp_app_059.clas.xml (86%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_061.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_061.clas.xml (85%) rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_064.clas.abap (57%) rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_064.clas.xml (84%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_065.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_065.clas.xml (85%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_067.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_067.clas.xml (84%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_070.clas.abap rename run/input/samples/src/01/{02 => }/z2ui5_cl_smp_app_070.clas.xml (86%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_071.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_071.clas.xml (85%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_073.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_073.clas.xml (87%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_074.clas.abap rename run/input/samples/src/01/{02 => }/z2ui5_cl_smp_app_074.clas.xml (88%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_078.clas.abap rename run/input/samples/src/01/{02 => }/z2ui5_cl_smp_app_078.clas.xml (87%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_081.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_081.clas.xml (87%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_088.clas.abap rename run/input/samples/src/01/{02 => }/z2ui5_cl_smp_app_088.clas.xml (86%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_097.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_097.clas.xml (84%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_098.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_098.clas.xml (84%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_104.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_104.clas.xml (86%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_105.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_105.clas.xml (84%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_109.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_109.clas.xml (88%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_112.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_112.clas.xml (84%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_120.clas.abap rename run/input/samples/src/01/{02 => }/z2ui5_cl_smp_app_120.clas.xml (86%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_122.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_122.clas.xml (84%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_125.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_125.clas.xml (88%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_133.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_133.clas.xml (85%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_143.clas.abap rename run/input/samples/src/01/{02 => }/z2ui5_cl_smp_app_143.clas.xml (85%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_144.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_144.clas.xml (87%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_160.clas.abap rename run/input/samples/src/01/{02 => }/z2ui5_cl_smp_app_160.clas.xml (88%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_161.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_161.clas.xml (85%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_163.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_163.clas.xml (87%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_166.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_166.clas.xml (87%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_167.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_167.clas.xml (87%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_170.clas.abap rename run/input/samples/src/01/{02 => }/z2ui5_cl_smp_app_170.clas.xml (85%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_173.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_173.clas.xml (84%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_176.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_176.clas.xml (86%) rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_186.clas.abap (51%) rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_186.clas.xml (87%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_189.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_189.clas.xml (86%) rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_197.clas.abap (59%) rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_197.clas.xml (85%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_202.clas.abap rename run/input/samples/src/01/{02 => }/z2ui5_cl_smp_app_202.clas.xml (88%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_255.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_255.clas.xml (86%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_279.clas.abap rename run/input/samples/src/01/{02 => }/z2ui5_cl_smp_app_279.clas.xml (85%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_305.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_305.clas.xml (86%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_306.clas.abap rename run/input/samples/src/01/{02 => }/z2ui5_cl_smp_app_306.clas.xml (88%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_316.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_316.clas.xml (86%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_325.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_325.clas.xml (88%) rename run/input/samples/src/01/{02 => }/z2ui5_cl_smp_app_327.clas.abap (54%) rename run/input/samples/src/01/{02 => }/z2ui5_cl_smp_app_327.clas.xml (86%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_352.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_352.clas.xml (86%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_361.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_361.clas.xml (87%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_362.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_362.clas.xml (87%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_363.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_363.clas.xml (87%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_381.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_381.clas.xml (86%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_382.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_382.clas.xml (85%) rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_421.clas.abap (50%) rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_421.clas.xml (85%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_445.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_445.clas.xml (85%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_448.clas.abap rename run/input/samples/src/01/{02 => }/z2ui5_cl_smp_app_448.clas.xml (85%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_449.clas.abap rename run/input/samples/src/01/{02 => }/z2ui5_cl_smp_app_449.clas.xml (87%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_450.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_450.clas.xml (85%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_452.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_452.clas.xml (86%) rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_453.clas.abap (62%) rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_453.clas.xml (85%) rename run/input/samples/src/01/{02 => }/z2ui5_cl_smp_app_454.clas.abap (51%) rename run/input/samples/src/01/{02 => }/z2ui5_cl_smp_app_454.clas.xml (85%) rename run/input/samples/src/01/{02 => }/z2ui5_cl_smp_app_455.clas.abap (51%) rename run/input/samples/src/01/{02 => }/z2ui5_cl_smp_app_455.clas.xml (85%) rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_456.clas.abap (54%) rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_456.clas.xml (85%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_457.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_457.clas.xml (86%) rename run/input/samples/src/01/{02 => }/z2ui5_cl_smp_app_459.clas.abap (57%) rename run/input/samples/src/01/{02 => }/z2ui5_cl_smp_app_459.clas.xml (88%) rename run/input/samples/src/01/{02 => }/z2ui5_cl_smp_app_460.clas.abap (57%) rename run/input/samples/src/01/{02 => }/z2ui5_cl_smp_app_460.clas.xml (86%) rename run/input/samples/src/01/{02 => }/z2ui5_cl_smp_app_461.clas.abap (62%) rename run/input/samples/src/01/{02 => }/z2ui5_cl_smp_app_461.clas.xml (88%) rename run/input/samples/src/01/{02 => }/z2ui5_cl_smp_app_462.clas.abap (55%) rename run/input/samples/src/01/{02 => }/z2ui5_cl_smp_app_462.clas.xml (89%) rename run/input/samples/src/01/{02 => }/z2ui5_cl_smp_app_463.clas.abap (56%) rename run/input/samples/src/01/{02 => }/z2ui5_cl_smp_app_463.clas.xml (86%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_464.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_464.clas.xml (86%) rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_465.clas.abap (51%) rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_465.clas.xml (87%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_466.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_466.clas.xml (87%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_467.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_467.clas.xml (85%) rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_469.clas.abap (57%) rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_469.clas.xml (100%) rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_470.clas.abap (51%) rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_470.clas.xml (87%) rename run/input/samples/src/01/{02 => }/z2ui5_cl_smp_app_471.clas.abap (59%) rename run/input/samples/src/01/{02 => }/z2ui5_cl_smp_app_471.clas.xml (87%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_472.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_472.clas.xml (87%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_473.clas.abap rename run/input/samples/src/01/{01 => }/z2ui5_cl_smp_app_473.clas.xml (86%) rename run/input/samples/src/01/{02 => }/z2ui5_cl_smp_app_474.clas.abap (50%) rename run/input/samples/src/01/{02 => }/z2ui5_cl_smp_app_474.clas.xml (87%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_488.clas.abap create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_488.clas.xml create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_489.clas.abap create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_489.clas.xml create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_490.clas.abap rename run/input/samples/src/01/{03/05/z2ui5_cl_smp_app_367.clas.xml => z2ui5_cl_smp_app_490.clas.xml} (78%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_491.clas.abap rename run/input/samples/src/01/{01/z2ui5_cl_smp_app_126.clas.xml => z2ui5_cl_smp_app_491.clas.xml} (79%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_492.clas.abap rename run/input/samples/src/01/{01/z2ui5_cl_smp_app_315.clas.xml => z2ui5_cl_smp_app_492.clas.xml} (79%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_493.clas.abap rename run/input/samples/src/01/{01/z2ui5_cl_smp_app_446.clas.xml => z2ui5_cl_smp_app_493.clas.xml} (78%) create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_494.clas.abap create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_494.clas.xml create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_495.clas.abap create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_495.clas.xml create mode 100644 run/input/samples/src/01/z2ui5_cl_smp_app_496.clas.abap rename run/input/samples/src/01/{01/z2ui5_cl_smp_app_447.clas.xml => z2ui5_cl_smp_app_496.clas.xml} (78%) create mode 100644 run/input/samples/src/z2ui5_cl_smp_app_000.clas.abap rename run/input/samples/src/{01 => }/z2ui5_cl_smp_app_000.clas.xml (100%) rename run/output/abap2UI5/00/03/{z2ui5_cl_a2ui5_context.js => z2ui5_cl_ui5_util_context.js} (72%) rename core/srv/z2ui5/00/03/z2ui5_cl_a2ui5_http.js => run/output/abap2UI5/00/03/z2ui5_cl_ui5_util_http.js (93%) rename core/srv/z2ui5/00/03/z2ui5_cl_a2ui5_json_fltr.js => run/output/abap2UI5/00/03/z2ui5_cl_ui5_util_json_fl.js (88%) create mode 100644 run/output/abap2UI5/00/03/z2ui5_cx_ui5_util_error.js create mode 100644 run/output/abap2UI5/01/02/z2ui5_cl_ui5_frontend.js delete mode 100644 run/output/abap2UI5/01/03/z2ui5_cl_app_developertool_xml.js delete mode 100644 run/output/abap2UI5/01/03/z2ui5_cl_app_developertools_js.js delete mode 100644 run/output/abap2UI5/01/03/z2ui5_cl_app_formatter_js.js delete mode 100644 run/output/abap2UI5/01/03/z2ui5_cl_app_preload.js create mode 100644 run/output/abap2UI5/01/03/z2ui5_cl_ui5f_browser_js.js create mode 100644 run/output/abap2UI5/01/03/z2ui5_cl_ui5f_console_js.js create mode 100644 run/output/abap2UI5/01/03/z2ui5_cl_ui5f_ctrlcall_js.js create mode 100644 run/output/abap2UI5/01/03/z2ui5_cl_ui5f_devtools_js.js create mode 100644 run/output/abap2UI5/01/03/z2ui5_cl_ui5f_dtools_js.js create mode 100644 run/output/abap2UI5/01/03/z2ui5_cl_ui5f_dtools_xml.js create mode 100644 run/output/abap2UI5/01/03/z2ui5_cl_ui5f_format_js.js create mode 100644 run/output/abap2UI5/01/03/z2ui5_cl_ui5f_inspect_js.js create mode 100644 run/output/abap2UI5/01/03/z2ui5_cl_ui5f_launchpd_js.js create mode 100644 run/output/abap2UI5/01/03/z2ui5_cl_ui5f_legacy_js.js create mode 100644 run/output/abap2UI5/01/03/z2ui5_cl_ui5f_liveedit_js.js rename core/srv/z2ui5/01/03/z2ui5_cl_app_messagemanager_js.js => run/output/abap2UI5/01/03/z2ui5_cl_ui5f_msgmgr_js.js (81%) create mode 100644 run/output/abap2UI5/01/03/z2ui5_cl_ui5f_picker_js.js create mode 100644 run/output/abap2UI5/01/03/z2ui5_cl_ui5f_preload.js create mode 100644 run/output/abap2UI5/01/03/z2ui5_cl_ui5f_recorder_js.js create mode 100644 run/output/abap2UI5/01/03/z2ui5_cl_ui5f_router_js.js create mode 100644 run/output/abap2UI5/01/03/z2ui5_cl_ui5f_scrfocus_js.js create mode 100644 run/output/abap2UI5/01/03/z2ui5_cl_ui5f_session_js.js create mode 100644 run/output/abap2UI5/01/03/z2ui5_cl_ui5f_shortcut_js.js create mode 100644 run/output/abap2UI5/01/03/z2ui5_cl_ui5f_slots_js.js create mode 100644 run/output/abap2UI5/01/03/z2ui5_cl_ui5f_variants_js.js create mode 100644 run/output/abap2UI5/01/03/z2ui5_cl_ui5f_viewops_js.js create mode 100644 run/output/abap2UI5/01/03/z2ui5_cl_ui5f_websock_js.js create mode 100644 run/output/abap2UI5/02/z2ui5_cl_ui5_view_builder.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_004.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_008.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_009.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_012.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_024.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_025.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_026.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_027.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_028.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_047.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_050.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_061.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_065.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_067.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_071.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_073.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_081.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_097.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_098.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_104.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_105.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_109.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_112.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_122.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_125.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_126.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_133.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_144.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_161.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_163.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_166.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_167.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_173.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_176.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_189.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_255.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_305.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_315.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_316.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_325.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_352.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_361.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_362.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_363.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_381.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_382.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_421.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_445.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_446.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_447.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_450.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_452.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_453.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_456.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_457.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_458.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_464.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_465.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_466.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_467.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_468.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_469.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_470.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_472.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_473.js delete mode 100644 run/output/samples/01/01/z2ui5_cl_smp_app_480.js delete mode 100644 run/output/samples/01/02/z2ui5_cl_smp_app_006.js delete mode 100644 run/output/samples/01/02/z2ui5_cl_smp_app_011.js delete mode 100644 run/output/samples/01/02/z2ui5_cl_smp_app_019.js delete mode 100644 run/output/samples/01/02/z2ui5_cl_smp_app_045.js delete mode 100644 run/output/samples/01/02/z2ui5_cl_smp_app_048.js delete mode 100644 run/output/samples/01/02/z2ui5_cl_smp_app_053.js delete mode 100644 run/output/samples/01/02/z2ui5_cl_smp_app_059.js delete mode 100644 run/output/samples/01/02/z2ui5_cl_smp_app_070.js delete mode 100644 run/output/samples/01/02/z2ui5_cl_smp_app_074.js delete mode 100644 run/output/samples/01/02/z2ui5_cl_smp_app_078.js delete mode 100644 run/output/samples/01/02/z2ui5_cl_smp_app_088.js delete mode 100644 run/output/samples/01/02/z2ui5_cl_smp_app_120.js delete mode 100644 run/output/samples/01/02/z2ui5_cl_smp_app_143.js delete mode 100644 run/output/samples/01/02/z2ui5_cl_smp_app_160.js delete mode 100644 run/output/samples/01/02/z2ui5_cl_smp_app_170.js delete mode 100644 run/output/samples/01/02/z2ui5_cl_smp_app_202.js delete mode 100644 run/output/samples/01/02/z2ui5_cl_smp_app_279.js delete mode 100644 run/output/samples/01/02/z2ui5_cl_smp_app_306.js delete mode 100644 run/output/samples/01/02/z2ui5_cl_smp_app_327.js delete mode 100644 run/output/samples/01/02/z2ui5_cl_smp_app_448.js delete mode 100644 run/output/samples/01/02/z2ui5_cl_smp_app_449.js delete mode 100644 run/output/samples/01/02/z2ui5_cl_smp_app_454.js delete mode 100644 run/output/samples/01/02/z2ui5_cl_smp_app_455.js delete mode 100644 run/output/samples/01/02/z2ui5_cl_smp_app_459.js delete mode 100644 run/output/samples/01/02/z2ui5_cl_smp_app_460.js delete mode 100644 run/output/samples/01/02/z2ui5_cl_smp_app_462.js delete mode 100644 run/output/samples/01/02/z2ui5_cl_smp_app_463.js delete mode 100644 run/output/samples/01/02/z2ui5_cl_smp_app_471.js delete mode 100644 run/output/samples/01/02/z2ui5_cl_smp_app_474.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_005.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_015.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_022.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_038.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_051.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_101.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_110.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_114.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_140.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_205.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_206.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_207.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_208.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_210.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_213.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_214.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_215.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_216.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_217.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_218.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_219.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_220.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_221.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_222.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_223.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_224.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_225.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_226.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_227.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_228.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_229.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_230.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_232.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_233.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_234.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_235.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_236.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_237.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_238.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_239.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_240.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_241.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_243.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_245.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_246.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_250.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_251.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_252.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_257.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_259.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_261.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_262.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_263.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_264.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_266.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_267.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_271.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_272.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_273.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_274.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_275.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_276.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_278.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_280.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_281.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_283.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_287.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_288.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_289.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_290.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_291.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_292.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_293.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_294.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_295.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_296.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_297.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_298.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_299.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_300.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_302.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_366.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_368.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_369.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_371.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_372.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_374.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_375.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_376.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_377.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_378.js delete mode 100644 run/output/samples/01/03/01/z2ui5_cl_smp_app_379.js delete mode 100644 run/output/samples/01/03/02/z2ui5_cl_smp_app_017.js delete mode 100644 run/output/samples/01/03/02/z2ui5_cl_smp_app_303.js delete mode 100644 run/output/samples/01/03/02/z2ui5_cl_smp_app_330.js delete mode 100644 run/output/samples/01/03/03/z2ui5_cl_smp_app_030.js delete mode 100644 run/output/samples/01/03/03/z2ui5_cl_smp_app_181.js delete mode 100644 run/output/samples/01/03/03/z2ui5_cl_smp_app_307.js delete mode 100644 run/output/samples/01/03/04/z2ui5_cl_smp_app_242.js delete mode 100644 run/output/samples/01/03/04/z2ui5_cl_smp_app_282.js delete mode 100644 run/output/samples/01/03/05/z2ui5_cl_smp_app_103.js delete mode 100644 run/output/samples/01/03/05/z2ui5_cl_smp_app_247.js delete mode 100644 run/output/samples/01/03/05/z2ui5_cl_smp_app_248.js delete mode 100644 run/output/samples/01/03/05/z2ui5_cl_smp_app_249.js delete mode 100644 run/output/samples/01/03/05/z2ui5_cl_smp_app_260.js delete mode 100644 run/output/samples/01/03/05/z2ui5_cl_smp_app_367.js delete mode 100644 run/output/samples/01/03/06/z2ui5_cl_smp_app_209.js delete mode 100644 run/output/samples/01/03/06/z2ui5_cl_smp_app_258.js delete mode 100644 run/output/samples/01/03/07/z2ui5_cl_smp_app_265.js delete mode 100644 run/output/samples/01/03/08/z2ui5_cl_smp_app_270.js delete mode 100644 run/output/samples/01/z2ui5_cl_smp_app_000.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_004.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_006.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_008.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_009.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_011.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_012.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_019.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_020.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_024.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_025.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_026.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_027.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_028.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_045.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_047.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_048.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_050.js rename core/srv/app/samples/z2ui5_cl_demo_app_052.js => run/output/samples/01/z2ui5_cl_smp_app_052.js (63%) create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_053.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_059.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_061.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_064.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_065.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_067.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_070.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_071.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_073.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_074.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_078.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_081.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_088.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_097.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_098.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_104.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_105.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_109.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_112.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_120.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_122.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_125.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_133.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_143.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_144.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_160.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_161.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_163.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_166.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_167.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_170.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_173.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_176.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_186.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_189.js rename core/srv/app/samples/z2ui5_cl_demo_app_197.js => run/output/samples/01/z2ui5_cl_smp_app_197.js (60%) create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_202.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_255.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_279.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_305.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_306.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_316.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_325.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_327.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_352.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_361.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_362.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_363.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_381.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_382.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_421.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_445.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_448.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_449.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_450.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_452.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_453.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_454.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_455.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_456.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_457.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_459.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_460.js rename core/srv/app/samples/z2ui5_cl_demo_app_461.js => run/output/samples/01/z2ui5_cl_smp_app_461.js (56%) create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_462.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_463.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_464.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_465.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_466.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_467.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_469.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_470.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_471.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_472.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_473.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_474.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_488.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_489.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_490.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_491.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_492.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_493.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_494.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_495.js create mode 100644 run/output/samples/01/z2ui5_cl_smp_app_496.js create mode 100644 run/output/samples/z2ui5_cl_smp_app_000.js delete mode 100644 run/output/tests/z2ui5_cl_a2ui5_context.units.js delete mode 100644 run/output/tests/z2ui5_cl_app_startup.units.js delete mode 100644 run/output/tests/z2ui5_cl_core_action.units.js delete mode 100644 run/output/tests/z2ui5_cl_core_handler.units.js delete mode 100644 run/output/tests/z2ui5_cl_core_srv_event.units.js delete mode 100644 run/output/tests/z2ui5_cl_exit.units.js delete mode 100644 run/output/tests/z2ui5_cl_http_handler.units.js create mode 100644 run/output/tests/z2ui5_cl_ui5_action.units.js rename run/output/tests/{z2ui5_cl_core_app.units.js => z2ui5_cl_ui5_app_cont.units.js} (72%) rename run/output/tests/{z2ui5_cl_app_hello_world.units.js => z2ui5_cl_ui5_app_hi_world.units.js} (62%) create mode 100644 run/output/tests/z2ui5_cl_ui5_app_start.units.js rename run/output/tests/{z2ui5_cl_core_client.units.js => z2ui5_cl_ui5_client.units.js} (51%) create mode 100644 run/output/tests/z2ui5_cl_ui5_frontend.units.js create mode 100644 run/output/tests/z2ui5_cl_ui5_handler.units.js create mode 100644 run/output/tests/z2ui5_cl_ui5_http_handler.units.js rename run/output/tests/{z2ui5_cl_core_srv_bind.units.js => z2ui5_cl_ui5_srv_bind.units.js} (68%) rename run/output/tests/{z2ui5_cl_core_srv_draft.units.js => z2ui5_cl_ui5_srv_draft.units.js} (66%) create mode 100644 run/output/tests/z2ui5_cl_ui5_srv_event.units.js rename run/output/tests/{z2ui5_cl_core_srv_model.units.js => z2ui5_cl_ui5_srv_model.units.js} (79%) create mode 100644 run/output/tests/z2ui5_cl_ui5_util_context.units.js rename run/output/tests/{z2ui5_cl_a2ui5_http.units.js => z2ui5_cl_ui5_util_http.units.js} (91%) rename run/output/tests/{z2ui5_cl_a2ui5_json_fltr.units.js => z2ui5_cl_ui5_util_json_fl.units.js} (84%) create mode 100644 run/output/tests/z2ui5_cl_ui5_view_builder.units.js delete mode 100644 run/output/tests/z2ui5_cx_a2ui5_error.units.js create mode 100644 run/output/tests/z2ui5_cx_ui5_util_error.units.js rename core/srv/z2ui5/01/01/z2ui5_cl_core_srv_draft.js => src/srv/z2ui5/01/01/z2ui5_cl_ui5_srv_draft.js (87%) rename core/srv/z2ui5/01/02/z2ui5_cl_core_action.js => src/srv/z2ui5/01/02/z2ui5_cl_ui5_action.js (87%) rename src/srv/z2ui5/01/02/{z2ui5_cl_core_app.js => z2ui5_cl_ui5_app_cont.js} (84%) rename src/srv/z2ui5/01/02/{z2ui5_cl_core_client.js => z2ui5_cl_ui5_client.js} (93%) rename src/srv/z2ui5/01/02/{z2ui5_cl_core_handler.js => z2ui5_cl_ui5_handler.js} (94%) rename core/srv/z2ui5/01/02/z2ui5_cl_core_srv_bind.js => src/srv/z2ui5/01/02/z2ui5_cl_ui5_srv_bind.js (89%) rename src/srv/z2ui5/01/02/{z2ui5_cl_core_srv_event.js => z2ui5_cl_ui5_srv_event.js} (96%) rename src/srv/z2ui5/01/02/{z2ui5_cl_core_srv_model.js => z2ui5_cl_ui5_srv_model.js} (93%) rename src/srv/z2ui5/01/02/{z2ui5_if_core_types.js => z2ui5_if_ui5_types.js} (94%) rename src/srv/z2ui5/01/03/{z2ui5_cl_app_app_js.js => z2ui5_cl_ui5f_app_js.js} (76%) rename src/srv/z2ui5/01/03/{z2ui5_cl_app_app_xml.js => z2ui5_cl_ui5f_app_xml.js} (83%) rename src/srv/z2ui5/01/03/{z2ui5_cl_app_appstate_js.js => z2ui5_cl_ui5f_appstate_js.js} (99%) rename core/srv/z2ui5/01/03/z2ui5_cl_app_camerapicture_js.js => src/srv/z2ui5/01/03/z2ui5_cl_ui5f_campic_js.js (99%) rename core/srv/z2ui5/01/03/z2ui5_cl_app_cameraselector_js.js => src/srv/z2ui5/01/03/z2ui5_cl_ui5f_camsel_js.js (94%) rename core/srv/z2ui5/01/03/z2ui5_cl_app_component_js.js => src/srv/z2ui5/01/03/z2ui5_cl_ui5f_comp_js.js (72%) rename src/srv/z2ui5/01/03/{z2ui5_cl_app_dirty_js.js => z2ui5_cl_ui5f_dirty_js.js} (96%) rename src/srv/z2ui5/01/03/{z2ui5_cl_app_errorview_js.js => z2ui5_cl_ui5f_errview_js.js} (99%) rename src/srv/z2ui5/01/03/{z2ui5_cl_app_favicon_js.js => z2ui5_cl_ui5f_favicon_js.js} (93%) rename core/srv/z2ui5/01/03/z2ui5_cl_app_focus_js.js => src/srv/z2ui5/01/03/z2ui5_cl_ui5f_focus_js.js (97%) rename core/srv/z2ui5/01/03/z2ui5_cl_app_frontendaction_js.js => src/srv/z2ui5/01/03/z2ui5_cl_ui5f_frontact_js.js (99%) rename src/srv/z2ui5/01/03/{z2ui5_cl_app_geolocation_js.js => z2ui5_cl_ui5f_geoloc_js.js} (97%) rename core/srv/z2ui5/01/03/z2ui5_cl_app_history_js.js => src/srv/z2ui5/01/03/z2ui5_cl_ui5f_history_js.js (94%) rename src/srv/z2ui5/01/03/{z2ui5_cl_app_index_html.js => z2ui5_cl_ui5f_index_html.js} (84%) rename src/srv/z2ui5/01/03/{z2ui5_cl_app_info_js.js => z2ui5_cl_ui5f_info_js.js} (98%) rename core/srv/z2ui5/01/03/z2ui5_cl_app_lib_js.js => src/srv/z2ui5/01/03/z2ui5_cl_ui5f_lib_js.js (99%) rename src/srv/z2ui5/01/03/{z2ui5_cl_app_lptitle_js.js => z2ui5_cl_ui5f_lptitle_js.js} (96%) rename core/srv/z2ui5/01/03/z2ui5_cl_app_manifest_json.js => src/srv/z2ui5/01/03/z2ui5_cl_ui5f_manifest.js (72%) rename core/srv/z2ui5/01/03/z2ui5_cl_app_models_js.js => src/srv/z2ui5/01/03/z2ui5_cl_ui5f_models_js.js (74%) rename core/srv/z2ui5/01/03/z2ui5_cl_app_multiinputext_js.js => src/srv/z2ui5/01/03/z2ui5_cl_ui5f_multiinp_js.js (96%) rename src/srv/z2ui5/01/03/{z2ui5_cl_app_scrolling_js.js => z2ui5_cl_ui5f_scroll_js.js} (98%) rename src/srv/z2ui5/01/03/{z2ui5_cl_app_server_js.js => z2ui5_cl_ui5f_server_js.js} (74%) rename core/srv/z2ui5/01/03/z2ui5_cl_app_smartmultiinpu_js.js => src/srv/z2ui5/01/03/z2ui5_cl_ui5f_smartinp_js.js (98%) rename src/srv/z2ui5/01/03/{z2ui5_cl_app_storage_js.js => z2ui5_cl_ui5f_storage_js.js} (97%) rename core/srv/z2ui5/01/03/z2ui5_cl_app_style_css.js => src/srv/z2ui5/01/03/z2ui5_cl_ui5f_style_css.js (73%) rename src/srv/z2ui5/01/03/{z2ui5_cl_app_timer_js.js => z2ui5_cl_ui5f_timer_js.js} (97%) rename src/srv/z2ui5/01/03/{z2ui5_cl_app_title_js.js => z2ui5_cl_ui5f_title_js.js} (91%) rename core/srv/z2ui5/01/03/z2ui5_cl_app_tree_js.js => src/srv/z2ui5/01/03/z2ui5_cl_ui5f_tree_js.js (97%) rename src/srv/z2ui5/01/03/{z2ui5_cl_app_uitableext_js.js => z2ui5_cl_ui5f_uitable_js.js} (99%) rename src/srv/z2ui5/01/03/{z2ui5_cl_app_uploadsetext_js.js => z2ui5_cl_ui5f_upldset_js.js} (97%) rename core/srv/z2ui5/01/03/z2ui5_cl_app_fileuploader_js.js => src/srv/z2ui5/01/03/z2ui5_cl_ui5f_uploader_js.js (98%) rename core/srv/z2ui5/01/03/z2ui5_cl_app_util_js.js => src/srv/z2ui5/01/03/z2ui5_cl_ui5f_util_js.js (95%) rename src/srv/z2ui5/01/03/{z2ui5_cl_app_view1_js.js => z2ui5_cl_ui5f_view1_js.js} (75%) rename src/srv/z2ui5/01/03/{z2ui5_cl_app_viewslots_js.js => z2ui5_cl_ui5f_viewslot_js.js} (98%) rename src/srv/z2ui5/{02/z2ui5_cl_app_hello_world.js => 01/04/z2ui5_cl_ui5_app_hi_world.js} (88%) rename src/srv/z2ui5/{02/z2ui5_cl_app_startup.js => 01/04/z2ui5_cl_ui5_app_start.js} (88%) rename src/srv/z2ui5/{02/z2ui5_cl_exit.js => 01/04/z2ui5_cl_ui5_user_exit.js} (82%) rename src/srv/z2ui5/02/{z2ui5_cl_http_handler.js => z2ui5_cl_ui5_http_handler.js} (92%) create mode 100644 src/srv/z2ui5/99/z2ui5_cl_http_handler.js rename test/fixtures/{z2ui5_cl_app_hello_world.clas.abap => z2ui5_cl_ui5_app_hi_world.clas.abap} (89%) rename test/{z2ui5_cl_core_client.test.js => z2ui5_cl_ui5_client.test.js} (98%) rename test/{z2ui5_cl_core_handler.test.js => z2ui5_cl_ui5_handler.test.js} (88%) diff --git a/README.md b/README.md index 450c3e5..98af57d 100644 --- a/README.md +++ b/README.md @@ -156,9 +156,8 @@ The sample-app smoke gate diffs actual startup results against adaptations always win. Added fill-ins are **load-gated**: each must actually `require()` (self-referencing `abap2UI5/*` via the assembled core's own `exports`, third-party via the cap adapter's `node_modules`); ones that fail - are dropped and reported. This is what keeps e.g. `z2ui5_cl_app_preload` — - whose deps resolve to a path that does not exist — out of the published - package. + are dropped and reported — a transpiled class whose dependencies resolve to + a path that does not exist never reaches the published package. - **samples** (`run/output/samples` → `core/srv/app/samples`): flattened (every class lands directly under `samples/`, keyed by bare class name) and overwritten; the hand-written `samples/README.md` from `src/` stays. @@ -216,7 +215,7 @@ lives in [builder-cap2UI5-web](https://github.com/cap2UI5/builder-cap2UI5-web) — it mirrors the published cap2UI5 app repo and only relies on the two framework hooks `z2ui5_cl_util.register_app_class()` and -`z2ui5_cl_core_srv_draft.set_store()`. +`z2ui5_cl_ui5_srv_draft.set_store()`. ## External wiring diff --git a/adapters/cap/README.md b/adapters/cap/README.md index b26cb40..eface35 100644 --- a/adapters/cap/README.md +++ b/adapters/cap/README.md @@ -23,7 +23,7 @@ npm start # → http://localhost:4404/z2ui5/webapp/index.html ``` Start any bundled app via URL parameter, e.g. -`?app_start=z2ui5_cl_app_hello_world` or `?app_start=z2ui5_cl_demo_app_001`. +`?app_start=z2ui5_cl_ui5_app_hi_world` or `?app_start=z2ui5_cl_smp_app_004`. Drafts live in an in-memory `Map` — swap the `set_store` implementation for anything durable. Samples that consume the CAP OData services (e.g. diff --git a/adapters/express/README.md b/adapters/express/README.md index 4d892f6..a404342 100644 --- a/adapters/express/README.md +++ b/adapters/express/README.md @@ -13,7 +13,7 @@ npm start # → http://localhost:4204/z2ui5/webapp/index.html ``` Start any bundled app via URL parameter, e.g. -`?app_start=z2ui5_cl_app_hello_world` or `?app_start=z2ui5_cl_demo_app_001`. +`?app_start=z2ui5_cl_ui5_app_hi_world` or `?app_start=z2ui5_cl_smp_app_004`. Drafts live in an in-memory `Map` — swap the `set_store` implementation for anything durable. Samples that consume the CAP OData services (e.g. diff --git a/adapters/node/README.md b/adapters/node/README.md index b538ec4..6a2124f 100644 --- a/adapters/node/README.md +++ b/adapters/node/README.md @@ -28,8 +28,8 @@ npm start # → http://localhost:4104/z2ui5/webapp/index.html Start any bundled app via URL parameter, e.g. ``` -http://localhost:4104/z2ui5/webapp/index.html?app_start=z2ui5_cl_app_hello_world -http://localhost:4104/z2ui5/webapp/index.html?app_start=z2ui5_cl_demo_app_001 +http://localhost:4104/z2ui5/webapp/index.html?app_start=z2ui5_cl_ui5_app_hi_world +http://localhost:4104/z2ui5/webapp/index.html?app_start=z2ui5_cl_smp_app_004 ``` ## What is (deliberately) different from the CAP project diff --git a/adapters/node/server.js b/adapters/node/server.js index d312658..c2eaaf8 100644 --- a/adapters/node/server.js +++ b/adapters/node/server.js @@ -12,7 +12,7 @@ * GET /resources/* local UI5 runtime (openui5-dist) * * Start: npm install && npm start → http://localhost:4104/z2ui5/webapp/index.html - * Apps: ?app_start=z2ui5_cl_app_hello_world (all bundled samples work) + * Apps: ?app_start=z2ui5_cl_ui5_app_hi_world (all bundled samples work) */ "use strict"; diff --git a/adapters/web/README.md b/adapters/web/README.md index c5808c6..4b259bd 100644 --- a/adapters/web/README.md +++ b/adapters/web/README.md @@ -21,7 +21,7 @@ are skipped at registry load with a console warning — everything else runs. ```bash npm install # links ../../core + esbuild npm run build # → dist/ -npm run serve # → http://localhost:4304/index.html?app_start=z2ui5_cl_app_hello_world +npm run serve # → http://localhost:4304/index.html?app_start=z2ui5_cl_ui5_app_hi_world ``` `dist/` is a plain static site — GitHub Pages, S3 or nginx serve it as-is. diff --git a/adapters/web/build.js b/adapters/web/build.js index 3c7d738..88c1d71 100644 --- a/adapters/web/build.js +++ b/adapters/web/build.js @@ -28,7 +28,7 @@ const dist = path.join(__dirname, "dist"); // ---- 1. registry --------------------------------------------------------- // subpath specifier per app-class location (must match the package exports map) const SOURCES = [ - { dir: "srv/z2ui5/02", spec: (n) => `abap2UI5/${n}`, filter: (n) => /^z2ui5_cl_app_/.test(n) }, + { dir: "srv/z2ui5/01/04", spec: (n) => `abap2UI5/${n}`, filter: (n) => /^z2ui5_cl_ui5_app_/.test(n) }, { dir: "srv/z2ui5/99/02", spec: (n) => `abap2UI5/${n}`, filter: (n) => /^z2ui5_cl_pop_/.test(n) }, { dir: "srv/app", spec: (n) => `abap2UI5/app/${n}`, filter: (n) => /^z2ui5_c[lx]_/.test(n) }, { dir: "srv/app/samples", spec: (n) => `abap2UI5/app/samples/${n}`, filter: (n) => /^z2ui5_c[lx]_/.test(n) }, @@ -78,6 +78,8 @@ require("esbuild").buildSync({ "node:path": path.join(__dirname, "shims/path.js"), crypto: path.join(__dirname, "shims/crypto.js"), "node:crypto": path.join(__dirname, "shims/crypto.js"), + async_hooks: path.join(__dirname, "shims/async_hooks.js"), + "node:async_hooks": path.join(__dirname, "shims/async_hooks.js"), }, external: ["@sap/cds", "openui5-dist"], // CJS node-isms: __dirname feeds only the (shimmed, no-op) fs discovery diff --git a/adapters/web/shims/async_hooks.js b/adapters/web/shims/async_hooks.js new file mode 100644 index 0000000..3e43d81 --- /dev/null +++ b/adapters/web/shims/async_hooks.js @@ -0,0 +1,50 @@ +/** + * async_hooks shim for the browser bundle — the framework only needs + * AsyncLocalStorage, and only to isolate the user-exit context per request + * (z2ui5_cl_ui5_user_exit._als). + * + * A page is single-threaded and answers one roundtrip at a time, so a single + * current-store slot is an exact stand-in: run( ) sets it for the duration of + * the callback (including its awaits) and restores the previous one after, + * which is the only nesting the framework produces. + */ +"use strict"; + +class AsyncLocalStorage { + constructor() { + this._store = undefined; + } + + run(store, fn, ...args) { + const previous = this._store; + this._store = store; + try { + const out = fn(...args); + // async callback: keep the store alive until it settles + if (out && typeof out.then === "function") { + return out.finally(() => { + this._store = previous; + }); + } + this._store = previous; + return out; + } catch (e) { + this._store = previous; + throw e; + } + } + + getStore() { + return this._store; + } + + enterWith(store) { + this._store = store; + } + + exit(fn, ...args) { + return this.run(undefined, fn, ...args); + } +} + +module.exports = { AsyncLocalStorage }; diff --git a/core/app/z2ui5/webapp/Component.js b/core/app/z2ui5/webapp/Component.js index d388beb..5d823a9 100644 --- a/core/app/z2ui5/webapp/Component.js +++ b/core/app/z2ui5/webapp/Component.js @@ -4,24 +4,26 @@ sap.ui.define( "z2ui5/model/models", "z2ui5/core/Server", "sap/ui/VersionInfo", - "z2ui5/core/DeveloperTools", + "z2ui5/devtools/DevTools", "z2ui5/core/Lib", "z2ui5/core/AppState", "z2ui5/Util", "z2ui5/model/formatter", - "sap/ui/core/routing/HashChanger", + "z2ui5/core/Router", + "z2ui5/core/ScrollFocus", ], ( UIComponent, Models, Server, VersionInfo, - DeveloperTools, + DevTools, Lib, AppState, DateUtil, Formatter, - HashChanger, + Router, + ScrollFocus, ) => { "use strict"; @@ -39,6 +41,36 @@ sap.ui.define( // a fully initialized global from here on. AppState.initGlobal(); + // Two sibling BSPs carry frontend artefacts the framework itself does + // not ship: z2ui5_cci (abap2UI5-addons/custom-controls) and z2ui5_ccc + // (abap2UI5/customer-frontend-extension, the customer's own library). + // The two roots differ in one letter and are NOT the same BSP - each + // matches the ABAP prefix of its repository (z2ui5_cl_cci for the + // community controls, z2ui5_cl_ccc for the customer extension). + // Both are normally found through their reserved resourceRoot in + // manifest.json ("z2ui5_cci": "../z2ui5_cci/", "z2ui5_ccc": + // "../z2ui5_ccc/"), a sibling of THIS BSP. In the standalone HTTP + // service there is no BSP for them to be a sibling of, so the backend + // hands the absolute paths over on the global instead + // (z2ui5_cl_http_handler=>_http_get). + // + // They have to be applied HERE and not in the page: the manifest + // registers its own value while the component is being created, which + // is after everything the shell can run, so a registration made there + // is overwritten again. init() runs after manifest processing. + // Absent in BSP and Launchpad mode, where the manifest entries are + // right. Neither BSP is loaded from here - nothing is requested until + // a view actually names the namespace - so a system that has only one + // of them installed (or neither) never pays for the other. + const ccResourceRoot = AppState.getGlobal("ccResourceRoot"); + if (ccResourceRoot) { + sap.ui.loader.config({ paths: { z2ui5_cci: ccResourceRoot } }); + } + const cccResourceRoot = AppState.getGlobal("cccResourceRoot"); + if (cccResourceRoot) { + sap.ui.loader.config({ paths: { z2ui5_ccc: cccResourceRoot } }); + } + UIComponent.prototype.init.call(this); AppState.getGlobal("oConfig").ComponentData = this.getComponentData(); @@ -82,20 +114,14 @@ sap.ui.define( this._initVersionInfo(); this._installUnloadListener(); - this._installDeveloperToolsShortcut(); + // The developer tools own everything of their own: the Ctrl+F12 + // shortcut, the dialog instance, the roundtrip recorder and the + // "?z2ui5-devtools=" auto open. This call and the exit() below are + // the framework's ENTIRE coupling to devtools/ - keep it that + // way (see the module header there). + DevTools.install(); this._installScrollListener(); this._installRouterListener(); - - // The stopped router removed with the manifest routing section used - // to initialize the HashChanger (and its underlying hasher - // singleton) as a side effect. Without that init hasher never - // learns the URL's current hash, so the app-state cleanup after - // every roundtrip (View1._updateBrowserHistory calling - // replaceHash("")) is treated as a change and rewrites the URL to - // "...#" - every app start ended with a dangling "#". Initialize it - // explicitly; inside the FLP the shell has already done this and - // init() is a guarded no-op. - HashChanger.getInstance().init(); }, // ------------------------------------------------------------------ @@ -104,36 +130,24 @@ sap.ui.define( _installUnloadListener() { this._boundUnload = this._onUnload.bind(this); - // Safari on iOS does not fire "beforeunload" reliably, so we use - // "pagehide" there. iPads on iPadOS 13+ report a Mac user agent - // ("desktop site" default) - the touch-point probe catches those, - // while real Macs report 0 touch points. - const isIos = - /iPad|iPhone/.test(navigator.userAgent) || - (navigator.userAgent.includes("Mac") && navigator.maxTouchPoints > 1); - this._unloadEvent = isIos ? "pagehide" : "beforeunload"; + // "pagehide", not "beforeunload": pagehide fires only after the + // navigation is committed (any "leave page?" prompt was answered), + // so tearing the app down here can neither swallow the cc/Dirty + // unsaved-changes prompt (destroying the app mid-beforeunload + // removed its window.onbeforeunload handler before the browser + // invoked it) nor kill the live session when the user chooses to + // stay. It is also the reliable event on iOS Safari, which never + // fired beforeunload dependably. + this._unloadEvent = "pagehide"; window.addEventListener(this._unloadEvent, this._boundUnload); }, - _installDeveloperToolsShortcut() { - // Ctrl + F12 opens / closes the in-app developer tools. - this._boundKeydown = (event) => { - if (event.ctrlKey && event.key === "F12") { - const state = AppState.state; - if (!state.developerTools) - state.developerTools = new DeveloperTools(); - state.developerTools.toggle(); - } - }; - document.addEventListener("keydown", this._boundKeydown); - }, - _installScrollListener() { // Scroll events do not bubble, but they do trigger capture-phase // listeners on ancestors - a single document-level listener observes - // every scrollable container. Server.onScrollCapture records the + // every scrollable container. ScrollFocus.onScrollCapture records the // last scrolled element per view slot for the S_SCROLL request info. - this._boundScroll = (event) => Server.onScrollCapture(event); + this._boundScroll = (event) => ScrollFocus.onScrollCapture(event); document.addEventListener("scroll", this._boundScroll, { capture: true, passive: true, @@ -141,20 +155,15 @@ sap.ui.define( }, _installRouterListener() { - // Hash-based app routing (UI5 Router style). The HashChanger is the - // same engine the sap.ui.core.routing.Router sits on; listening to its - // hashChanged event makes the native browser Back/Forward buttons (and - // manual URL edits / bookmarks) drive navigation - a hash of the form - // "#/app/" starts that app. Only sessions that opted in via - // client->set_nav_routing( ) act on it (Server.onHashChange guards on - // AppState.navRouting), so apps that manage their own hash are - // unaffected. - this._boundHashChanged = (oEvent) => - Server.onHashChange(oEvent.getParameter("newHash")); - HashChanger.getInstance().attachEvent( - "hashChanged", - this._boundHashChanged, - ); + // Hash-based app routing (UI5 Router style), owned by core/Router.js. + // It sits on the HashChanger - the same engine + // sap.ui.core.routing.Router uses, and inside the FLP the shell's own + // one - so the native browser Back/Forward buttons and the launchpad + // back button drive navigation. Only apps that opted in via + // follow_up_action( cs_event-set_nav_routing ) act on it, so apps that manage their own + // hash are unaffected. Server does the actual restore roundtrip; it is + // injected here so the router stays free of a Server dependency. + Router.init(() => Server.restoreFromRoute()); }, // ------------------------------------------------------------------ @@ -246,7 +255,10 @@ sap.ui.define( return ""; }, - _onUnload() { + _onUnload(event) { + // pagehide with persisted = true means the page enters the browser's + // back/forward cache and may be shown again - keep the app alive. + if (event?.persisted) return; // destroy() runs exit(), which removes the unload listener (and every // other one) - no need to remove it here too. this.destroy(); @@ -258,25 +270,32 @@ sap.ui.define( exit() { window.removeEventListener(this._unloadEvent, this._boundUnload); - document.removeEventListener("keydown", this._boundKeydown); document.removeEventListener("scroll", this._boundScroll, { capture: true, }); - HashChanger.getInstance().detachEvent( - "hashChanged", - this._boundHashChanged, - ); + Router.exit(); - // The developer tools control is created lazily by the Ctrl+F12 - // shortcut - destroy it (which also closes its dialog) so a re-launch - // (FLP) does not leak the control instance. - if (AppState.state.developerTools) { - AppState.state.developerTools.destroy(); - AppState.state.developerTools = null; - } + // Drops the shortcut, the dialog instance and the recorded history - + // all of which are module-scoped and would otherwise outlive the + // component on an FLP re-launch. + DevTools.exit(); Server.endSession(); + // Global state that would outlive the component (FLP keeps the page + // alive): cancel any pending backend timer, empty the shortcut + // registry so the module-scoped keydown listener becomes a no-op, + // and detach the device model's handlers from the Device singleton. + for (const key of Object.keys(AppState.state.timers)) { + clearTimeout(AppState.state.timers[key]); + delete AppState.state.timers[key]; + } + AppState.state.shortcuts = {}; + if (AppState.state.oDeviceModel) { + AppState.state.oDeviceModel.destroy(); + AppState.state.oDeviceModel = null; + } + // Robust launchpad teardown: // 1. Clear the FLP dirty flag so it does not carry over into the // next app the user opens. diff --git a/core/app/z2ui5/webapp/cc/CameraPicture.js b/core/app/z2ui5/webapp/cc/CameraPicture.js index 77fb5f5..6bc87b5 100644 --- a/core/app/z2ui5/webapp/cc/CameraPicture.js +++ b/core/app/z2ui5/webapp/cc/CameraPicture.js @@ -19,7 +19,6 @@ sap.ui.define( return Control.extend("z2ui5.cc.CameraPicture", { metadata: { properties: { - id: { type: "string" }, value: { type: "string" }, thumbnail: { type: "string" }, // Empty default leaves the trigger button auto-sized; a bare diff --git a/core/app/z2ui5/webapp/cc/Dirty.js b/core/app/z2ui5/webapp/cc/Dirty.js index f08bc99..7956ae6 100644 --- a/core/app/z2ui5/webapp/cc/Dirty.js +++ b/core/app/z2ui5/webapp/cc/Dirty.js @@ -32,8 +32,8 @@ sap.ui.define( }, }, setIsDirty(val) { - // Empty renderer -> suppress the no-op invalidation; the dirty state - // is applied explicitly below. + // Empty renderer -> suppress the no-op invalidation; the effect below + // (applying the dirty state) is what actually matters. this.setProperty("isDirty", val, true); if (val) { dirtyControls.add(this); @@ -58,7 +58,7 @@ sap.ui.define( syncUnloadPrompt(anyDirty); } } catch (e) { - Lib.logError("Dirty.setIsDirty: setDirtyFlag failed", e); + Lib.logError("Dirty._applyDirtyState: setDirtyFlag failed", e); syncUnloadPrompt(anyDirty); } }, diff --git a/core/app/z2ui5/webapp/cc/Favicon.js b/core/app/z2ui5/webapp/cc/Favicon.js index cd2c802..c9b97d1 100644 --- a/core/app/z2ui5/webapp/cc/Favicon.js +++ b/core/app/z2ui5/webapp/cc/Favicon.js @@ -2,6 +2,7 @@ // `favicon` URL (updates the existing tag or creates one). sap.ui.define(["sap/ui/core/Control", "z2ui5/core/Lib"], (Control, Lib) => { "use strict"; + // OBSOLETE: replaced by the frontend event cs_event-set_favicon - kept for backward compatibility. return Control.extend("z2ui5.cc.Favicon", { metadata: { properties: { @@ -15,7 +16,12 @@ sap.ui.define(["sap/ui/core/Control", "z2ui5/core/Lib"], (Control, Lib) => { // (updating the tag) is what actually matters. this.setProperty("favicon", val, true); const href = Lib.toText(val); - const existing = document.head.querySelector('link[rel="shortcut icon"]'); + // Match ANY icon link, not just rel="shortcut icon": a page that + // declares the modern rel="icon" (or "icon shortcut") would otherwise + // keep its own link and get a second, competing one appended on every + // app start - which icon the browser then shows is up to it. + // ~= matches one entry of the whitespace-separated rel list. + const existing = document.head.querySelector('link[rel~="icon"]'); if (existing) { existing.href = href; return; diff --git a/core/app/z2ui5/webapp/cc/Focus.js b/core/app/z2ui5/webapp/cc/Focus.js index 98f7d9b..340664d 100644 --- a/core/app/z2ui5/webapp/cc/Focus.js +++ b/core/app/z2ui5/webapp/cc/Focus.js @@ -28,7 +28,8 @@ sap.ui.define( }, setFocusId(val) { try { - this.setProperty("focusId", val); + // Empty renderer -> suppress the no-op invalidation + this.setProperty("focusId", val, true); const oElement = ViewSlots.byIdOfOwner(this, val); if (oElement) oElement.applyFocusInfo(oElement.getFocusInfo()); } catch (e) { @@ -45,22 +46,7 @@ sap.ui.define( // the user had typed past the (stale) captured position. Reading it // here - while the old, still-focused element is in the DOM - keeps the // guard working across a full view rebuild, not only an in-place patch. - this._liveCaret = null; - try { - const active = document.activeElement; - if ( - active && - (active.tagName === "INPUT" || active.tagName === "TEXTAREA") - ) { - const s = active.selectionStart; - const e = active.selectionEnd; - if (s != null && e != null) { - this._liveCaret = { start: s, end: e }; - } - } - } catch { - this._liveCaret = null; - } + this._liveCaret = Lib.readCaret(document.activeElement); }, onAfterRendering() { const liveCaret = this._liveCaret; diff --git a/core/app/z2ui5/webapp/cc/History.js b/core/app/z2ui5/webapp/cc/History.js index 2cd49f3..ab522cb 100644 --- a/core/app/z2ui5/webapp/cc/History.js +++ b/core/app/z2ui5/webapp/cc/History.js @@ -13,8 +13,8 @@ sap.ui.define(["sap/ui/core/Control", "z2ui5/core/Lib"], (Control, Lib) => { }, }, setSearch(val) { - // Empty renderer -> suppress the no-op invalidation; the URL rewrite - // below is the actual effect. + // Empty renderer -> suppress the no-op invalidation; the effect below + // (rewriting the URL) is what actually matters. this.setProperty("search", val, true); try { const search = Lib.toText(val); diff --git a/core/app/z2ui5/webapp/cc/Info.js b/core/app/z2ui5/webapp/cc/Info.js index 287825b..af72092 100644 --- a/core/app/z2ui5/webapp/cc/Info.js +++ b/core/app/z2ui5/webapp/cc/Info.js @@ -65,13 +65,17 @@ sap.ui.define( // fires the event. onAfterRendering() { if (!this._pendingInfo) return; - this._pendingInfo = false; try { // The device model is created by Component.init(); it exposes - // system / resize / os / browser info. + // system / resize / os / browser info. It reaches this control + // through model propagation, so on the very first rendering of a + // freshly built view it may not be attached yet - keep the pending + // flag in that case so the next rendering retries, instead of + // consuming it and never firing `finished` at all. const deviceModel = ViewSlots.getView("MAIN")?.getModel("device"); const deviceData = deviceModel?.getData(); if (!deviceData) return; + this._pendingInfo = false; const { system, resize, os, browser } = deviceData; // Filled by Component._initVersionInfo (async, may not have @@ -79,7 +83,7 @@ sap.ui.define( const ui5Info = AppState.getGlobal("oConfig")?.S_UI5; const ui5Version = ui5Info?.VERSION || ""; - // Single system-type label, same derivation as Server._getDeviceInfo. + // Single system-type label, same derivation as core/Session.js. const systemType = Lib.deriveSystemType(system); const props = [ diff --git a/core/app/z2ui5/webapp/cc/LPTitle.js b/core/app/z2ui5/webapp/cc/LPTitle.js index 559de78..dc341b7 100644 --- a/core/app/z2ui5/webapp/cc/LPTitle.js +++ b/core/app/z2ui5/webapp/cc/LPTitle.js @@ -18,8 +18,8 @@ sap.ui.define( }, }, setTitle(val) { - // Empty renderer -> suppress the no-op invalidation; the shell title - // is set explicitly below. + // Empty renderer -> suppress the no-op invalidation; the effect below + // (setting the shell title) is what actually matters. this.setProperty("title", val, true); try { const shell = AppState.state.oLaunchpad?.ShellUIService; diff --git a/core/app/z2ui5/webapp/cc/MessageManager.js b/core/app/z2ui5/webapp/cc/MessageManager.js index ec7c755..932a1c8 100644 --- a/core/app/z2ui5/webapp/cc/MessageManager.js +++ b/core/app/z2ui5/webapp/cc/MessageManager.js @@ -22,7 +22,7 @@ sap.ui.define( ); // Invisible companion control that bridges the UI5 message manager to a - // two-way bound ABAP table (`items`). The table is the app's OWN messages: + // bound ABAP table (`items`). The table is the app's OWN messages: // on every backend update the control reconciles the message manager to // match it - adding new rows as sap.ui.core.message.Message objects (with // a target + the view's model as processor, so they set the bound field's @@ -51,6 +51,12 @@ sap.ui.define( }, exit() { Lib.unregisterCallback("onAfterRendering", this._setupBound); + // remove this control's own rows from the message model, otherwise a + // full view rebuild leaves them behind and re-adds a duplicate set + if (this._added.size && this._messaging) { + this._messaging.removeMessages([...this._added.values()]); + } + this._added.clear(); }, renderer: { apiVersion: 2, render() {} }, @@ -58,7 +64,7 @@ sap.ui.define( if (this.getProperty("checkInit")) return; const messaging = Lib.getMessaging?.(); if (!messaging) return; - this.setProperty("checkInit", true); + this.setProperty("checkInit", true, true); this._messaging = messaging; const view = ViewSlots.getView( ViewSlots.containingSlotKey(this) ?? "MAIN", @@ -69,7 +75,7 @@ sap.ui.define( this.reconcile(); }, - // property setter override: the two-way binding calls this when the + // property setter override: the binding calls this when the // backend ships a new message table (base setProperty is used for the // internal store, so it never re-enters here) setItems(aItems) { @@ -83,17 +89,26 @@ sap.ui.define( reconcile() { const rows = this.getProperty("items") || []; const wanted = new Map(rows.map((r) => [keyOf(r), r])); + // `change` reports an actual message update, so it only fires when + // this pass added or removed something. Firing unconditionally made + // every model update (the table is bound, so it arrives on + // each roundtrip) look like a change - and an app that binds the + // event to a backend roundtrip would answer with the next model + // update, i.e. loop. + let changed = false; // remove app rows no longer wanted for (const [key, oMessage] of this._added) { if (!wanted.has(key)) { this._messaging.removeMessages(oMessage); this._added.delete(key); + changed = true; } } // add newly wanted rows for (const [key, r] of wanted) { if (this._added.has(key)) continue; + changed = true; const oMessage = new Message({ message: r.MESSAGE ?? "", description: r.DESCRIPTION ?? "", @@ -110,7 +125,7 @@ sap.ui.define( this._messaging.addMessages(oMessage); this._added.set(key, oMessage); } - this.fireChange(); + if (changed) this.fireChange(); }, }); }, diff --git a/core/app/z2ui5/webapp/cc/MultiInputExt.js b/core/app/z2ui5/webapp/cc/MultiInputExt.js index deb3b37..2dde776 100644 --- a/core/app/z2ui5/webapp/cc/MultiInputExt.js +++ b/core/app/z2ui5/webapp/cc/MultiInputExt.js @@ -59,8 +59,7 @@ sap.ui.define( this, this.getProperty("MultiInputId"), ); - if (!input || this.getProperty("checkInit")) return; - this.setProperty("checkInit", true); + if (!Lib.claimOnce(this, input)) return; try { input.attachTokenUpdate(this.onTokenUpdate.bind(this)); // Custom validator: turn any free-text entry into a Token where diff --git a/core/app/z2ui5/webapp/cc/Scrolling.js b/core/app/z2ui5/webapp/cc/Scrolling.js index 807a910..af627b6 100644 --- a/core/app/z2ui5/webapp/cc/Scrolling.js +++ b/core/app/z2ui5/webapp/cc/Scrolling.js @@ -32,7 +32,7 @@ sap.ui.define( // Some controls expose a scroll delegate; prefer it when available. const delegate = control?.getScrollDelegate?.(); if (delegate) return delegate.getScrollTop(); - const element = this._getDomInnerElement(item.ID); + const element = this._getDomInnerElement(item.N); return element ? element.scrollTop : 0; } catch (e) { Lib.logError("Scrolling._getScrollTop: failed", e); @@ -81,7 +81,7 @@ sap.ui.define( control.scrollTo(item.V); return; } - const element = this._getDomInnerElement(item.ID); + const element = this._getDomInnerElement(item.N); if (element) element.scrollTop = item.V; } catch (e) { Lib.logError("Scrolling._restoreScrollPosition: failed", e); diff --git a/core/app/z2ui5/webapp/cc/SmartMultiInputExt.js b/core/app/z2ui5/webapp/cc/SmartMultiInputExt.js index ec878a9..593fe97 100644 --- a/core/app/z2ui5/webapp/cc/SmartMultiInputExt.js +++ b/core/app/z2ui5/webapp/cc/SmartMultiInputExt.js @@ -20,8 +20,9 @@ sap.ui.define( type: "object", }, rangeData: { + // no defaultValue: an object default in the metadata is shared + // by reference across every instance of the control type: "object", - defaultValue: [], }, checkInit: { type: "boolean", @@ -115,8 +116,7 @@ sap.ui.define( this, this.getProperty("multiInputId"), ); - if (!input || this.getProperty("checkInit")) return; - this.setProperty("checkInit", true); + if (!Lib.claimOnce(this, input)) return; try { input.attachTokenUpdate(this.onTokenUpdate.bind(this)); input.attachInnerControlsCreated( diff --git a/core/app/z2ui5/webapp/cc/Storage.js b/core/app/z2ui5/webapp/cc/Storage.js index 26f572a..2332dbf 100644 --- a/core/app/z2ui5/webapp/cc/Storage.js +++ b/core/app/z2ui5/webapp/cc/Storage.js @@ -1,12 +1,39 @@ +// Invisible control that reads a value from browser storage +// (session/local, see sap.ui.util.Storage) into its `value` property +// and fires `finished` when the stored value differs from the current +// one. The write side is handled by the STORE_DATA frontend action. sap.ui.define( ["sap/ui/core/Control", "sap/ui/util/Storage", "z2ui5/core/Lib"], (Control, Storage, Lib) => { "use strict"; - // Invisible control that reads a value from browser storage - // (session/local, see sap.ui.util.Storage) into its `value` property - // and fires `finished` when the stored value differs from the current - // one. The write side is handled by the STORE_DATA frontend action. + // Value equality for the stored payload. `value` is typed `any`: a plain + // string for the common case, a structure or a table once an app binds + // one. A reference comparison reports EVERY object as different, because + // sap/ui/util/Storage JSON-round-trips what it stores and therefore hands + // back a fresh object on every read - the control would fire `finished` + // on each render, the backend would answer with a re-render, and that + // fires again: an endless round-trip loop that made a structured value + // unusable. Compare by value instead. Key order is not significant (the + // stored copy went through JSON, the bound one comes from the model), and + // the payload is JSON by construction, so this covers every shape that + // can reach the property. + function isSameValue(a, b) { + if (a === b) return true; + if (a === null || b === null) return false; + if (typeof a !== "object" || typeof b !== "object") return false; + if (Array.isArray(a) !== Array.isArray(b)) return false; + if (Array.isArray(a)) { + return a.length === b.length && a.every((v, i) => isSameValue(v, b[i])); + } + const keys = Object.keys(a); + if (keys.length !== Object.keys(b).length) return false; + return keys.every( + (k) => + Object.prototype.hasOwnProperty.call(b, k) && isSameValue(a[k], b[k]), + ); + } + return Control.extend("z2ui5.cc.Storage", { metadata: { properties: { @@ -63,15 +90,24 @@ sap.ui.define( try { const storageType = Storage.Type[type] || Storage.Type.session; const storage = new Storage(storageType, prefix); - stored = storage.get(key) ?? ""; + stored = storage.get(key); } catch (e) { Lib.logError(`Storage: read failed for key '${key}'`, e); return; } + // A key that holds nothing must leave the bound field ALONE. Reporting + // the empty string for it used to overwrite whatever the app had - + // and, worse, its TYPE: an app binding a structure got a plain "" on + // the very first render, which the next roundtrip could not parse back + // ("JSON_PARSING_ERROR ... Unsupported target for value [v]", because + // a string cannot land on a deep ABAP target). "Nothing is stored" is + // not a value, so there is nothing to report. + if (stored === null || stored === undefined) return; + // Only fire "finished" when the stored value differs from the // current property to avoid feedback loops. - if (stored !== value) { + if (!isSameValue(stored, value)) { this.setProperty("value", stored, true); this.fireFinished({ type, prefix, key, value: stored }); } diff --git a/core/app/z2ui5/webapp/cc/Title.js b/core/app/z2ui5/webapp/cc/Title.js index 5fa7352..3469762 100644 --- a/core/app/z2ui5/webapp/cc/Title.js +++ b/core/app/z2ui5/webapp/cc/Title.js @@ -12,8 +12,8 @@ sap.ui.define(["sap/ui/core/Control", "z2ui5/core/Lib"], (Control, Lib) => { }, }, setTitle(val) { - // Suppress invalidation: the renderer is empty, so a re-render would be - // a no-op; the effect happens explicitly below. + // Empty renderer -> suppress the no-op invalidation; the effect below + // (setting the tab title) is what actually matters. this.setProperty("title", val, true); document.title = Lib.toText(val); }, diff --git a/core/app/z2ui5/webapp/cc/UploadSetExt.js b/core/app/z2ui5/webapp/cc/UploadSetExt.js index 004e632..5faa423 100644 --- a/core/app/z2ui5/webapp/cc/UploadSetExt.js +++ b/core/app/z2ui5/webapp/cc/UploadSetExt.js @@ -90,11 +90,20 @@ sap.ui.define( this, this.getProperty("uploadSetId"), ); - if (!uploadSet || this.getProperty("checkInit")) return; - this.setProperty("checkInit", true); + if (!Lib.claimOnce(this, uploadSet)) return; try { uploadSet.attachAfterItemAdded(this.onItemAdded.bind(this)); - uploadSet.attachAfterItemRemoved(this.onItemRemoved.bind(this)); + // afterItemRemoved is @since 1.83; below that, adds keep working + // and the gap is reported instead of failing the whole setup + // (beforeItemRemoved is no substitute - it fires before the + // confirm dialog and would report cancelled removals) + if (uploadSet.attachAfterItemRemoved) { + uploadSet.attachAfterItemRemoved(this.onItemRemoved.bind(this)); + } else { + Lib.logError( + "UploadSetExt: afterItemRemoved needs UI5 >= 1.83, removals will not be reported", + ); + } } catch (e) { Lib.logError("UploadSetExt.setControl: setup failed", e); } diff --git a/core/app/z2ui5/webapp/cc/Websocket.js b/core/app/z2ui5/webapp/cc/Websocket.js new file mode 100644 index 0000000..aa46d10 --- /dev/null +++ b/core/app/z2ui5/webapp/cc/Websocket.js @@ -0,0 +1,201 @@ +// Invisible control that keeps a WebSocket connection to an ABAP Push +// Channel (APC) open and hands every inbound message to the backend: the +// message text lands in the bound `value` property and the +// `received` event triggers the roundtrip that lets the app process it. +// Sending is deliberately NOT part of the control - an app publishes to the +// AMC channel from ABAP, so consuming a push channel needs no app JavaScript. +sap.ui.define( + ["sap/ui/core/Control", "z2ui5/core/Lib", "z2ui5/core/AppState"], + (Control, Lib, AppState) => { + "use strict"; + + // A roundtrip already in flight makes View1.eB DROP the event (its + // isBusy guard), so everything the control reports is queued and + // delivered one item per roundtrip instead of being lost in a burst. + // This is the retry interval of the drain loop - it only runs while + // items are actually waiting. + const DRAIN_RETRY_MS = 50; + + return Control.extend("z2ui5.cc.Websocket", { + metadata: { + properties: { + // APC path ("/sap/bc/apc/sap/z2ui5_apc_smp_2"), resolved against + // the current origin; a full ws:// or wss:// URL is taken as is. + path: { + type: "string", + defaultValue: "", + }, + // Text of the message currently reported to the backend. + value: { + type: "string", + defaultValue: "", + }, + checkActive: { + type: "boolean", + defaultValue: true, + }, + // false -> close the connection after the first message. + checkRepeat: { + type: "boolean", + defaultValue: true, + }, + }, + events: { + received: { + allowPreventDefault: true, + parameters: {}, + }, + // Fired when the connection could not be opened or ended without + // the app asking for it, so a backend can react. `code` is the + // WebSocket close code ("1006" for a handshake that never + // completed - inactive ICF node, rejected authentication, unknown + // APC application) or "CONSTRUCT" when the constructor itself + // threw. The control never surfaces any UI on its own - handling + // is delegated entirely to whoever binds this event. + error: { + parameters: { + code: { type: "string" }, + message: { type: "string" }, + }, + }, + }, + }, + init() { + this._queue = []; + }, + // Every state change (checkActive toggled, path rebound) invalidates + // the control, so this single hook is where the connection is brought + // in line with the properties - no setter override needed. + onAfterRendering() { + const url = this._resolveUrl(); + if (url !== this._url) this._disconnect(); + this._url = url; + if (this.getProperty("checkActive")) { + this._connect(); + } else { + this._disconnect(); + } + }, + exit() { + clearTimeout(this._drainId); + this._disconnect(); + }, + _resolveUrl() { + const path = this.getProperty("path"); + if (!path) return ""; + if (/^wss?:\/\//i.test(path)) return path; + // https -> wss, http -> ws + const origin = window.location.origin.replace(/^http/i, "ws"); + return path.charAt(0) === "/" ? origin + path : origin + "/" + path; + }, + _connect() { + if (this._ws || !this._url) return; + const url = this._url; + let ws; + try { + ws = new WebSocket(url); + } catch (err) { + const message = "Cannot open " + url + ": " + (err.message || err); + Lib.logError("Websocket: " + message, err); + this._report({ kind: "error", code: "CONSTRUCT", message }); + return; + } + this._ws = ws; + this._opened = false; + ws.onopen = () => { + if (this._ws === ws) this._opened = true; + }; + ws.onmessage = (event) => { + // The control may have been torn down, or replaced by a newer + // connection, while this socket was still open. + if (Lib.isDestroyed(this) || this._ws !== ws) return; + if (typeof event.data !== "string") { + Lib.logError("Websocket: ignored a non-text message"); + return; + } + if (!this.getProperty("checkRepeat")) this._disconnect(); + this._report({ kind: "message", value: event.data }); + }; + ws.onerror = () => { + // The WebSocket error event carries no detail by specification - + // it is always followed by onclose, which is where the actual + // reason (the close code) becomes available and is reported. + Lib.logError("Websocket: connection error on " + url); + }; + // A close the app asked for never gets here: _disconnect() drops the + // handlers first. So every close reaching this point is one the + // server or the network caused, and the backend should hear about it. + ws.onclose = (event) => { + if (this._ws !== ws) return; + this._ws = null; + if (Lib.isDestroyed(this)) return; + const cause = this._opened + ? "Connection to " + url + " was closed" + : "Connection to " + url + " could not be established"; + const message = event.reason ? cause + ": " + event.reason : cause; + Lib.logError("Websocket (" + event.code + "): " + message); + this._report({ + kind: "error", + code: String(event.code), + message: message, + }); + }; + }, + _disconnect() { + const ws = this._ws; + if (!ws) return; + this._ws = null; + ws.onopen = null; + ws.onmessage = null; + ws.onerror = null; + ws.onclose = null; + try { + ws.close(); + } catch (err) { + Lib.logError("Websocket: close failed", err); + } + }, + // Queue one item for the backend and start draining. Messages and + // errors share the queue so they reach the app in the order they + // happened - an error after three messages is reported after them. + _report(item) { + this._queue.push(item); + this._drain(); + }, + // Hand the oldest queued item to the backend and round-trip once. + // While the backend is busy nothing is consumed - the queue is retried + // until the event can actually get through, so nothing is dropped. + _drain() { + if (!this._queue.length) return; + if (AppState.state.isBusy) { + this._scheduleDrain(); + return; + } + const item = this._queue.shift(); + if (item.kind === "error") { + this.fireError({ + code: item.code, + message: item.message, + }); + } else { + this.setProperty("value", item.value, true); + this.fireReceived(); + } + if (this._queue.length) this._scheduleDrain(); + }, + _scheduleDrain() { + clearTimeout(this._drainId); + this._drainId = setTimeout(() => { + if (Lib.isDestroyed(this)) return; + this._drain(); + }, DRAIN_RETRY_MS); + }, + renderer: { + apiVersion: 2, + render(oRm, oControl) { + Lib.renderInvisibleSpan(oRm, oControl); + }, + }, + }); + }, +); diff --git a/core/app/z2ui5/webapp/controller/App.controller.js b/core/app/z2ui5/webapp/controller/App.controller.js index 2564f12..7d99c68 100644 --- a/core/app/z2ui5/webapp/controller/App.controller.js +++ b/core/app/z2ui5/webapp/controller/App.controller.js @@ -7,8 +7,9 @@ sap.ui.define( "z2ui5/controller/View1.controller", "z2ui5/core/Server", "z2ui5/core/AppState", + "z2ui5/core/ViewSlots", ], - (BaseController, Controller, Server, AppState) => { + (BaseController, Controller, Server, AppState, ViewSlots) => { "use strict"; return BaseController.extend("z2ui5.controller.App", { onInit() { @@ -26,16 +27,17 @@ sap.ui.define( AppState.getGlobal("checkLocal") ? window.location.href : uri, ); - // Wire up the controller instances and the app container. All other + // Wire up the controller instances and the app container. One + // controller per view slot, driven by the slot table in + // core/ViewSlots - the single place that knows which slots exist, so + // adding one there does not need a matching line here. All other // shared state (callback arrays, error log, roundtrip flags, ...) // starts from the defaults that core/AppState set during // Component.init. - state.oController = new Controller(); + for (const slot of ViewSlots.slots) { + state[slot.controllerProp] = new Controller(); + } state.oApp = this.getView().byId("app"); - state.oControllerNest = new Controller(); - state.oControllerNest2 = new Controller(); - state.oControllerPopup = new Controller(); - state.oControllerPopover = new Controller(); // Kick off the initial roundtrip. Historically a stopped router's // initial routeMatched event triggered this; the manifest carries no diff --git a/core/app/z2ui5/webapp/controller/View1.controller.js b/core/app/z2ui5/webapp/controller/View1.controller.js index cb1e1f6..d53e068 100644 --- a/core/app/z2ui5/webapp/controller/View1.controller.js +++ b/core/app/z2ui5/webapp/controller/View1.controller.js @@ -1,113 +1,124 @@ // The central view controller. One instance serves each of the five view // slots (main view, two nested views, popup, popover - see -// core/ViewSlots.js). It builds the request for backend events (eB), -// dispatches frontend-only events (eF), renders the views and fragments a -// response asks for, and runs the post-render follow-ups. +// core/ViewSlots.js). It carries the protocol entry points the backend binds +// events to (eB, eBP, eF), builds the request for backend events and runs +// the response's two action phases. The display machinery behind those +// actions lives in core/actions/Slots.js. sap.ui.define( [ "sap/ui/core/mvc/Controller", - "sap/ui/core/mvc/XMLView", - "sap/ui/model/json/JSONModel", "sap/ui/core/BusyIndicator", "sap/m/MessageBox", - "sap/ui/core/Fragment", "z2ui5/core/Server", - "sap/ui/model/odata/v2/ODataModel", - "sap/ui/core/routing/HashChanger", "z2ui5/core/Lib", "z2ui5/core/FrontendAction", + "z2ui5/core/actions/Slots", "z2ui5/core/ViewSlots", + "z2ui5/core/Router", "z2ui5/core/AppState", ], ( Controller, - XMLView, - JSONModel, BusyIndicator, MessageBox, - Fragment, Server, - ODataModel, - HashChanger, Lib, FrontendAction, + Slots, ViewSlots, + Router, AppState, ) => { "use strict"; - // Helpers reused across calls; kept as module-level singletons. - const _hashChanger = HashChanger.getInstance(); - - function applyStoredSizeLimit(viewKey, oModel) { - if (!oModel) return; - // For the root slots (MAIN/NEST/NEST2) this is the max limit across them, - // since they share this one model; popup/popover get their own limit. - const limit = Lib.effectiveSizeLimit( - AppState.state.viewSizeLimits, - viewKey, - ); - if (limit !== undefined) oModel.setSizeLimit(limit); - } - return Controller.extend("z2ui5.controller.View1", { - // ------------------------------------------------------------------ - // Model change tracking - remembers which model paths the user edited - // so the next roundtrip only ships the delta. - // ------------------------------------------------------------------ - _trackChanges(oModel) { - // Mark the model as framework-owned: updateModelIfRequired may only - // reuse models that carry this change tracker. - oModel._z2ui5Tracked = true; - // Edited paths are tracked PER MODEL, not in one shared set: the main - // view and a popup/popover each have their own JSON model, and a - // roundtrip ships only the picked model's own edits. A single shared - // set would build the delta of one model against another's data (a - // path missing there serializes as `undefined` and clears the field - // on the backend) and would drop the other model's still-unsent edits. - oModel._z2ui5ChangedPaths = new Set(); - oModel.attachPropertyChange((e) => { - const params = e.getParameters(); - const raw = params.path; - const ctx = params.context; - if (!raw) return; - // Resolve relative paths against the binding context. - const changedPath = - ctx && !raw.startsWith("/") ? `${ctx.getPath()}/${raw}` : raw; - if (changedPath.startsWith("/")) { - oModel._z2ui5ChangedPaths.add(changedPath); - } - }); - return oModel; - }, - onAfterRendering() { - if (AppState.state.oResponse && !AppState.state.oResponse._processed) { - this._processAfterRendering(); - } + // _processAfterRendering re-checks _processed itself - only the + // null check is load-bearing here + if (AppState.state.oResponse) this._processAfterRendering(); }, // Runs once after each roundtrip's view has been rendered, in two // named phases: display pending fragments/views, then update the - // browser history/hash. - async _processAfterRendering() { + // browser history/hash. `reqSeq` is the stamp of the request the + // response being processed belongs to (Server.responseSuccess); the + // onAfterRendering entry above has none and falls back to the newest. + async _processAfterRendering(reqSeq) { + // The claim happens BEFORE the try: the MAIN rebuild is a system + // action now, so slots render (and re-enter here via their own + // onAfterRendering - possibly with a NESTED controller as `this`) + // while phase 1 is still awaiting. A losing entry must return here + // and never reach the finally, which would hide the busy state and + // consume the pending custom JS mid-phase, on the wrong controller. + // The record is also pinned for the finally: the shared + // AppState.state.oResponse may point at a newer response by then. + const oResponse = AppState.state.oResponse; + if (!oResponse || oResponse._processed) return; + oResponse._processed = true; try { - const oResponse = AppState.state.oResponse; - if (oResponse._processed) return; - oResponse._processed = true; - - const PARAMS = oResponse.PARAMS; - if (!PARAMS) return; - - await this._displayPendingViews(PARAMS); + // An APP SWITCH kills the two standalone slots implicitly: they + // live outside the MAIN control tree, so they do not fall with + // the page the new app renders - and the switch is visible right + // here (the response names its app), so no destroy action travels + // for it. BEFORE the system actions, so the new app's own + // popup_display still opens afterwards. (A hop to another + // instance of the SAME class is invisible here - the backend + // queues the teardown for exactly that case.) + const state = AppState.state; + if (oResponse.APP && state.renderedApp !== oResponse.APP) { + if (state.renderedApp) { + ViewSlots.destroy("POPUP"); + ViewSlots.destroy("POPOVER"); + } + // the leaving app's keyboard shortcuts die with it - the new app + // registers its own (actions/Shortcuts documents this reset) - + // and so do its tree-expansion snapshots, which are keyed by the + // LOCAL tree_id and would otherwise leak into a same-named tree + // of the next app + state.shortcuts = {}; + state.treeStates = {}; + state.renderedApp = oResponse.APP; + } + // No early return on an empty action list: a response without any + // action still gets its model push, its hash sync and the + // after-render hooks below - with the ROUTER and updateModel + // actions derived/gated away, an action-free response is the + // COMMON case now, not the exception. + if (oResponse.S_ACTION) { + // Stamp of the request this response belongs to: every await in + // the display phase re-checks it, so a response superseded by a + // parallel request (check_allow_multi_req, Back/Forward restore) + // never attaches popups/nested views the backend no longer knows. + const seq = reqSeq ?? Server._requestSeq; + await this._runSystemActions(oResponse, seq); + } // The app may have been torn down (reset / FLP re-launch) while the // pending views loaded; don't mutate history or fire onAfterRendering // hooks against a dead app (the custom-JS phase below guards the same - // way via isDestroyed). - if (Lib.isDestroyed(this)) return; - this._updateBrowserHistory(PARAMS, oResponse.ID); - if (PARAMS.SET_NAV_BACK) history.back(); - + // way via isDestroyed). And a response a PARALLEL request replaced + // mid-phase must not push its model or write its ids into the URL - + // the push would read the NEWER response's data into this stale + // render, and the sync would mix this draft id with the newer app. + // The newer response runs its own push and sync. + if (Lib.isDestroyed(this) || oResponse !== AppState.state.oResponse) { + return; + } + // A MODEL key in the response IS the model push - run it after the + // displays, so a slot built in this same roundtrip is filled before + // it is pushed to. This reaches what a fresh build alone does not: + // a nested view re-displayed without its MAIN view (it inherits the + // MAIN model by UI5 propagation) and a popup left open across a + // roundtrip that rebuilt no view (one that DOES rebuild MAIN takes + // the standalone slots down with it - see actions/Slots). + if (oResponse.MODELPRESENT) Slots.action("updateModel"); + // Phase 2: ONE history/hash sync per response. A ROUTER action only + // travels when the roundtrip carries nav intent - its options were + // stashed by the ControlCall hook. The plain response still syncs, + // so hash routing and app-state tracking follow every new draft id. + Router.sync({ + ...(oResponse._routerOptions || {}), + id: oResponse.ID, + }); Lib.runCallbacks(AppState.state.onAfterRendering); } catch (e) { Lib.logError("_processAfterRendering: unexpected error", e); @@ -119,307 +130,46 @@ sap.ui.define( // run the follow-up JS snippets the backend asked for. Doing it here // - rather than as an early microtask - guarantees render-dependent // actions like SET_FOCUS find their target control in the DOM. - this._runPendingCustomJs(); + this._runPendingCustomJs(oResponse); } }, - // Phase 1: open/destroy the popup, nested views and popover the - // response asked for. - async _displayPendingViews(PARAMS) { - const S_POPUP = PARAMS.S_POPUP; - const S_VIEW_NEST = PARAMS.S_VIEW_NEST; - const S_VIEW_NEST2 = PARAMS.S_VIEW_NEST2; - const S_POPOVER = PARAMS.S_POPOVER; - - if (S_POPUP?.CHECK_DESTROY) this.destroyPopup(); - if (S_POPOVER?.CHECK_DESTROY) this.destroyPopover(); - if (S_VIEW_NEST?.CHECK_DESTROY) this.destroyNestView(); - if (S_VIEW_NEST2?.CHECK_DESTROY) this.destroyNestView2(); - - if (S_POPUP?.XML) { - this.destroyPopup(); - await this.displayFragment(S_POPUP.XML); - } - - if (!AppState.state.checkNestAfter && S_VIEW_NEST?.XML) { - this.destroyNestView(); - await this.displayNestedView(S_VIEW_NEST.XML, "NEST"); - AppState.state.checkNestAfter = true; - } - - if (!AppState.state.checkNestAfter2 && S_VIEW_NEST2?.XML) { - this.destroyNestView2(); - await this.displayNestedView(S_VIEW_NEST2.XML, "NEST2"); - AppState.state.checkNestAfter2 = true; - } - - if (S_POPOVER?.XML) { - this.destroyPopover(); - await this.displayPopover(S_POPOVER.XML, S_POPOVER.OPEN_BY_ID); - } - }, - - // Phase 2: push the backend-requested URL and update the app-state - // hash. - _updateBrowserHistory(PARAMS, ID) { - try { - // Hash-based app routing (UI5 Router style), opt-in per session. The - // flag carries the MODE (z2ui5_if_client=>cs_nav_mode): "KEEP" routes - // by class + draft id (exact state restored on Back/Forward), "FRESH" - // routes by class only (Back/Forward start the app fresh); any other - // non-empty value ("DEFAULT") turns routing back OFF (framework - // default). An EMPTY value is "no change" so a later roundtrip that - // does not re-send the flag keeps routing on with the mode already - // chosen (an app that enabled it once in check_on_init stays routed). - if (PARAMS.SET_NAV_ROUTING) { - const mode = String(PARAMS.SET_NAV_ROUTING).toUpperCase(); - const on = mode === "KEEP" || mode === "FRESH"; - AppState.state.navRouting = on; - AppState.state.navMode = on ? mode : null; - } - const state = AppState.state; - if (state.navRouting) { - const app = state.oResponse?.APP; - if (app) { - // In FRESH mode the route carries the class only, so every history - // entry (Back/Forward/reload/bookmark) starts the app fresh; in - // KEEP mode it carries the draft id too, so they restore the exact - // preserved state. draftForRoute is what the route (and the echo - // guard below) uses - null in FRESH, the app-state ID in KEEP. - const draftForRoute = state.navMode === "FRESH" ? null : ID; - // Set current app/draft BEFORE touching the hash: the setHash/ - // replaceHash below re-fires hashChanged, and Server.onHashChange - // compares the incoming route's draft id against currentDraftId to - // ignore our own echo (no navigation loop). In FRESH mode there is - // no draft, so the guard matches on the class instead. - state.currentApp = app; - state.currentDraftId = draftForRoute; - if (state.navFromHash) { - // This render is the result of a browser Back/Forward (or manual - // hash edit) routed through Server.onHashChange. The hash already - // matches this history entry and the browser sits at a non-top - // position - rewriting the hash here would drop the forward - // entries and break the Forward button. Just adopt the state. - state.navFromHash = false; - } else if (!PARAMS.SET_PUSH_STATE) { - // Reflect the running app in the URL as a bookmarkable route - // "/app/" (FRESH) or "/app//" (KEEP). In - // KEEP the draft id makes Back/Forward restore the EXACT - // preserved state, not a fresh app. A forward navigation done in - // the backend (client->nav_app_call, CHECK_NAV_APP_CALL) pushes a - // NEW history entry so Back returns to the calling app - the - // routing equivalent of a UI5 navTo. A plain roundtrip only - // replaces the current (top) entry, advancing it to the app's - // latest draft so a later Forward restores the newest state. - const route = Lib.routeForApp(app, draftForRoute); - if (PARAMS.CHECK_NAV_APP_CALL) { - // repoint the caller's entry first - it borrows the echo - // guard, so restore it to this app before pushing the route - this._repointCallerEntry(PARAMS, draftForRoute); - state.currentApp = app; - state.currentDraftId = draftForRoute; - _hashChanger.setHash(route); - } else if (_hashChanger.getHash() !== route) { - _hashChanger.replaceHash(route); - } - } - } - // Routing owns the app-state hash; skip the legacy handling below. - if (!PARAMS.SET_PUSH_STATE) return; - } - - if (PARAMS.SET_PUSH_STATE) { - const hash = _hashChanger.getHash(); - const newUrl = `${window.location.pathname}${window.location.search}#${hash}${PARAMS.SET_PUSH_STATE}`; - history.pushState(null, "", newUrl); - } - // Keep the leading "/" so the live URL matches the format the copy - // link (FrontendAction.evClipboardAppState) writes and the backend - // restore path expects: request_app_start_draft reads the state id - // via iv_hash+2, i.e. it skips exactly the "#/" prefix. Without the - // slash the live hash is "#z2ui5-xapp-state=..." and iv_hash+2 eats - // the leading "z", so bookmarking/reloading the live URL never - // restores the app state (only the explicitly copied link did). - const newHash = PARAMS.SET_APP_STATE_ACTIVE - ? `/z2ui5-xapp-state=${ID || ""}` - : ""; - _hashChanger.replaceHash(newHash); - } catch (e) { - Lib.logError("_updateBrowserHistory: history update failed", e); + // Phase 1: run the SYSTEM actions - the framework's own view-lifecycle + // calls (destroy a slot, display one, push the model into it), in the + // order the backend queued them. They run BEFORE anything an app + // queued, and one at a time: a display is async, and the next action + // may well be about the slot it is still building. The action context + // carries the request stamp (so the slot displays can discard a build + // a newer parallel request superseded) and the response record (so the + // ROUTER action stashes its options on the response they belong to). + async _runSystemActions(oResponse, seq) { + const systemJs = oResponse?.S_ACTION?.T_SYSTEM; + if (!systemJs) return; + for (const item of systemJs) { + // Stop the whole phase once a newer request superseded this + // response - the remaining actions would tear down or overwrite + // what the newer response builds (the per-display guards check + // the same stamp, but the synchronous teardowns do not). + if (Lib.isDestroyed(this) || seq !== Server._requestSeq) return; + await FrontendAction.runSystem(item, this, { + seq, + response: oResponse, + }); } }, - // Point the CALLING app's history entry at the draft the backend saved - // for it during this very nav_app_call (PARAMS.NAV_APP_CALL_PREV_*). - // That draft carries every client-side change the user made since the - // caller last rendered - two-way bound switches, checkboxes, input - all - // of which travelled to the backend with the event that triggered the - // navigation. The entry itself still carries the older draft of that - // last render, so without this Back restores the caller as it was - // RENDERED and silently drops those changes. The entry is still the top - // one here (the called app's route is pushed right after), so a - // replaceHash updates it in place and leaves the history depth alone. - // KEEP mode only - a FRESH route carries no draft and always restarts - // the app anyway. - _repointCallerEntry(PARAMS, draftForRoute) { - const state = AppState.state; - const prevApp = PARAMS.NAV_APP_CALL_PREV_APP; - const prevDraft = PARAMS.NAV_APP_CALL_PREV_ID; - if (!draftForRoute || !prevApp || !prevDraft) return; - const prevRoute = Lib.routeForApp(prevApp, prevDraft); - if (_hashChanger.getHash() === prevRoute) return; - // Server.onHashChange ignores the echo of our own hash writes by - // comparing the route's draft id against currentDraftId - adopt the - // caller's fresh draft BEFORE replacing, or the write reads as a user - // navigation and fires a restore roundtrip. The caller of this method - // sets the state back to the called app right afterwards. - state.currentDraftId = prevDraft; - _hashChanger.replaceHash(prevRoute); - }, - // Execute the follow-up JS snippets stashed by Server.responseSuccess. // Runs once per roundtrip, after the view has rendered. - _runPendingCustomJs() { - const customJs = AppState.state.pendingCustomJs; - AppState.state.pendingCustomJs = null; + _runPendingCustomJs(oResponse) { + const customJs = oResponse?._pendingCustomJs; + if (oResponse) oResponse._pendingCustomJs = null; if (!customJs) return; if (Lib.isDestroyed(this)) return; for (const item of customJs) { - Server._runCustomJs(item, this); + FrontendAction.runCustom(item, this); } }, - _createViewModel() { - const data = AppState.state.oResponse?.OVIEWMODEL; - return this._trackChanges(new JSONModel(data)); - }, - - // ------------------------------------------------------------------ - // Display: popups, popovers, nested views, main view - // ------------------------------------------------------------------ - - async displayFragment(xml) { - const oModel = this._createViewModel(); - applyStoredSizeLimit("POPUP", oModel); - const oFragment = await Fragment.load({ - definition: xml, - controller: ViewSlots.getController("POPUP"), - id: "popupId", - }); - // The app might have been torn down while the fragment loaded. - if (!Lib.isAlive(AppState.state.oApp)) { - oFragment.destroy(); - return; - } - oFragment.setModel(oModel); - // The shared device + message models are attached inside - // ViewSlots.setView (the single funnel), so error paths that - // destroy a view without reaching setView never register it. - ViewSlots.setView("POPUP", oFragment); - oFragment.open(); - }, - - async displayPopover(xml, openById) { - // No catch-all here on purpose: a malformed-XML load or render - // failure must propagate to _processAfterRendering and surface the - // fatal "App Terminated" overlay, exactly like displayFragment and - // displayNestedView. The explicit returns below stay graceful - they - // handle expected, non-error conditions (app torn down mid-load, or - // the openBy anchor not being present), matching the parent-not-found - // guard in displayNestedView. - const oModel = this._createViewModel(); - applyStoredSizeLimit("POPOVER", oModel); - const oFragment = await Fragment.load({ - definition: xml, - controller: ViewSlots.getController("POPOVER"), - id: "popoverId", - }); - if (!Lib.isAlive(AppState.state.oApp)) { - oFragment.destroy(); - return; - } - oFragment.setModel(oModel); - - // Find the control to attach the popover to: any open slot first, - // then the global UI5 control registry as a last resort. - const oControl = ViewSlots.resolveById(openById); - - if (!oControl) { - Lib.logError( - `displayPopover: openBy control '${openById}' not found`, - ); - oFragment.destroy(); - return; - } - ViewSlots.setView("POPOVER", oFragment); - oFragment.openBy(oControl); - }, - - async displayNestedView(xml, slotKey) { - const paramKey = ViewSlots.paramByKey(slotKey); - // Nested views do NOT create their own model. They are inserted into - // the MAIN control tree below and inherit its default JSON model via - // UI5 model propagation, so every view binds against the same data with - // one change tracker and one refresh per roundtrip - no duplicate - // models pointing at the same data. The model passed to the XML - // preprocessor here only feeds {template>...} bindings at build time; - // it is the MAIN view's JSON model (the named "http" model when - // SWITCH_DEFAULT_MODEL_PATH moved OData into the default slot, otherwise - // the default model), mirroring displayView's template model. - const oMainView = ViewSlots.getView("MAIN"); - const oTemplateModel = - oMainView?.getModel("http") ?? oMainView?.getModel(); - const oView = await XMLView.create({ - definition: xml, - controller: ViewSlots.getController(slotKey), - preprocessors: { xml: { models: { template: oTemplateModel } } }, - }); - - if (!Lib.isAlive(AppState.state.oApp)) { - oView.destroy(); - return; - } - - const nestParams = AppState.state.oResponse?.PARAMS?.[paramKey]; - if (!nestParams) { - Lib.logError(`displayNestedView: missing PARAMS.${paramKey}`); - oView.destroy(); - return; - } - const { ID, METHOD_DESTROY, METHOD_INSERT } = nestParams; - - const oParent = ViewSlots.byId("MAIN", ID); - if (!oParent) { - Lib.logError( - `displayNestedView: parent control '${ID}' not found, nested view discarded`, - ); - oView.destroy(); - return; - } - - // METHOD_DESTROY is optional: only call it when the app asked for a - // parent teardown method. An empty value used to reach oParent[""]() - // and throw on every render (e.g. app 065 passes only method_insert). - if (METHOD_DESTROY) { - try { - oParent[METHOD_DESTROY](); - } catch (e) { - Lib.logError( - `displayNestedView: parent destroy method '${METHOD_DESTROY}' failed`, - e, - ); - } - } - try { - oParent[METHOD_INSERT](oView); - } catch (e) { - Lib.logError("displayNestedView: parent insert method failed", e); - oView.destroy(); - return; - } - ViewSlots.setView(slotKey, oView); - }, - // Thin wrappers around the shared slot teardown in ViewSlots, kept // because existing apps may call them via custom JS. destroyPopup() { @@ -442,8 +192,8 @@ sap.ui.define( // eF = "event frontend": handles frontend-only events triggered by // the backend response, without a roundtrip. The name is part of the // protocol - backend-generated view XML binds events to eB/eF - and - // must not be renamed. The individual handlers live in - // core/FrontendAction.js. + // must not be renamed. The individual handlers live in the domain + // modules under core/actions/ (merged in core/FrontendAction.js). // ------------------------------------------------------------------ eF(...args) { FrontendAction.execute(this, args); @@ -459,10 +209,16 @@ sap.ui.define( // Example: sap.tnt NavigationListItem.press, where cancelling the // default suppresses the item selection and leaves the decision to // the backend. The name is part of the protocol - do not rename it. + // + // The second argument is the veto CONDITION, so the decision can be + // made per firing instead of per wire: s_ctrl-check_prevent_default + // sends the constant true, s_ctrl-prevent_default_expr sends an + // expression UI5 resolves on each firing (e.g. "is this the one column + // that must not be resized?"). Everything after it is the eB payload. // ------------------------------------------------------------------ - eBP(oEvent, ...args) { + eBP(oEvent, bVeto, ...args) { // guard the call: a malformed wire (no $event) must still round-trip - if (typeof oEvent?.preventDefault === "function") { + if (bVeto && typeof oEvent?.preventDefault === "function") { oEvent.preventDefault(); } this.eB(...args); @@ -482,12 +238,14 @@ sap.ui.define( // The name is part of the protocol - backend-generated view XML binds // events to eB/eF - and must not be renamed. // - // args[0] is the event array built by the backend: + // args[0] is the event array built by the backend (get_event): // [0] event name + // [1] reserved placeholder, always false // [2] "ignore busy" flag - background events (e.g. timers) skip the // busy guard below // [3] "use main view model" flag - events fired from a popup or - // popover controller that still target the main app's model + // popover controller that still target the main app's model; + // not emitted by the framework today, only by custom JS // ------------------------------------------------------------------ eB(...args) { const [, , ignoreBusy, useMainModel] = args[0]; @@ -537,8 +295,8 @@ sap.ui.define( // If the user edited model paths, send only the delta to keep the // payload small. The edited paths live on the picked model itself - // (set in _trackChanges), so onBeforeRoundtrip hooks that mark paths - // dirty (e.g. the Scrolling control) must have run above first. + // (set in Slots.trackChanges), so onBeforeRoundtrip hooks that mark + // paths dirty (e.g. the Scrolling control) must have run above first. const changedPaths = oModel?._z2ui5ChangedPaths; if (oModel && changedPaths?.size > 0) { const data = oModel.getData(); @@ -557,24 +315,19 @@ sap.ui.define( // turned into JSON strings by the backend when it fills // T_EVENT_ARG, so apps keep receiving them as strings; stringifying // them here as well would encode (and escape) the payload twice. - // `args` is this call's own rest-parameter array (Server.roundtrip - // mutates ARGUMENTS via shift), so it can be handed over directly - - // no defensive copy needed. - oBody.ARGUMENTS = args; + // Control-valued arguments are marshalled into plain data first (see + // Lib.normalizeEventArgs): a UI5 event parameter is often a control or + // an array of controls, and JSON.stringify throws on the circular + // parent/aggregation graph of a ManagedObject. Everything else passes + // through untouched. normalizeEventArgs returns a fresh array, which + // is what Server.roundtrip needs - it mutates ARGUMENTS via shift and + // must not reach this call's own rest-parameter array. + oBody.ARGUMENTS = Lib.normalizeEventArgs(args); Server.roundtrip(oBody); Lib.runCallbacks(AppState.state.onAfterRoundtrip); }, - // The framework-owned JSON model on a slot's view: the DEFAULT model - // normally, but the NAMED "http" model when SWITCH_DEFAULT_MODEL_PATH put - // an OData model in the default slot. Returns undefined when neither model - // is ours (marked by _z2ui5Tracked). - _resolveTrackedModel(oView) { - const isOurs = (m) => (m?._z2ui5Tracked ? m : undefined); - return isOurs(oView.getModel()) ?? isOurs(oView.getModel("http")); - }, - _pickModelForRoundtrip(useMainModel) { // useMainModel forces use of the main view's model even when called // from a popup/popover controller. @@ -590,101 +343,12 @@ sap.ui.define( // edit is silently dropped. The data and changedPaths delta are shared // across the root slots, so any of them yields the same model. if (Lib.isRootModelSlot(slotKey)) { - return this._resolveTrackedModel(oView); + return Slots.resolveTrackedModel(oView); } // Popup/popover are standalone and return their own (default) model. return oView.getModel(); }, - - // Refresh a slot's model when the response signals an update for it - // (CHECK_UPDATE_MODEL - the data-only roundtrip every app triggers - // via client->view_model_update( )). - updateModelIfRequired(slotKey) { - const params = AppState.state.oResponse?.PARAMS; - const slotParams = params?.[ViewSlots.paramByKey(slotKey)]; - if (!slotParams?.CHECK_UPDATE_MODEL) return; - - const oView = ViewSlots.getView(slotKey); - if (!oView) return; - - // Reuse the existing model whenever it is ours: setData() keeps the - // view's bindings alive and only refreshes what changed, while a new - // model + setModel() destroys and recreates every binding - measured - // ~3x slower with all values changed and ~150x slower when little - // changed (see node/tests-examples/modelUpdate.bench.spec.js). - // Never overwrite an OData default (switch mode) with a fresh JSON model. - const tracked = this._resolveTrackedModel(oView); - if (tracked) { - applyStoredSizeLimit(slotKey, tracked); - // MAIN and its nested views resolve to the SAME root model here, and - // the update loop calls this once per slot. setData replaces the - // model's data reference with OVIEWMODEL, so once the first root slot - // has swapped it in, the others already hold it - skip the redundant - // setData (and its full binding refresh) instead of running it once - // per shared slot. - const data = AppState.state.oResponse?.OVIEWMODEL; - if (tracked.getData() !== data) tracked.setData(data); - return; - } - - // No framework-owned model on this slot at all: bind a fresh default - // JSON model (keeps the previous behavior for that edge case). - const oModel = this._createViewModel(); - applyStoredSizeLimit(slotKey, oModel); - oView.setModel(oModel); - }, - - // Replace the main app view with the XML coming from the backend. - async displayView(xml, viewModel, reqSeq) { - const oViewModel = this._trackChanges(new JSONModel(viewModel)); - - const sView = AppState.state.oResponse?.PARAMS?.S_VIEW; - const switchPath = sView?.SWITCH_DEFAULT_MODEL_PATH; - - // When the app wants OData as the default model, build it here and - // keep the JSON model as the named "http" model. - let oModel; - if (switchPath) { - oModel = new ODataModel({ - serviceUrl: switchPath, - annotationURI: sView.SWITCHDEFAULTMODELANNOURI || "", - }); - } else { - oModel = oViewModel; - } - applyStoredSizeLimit("MAIN", oModel); - - const oView = await XMLView.create({ - definition: xml, - models: oModel, - controller: ViewSlots.getController("MAIN"), - id: "mainView", - preprocessors: { xml: { models: { template: oViewModel } } }, - }); - - // Guard against the app being destroyed during the await above. - if (!Lib.isAlive(AppState.state.oApp)) { - oView.destroy(); - if (switchPath) oModel.destroy(); - return; - } - - // A newer parallel request (check_allow_multi_req) superseded this one - // while XMLView.create was awaiting - discard this rebuild instead of - // letting an out-of-order resolve overwrite the newer view. Last-write - // wins by request order, not by which create() happened to resolve last. - if (reqSeq !== undefined && reqSeq !== Server._requestSeq) { - oView.destroy(); - if (switchPath) oModel.destroy(); - return; - } - - ViewSlots.setView("MAIN", oView); - if (switchPath) oView.setModel(oViewModel, "http"); - AppState.state.oApp.removeAllPages(); - AppState.state.oApp.insertPage(oView); - }, }); }, ); diff --git a/core/app/z2ui5/webapp/core/AppState.js b/core/app/z2ui5/webapp/core/AppState.js index ef620fe..38270bd 100644 --- a/core/app/z2ui5/webapp/core/AppState.js +++ b/core/app/z2ui5/webapp/core/AppState.js @@ -31,6 +31,11 @@ // core:require; the global covers releases without // core:require); owns the date helpers Util // re-exports - grows via framework PRs only (Component) +// ccResourceRoot absolute path of the custom-control BSP, set by the +// backend GET page when there is no sibling BSP to +// resolve "../z2ui5_cci/" against (backend HTML) +// cccResourceRoot same for the customer frontend-extension BSP +// ("../z2ui5_ccc/") (backend HTML) // requestTimeoutMs optional override for the roundtrip timeout (apps) // apps can register functions via the js_loader popup // and call them through the Z2UI5 frontend event @@ -42,7 +47,15 @@ // oApp sap.m.App hosting the main view (App.controller) // oOwnerComponent, oDeviceModel (Component / App.controller) // oView, oViewNest, oViewNest2, oViewPopup, oViewPopover -// the five view slots, see core/ViewSlots.js (View1) +// the five view slots, written by ViewSlots.setView +// slotXml the view XML each slot was filled with, per slot key - +// recorded by ViewSlots.setView and dropped by +// ViewSlots.destroy, so it tracks the slot itself no +// matter who tore it down (backend action or a +// roundtrip-free frontend close). The developer tools +// read a slot's source from here: a fragment or a view +// built from a `definition` keeps no viewContent of its +// own // oController, oControllerNest, oControllerNest2, oControllerPopup, // oControllerPopover controller instance per slot (App.controller) // oLaunchpad FLP services when running inside the launchpad, else @@ -54,11 +67,14 @@ // Server.roundtrip/readHttp; this record exists for // onBeforeRoundtrip hooks and the developer tools // (View1.eB / Server) -// oResponse last processed response { ID, PARAMS, OVIEWMODEL } +// oResponse last processed response { ID, S_ACTION, OVIEWMODEL, +// APP, MODELPRESENT } +// renderedApp class name of the last rendered app - an APP switch in +// a response tears the standalone slots down implicitly +// (View1._processAfterRendering) // responseData raw parsed response JSON (Server.readHttp); kept -// besides oResponse because it carries fields the -// cooked record does not (e.g. S_FRONT.APP, used by -// the developer tools) +// besides oResponse because the developer tools render +// the raw payload // contextId stateful session id, header transport (Server) // isBusy roundtrip in flight (View1.eB / Server) // oSentModel the JSON model whose edited-path set the in-flight @@ -66,25 +82,30 @@ // once that request wins (Server), so a stale response // never clears newer edits and edits made in a DIFFERENT // model (e.g. a popover) are never shipped against this one -// checkNestAfter, checkNestAfter2 nested views rebuilt this roundtrip // search overrides location.search in S_FRONT; never written // by the framework itself, set externally (custom JS) -// pendingCustomJs follow-up JS to run after rendering (Server) // // Control / helper state // errors capped error log, see Lib.logError -// timers single pending backend timer (FrontendAction) +// timers single pending backend timer (actions/ViewOps) // shortcuts registered keyboard shortcuts, normalized combo -> -// { event, controller } (FrontendAction.KEYBOARD_SHORTCUT); +// scope -> { event, controller }, the scope being a view +// slot key or "" for unscoped (actions/Shortcuts). Dispatch takes the innermost OPEN +// scope, so a popover-local shortcut shadows the page one +// the way a UI5 CommandExecution in dependents does; // an app switch resets it, the document listener stays -// lastScrolled last scrolled element per slot (Server.onScrollCapture) -// viewSizeLimits per-slot model size limits (FrontendAction) +// lastScrolled last scrolled element per slot (ScrollFocus.onScrollCapture) +// viewSizeLimits per-slot model size limits (actions/ViewOps) // treeStates tree binding state per tree_id across rebuilds (Tree control) -// developerTools DeveloperTools instance (Component, Ctrl+F12) // lastError the last fatal error shown by ErrorView (title/text/ -// onRetry), so the DeveloperTools Error tab can re-show it +// onRetry), so a details view can re-show it // onBeforeRoundtrip, onAfterRoundtrip, onAfterRendering, -// onBeforeEventFrontend callback arrays, see Lib.registerCallback +// onBeforeEventFrontend, onErrorDetails callback arrays, see +// Lib.registerCallback. onErrorDetails is the extension +// point behind the fatal-error overlay's Details action: +// ErrorView runs whatever registered and hides the button +// when nothing did (devtools/DevTools.js registers +// the in-app developer tools there) sap.ui.define([], () => { "use strict"; @@ -106,21 +127,22 @@ sap.ui.define([], () => { oControllerNest2: null, oControllerPopup: null, oControllerPopover: null, + slotXml: {}, oLaunchpad: null, // Roundtrip state oBody: null, oResponse: null, + renderedApp: null, responseData: null, contextId: null, isBusy: false, oSentModel: null, - checkNestAfter: false, - checkNestAfter2: false, search: null, - pendingCustomJs: null, // Hash-based app routing (UI5 Router style, opt-in via set_nav_routing). + // Owned by core/Router.js - see there for the route format and how the + // hash is split between the FLP shell and the app. // navRouting once the running app enabled routing, the URL hash mirrors // the current app as a bookmarkable route and browser // Back/Forward navigate between apps via the hash. @@ -135,7 +157,7 @@ sap.ui.define([], () => { // our own hash writes do not re-trigger a navigation, and // (KEEP) browser Back/Forward restore the exact draft. // navFromHash the pending roundtrip was triggered by a browser - // Back/Forward (or manual hash edit) via onHashChange, so + // Back/Forward (or manual hash edit) via the router, so // the resulting render must NOT rewrite the hash: the // browser is at a non-top history position and rewriting // there drops the forward entries (Forward would break). @@ -152,7 +174,6 @@ sap.ui.define([], () => { lastScrolled: {}, viewSizeLimits: {}, treeStates: {}, - developerTools: null, lastError: null, // Callback arrays (see Lib.registerCallback / Lib.runCallbacks) @@ -160,6 +181,7 @@ sap.ui.define([], () => { onAfterRoundtrip: [], onAfterRendering: [], onBeforeEventFrontend: [], + onErrorDetails: [], }; } diff --git a/core/app/z2ui5/webapp/core/DeveloperTools.fragment.xml b/core/app/z2ui5/webapp/core/DeveloperTools.fragment.xml deleted file mode 100644 index 982bb5c..0000000 --- a/core/app/z2ui5/webapp/core/DeveloperTools.fragment.xml +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/app/z2ui5/webapp/core/DeveloperTools.js b/core/app/z2ui5/webapp/core/DeveloperTools.js deleted file mode 100644 index c404c9c..0000000 --- a/core/app/z2ui5/webapp/core/DeveloperTools.js +++ /dev/null @@ -1,761 +0,0 @@ -sap.ui.define( - [ - "sap/ui/core/Control", - "sap/ui/core/Fragment", - "sap/ui/model/json/JSONModel", - "z2ui5/core/Lib", - "z2ui5/core/ViewSlots", - "z2ui5/core/AppState", - "z2ui5/core/ErrorView", - ], - (Control, Fragment, JSONModel, Lib, ViewSlots, AppState, ErrorView) => { - "use strict"; - - // Fragment id under which the developer tools dialog's controls are registered; - // used to resolve controls by their id instead of by content position. - const FRAGMENT_ID = "z2ui5DeveloperTools"; - - // toJson() pretty-prints with this many spaces per nesting level, so a - // line's leading-space count divided by it gives that line's JSON depth. - const INDENT_UNIT = 3; - - // The System tab shows the whole (deeply nested) z2ui5 global; open only - // the first two levels so it is readable - the rest can be unfolded by - // hand in the editor. - const SYSTEM_OPEN_LEVELS = 2; - - // Leading-space matcher, hoisted so the per-line fold loop below does not - // recompile it on every row of a large JSON dump. - const LEADING_SPACES = /^ */; - - // JSON nesting depth of a pretty-printed line, read from its indentation. - function indentLevel(line, unit) { - return Math.floor(LEADING_SPACES.exec(line)[0].length / unit); - } - - // Fold every foldable block in the ACE edit session that sits at or below - // `keepLevels` nesting levels, leaving the outer levels open. Uses only the - // public EditSession folding API (unfold / getFoldWidget / - // getFoldWidgetRange / addFold), so it works with any CodeEditor build; a - // block's depth is read from its line indentation. Skipping to the folded - // block's end row keeps us from descending into (already hidden) children. - function foldSessionToLevel(session, keepLevels, unit) { - session.unfold(); - const rowCount = session.getLength(); - for (let row = 0; row < rowCount; row++) { - if (session.getFoldWidget(row) !== "start") continue; - if (indentLevel(session.getLine(row) || "", unit) < keepLevels) - continue; - const range = session.getFoldWidgetRange(row); - if (range && range.isMultiLine()) { - session.addFold("...", range); - row = range.end.row; - } - } - } - - // Pretty-print any value (object, array, primitive) as indented JSON. - // `null` is used as a fallback so undefined values still produce output. - // A replacer drops circular references (the z2ui5 global can hold them, - // e.g. via ComponentData) so the output stays useful JSON instead of - // throwing and degrading to a bare "[object Object]". - function toJson(val) { - const safe = val === undefined ? null : val; - // Track the ANCESTOR chain, not every object ever visited: a plain - // WeakSet of all seen objects would mislabel a value referenced twice in - // sibling branches (common in the live z2ui5 global) as "[Circular]". - // `this` inside the replacer is the object the key belongs to, so we can - // unwind the stack back to it before testing containment. - const ancestors = []; - try { - return JSON.stringify( - safe, - function (key, value) { - if (typeof value === "object" && value !== null) { - while ( - ancestors.length > 0 && - ancestors[ancestors.length - 1] !== this - ) { - ancestors.pop(); - } - if (ancestors.includes(value)) return "[Circular]"; - ancestors.push(value); - } - return value; - }, - INDENT_UNIT, - ); - } catch { - // The developer tools must never crash the host app, so degrade to the - // plain string form if serialization still fails. - return String(safe); - } - } - - // XSL stylesheet used by prettifyXml to reindent any XML string. - const PRETTIFY_XSL = ` - - - - - - - - - - - `; - - // The XSLT processor and (de)serializers are expensive to construct, so - // we keep them as module-level singletons. - const _xmlSerializer = new XMLSerializer(); - const _domParser = new DOMParser(); - let _xsltProcessor = null; - - function getXsltProcessor() { - if (_xsltProcessor) return _xsltProcessor; - const xsltDoc = _domParser.parseFromString( - PRETTIFY_XSL, - "application/xml", - ); - _xsltProcessor = new XSLTProcessor(); - _xsltProcessor.importStylesheet(xsltDoc); - return _xsltProcessor; - } - - // Helpers to pull the various pieces of state shown in the dialog. - function getModelJson(view) { - const model = view?.getModel(); - return model?.getData(); - } - - function getViewContent(view) { - // Private member access (developer tools only): XMLView keeps the raw XML - // string as a pseudo property in mProperties, but does not declare it - // in its metadata - getProperty("viewContent") therefore throws and - // would abort the whole tab selection. Read the plain object instead. - return view?.mProperties?.viewContent; - } - - function getRenderedContent(view) { - // Private member access (developer tools only): _xContent holds the view - // XML after XML templating ran; there is no public equivalent. - return view?._xContent?.outerHTML; - } - - // Minimal text dump of the shared error log (the entries Lib.logError - // pushes to AppState.state.errors): one " " line per entry, - // oldest first. Empty log yields a short placeholder. - function formatErrorLog() { - const errors = AppState.state.errors || []; - if (!errors.length) return "(log is empty)"; - return errors.map((e) => `${e.ts} ${e.message}`).join("\n"); - } - - // The last fatal error the ErrorView overlay showed (title + full text), - // so the Error tab reproduces the overlay's content. Empty when the app - // has not hit a fatal error this session. - function formatLastError() { - const err = AppState.state.lastError; - if (!err) return "(no fatal error captured this session)"; - return err.title ? `${err.title}\n\n${err.text}` : err.text; - } - - function getResponseXml(key) { - const params = AppState.state.oResponse?.PARAMS; - const slot = params?.[key]; - return slot?.XML; - } - - // Preload the sap.ui.codeeditor modules used by the fragment. On older - // UI5 releases (e.g. 1.71) Fragment.load still processes the XML with - // the sync strategy, so an unloaded CodeEditor would be fetched via - // synchronous XHR and executed with eval - which a Content-Security- - // Policy without 'unsafe-eval' blocks. Requiring the modules - // asynchronously up front makes the sync lookup a cache hit. - function preloadCodeEditor() { - return new Promise((resolve) => { - sap.ui.require( - ["sap/ui/codeeditor/library", "sap/ui/codeeditor/CodeEditor"], - () => resolve(), - // On failure continue anyway and let Fragment.load surface the - // real error. - () => resolve(), - ); - }); - } - - // What each dropdown entry shows: either a JSON source or an XML source - // (the latter optionally with the rendered DOM for the templating - // toggle). The "SOURCE" entry is handled separately in onItemSelect. - const jsonSources = { - // The whole public z2ui5 global facade (oConfig, url, checkLocal, - // Util, app-registered members, ...). Read directly here on purpose: - // this is the developer tools inspector, whose job is to surface the live global - // as-is - functions drop out under JSON.stringify, which is fine. - // ui5lint-disable-next-line no-project-globals -- see reason above - SYSTEM: () => window.z2ui5, - MODEL: () => getModelJson(ViewSlots.getView("MAIN")), - PLAIN: () => AppState.state.responseData, - REQUEST: () => AppState.state.oBody, - POPUP_MODEL: () => getModelJson(ViewSlots.getView("POPUP")), - POPOVER_MODEL: () => getModelJson(ViewSlots.getView("POPOVER")), - NEST1_MODEL: () => getModelJson(ViewSlots.getView("NEST")), - NEST2_MODEL: () => getModelJson(ViewSlots.getView("NEST2")), - }; - - const xmlSources = { - // Prefer the actual viewContent string; fall back to the XML that - // arrived in the last server response. - VIEW: () => ({ - xml: - getViewContent(ViewSlots.getView("MAIN")) || getResponseXml("S_VIEW"), - rendered: getRenderedContent(ViewSlots.getView("MAIN")), - }), - POPUP: () => ({ xml: getResponseXml("S_POPUP") }), - POPOVER: () => ({ xml: getResponseXml("S_POPOVER") }), - NEST1: () => ({ - xml: getViewContent(ViewSlots.getView("NEST")), - rendered: getRenderedContent(ViewSlots.getView("NEST")), - }), - NEST2: () => ({ - xml: getViewContent(ViewSlots.getView("NEST2")), - rendered: getRenderedContent(ViewSlots.getView("NEST2")), - }), - }; - - return Control.extend("z2ui5.core.DeveloperTools", { - // Reformat an XML string with indentation. If anything goes wrong the - // original input is returned unchanged - the developer tools must never - // crash the host app. - prettifyXml(sourceXml) { - if (!sourceXml) return ""; - try { - const xmlDoc = _domParser.parseFromString( - sourceXml, - "application/xml", - ); - const resultDoc = getXsltProcessor().transformToDocument(xmlDoc); - if (!resultDoc) return sourceXml; - const resultXml = _xmlSerializer.serializeToString(resultDoc); - // The serializer escapes < and > inside text nodes; undo this so - // the output is browseable XML again. - return resultXml.replace(/>|</g, (match) => - match === ">" ? ">" : "<", - ); - } catch { - return sourceXml; - } - }, - - // Called when the user picks an entry in the dropdown of the developer - // tools dialog - resolve the model + key and render that tab. - onItemSelect(oEvent) { - this.renderTab( - oEvent.getSource().getSelectedKey(), - oEvent.getSource().getModel(), - ); - }, - - // Render one tab's content into the dialog model. Shared by the user's - // tab selection (onItemSelect) and show(initialTab), which opens the - // dialog directly on a given tab (e.g. the error popup's Details jumps - // to "ERROR"). The content per entry is defined declaratively in - // jsonSources / xmlSources above. - renderTab(selItem, oModel) { - if (jsonSources[selItem]) { - this.displayEditor(oModel, toJson(jsonSources[selItem]()), "json"); - if (selItem === "SYSTEM") this.foldSystemTab(); - return; - } - - if (xmlSources[selItem]) { - const { xml, rendered } = xmlSources[selItem](); - this.displayEditor( - oModel, - this.prettifyXml(xml), - "xml", - this.prettifyXml(rendered), - ); - return; - } - - if (selItem === "LOG") { - this.displayEditor(oModel, formatErrorLog(), "text"); - return; - } - - if (selItem === "ERROR") { - this.showError(oModel); - return; - } - - if (selItem === "SOURCE") this.showAbapSource(oModel); - }, - - // Show the last fatal error (the ErrorView overlay's content). The - // Retry/Restart/Logout actions live in the dialog footer (always - // present); refresh hasRetry so the footer's Retry button shows only - // when this error carried a retry action. - showError(oModel) { - this.displayEditor(oModel, formatLastError(), "text"); - const modelData = oModel.getData(); - modelData.hasRetry = - typeof AppState.state.lastError?.onRetry === "function"; - oModel.refresh(); - }, - - // The Error tab's buttons mirror the ErrorView overlay: re-run the - // captured request, hard-reload, or log out (reusing ErrorView's own - // logout so the launchpad/fallback logic stays in one place). - onErrorRetry() { - const onRetry = AppState.state.lastError?.onRetry; - // Retrying re-runs the request, so don't bounce back to the error popup. - this.reopenErrorOnClose = false; - this.close(); - if (typeof onRetry === "function") onRetry(); - }, - onErrorRestart() { - window.location.reload(); - }, - onErrorLogout() { - ErrorView.handleLogout(); - }, - - // Collect the content of every developer-tools tab into one plain-text - // blob so it can be copied elsewhere in one go. XML tabs are - // pretty-printed, JSON tabs serialized; empty / inactive sections are - // skipped. Every source is guarded (a throwing one can never blank the - // whole export) and each section is capped, because the SYSTEM global can - // serialize to several MB - a value that large blanks a sap.m.TextArea. - // `abapSource` is the running app's ABAP class source, fetched - // asynchronously by onExport (empty when it could not be retrieved). - buildExport(abapSource) { - // Max characters per section; long ones (mainly SYSTEM) are truncated - // so the popup's TextArea still renders. - const MAX_SECTION = 100000; - const sections = []; - const push = (title, content) => { - if (!content) return; - let body = String(content); - if (body.length > MAX_SECTION) { - body = `${body.slice(0, MAX_SECTION)}\n\n... [truncated ${body.length - MAX_SECTION} more characters - open the ${title} tab for the full content]`; - } - sections.push(`===== ${title} =====\n${body}`); - }; - const json = (fn) => { - try { - const v = fn(); - return v === undefined || v === null ? "" : toJson(v); - } catch { - return ""; - } - }; - const xml = (fn) => { - try { - return this.prettifyXml(fn()); - } catch { - return ""; - } - }; - const text = (fn) => { - try { - return fn() || ""; - } catch { - return ""; - } - }; - - if (AppState.state.lastError) push("ERROR", text(formatLastError)); - push("LOG", text(formatErrorLog)); - // The running app's ABAP class source (fetched by onExport). Placed - // high up because it is usually the most useful context when sharing - // an error - a reader can see the class that produced it. - push("ABAP SOURCE", abapSource); - push( - "RESPONSE", - json(() => jsonSources.PLAIN()), - ); - push( - "PREVIOUS REQUEST", - json(() => jsonSources.REQUEST()), - ); - push( - "VIEW", - xml(() => xmlSources.VIEW().xml), - ); - push( - "VIEW MODEL", - json(() => jsonSources.MODEL()), - ); - if (getResponseXml("S_POPUP")) { - push( - "POPUP", - xml(() => xmlSources.POPUP().xml), - ); - push( - "POPUP MODEL", - json(() => jsonSources.POPUP_MODEL()), - ); - } - if (getResponseXml("S_POPOVER")) { - push( - "POPOVER", - xml(() => xmlSources.POPOVER().xml), - ); - push( - "POPOVER MODEL", - json(() => jsonSources.POPOVER_MODEL()), - ); - } - if (getViewContent(ViewSlots.getView("NEST"))) { - push( - "NEST1", - xml(() => xmlSources.NEST1().xml), - ); - push( - "NEST1 MODEL", - json(() => jsonSources.NEST1_MODEL()), - ); - } - if (getViewContent(ViewSlots.getView("NEST2"))) { - push( - "NEST2", - xml(() => xmlSources.NEST2().xml), - ); - push( - "NEST2 MODEL", - json(() => jsonSources.NEST2_MODEL()), - ); - } - // SYSTEM (the whole z2ui5 global) is the largest by far - keep it last - // so the useful sections come first even after truncation. - push( - "SYSTEM", - json(() => jsonSources.SYSTEM()), - ); - - return sections.join("\n\n") || "(nothing to export)"; - }, - - // Fetch the running app's ABAP class source via the ADT REST endpoint, - // so the export can include the class that produced the current state. - // Returns the raw source text, or "" when the class name is unknown or - // the request fails (the endpoint needs an authenticated, ADT-enabled - // session, which is not always available - the export must still work - // without it). Never throws: the export must succeed regardless. - async fetchAbapSource() { - const url = this.getAbapSourceUrl(); - if (!url) return ""; - try { - const response = await fetch(url, { - headers: { Accept: "text/plain" }, - credentials: "same-origin", - }); - if (!response.ok) return ""; - return await response.text(); - } catch { - return ""; - } - }, - - // Show the whole export in a stretched popup with a read-through TextArea - // (selectable for manual copy) and a one-click "Copy to Clipboard". The - // ABAP class source is fetched first (asynchronously) so it can be part - // of the exported / copied blob. - async onExport() { - let text; - try { - const abapSource = await this.fetchAbapSource(); - text = this.buildExport(abapSource); - } catch (e) { - text = `(export failed: ${e?.message || e})`; - } - sap.ui.require( - ["sap/m/Dialog", "sap/m/TextArea", "sap/m/Button"], - (Dialog, TextArea, Button) => { - const area = new TextArea({ - editable: true, - width: "100%", - rows: 25, - growing: false, - }); - // Set the value explicitly (not only via the constructor) so a - // large payload is applied reliably after the control exists. - area.setValue(text); - const dialog = new Dialog({ - title: "abap2UI5 - Developer Tools Export", - stretch: true, - content: [area], - beginButton: new Button({ - text: "Copy to Clipboard", - type: "Emphasized", - press: () => { - // navigator.clipboard needs a secure (HTTPS) context, which - // an on-premise ABAP system often is not. Select the - // TextArea and use the classic execCommand("copy") first - // (works over plain HTTP), then fall back to the async API. - const ta = area.getFocusDomRef(); - let copied = false; - if (ta) { - ta.focus(); - ta.select(); - ta.setSelectionRange(0, (ta.value || "").length); - try { - copied = document.execCommand("copy"); - } catch { - copied = false; - } - } - if (!copied && navigator.clipboard?.writeText) { - navigator.clipboard.writeText(text).catch(() => {}); - } - }, - }), - endButton: new Button({ - text: "Close", - press: () => dialog.close(), - }), - afterClose: () => dialog.destroy(), - }); - dialog.addStyleClass("dbg-ltr"); - dialog.open(); - }, - ); - }, - - // The CodeEditor's underlying ACE editor, or null if it does not exist - // yet (created on the CodeEditor's first render) or the build exposes no - // internal instance. - getEditorInstance() { - const ce = Fragment.byId(FRAGMENT_ID, "developerToolsEditor"); - return ce && typeof ce.getInternalEditorInstance === "function" - ? ce.getInternalEditorInstance() - : null; - }, - - // Fold the System tab's JSON down to the first SYSTEM_OPEN_LEVELS levels. - // The ACE editor is created lazily on the CodeEditor's first render, so - // on the very first open we retry briefly until it exists. Best-effort: - // any failure leaves the tab fully expanded rather than breaking the - // developer tools. - foldSystemTab(triesLeft = 10) { - let editor; - try { - editor = this.getEditorInstance(); - } catch (e) { - Lib.logError("DeveloperTools System fold failed", e); - return; - } - if (editor) { - try { - const session = editor.getSession && editor.getSession(); - if (session && typeof session.getFoldWidget === "function") { - foldSessionToLevel(session, SYSTEM_OPEN_LEVELS, INDENT_UNIT); - } - } catch (e) { - Lib.logError("DeveloperTools System fold failed", e); - } - return; - } - if (triesLeft > 0) { - setTimeout(() => this.foldSystemTab(triesLeft - 1), 30); - } - }, - - // The ADT REST endpoint that renders the running app's ABAP class - // source. Empty when the app class name is unknown (no response yet). - getAbapSourceUrl() { - const appName = AppState.state.responseData?.S_FRONT?.APP || ""; - if (!appName) return ""; - const appId = encodeURIComponent(appName); - return `${window.location.origin}/sap/bc/adt/oo/classes/${appId}/source/main`; - }, - - // Open the ABAP class source as a top-level document in a new browser - // tab. The ADT REST endpoint renders it with syntax highlighting and its - // own "Open in ABAP Development Tools" link; opening it top-level is what - // lets that link's adt:// navigation reach the desktop ADT. From inside - // the inline iframe below the jump never worked - browsers suppress a - // custom-scheme navigation started in a subframe, and some systems block - // framing the ADT endpoint entirely (X-Frame-Options), so the preview is - // just blank there. noopener keeps the new tab from reaching back into - // window.opener. - onOpenAbapInAdt() { - const url = this.getAbapSourceUrl(); - if (!url) return; - window.open(url, "_blank", "noopener,noreferrer"); - }, - - // Show the ABAP source of the running app inside an iframe. - showAbapSource(oModel) { - const contentControl = Fragment.byId(FRAGMENT_ID, "sourceHtml"); - if (!contentControl) return; - - const url = this.getAbapSourceUrl(); - // setContent (not a bare setProperty) so an already rendered iframe - // is replaced in the live DOM; a plain property set never reached - // the DOM once the control had rendered, leaving a stale class - // on screen after navigating to another app. - contentControl.setContent( - url - ? `