@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,70 +1,70 @@
1
- /**
2
- * @file ISchema.ts
3
- * @description Defines the core structural contract for the MetaUI engine.
4
- * The schema maps perfectly to the JSON payload generated by the ABAP RTTI extractor.
5
- */
6
-
7
- /**
8
- * Supported data primitive types that drive plugin selection.
9
- */
10
- export type FieldType = "string" | "number" | "boolean" | "date" | "dropdown";
11
-
12
- /**
13
- * Value help structure mapping SAP Key/Text pairs.
14
- */
15
- export interface IValueHelp {
16
- /** The technical key passed back to the backend. */
17
- key: string;
18
- /** The localized descriptive text displayed to the user. */
19
- text: string;
20
- }
21
-
22
- /**
23
- * Metadata definition for a single atomic input field.
24
- */
25
- export interface IFieldMetadata {
26
- /** The technical field name mapping to the data model property. */
27
- fieldName: string;
28
- /** The primitive type determining the rendering plugin. */
29
- type: FieldType;
30
- /** The localized label text for the UI. */
31
- label: string;
32
- /** Indicates if the field is a primary key (often rendered first or highlighted). */
33
- isKey: boolean;
34
- /** If true, the field is rendered as a non-editable display element. */
35
- isReadOnly: boolean;
36
- /** If true, triggers UI5 validation to ensure a value exists. */
37
- isRequired: boolean;
38
- /** Maximum allowed character length for string-based inputs. */
39
- maxLength?: number;
40
- /** The total number of significant digits for numeric inputs. */
41
- precision?: number;
42
- /** The number of decimal places for numeric inputs. */
43
- scale?: number;
44
- /** Pre-loaded static value help arrays for dropdowns. */
45
- valueHelp?: IValueHelp[];
46
- }
47
-
48
- /**
49
- * Metadata definition for a tabular structure.
50
- */
51
- export interface ITableMetadata {
52
- /** The internal ID/name of the table. */
53
- tableName: string;
54
- /** The localized table header label. */
55
- label: string;
56
- /** Array of field definitions dictating the table's columns. */
57
- fields: IFieldMetadata[];
58
- }
59
-
60
- /**
61
- * The master schema contract ingested by the Engine to build the UI5 layout.
62
- */
63
- export interface ISchema {
64
- /** Determines the root container layout strategy. */
65
- mode: "form" | "table" | "mixed";
66
- /** The fields to be rendered at the root level (typically form inputs). */
67
- rootFields: IFieldMetadata[];
68
- /** The table structures to be rendered sequentially. */
69
- tables: ITableMetadata[];
70
- }
1
+ /**
2
+ * @file ISchema.ts
3
+ * @description MetaUI v2 Core Schema Contract.
4
+ * Aligned with standard JSON-Schema syntax (properties, items) for native AI generation,
5
+ * with a proprietary 'ui' directive block for Fiori visual orchestration.
6
+ */
7
+
8
+ export type FieldType = "string" | "number" | "boolean" | "date" | "dropdown" | "time" | "datetime" | "array" | "object";
9
+
10
+ /**
11
+ * Value help structure mapping SAP Key/Text pairs.
12
+ */
13
+ export interface IValueHelp {
14
+ key: string;
15
+ text: string;
16
+ }
17
+
18
+ /**
19
+ * Visual orchestration directives to separate layout from data modeling.
20
+ */
21
+ export interface IUIDirective {
22
+ label?: string;
23
+ isKey?: boolean;
24
+ readOnly?: boolean;
25
+ widget?: string;
26
+ group?: string;
27
+ visibleOn?: string;
28
+ enabledOn?: string;
29
+ format?: string;
30
+ rows?: number;
31
+ fullWidth?: boolean;
32
+ }
33
+
34
+ /**
35
+ * Standard JSON-Schema property definition.
36
+ */
37
+ export interface IPropertyMetadata {
38
+ type: FieldType;
39
+
40
+ // MetaUI specific orchestration
41
+ ui?: IUIDirective;
42
+
43
+ // Standard validations
44
+ required?: boolean;
45
+ maxLength?: number;
46
+ minimum?: number;
47
+ maximum?: number;
48
+ pattern?: string;
49
+
50
+ // Numeric specifics
51
+ precision?: number;
52
+ scale?: number;
53
+
54
+ // Value constraints
55
+ valueHelp?: IValueHelp[];
56
+
57
+ // Nested recursion for objects and arrays
58
+ properties?: Record<string, IPropertyMetadata>;
59
+ items?: IPropertyMetadata;
60
+ }
61
+
62
+ /**
63
+ * The master schema contract ingested by the Engine.
64
+ */
65
+ export interface ISchema {
66
+ title?: string;
67
+ type?: "object" | "array"; // Implicit layout hinting
68
+ properties?: Record<string, IPropertyMetadata>;
69
+ items?: IPropertyMetadata;
70
+ }
@@ -1,39 +1,24 @@
1
- sap.ui.define(["./FormLayout", "./TableLayout"], function (___FormLayout, ___TableLayout) {
2
- "use strict";
3
-
4
- /**
5
- * @file BaseLayout.ts
6
- * @description Central layout factory that delegates to specific form or table layout engines.
7
- * Implements ILayoutManager.
8
- */
9
- const FormLayout = ___FormLayout["FormLayout"];
10
- const TableLayout = ___TableLayout["TableLayout"];
11
- /**
12
- * The core layout manager that delegates structural grid rendering based on schema configurations.
13
- */
14
- class BaseLayout {
15
- /**
16
- * Constructs a responsive form layout container.
17
- * @param schema The master schema containing rootFields to be mounted.
18
- * @returns A populated UI5 container (sap.ui.layout.form.SimpleForm).
19
- */
20
- renderForm(schema) {
21
- return FormLayout.build(schema.rootFields);
22
- }
23
-
24
- /**
25
- * Constructs a responsive table layout container.
26
- * @param tableMeta The metadata defining the table columns.
27
- * @returns A UI5 Table control (sap.m.Table).
28
- */
29
- renderTable(tableMeta) {
30
- return TableLayout.build(tableMeta);
31
- }
32
- }
33
- var __exports = {
34
- __esModule: true
35
- };
36
- __exports.BaseLayout = BaseLayout;
37
- return __exports;
38
- });
1
+ sap.ui.define(["./FormLayout", "./TableLayout"], function (___FormLayout, ___TableLayout) {
2
+ "use strict";
3
+
4
+ /**
5
+ * @file BaseLayout.ts
6
+ * @description Central layout factory that delegates to specific form or table layout engines.
7
+ */
8
+ const FormLayout = ___FormLayout["FormLayout"];
9
+ const TableLayout = ___TableLayout["TableLayout"];
10
+ class BaseLayout {
11
+ renderForm(properties, modelName = "meta", formTitle, trackPlugin) {
12
+ return FormLayout.build(properties, modelName, formTitle, trackPlugin);
13
+ }
14
+ renderTable(tableMeta, modelName = "meta", tableTitle, trackPlugin) {
15
+ return TableLayout.build(tableMeta, modelName, tableTitle, trackPlugin);
16
+ }
17
+ }
18
+ var __exports = {
19
+ __esModule: true
20
+ };
21
+ __exports.BaseLayout = BaseLayout;
22
+ return __exports;
23
+ });
39
24
  //# sourceMappingURL=BaseLayout-dbg.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BaseLayout-dbg.js","names":["FormLayout","___FormLayout","TableLayout","___TableLayout","BaseLayout","renderForm","schema","build","rootFields","renderTable","tableMeta","__exports","__esModule"],"sources":["BaseLayout.ts"],"sourcesContent":["/**\r\n * @file BaseLayout.ts\r\n * @description Central layout factory that delegates to specific form or table layout engines.\r\n * Implements ILayoutManager.\r\n */\r\n\r\nimport { ILayoutManager } from \"../interfaces/ILayoutManager\";\r\nimport { ISchema, ITableMetadata } from \"../interfaces/ISchema\";\r\nimport Control from \"sap/ui/core/Control\";\r\nimport { FormLayout } from \"./FormLayout\";\r\nimport { TableLayout } from \"./TableLayout\";\r\n\r\n/**\r\n * The core layout manager that delegates structural grid rendering based on schema configurations.\r\n */\r\nexport class BaseLayout implements ILayoutManager {\r\n /**\r\n * Constructs a responsive form layout container.\r\n * @param schema The master schema containing rootFields to be mounted.\r\n * @returns A populated UI5 container (sap.ui.layout.form.SimpleForm).\r\n */\r\n public renderForm(schema: ISchema): Control {\r\n return FormLayout.build(schema.rootFields);\r\n }\r\n\r\n /**\r\n * Constructs a responsive table layout container.\r\n * @param tableMeta The metadata defining the table columns.\r\n * @returns A UI5 Table control (sap.m.Table).\r\n */\r\n public renderTable(tableMeta: ITableMetadata): Control {\r\n return TableLayout.build(tableMeta);\r\n }\r\n}\r\n"],"mappings":";;;EAAA;AACA;AACA;AACA;AACA;EAJA,MASSA,UAAU,GAAAC,aAAA;EAAA,MACVC,WAAW,GAAAC,cAAA;EAEpB;AACA;AACA;EACO,MAAMC,UAAU,CAA2B;IAC9C;AACJ;AACA;AACA;AACA;IACWC,UAAUA,CAACC,MAAe,EAAW;MACxC,OAAON,UAAU,CAACO,KAAK,CAACD,MAAM,CAACE,UAAU,CAAC;IAC9C;;IAEA;AACJ;AACA;AACA;AACA;IACWC,WAAWA,CAACC,SAAyB,EAAW;MACnD,OAAOR,WAAW,CAACK,KAAK,CAACG,SAAS,CAAC;IACvC;EACJ;EAAC,IAAAC,SAAA;IAAAC,UAAA;EAAA;EAAAD,SAAA,CAAAP,UAAA,GAAAA,UAAA;EAAA,OAAAO,SAAA;AAAA","ignoreList":[]}
1
+ {"version":3,"file":"BaseLayout-dbg.js","names":["FormLayout","___FormLayout","TableLayout","___TableLayout","BaseLayout","renderForm","properties","modelName","formTitle","trackPlugin","build","renderTable","tableMeta","tableTitle","__exports","__esModule"],"sources":["BaseLayout.ts"],"sourcesContent":["/**\n * @file BaseLayout.ts\n * @description Central layout factory that delegates to specific form or table layout engines.\n */\n\nimport { ILayoutManager } from \"../interfaces/ILayoutManager\";\nimport { IPropertyMetadata } from \"../interfaces/ISchema\";\nimport Control from \"sap/ui/core/Control\";\nimport { FormLayout } from \"./FormLayout\";\nimport { TableLayout } from \"./TableLayout\";\n\nimport { IPlugin } from \"../interfaces/IPlugin\";\n\nexport class BaseLayout implements ILayoutManager {\n public renderForm(properties: Record<string, IPropertyMetadata>, modelName: string = \"meta\", formTitle?: string, trackPlugin?: (plugin: IPlugin) => void): Control {\n return FormLayout.build(properties, modelName, formTitle, trackPlugin);\n }\n\n public renderTable(tableMeta: IPropertyMetadata, modelName: string = \"meta\", tableTitle?: string, trackPlugin?: (plugin: IPlugin) => void): Control {\n return TableLayout.build(tableMeta, modelName, tableTitle, trackPlugin);\n }\n}\n"],"mappings":";;;EAAA;AACA;AACA;AACA;EAHA,MAQSA,UAAU,GAAAC,aAAA;EAAA,MACVC,WAAW,GAAAC,cAAA;EAIb,MAAMC,UAAU,CAA2B;IACvCC,UAAUA,CAACC,UAA6C,EAAEC,SAAiB,GAAG,MAAM,EAAEC,SAAkB,EAAEC,WAAuC,EAAW;MAC/J,OAAOT,UAAU,CAACU,KAAK,CAACJ,UAAU,EAAEC,SAAS,EAAEC,SAAS,EAAEC,WAAW,CAAC;IAC1E;IAEOE,WAAWA,CAACC,SAA4B,EAAEL,SAAiB,GAAG,MAAM,EAAEM,UAAmB,EAAEJ,WAAuC,EAAW;MAChJ,OAAOP,WAAW,CAACQ,KAAK,CAACE,SAAS,EAAEL,SAAS,EAAEM,UAAU,EAAEJ,WAAW,CAAC;IAC3E;EACJ;EAAC,IAAAK,SAAA;IAAAC,UAAA;EAAA;EAAAD,SAAA,CAAAV,UAAA,GAAAA,UAAA;EAAA,OAAAU,SAAA;AAAA","ignoreList":[]}
@@ -2,27 +2,14 @@ declare module "nz/co/siliconst/ui5/metaui/layouts/BaseLayout" {
2
2
  /**
3
3
  * @file BaseLayout.ts
4
4
  * @description Central layout factory that delegates to specific form or table layout engines.
5
- * Implements ILayoutManager.
6
5
  */
7
6
  import { ILayoutManager } from "nz/co/siliconst/ui5/metaui/interfaces/ILayoutManager";
8
- import { ISchema, ITableMetadata } from "nz/co/siliconst/ui5/metaui/interfaces/ISchema";
7
+ import { IPropertyMetadata } from "nz/co/siliconst/ui5/metaui/interfaces/ISchema";
9
8
  import Control from "sap/ui/core/Control";
10
- /**
11
- * The core layout manager that delegates structural grid rendering based on schema configurations.
12
- */
9
+ import { IPlugin } from "nz/co/siliconst/ui5/metaui/interfaces/IPlugin";
13
10
  export class BaseLayout implements ILayoutManager {
14
- /**
15
- * Constructs a responsive form layout container.
16
- * @param schema The master schema containing rootFields to be mounted.
17
- * @returns A populated UI5 container (sap.ui.layout.form.SimpleForm).
18
- */
19
- renderForm(schema: ISchema): Control;
20
- /**
21
- * Constructs a responsive table layout container.
22
- * @param tableMeta The metadata defining the table columns.
23
- * @returns A UI5 Table control (sap.m.Table).
24
- */
25
- renderTable(tableMeta: ITableMetadata): Control;
11
+ renderForm(properties: Record<string, IPropertyMetadata>, modelName?: string, formTitle?: string, trackPlugin?: (plugin: IPlugin) => void): Control;
12
+ renderTable(tableMeta: IPropertyMetadata, modelName?: string, tableTitle?: string, trackPlugin?: (plugin: IPlugin) => void): Control;
26
13
  }
27
14
  }
28
15
  //# sourceMappingURL=BaseLayout.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"BaseLayout.d.ts","sourceRoot":"..\\..\\..\\..\\..\\..\\..\\..","sources":["src\\nz\\co\\siliconst\\ui5\\metaui\\layouts\\BaseLayout.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,+CAA+C,CAAC;IAC/D;;;;OAIG;IAEH,OAAO,EAAE,cAAc,EAAE,MAAM,sDAAsD,CAAC;IACtF,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,+CAA+C,CAAC;IACxF,OAAO,OAAO,MAAM,qBAAqB,CAAC;IAI1C;;OAEG;IACH,MAAa,UAAW,YAAW,cAAc;QAC7C;;;;WAIG;QACI,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO;QAI3C;;;;WAIG;QACI,WAAW,CAAC,SAAS,EAAE,cAAc,GAAG,OAAO;KAGzD;CAEA"}
1
+ {"version":3,"file":"BaseLayout.d.ts","sourceRoot":"../../../../../../../..","sources":["src/nz/co/siliconst/ui5/metaui/layouts/BaseLayout.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,+CAA+C,CAAC;IAC/D;;;OAGG;IAEH,OAAO,EAAE,cAAc,EAAE,MAAM,sDAAsD,CAAC;IACtF,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;IAClF,OAAO,OAAO,MAAM,qBAAqB,CAAC;IAI1C,OAAO,EAAE,OAAO,EAAE,MAAM,+CAA+C,CAAC;IAExE,MAAa,UAAW,YAAW,cAAc;QACtC,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,EAAE,SAAS,GAAE,MAAe,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO;QAI3J,WAAW,CAAC,SAAS,EAAE,iBAAiB,EAAE,SAAS,GAAE,MAAe,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO;KAGtJ;CAEA"}
@@ -1,2 +1,2 @@
1
- sap.ui.define(["./FormLayout","./TableLayout"],function(e,r){"use strict";const t=e["FormLayout"];const u=r["TableLayout"];class o{renderForm(e){return t.build(e.rootFields)}renderTable(e){return u.build(e)}}var a={__esModule:true};a.BaseLayout=o;return a});
1
+ sap.ui.define(["./FormLayout","./TableLayout"],function(e,r){"use strict";const t=e["FormLayout"];const u=r["TableLayout"];class a{renderForm(e,r="meta",u,a){return t.build(e,r,u,a)}renderTable(e,r="meta",t,a){return u.build(e,r,t,a)}}var o={__esModule:true};o.BaseLayout=a;return o});
2
2
  //# sourceMappingURL=BaseLayout.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BaseLayout.js","names":["FormLayout","___FormLayout","TableLayout","___TableLayout","BaseLayout","renderForm","schema","build","rootFields","renderTable","tableMeta","__exports","__esModule"],"sources":["BaseLayout.ts"],"sourcesContent":["/**\r\n * @file BaseLayout.ts\r\n * @description Central layout factory that delegates to specific form or table layout engines.\r\n * Implements ILayoutManager.\r\n */\r\n\r\nimport { ILayoutManager } from \"../interfaces/ILayoutManager\";\r\nimport { ISchema, ITableMetadata } from \"../interfaces/ISchema\";\r\nimport Control from \"sap/ui/core/Control\";\r\nimport { FormLayout } from \"./FormLayout\";\r\nimport { TableLayout } from \"./TableLayout\";\r\n\r\n/**\r\n * The core layout manager that delegates structural grid rendering based on schema configurations.\r\n */\r\nexport class BaseLayout implements ILayoutManager {\r\n /**\r\n * Constructs a responsive form layout container.\r\n * @param schema The master schema containing rootFields to be mounted.\r\n * @returns A populated UI5 container (sap.ui.layout.form.SimpleForm).\r\n */\r\n public renderForm(schema: ISchema): Control {\r\n return FormLayout.build(schema.rootFields);\r\n }\r\n\r\n /**\r\n * Constructs a responsive table layout container.\r\n * @param tableMeta The metadata defining the table columns.\r\n * @returns A UI5 Table control (sap.m.Table).\r\n */\r\n public renderTable(tableMeta: ITableMetadata): Control {\r\n return TableLayout.build(tableMeta);\r\n }\r\n}\r\n"],"mappings":"0EAAA,MASSA,EAAUC,EAAA,oBACVC,EAAWC,EAAA,eAKb,MAAMC,EAMFC,WAAWC,GACd,OAAON,EAAWO,MAAMD,EAAOE,WACnC,CAOOC,YAAYC,GACf,OAAOR,EAAYK,MAAMG,EAC7B,EACH,IAAAC,EAAA,CAAAC,WAAA,MAAAD,EAAAP,aAAA,OAAAO,CAAA","ignoreList":[]}
1
+ {"version":3,"file":"BaseLayout.js","names":["FormLayout","___FormLayout","TableLayout","___TableLayout","BaseLayout","renderForm","properties","modelName","formTitle","trackPlugin","build","renderTable","tableMeta","tableTitle","__exports","__esModule"],"sources":["BaseLayout.ts"],"sourcesContent":["/**\n * @file BaseLayout.ts\n * @description Central layout factory that delegates to specific form or table layout engines.\n */\n\nimport { ILayoutManager } from \"../interfaces/ILayoutManager\";\nimport { IPropertyMetadata } from \"../interfaces/ISchema\";\nimport Control from \"sap/ui/core/Control\";\nimport { FormLayout } from \"./FormLayout\";\nimport { TableLayout } from \"./TableLayout\";\n\nimport { IPlugin } from \"../interfaces/IPlugin\";\n\nexport class BaseLayout implements ILayoutManager {\n public renderForm(properties: Record<string, IPropertyMetadata>, modelName: string = \"meta\", formTitle?: string, trackPlugin?: (plugin: IPlugin) => void): Control {\n return FormLayout.build(properties, modelName, formTitle, trackPlugin);\n }\n\n public renderTable(tableMeta: IPropertyMetadata, modelName: string = \"meta\", tableTitle?: string, trackPlugin?: (plugin: IPlugin) => void): Control {\n return TableLayout.build(tableMeta, modelName, tableTitle, trackPlugin);\n }\n}\n"],"mappings":"0EAAA,MAQSA,EAAUC,EAAA,oBACVC,EAAWC,EAAA,eAIb,MAAMC,EACFC,WAAWC,EAA+CC,EAAoB,OAAQC,EAAoBC,GAC7G,OAAOT,EAAWU,MAAMJ,EAAYC,EAAWC,EAAWC,EAC9D,CAEOE,YAAYC,EAA8BL,EAAoB,OAAQM,EAAqBJ,GAC9F,OAAOP,EAAYQ,MAAME,EAAWL,EAAWM,EAAYJ,EAC/D,EACH,IAAAK,EAAA,CAAAC,WAAA,MAAAD,EAAAV,aAAA,OAAAU,CAAA","ignoreList":[]}
@@ -1,34 +1,22 @@
1
- /**
2
- * @file BaseLayout.ts
3
- * @description Central layout factory that delegates to specific form or table layout engines.
4
- * Implements ILayoutManager.
5
- */
6
-
7
- import { ILayoutManager } from "../interfaces/ILayoutManager";
8
- import { ISchema, ITableMetadata } from "../interfaces/ISchema";
9
- import Control from "sap/ui/core/Control";
10
- import { FormLayout } from "./FormLayout";
11
- import { TableLayout } from "./TableLayout";
12
-
13
- /**
14
- * The core layout manager that delegates structural grid rendering based on schema configurations.
15
- */
16
- export class BaseLayout implements ILayoutManager {
17
- /**
18
- * Constructs a responsive form layout container.
19
- * @param schema The master schema containing rootFields to be mounted.
20
- * @returns A populated UI5 container (sap.ui.layout.form.SimpleForm).
21
- */
22
- public renderForm(schema: ISchema): Control {
23
- return FormLayout.build(schema.rootFields);
24
- }
25
-
26
- /**
27
- * Constructs a responsive table layout container.
28
- * @param tableMeta The metadata defining the table columns.
29
- * @returns A UI5 Table control (sap.m.Table).
30
- */
31
- public renderTable(tableMeta: ITableMetadata): Control {
32
- return TableLayout.build(tableMeta);
33
- }
34
- }
1
+ /**
2
+ * @file BaseLayout.ts
3
+ * @description Central layout factory that delegates to specific form or table layout engines.
4
+ */
5
+
6
+ import { ILayoutManager } from "../interfaces/ILayoutManager";
7
+ import { IPropertyMetadata } from "../interfaces/ISchema";
8
+ import Control from "sap/ui/core/Control";
9
+ import { FormLayout } from "./FormLayout";
10
+ import { TableLayout } from "./TableLayout";
11
+
12
+ import { IPlugin } from "../interfaces/IPlugin";
13
+
14
+ export class BaseLayout implements ILayoutManager {
15
+ public renderForm(properties: Record<string, IPropertyMetadata>, modelName: string = "meta", formTitle?: string, trackPlugin?: (plugin: IPlugin) => void): Control {
16
+ return FormLayout.build(properties, modelName, formTitle, trackPlugin);
17
+ }
18
+
19
+ public renderTable(tableMeta: IPropertyMetadata, modelName: string = "meta", tableTitle?: string, trackPlugin?: (plugin: IPlugin) => void): Control {
20
+ return TableLayout.build(tableMeta, modelName, tableTitle, trackPlugin);
21
+ }
22
+ }
@@ -1,57 +1,99 @@
1
- sap.ui.define(["sap/ui/layout/form/SimpleForm", "sap/m/Label", "../core/PluginRegistry"], function (SimpleForm, Label, ___core_PluginRegistry) {
2
- "use strict";
3
-
4
- const PluginRegistry = ___core_PluginRegistry["PluginRegistry"];
5
- /**
6
- * Utility class strictly for constructing Form layouts without custom CSS.
7
- */
8
- class FormLayout {
9
- /**
10
- * Builds a SimpleForm with ResponsiveGridLayout, injecting the requested plugins.
11
- * @param fields The array of root fields to render as FormElements.
12
- * @returns A fully populated sap.ui.layout.form.SimpleForm.
13
- */
14
- static build(fields) {
15
- const form = new SimpleForm({
16
- editable: true,
17
- layout: "ResponsiveGridLayout",
18
- labelSpanXL: 4,
19
- labelSpanL: 4,
20
- labelSpanM: 4,
21
- labelSpanS: 12,
22
- adjustLabelSpan: false,
23
- emptySpanXL: 0,
24
- emptySpanL: 0,
25
- emptySpanM: 0,
26
- emptySpanS: 0,
27
- columnsXL: 1,
28
- columnsL: 1,
29
- columnsM: 1,
30
- singleContainerFullSize: false
31
- });
32
- const registry = PluginRegistry.getInstance();
33
- fields.forEach(field => {
34
- // Respect Fiori accessibility standards by enforcing the required flag on labels
35
- const label = new Label({
36
- text: field.label,
37
- required: field.isRequired
38
- });
39
-
40
- // Instantiate the correct plugin for the data type
41
- const plugin = registry.getPlugin(field.type);
42
-
43
- // In the isolated state manager architecture, the binding path maps exactly to the fieldName.
44
- const control = plugin.render(field, `/${field.fieldName}`);
45
- form.addContent(label);
46
- form.addContent(control);
47
- });
48
- return form;
49
- }
50
- }
51
- var __exports = {
52
- __esModule: true
53
- };
54
- __exports.FormLayout = FormLayout;
55
- return __exports;
56
- });
1
+ sap.ui.define(["sap/ui/layout/form/SimpleForm", "sap/m/Label", "sap/ui/core/Title", "../core/PluginRegistry"], function (SimpleForm, Label, Title, ___core_PluginRegistry) {
2
+ "use strict";
3
+
4
+ const PluginRegistry = ___core_PluginRegistry["PluginRegistry"];
5
+ class FormLayout {
6
+ /**
7
+ * Builds a SimpleForm with ResponsiveGridLayout, injecting the requested plugins.
8
+ * @param properties The dictionary of fields to render.
9
+ * @param modelName The dynamic model name.
10
+ * @param formTitle Optional title for the form block.
11
+ * @param trackPlugin Optional callback to track instantiated plugins.
12
+ */
13
+ static build(properties, modelName = "meta", formTitle, trackPlugin) {
14
+ const form = new SimpleForm({
15
+ editable: true,
16
+ title: formTitle,
17
+ layout: "ResponsiveGridLayout",
18
+ labelSpanXL: 4,
19
+ labelSpanL: 4,
20
+ labelSpanM: 4,
21
+ labelSpanS: 12,
22
+ adjustLabelSpan: false,
23
+ emptySpanXL: 0,
24
+ emptySpanL: 0,
25
+ emptySpanM: 0,
26
+ emptySpanS: 0,
27
+ columnsXL: 1,
28
+ columnsL: 1,
29
+ columnsM: 1,
30
+ singleContainerFullSize: false
31
+ });
32
+ const registry = PluginRegistry.getInstance();
33
+
34
+ // Group fields by their ui.group directive
35
+ const groups = {};
36
+ const DEFAULT_GROUP = "__DEFAULT__";
37
+ for (const key of Object.keys(properties)) {
38
+ const meta = properties[key];
39
+ const groupName = meta.ui?.group || DEFAULT_GROUP;
40
+ if (!groups[groupName]) groups[groupName] = [];
41
+ groups[groupName].push({
42
+ key,
43
+ meta
44
+ });
45
+ }
46
+
47
+ // Render groups
48
+ for (const groupName of Object.keys(groups)) {
49
+ if (groupName !== DEFAULT_GROUP) {
50
+ form.addContent(new Title({
51
+ text: groupName
52
+ }));
53
+ }
54
+ groups[groupName].forEach(field => {
55
+ try {
56
+ const label = new Label({
57
+ text: field.meta.ui?.label || field.key,
58
+ required: field.meta.required
59
+ });
60
+
61
+ // Attach visibility condition to label and control container logic
62
+ if (field.meta.ui?.visibleOn) {
63
+ const expr = `{= ${field.meta.ui.visibleOn.replace(/\$root\./g, `${modelName}>/`).replace(/\./g, '/')} }`;
64
+ label.bindProperty("visible", {
65
+ parts: [{
66
+ path: "meta>/"
67
+ }],
68
+ formatter: () => false
69
+ }); // temporary, condition engine does this usually
70
+ }
71
+ const plugin = registry.getPlugin(field.meta.type, field.meta.ui?.widget);
72
+ if (trackPlugin) trackPlugin(plugin);
73
+ const control = plugin.render(field.meta, `/${field.key}`, modelName);
74
+ if (field.meta.ui?.fullWidth) {
75
+ sap.ui.require(["sap/ui/layout/GridData"], GridData => {
76
+ control.setLayoutData(new GridData({
77
+ span: "XL12 L12 M12 S12"
78
+ }));
79
+ });
80
+ }
81
+ form.addContent(label);
82
+ form.addContent(control);
83
+ } catch (error) {
84
+ sap.ui.require(["sap/base/Log"], Log => {
85
+ if (Log) Log.error(`[MetaUI] Failed to render field ${field.key}`, error.message, "FormLayout");
86
+ });
87
+ }
88
+ });
89
+ }
90
+ return form;
91
+ }
92
+ }
93
+ var __exports = {
94
+ __esModule: true
95
+ };
96
+ __exports.FormLayout = FormLayout;
97
+ return __exports;
98
+ });
57
99
  //# sourceMappingURL=FormLayout-dbg.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FormLayout-dbg.js","names":["PluginRegistry","___core_PluginRegistry","FormLayout","build","fields","form","SimpleForm","editable","layout","labelSpanXL","labelSpanL","labelSpanM","labelSpanS","adjustLabelSpan","emptySpanXL","emptySpanL","emptySpanM","emptySpanS","columnsXL","columnsL","columnsM","singleContainerFullSize","registry","getInstance","forEach","field","label","Label","text","required","isRequired","plugin","getPlugin","type","control","render","fieldName","addContent","__exports","__esModule"],"sources":["FormLayout.ts"],"sourcesContent":["/**\r\n * @file FormLayout.ts\r\n * @description Generates a fully responsive SAP Fiori Form layout (SimpleForm).\r\n */\r\n\r\nimport SimpleForm from \"sap/ui/layout/form/SimpleForm\";\r\nimport Label from \"sap/m/Label\";\r\nimport { IFieldMetadata } from \"../interfaces/ISchema\";\r\nimport { PluginRegistry } from \"../core/PluginRegistry\";\r\n\r\n/**\r\n * Utility class strictly for constructing Form layouts without custom CSS.\r\n */\r\nexport class FormLayout {\r\n /**\r\n * Builds a SimpleForm with ResponsiveGridLayout, injecting the requested plugins.\r\n * @param fields The array of root fields to render as FormElements.\r\n * @returns A fully populated sap.ui.layout.form.SimpleForm.\r\n */\r\n public static build(fields: IFieldMetadata[]): SimpleForm {\r\n const form = new SimpleForm({\r\n editable: true,\r\n layout: \"ResponsiveGridLayout\",\r\n labelSpanXL: 4,\r\n labelSpanL: 4,\r\n labelSpanM: 4,\r\n labelSpanS: 12,\r\n adjustLabelSpan: false,\r\n emptySpanXL: 0,\r\n emptySpanL: 0,\r\n emptySpanM: 0,\r\n emptySpanS: 0,\r\n columnsXL: 1,\r\n columnsL: 1,\r\n columnsM: 1,\r\n singleContainerFullSize: false\r\n });\r\n\r\n const registry = PluginRegistry.getInstance();\r\n\r\n fields.forEach((field) => {\r\n // Respect Fiori accessibility standards by enforcing the required flag on labels\r\n const label = new Label({\r\n text: field.label,\r\n required: field.isRequired\r\n });\r\n\r\n // Instantiate the correct plugin for the data type\r\n const plugin = registry.getPlugin(field.type);\r\n \r\n // In the isolated state manager architecture, the binding path maps exactly to the fieldName.\r\n const control = plugin.render(field, `/${field.fieldName}`);\r\n\r\n form.addContent(label);\r\n form.addContent(control);\r\n });\r\n\r\n return form;\r\n }\r\n}\r\n"],"mappings":";;;QAQSA,cAAc,GAAAC,sBAAA;EAEvB;AACA;AACA;EACO,MAAMC,UAAU,CAAC;IACpB;AACJ;AACA;AACA;AACA;IACI,OAAcC,KAAKA,CAACC,MAAwB,EAAc;MACtD,MAAMC,IAAI,GAAG,IAAIC,UAAU,CAAC;QACxBC,QAAQ,EAAE,IAAI;QACdC,MAAM,EAAE,sBAAsB;QAC9BC,WAAW,EAAE,CAAC;QACdC,UAAU,EAAE,CAAC;QACbC,UAAU,EAAE,CAAC;QACbC,UAAU,EAAE,EAAE;QACdC,eAAe,EAAE,KAAK;QACtBC,WAAW,EAAE,CAAC;QACdC,UAAU,EAAE,CAAC;QACbC,UAAU,EAAE,CAAC;QACbC,UAAU,EAAE,CAAC;QACbC,SAAS,EAAE,CAAC;QACZC,QAAQ,EAAE,CAAC;QACXC,QAAQ,EAAE,CAAC;QACXC,uBAAuB,EAAE;MAC7B,CAAC,CAAC;MAEF,MAAMC,QAAQ,GAAGtB,cAAc,CAACuB,WAAW,CAAC,CAAC;MAE7CnB,MAAM,CAACoB,OAAO,CAAEC,KAAK,IAAK;QACtB;QACA,MAAMC,KAAK,GAAG,IAAIC,KAAK,CAAC;UACpBC,IAAI,EAAEH,KAAK,CAACC,KAAK;UACjBG,QAAQ,EAAEJ,KAAK,CAACK;QACpB,CAAC,CAAC;;QAEF;QACA,MAAMC,MAAM,GAAGT,QAAQ,CAACU,SAAS,CAACP,KAAK,CAACQ,IAAI,CAAC;;QAE7C;QACA,MAAMC,OAAO,GAAGH,MAAM,CAACI,MAAM,CAACV,KAAK,EAAE,IAAIA,KAAK,CAACW,SAAS,EAAE,CAAC;QAE3D/B,IAAI,CAACgC,UAAU,CAACX,KAAK,CAAC;QACtBrB,IAAI,CAACgC,UAAU,CAACH,OAAO,CAAC;MAC5B,CAAC,CAAC;MAEF,OAAO7B,IAAI;IACf;EACJ;EAAC,IAAAiC,SAAA;IAAAC,UAAA;EAAA;EAAAD,SAAA,CAAApC,UAAA,GAAAA,UAAA;EAAA,OAAAoC,SAAA;AAAA","ignoreList":[]}
1
+ {"version":3,"file":"FormLayout-dbg.js","names":["PluginRegistry","___core_PluginRegistry","FormLayout","build","properties","modelName","formTitle","trackPlugin","form","SimpleForm","editable","title","layout","labelSpanXL","labelSpanL","labelSpanM","labelSpanS","adjustLabelSpan","emptySpanXL","emptySpanL","emptySpanM","emptySpanS","columnsXL","columnsL","columnsM","singleContainerFullSize","registry","getInstance","groups","DEFAULT_GROUP","key","Object","keys","meta","groupName","ui","group","push","addContent","Title","text","forEach","field","label","Label","required","visibleOn","expr","replace","bindProperty","parts","path","formatter","plugin","getPlugin","type","widget","control","render","fullWidth","sap","require","GridData","setLayoutData","span","error","Log","message","__exports","__esModule"],"sources":["FormLayout.ts"],"sourcesContent":["/**\n * @file FormLayout.ts\n * @description Generates a fully responsive SAP Fiori Form layout (SimpleForm).\n */\n\nimport SimpleForm from \"sap/ui/layout/form/SimpleForm\";\nimport Label from \"sap/m/Label\";\nimport Title from \"sap/ui/core/Title\";\nimport { IPropertyMetadata } from \"../interfaces/ISchema\";\nimport { PluginRegistry } from \"../core/PluginRegistry\";\nimport { IPlugin } from \"../interfaces/IPlugin\";\n\nexport class FormLayout {\n /**\n * Builds a SimpleForm with ResponsiveGridLayout, injecting the requested plugins.\n * @param properties The dictionary of fields to render.\n * @param modelName The dynamic model name.\n * @param formTitle Optional title for the form block.\n * @param trackPlugin Optional callback to track instantiated plugins.\n */\n public static build(properties: Record<string, IPropertyMetadata>, modelName: string = \"meta\", formTitle?: string, trackPlugin?: (plugin: IPlugin) => void): SimpleForm {\n const form = new SimpleForm({\n editable: true,\n title: formTitle,\n layout: \"ResponsiveGridLayout\",\n labelSpanXL: 4,\n labelSpanL: 4,\n labelSpanM: 4,\n labelSpanS: 12,\n adjustLabelSpan: false,\n emptySpanXL: 0,\n emptySpanL: 0,\n emptySpanM: 0,\n emptySpanS: 0,\n columnsXL: 1,\n columnsL: 1,\n columnsM: 1,\n singleContainerFullSize: false\n });\n\n const registry = PluginRegistry.getInstance();\n \n // Group fields by their ui.group directive\n const groups: Record<string, { key: string; meta: IPropertyMetadata }[]> = {};\n const DEFAULT_GROUP = \"__DEFAULT__\";\n \n for (const key of Object.keys(properties)) {\n const meta = properties[key];\n const groupName = meta.ui?.group || DEFAULT_GROUP;\n if (!groups[groupName]) groups[groupName] = [];\n groups[groupName].push({ key, meta });\n }\n\n // Render groups\n for (const groupName of Object.keys(groups)) {\n if (groupName !== DEFAULT_GROUP) {\n form.addContent(new Title({ text: groupName }));\n }\n \n groups[groupName].forEach((field) => {\n try {\n const label = new Label({\n text: field.meta.ui?.label || field.key,\n required: field.meta.required\n });\n\n // Attach visibility condition to label and control container logic\n if (field.meta.ui?.visibleOn) {\n const expr = `{= ${field.meta.ui.visibleOn.replace(/\\$root\\./g, `${modelName}>/`).replace(/\\./g, '/')} }`;\n label.bindProperty(\"visible\", { parts: [{ path: \"meta>/\" }], formatter: () => false}); // temporary, condition engine does this usually\n }\n\n const plugin = registry.getPlugin(field.meta.type, field.meta.ui?.widget);\n if (trackPlugin) trackPlugin(plugin);\n const control = plugin.render(field.meta, `/${field.key}`, modelName);\n\n if (field.meta.ui?.fullWidth) {\n sap.ui.require([\"sap/ui/layout/GridData\"], (GridData: any) => {\n control.setLayoutData(new GridData({\n span: \"XL12 L12 M12 S12\"\n }));\n });\n }\n\n form.addContent(label);\n form.addContent(control);\n } catch (error) {\n sap.ui.require([\"sap/base/Log\"], (Log: any) => {\n if (Log) Log.error(`[MetaUI] Failed to render field ${field.key}`, (error as Error).message, \"FormLayout\");\n });\n }\n });\n }\n\n return form;\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -4,17 +4,17 @@ declare module "nz/co/siliconst/ui5/metaui/layouts/FormLayout" {
4
4
  * @description Generates a fully responsive SAP Fiori Form layout (SimpleForm).
5
5
  */
6
6
  import SimpleForm from "sap/ui/layout/form/SimpleForm";
7
- import { IFieldMetadata } from "nz/co/siliconst/ui5/metaui/interfaces/ISchema";
8
- /**
9
- * Utility class strictly for constructing Form layouts without custom CSS.
10
- */
7
+ import { IPropertyMetadata } from "nz/co/siliconst/ui5/metaui/interfaces/ISchema";
8
+ import { IPlugin } from "nz/co/siliconst/ui5/metaui/interfaces/IPlugin";
11
9
  export class FormLayout {
12
10
  /**
13
11
  * Builds a SimpleForm with ResponsiveGridLayout, injecting the requested plugins.
14
- * @param fields The array of root fields to render as FormElements.
15
- * @returns A fully populated sap.ui.layout.form.SimpleForm.
12
+ * @param properties The dictionary of fields to render.
13
+ * @param modelName The dynamic model name.
14
+ * @param formTitle Optional title for the form block.
15
+ * @param trackPlugin Optional callback to track instantiated plugins.
16
16
  */
17
- static build(fields: IFieldMetadata[]): SimpleForm;
17
+ static build(properties: Record<string, IPropertyMetadata>, modelName?: string, formTitle?: string, trackPlugin?: (plugin: IPlugin) => void): SimpleForm;
18
18
  }
19
19
  }
20
20
  //# sourceMappingURL=FormLayout.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"FormLayout.d.ts","sourceRoot":"..\\..\\..\\..\\..\\..\\..\\..","sources":["src\\nz\\co\\siliconst\\ui5\\metaui\\layouts\\FormLayout.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,+CAA+C,CAAC;IAC/D;;;OAGG;IAEH,OAAO,UAAU,MAAM,+BAA+B,CAAC;IAEvD,OAAO,EAAE,cAAc,EAAE,MAAM,+CAA+C,CAAC;IAG/E;;OAEG;IACH,MAAa,UAAU;QACnB;;;;WAIG;eACW,KAAK,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,UAAU;KAwC5D;CAEA"}
1
+ {"version":3,"file":"FormLayout.d.ts","sourceRoot":"../../../../../../../..","sources":["src/nz/co/siliconst/ui5/metaui/layouts/FormLayout.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,+CAA+C,CAAC;IAC/D;;;OAGG;IAEH,OAAO,UAAU,MAAM,+BAA+B,CAAC;IAGvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;IAElF,OAAO,EAAE,OAAO,EAAE,MAAM,+CAA+C,CAAC;IAExE,MAAa,UAAU;QACnB;;;;;;WAMG;eACW,KAAK,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,EAAE,SAAS,GAAE,MAAe,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,GAAG,UAAU;KA4E1K;CAEA"}
@@ -1,2 +1,2 @@
1
- sap.ui.define(["sap/ui/layout/form/SimpleForm","sap/m/Label","../core/PluginRegistry"],function(e,n,t){"use strict";const a=t["PluginRegistry"];class l{static build(t){const l=new e({editable:true,layout:"ResponsiveGridLayout",labelSpanXL:4,labelSpanL:4,labelSpanM:4,labelSpanS:12,adjustLabelSpan:false,emptySpanXL:0,emptySpanL:0,emptySpanM:0,emptySpanS:0,columnsXL:1,columnsL:1,columnsM:1,singleContainerFullSize:false});const s=a.getInstance();t.forEach(e=>{const t=new n({text:e.label,required:e.isRequired});const a=s.getPlugin(e.type);const o=a.render(e,`/${e.fieldName}`);l.addContent(t);l.addContent(o)});return l}}var s={__esModule:true};s.FormLayout=l;return s});
1
+ sap.ui.define(["sap/ui/layout/form/SimpleForm","sap/m/Label","sap/ui/core/Title","../core/PluginRegistry"],function(e,t,a,n){"use strict";const i=n["PluginRegistry"];class s{static build(n,s="meta",o,r){const l=new e({editable:true,title:o,layout:"ResponsiveGridLayout",labelSpanXL:4,labelSpanL:4,labelSpanM:4,labelSpanS:12,adjustLabelSpan:false,emptySpanXL:0,emptySpanL:0,emptySpanM:0,emptySpanS:0,columnsXL:1,columnsL:1,columnsM:1,singleContainerFullSize:false});const u=i.getInstance();const p={};const c="__DEFAULT__";for(const e of Object.keys(n)){const t=n[e];const a=t.ui?.group||c;if(!p[a])p[a]=[];p[a].push({key:e,meta:t})}for(const e of Object.keys(p)){if(e!==c){l.addContent(new a({text:e}))}p[e].forEach(e=>{try{const a=new t({text:e.meta.ui?.label||e.key,required:e.meta.required});if(e.meta.ui?.visibleOn){const t=`{= ${e.meta.ui.visibleOn.replace(/\$root\./g,`${s}>/`).replace(/\./g,"/")} }`;a.bindProperty("visible",{parts:[{path:"meta>/"}],formatter:()=>false})}const n=u.getPlugin(e.meta.type,e.meta.ui?.widget);if(r)r(n);const i=n.render(e.meta,`/${e.key}`,s);if(e.meta.ui?.fullWidth){sap.ui.require(["sap/ui/layout/GridData"],e=>{i.setLayoutData(new e({span:"XL12 L12 M12 S12"}))})}l.addContent(a);l.addContent(i)}catch(t){sap.ui.require(["sap/base/Log"],a=>{if(a)a.error(`[MetaUI] Failed to render field ${e.key}`,t.message,"FormLayout")})}})}return l}}var o={__esModule:true};o.FormLayout=s;return o});
2
2
  //# sourceMappingURL=FormLayout.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FormLayout.js","names":["PluginRegistry","___core_PluginRegistry","FormLayout","build","fields","form","SimpleForm","editable","layout","labelSpanXL","labelSpanL","labelSpanM","labelSpanS","adjustLabelSpan","emptySpanXL","emptySpanL","emptySpanM","emptySpanS","columnsXL","columnsL","columnsM","singleContainerFullSize","registry","getInstance","forEach","field","label","Label","text","required","isRequired","plugin","getPlugin","type","control","render","fieldName","addContent","__exports","__esModule"],"sources":["FormLayout.ts"],"sourcesContent":["/**\r\n * @file FormLayout.ts\r\n * @description Generates a fully responsive SAP Fiori Form layout (SimpleForm).\r\n */\r\n\r\nimport SimpleForm from \"sap/ui/layout/form/SimpleForm\";\r\nimport Label from \"sap/m/Label\";\r\nimport { IFieldMetadata } from \"../interfaces/ISchema\";\r\nimport { PluginRegistry } from \"../core/PluginRegistry\";\r\n\r\n/**\r\n * Utility class strictly for constructing Form layouts without custom CSS.\r\n */\r\nexport class FormLayout {\r\n /**\r\n * Builds a SimpleForm with ResponsiveGridLayout, injecting the requested plugins.\r\n * @param fields The array of root fields to render as FormElements.\r\n * @returns A fully populated sap.ui.layout.form.SimpleForm.\r\n */\r\n public static build(fields: IFieldMetadata[]): SimpleForm {\r\n const form = new SimpleForm({\r\n editable: true,\r\n layout: \"ResponsiveGridLayout\",\r\n labelSpanXL: 4,\r\n labelSpanL: 4,\r\n labelSpanM: 4,\r\n labelSpanS: 12,\r\n adjustLabelSpan: false,\r\n emptySpanXL: 0,\r\n emptySpanL: 0,\r\n emptySpanM: 0,\r\n emptySpanS: 0,\r\n columnsXL: 1,\r\n columnsL: 1,\r\n columnsM: 1,\r\n singleContainerFullSize: false\r\n });\r\n\r\n const registry = PluginRegistry.getInstance();\r\n\r\n fields.forEach((field) => {\r\n // Respect Fiori accessibility standards by enforcing the required flag on labels\r\n const label = new Label({\r\n text: field.label,\r\n required: field.isRequired\r\n });\r\n\r\n // Instantiate the correct plugin for the data type\r\n const plugin = registry.getPlugin(field.type);\r\n \r\n // In the isolated state manager architecture, the binding path maps exactly to the fieldName.\r\n const control = plugin.render(field, `/${field.fieldName}`);\r\n\r\n form.addContent(label);\r\n form.addContent(control);\r\n });\r\n\r\n return form;\r\n }\r\n}\r\n"],"mappings":"0HAQSA,EAAcC,EAAA,kBAKhB,MAAMC,EAMT,YAAcC,CAAMC,GAChB,MAAMC,EAAO,IAAIC,EAAW,CACxBC,SAAU,KACVC,OAAQ,uBACRC,YAAa,EACbC,WAAY,EACZC,WAAY,EACZC,WAAY,GACZC,gBAAiB,MACjBC,YAAa,EACbC,WAAY,EACZC,WAAY,EACZC,WAAY,EACZC,UAAW,EACXC,SAAU,EACVC,SAAU,EACVC,wBAAyB,QAG7B,MAAMC,EAAWtB,EAAeuB,cAEhCnB,EAAOoB,QAASC,IAEZ,MAAMC,EAAQ,IAAIC,EAAM,CACpBC,KAAMH,EAAMC,MACZG,SAAUJ,EAAMK,aAIpB,MAAMC,EAAST,EAASU,UAAUP,EAAMQ,MAGxC,MAAMC,EAAUH,EAAOI,OAAOV,EAAO,IAAIA,EAAMW,aAE/C/B,EAAKgC,WAAWX,GAChBrB,EAAKgC,WAAWH,KAGpB,OAAO7B,CACX,EACH,IAAAiC,EAAA,CAAAC,WAAA,MAAAD,EAAApC,aAAA,OAAAoC,CAAA","ignoreList":[]}
1
+ {"version":3,"file":"FormLayout.js","names":["PluginRegistry","___core_PluginRegistry","FormLayout","build","properties","modelName","formTitle","trackPlugin","form","SimpleForm","editable","title","layout","labelSpanXL","labelSpanL","labelSpanM","labelSpanS","adjustLabelSpan","emptySpanXL","emptySpanL","emptySpanM","emptySpanS","columnsXL","columnsL","columnsM","singleContainerFullSize","registry","getInstance","groups","DEFAULT_GROUP","key","Object","keys","meta","groupName","ui","group","push","addContent","Title","text","forEach","field","label","Label","required","visibleOn","expr","replace","bindProperty","parts","path","formatter","plugin","getPlugin","type","widget","control","render","fullWidth","sap","require","GridData","setLayoutData","span","error","Log","message","__exports","__esModule"],"sources":["FormLayout.ts"],"sourcesContent":["/**\n * @file FormLayout.ts\n * @description Generates a fully responsive SAP Fiori Form layout (SimpleForm).\n */\n\nimport SimpleForm from \"sap/ui/layout/form/SimpleForm\";\nimport Label from \"sap/m/Label\";\nimport Title from \"sap/ui/core/Title\";\nimport { IPropertyMetadata } from \"../interfaces/ISchema\";\nimport { PluginRegistry } from \"../core/PluginRegistry\";\nimport { IPlugin } from \"../interfaces/IPlugin\";\n\nexport class FormLayout {\n /**\n * Builds a SimpleForm with ResponsiveGridLayout, injecting the requested plugins.\n * @param properties The dictionary of fields to render.\n * @param modelName The dynamic model name.\n * @param formTitle Optional title for the form block.\n * @param trackPlugin Optional callback to track instantiated plugins.\n */\n public static build(properties: Record<string, IPropertyMetadata>, modelName: string = \"meta\", formTitle?: string, trackPlugin?: (plugin: IPlugin) => void): SimpleForm {\n const form = new SimpleForm({\n editable: true,\n title: formTitle,\n layout: \"ResponsiveGridLayout\",\n labelSpanXL: 4,\n labelSpanL: 4,\n labelSpanM: 4,\n labelSpanS: 12,\n adjustLabelSpan: false,\n emptySpanXL: 0,\n emptySpanL: 0,\n emptySpanM: 0,\n emptySpanS: 0,\n columnsXL: 1,\n columnsL: 1,\n columnsM: 1,\n singleContainerFullSize: false\n });\n\n const registry = PluginRegistry.getInstance();\n \n // Group fields by their ui.group directive\n const groups: Record<string, { key: string; meta: IPropertyMetadata }[]> = {};\n const DEFAULT_GROUP = \"__DEFAULT__\";\n \n for (const key of Object.keys(properties)) {\n const meta = properties[key];\n const groupName = meta.ui?.group || DEFAULT_GROUP;\n if (!groups[groupName]) groups[groupName] = [];\n groups[groupName].push({ key, meta });\n }\n\n // Render groups\n for (const groupName of Object.keys(groups)) {\n if (groupName !== DEFAULT_GROUP) {\n form.addContent(new Title({ text: groupName }));\n }\n \n groups[groupName].forEach((field) => {\n try {\n const label = new Label({\n text: field.meta.ui?.label || field.key,\n required: field.meta.required\n });\n\n // Attach visibility condition to label and control container logic\n if (field.meta.ui?.visibleOn) {\n const expr = `{= ${field.meta.ui.visibleOn.replace(/\\$root\\./g, `${modelName}>/`).replace(/\\./g, '/')} }`;\n label.bindProperty(\"visible\", { parts: [{ path: \"meta>/\" }], formatter: () => false}); // temporary, condition engine does this usually\n }\n\n const plugin = registry.getPlugin(field.meta.type, field.meta.ui?.widget);\n if (trackPlugin) trackPlugin(plugin);\n const control = plugin.render(field.meta, `/${field.key}`, modelName);\n\n if (field.meta.ui?.fullWidth) {\n sap.ui.require([\"sap/ui/layout/GridData\"], (GridData: any) => {\n control.setLayoutData(new GridData({\n span: \"XL12 L12 M12 S12\"\n }));\n });\n }\n\n form.addContent(label);\n form.addContent(control);\n } catch (error) {\n sap.ui.require([\"sap/base/Log\"], (Log: any) => {\n if (Log) Log.error(`[MetaUI] Failed to render field ${field.key}`, (error as Error).message, \"FormLayout\");\n });\n }\n });\n }\n\n return form;\n }\n}\n"],"mappings":"gJASSA,EAAcC,EAAA,kBAGhB,MAAMC,EAQT,YAAcC,CAAMC,EAA+CC,EAAoB,OAAQC,EAAoBC,GAC/G,MAAMC,EAAO,IAAIC,EAAW,CACxBC,SAAU,KACVC,MAAOL,EACPM,OAAQ,uBACRC,YAAa,EACbC,WAAY,EACZC,WAAY,EACZC,WAAY,GACZC,gBAAiB,MACjBC,YAAa,EACbC,WAAY,EACZC,WAAY,EACZC,WAAY,EACZC,UAAW,EACXC,SAAU,EACVC,SAAU,EACVC,wBAAyB,QAG7B,MAAMC,EAAW1B,EAAe2B,cAGhC,MAAMC,EAAqE,CAAC,EAC5E,MAAMC,EAAgB,cAEtB,IAAK,MAAMC,KAAOC,OAAOC,KAAK5B,GAAa,CACvC,MAAM6B,EAAO7B,EAAW0B,GACxB,MAAMI,EAAYD,EAAKE,IAAIC,OAASP,EACpC,IAAKD,EAAOM,GAAYN,EAAOM,GAAa,GAC5CN,EAAOM,GAAWG,KAAK,CAAEP,MAAKG,QAClC,CAGA,IAAK,MAAMC,KAAaH,OAAOC,KAAKJ,GAAS,CACzC,GAAIM,IAAcL,EAAe,CAC7BrB,EAAK8B,WAAW,IAAIC,EAAM,CAAEC,KAAMN,IACtC,CAEAN,EAAOM,GAAWO,QAASC,IACvB,IACI,MAAMC,EAAQ,IAAIC,EAAM,CACpBJ,KAAME,EAAMT,KAAKE,IAAIQ,OAASD,EAAMZ,IACpCe,SAAUH,EAAMT,KAAKY,WAIzB,GAAIH,EAAMT,KAAKE,IAAIW,UAAW,CAC1B,MAAMC,EAAO,MAAML,EAAMT,KAAKE,GAAGW,UAAUE,QAAQ,YAAa,GAAG3C,OAAe2C,QAAQ,MAAO,SACjGL,EAAMM,aAAa,UAAW,CAAEC,MAAO,CAAC,CAAEC,KAAM,WAAaC,UAAWA,IAAM,OAClF,CAEA,MAAMC,EAAS3B,EAAS4B,UAAUZ,EAAMT,KAAKsB,KAAMb,EAAMT,KAAKE,IAAIqB,QAClE,GAAIjD,EAAaA,EAAY8C,GAC7B,MAAMI,EAAUJ,EAAOK,OAAOhB,EAAMT,KAAM,IAAIS,EAAMZ,MAAOzB,GAE3D,GAAIqC,EAAMT,KAAKE,IAAIwB,UAAW,CAC1BC,IAAIzB,GAAG0B,QAAQ,CAAC,0BAA4BC,IACxCL,EAAQM,cAAc,IAAID,EAAS,CAC/BE,KAAM,uBAGlB,CAEAxD,EAAK8B,WAAWK,GAChBnC,EAAK8B,WAAWmB,EACpB,CAAE,MAAOQ,GACLL,IAAIzB,GAAG0B,QAAQ,CAAC,gBAAkBK,IAC9B,GAAIA,EAAKA,EAAID,MAAM,mCAAmCvB,EAAMZ,MAAQmC,EAAgBE,QAAS,eAErG,GAER,CAEA,OAAO3D,CACX,EACH,IAAA4D,EAAA,CAAAC,WAAA,MAAAD,EAAAlE,aAAA,OAAAkE,CAAA","ignoreList":[]}