@siliconst/metaui 1.4.6 → 1.4.7
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/package.json +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/CameraControl-dbg.js +13 -0
- package/src/nz/co/siliconst/ui5/metaui/controls/CameraControl-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/CameraControl.d.ts +10 -0
- package/src/nz/co/siliconst/ui5/metaui/controls/CameraControl.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/CameraControl.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/CameraControl.ts +10 -0
- package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost-dbg.js +47 -4
- package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.d.ts +47 -4
- package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.ts +48 -4
- package/src/nz/co/siliconst/ui5/metaui/controls/GeolocationControl-dbg.js +32 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/GeolocationControl-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/GeolocationControl.d.ts +7 -0
- package/src/nz/co/siliconst/ui5/metaui/controls/GeolocationControl.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/GeolocationControl.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/GeolocationControl.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/GeolocationControl.ts +11 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/RichTextControl-dbg.js +20 -0
- package/src/nz/co/siliconst/ui5/metaui/controls/RichTextControl-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/RichTextControl.d.ts +12 -0
- package/src/nz/co/siliconst/ui5/metaui/controls/RichTextControl.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/RichTextControl.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/RichTextControl.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/RichTextControl.ts +21 -0
- package/src/nz/co/siliconst/ui5/metaui/controls/SignatureControl-dbg.js +9 -0
- package/src/nz/co/siliconst/ui5/metaui/controls/SignatureControl-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/SignatureControl.d.ts +7 -0
- package/src/nz/co/siliconst/ui5/metaui/controls/SignatureControl.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/SignatureControl.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/SignatureControl.ts +7 -0
- package/src/nz/co/siliconst/ui5/metaui/controls/VoiceInputControl-dbg.js +13 -0
- package/src/nz/co/siliconst/ui5/metaui/controls/VoiceInputControl-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/VoiceInputControl.d.ts +10 -0
- package/src/nz/co/siliconst/ui5/metaui/controls/VoiceInputControl.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/VoiceInputControl.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/VoiceInputControl.ts +10 -0
- package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost-dbg.js +41 -5
- package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.d.ts +16 -4
- package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.ts +44 -4
- package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate-dbg.js +5 -0
- package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate.d.ts +4 -0
- package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate.ts +4 -0
- package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DialogDelegate-dbg.js +4 -0
- package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DialogDelegate-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DialogDelegate.d.ts +4 -0
- package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DialogDelegate.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DialogDelegate.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DialogDelegate.ts +4 -0
- package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate-dbg.js +4 -0
- package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate.d.ts +4 -0
- package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate.ts +4 -0
- package/src/nz/co/siliconst/ui5/metaui/core/DefaultLayoutGenerator-dbg.js +45 -12
- package/src/nz/co/siliconst/ui5/metaui/core/DefaultLayoutGenerator-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/DefaultLayoutGenerator.d.ts +6 -0
- package/src/nz/co/siliconst/ui5/metaui/core/DefaultLayoutGenerator.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/DefaultLayoutGenerator.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/DefaultLayoutGenerator.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/DefaultLayoutGenerator.ts +25 -12
- package/src/nz/co/siliconst/ui5/metaui/core/Engine-dbg.js +25 -12
- 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 -5
- 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 +34 -27
- package/src/nz/co/siliconst/ui5/metaui/core/PipelineManager-dbg.js +17 -3
- package/src/nz/co/siliconst/ui5/metaui/core/PipelineManager-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/PipelineManager.d.ts +4 -0
- package/src/nz/co/siliconst/ui5/metaui/core/PipelineManager.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/PipelineManager.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/PipelineManager.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/PipelineManager.ts +13 -3
- package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry-dbg.js +158 -106
- 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 +25 -26
- 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 +176 -113
- package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer-dbg.js +26 -0
- 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 +22 -0
- package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.d.ts.map +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 +22 -0
- package/src/nz/co/siliconst/ui5/metaui/core/StateManager-dbg.js +6 -0
- 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 +5 -0
- 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 +5 -0
- package/src/nz/co/siliconst/ui5/metaui/layouts/CompactLayout-dbg.js +10 -0
- package/src/nz/co/siliconst/ui5/metaui/layouts/CompactLayout-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/layouts/CompactLayout.d.ts +9 -0
- package/src/nz/co/siliconst/ui5/metaui/layouts/CompactLayout.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/layouts/CompactLayout.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/layouts/CompactLayout.ts +9 -0
- package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout-dbg.js +10 -0
- 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 +9 -0
- package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout.d.ts.map +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 +9 -0
- package/src/nz/co/siliconst/ui5/metaui/layouts/WizardLayout-dbg.js +9 -0
- package/src/nz/co/siliconst/ui5/metaui/layouts/WizardLayout-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/layouts/WizardLayout.d.ts +8 -0
- package/src/nz/co/siliconst/ui5/metaui/layouts/WizardLayout.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/layouts/WizardLayout.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/layouts/WizardLayout.ts +8 -0
- package/src/nz/co/siliconst/ui5/metaui/library-dbg.js +2 -32
- package/src/nz/co/siliconst/ui5/metaui/library-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/library-preload.js +9 -10
- package/src/nz/co/siliconst/ui5/metaui/library-preload.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/library.d.ts +0 -6
- 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 +0 -33
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin-dbg.js +18 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin.d.ts +16 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin.ts +16 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin-dbg.js +19 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin.d.ts +17 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin.ts +17 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin-dbg.js +1 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin.ts +2 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin-dbg.js +19 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin.d.ts +17 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin.ts +17 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin-dbg.js +29 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin.d.ts +25 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin.ts +25 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin-dbg.js +19 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin.d.ts +17 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin.ts +17 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin-dbg.js +19 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin.d.ts +17 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin.ts +17 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin-dbg.js +2 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin.d.ts +2 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin.ts +2 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin-dbg.js +19 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin.d.ts +17 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin.ts +17 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin-dbg.js +19 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin.d.ts +17 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin.ts +17 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MessageStripPlugin-dbg.js +18 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MessageStripPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MessageStripPlugin.d.ts +16 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MessageStripPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MessageStripPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MessageStripPlugin.ts +16 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin-dbg.js +19 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin.d.ts +17 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin.ts +17 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin-dbg.js +19 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin.d.ts +17 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin.ts +17 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin-dbg.js +23 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin.d.ts +20 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin.ts +20 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin-dbg.js +19 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin.d.ts +17 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin.ts +17 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin-dbg.js +19 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin.d.ts +17 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin.ts +17 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin-dbg.js +19 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin.d.ts +17 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin.ts +17 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin-dbg.js +19 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin.d.ts +17 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin.ts +17 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin-dbg.js +2 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin.d.ts +2 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin.ts +2 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin-dbg.js +19 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin.d.ts +17 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin.ts +17 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin-dbg.js +19 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin.d.ts +17 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin.ts +17 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin-dbg.js +19 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin.d.ts +17 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin.ts +17 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin-dbg.js +19 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin.d.ts +17 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin.ts +17 -0
- package/src/nz/co/siliconst/ui5/metaui/core/LayoutRegistry-dbg.js +0 -32
- package/src/nz/co/siliconst/ui5/metaui/core/LayoutRegistry-dbg.js.map +0 -1
- package/src/nz/co/siliconst/ui5/metaui/core/LayoutRegistry.d.ts +0 -16
- package/src/nz/co/siliconst/ui5/metaui/core/LayoutRegistry.d.ts.map +0 -1
- package/src/nz/co/siliconst/ui5/metaui/core/LayoutRegistry.js +0 -2
- package/src/nz/co/siliconst/ui5/metaui/core/LayoutRegistry.js.map +0 -1
- package/src/nz/co/siliconst/ui5/metaui/core/LayoutRegistry.ts +0 -26
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SchemaNormalizer.js","names":["Logger","___utils_Logger","SchemaNormalizer","normalize","rawSchema","data","schemaObj","JSON","parse","e","msg","message","error","showErrorPopup","Array","isArray","this","inferSchemaFromData","normalized","title","type","items","layoutStrategy","uiLayout","additionalProperties","targetProperties","properties","inferred","deepMergeProperties","normalizeProperties","normalizePropertyMetadata","base","override","merged","key","Object","keys","overrideVal","baseVal","normalizedProps","prop","keyName","ui","label","generateLabel","isKey","readOnly","widget","valueHelp","enum","undefined","visibleOn","enabledOn","format","validators","formatter","args","rows","fullWidth","required","maxLength","minimum","maximum","pattern","precision","scale","name","spaced","replace","split","filter","w","length","map","word","charAt","toUpperCase","slice","toLowerCase","join","trim","schema","inferPropertiesFromObject","obj","val","nestedProps","resolveScope","scope","startsWith","meta","bindingPath","propKey","pathSegments","current","debug","stringify","i","segment","__exports","__esModule"],"sources":["SchemaNormalizer.ts"],"sourcesContent":["/**\n * @file SchemaNormalizer.ts\n * @description Transforms and validates incoming JSON payloads into the strict v2 ISchema dictionary matrix.\n */\n\nimport { ISchema, IPropertyMetadata, FieldType } from \"../interfaces/ISchema\";\nimport { Logger } from \"../utils/Logger\";\n\nexport class SchemaNormalizer {\n\n /**\n * Validates that the provided raw payload conforms to the required ISchema structures.\n */\n public static normalize(rawSchema?: any, data?: any): ISchema {\n let schemaObj = rawSchema;\n\n if (typeof schemaObj === \"string\") {\n try {\n schemaObj = JSON.parse(schemaObj);\n } catch (e) {\n const msg = (e as Error).message;\n Logger.error(\"[MetaUI SchemaNormalizer] Failed to parse schema string.\", msg);\n Logger.showErrorPopup(`Failed to parse the provided JSON schema.\\n\\nDetails: ${msg}`);\n schemaObj = null;\n }\n }\n\n if (!schemaObj || typeof schemaObj !== 'object' || Array.isArray(schemaObj)) {\n return this.inferSchemaFromData(data);\n }\n\n try {\n // It is an object. Ensure it conforms to v2 structure.\n const normalized: ISchema = {\n title: schemaObj.title,\n type: schemaObj.type || (schemaObj.items ? \"array\" : \"object\"),\n layoutStrategy: schemaObj.layoutStrategy,\n uiLayout: schemaObj.uiLayout,\n additionalProperties: schemaObj.additionalProperties\n };\n\n let targetProperties = schemaObj.properties || {};\n\n if (schemaObj.additionalProperties === true && data) {\n const inferred = this.inferSchemaFromData(data);\n if (inferred.type === \"object\" && inferred.properties) {\n targetProperties = this.deepMergeProperties(inferred.properties, targetProperties);\n } else if (inferred.type === \"array\" && inferred.items && inferred.items.properties) {\n // Array schema merging could be added here if we want full support.\n }\n }\n\n if (normalized.type === \"object\") {\n normalized.properties = this.normalizeProperties(targetProperties);\n } else if (normalized.type === \"array\") {\n // Future expansion: array deep merge\n normalized.items = this.normalizePropertyMetadata(schemaObj.items || { type: \"object\", properties: {} }, \"items\");\n }\n\n return normalized;\n } catch (error) {\n const msg = (error as Error).message;\n Logger.error(\"[MetaUI SchemaNormalizer] Critical error normalizing schema object.\", msg);\n Logger.showErrorPopup(`Schema Normalization failed.\\n\\nDetails: ${msg}`);\n // Fallback to empty object to prevent hard crash downstream\n return { type: \"object\", properties: {} };\n }\n }\n\n private static deepMergeProperties(base: any, override: any): any {\n const merged = { ...base };\n for (const key of Object.keys(override)) {\n const overrideVal = override[key];\n const baseVal = merged[key];\n\n if (baseVal && typeof baseVal === \"object\" && !Array.isArray(baseVal) &&\n overrideVal && typeof overrideVal === \"object\" && !Array.isArray(overrideVal)) {\n merged[key] = this.deepMergeProperties(baseVal, overrideVal);\n } else {\n merged[key] = overrideVal;\n }\n }\n return merged;\n }\n\n private static normalizeProperties(properties: any): Record<string, IPropertyMetadata> {\n const normalizedProps: Record<string, IPropertyMetadata> = {};\n for (const key of Object.keys(properties)) {\n normalizedProps[key] = this.normalizePropertyMetadata(properties[key], key);\n }\n return normalizedProps;\n }\n\n private static normalizePropertyMetadata(prop: any, keyName: string): IPropertyMetadata {\n const normalized: IPropertyMetadata = {\n type: prop.type || \"string\",\n ui: {\n label: prop.ui?.label || this.generateLabel(keyName),\n isKey: !!prop.ui?.isKey,\n readOnly: !!prop.ui?.readOnly,\n widget: prop.ui?.widget || (prop.valueHelp || prop.enum ? \"select\" : undefined),\n visibleOn: prop.ui?.visibleOn,\n enabledOn: prop.ui?.enabledOn,\n format: prop.ui?.format,\n validators: prop.ui?.validators,\n formatter: prop.ui?.formatter,\n args: prop.ui?.args,\n rows: prop.ui?.rows,\n fullWidth: prop.ui?.fullWidth\n },\n required: !!prop.required,\n maxLength: prop.maxLength,\n minimum: prop.minimum,\n maximum: prop.maximum,\n pattern: prop.pattern,\n precision: prop.precision,\n scale: prop.scale,\n valueHelp: prop.valueHelp,\n enum: prop.enum\n };\n\n if (normalized.type === \"object\" && prop.properties) {\n normalized.properties = this.normalizeProperties(prop.properties);\n normalized.uiLayout = prop.uiLayout;\n } else if (normalized.type === \"array\" && prop.items) {\n normalized.items = this.normalizePropertyMetadata(prop.items, \"items\");\n normalized.uiLayout = prop.uiLayout;\n }\n\n return normalized;\n }\n\n /**\n * Generates a Title Case label from camelCase or snake_case technical names.\n */\n private static generateLabel(name: string): string {\n if (!name) return \"\";\n let spaced = name.replace(/([A-Z])/g, \" $1\").replace(/_/g, \" \");\n return spaced.split(' ')\n .filter(w => w.length > 0)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(' ')\n .trim();\n }\n\n /**\n * Infers a v2 ISchema structure dynamically from a plain data payload.\n */\n private static inferSchemaFromData(data: any): ISchema {\n const schema: ISchema = { type: \"object\", properties: {}, layoutStrategy: \"compact\", title: \"\" };\n\n if (!data || typeof data !== \"object\") {\n return schema;\n }\n\n if (Array.isArray(data)) {\n schema.type = \"array\";\n schema.layoutStrategy = \"table\";\n schema.items = {\n type: \"object\",\n layoutStrategy: \"compact\",\n properties: data.length > 0 ? this.inferPropertiesFromObject(data[0]) : {}\n };\n } else {\n schema.type = \"object\";\n schema.properties = this.inferPropertiesFromObject(data);\n }\n\n return schema;\n }\n\n private static inferPropertiesFromObject(obj: any): Record<string, IPropertyMetadata> {\n const properties: Record<string, IPropertyMetadata> = {};\n if (!obj || typeof obj !== \"object\") return properties;\n\n for (const key of Object.keys(obj)) {\n const val = obj[key];\n if (val === null || val === undefined) continue;\n\n let type: FieldType = \"string\";\n let items: IPropertyMetadata | undefined;\n let nestedProps: Record<string, IPropertyMetadata> | undefined;\n\n if (typeof val === \"number\") type = \"number\";\n else if (typeof val === \"boolean\") type = \"boolean\";\n else if (Array.isArray(val)) {\n type = \"array\";\n items = {\n type: \"object\",\n properties: val.length > 0 ? this.inferPropertiesFromObject(val[0]) : {}\n };\n } else if (typeof val === \"object\") {\n type = \"object\";\n nestedProps = this.inferPropertiesFromObject(val);\n }\n\n properties[key] = {\n type,\n items,\n properties: nestedProps,\n ui: {\n label: this.generateLabel(key),\n isKey: false,\n readOnly: false\n }\n };\n }\n\n return properties;\n }\n\n /**\n * Resolves a JSON Schema scope (e.g. '#/properties/header/properties/id')\n * against the ISchema, returning the PropertyMetadata and the UI5 binding path.\n */\n public static resolveScope(schema: ISchema, scope: string): { meta: IPropertyMetadata | undefined, bindingPath: string, propKey: string } {\n if (!scope || !scope.startsWith(\"#/properties/\")) {\n return { meta: undefined, bindingPath: scope || \"\", propKey: scope || \"\" };\n }\n \n const pathSegments = scope.replace(\"#/properties/\", \"\").split(\"/properties/\");\n let current: any = schema.properties;\n let meta: IPropertyMetadata | undefined;\n \n Logger.debug(\"[MetaUI SchemaNormalizer]\", `Resolving scope '${scope}' with segments: ${JSON.stringify(pathSegments)}`, \"SchemaNormalizer\");\n Logger.debug(\"[MetaUI SchemaNormalizer]\", `Root schema keys: ${Object.keys(schema.properties || {})}`, \"SchemaNormalizer\");\n\n for (let i = 0; i < pathSegments.length; i++) {\n const segment = pathSegments[i];\n if (!current) {\n Logger.debug(\"[MetaUI SchemaNormalizer]\", `current is undefined at segment '${segment}'`, \"SchemaNormalizer\");\n meta = undefined;\n break;\n }\n meta = current[segment];\n Logger.debug(\"[MetaUI SchemaNormalizer]\", `Segment '${segment}' resolved to meta: ${!!meta}. Available keys in current: ${Object.keys(current)}`, \"SchemaNormalizer\");\n if (i < pathSegments.length - 1) {\n current = meta?.properties;\n }\n }\n \n const bindingPath = pathSegments.join(\"/\");\n const propKey = scope.replace(\"#/properties/\", \"\"); // The original raw string for logging\n \n return {\n meta,\n bindingPath,\n propKey\n };\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"SchemaNormalizer.js","names":["Logger","___utils_Logger","SchemaNormalizer","normalize","rawSchema","data","schemaObj","JSON","parse","e","msg","message","error","showErrorPopup","Array","isArray","this","inferSchemaFromData","normalized","title","type","items","layoutStrategy","uiLayout","additionalProperties","targetProperties","properties","inferred","deepMergeProperties","normalizeProperties","normalizePropertyMetadata","base","override","merged","key","Object","keys","overrideVal","baseVal","normalizedProps","prop","keyName","ui","label","generateLabel","isKey","readOnly","widget","valueHelp","enum","undefined","visibleOn","enabledOn","format","validators","formatter","args","rows","fullWidth","required","maxLength","minimum","maximum","pattern","precision","scale","name","spaced","replace","split","filter","w","length","map","word","charAt","toUpperCase","slice","toLowerCase","join","trim","schema","inferPropertiesFromObject","obj","val","nestedProps","resolveScope","scope","startsWith","meta","bindingPath","propKey","pathSegments","current","debug","stringify","i","segment","__exports","__esModule"],"sources":["SchemaNormalizer.ts"],"sourcesContent":["/**\n * @file SchemaNormalizer.ts\n * @description Transforms and validates incoming JSON payloads into the strict v2 ISchema dictionary matrix.\n */\n\nimport { ISchema, IPropertyMetadata, FieldType } from \"../interfaces/ISchema\";\nimport { Logger } from \"../utils/Logger\";\n\nexport class SchemaNormalizer {\n\n /**\n * Validates that the provided raw payload conforms to the required ISchema structures.\n */\n public static normalize(rawSchema?: any, data?: any): ISchema {\n let schemaObj = rawSchema;\n\n if (typeof schemaObj === \"string\") {\n try {\n schemaObj = JSON.parse(schemaObj);\n } catch (e) {\n const msg = (e as Error).message;\n Logger.error(\"[MetaUI SchemaNormalizer] Failed to parse schema string.\", msg);\n Logger.showErrorPopup(`Failed to parse the provided JSON schema.\\n\\nDetails: ${msg}`);\n schemaObj = null;\n }\n }\n\n if (!schemaObj || typeof schemaObj !== 'object' || Array.isArray(schemaObj)) {\n return this.inferSchemaFromData(data);\n }\n\n try {\n // It is an object. Ensure it conforms to v2 structure.\n const normalized: ISchema = {\n title: schemaObj.title,\n type: schemaObj.type || (schemaObj.items ? \"array\" : \"object\"),\n layoutStrategy: schemaObj.layoutStrategy,\n uiLayout: schemaObj.uiLayout,\n additionalProperties: schemaObj.additionalProperties\n };\n\n let targetProperties = schemaObj.properties || {};\n\n if (schemaObj.additionalProperties === true && data) {\n const inferred = this.inferSchemaFromData(data);\n if (inferred.type === \"object\" && inferred.properties) {\n targetProperties = this.deepMergeProperties(inferred.properties, targetProperties);\n } else if (inferred.type === \"array\" && inferred.items && inferred.items.properties) {\n // Array schema merging could be added here if we want full support.\n }\n }\n\n if (normalized.type === \"object\") {\n normalized.properties = this.normalizeProperties(targetProperties);\n } else if (normalized.type === \"array\") {\n // Future expansion: array deep merge\n normalized.items = this.normalizePropertyMetadata(schemaObj.items || { type: \"object\", properties: {} }, \"items\");\n }\n\n return normalized;\n } catch (error) {\n const msg = (error as Error).message;\n Logger.error(\"[MetaUI SchemaNormalizer] Critical error normalizing schema object.\", msg);\n Logger.showErrorPopup(`Schema Normalization failed.\\n\\nDetails: ${msg}`);\n // Fallback to empty object to prevent hard crash downstream\n return { type: \"object\", properties: {} };\n }\n }\n\n /**\n * Recursively deep merges an inferred schema over a base schema.\n * @param base The base property dictionary.\n * @param override The overriding inferred dictionary.\n * @returns A new deeply merged property dictionary.\n */\n private static deepMergeProperties(base: any, override: any): any {\n const merged = { ...base };\n for (const key of Object.keys(override)) {\n const overrideVal = override[key];\n const baseVal = merged[key];\n\n if (baseVal && typeof baseVal === \"object\" && !Array.isArray(baseVal) &&\n overrideVal && typeof overrideVal === \"object\" && !Array.isArray(overrideVal)) {\n merged[key] = this.deepMergeProperties(baseVal, overrideVal);\n } else {\n merged[key] = overrideVal;\n }\n }\n return merged;\n }\n\n /**\n * Normalizes a collection of properties.\n * @param properties The raw properties map.\n * @returns A map of strict IPropertyMetadata objects.\n */\n private static normalizeProperties(properties: any): Record<string, IPropertyMetadata> {\n const normalizedProps: Record<string, IPropertyMetadata> = {};\n for (const key of Object.keys(properties)) {\n normalizedProps[key] = this.normalizePropertyMetadata(properties[key], key);\n }\n return normalizedProps;\n }\n\n /**\n * Normalizes a single property against the ISchema specification.\n * @param prop The raw property definition.\n * @param keyName The string key name for generating default labels.\n * @returns A strict IPropertyMetadata instance.\n */\n private static normalizePropertyMetadata(prop: any, keyName: string): IPropertyMetadata {\n const normalized: IPropertyMetadata = {\n type: prop.type || \"string\",\n ui: {\n label: prop.ui?.label || this.generateLabel(keyName),\n isKey: !!prop.ui?.isKey,\n readOnly: !!prop.ui?.readOnly,\n widget: prop.ui?.widget || (prop.valueHelp || prop.enum ? \"select\" : undefined),\n visibleOn: prop.ui?.visibleOn,\n enabledOn: prop.ui?.enabledOn,\n format: prop.ui?.format,\n validators: prop.ui?.validators,\n formatter: prop.ui?.formatter,\n args: prop.ui?.args,\n rows: prop.ui?.rows,\n fullWidth: prop.ui?.fullWidth\n },\n required: !!prop.required,\n maxLength: prop.maxLength,\n minimum: prop.minimum,\n maximum: prop.maximum,\n pattern: prop.pattern,\n precision: prop.precision,\n scale: prop.scale,\n valueHelp: prop.valueHelp,\n enum: prop.enum\n };\n\n if (normalized.type === \"object\" && prop.properties) {\n normalized.properties = this.normalizeProperties(prop.properties);\n normalized.uiLayout = prop.uiLayout;\n } else if (normalized.type === \"array\" && prop.items) {\n normalized.items = this.normalizePropertyMetadata(prop.items, \"items\");\n normalized.uiLayout = prop.uiLayout;\n }\n\n return normalized;\n }\n\n /**\n * Generates a Title Case label from camelCase or snake_case technical names.\n */\n private static generateLabel(name: string): string {\n if (!name) return \"\";\n let spaced = name.replace(/([A-Z])/g, \" $1\").replace(/_/g, \" \");\n return spaced.split(' ')\n .filter(w => w.length > 0)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(' ')\n .trim();\n }\n\n /**\n * Infers a v2 ISchema structure dynamically from a plain data payload.\n */\n private static inferSchemaFromData(data: any): ISchema {\n const schema: ISchema = { type: \"object\", properties: {}, layoutStrategy: \"compact\", title: \"\" };\n\n if (!data || typeof data !== \"object\") {\n return schema;\n }\n\n if (Array.isArray(data)) {\n schema.type = \"array\";\n schema.layoutStrategy = \"table\";\n schema.items = {\n type: \"object\",\n layoutStrategy: \"compact\",\n properties: data.length > 0 ? this.inferPropertiesFromObject(data[0]) : {}\n };\n } else {\n schema.type = \"object\";\n schema.properties = this.inferPropertiesFromObject(data);\n }\n\n return schema;\n }\n\n /**\n * Infers field metadata recursively from a raw data object.\n * @param obj The raw JavaScript object.\n * @returns A dictionary of inferred IPropertyMetadata.\n */\n private static inferPropertiesFromObject(obj: any): Record<string, IPropertyMetadata> {\n const properties: Record<string, IPropertyMetadata> = {};\n if (!obj || typeof obj !== \"object\") return properties;\n\n for (const key of Object.keys(obj)) {\n const val = obj[key];\n if (val === null || val === undefined) continue;\n\n let type: FieldType = \"string\";\n let items: IPropertyMetadata | undefined;\n let nestedProps: Record<string, IPropertyMetadata> | undefined;\n\n if (typeof val === \"number\") type = \"number\";\n else if (typeof val === \"boolean\") type = \"boolean\";\n else if (Array.isArray(val)) {\n type = \"array\";\n items = {\n type: \"object\",\n properties: val.length > 0 ? this.inferPropertiesFromObject(val[0]) : {}\n };\n } else if (typeof val === \"object\") {\n type = \"object\";\n nestedProps = this.inferPropertiesFromObject(val);\n }\n\n properties[key] = {\n type,\n items,\n properties: nestedProps,\n ui: {\n label: this.generateLabel(key),\n isKey: false,\n readOnly: false\n }\n };\n }\n\n return properties;\n }\n\n /**\n * Resolves a JSON Schema scope (e.g. '#/properties/header/properties/id')\n * against the ISchema, returning the PropertyMetadata and the UI5 binding path.\n */\n public static resolveScope(schema: ISchema, scope: string): { meta: IPropertyMetadata | undefined, bindingPath: string, propKey: string } {\n if (!scope || !scope.startsWith(\"#/properties/\")) {\n return { meta: undefined, bindingPath: scope || \"\", propKey: scope || \"\" };\n }\n \n const pathSegments = scope.replace(\"#/properties/\", \"\").split(\"/properties/\");\n let current: any = schema.properties;\n let meta: IPropertyMetadata | undefined;\n \n Logger.debug(\"[MetaUI SchemaNormalizer]\", `Resolving scope '${scope}' with segments: ${JSON.stringify(pathSegments)}`, \"SchemaNormalizer\");\n Logger.debug(\"[MetaUI SchemaNormalizer]\", `Root schema keys: ${Object.keys(schema.properties || {})}`, \"SchemaNormalizer\");\n\n for (let i = 0; i < pathSegments.length; i++) {\n const segment = pathSegments[i];\n if (!current) {\n Logger.debug(\"[MetaUI SchemaNormalizer]\", `current is undefined at segment '${segment}'`, \"SchemaNormalizer\");\n meta = undefined;\n break;\n }\n meta = current[segment];\n Logger.debug(\"[MetaUI SchemaNormalizer]\", `Segment '${segment}' resolved to meta: ${!!meta}. Available keys in current: ${Object.keys(current)}`, \"SchemaNormalizer\");\n if (i < pathSegments.length - 1) {\n current = meta?.properties;\n }\n }\n \n const bindingPath = pathSegments.join(\"/\");\n const propKey = scope.replace(\"#/properties/\", \"\"); // The original raw string for logging\n \n return {\n meta,\n bindingPath,\n propKey\n };\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -67,6 +67,12 @@ export class SchemaNormalizer {
|
|
|
67
67
|
}
|
|
68
68
|
}
|
|
69
69
|
|
|
70
|
+
/**
|
|
71
|
+
* Recursively deep merges an inferred schema over a base schema.
|
|
72
|
+
* @param base The base property dictionary.
|
|
73
|
+
* @param override The overriding inferred dictionary.
|
|
74
|
+
* @returns A new deeply merged property dictionary.
|
|
75
|
+
*/
|
|
70
76
|
private static deepMergeProperties(base: any, override: any): any {
|
|
71
77
|
const merged = { ...base };
|
|
72
78
|
for (const key of Object.keys(override)) {
|
|
@@ -83,6 +89,11 @@ export class SchemaNormalizer {
|
|
|
83
89
|
return merged;
|
|
84
90
|
}
|
|
85
91
|
|
|
92
|
+
/**
|
|
93
|
+
* Normalizes a collection of properties.
|
|
94
|
+
* @param properties The raw properties map.
|
|
95
|
+
* @returns A map of strict IPropertyMetadata objects.
|
|
96
|
+
*/
|
|
86
97
|
private static normalizeProperties(properties: any): Record<string, IPropertyMetadata> {
|
|
87
98
|
const normalizedProps: Record<string, IPropertyMetadata> = {};
|
|
88
99
|
for (const key of Object.keys(properties)) {
|
|
@@ -91,6 +102,12 @@ export class SchemaNormalizer {
|
|
|
91
102
|
return normalizedProps;
|
|
92
103
|
}
|
|
93
104
|
|
|
105
|
+
/**
|
|
106
|
+
* Normalizes a single property against the ISchema specification.
|
|
107
|
+
* @param prop The raw property definition.
|
|
108
|
+
* @param keyName The string key name for generating default labels.
|
|
109
|
+
* @returns A strict IPropertyMetadata instance.
|
|
110
|
+
*/
|
|
94
111
|
private static normalizePropertyMetadata(prop: any, keyName: string): IPropertyMetadata {
|
|
95
112
|
const normalized: IPropertyMetadata = {
|
|
96
113
|
type: prop.type || "string",
|
|
@@ -169,6 +186,11 @@ export class SchemaNormalizer {
|
|
|
169
186
|
return schema;
|
|
170
187
|
}
|
|
171
188
|
|
|
189
|
+
/**
|
|
190
|
+
* Infers field metadata recursively from a raw data object.
|
|
191
|
+
* @param obj The raw JavaScript object.
|
|
192
|
+
* @returns A dictionary of inferred IPropertyMetadata.
|
|
193
|
+
*/
|
|
172
194
|
private static inferPropertiesFromObject(obj: any): Record<string, IPropertyMetadata> {
|
|
173
195
|
const properties: Record<string, IPropertyMetadata> = {};
|
|
174
196
|
if (!obj || typeof obj !== "object") return properties;
|
|
@@ -87,6 +87,12 @@ sap.ui.define(["sap/ui/model/json/JSONModel", "./PipelineManager", "sap/ui/core/
|
|
|
87
87
|
}
|
|
88
88
|
}
|
|
89
89
|
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Resolves the schema metadata for a given internal binding path.
|
|
93
|
+
* @param path The flat binding path representing the field.
|
|
94
|
+
* @returns The associated IPropertyMetadata, or undefined if not mapped.
|
|
95
|
+
*/
|
|
90
96
|
findMetadataForPath(path) {
|
|
91
97
|
if (!this.schema || !this.schema.properties) return undefined;
|
|
92
98
|
// Basic single-level support for now. Nested object resolution would split by '.' or '/'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StateManager-dbg.js","names":["GlobalPipeline","___PipelineManager","StateManager","constructor","initialData","schema","modelName","activeModelName","safeData","JSON","parse","stringify","model","JSONModel","setDefaultBindingMode","originalSetProperty","setProperty","bind","sPath","oValue","oContext","bAsyncUpdate","result","validatePath","value","fieldKey","replace","metadata","findMetadataForPath","messageManager","Messaging","targetPath","startsWith","existingMessages","getMessageModel","getData","messagesToRemove","filter","msg","isMatch","getTarget","getMessageProcessor","getId","length","removeMessages","validatorsToRun","argsMap","required","push","type","maxLength","max","ui","validators","v","name","args","undefined","validationResult","executeValidation","isValid","newMsg","Message","message","errorMessage","coreLibrary","MessageType","Error","target","processor","addMessages","path","properties","getModel","bindControl","control","property","bindingPath","bindProperty","extractPayload","data","destroy","__exports","__esModule"],"sources":["StateManager.ts"],"sourcesContent":["/**\n * @file StateManager.ts\n * @description Isolated internal state management. Decouples the MetaUI engine from external host models.\n */\n\nimport JSONModel from \"sap/ui/model/json/JSONModel\";\nimport ManagedObject from \"sap/ui/base/ManagedObject\";\nimport { ISchema, IPropertyMetadata } from \"../interfaces/ISchema\";\nimport { GlobalPipeline } from \"./PipelineManager\";\nimport Message from \"sap/ui/core/message/Message\";\nimport coreLibrary from \"sap/ui/core/library\";\nimport Core from \"sap/ui/core/Core\";\nimport Messaging from \"sap/ui/core/Messaging\";\n\n\n/**\n * Manages the isolated internal data payload for the MetaUI engine.\n */\nexport class StateManager {\n private model: JSONModel;\n private activeModelName: string;\n private schema: ISchema;\n\n /**\n * Initializes the state manager with an optional initial payload.\n * @param initialData The initial JSON payload to populate the fields.\n * @param schema The normalized schema for live validation.\n * @param modelName The UI5 model alias used for isolation.\n */\n constructor(initialData: Record<string, any> = {}, schema: ISchema, modelName: string = \"meta\") {\n this.activeModelName = modelName;\n this.schema = schema;\n \n // Deep copy to ensure no reference leakage from the host application\n const safeData = JSON.parse(JSON.stringify(initialData));\n this.model = new JSONModel(safeData);\n this.model.setDefaultBindingMode(\"TwoWay\");\n\n // Centralized Model-Level Validation Interceptor\n const originalSetProperty = this.model.setProperty.bind(this.model);\n this.model.setProperty = (sPath: string, oValue: any, oContext?: any, bAsyncUpdate?: boolean) => {\n const result = originalSetProperty(sPath, oValue, oContext, bAsyncUpdate);\n this.validatePath(sPath, oValue);\n return result;\n };\n }\n\n /**\n * Validates a specific path against the schema and updates the MessageManager.\n */\n private validatePath(sPath: string, value: any): void {\n const fieldKey = sPath.replace(/^\\//, \"\");\n const metadata = this.findMetadataForPath(fieldKey);\n \n const messageManager = Messaging;\n const targetPath = sPath.startsWith(\"/\") ? sPath : `/${sPath}`; // Pure UI5: target MUST be absolute path\n \n // 1. Remove existing messages (strictly for THIS model instance)\n const existingMessages = messageManager.getMessageModel().getData();\n const messagesToRemove = existingMessages.filter((msg: any) => {\n const isMatch = msg.getTarget() === targetPath && msg.getMessageProcessor() && msg.getMessageProcessor().getId() === this.model.getId();\n return isMatch;\n });\n \n \n if (messagesToRemove.length > 0) {\n messageManager.removeMessages(messagesToRemove);\n }\n\n if (!metadata) return;\n\n // 2. Run GlobalPipeline\n const validatorsToRun: string[] = [];\n const argsMap: Record<string, any> = {};\n\n if (metadata.required) {\n validatorsToRun.push(\"required\");\n }\n if (metadata.type === \"string\" && metadata.maxLength) {\n validatorsToRun.push(\"maxLength\");\n argsMap[\"maxLength\"] = { max: metadata.maxLength };\n }\n if (metadata.ui?.validators) {\n for (const v of metadata.ui.validators) {\n if (typeof v === \"string\") {\n validatorsToRun.push(v);\n } else if (v && v.name) {\n validatorsToRun.push(v.name);\n if (v.args !== undefined) {\n argsMap[v.name] = v.args;\n }\n }\n }\n }\n\n if (validatorsToRun.length > 0) {\n const validationResult = GlobalPipeline.executeValidation(value, validatorsToRun, argsMap);\n if (!validationResult.isValid) {\n const newMsg = new Message({\n message: validationResult.errorMessage || \"Invalid value.\",\n type: coreLibrary.MessageType.Error,\n target: targetPath,\n processor: this.model\n });\n messageManager.addMessages(newMsg);\n }\n }\n }\n\n private findMetadataForPath(path: string): IPropertyMetadata | undefined {\n if (!this.schema || !this.schema.properties) return undefined;\n // Basic single-level support for now. Nested object resolution would split by '.' or '/'\n return this.schema.properties[path];\n }\n\n\n\n /**\n * Retrieves the isolated JSONModel instance to attach to the root GeneratorHost control.\n * @returns The internal JSONModel.\n */\n public getModel(): JSONModel {\n return this.model;\n }\n\n /**\n * Binds a generated UI control property to a path in the internal model.\n * @param control The target UI5 Control.\n * @param property The UI5 property name (e.g., 'value').\n * @param bindingPath The exact path in the JSON payload.\n */\n public bindControl(control: ManagedObject, property: string, bindingPath: string): void {\n control.bindProperty(property, {\n path: bindingPath,\n model: \"meta\" // Assumes the model is bound to the root container with the name 'meta'\n });\n }\n\n /**\n * Extracts the flat JavaScript object representing the current state of the UI.\n * @returns A serialized record of the data payload, free of UI5 wrappers.\n */\n public extractPayload(): Record<string, any> {\n // Create a deep copy to prevent accidental mutations by the host\n const data = this.model.getData();\n return JSON.parse(JSON.stringify(data));\n }\n\n /**\n * Cleans up internal state and natively destroys the UI5 JSONModel to prevent memory leaks.\n */\n public destroy(): void {\n \n if (this.model) {\n this.model.destroy();\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"StateManager-dbg.js","names":["GlobalPipeline","___PipelineManager","StateManager","constructor","initialData","schema","modelName","activeModelName","safeData","JSON","parse","stringify","model","JSONModel","setDefaultBindingMode","originalSetProperty","setProperty","bind","sPath","oValue","oContext","bAsyncUpdate","result","validatePath","value","fieldKey","replace","metadata","findMetadataForPath","messageManager","Messaging","targetPath","startsWith","existingMessages","getMessageModel","getData","messagesToRemove","filter","msg","isMatch","getTarget","getMessageProcessor","getId","length","removeMessages","validatorsToRun","argsMap","required","push","type","maxLength","max","ui","validators","v","name","args","undefined","validationResult","executeValidation","isValid","newMsg","Message","message","errorMessage","coreLibrary","MessageType","Error","target","processor","addMessages","path","properties","getModel","bindControl","control","property","bindingPath","bindProperty","extractPayload","data","destroy","__exports","__esModule"],"sources":["StateManager.ts"],"sourcesContent":["/**\n * @file StateManager.ts\n * @description Isolated internal state management. Decouples the MetaUI engine from external host models.\n */\n\nimport JSONModel from \"sap/ui/model/json/JSONModel\";\nimport ManagedObject from \"sap/ui/base/ManagedObject\";\nimport { ISchema, IPropertyMetadata } from \"../interfaces/ISchema\";\nimport { GlobalPipeline } from \"./PipelineManager\";\nimport Message from \"sap/ui/core/message/Message\";\nimport coreLibrary from \"sap/ui/core/library\";\nimport Core from \"sap/ui/core/Core\";\nimport Messaging from \"sap/ui/core/Messaging\";\n\n\n/**\n * Manages the isolated internal data payload for the MetaUI engine.\n */\nexport class StateManager {\n private model: JSONModel;\n private activeModelName: string;\n private schema: ISchema;\n\n /**\n * Initializes the state manager with an optional initial payload.\n * @param initialData The initial JSON payload to populate the fields.\n * @param schema The normalized schema for live validation.\n * @param modelName The UI5 model alias used for isolation.\n */\n constructor(initialData: Record<string, any> = {}, schema: ISchema, modelName: string = \"meta\") {\n this.activeModelName = modelName;\n this.schema = schema;\n \n // Deep copy to ensure no reference leakage from the host application\n const safeData = JSON.parse(JSON.stringify(initialData));\n this.model = new JSONModel(safeData);\n this.model.setDefaultBindingMode(\"TwoWay\");\n\n // Centralized Model-Level Validation Interceptor\n const originalSetProperty = this.model.setProperty.bind(this.model);\n this.model.setProperty = (sPath: string, oValue: any, oContext?: any, bAsyncUpdate?: boolean) => {\n const result = originalSetProperty(sPath, oValue, oContext, bAsyncUpdate);\n this.validatePath(sPath, oValue);\n return result;\n };\n }\n\n /**\n * Validates a specific path against the schema and updates the MessageManager.\n */\n private validatePath(sPath: string, value: any): void {\n const fieldKey = sPath.replace(/^\\//, \"\");\n const metadata = this.findMetadataForPath(fieldKey);\n \n const messageManager = Messaging;\n const targetPath = sPath.startsWith(\"/\") ? sPath : `/${sPath}`; // Pure UI5: target MUST be absolute path\n \n // 1. Remove existing messages (strictly for THIS model instance)\n const existingMessages = messageManager.getMessageModel().getData();\n const messagesToRemove = existingMessages.filter((msg: any) => {\n const isMatch = msg.getTarget() === targetPath && msg.getMessageProcessor() && msg.getMessageProcessor().getId() === this.model.getId();\n return isMatch;\n });\n \n \n if (messagesToRemove.length > 0) {\n messageManager.removeMessages(messagesToRemove);\n }\n\n if (!metadata) return;\n\n // 2. Run GlobalPipeline\n const validatorsToRun: string[] = [];\n const argsMap: Record<string, any> = {};\n\n if (metadata.required) {\n validatorsToRun.push(\"required\");\n }\n if (metadata.type === \"string\" && metadata.maxLength) {\n validatorsToRun.push(\"maxLength\");\n argsMap[\"maxLength\"] = { max: metadata.maxLength };\n }\n if (metadata.ui?.validators) {\n for (const v of metadata.ui.validators) {\n if (typeof v === \"string\") {\n validatorsToRun.push(v);\n } else if (v && v.name) {\n validatorsToRun.push(v.name);\n if (v.args !== undefined) {\n argsMap[v.name] = v.args;\n }\n }\n }\n }\n\n if (validatorsToRun.length > 0) {\n const validationResult = GlobalPipeline.executeValidation(value, validatorsToRun, argsMap);\n if (!validationResult.isValid) {\n const newMsg = new Message({\n message: validationResult.errorMessage || \"Invalid value.\",\n type: coreLibrary.MessageType.Error,\n target: targetPath,\n processor: this.model\n });\n messageManager.addMessages(newMsg);\n }\n }\n }\n\n /**\n * Resolves the schema metadata for a given internal binding path.\n * @param path The flat binding path representing the field.\n * @returns The associated IPropertyMetadata, or undefined if not mapped.\n */\n private findMetadataForPath(path: string): IPropertyMetadata | undefined {\n if (!this.schema || !this.schema.properties) return undefined;\n // Basic single-level support for now. Nested object resolution would split by '.' or '/'\n return this.schema.properties[path];\n }\n\n\n\n /**\n * Retrieves the isolated JSONModel instance to attach to the root GeneratorHost control.\n * @returns The internal JSONModel.\n */\n public getModel(): JSONModel {\n return this.model;\n }\n\n /**\n * Binds a generated UI control property to a path in the internal model.\n * @param control The target UI5 Control.\n * @param property The UI5 property name (e.g., 'value').\n * @param bindingPath The exact path in the JSON payload.\n */\n public bindControl(control: ManagedObject, property: string, bindingPath: string): void {\n control.bindProperty(property, {\n path: bindingPath,\n model: \"meta\" // Assumes the model is bound to the root container with the name 'meta'\n });\n }\n\n /**\n * Extracts the flat JavaScript object representing the current state of the UI.\n * @returns A serialized record of the data payload, free of UI5 wrappers.\n */\n public extractPayload(): Record<string, any> {\n // Create a deep copy to prevent accidental mutations by the host\n const data = this.model.getData();\n return JSON.parse(JSON.stringify(data));\n }\n\n /**\n * Cleans up internal state and natively destroys the UI5 JSONModel to prevent memory leaks.\n */\n public destroy(): void {\n \n if (this.model) {\n this.model.destroy();\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -24,6 +24,11 @@ declare module "nz/co/siliconst/ui5/metaui/core/StateManager" {
|
|
|
24
24
|
* Validates a specific path against the schema and updates the MessageManager.
|
|
25
25
|
*/
|
|
26
26
|
private validatePath;
|
|
27
|
+
/**
|
|
28
|
+
* Resolves the schema metadata for a given internal binding path.
|
|
29
|
+
* @param path The flat binding path representing the field.
|
|
30
|
+
* @returns The associated IPropertyMetadata, or undefined if not mapped.
|
|
31
|
+
*/
|
|
27
32
|
private findMetadataForPath;
|
|
28
33
|
/**
|
|
29
34
|
* Retrieves the isolated JSONModel instance to attach to the root GeneratorHost control.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StateManager.d.ts","sourceRoot":"../../../../../../../..","sources":["src/nz/co/siliconst/ui5/metaui/core/StateManager.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,8CAA8C,CAAC;IAC9D;;;OAGG;IAEH,OAAO,SAAS,MAAM,6BAA6B,CAAC;IACpD,OAAO,aAAa,MAAM,2BAA2B,CAAC;IACtD,OAAO,EAAE,OAAO,EAAqB,MAAM,+CAA+C,CAAC;IAQ3F;;OAEG;IACH,MAAa,YAAY;QACrB,OAAO,CAAC,KAAK,CAAY;QACzB,OAAO,CAAC,eAAe,CAAS;QAChC,OAAO,CAAC,MAAM,CAAU;QAExB;;;;;WAKG;oBACS,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,GAAE,MAAe;QAkB9F;;WAEG;QACH,OAAO,CAAC,YAAY;QA2DpB,OAAO,CAAC,mBAAmB;QAQ3B;;;WAGG;QACI,QAAQ,IAAI,SAAS;QAI5B;;;;;WAKG;QACI,WAAW,CAAC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;QAOvF;;;WAGG;QACI,cAAc,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;QAM5C;;WAEG;QACI,OAAO,IAAI,IAAI;KAMzB;CAEA"}
|
|
1
|
+
{"version":3,"file":"StateManager.d.ts","sourceRoot":"../../../../../../../..","sources":["src/nz/co/siliconst/ui5/metaui/core/StateManager.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,8CAA8C,CAAC;IAC9D;;;OAGG;IAEH,OAAO,SAAS,MAAM,6BAA6B,CAAC;IACpD,OAAO,aAAa,MAAM,2BAA2B,CAAC;IACtD,OAAO,EAAE,OAAO,EAAqB,MAAM,+CAA+C,CAAC;IAQ3F;;OAEG;IACH,MAAa,YAAY;QACrB,OAAO,CAAC,KAAK,CAAY;QACzB,OAAO,CAAC,eAAe,CAAS;QAChC,OAAO,CAAC,MAAM,CAAU;QAExB;;;;;WAKG;oBACS,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,GAAE,MAAe;QAkB9F;;WAEG;QACH,OAAO,CAAC,YAAY;QA2DpB;;;;WAIG;QACH,OAAO,CAAC,mBAAmB;QAQ3B;;;WAGG;QACI,QAAQ,IAAI,SAAS;QAI5B;;;;;WAKG;QACI,WAAW,CAAC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;QAOvF;;;WAGG;QACI,cAAc,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;QAM5C;;WAEG;QACI,OAAO,IAAI,IAAI;KAMzB;CAEA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StateManager.js","names":["GlobalPipeline","___PipelineManager","StateManager","constructor","initialData","schema","modelName","this","activeModelName","safeData","JSON","parse","stringify","model","JSONModel","setDefaultBindingMode","originalSetProperty","setProperty","bind","sPath","oValue","oContext","bAsyncUpdate","result","validatePath","value","fieldKey","replace","metadata","findMetadataForPath","messageManager","Messaging","targetPath","startsWith","existingMessages","getMessageModel","getData","messagesToRemove","filter","msg","isMatch","getTarget","getMessageProcessor","getId","length","removeMessages","validatorsToRun","argsMap","required","push","type","maxLength","max","ui","validators","v","name","args","undefined","validationResult","executeValidation","isValid","newMsg","Message","message","errorMessage","coreLibrary","MessageType","Error","target","processor","addMessages","path","properties","getModel","bindControl","control","property","bindingPath","bindProperty","extractPayload","data","destroy","__exports","__esModule"],"sources":["StateManager.ts"],"sourcesContent":["/**\n * @file StateManager.ts\n * @description Isolated internal state management. Decouples the MetaUI engine from external host models.\n */\n\nimport JSONModel from \"sap/ui/model/json/JSONModel\";\nimport ManagedObject from \"sap/ui/base/ManagedObject\";\nimport { ISchema, IPropertyMetadata } from \"../interfaces/ISchema\";\nimport { GlobalPipeline } from \"./PipelineManager\";\nimport Message from \"sap/ui/core/message/Message\";\nimport coreLibrary from \"sap/ui/core/library\";\nimport Core from \"sap/ui/core/Core\";\nimport Messaging from \"sap/ui/core/Messaging\";\n\n\n/**\n * Manages the isolated internal data payload for the MetaUI engine.\n */\nexport class StateManager {\n private model: JSONModel;\n private activeModelName: string;\n private schema: ISchema;\n\n /**\n * Initializes the state manager with an optional initial payload.\n * @param initialData The initial JSON payload to populate the fields.\n * @param schema The normalized schema for live validation.\n * @param modelName The UI5 model alias used for isolation.\n */\n constructor(initialData: Record<string, any> = {}, schema: ISchema, modelName: string = \"meta\") {\n this.activeModelName = modelName;\n this.schema = schema;\n \n // Deep copy to ensure no reference leakage from the host application\n const safeData = JSON.parse(JSON.stringify(initialData));\n this.model = new JSONModel(safeData);\n this.model.setDefaultBindingMode(\"TwoWay\");\n\n // Centralized Model-Level Validation Interceptor\n const originalSetProperty = this.model.setProperty.bind(this.model);\n this.model.setProperty = (sPath: string, oValue: any, oContext?: any, bAsyncUpdate?: boolean) => {\n const result = originalSetProperty(sPath, oValue, oContext, bAsyncUpdate);\n this.validatePath(sPath, oValue);\n return result;\n };\n }\n\n /**\n * Validates a specific path against the schema and updates the MessageManager.\n */\n private validatePath(sPath: string, value: any): void {\n const fieldKey = sPath.replace(/^\\//, \"\");\n const metadata = this.findMetadataForPath(fieldKey);\n \n const messageManager = Messaging;\n const targetPath = sPath.startsWith(\"/\") ? sPath : `/${sPath}`; // Pure UI5: target MUST be absolute path\n \n // 1. Remove existing messages (strictly for THIS model instance)\n const existingMessages = messageManager.getMessageModel().getData();\n const messagesToRemove = existingMessages.filter((msg: any) => {\n const isMatch = msg.getTarget() === targetPath && msg.getMessageProcessor() && msg.getMessageProcessor().getId() === this.model.getId();\n return isMatch;\n });\n \n \n if (messagesToRemove.length > 0) {\n messageManager.removeMessages(messagesToRemove);\n }\n\n if (!metadata) return;\n\n // 2. Run GlobalPipeline\n const validatorsToRun: string[] = [];\n const argsMap: Record<string, any> = {};\n\n if (metadata.required) {\n validatorsToRun.push(\"required\");\n }\n if (metadata.type === \"string\" && metadata.maxLength) {\n validatorsToRun.push(\"maxLength\");\n argsMap[\"maxLength\"] = { max: metadata.maxLength };\n }\n if (metadata.ui?.validators) {\n for (const v of metadata.ui.validators) {\n if (typeof v === \"string\") {\n validatorsToRun.push(v);\n } else if (v && v.name) {\n validatorsToRun.push(v.name);\n if (v.args !== undefined) {\n argsMap[v.name] = v.args;\n }\n }\n }\n }\n\n if (validatorsToRun.length > 0) {\n const validationResult = GlobalPipeline.executeValidation(value, validatorsToRun, argsMap);\n if (!validationResult.isValid) {\n const newMsg = new Message({\n message: validationResult.errorMessage || \"Invalid value.\",\n type: coreLibrary.MessageType.Error,\n target: targetPath,\n processor: this.model\n });\n messageManager.addMessages(newMsg);\n }\n }\n }\n\n private findMetadataForPath(path: string): IPropertyMetadata | undefined {\n if (!this.schema || !this.schema.properties) return undefined;\n // Basic single-level support for now. Nested object resolution would split by '.' or '/'\n return this.schema.properties[path];\n }\n\n\n\n /**\n * Retrieves the isolated JSONModel instance to attach to the root GeneratorHost control.\n * @returns The internal JSONModel.\n */\n public getModel(): JSONModel {\n return this.model;\n }\n\n /**\n * Binds a generated UI control property to a path in the internal model.\n * @param control The target UI5 Control.\n * @param property The UI5 property name (e.g., 'value').\n * @param bindingPath The exact path in the JSON payload.\n */\n public bindControl(control: ManagedObject, property: string, bindingPath: string): void {\n control.bindProperty(property, {\n path: bindingPath,\n model: \"meta\" // Assumes the model is bound to the root container with the name 'meta'\n });\n }\n\n /**\n * Extracts the flat JavaScript object representing the current state of the UI.\n * @returns A serialized record of the data payload, free of UI5 wrappers.\n */\n public extractPayload(): Record<string, any> {\n // Create a deep copy to prevent accidental mutations by the host\n const data = this.model.getData();\n return JSON.parse(JSON.stringify(data));\n }\n\n /**\n * Cleans up internal state and natively destroys the UI5 JSONModel to prevent memory leaks.\n */\n public destroy(): void {\n \n if (this.model) {\n this.model.destroy();\n }\n }\n}\n"],"mappings":"qLAQSA,EAAcC,EAAA,kBAUhB,MAAMC,EAWTC,YAAYC,EAAmC,CAAC,EAAGC,EAAiBC,EAAoB,QACpFC,KAAKC,gBAAkBF,EACvBC,KAAKF,OAASA,EAGd,MAAMI,EAAWC,KAAKC,MAAMD,KAAKE,UAAUR,IAC3CG,KAAKM,MAAQ,IAAIC,EAAUL,GAC3BF,KAAKM,MAAME,sBAAsB,UAGjC,MAAMC,EAAsBT,KAAKM,MAAMI,YAAYC,KAAKX,KAAKM,OAC7DN,KAAKM,MAAMI,YAAc,CAACE,EAAeC,EAAaC,EAAgBC,KAClE,MAAMC,EAASP,EAAoBG,EAAOC,EAAQC,EAAUC,GAC5Df,KAAKiB,aAAaL,EAAOC,GACzB,OAAOG,EAEf,CAKQC,aAAaL,EAAeM,GAChC,MAAMC,EAAWP,EAAMQ,QAAQ,MAAO,IACtC,MAAMC,EAAWrB,KAAKsB,oBAAoBH,GAE1C,MAAMI,EAAiBC,EACvB,MAAMC,EAAab,EAAMc,WAAW,KAAOd,EAAQ,IAAIA,IAGvD,MAAMe,EAAmBJ,EAAeK,kBAAkBC,UAC1D,MAAMC,EAAmBH,EAAiBI,OAAQC,IAC9C,MAAMC,EAAUD,EAAIE,cAAgBT,GAAcO,EAAIG,uBAAyBH,EAAIG,sBAAsBC,UAAYpC,KAAKM,MAAM8B,QAChI,OAAOH,IAIX,GAAIH,EAAiBO,OAAS,EAAG,CAC7Bd,EAAee,eAAeR,EAClC,CAEA,IAAKT,EAAU,OAGf,MAAMkB,EAA4B,GAClC,MAAMC,EAA+B,CAAC,EAEtC,GAAInB,EAASoB,SAAU,CACnBF,EAAgBG,KAAK,WACzB,CACA,GAAIrB,EAASsB,OAAS,UAAYtB,EAASuB,UAAW,CAClDL,EAAgBG,KAAK,aACrBF,EAAQ,aAAe,CAAEK,IAAKxB,EAASuB,UAC3C,CACA,GAAIvB,EAASyB,IAAIC,WAAY,CACzB,IAAK,MAAMC,KAAK3B,EAASyB,GAAGC,WAAY,CACpC,UAAWC,IAAM,SAAU,CACvBT,EAAgBG,KAAKM,EACzB,MAAO,GAAIA,GAAKA,EAAEC,KAAM,CACpBV,EAAgBG,KAAKM,EAAEC,MACvB,GAAID,EAAEE,OAASC,UAAW,CACtBX,EAAQQ,EAAEC,MAAQD,EAAEE,IACxB,CACJ,CACJ,CACJ,CAEA,GAAIX,EAAgBF,OAAS,EAAG,CAC5B,MAAMe,EAAmB3D,EAAe4D,kBAAkBnC,EAAOqB,EAAiBC,GAClF,IAAKY,EAAiBE,QAAS,CAC3B,MAAMC,EAAS,IAAIC,EAAQ,CACvBC,QAASL,EAAiBM,cAAgB,iBAC1Cf,KAAMgB,EAAYC,YAAYC,MAC9BC,OAAQrC,EACRsC,UAAW/D,KAAKM,QAEpBiB,EAAeyC,YAAYT,EAC/B,CACJ,CACJ,
|
|
1
|
+
{"version":3,"file":"StateManager.js","names":["GlobalPipeline","___PipelineManager","StateManager","constructor","initialData","schema","modelName","this","activeModelName","safeData","JSON","parse","stringify","model","JSONModel","setDefaultBindingMode","originalSetProperty","setProperty","bind","sPath","oValue","oContext","bAsyncUpdate","result","validatePath","value","fieldKey","replace","metadata","findMetadataForPath","messageManager","Messaging","targetPath","startsWith","existingMessages","getMessageModel","getData","messagesToRemove","filter","msg","isMatch","getTarget","getMessageProcessor","getId","length","removeMessages","validatorsToRun","argsMap","required","push","type","maxLength","max","ui","validators","v","name","args","undefined","validationResult","executeValidation","isValid","newMsg","Message","message","errorMessage","coreLibrary","MessageType","Error","target","processor","addMessages","path","properties","getModel","bindControl","control","property","bindingPath","bindProperty","extractPayload","data","destroy","__exports","__esModule"],"sources":["StateManager.ts"],"sourcesContent":["/**\n * @file StateManager.ts\n * @description Isolated internal state management. Decouples the MetaUI engine from external host models.\n */\n\nimport JSONModel from \"sap/ui/model/json/JSONModel\";\nimport ManagedObject from \"sap/ui/base/ManagedObject\";\nimport { ISchema, IPropertyMetadata } from \"../interfaces/ISchema\";\nimport { GlobalPipeline } from \"./PipelineManager\";\nimport Message from \"sap/ui/core/message/Message\";\nimport coreLibrary from \"sap/ui/core/library\";\nimport Core from \"sap/ui/core/Core\";\nimport Messaging from \"sap/ui/core/Messaging\";\n\n\n/**\n * Manages the isolated internal data payload for the MetaUI engine.\n */\nexport class StateManager {\n private model: JSONModel;\n private activeModelName: string;\n private schema: ISchema;\n\n /**\n * Initializes the state manager with an optional initial payload.\n * @param initialData The initial JSON payload to populate the fields.\n * @param schema The normalized schema for live validation.\n * @param modelName The UI5 model alias used for isolation.\n */\n constructor(initialData: Record<string, any> = {}, schema: ISchema, modelName: string = \"meta\") {\n this.activeModelName = modelName;\n this.schema = schema;\n \n // Deep copy to ensure no reference leakage from the host application\n const safeData = JSON.parse(JSON.stringify(initialData));\n this.model = new JSONModel(safeData);\n this.model.setDefaultBindingMode(\"TwoWay\");\n\n // Centralized Model-Level Validation Interceptor\n const originalSetProperty = this.model.setProperty.bind(this.model);\n this.model.setProperty = (sPath: string, oValue: any, oContext?: any, bAsyncUpdate?: boolean) => {\n const result = originalSetProperty(sPath, oValue, oContext, bAsyncUpdate);\n this.validatePath(sPath, oValue);\n return result;\n };\n }\n\n /**\n * Validates a specific path against the schema and updates the MessageManager.\n */\n private validatePath(sPath: string, value: any): void {\n const fieldKey = sPath.replace(/^\\//, \"\");\n const metadata = this.findMetadataForPath(fieldKey);\n \n const messageManager = Messaging;\n const targetPath = sPath.startsWith(\"/\") ? sPath : `/${sPath}`; // Pure UI5: target MUST be absolute path\n \n // 1. Remove existing messages (strictly for THIS model instance)\n const existingMessages = messageManager.getMessageModel().getData();\n const messagesToRemove = existingMessages.filter((msg: any) => {\n const isMatch = msg.getTarget() === targetPath && msg.getMessageProcessor() && msg.getMessageProcessor().getId() === this.model.getId();\n return isMatch;\n });\n \n \n if (messagesToRemove.length > 0) {\n messageManager.removeMessages(messagesToRemove);\n }\n\n if (!metadata) return;\n\n // 2. Run GlobalPipeline\n const validatorsToRun: string[] = [];\n const argsMap: Record<string, any> = {};\n\n if (metadata.required) {\n validatorsToRun.push(\"required\");\n }\n if (metadata.type === \"string\" && metadata.maxLength) {\n validatorsToRun.push(\"maxLength\");\n argsMap[\"maxLength\"] = { max: metadata.maxLength };\n }\n if (metadata.ui?.validators) {\n for (const v of metadata.ui.validators) {\n if (typeof v === \"string\") {\n validatorsToRun.push(v);\n } else if (v && v.name) {\n validatorsToRun.push(v.name);\n if (v.args !== undefined) {\n argsMap[v.name] = v.args;\n }\n }\n }\n }\n\n if (validatorsToRun.length > 0) {\n const validationResult = GlobalPipeline.executeValidation(value, validatorsToRun, argsMap);\n if (!validationResult.isValid) {\n const newMsg = new Message({\n message: validationResult.errorMessage || \"Invalid value.\",\n type: coreLibrary.MessageType.Error,\n target: targetPath,\n processor: this.model\n });\n messageManager.addMessages(newMsg);\n }\n }\n }\n\n /**\n * Resolves the schema metadata for a given internal binding path.\n * @param path The flat binding path representing the field.\n * @returns The associated IPropertyMetadata, or undefined if not mapped.\n */\n private findMetadataForPath(path: string): IPropertyMetadata | undefined {\n if (!this.schema || !this.schema.properties) return undefined;\n // Basic single-level support for now. Nested object resolution would split by '.' or '/'\n return this.schema.properties[path];\n }\n\n\n\n /**\n * Retrieves the isolated JSONModel instance to attach to the root GeneratorHost control.\n * @returns The internal JSONModel.\n */\n public getModel(): JSONModel {\n return this.model;\n }\n\n /**\n * Binds a generated UI control property to a path in the internal model.\n * @param control The target UI5 Control.\n * @param property The UI5 property name (e.g., 'value').\n * @param bindingPath The exact path in the JSON payload.\n */\n public bindControl(control: ManagedObject, property: string, bindingPath: string): void {\n control.bindProperty(property, {\n path: bindingPath,\n model: \"meta\" // Assumes the model is bound to the root container with the name 'meta'\n });\n }\n\n /**\n * Extracts the flat JavaScript object representing the current state of the UI.\n * @returns A serialized record of the data payload, free of UI5 wrappers.\n */\n public extractPayload(): Record<string, any> {\n // Create a deep copy to prevent accidental mutations by the host\n const data = this.model.getData();\n return JSON.parse(JSON.stringify(data));\n }\n\n /**\n * Cleans up internal state and natively destroys the UI5 JSONModel to prevent memory leaks.\n */\n public destroy(): void {\n \n if (this.model) {\n this.model.destroy();\n }\n }\n}\n"],"mappings":"qLAQSA,EAAcC,EAAA,kBAUhB,MAAMC,EAWTC,YAAYC,EAAmC,CAAC,EAAGC,EAAiBC,EAAoB,QACpFC,KAAKC,gBAAkBF,EACvBC,KAAKF,OAASA,EAGd,MAAMI,EAAWC,KAAKC,MAAMD,KAAKE,UAAUR,IAC3CG,KAAKM,MAAQ,IAAIC,EAAUL,GAC3BF,KAAKM,MAAME,sBAAsB,UAGjC,MAAMC,EAAsBT,KAAKM,MAAMI,YAAYC,KAAKX,KAAKM,OAC7DN,KAAKM,MAAMI,YAAc,CAACE,EAAeC,EAAaC,EAAgBC,KAClE,MAAMC,EAASP,EAAoBG,EAAOC,EAAQC,EAAUC,GAC5Df,KAAKiB,aAAaL,EAAOC,GACzB,OAAOG,EAEf,CAKQC,aAAaL,EAAeM,GAChC,MAAMC,EAAWP,EAAMQ,QAAQ,MAAO,IACtC,MAAMC,EAAWrB,KAAKsB,oBAAoBH,GAE1C,MAAMI,EAAiBC,EACvB,MAAMC,EAAab,EAAMc,WAAW,KAAOd,EAAQ,IAAIA,IAGvD,MAAMe,EAAmBJ,EAAeK,kBAAkBC,UAC1D,MAAMC,EAAmBH,EAAiBI,OAAQC,IAC9C,MAAMC,EAAUD,EAAIE,cAAgBT,GAAcO,EAAIG,uBAAyBH,EAAIG,sBAAsBC,UAAYpC,KAAKM,MAAM8B,QAChI,OAAOH,IAIX,GAAIH,EAAiBO,OAAS,EAAG,CAC7Bd,EAAee,eAAeR,EAClC,CAEA,IAAKT,EAAU,OAGf,MAAMkB,EAA4B,GAClC,MAAMC,EAA+B,CAAC,EAEtC,GAAInB,EAASoB,SAAU,CACnBF,EAAgBG,KAAK,WACzB,CACA,GAAIrB,EAASsB,OAAS,UAAYtB,EAASuB,UAAW,CAClDL,EAAgBG,KAAK,aACrBF,EAAQ,aAAe,CAAEK,IAAKxB,EAASuB,UAC3C,CACA,GAAIvB,EAASyB,IAAIC,WAAY,CACzB,IAAK,MAAMC,KAAK3B,EAASyB,GAAGC,WAAY,CACpC,UAAWC,IAAM,SAAU,CACvBT,EAAgBG,KAAKM,EACzB,MAAO,GAAIA,GAAKA,EAAEC,KAAM,CACpBV,EAAgBG,KAAKM,EAAEC,MACvB,GAAID,EAAEE,OAASC,UAAW,CACtBX,EAAQQ,EAAEC,MAAQD,EAAEE,IACxB,CACJ,CACJ,CACJ,CAEA,GAAIX,EAAgBF,OAAS,EAAG,CAC5B,MAAMe,EAAmB3D,EAAe4D,kBAAkBnC,EAAOqB,EAAiBC,GAClF,IAAKY,EAAiBE,QAAS,CAC3B,MAAMC,EAAS,IAAIC,EAAQ,CACvBC,QAASL,EAAiBM,cAAgB,iBAC1Cf,KAAMgB,EAAYC,YAAYC,MAC9BC,OAAQrC,EACRsC,UAAW/D,KAAKM,QAEpBiB,EAAeyC,YAAYT,EAC/B,CACJ,CACJ,CAOQjC,oBAAoB2C,GACxB,IAAKjE,KAAKF,SAAWE,KAAKF,OAAOoE,WAAY,OAAOf,UAEpD,OAAOnD,KAAKF,OAAOoE,WAAWD,EAClC,CAQOE,WACH,OAAOnE,KAAKM,KAChB,CAQO8D,YAAYC,EAAwBC,EAAkBC,GACzDF,EAAQG,aAAaF,EAAU,CAC3BL,KAAMM,EACNjE,MAAO,QAEf,CAMOmE,iBAEH,MAAMC,EAAO1E,KAAKM,MAAMuB,UACxB,OAAO1B,KAAKC,MAAMD,KAAKE,UAAUqE,GACrC,CAKOC,UAEH,GAAI3E,KAAKM,MAAO,CACZN,KAAKM,MAAMqE,SACf,CACJ,EACH,IAAAC,EAAA,CAAAC,WAAA,MAAAD,EAAAjF,eAAA,OAAAiF,CAAA","ignoreList":[]}
|
|
@@ -107,6 +107,11 @@ export class StateManager {
|
|
|
107
107
|
}
|
|
108
108
|
}
|
|
109
109
|
|
|
110
|
+
/**
|
|
111
|
+
* Resolves the schema metadata for a given internal binding path.
|
|
112
|
+
* @param path The flat binding path representing the field.
|
|
113
|
+
* @returns The associated IPropertyMetadata, or undefined if not mapped.
|
|
114
|
+
*/
|
|
110
115
|
private findMetadataForPath(path: string): IPropertyMetadata | undefined {
|
|
111
116
|
if (!this.schema || !this.schema.properties) return undefined;
|
|
112
117
|
// Basic single-level support for now. Nested object resolution would split by '.' or '/'
|
|
@@ -106,6 +106,16 @@ sap.ui.define(["sap/m/VBox", "sap/m/Label", "../core/SchemaNormalizer", "../util
|
|
|
106
106
|
});
|
|
107
107
|
return container;
|
|
108
108
|
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Synthesizes a primitive field into the layout.
|
|
112
|
+
* @param container The VBox container.
|
|
113
|
+
* @param element The layout element definition.
|
|
114
|
+
* @param propKey The bound property key.
|
|
115
|
+
* @param meta The inferred metadata schema.
|
|
116
|
+
* @param modelName The UI5 data model name.
|
|
117
|
+
* @param engine The core Engine instance.
|
|
118
|
+
*/
|
|
109
119
|
_renderScalarField(container, element, propKey, meta, modelName, engine) {
|
|
110
120
|
try {
|
|
111
121
|
const labelText = element.label || meta.ui?.label || propKey;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CompactLayout-dbg.js","names":["SchemaNormalizer","___core_SchemaNormalizer","Logger","___utils_Logger","CompactLayout","render","schema","modelName","engine","onSubmit","container","VBox","renderType","addStyleClass","uiLayout","Array","isArray","warn","tableElements","renderElement","element","type","label","title","sap","m","Title","text","level","addItem","elements","forEach","scope","startsWith","error","meta","bindingPath","propKey","resolveScope","isCollectionOfRecords","items","properties","hasExplicitWidget","ui","widget","isSubLayout","debug","push","_renderScalarField","field","subSchema","control","generateLayout","msg","message","showErrorPopup","labelText","Label","required","effectiveMeta","generateField","fieldBox","__exports","__esModule"],"sources":["CompactLayout.ts"],"sourcesContent":["/**\n * @file CompactLayout.ts\n * @description Generates a lightweight, dense VBox layout for use inside tight spaces like table cells.\n */\n\nimport VBox from \"sap/m/VBox\";\nimport Label from \"sap/m/Label\";\nimport Title from \"sap/ui/core/Title\";\nimport { IPropertyMetadata, ISchema, ILayoutElement } from \"../interfaces/ISchema\";\nimport { ILayoutManager } from \"../interfaces/ILayoutManager\";\nimport { Engine } from \"../core/Engine\";\nimport { SchemaNormalizer } from \"../core/SchemaNormalizer\";\nimport { Logger } from \"../utils/Logger\";\nimport Control from \"sap/ui/core/Control\";\n\n/**\n * Layout Manager responsible for generating a dense, lightweight layout (no SimpleForm padding).\n * Ideal for rendering objects dynamically inside table cells or side-panels.\n * \n * @namespace nz.co.siliconst.ui5.metaui.layouts\n * @public\n */\nexport class CompactLayout implements ILayoutManager {\n /**\n * Renders the JSON Schema properties into a dense VBox layout.\n * \n * @param schema The active JSON schema subset.\n * @param modelName The bound UI5 model name.\n * @param engine The central orchestrator for delegating plugin generation.\n * @param onSubmit Optional submit hook.\n * @returns {Control} The VBox wrapper containing the generated compact form.\n */\n public render(schema: ISchema, modelName: string, engine: Engine, onSubmit?: () => void): Control {\n const container = new VBox({ renderType: \"Bare\" });\n container.addStyleClass(\"sapUiTinyMargin\");\n\n if (!schema.uiLayout || !Array.isArray(schema.uiLayout)) {\n Logger.warn(\"[MetaUI] Missing 'uiLayout' array in schema. CompactLayout will not render any fields.\");\n return container;\n }\n\n const tableElements: { scope: string, meta: IPropertyMetadata, label?: string }[] = [];\n\n // Recursively render layout elements\n const renderElement = (element: ILayoutElement) => {\n if (element.type === \"Group\") {\n if (element.label) {\n const title = new sap.m.Title({ text: element.label, level: \"H5\" });\n title.addStyleClass(\"sapUiTinyMarginTop sapUiTinyMarginBottom\");\n container.addItem(title);\n }\n \n if (element.elements && Array.isArray(element.elements)) {\n element.elements.forEach(renderElement);\n }\n } else if (element.type === \"Control\") {\n if (!element.scope || !element.scope.startsWith(\"#/properties/\")) {\n Logger.error(`[MetaUI] Invalid scope '${element.scope}' in uiLayout Control.`, \"\", \"CompactLayout\");\n return;\n }\n \n const { meta, bindingPath, propKey } = SchemaNormalizer.resolveScope(schema, element.scope);\n \n if (!meta) {\n Logger.error(`[MetaUI] Property '${propKey}' not found in schema definitions.`, \"\", \"CompactLayout\");\n return;\n }\n\n const isCollectionOfRecords = meta.items?.type === \"object\" || meta.items?.properties;\n const hasExplicitWidget = !!meta.ui?.widget;\n const isSubLayout = meta.type === \"array\" && isCollectionOfRecords && !hasExplicitWidget;\n\n if (isSubLayout) {\n Logger.debug(\"[MetaUI CompactLayout]\", `Routing property '${propKey}' to Table Sub-Layout.`, \"CompactLayout\");\n tableElements.push({ scope: bindingPath, meta, label: element.label });\n } else {\n Logger.debug(\"[MetaUI CompactLayout]\", `Rendering scalar field '${bindingPath}'.`, \"CompactLayout\");\n this._renderScalarField(container, element, bindingPath, meta, modelName, engine);\n }\n } else {\n Logger.warn(`[MetaUI] Unsupported layout element type '${element.type}'.`, \"\", \"CompactLayout\");\n }\n };\n\n // Render everything defined in the layout\n schema.uiLayout.forEach(renderElement);\n\n // Render array/table sub-layouts full width below the fields\n tableElements.forEach(field => {\n try {\n const subSchema = {\n type: \"array\",\n title: field.label || field.meta.ui?.label || field.scope,\n items: field.meta.items || { type: \"object\", properties: {} },\n uiLayout: field.meta.items?.uiLayout\n };\n \n const control = engine.generateLayout(subSchema as ISchema, modelName, `/${field.scope}`);\n if (control) {\n control.addStyleClass(\"sapUiTinyMarginTop\");\n container.addItem(control);\n }\n } catch (error) {\n const msg = (error as Error).message;\n Logger.error(`[MetaUI] Failed to render array field ${field.scope}`, msg, \"CompactLayout\");\n Logger.showErrorPopup(`Failed to render array field '${field.scope}'.\\n\\nDetails: ${msg}`);\n }\n });\n\n return container;\n }\n\n private _renderScalarField(container: VBox, element: ILayoutElement, propKey: string, meta: IPropertyMetadata, modelName: string, engine: Engine): void {\n try {\n const labelText = element.label || meta.ui?.label || propKey;\n const label = new Label({\n text: labelText,\n required: meta.required\n });\n label.addStyleClass(\"sapUiTinyMarginTop\");\n\n const effectiveMeta = { ...meta };\n if (element.widget) {\n effectiveMeta.ui = { ...meta.ui, widget: element.widget };\n }\n\n const control = engine.generateField(effectiveMeta, `/${propKey}`, modelName);\n control.addStyleClass(\"sapUiTinyMarginBottom\");\n\n // Wrap label and field tightly\n const fieldBox = new VBox({ renderType: \"Bare\", items: [label, control] });\n container.addItem(fieldBox);\n } catch (error) {\n const msg = (error as Error).message;\n Logger.error(`[MetaUI] Failed to render field ${propKey}`, msg, \"CompactLayout\");\n Logger.showErrorPopup(`Failed to render field '${propKey}'.\\n\\nDetails: ${msg}`);\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"CompactLayout-dbg.js","names":["SchemaNormalizer","___core_SchemaNormalizer","Logger","___utils_Logger","CompactLayout","render","schema","modelName","engine","onSubmit","container","VBox","renderType","addStyleClass","uiLayout","Array","isArray","warn","tableElements","renderElement","element","type","label","title","sap","m","Title","text","level","addItem","elements","forEach","scope","startsWith","error","meta","bindingPath","propKey","resolveScope","isCollectionOfRecords","items","properties","hasExplicitWidget","ui","widget","isSubLayout","debug","push","_renderScalarField","field","subSchema","control","generateLayout","msg","message","showErrorPopup","labelText","Label","required","effectiveMeta","generateField","fieldBox","__exports","__esModule"],"sources":["CompactLayout.ts"],"sourcesContent":["/**\n * @file CompactLayout.ts\n * @description Generates a lightweight, dense VBox layout for use inside tight spaces like table cells.\n */\n\nimport VBox from \"sap/m/VBox\";\nimport Label from \"sap/m/Label\";\nimport Title from \"sap/ui/core/Title\";\nimport { IPropertyMetadata, ISchema, ILayoutElement } from \"../interfaces/ISchema\";\nimport { ILayoutManager } from \"../interfaces/ILayoutManager\";\nimport { Engine } from \"../core/Engine\";\nimport { SchemaNormalizer } from \"../core/SchemaNormalizer\";\nimport { Logger } from \"../utils/Logger\";\nimport Control from \"sap/ui/core/Control\";\n\n/**\n * Layout Manager responsible for generating a dense, lightweight layout (no SimpleForm padding).\n * Ideal for rendering objects dynamically inside table cells or side-panels.\n * \n * @namespace nz.co.siliconst.ui5.metaui.layouts\n * @public\n */\nexport class CompactLayout implements ILayoutManager {\n /**\n * Renders the JSON Schema properties into a dense VBox layout.\n * \n * @param schema The active JSON schema subset.\n * @param modelName The bound UI5 model name.\n * @param engine The central orchestrator for delegating plugin generation.\n * @param onSubmit Optional submit hook.\n * @returns {Control} The VBox wrapper containing the generated compact form.\n */\n public render(schema: ISchema, modelName: string, engine: Engine, onSubmit?: () => void): Control {\n const container = new VBox({ renderType: \"Bare\" });\n container.addStyleClass(\"sapUiTinyMargin\");\n\n if (!schema.uiLayout || !Array.isArray(schema.uiLayout)) {\n Logger.warn(\"[MetaUI] Missing 'uiLayout' array in schema. CompactLayout will not render any fields.\");\n return container;\n }\n\n const tableElements: { scope: string, meta: IPropertyMetadata, label?: string }[] = [];\n\n // Recursively render layout elements\n const renderElement = (element: ILayoutElement) => {\n if (element.type === \"Group\") {\n if (element.label) {\n const title = new sap.m.Title({ text: element.label, level: \"H5\" });\n title.addStyleClass(\"sapUiTinyMarginTop sapUiTinyMarginBottom\");\n container.addItem(title);\n }\n \n if (element.elements && Array.isArray(element.elements)) {\n element.elements.forEach(renderElement);\n }\n } else if (element.type === \"Control\") {\n if (!element.scope || !element.scope.startsWith(\"#/properties/\")) {\n Logger.error(`[MetaUI] Invalid scope '${element.scope}' in uiLayout Control.`, \"\", \"CompactLayout\");\n return;\n }\n \n const { meta, bindingPath, propKey } = SchemaNormalizer.resolveScope(schema, element.scope);\n \n if (!meta) {\n Logger.error(`[MetaUI] Property '${propKey}' not found in schema definitions.`, \"\", \"CompactLayout\");\n return;\n }\n\n const isCollectionOfRecords = meta.items?.type === \"object\" || meta.items?.properties;\n const hasExplicitWidget = !!meta.ui?.widget;\n const isSubLayout = meta.type === \"array\" && isCollectionOfRecords && !hasExplicitWidget;\n\n if (isSubLayout) {\n Logger.debug(\"[MetaUI CompactLayout]\", `Routing property '${propKey}' to Table Sub-Layout.`, \"CompactLayout\");\n tableElements.push({ scope: bindingPath, meta, label: element.label });\n } else {\n Logger.debug(\"[MetaUI CompactLayout]\", `Rendering scalar field '${bindingPath}'.`, \"CompactLayout\");\n this._renderScalarField(container, element, bindingPath, meta, modelName, engine);\n }\n } else {\n Logger.warn(`[MetaUI] Unsupported layout element type '${element.type}'.`, \"\", \"CompactLayout\");\n }\n };\n\n // Render everything defined in the layout\n schema.uiLayout.forEach(renderElement);\n\n // Render array/table sub-layouts full width below the fields\n tableElements.forEach(field => {\n try {\n const subSchema = {\n type: \"array\",\n title: field.label || field.meta.ui?.label || field.scope,\n items: field.meta.items || { type: \"object\", properties: {} },\n uiLayout: field.meta.items?.uiLayout\n };\n \n const control = engine.generateLayout(subSchema as ISchema, modelName, `/${field.scope}`);\n if (control) {\n control.addStyleClass(\"sapUiTinyMarginTop\");\n container.addItem(control);\n }\n } catch (error) {\n const msg = (error as Error).message;\n Logger.error(`[MetaUI] Failed to render array field ${field.scope}`, msg, \"CompactLayout\");\n Logger.showErrorPopup(`Failed to render array field '${field.scope}'.\\n\\nDetails: ${msg}`);\n }\n });\n\n return container;\n }\n\n /**\n * Synthesizes a primitive field into the layout.\n * @param container The VBox container.\n * @param element The layout element definition.\n * @param propKey The bound property key.\n * @param meta The inferred metadata schema.\n * @param modelName The UI5 data model name.\n * @param engine The core Engine instance.\n */\n private _renderScalarField(container: VBox, element: ILayoutElement, propKey: string, meta: IPropertyMetadata, modelName: string, engine: Engine): void {\n try {\n const labelText = element.label || meta.ui?.label || propKey;\n const label = new Label({\n text: labelText,\n required: meta.required\n });\n label.addStyleClass(\"sapUiTinyMarginTop\");\n\n const effectiveMeta = { ...meta };\n if (element.widget) {\n effectiveMeta.ui = { ...meta.ui, widget: element.widget };\n }\n\n const control = engine.generateField(effectiveMeta, `/${propKey}`, modelName);\n control.addStyleClass(\"sapUiTinyMarginBottom\");\n\n // Wrap label and field tightly\n const fieldBox = new VBox({ renderType: \"Bare\", items: [label, control] });\n container.addItem(fieldBox);\n } catch (error) {\n const msg = (error as Error).message;\n Logger.error(`[MetaUI] Failed to render field ${propKey}`, msg, \"CompactLayout\");\n Logger.showErrorPopup(`Failed to render field '${propKey}'.\\n\\nDetails: ${msg}`);\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -21,6 +21,15 @@ declare module "nz/co/siliconst/ui5/metaui/layouts/CompactLayout" {
|
|
|
21
21
|
* @returns {Control} The VBox wrapper containing the generated compact form.
|
|
22
22
|
*/
|
|
23
23
|
render(schema: ISchema, modelName: string, engine: Engine, onSubmit?: () => void): Control;
|
|
24
|
+
/**
|
|
25
|
+
* Synthesizes a primitive field into the layout.
|
|
26
|
+
* @param container The VBox container.
|
|
27
|
+
* @param element The layout element definition.
|
|
28
|
+
* @param propKey The bound property key.
|
|
29
|
+
* @param meta The inferred metadata schema.
|
|
30
|
+
* @param modelName The UI5 data model name.
|
|
31
|
+
* @param engine The core Engine instance.
|
|
32
|
+
*/
|
|
24
33
|
private _renderScalarField;
|
|
25
34
|
}
|
|
26
35
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CompactLayout.d.ts","sourceRoot":"../../../../../../../..","sources":["src/nz/co/siliconst/ui5/metaui/layouts/CompactLayout.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,kDAAkD,CAAC;IASlE,OAAO,EAAqB,OAAO,EAAkB,MAAM,+CAA+C,CAAC;IAC3G,OAAO,EAAE,cAAc,EAAE,MAAM,sDAAsD,CAAC;IACtF,OAAO,EAAE,MAAM,EAAE,MAAM,wCAAwC,CAAC;IAGhE,OAAO,OAAO,MAAM,qBAAqB,CAAC;IAE1C;;;;;;OAMG;IACH,MAAa,aAAc,YAAW,cAAc;QAChD;;;;;;;;WAQG;QACI,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO;QAgFjG,OAAO,CAAC,kBAAkB;KA0B7B;CAEA"}
|
|
1
|
+
{"version":3,"file":"CompactLayout.d.ts","sourceRoot":"../../../../../../../..","sources":["src/nz/co/siliconst/ui5/metaui/layouts/CompactLayout.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,kDAAkD,CAAC;IASlE,OAAO,EAAqB,OAAO,EAAkB,MAAM,+CAA+C,CAAC;IAC3G,OAAO,EAAE,cAAc,EAAE,MAAM,sDAAsD,CAAC;IACtF,OAAO,EAAE,MAAM,EAAE,MAAM,wCAAwC,CAAC;IAGhE,OAAO,OAAO,MAAM,qBAAqB,CAAC;IAE1C;;;;;;OAMG;IACH,MAAa,aAAc,YAAW,cAAc;QAChD;;;;;;;;WAQG;QACI,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO;QAgFjG;;;;;;;;WAQG;QACH,OAAO,CAAC,kBAAkB;KA0B7B;CAEA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CompactLayout.js","names":["SchemaNormalizer","___core_SchemaNormalizer","Logger","___utils_Logger","CompactLayout","render","schema","modelName","engine","onSubmit","container","VBox","renderType","addStyleClass","uiLayout","Array","isArray","warn","tableElements","renderElement","element","type","label","title","sap","m","Title","text","level","addItem","elements","forEach","scope","startsWith","error","meta","bindingPath","propKey","resolveScope","isCollectionOfRecords","items","properties","hasExplicitWidget","ui","widget","isSubLayout","debug","push","this","_renderScalarField","field","subSchema","control","generateLayout","msg","message","showErrorPopup","labelText","Label","required","effectiveMeta","generateField","fieldBox","__exports","__esModule"],"sources":["CompactLayout.ts"],"sourcesContent":["/**\n * @file CompactLayout.ts\n * @description Generates a lightweight, dense VBox layout for use inside tight spaces like table cells.\n */\n\nimport VBox from \"sap/m/VBox\";\nimport Label from \"sap/m/Label\";\nimport Title from \"sap/ui/core/Title\";\nimport { IPropertyMetadata, ISchema, ILayoutElement } from \"../interfaces/ISchema\";\nimport { ILayoutManager } from \"../interfaces/ILayoutManager\";\nimport { Engine } from \"../core/Engine\";\nimport { SchemaNormalizer } from \"../core/SchemaNormalizer\";\nimport { Logger } from \"../utils/Logger\";\nimport Control from \"sap/ui/core/Control\";\n\n/**\n * Layout Manager responsible for generating a dense, lightweight layout (no SimpleForm padding).\n * Ideal for rendering objects dynamically inside table cells or side-panels.\n * \n * @namespace nz.co.siliconst.ui5.metaui.layouts\n * @public\n */\nexport class CompactLayout implements ILayoutManager {\n /**\n * Renders the JSON Schema properties into a dense VBox layout.\n * \n * @param schema The active JSON schema subset.\n * @param modelName The bound UI5 model name.\n * @param engine The central orchestrator for delegating plugin generation.\n * @param onSubmit Optional submit hook.\n * @returns {Control} The VBox wrapper containing the generated compact form.\n */\n public render(schema: ISchema, modelName: string, engine: Engine, onSubmit?: () => void): Control {\n const container = new VBox({ renderType: \"Bare\" });\n container.addStyleClass(\"sapUiTinyMargin\");\n\n if (!schema.uiLayout || !Array.isArray(schema.uiLayout)) {\n Logger.warn(\"[MetaUI] Missing 'uiLayout' array in schema. CompactLayout will not render any fields.\");\n return container;\n }\n\n const tableElements: { scope: string, meta: IPropertyMetadata, label?: string }[] = [];\n\n // Recursively render layout elements\n const renderElement = (element: ILayoutElement) => {\n if (element.type === \"Group\") {\n if (element.label) {\n const title = new sap.m.Title({ text: element.label, level: \"H5\" });\n title.addStyleClass(\"sapUiTinyMarginTop sapUiTinyMarginBottom\");\n container.addItem(title);\n }\n \n if (element.elements && Array.isArray(element.elements)) {\n element.elements.forEach(renderElement);\n }\n } else if (element.type === \"Control\") {\n if (!element.scope || !element.scope.startsWith(\"#/properties/\")) {\n Logger.error(`[MetaUI] Invalid scope '${element.scope}' in uiLayout Control.`, \"\", \"CompactLayout\");\n return;\n }\n \n const { meta, bindingPath, propKey } = SchemaNormalizer.resolveScope(schema, element.scope);\n \n if (!meta) {\n Logger.error(`[MetaUI] Property '${propKey}' not found in schema definitions.`, \"\", \"CompactLayout\");\n return;\n }\n\n const isCollectionOfRecords = meta.items?.type === \"object\" || meta.items?.properties;\n const hasExplicitWidget = !!meta.ui?.widget;\n const isSubLayout = meta.type === \"array\" && isCollectionOfRecords && !hasExplicitWidget;\n\n if (isSubLayout) {\n Logger.debug(\"[MetaUI CompactLayout]\", `Routing property '${propKey}' to Table Sub-Layout.`, \"CompactLayout\");\n tableElements.push({ scope: bindingPath, meta, label: element.label });\n } else {\n Logger.debug(\"[MetaUI CompactLayout]\", `Rendering scalar field '${bindingPath}'.`, \"CompactLayout\");\n this._renderScalarField(container, element, bindingPath, meta, modelName, engine);\n }\n } else {\n Logger.warn(`[MetaUI] Unsupported layout element type '${element.type}'.`, \"\", \"CompactLayout\");\n }\n };\n\n // Render everything defined in the layout\n schema.uiLayout.forEach(renderElement);\n\n // Render array/table sub-layouts full width below the fields\n tableElements.forEach(field => {\n try {\n const subSchema = {\n type: \"array\",\n title: field.label || field.meta.ui?.label || field.scope,\n items: field.meta.items || { type: \"object\", properties: {} },\n uiLayout: field.meta.items?.uiLayout\n };\n \n const control = engine.generateLayout(subSchema as ISchema, modelName, `/${field.scope}`);\n if (control) {\n control.addStyleClass(\"sapUiTinyMarginTop\");\n container.addItem(control);\n }\n } catch (error) {\n const msg = (error as Error).message;\n Logger.error(`[MetaUI] Failed to render array field ${field.scope}`, msg, \"CompactLayout\");\n Logger.showErrorPopup(`Failed to render array field '${field.scope}'.\\n\\nDetails: ${msg}`);\n }\n });\n\n return container;\n }\n\n private _renderScalarField(container: VBox, element: ILayoutElement, propKey: string, meta: IPropertyMetadata, modelName: string, engine: Engine): void {\n try {\n const labelText = element.label || meta.ui?.label || propKey;\n const label = new Label({\n text: labelText,\n required: meta.required\n });\n label.addStyleClass(\"sapUiTinyMarginTop\");\n\n const effectiveMeta = { ...meta };\n if (element.widget) {\n effectiveMeta.ui = { ...meta.ui, widget: element.widget };\n }\n\n const control = engine.generateField(effectiveMeta, `/${propKey}`, modelName);\n control.addStyleClass(\"sapUiTinyMarginBottom\");\n\n // Wrap label and field tightly\n const fieldBox = new VBox({ renderType: \"Bare\", items: [label, control] });\n container.addItem(fieldBox);\n } catch (error) {\n const msg = (error as Error).message;\n Logger.error(`[MetaUI] Failed to render field ${propKey}`, msg, \"CompactLayout\");\n Logger.showErrorPopup(`Failed to render field '${propKey}'.\\n\\nDetails: ${msg}`);\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"CompactLayout.js","names":["SchemaNormalizer","___core_SchemaNormalizer","Logger","___utils_Logger","CompactLayout","render","schema","modelName","engine","onSubmit","container","VBox","renderType","addStyleClass","uiLayout","Array","isArray","warn","tableElements","renderElement","element","type","label","title","sap","m","Title","text","level","addItem","elements","forEach","scope","startsWith","error","meta","bindingPath","propKey","resolveScope","isCollectionOfRecords","items","properties","hasExplicitWidget","ui","widget","isSubLayout","debug","push","this","_renderScalarField","field","subSchema","control","generateLayout","msg","message","showErrorPopup","labelText","Label","required","effectiveMeta","generateField","fieldBox","__exports","__esModule"],"sources":["CompactLayout.ts"],"sourcesContent":["/**\n * @file CompactLayout.ts\n * @description Generates a lightweight, dense VBox layout for use inside tight spaces like table cells.\n */\n\nimport VBox from \"sap/m/VBox\";\nimport Label from \"sap/m/Label\";\nimport Title from \"sap/ui/core/Title\";\nimport { IPropertyMetadata, ISchema, ILayoutElement } from \"../interfaces/ISchema\";\nimport { ILayoutManager } from \"../interfaces/ILayoutManager\";\nimport { Engine } from \"../core/Engine\";\nimport { SchemaNormalizer } from \"../core/SchemaNormalizer\";\nimport { Logger } from \"../utils/Logger\";\nimport Control from \"sap/ui/core/Control\";\n\n/**\n * Layout Manager responsible for generating a dense, lightweight layout (no SimpleForm padding).\n * Ideal for rendering objects dynamically inside table cells or side-panels.\n * \n * @namespace nz.co.siliconst.ui5.metaui.layouts\n * @public\n */\nexport class CompactLayout implements ILayoutManager {\n /**\n * Renders the JSON Schema properties into a dense VBox layout.\n * \n * @param schema The active JSON schema subset.\n * @param modelName The bound UI5 model name.\n * @param engine The central orchestrator for delegating plugin generation.\n * @param onSubmit Optional submit hook.\n * @returns {Control} The VBox wrapper containing the generated compact form.\n */\n public render(schema: ISchema, modelName: string, engine: Engine, onSubmit?: () => void): Control {\n const container = new VBox({ renderType: \"Bare\" });\n container.addStyleClass(\"sapUiTinyMargin\");\n\n if (!schema.uiLayout || !Array.isArray(schema.uiLayout)) {\n Logger.warn(\"[MetaUI] Missing 'uiLayout' array in schema. CompactLayout will not render any fields.\");\n return container;\n }\n\n const tableElements: { scope: string, meta: IPropertyMetadata, label?: string }[] = [];\n\n // Recursively render layout elements\n const renderElement = (element: ILayoutElement) => {\n if (element.type === \"Group\") {\n if (element.label) {\n const title = new sap.m.Title({ text: element.label, level: \"H5\" });\n title.addStyleClass(\"sapUiTinyMarginTop sapUiTinyMarginBottom\");\n container.addItem(title);\n }\n \n if (element.elements && Array.isArray(element.elements)) {\n element.elements.forEach(renderElement);\n }\n } else if (element.type === \"Control\") {\n if (!element.scope || !element.scope.startsWith(\"#/properties/\")) {\n Logger.error(`[MetaUI] Invalid scope '${element.scope}' in uiLayout Control.`, \"\", \"CompactLayout\");\n return;\n }\n \n const { meta, bindingPath, propKey } = SchemaNormalizer.resolveScope(schema, element.scope);\n \n if (!meta) {\n Logger.error(`[MetaUI] Property '${propKey}' not found in schema definitions.`, \"\", \"CompactLayout\");\n return;\n }\n\n const isCollectionOfRecords = meta.items?.type === \"object\" || meta.items?.properties;\n const hasExplicitWidget = !!meta.ui?.widget;\n const isSubLayout = meta.type === \"array\" && isCollectionOfRecords && !hasExplicitWidget;\n\n if (isSubLayout) {\n Logger.debug(\"[MetaUI CompactLayout]\", `Routing property '${propKey}' to Table Sub-Layout.`, \"CompactLayout\");\n tableElements.push({ scope: bindingPath, meta, label: element.label });\n } else {\n Logger.debug(\"[MetaUI CompactLayout]\", `Rendering scalar field '${bindingPath}'.`, \"CompactLayout\");\n this._renderScalarField(container, element, bindingPath, meta, modelName, engine);\n }\n } else {\n Logger.warn(`[MetaUI] Unsupported layout element type '${element.type}'.`, \"\", \"CompactLayout\");\n }\n };\n\n // Render everything defined in the layout\n schema.uiLayout.forEach(renderElement);\n\n // Render array/table sub-layouts full width below the fields\n tableElements.forEach(field => {\n try {\n const subSchema = {\n type: \"array\",\n title: field.label || field.meta.ui?.label || field.scope,\n items: field.meta.items || { type: \"object\", properties: {} },\n uiLayout: field.meta.items?.uiLayout\n };\n \n const control = engine.generateLayout(subSchema as ISchema, modelName, `/${field.scope}`);\n if (control) {\n control.addStyleClass(\"sapUiTinyMarginTop\");\n container.addItem(control);\n }\n } catch (error) {\n const msg = (error as Error).message;\n Logger.error(`[MetaUI] Failed to render array field ${field.scope}`, msg, \"CompactLayout\");\n Logger.showErrorPopup(`Failed to render array field '${field.scope}'.\\n\\nDetails: ${msg}`);\n }\n });\n\n return container;\n }\n\n /**\n * Synthesizes a primitive field into the layout.\n * @param container The VBox container.\n * @param element The layout element definition.\n * @param propKey The bound property key.\n * @param meta The inferred metadata schema.\n * @param modelName The UI5 data model name.\n * @param engine The core Engine instance.\n */\n private _renderScalarField(container: VBox, element: ILayoutElement, propKey: string, meta: IPropertyMetadata, modelName: string, engine: Engine): void {\n try {\n const labelText = element.label || meta.ui?.label || propKey;\n const label = new Label({\n text: labelText,\n required: meta.required\n });\n label.addStyleClass(\"sapUiTinyMarginTop\");\n\n const effectiveMeta = { ...meta };\n if (element.widget) {\n effectiveMeta.ui = { ...meta.ui, widget: element.widget };\n }\n\n const control = engine.generateField(effectiveMeta, `/${propKey}`, modelName);\n control.addStyleClass(\"sapUiTinyMarginBottom\");\n\n // Wrap label and field tightly\n const fieldBox = new VBox({ renderType: \"Bare\", items: [label, control] });\n container.addItem(fieldBox);\n } catch (error) {\n const msg = (error as Error).message;\n Logger.error(`[MetaUI] Failed to render field ${propKey}`, msg, \"CompactLayout\");\n Logger.showErrorPopup(`Failed to render field '${propKey}'.\\n\\nDetails: ${msg}`);\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -110,6 +110,15 @@ export class CompactLayout implements ILayoutManager {
|
|
|
110
110
|
return container;
|
|
111
111
|
}
|
|
112
112
|
|
|
113
|
+
/**
|
|
114
|
+
* Synthesizes a primitive field into the layout.
|
|
115
|
+
* @param container The VBox container.
|
|
116
|
+
* @param element The layout element definition.
|
|
117
|
+
* @param propKey The bound property key.
|
|
118
|
+
* @param meta The inferred metadata schema.
|
|
119
|
+
* @param modelName The UI5 data model name.
|
|
120
|
+
* @param engine The core Engine instance.
|
|
121
|
+
*/
|
|
113
122
|
private _renderScalarField(container: VBox, element: ILayoutElement, propKey: string, meta: IPropertyMetadata, modelName: string, engine: Engine): void {
|
|
114
123
|
try {
|
|
115
124
|
const labelText = element.label || meta.ui?.label || propKey;
|
|
@@ -130,6 +130,16 @@ sap.ui.define(["sap/ui/layout/form/SimpleForm", "sap/m/Label", "sap/ui/core/Titl
|
|
|
130
130
|
});
|
|
131
131
|
return container;
|
|
132
132
|
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Synthesizes a primitive field into the Form.
|
|
136
|
+
* @param form The SimpleForm instance.
|
|
137
|
+
* @param element The layout element definition.
|
|
138
|
+
* @param propKey The bound property key.
|
|
139
|
+
* @param meta The inferred metadata schema.
|
|
140
|
+
* @param modelName The UI5 data model name.
|
|
141
|
+
* @param engine The core Engine instance.
|
|
142
|
+
*/
|
|
133
143
|
_renderScalarField(form, element, propKey, meta, modelName, engine) {
|
|
134
144
|
try {
|
|
135
145
|
const labelText = element.label || meta.ui?.label || propKey;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormLayout-dbg.js","names":["SchemaNormalizer","___core_SchemaNormalizer","Logger","___utils_Logger","FormLayout","render","schema","modelName","engine","onSubmit","container","VBox","renderType","form","SimpleForm","editable","title","layout","labelSpanXL","labelSpanL","labelSpanM","labelSpanS","adjustLabelSpan","emptySpanXL","emptySpanL","emptySpanM","emptySpanS","columnsXL","columnsL","columnsM","singleContainerFullSize","uiLayout","Array","isArray","warn","addItem","tableElements","hasFormFields","renderElement","element","type","label","addContent","Title","text","elements","forEach","scope","startsWith","error","meta","bindingPath","propKey","resolveScope","isCollectionOfRecords","items","properties","hasExplicitWidget","ui","widget","isSubLayout","debug","push","_renderScalarField","field","subSchema","control","generateLayout","addStyleClass","msg","message","showErrorPopup","labelText","Label","required","effectiveMeta","generateField","fullWidth","sap","require","GridData","setLayoutData","span","__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 VBox from \"sap/m/VBox\";\nimport { IPropertyMetadata, ISchema, ILayoutElement } from \"../interfaces/ISchema\";\nimport { ILayoutManager } from \"../interfaces/ILayoutManager\";\nimport { Engine } from \"../core/Engine\";\nimport { SchemaNormalizer } from \"../core/SchemaNormalizer\";\nimport { Logger } from \"../utils/Logger\";\nimport Control from \"sap/ui/core/Control\";\n\n/**\n * Layout Manager responsible for generating a fully responsive SAP Fiori SimpleForm.\n * It traverses the `uiLayout` tree defined in the schema to build the form groups and fields,\n * completely separating visual orchestration from data modeling.\n * @namespace nz.co.siliconst.ui5.metaui.layouts\n * @public\n */\nexport class FormLayout implements ILayoutManager {\n /**\n * Renders the JSON Schema properties into a UI5 SimpleForm using the uiLayout definitions.\n * \n * @param schema The active JSON schema subset.\n * @param modelName The bound UI5 model name.\n * @param engine The central orchestrator for delegating plugin generation.\n * @param onSubmit Optional submit hook.\n * @returns {Control} The VBox wrapper containing the generated form.\n */\n public render(schema: ISchema, modelName: string, engine: Engine, onSubmit?: () => void): Control {\n const container = new VBox({ renderType: \"Bare\" });\n const form = new SimpleForm({\n editable: true,\n title: schema.title,\n layout: \"ResponsiveGridLayout\",\n labelSpanXL: 4, labelSpanL: 4, labelSpanM: 4, labelSpanS: 12,\n adjustLabelSpan: false,\n emptySpanXL: 0, emptySpanL: 0, emptySpanM: 0, emptySpanS: 0,\n columnsXL: 1, columnsL: 1, columnsM: 1,\n singleContainerFullSize: false\n });\n\n if (!schema.uiLayout || !Array.isArray(schema.uiLayout)) {\n Logger.warn(\"[MetaUI] Missing 'uiLayout' array in schema. Form will not render any fields.\");\n container.addItem(form);\n return container;\n }\n\n const tableElements: { scope: string, meta: IPropertyMetadata, label?: string }[] = [];\n let hasFormFields = false;\n\n // Recursively render layout elements\n const renderElement = (element: ILayoutElement) => {\n if (element.type === \"Group\") {\n if (element.label) {\n form.addContent(new Title({ text: element.label }));\n }\n \n if (element.elements && Array.isArray(element.elements)) {\n element.elements.forEach(renderElement);\n }\n } else if (element.type === \"Control\") {\n if (!element.scope || !element.scope.startsWith(\"#/properties/\")) {\n Logger.error(`[MetaUI] Invalid scope '${element.scope}' in uiLayout Control.`, \"\", \"FormLayout\");\n return;\n }\n \n const { meta, bindingPath, propKey } = SchemaNormalizer.resolveScope(schema, element.scope);\n \n if (!meta) {\n Logger.error(`[MetaUI] Property '${propKey}' not found in schema definitions.`, \"\", \"FormLayout\");\n return;\n }\n\n // Architectural Boundary: Separate Field Controls (Plugins) from Sub-Layouts (LayoutManagers)\n // A property is delegated to a Sub-Layout Manager (Table) ONLY if it represents a collection of complex objects.\n // Collections of primitives, or explicitly assigned widgets (like multiSelect), remain in the Form as Field Plugins.\n const isCollectionOfRecords = meta.items?.type === \"object\" || meta.items?.properties;\n const hasExplicitWidget = !!meta.ui?.widget;\n const isSubLayout = meta.type === \"array\" && isCollectionOfRecords && !hasExplicitWidget;\n\n if (isSubLayout) {\n Logger.debug(\"[MetaUI FormLayout]\", `Routing property '${propKey}' to Table Sub-Layout.`, \"FormLayout\");\n tableElements.push({ scope: bindingPath, meta, label: element.label });\n } else {\n hasFormFields = true;\n Logger.debug(\"[MetaUI FormLayout]\", `Rendering scalar field '${bindingPath}'.`, \"FormLayout\");\n this._renderScalarField(form, element, bindingPath, meta, modelName, engine);\n }\n } else {\n Logger.warn(`[MetaUI] Unsupported layout element type '${element.type}'.`, \"\", \"FormLayout\");\n }\n };\n\n // Render everything defined in the layout\n schema.uiLayout.forEach(renderElement);\n\n if (hasFormFields) {\n container.addItem(form);\n }\n\n // Render array/table sub-layouts full width below the form\n tableElements.forEach(field => {\n try {\n const subSchema = {\n type: \"array\",\n title: field.label || field.meta.ui?.label || field.scope,\n items: field.meta.items || { type: \"object\", properties: {} },\n uiLayout: field.meta.items?.uiLayout // Pass down sub-layout if available\n };\n \n const control = engine.generateLayout(subSchema as ISchema, modelName, `/${field.scope}`);\n if (control) {\n control.addStyleClass(\"sapUiSmallMarginTop\");\n container.addItem(control);\n }\n } catch (error) {\n const msg = (error as Error).message;\n Logger.error(`[MetaUI] Failed to render array field ${field.scope}`, msg, \"FormLayout\");\n Logger.showErrorPopup(`Failed to render array field '${field.scope}'.\\n\\nDetails: ${msg}`);\n }\n });\n\n return container;\n }\n\n private _renderScalarField(form: SimpleForm, element: ILayoutElement, propKey: string, meta: IPropertyMetadata, modelName: string, engine: Engine): void {\n try {\n const labelText = element.label || meta.ui?.label || propKey;\n const label = new Label({\n text: labelText,\n required: meta.required\n });\n\n // Override widget if specified in the layout element\n const effectiveMeta = { ...meta };\n if (element.widget) {\n effectiveMeta.ui = { ...meta.ui, widget: element.widget };\n }\n\n const control = engine.generateField(effectiveMeta, `/${propKey}`, modelName);\n\n if (effectiveMeta.ui?.fullWidth) {\n sap.ui.require([\"sap/ui/layout/GridData\"], (GridData: any) => {\n control.setLayoutData(new GridData({ span: \"XL12 L12 M12 S12\" }));\n });\n }\n\n form.addContent(label);\n form.addContent(control);\n } catch (error) {\n const msg = (error as Error).message;\n Logger.error(`[MetaUI] Failed to render field ${propKey}`, msg, \"FormLayout\");\n Logger.showErrorPopup(`Failed to render field '${propKey}'.\\n\\nDetails: ${msg}`);\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"FormLayout-dbg.js","names":["SchemaNormalizer","___core_SchemaNormalizer","Logger","___utils_Logger","FormLayout","render","schema","modelName","engine","onSubmit","container","VBox","renderType","form","SimpleForm","editable","title","layout","labelSpanXL","labelSpanL","labelSpanM","labelSpanS","adjustLabelSpan","emptySpanXL","emptySpanL","emptySpanM","emptySpanS","columnsXL","columnsL","columnsM","singleContainerFullSize","uiLayout","Array","isArray","warn","addItem","tableElements","hasFormFields","renderElement","element","type","label","addContent","Title","text","elements","forEach","scope","startsWith","error","meta","bindingPath","propKey","resolveScope","isCollectionOfRecords","items","properties","hasExplicitWidget","ui","widget","isSubLayout","debug","push","_renderScalarField","field","subSchema","control","generateLayout","addStyleClass","msg","message","showErrorPopup","labelText","Label","required","effectiveMeta","generateField","fullWidth","sap","require","GridData","setLayoutData","span","__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 VBox from \"sap/m/VBox\";\nimport { IPropertyMetadata, ISchema, ILayoutElement } from \"../interfaces/ISchema\";\nimport { ILayoutManager } from \"../interfaces/ILayoutManager\";\nimport { Engine } from \"../core/Engine\";\nimport { SchemaNormalizer } from \"../core/SchemaNormalizer\";\nimport { Logger } from \"../utils/Logger\";\nimport Control from \"sap/ui/core/Control\";\n\n/**\n * Layout Manager responsible for generating a fully responsive SAP Fiori SimpleForm.\n * It traverses the `uiLayout` tree defined in the schema to build the form groups and fields,\n * completely separating visual orchestration from data modeling.\n * @namespace nz.co.siliconst.ui5.metaui.layouts\n * @public\n */\nexport class FormLayout implements ILayoutManager {\n /**\n * Renders the JSON Schema properties into a UI5 SimpleForm using the uiLayout definitions.\n * \n * @param schema The active JSON schema subset.\n * @param modelName The bound UI5 model name.\n * @param engine The central orchestrator for delegating plugin generation.\n * @param onSubmit Optional submit hook.\n * @returns {Control} The VBox wrapper containing the generated form.\n */\n public render(schema: ISchema, modelName: string, engine: Engine, onSubmit?: () => void): Control {\n const container = new VBox({ renderType: \"Bare\" });\n const form = new SimpleForm({\n editable: true,\n title: schema.title,\n layout: \"ResponsiveGridLayout\",\n labelSpanXL: 4, labelSpanL: 4, labelSpanM: 4, labelSpanS: 12,\n adjustLabelSpan: false,\n emptySpanXL: 0, emptySpanL: 0, emptySpanM: 0, emptySpanS: 0,\n columnsXL: 1, columnsL: 1, columnsM: 1,\n singleContainerFullSize: false\n });\n\n if (!schema.uiLayout || !Array.isArray(schema.uiLayout)) {\n Logger.warn(\"[MetaUI] Missing 'uiLayout' array in schema. Form will not render any fields.\");\n container.addItem(form);\n return container;\n }\n\n const tableElements: { scope: string, meta: IPropertyMetadata, label?: string }[] = [];\n let hasFormFields = false;\n\n // Recursively render layout elements\n const renderElement = (element: ILayoutElement) => {\n if (element.type === \"Group\") {\n if (element.label) {\n form.addContent(new Title({ text: element.label }));\n }\n \n if (element.elements && Array.isArray(element.elements)) {\n element.elements.forEach(renderElement);\n }\n } else if (element.type === \"Control\") {\n if (!element.scope || !element.scope.startsWith(\"#/properties/\")) {\n Logger.error(`[MetaUI] Invalid scope '${element.scope}' in uiLayout Control.`, \"\", \"FormLayout\");\n return;\n }\n \n const { meta, bindingPath, propKey } = SchemaNormalizer.resolveScope(schema, element.scope);\n \n if (!meta) {\n Logger.error(`[MetaUI] Property '${propKey}' not found in schema definitions.`, \"\", \"FormLayout\");\n return;\n }\n\n // Architectural Boundary: Separate Field Controls (Plugins) from Sub-Layouts (LayoutManagers)\n // A property is delegated to a Sub-Layout Manager (Table) ONLY if it represents a collection of complex objects.\n // Collections of primitives, or explicitly assigned widgets (like multiSelect), remain in the Form as Field Plugins.\n const isCollectionOfRecords = meta.items?.type === \"object\" || meta.items?.properties;\n const hasExplicitWidget = !!meta.ui?.widget;\n const isSubLayout = meta.type === \"array\" && isCollectionOfRecords && !hasExplicitWidget;\n\n if (isSubLayout) {\n Logger.debug(\"[MetaUI FormLayout]\", `Routing property '${propKey}' to Table Sub-Layout.`, \"FormLayout\");\n tableElements.push({ scope: bindingPath, meta, label: element.label });\n } else {\n hasFormFields = true;\n Logger.debug(\"[MetaUI FormLayout]\", `Rendering scalar field '${bindingPath}'.`, \"FormLayout\");\n this._renderScalarField(form, element, bindingPath, meta, modelName, engine);\n }\n } else {\n Logger.warn(`[MetaUI] Unsupported layout element type '${element.type}'.`, \"\", \"FormLayout\");\n }\n };\n\n // Render everything defined in the layout\n schema.uiLayout.forEach(renderElement);\n\n if (hasFormFields) {\n container.addItem(form);\n }\n\n // Render array/table sub-layouts full width below the form\n tableElements.forEach(field => {\n try {\n const subSchema = {\n type: \"array\",\n title: field.label || field.meta.ui?.label || field.scope,\n items: field.meta.items || { type: \"object\", properties: {} },\n uiLayout: field.meta.items?.uiLayout // Pass down sub-layout if available\n };\n \n const control = engine.generateLayout(subSchema as ISchema, modelName, `/${field.scope}`);\n if (control) {\n control.addStyleClass(\"sapUiSmallMarginTop\");\n container.addItem(control);\n }\n } catch (error) {\n const msg = (error as Error).message;\n Logger.error(`[MetaUI] Failed to render array field ${field.scope}`, msg, \"FormLayout\");\n Logger.showErrorPopup(`Failed to render array field '${field.scope}'.\\n\\nDetails: ${msg}`);\n }\n });\n\n return container;\n }\n\n /**\n * Synthesizes a primitive field into the Form.\n * @param form The SimpleForm instance.\n * @param element The layout element definition.\n * @param propKey The bound property key.\n * @param meta The inferred metadata schema.\n * @param modelName The UI5 data model name.\n * @param engine The core Engine instance.\n */\n private _renderScalarField(form: SimpleForm, element: ILayoutElement, propKey: string, meta: IPropertyMetadata, modelName: string, engine: Engine): void {\n try {\n const labelText = element.label || meta.ui?.label || propKey;\n const label = new Label({\n text: labelText,\n required: meta.required\n });\n\n // Override widget if specified in the layout element\n const effectiveMeta = { ...meta };\n if (element.widget) {\n effectiveMeta.ui = { ...meta.ui, widget: element.widget };\n }\n\n const control = engine.generateField(effectiveMeta, `/${propKey}`, modelName);\n\n if (effectiveMeta.ui?.fullWidth) {\n sap.ui.require([\"sap/ui/layout/GridData\"], (GridData: any) => {\n control.setLayoutData(new GridData({ span: \"XL12 L12 M12 S12\" }));\n });\n }\n\n form.addContent(label);\n form.addContent(control);\n } catch (error) {\n const msg = (error as Error).message;\n Logger.error(`[MetaUI] Failed to render field ${propKey}`, msg, \"FormLayout\");\n Logger.showErrorPopup(`Failed to render field '${propKey}'.\\n\\nDetails: ${msg}`);\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -21,6 +21,15 @@ declare module "nz/co/siliconst/ui5/metaui/layouts/FormLayout" {
|
|
|
21
21
|
* @returns {Control} The VBox wrapper containing the generated form.
|
|
22
22
|
*/
|
|
23
23
|
render(schema: ISchema, modelName: string, engine: Engine, onSubmit?: () => void): Control;
|
|
24
|
+
/**
|
|
25
|
+
* Synthesizes a primitive field into the Form.
|
|
26
|
+
* @param form The SimpleForm instance.
|
|
27
|
+
* @param element The layout element definition.
|
|
28
|
+
* @param propKey The bound property key.
|
|
29
|
+
* @param meta The inferred metadata schema.
|
|
30
|
+
* @param modelName The UI5 data model name.
|
|
31
|
+
* @param engine The core Engine instance.
|
|
32
|
+
*/
|
|
24
33
|
private _renderScalarField;
|
|
25
34
|
}
|
|
26
35
|
}
|
|
@@ -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;IAU/D,OAAO,EAAqB,OAAO,EAAkB,MAAM,+CAA+C,CAAC;IAC3G,OAAO,EAAE,cAAc,EAAE,MAAM,sDAAsD,CAAC;IACtF,OAAO,EAAE,MAAM,EAAE,MAAM,wCAAwC,CAAC;IAGhE,OAAO,OAAO,MAAM,qBAAqB,CAAC;IAE1C;;;;;;OAMG;IACH,MAAa,UAAW,YAAW,cAAc;QAC7C;;;;;;;;WAQG;QACI,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO;QAiGjG,OAAO,CAAC,kBAAkB;KA8B7B;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;IAU/D,OAAO,EAAqB,OAAO,EAAkB,MAAM,+CAA+C,CAAC;IAC3G,OAAO,EAAE,cAAc,EAAE,MAAM,sDAAsD,CAAC;IACtF,OAAO,EAAE,MAAM,EAAE,MAAM,wCAAwC,CAAC;IAGhE,OAAO,OAAO,MAAM,qBAAqB,CAAC;IAE1C;;;;;;OAMG;IACH,MAAa,UAAW,YAAW,cAAc;QAC7C;;;;;;;;WAQG;QACI,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO;QAiGjG;;;;;;;;WAQG;QACH,OAAO,CAAC,kBAAkB;KA8B7B;CAEA"}
|