@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.
- package/README.md +134 -123
- package/package.json +3 -2
- package/src/nz/co/siliconst/ui5/metaui/.library +7 -7
- package/src/nz/co/siliconst/ui5/metaui/controls/GeneratorHost-dbg.js +299 -163
- package/src/nz/co/siliconst/ui5/metaui/controls/GeneratorHost-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/GeneratorHost.d.ts +54 -6
- package/src/nz/co/siliconst/ui5/metaui/controls/GeneratorHost.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/GeneratorHost.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/GeneratorHost.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/GeneratorHost.ts +292 -162
- package/src/nz/co/siliconst/ui5/metaui/core/ConditionEngine-dbg.js +51 -43
- package/src/nz/co/siliconst/ui5/metaui/core/ConditionEngine-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/ConditionEngine.d.ts +5 -0
- package/src/nz/co/siliconst/ui5/metaui/core/ConditionEngine.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/ConditionEngine.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/ConditionEngine.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/ConditionEngine.ts +49 -40
- package/src/nz/co/siliconst/ui5/metaui/core/Engine-dbg.js +81 -58
- package/src/nz/co/siliconst/ui5/metaui/core/Engine-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/Engine.d.ts +5 -12
- package/src/nz/co/siliconst/ui5/metaui/core/Engine.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/Engine.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/Engine.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/Engine.ts +82 -56
- package/src/nz/co/siliconst/ui5/metaui/core/EventBus-dbg.js +65 -50
- package/src/nz/co/siliconst/ui5/metaui/core/EventBus-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/EventBus.d.ts +9 -0
- package/src/nz/co/siliconst/ui5/metaui/core/EventBus.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/EventBus.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/EventBus.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/EventBus.ts +60 -45
- package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry-dbg.js +72 -59
- package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry.d.ts +6 -4
- package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry.ts +71 -56
- package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer-dbg.js +145 -36
- package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.d.ts +13 -8
- package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.ts +157 -31
- package/src/nz/co/siliconst/ui5/metaui/core/StateManager-dbg.js +55 -55
- package/src/nz/co/siliconst/ui5/metaui/core/StateManager-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/StateManager.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/StateManager.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/StateManager.ts +56 -56
- package/src/nz/co/siliconst/ui5/metaui/interfaces/IEventBus-dbg.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/interfaces/IEventBus-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/interfaces/IEventBus.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/interfaces/IEventBus.ts +29 -29
- package/src/nz/co/siliconst/ui5/metaui/interfaces/ILayoutManager-dbg.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/interfaces/ILayoutManager-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/interfaces/ILayoutManager.d.ts +6 -12
- package/src/nz/co/siliconst/ui5/metaui/interfaces/ILayoutManager.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/interfaces/ILayoutManager.ts +21 -26
- package/src/nz/co/siliconst/ui5/metaui/interfaces/IPlugin-dbg.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/interfaces/IPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/interfaces/IPlugin.d.ts +3 -20
- package/src/nz/co/siliconst/ui5/metaui/interfaces/IPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/interfaces/IPlugin.ts +14 -33
- package/src/nz/co/siliconst/ui5/metaui/interfaces/ISchema-dbg.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/interfaces/ISchema-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/interfaces/ISchema.d.ts +33 -43
- package/src/nz/co/siliconst/ui5/metaui/interfaces/ISchema.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/interfaces/ISchema.ts +70 -70
- package/src/nz/co/siliconst/ui5/metaui/layouts/BaseLayout-dbg.js +23 -38
- package/src/nz/co/siliconst/ui5/metaui/layouts/BaseLayout-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/layouts/BaseLayout.d.ts +4 -17
- package/src/nz/co/siliconst/ui5/metaui/layouts/BaseLayout.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/layouts/BaseLayout.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/layouts/BaseLayout.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/layouts/BaseLayout.ts +22 -34
- package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout-dbg.js +98 -56
- package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout.d.ts +7 -7
- package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout.ts +97 -60
- package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout-dbg.js +102 -90
- package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout.d.ts +4 -8
- package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout.ts +119 -102
- package/src/nz/co/siliconst/ui5/metaui/library-dbg.js +43 -32
- package/src/nz/co/siliconst/ui5/metaui/library-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/library-preload.js +22 -17
- package/src/nz/co/siliconst/ui5/metaui/library-preload.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/library.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/library.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/library.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/library.ts +55 -43
- package/src/nz/co/siliconst/ui5/metaui/manifest.json +1 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/ArrayPlugin-dbg.js +68 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/ArrayPlugin-dbg.js.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/ArrayPlugin.d.ts +15 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/ArrayPlugin.d.ts.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/ArrayPlugin.js +2 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/ArrayPlugin.js.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/ArrayPlugin.ts +71 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/BasePlugin-dbg.js +54 -59
- package/src/nz/co/siliconst/ui5/metaui/plugins/BasePlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/BasePlugin.d.ts +8 -27
- package/src/nz/co/siliconst/ui5/metaui/plugins/BasePlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/BasePlugin.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/BasePlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/BasePlugin.ts +56 -58
- package/src/nz/co/siliconst/ui5/metaui/plugins/BooleanPlugin-dbg.js +41 -42
- package/src/nz/co/siliconst/ui5/metaui/plugins/BooleanPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/BooleanPlugin.d.ts +2 -2
- package/src/nz/co/siliconst/ui5/metaui/plugins/BooleanPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/BooleanPlugin.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/BooleanPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/BooleanPlugin.ts +41 -42
- package/src/nz/co/siliconst/ui5/metaui/plugins/DatePlugin-dbg.js +68 -60
- package/src/nz/co/siliconst/ui5/metaui/plugins/DatePlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/DatePlugin.d.ts +2 -2
- package/src/nz/co/siliconst/ui5/metaui/plugins/DatePlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/DatePlugin.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/DatePlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/DatePlugin.ts +69 -63
- package/src/nz/co/siliconst/ui5/metaui/plugins/DateTimePlugin-dbg.js +68 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/DateTimePlugin-dbg.js.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/DateTimePlugin.d.ts +18 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/DateTimePlugin.d.ts.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/DateTimePlugin.js +2 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/DateTimePlugin.js.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/DateTimePlugin.ts +68 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/DropdownPlugin-dbg.js +66 -66
- package/src/nz/co/siliconst/ui5/metaui/plugins/DropdownPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/DropdownPlugin.d.ts +2 -2
- package/src/nz/co/siliconst/ui5/metaui/plugins/DropdownPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/DropdownPlugin.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/DropdownPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/DropdownPlugin.ts +65 -65
- package/src/nz/co/siliconst/ui5/metaui/plugins/NumberPlugin-dbg.js +55 -53
- package/src/nz/co/siliconst/ui5/metaui/plugins/NumberPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/NumberPlugin.d.ts +3 -3
- package/src/nz/co/siliconst/ui5/metaui/plugins/NumberPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/NumberPlugin.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/NumberPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/NumberPlugin.ts +56 -55
- package/src/nz/co/siliconst/ui5/metaui/plugins/StringPlugin-dbg.js +56 -53
- package/src/nz/co/siliconst/ui5/metaui/plugins/StringPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/StringPlugin.d.ts +2 -2
- package/src/nz/co/siliconst/ui5/metaui/plugins/StringPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/StringPlugin.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/StringPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/StringPlugin.ts +58 -55
- package/src/nz/co/siliconst/ui5/metaui/plugins/SwitchPlugin-dbg.js +43 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/SwitchPlugin-dbg.js.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/SwitchPlugin.d.ts +18 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/SwitchPlugin.d.ts.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/SwitchPlugin.js +2 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/SwitchPlugin.js.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/SwitchPlugin.ts +42 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/TextAreaPlugin-dbg.js +58 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/TextAreaPlugin-dbg.js.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/TextAreaPlugin.d.ts +18 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/TextAreaPlugin.d.ts.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/TextAreaPlugin.js +2 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/TextAreaPlugin.js.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/TextAreaPlugin.ts +58 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/TimePlugin-dbg.js +74 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/TimePlugin-dbg.js.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/TimePlugin.d.ts +18 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/TimePlugin.d.ts.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/TimePlugin.js +2 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/TimePlugin.js.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/TimePlugin.ts +71 -0
- package/ui5.yaml +3 -3
- package/test-resources/App.js +0 -11
- package/test-resources/Main.controller.js +0 -73
- package/test-resources/Main.view.xml +0 -42
- package/test-resources/index.html +0 -21
- package/test-resources/mockData.json +0 -27
- package/test-resources/mockSchema.json +0 -98
|
@@ -1,60 +1,97 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @file FormLayout.ts
|
|
3
|
-
* @description Generates a fully responsive SAP Fiori Form layout (SimpleForm).
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import SimpleForm from "sap/ui/layout/form/SimpleForm";
|
|
7
|
-
import Label from "sap/m/Label";
|
|
8
|
-
import
|
|
9
|
-
import {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
*
|
|
17
|
-
* @param
|
|
18
|
-
* @
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
1
|
+
/**
|
|
2
|
+
* @file FormLayout.ts
|
|
3
|
+
* @description Generates a fully responsive SAP Fiori Form layout (SimpleForm).
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import SimpleForm from "sap/ui/layout/form/SimpleForm";
|
|
7
|
+
import Label from "sap/m/Label";
|
|
8
|
+
import Title from "sap/ui/core/Title";
|
|
9
|
+
import { IPropertyMetadata } from "../interfaces/ISchema";
|
|
10
|
+
import { PluginRegistry } from "../core/PluginRegistry";
|
|
11
|
+
import { IPlugin } from "../interfaces/IPlugin";
|
|
12
|
+
|
|
13
|
+
export class FormLayout {
|
|
14
|
+
/**
|
|
15
|
+
* Builds a SimpleForm with ResponsiveGridLayout, injecting the requested plugins.
|
|
16
|
+
* @param properties The dictionary of fields to render.
|
|
17
|
+
* @param modelName The dynamic model name.
|
|
18
|
+
* @param formTitle Optional title for the form block.
|
|
19
|
+
* @param trackPlugin Optional callback to track instantiated plugins.
|
|
20
|
+
*/
|
|
21
|
+
public static build(properties: Record<string, IPropertyMetadata>, modelName: string = "meta", formTitle?: string, trackPlugin?: (plugin: IPlugin) => void): SimpleForm {
|
|
22
|
+
const form = new SimpleForm({
|
|
23
|
+
editable: true,
|
|
24
|
+
title: formTitle,
|
|
25
|
+
layout: "ResponsiveGridLayout",
|
|
26
|
+
labelSpanXL: 4,
|
|
27
|
+
labelSpanL: 4,
|
|
28
|
+
labelSpanM: 4,
|
|
29
|
+
labelSpanS: 12,
|
|
30
|
+
adjustLabelSpan: false,
|
|
31
|
+
emptySpanXL: 0,
|
|
32
|
+
emptySpanL: 0,
|
|
33
|
+
emptySpanM: 0,
|
|
34
|
+
emptySpanS: 0,
|
|
35
|
+
columnsXL: 1,
|
|
36
|
+
columnsL: 1,
|
|
37
|
+
columnsM: 1,
|
|
38
|
+
singleContainerFullSize: false
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
const registry = PluginRegistry.getInstance();
|
|
42
|
+
|
|
43
|
+
// Group fields by their ui.group directive
|
|
44
|
+
const groups: Record<string, { key: string; meta: IPropertyMetadata }[]> = {};
|
|
45
|
+
const DEFAULT_GROUP = "__DEFAULT__";
|
|
46
|
+
|
|
47
|
+
for (const key of Object.keys(properties)) {
|
|
48
|
+
const meta = properties[key];
|
|
49
|
+
const groupName = meta.ui?.group || DEFAULT_GROUP;
|
|
50
|
+
if (!groups[groupName]) groups[groupName] = [];
|
|
51
|
+
groups[groupName].push({ key, meta });
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Render groups
|
|
55
|
+
for (const groupName of Object.keys(groups)) {
|
|
56
|
+
if (groupName !== DEFAULT_GROUP) {
|
|
57
|
+
form.addContent(new Title({ text: groupName }));
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
groups[groupName].forEach((field) => {
|
|
61
|
+
try {
|
|
62
|
+
const label = new Label({
|
|
63
|
+
text: field.meta.ui?.label || field.key,
|
|
64
|
+
required: field.meta.required
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
// Attach visibility condition to label and control container logic
|
|
68
|
+
if (field.meta.ui?.visibleOn) {
|
|
69
|
+
const expr = `{= ${field.meta.ui.visibleOn.replace(/\$root\./g, `${modelName}>/`).replace(/\./g, '/')} }`;
|
|
70
|
+
label.bindProperty("visible", { parts: [{ path: "meta>/" }], formatter: () => false}); // temporary, condition engine does this usually
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const plugin = registry.getPlugin(field.meta.type, field.meta.ui?.widget);
|
|
74
|
+
if (trackPlugin) trackPlugin(plugin);
|
|
75
|
+
const control = plugin.render(field.meta, `/${field.key}`, modelName);
|
|
76
|
+
|
|
77
|
+
if (field.meta.ui?.fullWidth) {
|
|
78
|
+
sap.ui.require(["sap/ui/layout/GridData"], (GridData: any) => {
|
|
79
|
+
control.setLayoutData(new GridData({
|
|
80
|
+
span: "XL12 L12 M12 S12"
|
|
81
|
+
}));
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
form.addContent(label);
|
|
86
|
+
form.addContent(control);
|
|
87
|
+
} catch (error) {
|
|
88
|
+
sap.ui.require(["sap/base/Log"], (Log: any) => {
|
|
89
|
+
if (Log) Log.error(`[MetaUI] Failed to render field ${field.key}`, (error as Error).message, "FormLayout");
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return form;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
@@ -1,91 +1,103 @@
|
|
|
1
|
-
sap.ui.define(["sap/m/Table", "sap/m/Column", "sap/m/Text", "sap/m/ColumnListItem", "sap/m/Toolbar", "sap/m/Title", "sap/m/ToolbarSpacer", "sap/m/Button", "../core/PluginRegistry"], function (Table, Column, Text, ColumnListItem, Toolbar, Title, ToolbarSpacer, Button, ___core_PluginRegistry) {
|
|
2
|
-
"use strict";
|
|
3
|
-
|
|
4
|
-
const PluginRegistry = ___core_PluginRegistry["PluginRegistry"];
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
const
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
const
|
|
41
|
-
const
|
|
42
|
-
const
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
1
|
+
sap.ui.define(["sap/m/Table", "sap/m/Column", "sap/m/Text", "sap/m/ColumnListItem", "sap/m/Toolbar", "sap/m/Title", "sap/m/ToolbarSpacer", "sap/m/Button", "../core/PluginRegistry"], function (Table, Column, Text, ColumnListItem, Toolbar, Title, ToolbarSpacer, Button, ___core_PluginRegistry) {
|
|
2
|
+
"use strict";
|
|
3
|
+
|
|
4
|
+
const PluginRegistry = ___core_PluginRegistry["PluginRegistry"];
|
|
5
|
+
class TableLayout {
|
|
6
|
+
/**
|
|
7
|
+
* Builds a responsive Table, dynamically calculating column priorities.
|
|
8
|
+
*/
|
|
9
|
+
static build(tableMeta, bindingPath = "meta>/", tableTitle = "Table", trackPlugin) {
|
|
10
|
+
if (!tableMeta.properties) {
|
|
11
|
+
throw new Error("[MetaUI] Table requires an items schema with properties.");
|
|
12
|
+
}
|
|
13
|
+
const parts = bindingPath.split(">");
|
|
14
|
+
const actualModelName = parts.length > 1 ? parts[0] : undefined;
|
|
15
|
+
const actualPath = parts.length > 1 ? parts[1] : bindingPath;
|
|
16
|
+
// e.g. "meta>/Contacts" -> actualModelName = "meta", actualPath = "/Contacts"
|
|
17
|
+
|
|
18
|
+
const table = new Table({
|
|
19
|
+
headerToolbar: new Toolbar({
|
|
20
|
+
content: [new Title({
|
|
21
|
+
text: tableTitle
|
|
22
|
+
}), new ToolbarSpacer(), new Button({
|
|
23
|
+
text: "Add Row",
|
|
24
|
+
icon: "sap-icon://add",
|
|
25
|
+
press: oEvent => {
|
|
26
|
+
const btn = oEvent.getSource();
|
|
27
|
+
const tbl = btn.getParent().getParent();
|
|
28
|
+
const model = tbl.getModel(actualModelName);
|
|
29
|
+
const info = tbl.getBindingInfo("items");
|
|
30
|
+
if (!info || !info.path) return;
|
|
31
|
+
const data = model.getProperty(info.path) || [];
|
|
32
|
+
data.push({}); // append empty row
|
|
33
|
+
model.setProperty(info.path, data);
|
|
34
|
+
}
|
|
35
|
+
})]
|
|
36
|
+
}),
|
|
37
|
+
fixedLayout: false,
|
|
38
|
+
mode: "Delete",
|
|
39
|
+
delete: oEvent => {
|
|
40
|
+
const item = oEvent.getParameter("listItem");
|
|
41
|
+
const path = item.getBindingContext(actualModelName).getPath();
|
|
42
|
+
const model = item.getModel(actualModelName);
|
|
43
|
+
const splitPaths = path.split("/");
|
|
44
|
+
const index = parseInt(splitPaths.pop() || "0", 10);
|
|
45
|
+
let arrayPath = splitPaths.join("/");
|
|
46
|
+
if (arrayPath === "") arrayPath = "/";
|
|
47
|
+
const data = model.getProperty(arrayPath);
|
|
48
|
+
data.splice(index, 1);
|
|
49
|
+
model.setProperty(arrayPath, data);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
const templateCells = [];
|
|
53
|
+
const registry = PluginRegistry.getInstance();
|
|
54
|
+
const props = tableMeta.properties;
|
|
55
|
+
Object.keys(props).forEach(key => {
|
|
56
|
+
try {
|
|
57
|
+
const fieldMeta = props[key];
|
|
58
|
+
const isKey = !!fieldMeta.ui?.isKey;
|
|
59
|
+
const column = new Column({
|
|
60
|
+
header: new Text({
|
|
61
|
+
text: fieldMeta.ui?.label || key
|
|
62
|
+
}),
|
|
63
|
+
demandPopin: !isKey,
|
|
64
|
+
minScreenWidth: isKey ? "" : "Tablet",
|
|
65
|
+
popinDisplay: "Inline"
|
|
66
|
+
});
|
|
67
|
+
table.addColumn(column);
|
|
68
|
+
const plugin = registry.getPlugin(fieldMeta.type, fieldMeta.ui?.widget);
|
|
69
|
+
if (trackPlugin) trackPlugin(plugin);
|
|
70
|
+
const control = plugin.render(fieldMeta, key, actualModelName); // No trailing slash for relative bindings
|
|
71
|
+
templateCells.push(control);
|
|
72
|
+
} catch (error) {
|
|
73
|
+
sap.ui.require(["sap/base/Log"], Log => {
|
|
74
|
+
if (Log) Log.error(`[MetaUI] Failed to render column ${key}`, error.message, "TableLayout");
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
// Add an empty text control as a fallback so the table columns match the cells array length
|
|
78
|
+
templateCells.push(new Text({
|
|
79
|
+
text: "Error"
|
|
80
|
+
}));
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
const rowTemplate = new ColumnListItem({
|
|
84
|
+
cells: templateCells
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
// V2 Fix: Actually bind the items to the table!
|
|
88
|
+
table.bindItems({
|
|
89
|
+
path: actualPath,
|
|
90
|
+
model: actualModelName,
|
|
91
|
+
template: rowTemplate,
|
|
92
|
+
templateShareable: false
|
|
93
|
+
});
|
|
94
|
+
return table;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
var __exports = {
|
|
98
|
+
__esModule: true
|
|
99
|
+
};
|
|
100
|
+
__exports.TableLayout = TableLayout;
|
|
101
|
+
return __exports;
|
|
102
|
+
});
|
|
91
103
|
//# sourceMappingURL=TableLayout-dbg.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TableLayout-dbg.js","names":["PluginRegistry","___core_PluginRegistry","TableLayout","build","tableMeta","table","Table","headerToolbar","Toolbar","content","Title","text","
|
|
1
|
+
{"version":3,"file":"TableLayout-dbg.js","names":["PluginRegistry","___core_PluginRegistry","TableLayout","build","tableMeta","bindingPath","tableTitle","trackPlugin","properties","Error","parts","split","actualModelName","length","undefined","actualPath","table","Table","headerToolbar","Toolbar","content","Title","text","ToolbarSpacer","Button","icon","press","oEvent","btn","getSource","tbl","getParent","model","getModel","info","getBindingInfo","path","data","getProperty","push","setProperty","fixedLayout","mode","delete","item","getParameter","getBindingContext","getPath","splitPaths","index","parseInt","pop","arrayPath","join","splice","templateCells","registry","getInstance","props","Object","keys","forEach","key","fieldMeta","isKey","ui","column","Column","header","Text","label","demandPopin","minScreenWidth","popinDisplay","addColumn","plugin","getPlugin","type","widget","control","render","error","sap","require","Log","message","rowTemplate","ColumnListItem","cells","bindItems","template","templateShareable","__exports","__esModule"],"sources":["TableLayout.ts"],"sourcesContent":["/**\n * @file TableLayout.ts\n * @description Generates a responsive SAP Fiori Table layout for v2 schema.\n */\n\nimport Table from \"sap/m/Table\";\nimport Column from \"sap/m/Column\";\nimport Text from \"sap/m/Text\";\nimport ColumnListItem from \"sap/m/ColumnListItem\";\nimport Toolbar from \"sap/m/Toolbar\";\nimport Title from \"sap/m/Title\";\nimport ToolbarSpacer from \"sap/m/ToolbarSpacer\";\nimport Button from \"sap/m/Button\";\nimport JSONModel from \"sap/ui/model/json/JSONModel\";\nimport { PluginRegistry } from \"../core/PluginRegistry\";\nimport Control from \"sap/ui/core/Control\";\nimport { IPlugin } from \"../interfaces/IPlugin\";\nimport { IPropertyMetadata } from \"../interfaces/ISchema\";\n\nexport class TableLayout {\n /**\n * Builds a responsive Table, dynamically calculating column priorities.\n */\n public static build(tableMeta: IPropertyMetadata, bindingPath: string = \"meta>/\", tableTitle: string = \"Table\", trackPlugin?: (plugin: IPlugin) => void): Table {\n if (!tableMeta.properties) {\n throw new Error(\"[MetaUI] Table requires an items schema with properties.\");\n }\n\n const parts = bindingPath.split(\">\");\n const actualModelName = parts.length > 1 ? parts[0] : undefined;\n const actualPath = parts.length > 1 ? parts[1] : bindingPath;\n // e.g. \"meta>/Contacts\" -> actualModelName = \"meta\", actualPath = \"/Contacts\"\n\n const table = new Table({\n headerToolbar: new Toolbar({\n content: [\n new Title({ text: tableTitle }),\n new ToolbarSpacer(),\n new Button({\n text: \"Add Row\",\n icon: \"sap-icon://add\",\n press: (oEvent: any) => {\n const btn = oEvent.getSource();\n const tbl = btn.getParent().getParent() as Table;\n const model = tbl.getModel(actualModelName) as JSONModel;\n const info = tbl.getBindingInfo(\"items\");\n if (!info || !info.path) return;\n \n const data = model.getProperty(info.path) || [];\n data.push({}); // append empty row\n model.setProperty(info.path, data);\n }\n })\n ]\n }),\n fixedLayout: false,\n mode: \"Delete\",\n delete: (oEvent: any) => {\n const item = oEvent.getParameter(\"listItem\");\n const path = item.getBindingContext(actualModelName).getPath(); \n const model = item.getModel(actualModelName) as JSONModel;\n \n const splitPaths = path.split(\"/\");\n const index = parseInt(splitPaths.pop() || \"0\", 10);\n let arrayPath = splitPaths.join(\"/\");\n if (arrayPath === \"\") arrayPath = \"/\";\n \n const data = model.getProperty(arrayPath);\n data.splice(index, 1);\n model.setProperty(arrayPath, data);\n }\n });\n\n const templateCells: Control[] = [];\n const registry = PluginRegistry.getInstance();\n const props = tableMeta.properties;\n\n Object.keys(props).forEach((key) => {\n try {\n const fieldMeta = props[key];\n const isKey = !!fieldMeta.ui?.isKey;\n \n const column = new Column({\n header: new Text({ text: fieldMeta.ui?.label || key }),\n demandPopin: !isKey, \n minScreenWidth: isKey ? \"\" : \"Tablet\",\n popinDisplay: \"Inline\"\n });\n table.addColumn(column);\n\n const plugin = registry.getPlugin(fieldMeta.type, fieldMeta.ui?.widget);\n if (trackPlugin) trackPlugin(plugin);\n const control = plugin.render(fieldMeta, key, actualModelName); // No trailing slash for relative bindings\n templateCells.push(control);\n } catch (error) {\n sap.ui.require([\"sap/base/Log\"], (Log: any) => {\n if (Log) Log.error(`[MetaUI] Failed to render column ${key}`, (error as Error).message, \"TableLayout\");\n });\n \n // Add an empty text control as a fallback so the table columns match the cells array length\n templateCells.push(new Text({ text: \"Error\" }));\n }\n });\n\n const rowTemplate = new ColumnListItem({\n cells: templateCells\n });\n\n // V2 Fix: Actually bind the items to the table!\n table.bindItems({\n path: actualPath,\n model: actualModelName,\n template: rowTemplate,\n templateShareable: false\n });\n\n return table;\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,20 +1,16 @@
|
|
|
1
1
|
declare module "nz/co/siliconst/ui5/metaui/layouts/TableLayout" {
|
|
2
2
|
/**
|
|
3
3
|
* @file TableLayout.ts
|
|
4
|
-
* @description Generates a responsive SAP Fiori Table layout.
|
|
4
|
+
* @description Generates a responsive SAP Fiori Table layout for v2 schema.
|
|
5
5
|
*/
|
|
6
6
|
import Table from "sap/m/Table";
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
* Utility class strictly for constructing sap.m.Table structures with dynamic pop-in vectors.
|
|
10
|
-
*/
|
|
7
|
+
import { IPlugin } from "nz/co/siliconst/ui5/metaui/interfaces/IPlugin";
|
|
8
|
+
import { IPropertyMetadata } from "nz/co/siliconst/ui5/metaui/interfaces/ISchema";
|
|
11
9
|
export class TableLayout {
|
|
12
10
|
/**
|
|
13
11
|
* Builds a responsive Table, dynamically calculating column priorities.
|
|
14
|
-
* @param tableMeta The metadata defining the table's columns and nested fields.
|
|
15
|
-
* @returns A fully constructed sap.m.Table ready to be bound to a list array.
|
|
16
12
|
*/
|
|
17
|
-
static build(tableMeta:
|
|
13
|
+
static build(tableMeta: IPropertyMetadata, bindingPath?: string, tableTitle?: string, trackPlugin?: (plugin: IPlugin) => void): Table;
|
|
18
14
|
}
|
|
19
15
|
}
|
|
20
16
|
//# sourceMappingURL=TableLayout.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TableLayout.d.ts","sourceRoot":"
|
|
1
|
+
{"version":3,"file":"TableLayout.d.ts","sourceRoot":"../../../../../../../..","sources":["src/nz/co/siliconst/ui5/metaui/layouts/TableLayout.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,gDAAgD,CAAC;IAChE;;;OAGG;IAEH,OAAO,KAAK,MAAM,aAAa,CAAC;IAWhC,OAAO,EAAE,OAAO,EAAE,MAAM,+CAA+C,CAAC;IACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;IAElF,MAAa,WAAW;QACpB;;WAEG;eACW,KAAK,CAAC,SAAS,EAAE,iBAAiB,EAAE,WAAW,GAAE,MAAiB,EAAE,UAAU,GAAE,MAAgB,EAAE,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,GAAG,KAAK;KA+FlK;CAEA"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
sap.ui.define(["sap/m/Table","sap/m/Column","sap/m/Text","sap/m/ColumnListItem","sap/m/Toolbar","sap/m/Title","sap/m/ToolbarSpacer","sap/m/Button","../core/PluginRegistry"],function(e,t,n,s,
|
|
1
|
+
sap.ui.define(["sap/m/Table","sap/m/Column","sap/m/Text","sap/m/ColumnListItem","sap/m/Toolbar","sap/m/Title","sap/m/ToolbarSpacer","sap/m/Button","../core/PluginRegistry"],function(e,t,n,s,o,a,r,i,c){"use strict";const l=c["PluginRegistry"];class p{static build(c,p="meta>/",u="Table",d){if(!c.properties){throw new Error("[MetaUI] Table requires an items schema with properties.")}const m=p.split(">");const g=m.length>1?m[0]:undefined;const h=m.length>1?m[1]:p;const b=new e({headerToolbar:new o({content:[new a({text:u}),new r,new i({text:"Add Row",icon:"sap-icon://add",press:e=>{const t=e.getSource();const n=t.getParent().getParent();const s=n.getModel(g);const o=n.getBindingInfo("items");if(!o||!o.path)return;const a=s.getProperty(o.path)||[];a.push({});s.setProperty(o.path,a)}})]}),fixedLayout:false,mode:"Delete",delete:e=>{const t=e.getParameter("listItem");const n=t.getBindingContext(g).getPath();const s=t.getModel(g);const o=n.split("/");const a=parseInt(o.pop()||"0",10);let r=o.join("/");if(r==="")r="/";const i=s.getProperty(r);i.splice(a,1);s.setProperty(r,i)}});const w=[];const y=l.getInstance();const f=c.properties;Object.keys(f).forEach(e=>{try{const s=f[e];const o=!!s.ui?.isKey;const a=new t({header:new n({text:s.ui?.label||e}),demandPopin:!o,minScreenWidth:o?"":"Tablet",popinDisplay:"Inline"});b.addColumn(a);const r=y.getPlugin(s.type,s.ui?.widget);if(d)d(r);const i=r.render(s,e,g);w.push(i)}catch(t){sap.ui.require(["sap/base/Log"],n=>{if(n)n.error(`[MetaUI] Failed to render column ${e}`,t.message,"TableLayout")});w.push(new n({text:"Error"}))}});const P=new s({cells:w});b.bindItems({path:h,model:g,template:P,templateShareable:false});return b}}var u={__esModule:true};u.TableLayout=p;return u});
|
|
2
2
|
//# sourceMappingURL=TableLayout.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TableLayout.js","names":["PluginRegistry","___core_PluginRegistry","TableLayout","build","tableMeta","table","Table","headerToolbar","Toolbar","content","Title","text","
|
|
1
|
+
{"version":3,"file":"TableLayout.js","names":["PluginRegistry","___core_PluginRegistry","TableLayout","build","tableMeta","bindingPath","tableTitle","trackPlugin","properties","Error","parts","split","actualModelName","length","undefined","actualPath","table","Table","headerToolbar","Toolbar","content","Title","text","ToolbarSpacer","Button","icon","press","oEvent","btn","getSource","tbl","getParent","model","getModel","info","getBindingInfo","path","data","getProperty","push","setProperty","fixedLayout","mode","delete","item","getParameter","getBindingContext","getPath","splitPaths","index","parseInt","pop","arrayPath","join","splice","templateCells","registry","getInstance","props","Object","keys","forEach","key","fieldMeta","isKey","ui","column","Column","header","Text","label","demandPopin","minScreenWidth","popinDisplay","addColumn","plugin","getPlugin","type","widget","control","render","error","sap","require","Log","message","rowTemplate","ColumnListItem","cells","bindItems","template","templateShareable","__exports","__esModule"],"sources":["TableLayout.ts"],"sourcesContent":["/**\n * @file TableLayout.ts\n * @description Generates a responsive SAP Fiori Table layout for v2 schema.\n */\n\nimport Table from \"sap/m/Table\";\nimport Column from \"sap/m/Column\";\nimport Text from \"sap/m/Text\";\nimport ColumnListItem from \"sap/m/ColumnListItem\";\nimport Toolbar from \"sap/m/Toolbar\";\nimport Title from \"sap/m/Title\";\nimport ToolbarSpacer from \"sap/m/ToolbarSpacer\";\nimport Button from \"sap/m/Button\";\nimport JSONModel from \"sap/ui/model/json/JSONModel\";\nimport { PluginRegistry } from \"../core/PluginRegistry\";\nimport Control from \"sap/ui/core/Control\";\nimport { IPlugin } from \"../interfaces/IPlugin\";\nimport { IPropertyMetadata } from \"../interfaces/ISchema\";\n\nexport class TableLayout {\n /**\n * Builds a responsive Table, dynamically calculating column priorities.\n */\n public static build(tableMeta: IPropertyMetadata, bindingPath: string = \"meta>/\", tableTitle: string = \"Table\", trackPlugin?: (plugin: IPlugin) => void): Table {\n if (!tableMeta.properties) {\n throw new Error(\"[MetaUI] Table requires an items schema with properties.\");\n }\n\n const parts = bindingPath.split(\">\");\n const actualModelName = parts.length > 1 ? parts[0] : undefined;\n const actualPath = parts.length > 1 ? parts[1] : bindingPath;\n // e.g. \"meta>/Contacts\" -> actualModelName = \"meta\", actualPath = \"/Contacts\"\n\n const table = new Table({\n headerToolbar: new Toolbar({\n content: [\n new Title({ text: tableTitle }),\n new ToolbarSpacer(),\n new Button({\n text: \"Add Row\",\n icon: \"sap-icon://add\",\n press: (oEvent: any) => {\n const btn = oEvent.getSource();\n const tbl = btn.getParent().getParent() as Table;\n const model = tbl.getModel(actualModelName) as JSONModel;\n const info = tbl.getBindingInfo(\"items\");\n if (!info || !info.path) return;\n \n const data = model.getProperty(info.path) || [];\n data.push({}); // append empty row\n model.setProperty(info.path, data);\n }\n })\n ]\n }),\n fixedLayout: false,\n mode: \"Delete\",\n delete: (oEvent: any) => {\n const item = oEvent.getParameter(\"listItem\");\n const path = item.getBindingContext(actualModelName).getPath(); \n const model = item.getModel(actualModelName) as JSONModel;\n \n const splitPaths = path.split(\"/\");\n const index = parseInt(splitPaths.pop() || \"0\", 10);\n let arrayPath = splitPaths.join(\"/\");\n if (arrayPath === \"\") arrayPath = \"/\";\n \n const data = model.getProperty(arrayPath);\n data.splice(index, 1);\n model.setProperty(arrayPath, data);\n }\n });\n\n const templateCells: Control[] = [];\n const registry = PluginRegistry.getInstance();\n const props = tableMeta.properties;\n\n Object.keys(props).forEach((key) => {\n try {\n const fieldMeta = props[key];\n const isKey = !!fieldMeta.ui?.isKey;\n \n const column = new Column({\n header: new Text({ text: fieldMeta.ui?.label || key }),\n demandPopin: !isKey, \n minScreenWidth: isKey ? \"\" : \"Tablet\",\n popinDisplay: \"Inline\"\n });\n table.addColumn(column);\n\n const plugin = registry.getPlugin(fieldMeta.type, fieldMeta.ui?.widget);\n if (trackPlugin) trackPlugin(plugin);\n const control = plugin.render(fieldMeta, key, actualModelName); // No trailing slash for relative bindings\n templateCells.push(control);\n } catch (error) {\n sap.ui.require([\"sap/base/Log\"], (Log: any) => {\n if (Log) Log.error(`[MetaUI] Failed to render column ${key}`, (error as Error).message, \"TableLayout\");\n });\n \n // Add an empty text control as a fallback so the table columns match the cells array length\n templateCells.push(new Text({ text: \"Error\" }));\n }\n });\n\n const rowTemplate = new ColumnListItem({\n cells: templateCells\n });\n\n // V2 Fix: Actually bind the items to the table!\n table.bindItems({\n path: actualPath,\n model: actualModelName,\n template: rowTemplate,\n templateShareable: false\n });\n\n return table;\n }\n}\n"],"mappings":"4NAcSA,EAAcC,EAAA,kBAKhB,MAAMC,EAIT,YAAcC,CAAMC,EAA8BC,EAAsB,SAAUC,EAAqB,QAASC,GAC5G,IAAKH,EAAUI,WAAY,CACvB,MAAM,IAAIC,MAAM,2DACpB,CAEA,MAAMC,EAAQL,EAAYM,MAAM,KAChC,MAAMC,EAAkBF,EAAMG,OAAS,EAAIH,EAAM,GAAKI,UACtD,MAAMC,EAAaL,EAAMG,OAAS,EAAIH,EAAM,GAAKL,EAGjD,MAAMW,EAAQ,IAAIC,EAAM,CACpBC,cAAe,IAAIC,EAAQ,CACvBC,QAAS,CACL,IAAIC,EAAM,CAAEC,KAAMhB,IAClB,IAAIiB,EACJ,IAAIC,EAAO,CACPF,KAAM,UACNG,KAAM,iBACNC,MAAQC,IACJ,MAAMC,EAAMD,EAAOE,YACnB,MAAMC,EAAMF,EAAIG,YAAYA,YAC5B,MAAMC,EAAQF,EAAIG,SAASrB,GAC3B,MAAMsB,EAAOJ,EAAIK,eAAe,SAChC,IAAKD,IAASA,EAAKE,KAAM,OAEzB,MAAMC,EAAOL,EAAMM,YAAYJ,EAAKE,OAAS,GAC7CC,EAAKE,KAAK,CAAC,GACXP,EAAMQ,YAAYN,EAAKE,KAAMC,SAK7CI,YAAa,MACbC,KAAM,SACNC,OAAShB,IACL,MAAMiB,EAAOjB,EAAOkB,aAAa,YACjC,MAAMT,EAAOQ,EAAKE,kBAAkBlC,GAAiBmC,UACrD,MAAMf,EAAQY,EAAKX,SAASrB,GAE5B,MAAMoC,EAAaZ,EAAKzB,MAAM,KAC9B,MAAMsC,EAAQC,SAASF,EAAWG,OAAS,IAAK,IAChD,IAAIC,EAAYJ,EAAWK,KAAK,KAChC,GAAID,IAAc,GAAIA,EAAY,IAElC,MAAMf,EAAOL,EAAMM,YAAYc,GAC/Bf,EAAKiB,OAAOL,EAAO,GACnBjB,EAAMQ,YAAYY,EAAWf,MAIrC,MAAMkB,EAA2B,GACjC,MAAMC,EAAWxD,EAAeyD,cAChC,MAAMC,EAAQtD,EAAUI,WAExBmD,OAAOC,KAAKF,GAAOG,QAASC,IACxB,IACI,MAAMC,EAAYL,EAAMI,GACxB,MAAME,IAAUD,EAAUE,IAAID,MAE9B,MAAME,EAAS,IAAIC,EAAO,CACtBC,OAAQ,IAAIC,EAAK,CAAE/C,KAAMyC,EAAUE,IAAIK,OAASR,IAChDS,aAAcP,EACdQ,eAAgBR,EAAQ,GAAK,SAC7BS,aAAc,WAElBzD,EAAM0D,UAAUR,GAEhB,MAAMS,EAASnB,EAASoB,UAAUb,EAAUc,KAAMd,EAAUE,IAAIa,QAChE,GAAIvE,EAAaA,EAAYoE,GAC7B,MAAMI,EAAUJ,EAAOK,OAAOjB,EAAWD,EAAKlD,GAC9C2C,EAAchB,KAAKwC,EACvB,CAAE,MAAOE,GACLC,IAAIjB,GAAGkB,QAAQ,CAAC,gBAAkBC,IAC9B,GAAIA,EAAKA,EAAIH,MAAM,oCAAoCnB,IAAQmB,EAAgBI,QAAS,iBAI5F9B,EAAchB,KAAK,IAAI8B,EAAK,CAAE/C,KAAM,UACxC,IAGJ,MAAMgE,EAAc,IAAIC,EAAe,CACnCC,MAAOjC,IAIXvC,EAAMyE,UAAU,CACZrD,KAAMrB,EACNiB,MAAOpB,EACP8E,SAAUJ,EACVK,kBAAmB,QAGvB,OAAO3E,CACX,EACH,IAAA4E,EAAA,CAAAC,WAAA,MAAAD,EAAA1F,cAAA,OAAA0F,CAAA","ignoreList":[]}
|