@siliconst/metaui 1.0.2 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) hide show
  1. package/README.md +134 -123
  2. package/package.json +3 -2
  3. package/src/nz/co/siliconst/ui5/metaui/.library +7 -7
  4. package/src/nz/co/siliconst/ui5/metaui/controls/GeneratorHost-dbg.js +299 -163
  5. package/src/nz/co/siliconst/ui5/metaui/controls/GeneratorHost-dbg.js.map +1 -1
  6. package/src/nz/co/siliconst/ui5/metaui/controls/GeneratorHost.d.ts +54 -6
  7. package/src/nz/co/siliconst/ui5/metaui/controls/GeneratorHost.d.ts.map +1 -1
  8. package/src/nz/co/siliconst/ui5/metaui/controls/GeneratorHost.js +1 -1
  9. package/src/nz/co/siliconst/ui5/metaui/controls/GeneratorHost.js.map +1 -1
  10. package/src/nz/co/siliconst/ui5/metaui/controls/GeneratorHost.ts +292 -162
  11. package/src/nz/co/siliconst/ui5/metaui/core/ConditionEngine-dbg.js +51 -43
  12. package/src/nz/co/siliconst/ui5/metaui/core/ConditionEngine-dbg.js.map +1 -1
  13. package/src/nz/co/siliconst/ui5/metaui/core/ConditionEngine.d.ts +5 -0
  14. package/src/nz/co/siliconst/ui5/metaui/core/ConditionEngine.d.ts.map +1 -1
  15. package/src/nz/co/siliconst/ui5/metaui/core/ConditionEngine.js +1 -1
  16. package/src/nz/co/siliconst/ui5/metaui/core/ConditionEngine.js.map +1 -1
  17. package/src/nz/co/siliconst/ui5/metaui/core/ConditionEngine.ts +49 -40
  18. package/src/nz/co/siliconst/ui5/metaui/core/Engine-dbg.js +81 -58
  19. package/src/nz/co/siliconst/ui5/metaui/core/Engine-dbg.js.map +1 -1
  20. package/src/nz/co/siliconst/ui5/metaui/core/Engine.d.ts +5 -12
  21. package/src/nz/co/siliconst/ui5/metaui/core/Engine.d.ts.map +1 -1
  22. package/src/nz/co/siliconst/ui5/metaui/core/Engine.js +1 -1
  23. package/src/nz/co/siliconst/ui5/metaui/core/Engine.js.map +1 -1
  24. package/src/nz/co/siliconst/ui5/metaui/core/Engine.ts +82 -56
  25. package/src/nz/co/siliconst/ui5/metaui/core/EventBus-dbg.js +65 -50
  26. package/src/nz/co/siliconst/ui5/metaui/core/EventBus-dbg.js.map +1 -1
  27. package/src/nz/co/siliconst/ui5/metaui/core/EventBus.d.ts +9 -0
  28. package/src/nz/co/siliconst/ui5/metaui/core/EventBus.d.ts.map +1 -1
  29. package/src/nz/co/siliconst/ui5/metaui/core/EventBus.js +1 -1
  30. package/src/nz/co/siliconst/ui5/metaui/core/EventBus.js.map +1 -1
  31. package/src/nz/co/siliconst/ui5/metaui/core/EventBus.ts +60 -45
  32. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry-dbg.js +72 -59
  33. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry-dbg.js.map +1 -1
  34. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry.d.ts +6 -4
  35. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry.d.ts.map +1 -1
  36. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry.js +1 -1
  37. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry.js.map +1 -1
  38. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry.ts +71 -56
  39. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer-dbg.js +145 -36
  40. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer-dbg.js.map +1 -1
  41. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.d.ts +13 -8
  42. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.d.ts.map +1 -1
  43. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.js +1 -1
  44. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.js.map +1 -1
  45. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.ts +157 -31
  46. package/src/nz/co/siliconst/ui5/metaui/core/StateManager-dbg.js +55 -55
  47. package/src/nz/co/siliconst/ui5/metaui/core/StateManager-dbg.js.map +1 -1
  48. package/src/nz/co/siliconst/ui5/metaui/core/StateManager.d.ts.map +1 -1
  49. package/src/nz/co/siliconst/ui5/metaui/core/StateManager.js.map +1 -1
  50. package/src/nz/co/siliconst/ui5/metaui/core/StateManager.ts +56 -56
  51. package/src/nz/co/siliconst/ui5/metaui/interfaces/IEventBus-dbg.js +1 -1
  52. package/src/nz/co/siliconst/ui5/metaui/interfaces/IEventBus-dbg.js.map +1 -1
  53. package/src/nz/co/siliconst/ui5/metaui/interfaces/IEventBus.d.ts.map +1 -1
  54. package/src/nz/co/siliconst/ui5/metaui/interfaces/IEventBus.ts +29 -29
  55. package/src/nz/co/siliconst/ui5/metaui/interfaces/ILayoutManager-dbg.js +1 -1
  56. package/src/nz/co/siliconst/ui5/metaui/interfaces/ILayoutManager-dbg.js.map +1 -1
  57. package/src/nz/co/siliconst/ui5/metaui/interfaces/ILayoutManager.d.ts +6 -12
  58. package/src/nz/co/siliconst/ui5/metaui/interfaces/ILayoutManager.d.ts.map +1 -1
  59. package/src/nz/co/siliconst/ui5/metaui/interfaces/ILayoutManager.ts +21 -26
  60. package/src/nz/co/siliconst/ui5/metaui/interfaces/IPlugin-dbg.js +1 -1
  61. package/src/nz/co/siliconst/ui5/metaui/interfaces/IPlugin-dbg.js.map +1 -1
  62. package/src/nz/co/siliconst/ui5/metaui/interfaces/IPlugin.d.ts +3 -20
  63. package/src/nz/co/siliconst/ui5/metaui/interfaces/IPlugin.d.ts.map +1 -1
  64. package/src/nz/co/siliconst/ui5/metaui/interfaces/IPlugin.ts +14 -33
  65. package/src/nz/co/siliconst/ui5/metaui/interfaces/ISchema-dbg.js +1 -1
  66. package/src/nz/co/siliconst/ui5/metaui/interfaces/ISchema-dbg.js.map +1 -1
  67. package/src/nz/co/siliconst/ui5/metaui/interfaces/ISchema.d.ts +33 -43
  68. package/src/nz/co/siliconst/ui5/metaui/interfaces/ISchema.d.ts.map +1 -1
  69. package/src/nz/co/siliconst/ui5/metaui/interfaces/ISchema.ts +70 -70
  70. package/src/nz/co/siliconst/ui5/metaui/layouts/BaseLayout-dbg.js +23 -38
  71. package/src/nz/co/siliconst/ui5/metaui/layouts/BaseLayout-dbg.js.map +1 -1
  72. package/src/nz/co/siliconst/ui5/metaui/layouts/BaseLayout.d.ts +4 -17
  73. package/src/nz/co/siliconst/ui5/metaui/layouts/BaseLayout.d.ts.map +1 -1
  74. package/src/nz/co/siliconst/ui5/metaui/layouts/BaseLayout.js +1 -1
  75. package/src/nz/co/siliconst/ui5/metaui/layouts/BaseLayout.js.map +1 -1
  76. package/src/nz/co/siliconst/ui5/metaui/layouts/BaseLayout.ts +22 -34
  77. package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout-dbg.js +98 -56
  78. package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout-dbg.js.map +1 -1
  79. package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout.d.ts +7 -7
  80. package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout.d.ts.map +1 -1
  81. package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout.js +1 -1
  82. package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout.js.map +1 -1
  83. package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout.ts +97 -60
  84. package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout-dbg.js +102 -90
  85. package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout-dbg.js.map +1 -1
  86. package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout.d.ts +4 -8
  87. package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout.d.ts.map +1 -1
  88. package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout.js +1 -1
  89. package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout.js.map +1 -1
  90. package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout.ts +119 -102
  91. package/src/nz/co/siliconst/ui5/metaui/library-dbg.js +43 -32
  92. package/src/nz/co/siliconst/ui5/metaui/library-dbg.js.map +1 -1
  93. package/src/nz/co/siliconst/ui5/metaui/library-preload.js +22 -17
  94. package/src/nz/co/siliconst/ui5/metaui/library-preload.js.map +1 -1
  95. package/src/nz/co/siliconst/ui5/metaui/library.d.ts.map +1 -1
  96. package/src/nz/co/siliconst/ui5/metaui/library.js +1 -1
  97. package/src/nz/co/siliconst/ui5/metaui/library.js.map +1 -1
  98. package/src/nz/co/siliconst/ui5/metaui/library.ts +55 -43
  99. package/src/nz/co/siliconst/ui5/metaui/manifest.json +1 -0
  100. package/src/nz/co/siliconst/ui5/metaui/plugins/ArrayPlugin-dbg.js +68 -0
  101. package/src/nz/co/siliconst/ui5/metaui/plugins/ArrayPlugin-dbg.js.map +1 -0
  102. package/src/nz/co/siliconst/ui5/metaui/plugins/ArrayPlugin.d.ts +15 -0
  103. package/src/nz/co/siliconst/ui5/metaui/plugins/ArrayPlugin.d.ts.map +1 -0
  104. package/src/nz/co/siliconst/ui5/metaui/plugins/ArrayPlugin.js +2 -0
  105. package/src/nz/co/siliconst/ui5/metaui/plugins/ArrayPlugin.js.map +1 -0
  106. package/src/nz/co/siliconst/ui5/metaui/plugins/ArrayPlugin.ts +71 -0
  107. package/src/nz/co/siliconst/ui5/metaui/plugins/BasePlugin-dbg.js +54 -59
  108. package/src/nz/co/siliconst/ui5/metaui/plugins/BasePlugin-dbg.js.map +1 -1
  109. package/src/nz/co/siliconst/ui5/metaui/plugins/BasePlugin.d.ts +8 -27
  110. package/src/nz/co/siliconst/ui5/metaui/plugins/BasePlugin.d.ts.map +1 -1
  111. package/src/nz/co/siliconst/ui5/metaui/plugins/BasePlugin.js +1 -1
  112. package/src/nz/co/siliconst/ui5/metaui/plugins/BasePlugin.js.map +1 -1
  113. package/src/nz/co/siliconst/ui5/metaui/plugins/BasePlugin.ts +56 -58
  114. package/src/nz/co/siliconst/ui5/metaui/plugins/BooleanPlugin-dbg.js +41 -42
  115. package/src/nz/co/siliconst/ui5/metaui/plugins/BooleanPlugin-dbg.js.map +1 -1
  116. package/src/nz/co/siliconst/ui5/metaui/plugins/BooleanPlugin.d.ts +2 -2
  117. package/src/nz/co/siliconst/ui5/metaui/plugins/BooleanPlugin.d.ts.map +1 -1
  118. package/src/nz/co/siliconst/ui5/metaui/plugins/BooleanPlugin.js +1 -1
  119. package/src/nz/co/siliconst/ui5/metaui/plugins/BooleanPlugin.js.map +1 -1
  120. package/src/nz/co/siliconst/ui5/metaui/plugins/BooleanPlugin.ts +41 -42
  121. package/src/nz/co/siliconst/ui5/metaui/plugins/DatePlugin-dbg.js +68 -60
  122. package/src/nz/co/siliconst/ui5/metaui/plugins/DatePlugin-dbg.js.map +1 -1
  123. package/src/nz/co/siliconst/ui5/metaui/plugins/DatePlugin.d.ts +2 -2
  124. package/src/nz/co/siliconst/ui5/metaui/plugins/DatePlugin.d.ts.map +1 -1
  125. package/src/nz/co/siliconst/ui5/metaui/plugins/DatePlugin.js +1 -1
  126. package/src/nz/co/siliconst/ui5/metaui/plugins/DatePlugin.js.map +1 -1
  127. package/src/nz/co/siliconst/ui5/metaui/plugins/DatePlugin.ts +69 -63
  128. package/src/nz/co/siliconst/ui5/metaui/plugins/DateTimePlugin-dbg.js +68 -0
  129. package/src/nz/co/siliconst/ui5/metaui/plugins/DateTimePlugin-dbg.js.map +1 -0
  130. package/src/nz/co/siliconst/ui5/metaui/plugins/DateTimePlugin.d.ts +18 -0
  131. package/src/nz/co/siliconst/ui5/metaui/plugins/DateTimePlugin.d.ts.map +1 -0
  132. package/src/nz/co/siliconst/ui5/metaui/plugins/DateTimePlugin.js +2 -0
  133. package/src/nz/co/siliconst/ui5/metaui/plugins/DateTimePlugin.js.map +1 -0
  134. package/src/nz/co/siliconst/ui5/metaui/plugins/DateTimePlugin.ts +68 -0
  135. package/src/nz/co/siliconst/ui5/metaui/plugins/DropdownPlugin-dbg.js +66 -66
  136. package/src/nz/co/siliconst/ui5/metaui/plugins/DropdownPlugin-dbg.js.map +1 -1
  137. package/src/nz/co/siliconst/ui5/metaui/plugins/DropdownPlugin.d.ts +2 -2
  138. package/src/nz/co/siliconst/ui5/metaui/plugins/DropdownPlugin.d.ts.map +1 -1
  139. package/src/nz/co/siliconst/ui5/metaui/plugins/DropdownPlugin.js +1 -1
  140. package/src/nz/co/siliconst/ui5/metaui/plugins/DropdownPlugin.js.map +1 -1
  141. package/src/nz/co/siliconst/ui5/metaui/plugins/DropdownPlugin.ts +65 -65
  142. package/src/nz/co/siliconst/ui5/metaui/plugins/NumberPlugin-dbg.js +55 -53
  143. package/src/nz/co/siliconst/ui5/metaui/plugins/NumberPlugin-dbg.js.map +1 -1
  144. package/src/nz/co/siliconst/ui5/metaui/plugins/NumberPlugin.d.ts +3 -3
  145. package/src/nz/co/siliconst/ui5/metaui/plugins/NumberPlugin.d.ts.map +1 -1
  146. package/src/nz/co/siliconst/ui5/metaui/plugins/NumberPlugin.js +1 -1
  147. package/src/nz/co/siliconst/ui5/metaui/plugins/NumberPlugin.js.map +1 -1
  148. package/src/nz/co/siliconst/ui5/metaui/plugins/NumberPlugin.ts +56 -55
  149. package/src/nz/co/siliconst/ui5/metaui/plugins/StringPlugin-dbg.js +56 -53
  150. package/src/nz/co/siliconst/ui5/metaui/plugins/StringPlugin-dbg.js.map +1 -1
  151. package/src/nz/co/siliconst/ui5/metaui/plugins/StringPlugin.d.ts +2 -2
  152. package/src/nz/co/siliconst/ui5/metaui/plugins/StringPlugin.d.ts.map +1 -1
  153. package/src/nz/co/siliconst/ui5/metaui/plugins/StringPlugin.js +1 -1
  154. package/src/nz/co/siliconst/ui5/metaui/plugins/StringPlugin.js.map +1 -1
  155. package/src/nz/co/siliconst/ui5/metaui/plugins/StringPlugin.ts +58 -55
  156. package/src/nz/co/siliconst/ui5/metaui/plugins/SwitchPlugin-dbg.js +43 -0
  157. package/src/nz/co/siliconst/ui5/metaui/plugins/SwitchPlugin-dbg.js.map +1 -0
  158. package/src/nz/co/siliconst/ui5/metaui/plugins/SwitchPlugin.d.ts +18 -0
  159. package/src/nz/co/siliconst/ui5/metaui/plugins/SwitchPlugin.d.ts.map +1 -0
  160. package/src/nz/co/siliconst/ui5/metaui/plugins/SwitchPlugin.js +2 -0
  161. package/src/nz/co/siliconst/ui5/metaui/plugins/SwitchPlugin.js.map +1 -0
  162. package/src/nz/co/siliconst/ui5/metaui/plugins/SwitchPlugin.ts +42 -0
  163. package/src/nz/co/siliconst/ui5/metaui/plugins/TextAreaPlugin-dbg.js +58 -0
  164. package/src/nz/co/siliconst/ui5/metaui/plugins/TextAreaPlugin-dbg.js.map +1 -0
  165. package/src/nz/co/siliconst/ui5/metaui/plugins/TextAreaPlugin.d.ts +18 -0
  166. package/src/nz/co/siliconst/ui5/metaui/plugins/TextAreaPlugin.d.ts.map +1 -0
  167. package/src/nz/co/siliconst/ui5/metaui/plugins/TextAreaPlugin.js +2 -0
  168. package/src/nz/co/siliconst/ui5/metaui/plugins/TextAreaPlugin.js.map +1 -0
  169. package/src/nz/co/siliconst/ui5/metaui/plugins/TextAreaPlugin.ts +58 -0
  170. package/src/nz/co/siliconst/ui5/metaui/plugins/TimePlugin-dbg.js +74 -0
  171. package/src/nz/co/siliconst/ui5/metaui/plugins/TimePlugin-dbg.js.map +1 -0
  172. package/src/nz/co/siliconst/ui5/metaui/plugins/TimePlugin.d.ts +18 -0
  173. package/src/nz/co/siliconst/ui5/metaui/plugins/TimePlugin.d.ts.map +1 -0
  174. package/src/nz/co/siliconst/ui5/metaui/plugins/TimePlugin.js +2 -0
  175. package/src/nz/co/siliconst/ui5/metaui/plugins/TimePlugin.js.map +1 -0
  176. package/src/nz/co/siliconst/ui5/metaui/plugins/TimePlugin.ts +71 -0
  177. package/ui5.yaml +3 -3
  178. package/test-resources/App.js +0 -11
  179. package/test-resources/Main.controller.js +0 -73
  180. package/test-resources/Main.view.xml +0 -42
  181. package/test-resources/index.html +0 -21
  182. package/test-resources/mockData.json +0 -27
  183. package/test-resources/mockSchema.json +0 -98
@@ -1,164 +1,300 @@
1
- sap.ui.define(["sap/ui/core/Control", "sap/m/Dialog", "sap/m/Button", "../core/SchemaNormalizer", "../core/Engine", "../core/StateManager", "../layouts/BaseLayout"], function (Control, Dialog, Button, ___core_SchemaNormalizer, ___core_Engine, ___core_StateManager, ___layouts_BaseLayout) {
2
- "use strict";
3
-
4
- const SchemaNormalizer = ___core_SchemaNormalizer["SchemaNormalizer"];
5
- const Engine = ___core_Engine["Engine"];
6
- const StateManager = ___core_StateManager["StateManager"];
7
- const BaseLayout = ___layouts_BaseLayout["BaseLayout"];
8
- /**
9
- * Enterprise wrapper element for embedding or popping the dynamic form.
10
- *
11
- * @namespace nz.co.siliconst.ui5.metaui.controls
12
- */
13
- const GeneratorHost = Control.extend("nz.co.siliconst.ui5.metaui.controls.GeneratorHost", {
14
- constructor: function constructor() {
15
- Control.prototype.constructor.apply(this, arguments);
16
- this.stateManager = null;
17
- this.generatedContent = null;
18
- },
19
- /**
20
- * Standard UI5 control renderer. Renders the generated internal content.
21
- */
22
- renderer: {
23
- apiVersion: 2,
24
- render(rm, control) {
25
- rm.openStart("div", control);
26
- rm.style("width", "100%");
27
- rm.style("height", "100%");
28
- rm.openEnd();
29
- const content = control.getAggregation("_content");
30
- if (content) {
31
- rm.renderControl(content);
32
- }
33
- rm.close("div");
34
- }
35
- },
36
- metadata: {
37
- properties: {
38
- /** The raw JSON metadata schema provided by the ABAP backend. */
39
- schemaDefinition: {
40
- type: "object",
41
- defaultValue: null
42
- },
43
- /** The initial data payload to populate the fields. */
44
- initialData: {
45
- type: "object",
46
- defaultValue: {}
47
- }
48
- },
49
- aggregations: {
50
- /** The internal hidden container holding the generated layouts. */
51
- _content: {
52
- type: "sap.ui.core.Control",
53
- multiple: false,
54
- visibility: "hidden"
55
- }
56
- },
57
- events: {
58
- /** Triggered when the user submits the form via the Dialog modality. */
59
- submit: {
60
- parameters: {
61
- /** The clean extracted JSON payload representing the current state. */
62
- payload: {
63
- type: "object"
64
- }
65
- }
66
- },
67
- /** Triggered if the dialog is cancelled. */
68
- cancel: {}
69
- }
70
- },
71
- /**
72
- * Initializes the UI5 control.
73
- */
74
- init: function _init() {
75
- Control.prototype.init.call(this);
76
- },
77
- /**
78
- * Lifecycle hook to automatically generate the layout if bound declaratively in XML.
79
- */
80
- onBeforeRendering: function _onBeforeRendering() {
81
- if (!this.generatedContent && this.getProperty("schemaDefinition")) {
82
- this.generate();
83
- }
84
- },
85
- /**
86
- * Extracts the payload and fires the submit event manually. Useful for inline XML embedding.
87
- */
88
- triggerSubmit: function _triggerSubmit() {
89
- if (this.stateManager) {
90
- const payload = this.stateManager.extractPayload();
91
- this.fireEvent("submit", {
92
- payload
93
- });
94
- }
95
- },
96
- /**
97
- * Triggers the engine to parse the schema and build the layout.
98
- * Must be called manually or hooked into onBeforeRendering if properties are bound.
99
- */
100
- generate: function _generate() {
101
- const rawSchema = this.getProperty("schemaDefinition");
102
- const initialData = this.getProperty("initialData");
103
- if (!rawSchema) {
104
- throw new Error("[MetaUI] Cannot generate layout without a schemaDefinition.");
105
- }
106
-
107
- // 1. Normalize schema
108
- const normalizedSchema = SchemaNormalizer.normalize(rawSchema);
109
-
110
- // 2. Bootstrap isolated State Manager
111
- this.stateManager = new StateManager(initialData);
112
- this.setModel(this.stateManager.getModel(), "meta");
113
-
114
- // 3. Delegate to Layout Engine
115
- const engine = new Engine();
116
- const layoutFactory = new BaseLayout();
117
- this.generatedContent = engine.build(normalizedSchema, layoutFactory);
118
-
119
- // 4. Mount into hidden aggregation
120
- this.setAggregation("_content", this.generatedContent);
121
- },
122
- /**
123
- * Dialog Modality: Opens the generated layout inside a sap.m.Dialog.
124
- * Automatically wires up 'Save' and 'Cancel' buttons.
125
- */
126
- openInDialog: function _openInDialog(title = "Dynamic Form", submitButtonText = "Save") {
127
- if (!this.generatedContent) {
128
- this.generate();
129
- }
130
- const dialog = new Dialog({
131
- title: title,
132
- contentWidth: "800px",
133
- content: [this],
134
- // Mount self inside the dialog
135
- beginButton: new Button({
136
- text: submitButtonText,
137
- type: "Emphasized",
138
- press: () => {
139
- if (this.stateManager) {
140
- const payload = this.stateManager.extractPayload();
141
- this.fireEvent("submit", {
142
- payload
143
- });
144
- }
145
- dialog.close();
146
- }
147
- }),
148
- endButton: new Button({
149
- text: "Cancel",
150
- press: () => {
151
- this.fireEvent("cancel");
152
- dialog.close();
153
- }
154
- }),
155
- afterClose: () => {
156
- dialog.destroy();
157
- }
158
- });
159
- dialog.open();
160
- }
161
- });
162
- return GeneratorHost;
163
- });
1
+ sap.ui.define(["sap/ui/core/Control", "sap/m/Dialog", "sap/m/Button", "sap/m/MessagePage", "sap/base/Log", "../core/SchemaNormalizer", "../core/Engine", "../core/StateManager", "../layouts/BaseLayout"], function (Control, Dialog, Button, MessagePage, Log, ___core_SchemaNormalizer, ___core_Engine, ___core_StateManager, ___layouts_BaseLayout) {
2
+ "use strict";
3
+
4
+ const SchemaNormalizer = ___core_SchemaNormalizer["SchemaNormalizer"];
5
+ const Engine = ___core_Engine["Engine"];
6
+ const StateManager = ___core_StateManager["StateManager"];
7
+ const BaseLayout = ___layouts_BaseLayout["BaseLayout"];
8
+ /**
9
+ * Wrapper element for embedding or popping the dynamic form.
10
+ *
11
+ * @namespace nz.co.siliconst.ui5.metaui.controls
12
+ */
13
+ const GeneratorHost = Control.extend("nz.co.siliconst.ui5.metaui.controls.GeneratorHost", {
14
+ constructor: function constructor() {
15
+ Control.prototype.constructor.apply(this, arguments);
16
+ this.stateManager = null;
17
+ this.generatedContent = null;
18
+ this.engine = null;
19
+ },
20
+ /**
21
+ * Standard UI5 control renderer. Renders the generated internal content.
22
+ */
23
+ renderer: {
24
+ apiVersion: 2,
25
+ render(rm, control) {
26
+ rm.openStart("div", control);
27
+ rm.style("width", "100%");
28
+ rm.style("height", "100%");
29
+ rm.openEnd();
30
+ const content = control.getAggregation("_content");
31
+ if (content) {
32
+ rm.renderControl(content);
33
+ }
34
+ rm.close("div");
35
+ }
36
+ },
37
+ metadata: {
38
+ properties: {
39
+ /** The raw JSON metadata schema provided by the ABAP backend. */
40
+ schemaDefinition: {
41
+ type: "any",
42
+ defaultValue: null
43
+ },
44
+ /** The initial data payload to populate the fields as an object. */
45
+ initialData: {
46
+ type: "any",
47
+ defaultValue: null
48
+ },
49
+ /** The initial data payload provided as a raw JSON string. */
50
+ initialDataJson: {
51
+ type: "string",
52
+ defaultValue: null
53
+ },
54
+ /** The final payload data object, updated on submit. */
55
+ outputData: {
56
+ type: "object",
57
+ defaultValue: null
58
+ },
59
+ /** The final payload JSON string, updated on submit. */
60
+ outputDataJson: {
61
+ type: "string",
62
+ defaultValue: null
63
+ },
64
+ /** If true, validation errors will be pushed to the global sap.ui.core.message.MessageManager. */
65
+ useMessageManager: {
66
+ type: "boolean",
67
+ defaultValue: false
68
+ }
69
+ },
70
+ aggregations: {
71
+ /** The internal hidden container holding the generated layouts. */
72
+ _content: {
73
+ type: "sap.ui.core.Control",
74
+ multiple: false,
75
+ visibility: "hidden"
76
+ }
77
+ },
78
+ events: {
79
+ /** Triggered before final submission, allowing host apps to run custom validation logic and halt submission if needed. */
80
+ beforeSubmit: {
81
+ parameters: {
82
+ /** The clean extracted JSON payload representing the current state. */
83
+ payload: {
84
+ type: "object"
85
+ },
86
+ /** Function to add a custom validation error message for a specific field path. */
87
+ addError: {
88
+ type: "function"
89
+ },
90
+ /** Function to prevent the default submission and dialog closure. */
91
+ preventDefault: {
92
+ type: "function"
93
+ }
94
+ }
95
+ },
96
+ /** Triggered when the user submits the form via the Dialog modality. */
97
+ submit: {
98
+ parameters: {
99
+ /** The clean extracted JSON payload representing the current state. */
100
+ payload: {
101
+ type: "object"
102
+ },
103
+ /** The stringified final JSON payload. */
104
+ payloadJson: {
105
+ type: "string"
106
+ }
107
+ }
108
+ },
109
+ /** Triggered if the dialog is cancelled. */
110
+ cancel: {}
111
+ }
112
+ },
113
+ /**
114
+ * Initializes the UI5 control.
115
+ */
116
+ init: function _init() {
117
+ Control.prototype.init.call(this);
118
+ },
119
+ /**
120
+ * Standard UI5 lifecycle hook for destruction.
121
+ * Guaranteed to tear down isolated models and unbind global event listeners.
122
+ */
123
+ exit: function _exit() {
124
+ if (this.engine) {
125
+ this.engine.destroy();
126
+ this.engine = null;
127
+ }
128
+ if (this.stateManager) {
129
+ this.stateManager.getModel().destroy();
130
+ this.stateManager = null;
131
+ }
132
+ if (this.generatedContent) {
133
+ this.generatedContent.destroy();
134
+ this.generatedContent = null;
135
+ }
136
+ },
137
+ /**
138
+ * Lifecycle hook to automatically generate the layout if bound declaratively in XML.
139
+ */
140
+ onBeforeRendering: function _onBeforeRendering() {
141
+ if (!this.generatedContent && this.getProperty("schemaDefinition")) {
142
+ this.generate();
143
+ }
144
+ },
145
+ /**
146
+ * Extracts the payload, pushes it to properties, and fires the submit event manually.
147
+ * Returns true if submission was successful, false if validation failed or was prevented.
148
+ */
149
+ triggerSubmit: function _triggerSubmit() {
150
+ if (this.stateManager && this.engine) {
151
+ let isPrevented = false;
152
+ const useMessageManager = this.getProperty("useMessageManager");
153
+ let messageManager = null;
154
+ if (useMessageManager) {
155
+ messageManager = sap.ui.getCore().getMessageManager();
156
+ messageManager.removeAllMessages();
157
+ }
158
+
159
+ // Helper to add messages securely via async require so it isn't a hard dependency
160
+ const pushMessage = (path, text) => {
161
+ if (useMessageManager && messageManager) {
162
+ sap.ui.require(["sap/ui/core/message/Message"], Message => {
163
+ messageManager.addMessages(new Message({
164
+ message: text,
165
+ type: "Error",
166
+ target: `${this.stateManager?.getModel().getId()}>/${path}`,
167
+ processor: this.stateManager?.getModel()
168
+ }));
169
+ });
170
+ }
171
+ };
172
+
173
+ // 1. Run global schema validation
174
+ if (!this.engine.validateAll()) {
175
+ pushMessage("", "One or more fields failed schema validation. Please review the highlighted fields.");
176
+ return false; // Schema validation failed, inputs already turned red
177
+ }
178
+ const payload = this.stateManager.extractPayload();
179
+ const payloadJson = JSON.stringify(payload);
180
+
181
+ // 2. Fire beforeSubmit exit
182
+ this.fireEvent("beforeSubmit", {
183
+ payload,
184
+ preventDefault: () => {
185
+ isPrevented = true;
186
+ },
187
+ addError: (propertyPath, errorMessage) => {
188
+ isPrevented = true;
189
+ if (useMessageManager && messageManager) {
190
+ pushMessage(propertyPath, errorMessage);
191
+ } else {
192
+ Log.warning(`[MetaUI] Validation Error for ${propertyPath}: ${errorMessage}`, "GeneratorHost");
193
+ }
194
+ }
195
+ });
196
+ if (isPrevented) {
197
+ return false; // Exit validation failed or prevented submission
198
+ }
199
+
200
+ // Push final values to properties (updating XML bindings)
201
+ this.setProperty("outputData", payload, true);
202
+ this.setProperty("outputDataJson", payloadJson, true);
203
+ this.fireEvent("submit", {
204
+ payload,
205
+ payloadJson
206
+ });
207
+ return true;
208
+ }
209
+ return false;
210
+ },
211
+ /**
212
+ * Triggers the engine to parse the schema and build the layout.
213
+ * Safely wrapped in a try/catch to prevent Launchpad crashes.
214
+ */
215
+ generate: function _generate() {
216
+ try {
217
+ const rawSchema = this.getProperty("schemaDefinition");
218
+ let initialData = this.getProperty("initialData");
219
+ const initialDataJson = this.getProperty("initialDataJson");
220
+ if (initialDataJson) {
221
+ try {
222
+ initialData = JSON.parse(initialDataJson);
223
+ } catch (e) {
224
+ Log.error("[MetaUI] Failed to parse initialDataJson string.", e.message, "GeneratorHost");
225
+ }
226
+ } else if (typeof initialData === "string") {
227
+ try {
228
+ initialData = JSON.parse(initialData);
229
+ } catch (e) {
230
+ Log.error("[MetaUI] Failed to parse initialData string.", e.message, "GeneratorHost");
231
+ }
232
+ }
233
+
234
+ // 1. Normalize schema (allows fallback to data inference)
235
+ const normalizedSchema = SchemaNormalizer.normalize(rawSchema, initialData);
236
+
237
+ // 2. Bootstrap isolated State Manager
238
+ this.stateManager = new StateManager(initialData || {});
239
+
240
+ // Dynamically generate a 100% unique model name for isolation
241
+ const modelName = "metaUI_" + this.getId();
242
+ this.setModel(this.stateManager.getModel(), modelName);
243
+
244
+ // 3. Delegate to Layout Engine
245
+ this.engine = new Engine();
246
+ const layoutFactory = new BaseLayout();
247
+ this.generatedContent = this.engine.build(normalizedSchema, layoutFactory, modelName);
248
+
249
+ // 4. Mount into hidden aggregation
250
+ this.setAggregation("_content", this.generatedContent);
251
+ } catch (error) {
252
+ Log.error("[MetaUI] Engine failed to generate layout. Preventing Launchpad crash.", error.message, "GeneratorHost");
253
+ const errorPage = new MessagePage({
254
+ text: "UI Generation Failed",
255
+ description: "The dynamic schema could not be rendered. Please check the Fiori console for diagnostic logs.",
256
+ icon: "sap-icon://error"
257
+ });
258
+ this.setAggregation("_content", errorPage);
259
+ }
260
+ },
261
+ /**
262
+ * Dialog Modality: Opens the generated layout inside a sap.m.Dialog.
263
+ * Automatically wires up 'Save' and 'Cancel' buttons.
264
+ */
265
+ openInDialog: function _openInDialog(title = "Dynamic Form", submitButtonText = "Save") {
266
+ if (!this.generatedContent) {
267
+ this.generate();
268
+ }
269
+ const dialog = new Dialog({
270
+ title: title,
271
+ contentWidth: "800px",
272
+ content: [this],
273
+ // Mount self inside the dialog
274
+ beginButton: new Button({
275
+ text: submitButtonText,
276
+ type: "Emphasized",
277
+ press: () => {
278
+ const success = this.triggerSubmit();
279
+ if (success) {
280
+ dialog.close();
281
+ }
282
+ }
283
+ }),
284
+ endButton: new Button({
285
+ text: "Cancel",
286
+ press: () => {
287
+ this.fireEvent("cancel");
288
+ dialog.close();
289
+ }
290
+ }),
291
+ afterClose: () => {
292
+ dialog.destroy();
293
+ }
294
+ });
295
+ dialog.open();
296
+ }
297
+ });
298
+ return GeneratorHost;
299
+ });
164
300
  //# sourceMappingURL=GeneratorHost-dbg.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"GeneratorHost-dbg.js","names":["SchemaNormalizer","___core_SchemaNormalizer","Engine","___core_Engine","StateManager","___core_StateManager","BaseLayout","___layouts_BaseLayout","GeneratorHost","Control","extend","constructor","prototype","apply","arguments","stateManager","generatedContent","renderer","apiVersion","render","rm","control","openStart","style","openEnd","content","getAggregation","renderControl","close","metadata","properties","schemaDefinition","type","defaultValue","initialData","aggregations","_content","multiple","visibility","events","submit","parameters","payload","cancel","init","_init","Control.prototype.init.call","onBeforeRendering","_onBeforeRendering","getProperty","generate","triggerSubmit","_triggerSubmit","extractPayload","fireEvent","_generate","rawSchema","Error","normalizedSchema","normalize","setModel","getModel","engine","layoutFactory","build","setAggregation","openInDialog","_openInDialog","title","submitButtonText","dialog","Dialog","contentWidth","beginButton","Button","text","press","endButton","afterClose","destroy","open"],"sources":["GeneratorHost.ts"],"sourcesContent":["/**\r\n * @file GeneratorHost.ts\r\n * @description The core UI5 custom control that exposes the MetaUI engine to host applications.\r\n */\r\n\r\nimport Control from \"sap/ui/core/Control\";\r\nimport RenderManager from \"sap/ui/core/RenderManager\";\r\nimport Dialog from \"sap/m/Dialog\";\r\nimport Button from \"sap/m/Button\";\r\nimport { SchemaNormalizer } from \"../core/SchemaNormalizer\";\r\nimport { Engine } from \"../core/Engine\";\r\nimport { StateManager } from \"../core/StateManager\";\r\nimport { BaseLayout } from \"../layouts/BaseLayout\";\r\n\r\n/**\r\n * Enterprise wrapper element for embedding or popping the dynamic form.\r\n * \r\n * @namespace nz.co.siliconst.ui5.metaui.controls\r\n */\r\nexport default class GeneratorHost extends Control {\r\n \r\n private stateManager: StateManager | null = null;\r\n private generatedContent: Control | null = null;\r\n\r\n static readonly metadata = {\r\n properties: {\r\n /** The raw JSON metadata schema provided by the ABAP backend. */\r\n schemaDefinition: { type: \"object\", defaultValue: null },\r\n /** The initial data payload to populate the fields. */\r\n initialData: { type: \"object\", defaultValue: {} }\r\n },\r\n aggregations: {\r\n /** The internal hidden container holding the generated layouts. */\r\n _content: { type: \"sap.ui.core.Control\", multiple: false, visibility: \"hidden\" }\r\n },\r\n events: {\r\n /** Triggered when the user submits the form via the Dialog modality. */\r\n submit: {\r\n parameters: {\r\n /** The clean extracted JSON payload representing the current state. */\r\n payload: { type: \"object\" }\r\n }\r\n },\r\n /** Triggered if the dialog is cancelled. */\r\n cancel: {}\r\n }\r\n };\r\n\r\n /**\r\n * Standard UI5 control renderer. Renders the generated internal content.\r\n */\r\n static renderer = {\r\n apiVersion: 2,\r\n render(rm: RenderManager, control: GeneratorHost) {\r\n rm.openStart(\"div\", control);\r\n rm.style(\"width\", \"100%\");\r\n rm.style(\"height\", \"100%\");\r\n rm.openEnd();\r\n \r\n const content = control.getAggregation(\"_content\") as Control;\r\n if (content) {\r\n rm.renderControl(content);\r\n }\r\n \r\n rm.close(\"div\");\r\n }\r\n };\r\n\r\n /**\r\n * Initializes the UI5 control.\r\n */\r\n public init(): void {\r\n super.init();\r\n }\r\n\r\n /**\r\n * Lifecycle hook to automatically generate the layout if bound declaratively in XML.\r\n */\r\n public onBeforeRendering(): void {\r\n if (!this.generatedContent && this.getProperty(\"schemaDefinition\")) {\r\n this.generate();\r\n }\r\n }\r\n\r\n /**\r\n * Extracts the payload and fires the submit event manually. Useful for inline XML embedding.\r\n */\r\n public triggerSubmit(): void {\r\n if (this.stateManager) {\r\n const payload = this.stateManager.extractPayload();\r\n this.fireEvent(\"submit\", { payload });\r\n }\r\n }\r\n\r\n /**\r\n * Triggers the engine to parse the schema and build the layout.\r\n * Must be called manually or hooked into onBeforeRendering if properties are bound.\r\n */\r\n public generate(): void {\r\n const rawSchema = this.getProperty(\"schemaDefinition\");\r\n const initialData = this.getProperty(\"initialData\");\r\n\r\n if (!rawSchema) {\r\n throw new Error(\"[MetaUI] Cannot generate layout without a schemaDefinition.\");\r\n }\r\n\r\n // 1. Normalize schema\r\n const normalizedSchema = SchemaNormalizer.normalize(rawSchema);\r\n\r\n // 2. Bootstrap isolated State Manager\r\n this.stateManager = new StateManager(initialData);\r\n this.setModel(this.stateManager.getModel(), \"meta\");\r\n\r\n // 3. Delegate to Layout Engine\r\n const engine = new Engine();\r\n const layoutFactory = new BaseLayout();\r\n \r\n this.generatedContent = engine.build(normalizedSchema, layoutFactory);\r\n\r\n // 4. Mount into hidden aggregation\r\n this.setAggregation(\"_content\", this.generatedContent);\r\n }\r\n\r\n /**\r\n * Dialog Modality: Opens the generated layout inside a sap.m.Dialog.\r\n * Automatically wires up 'Save' and 'Cancel' buttons.\r\n */\r\n public openInDialog(title: string = \"Dynamic Form\", submitButtonText: string = \"Save\"): void {\r\n if (!this.generatedContent) {\r\n this.generate();\r\n }\r\n\r\n const dialog = new Dialog({\r\n title: title,\r\n contentWidth: \"800px\",\r\n content: [this], // Mount self inside the dialog\r\n beginButton: new Button({\r\n text: submitButtonText,\r\n type: \"Emphasized\",\r\n press: () => {\r\n if (this.stateManager) {\r\n const payload = this.stateManager.extractPayload();\r\n this.fireEvent(\"submit\", { payload });\r\n }\r\n dialog.close();\r\n }\r\n }),\r\n endButton: new Button({\r\n text: \"Cancel\",\r\n press: () => {\r\n this.fireEvent(\"cancel\");\r\n dialog.close();\r\n }\r\n }),\r\n afterClose: () => {\r\n dialog.destroy();\r\n }\r\n });\r\n\r\n dialog.open();\r\n }\r\n}\r\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"GeneratorHost-dbg.js","names":["SchemaNormalizer","___core_SchemaNormalizer","Engine","___core_Engine","StateManager","___core_StateManager","BaseLayout","___layouts_BaseLayout","GeneratorHost","Control","extend","constructor","prototype","apply","arguments","stateManager","generatedContent","engine","renderer","apiVersion","render","rm","control","openStart","style","openEnd","content","getAggregation","renderControl","close","metadata","properties","schemaDefinition","type","defaultValue","initialData","initialDataJson","outputData","outputDataJson","useMessageManager","aggregations","_content","multiple","visibility","events","beforeSubmit","parameters","payload","addError","preventDefault","submit","payloadJson","cancel","init","_init","Control.prototype.init.call","exit","_exit","destroy","getModel","onBeforeRendering","_onBeforeRendering","getProperty","generate","triggerSubmit","_triggerSubmit","isPrevented","messageManager","sap","ui","getCore","getMessageManager","removeAllMessages","pushMessage","path","text","require","Message","addMessages","message","target","getId","processor","validateAll","extractPayload","JSON","stringify","fireEvent","propertyPath","errorMessage","Log","warning","setProperty","_generate","rawSchema","parse","e","error","normalizedSchema","normalize","modelName","setModel","layoutFactory","build","setAggregation","errorPage","MessagePage","description","icon","openInDialog","_openInDialog","title","submitButtonText","dialog","Dialog","contentWidth","beginButton","Button","press","success","endButton","afterClose","open"],"sources":["GeneratorHost.ts"],"sourcesContent":["/**\n * @file GeneratorHost.ts\n * @description The core UI5 custom control that exposes the MetaUI engine to host applications.\n */\n\nimport Control from \"sap/ui/core/Control\";\nimport RenderManager from \"sap/ui/core/RenderManager\";\nimport Dialog from \"sap/m/Dialog\";\nimport Button from \"sap/m/Button\";\nimport MessagePage from \"sap/m/MessagePage\";\nimport Log from \"sap/base/Log\";\nimport { SchemaNormalizer } from \"../core/SchemaNormalizer\";\nimport { Engine } from \"../core/Engine\";\nimport { StateManager } from \"../core/StateManager\";\nimport { BaseLayout } from \"../layouts/BaseLayout\";\n\n/**\n * Wrapper element for embedding or popping the dynamic form.\n * \n * @namespace nz.co.siliconst.ui5.metaui.controls\n */\nexport default class GeneratorHost extends Control {\n \n private stateManager: StateManager | null = null;\n private generatedContent: Control | null = null;\n private engine: Engine | null = null;\n\n static readonly metadata = {\n properties: {\n /** The raw JSON metadata schema provided by the ABAP backend. */\n schemaDefinition: { type: \"any\", defaultValue: null },\n /** The initial data payload to populate the fields as an object. */\n initialData: { type: \"any\", defaultValue: null },\n /** The initial data payload provided as a raw JSON string. */\n initialDataJson: { type: \"string\", defaultValue: null },\n /** The final payload data object, updated on submit. */\n outputData: { type: \"object\", defaultValue: null },\n /** The final payload JSON string, updated on submit. */\n outputDataJson: { type: \"string\", defaultValue: null },\n /** If true, validation errors will be pushed to the global sap.ui.core.message.MessageManager. */\n useMessageManager: { type: \"boolean\", defaultValue: false }\n },\n aggregations: {\n /** The internal hidden container holding the generated layouts. */\n _content: { type: \"sap.ui.core.Control\", multiple: false, visibility: \"hidden\" }\n },\n events: {\n /** Triggered before final submission, allowing host apps to run custom validation logic and halt submission if needed. */\n beforeSubmit: {\n parameters: {\n /** The clean extracted JSON payload representing the current state. */\n payload: { type: \"object\" },\n /** Function to add a custom validation error message for a specific field path. */\n addError: { type: \"function\" },\n /** Function to prevent the default submission and dialog closure. */\n preventDefault: { type: \"function\" }\n }\n },\n /** Triggered when the user submits the form via the Dialog modality. */\n submit: {\n parameters: {\n /** The clean extracted JSON payload representing the current state. */\n payload: { type: \"object\" },\n /** The stringified final JSON payload. */\n payloadJson: { type: \"string\" }\n }\n },\n /** Triggered if the dialog is cancelled. */\n cancel: {}\n }\n };\n\n /**\n * Standard UI5 control renderer. Renders the generated internal content.\n */\n static renderer = {\n apiVersion: 2,\n render(rm: RenderManager, control: GeneratorHost) {\n rm.openStart(\"div\", control);\n rm.style(\"width\", \"100%\");\n rm.style(\"height\", \"100%\");\n rm.openEnd();\n \n const content = control.getAggregation(\"_content\") as Control;\n if (content) {\n rm.renderControl(content);\n }\n \n rm.close(\"div\");\n }\n };\n\n /**\n * Initializes the UI5 control.\n */\n public init(): void {\n super.init();\n }\n\n /**\n * Standard UI5 lifecycle hook for destruction.\n * Guaranteed to tear down isolated models and unbind global event listeners.\n */\n public exit(): void {\n if (this.engine) {\n this.engine.destroy();\n this.engine = null;\n }\n\n if (this.stateManager) {\n this.stateManager.getModel().destroy();\n this.stateManager = null;\n }\n\n if (this.generatedContent) {\n this.generatedContent.destroy();\n this.generatedContent = null;\n }\n }\n\n /**\n * Lifecycle hook to automatically generate the layout if bound declaratively in XML.\n */\n public onBeforeRendering(): void {\n if (!this.generatedContent && this.getProperty(\"schemaDefinition\")) {\n this.generate();\n }\n }\n\n /**\n * Extracts the payload, pushes it to properties, and fires the submit event manually.\n * Returns true if submission was successful, false if validation failed or was prevented.\n */\n public triggerSubmit(): boolean {\n if (this.stateManager && this.engine) {\n let isPrevented = false;\n const useMessageManager = this.getProperty(\"useMessageManager\") as boolean;\n let messageManager: any = null;\n \n if (useMessageManager) {\n messageManager = sap.ui.getCore().getMessageManager();\n messageManager.removeAllMessages();\n }\n\n // Helper to add messages securely via async require so it isn't a hard dependency\n const pushMessage = (path: string, text: string) => {\n if (useMessageManager && messageManager) {\n sap.ui.require([\"sap/ui/core/message/Message\"], (Message: any) => {\n messageManager.addMessages(new Message({\n message: text,\n type: \"Error\" as any,\n target: `${this.stateManager?.getModel().getId()}>/${path}`,\n processor: this.stateManager?.getModel()\n }));\n });\n }\n };\n\n // 1. Run global schema validation\n if (!this.engine.validateAll()) {\n pushMessage(\"\", \"One or more fields failed schema validation. Please review the highlighted fields.\");\n return false; // Schema validation failed, inputs already turned red\n }\n\n const payload = this.stateManager.extractPayload();\n const payloadJson = JSON.stringify(payload);\n \n // 2. Fire beforeSubmit exit\n this.fireEvent(\"beforeSubmit\", {\n payload,\n preventDefault: () => {\n isPrevented = true;\n },\n addError: (propertyPath: string, errorMessage: string) => {\n isPrevented = true;\n if (useMessageManager && messageManager) {\n pushMessage(propertyPath, errorMessage);\n } else {\n Log.warning(`[MetaUI] Validation Error for ${propertyPath}: ${errorMessage}`, \"GeneratorHost\");\n }\n }\n });\n\n if (isPrevented) {\n return false; // Exit validation failed or prevented submission\n }\n \n // Push final values to properties (updating XML bindings)\n this.setProperty(\"outputData\", payload, true);\n this.setProperty(\"outputDataJson\", payloadJson, true);\n \n this.fireEvent(\"submit\", { payload, payloadJson });\n return true;\n }\n return false;\n }\n\n /**\n * Triggers the engine to parse the schema and build the layout.\n * Safely wrapped in a try/catch to prevent Launchpad crashes.\n */\n public generate(): void {\n try {\n const rawSchema = this.getProperty(\"schemaDefinition\");\n \n let initialData = this.getProperty(\"initialData\");\n const initialDataJson = this.getProperty(\"initialDataJson\");\n \n if (initialDataJson) {\n try {\n initialData = JSON.parse(initialDataJson);\n } catch (e) {\n Log.error(\"[MetaUI] Failed to parse initialDataJson string.\", (e as Error).message, \"GeneratorHost\");\n }\n } else if (typeof initialData === \"string\") {\n try {\n initialData = JSON.parse(initialData);\n } catch (e) {\n Log.error(\"[MetaUI] Failed to parse initialData string.\", (e as Error).message, \"GeneratorHost\");\n }\n }\n\n // 1. Normalize schema (allows fallback to data inference)\n const normalizedSchema = SchemaNormalizer.normalize(rawSchema, initialData);\n\n // 2. Bootstrap isolated State Manager\n this.stateManager = new StateManager(initialData || {});\n \n // Dynamically generate a 100% unique model name for isolation\n const modelName = \"metaUI_\" + this.getId();\n this.setModel(this.stateManager.getModel(), modelName);\n\n // 3. Delegate to Layout Engine\n this.engine = new Engine();\n const layoutFactory = new BaseLayout();\n \n this.generatedContent = this.engine.build(normalizedSchema, layoutFactory, modelName);\n\n // 4. Mount into hidden aggregation\n this.setAggregation(\"_content\", this.generatedContent);\n\n } catch (error) {\n Log.error(\"[MetaUI] Engine failed to generate layout. Preventing Launchpad crash.\", (error as Error).message, \"GeneratorHost\");\n \n const errorPage = new MessagePage({\n text: \"UI Generation Failed\",\n description: \"The dynamic schema could not be rendered. Please check the Fiori console for diagnostic logs.\",\n icon: \"sap-icon://error\"\n });\n\n this.setAggregation(\"_content\", errorPage);\n }\n }\n\n /**\n * Dialog Modality: Opens the generated layout inside a sap.m.Dialog.\n * Automatically wires up 'Save' and 'Cancel' buttons.\n */\n public openInDialog(title: string = \"Dynamic Form\", submitButtonText: string = \"Save\"): void {\n if (!this.generatedContent) {\n this.generate();\n }\n\n const dialog = new Dialog({\n title: title,\n contentWidth: \"800px\",\n content: [this], // Mount self inside the dialog\n beginButton: new Button({\n text: submitButtonText,\n type: \"Emphasized\",\n press: () => {\n const success = this.triggerSubmit();\n if (success) {\n dialog.close();\n }\n }\n }),\n endButton: new Button({\n text: \"Cancel\",\n press: () => {\n this.fireEvent(\"cancel\");\n dialog.close();\n }\n }),\n afterClose: () => {\n dialog.destroy();\n }\n });\n\n dialog.open();\n }\n}\n"],"mappings":"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","ignoreList":[]}