@siliconst/metaui 1.4.34 → 1.4.44
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/package.json +1 -1
- package/src/nz/co/siliconst/ui5/metaui/ai/BaseAIGenerator-dbg.js +22 -20
- package/src/nz/co/siliconst/ui5/metaui/ai/BaseAIGenerator-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/ai/BaseAIGenerator.d.ts +3 -3
- package/src/nz/co/siliconst/ui5/metaui/ai/BaseAIGenerator.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/ai/BaseAIGenerator.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/ai/BaseAIGenerator.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/ai/BaseAIGenerator.ts +24 -16
- package/src/nz/co/siliconst/ui5/metaui/ai/RestLLMProxy-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/ai/RestLLMProxy.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/ai/RestLLMProxy.ts +2 -2
- package/src/nz/co/siliconst/ui5/metaui/constants/MetaUIConstants-dbg.js +62 -2
- package/src/nz/co/siliconst/ui5/metaui/constants/MetaUIConstants-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/constants/MetaUIConstants.d.ts +54 -0
- package/src/nz/co/siliconst/ui5/metaui/constants/MetaUIConstants.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/constants/MetaUIConstants.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/constants/MetaUIConstants.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/constants/MetaUIConstants.ts +59 -2
- package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost-dbg.js +43 -47
- 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 +2 -2
- package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.js +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 +61 -66
- package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost-dbg.js +120 -63
- 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 +126 -65
- package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate-dbg.js +41 -38
- 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 +6 -4
- 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 +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 +47 -39
- package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DialogDelegate-dbg.js +41 -2
- 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 +6 -2
- 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 +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 +47 -2
- package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate-dbg.js +7 -2
- 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 -1
- 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 +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 +7 -2
- package/src/nz/co/siliconst/ui5/metaui/core/Engine-dbg.js +212 -34
- 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 +21 -3
- 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 +214 -35
- package/src/nz/co/siliconst/ui5/metaui/core/LayoutMutator-dbg.js +3 -1
- package/src/nz/co/siliconst/ui5/metaui/core/LayoutMutator-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/LayoutMutator.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/LayoutMutator.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/LayoutMutator.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/LayoutMutator.ts +3 -1
- package/src/nz/co/siliconst/ui5/metaui/core/LayoutScorer-dbg.js +5 -0
- package/src/nz/co/siliconst/ui5/metaui/core/LayoutScorer-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/LayoutScorer.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/LayoutScorer.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/LayoutScorer.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/LayoutScorer.ts +6 -0
- package/src/nz/co/siliconst/ui5/metaui/core/PipelineManager-dbg.js +8 -0
- 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.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 +7 -0
- package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry-dbg.js +127 -50
- 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 +13 -0
- 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 +140 -57
- package/src/nz/co/siliconst/ui5/metaui/core/PolicyEngine-dbg.js +229 -0
- package/src/nz/co/siliconst/ui5/metaui/core/PolicyEngine-dbg.js.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/core/PolicyEngine.d.ts +68 -0
- package/src/nz/co/siliconst/ui5/metaui/core/PolicyEngine.d.ts.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/core/PolicyEngine.js +2 -0
- package/src/nz/co/siliconst/ui5/metaui/core/PolicyEngine.js.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/core/PolicyEngine.ts +227 -0
- package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer-dbg.js +34 -13
- 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 +4 -4
- package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.ts +45 -20
- package/src/nz/co/siliconst/ui5/metaui/core/SchemaValidator-dbg.js +15 -3
- package/src/nz/co/siliconst/ui5/metaui/core/SchemaValidator-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/SchemaValidator.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/SchemaValidator.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/SchemaValidator.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/SchemaValidator.ts +15 -1
- package/src/nz/co/siliconst/ui5/metaui/core/StateManager-dbg.js +82 -16
- 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 +16 -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 +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 +89 -17
- package/src/nz/co/siliconst/ui5/metaui/interfaces/IPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/interfaces/IPlugin.d.ts +12 -1
- package/src/nz/co/siliconst/ui5/metaui/interfaces/IPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/interfaces/IPlugin.ts +13 -1
- package/src/nz/co/siliconst/ui5/metaui/interfaces/IPolicyPlugin-dbg.js +2 -0
- package/src/nz/co/siliconst/ui5/metaui/interfaces/IPolicyPlugin-dbg.js.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/interfaces/IPolicyPlugin.d.ts +50 -0
- package/src/nz/co/siliconst/ui5/metaui/interfaces/IPolicyPlugin.d.ts.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/interfaces/IPolicyPlugin.js +2 -0
- package/src/nz/co/siliconst/ui5/metaui/interfaces/IPolicyPlugin.js.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/interfaces/IPolicyPlugin.ts +49 -0
- package/src/nz/co/siliconst/ui5/metaui/interfaces/ISchema-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/interfaces/ISchema.d.ts +21 -1
- package/src/nz/co/siliconst/ui5/metaui/interfaces/ISchema.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/interfaces/ISchema.ts +24 -1
- package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout-dbg.js +26 -31
- 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.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout.ts +22 -25
- package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout-dbg.js +40 -6
- package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout.ts +37 -5
- package/src/nz/co/siliconst/ui5/metaui/library-preload.js +69 -56
- package/src/nz/co/siliconst/ui5/metaui/library-preload.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiParserFactory-dbg.js +3 -2
- package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiParserFactory-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiParserFactory.d.ts +1 -1
- package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiParserFactory.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiParserFactory.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiParserFactory.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiParserFactory.ts +4 -3
- package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiRefResolver-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiRefResolver.d.ts +1 -1
- package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiRefResolver.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiRefResolver.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiRefResolver.ts +4 -4
- package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiUIMapper-dbg.js +2 -1
- package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiUIMapper-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiUIMapper.d.ts +1 -1
- package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiUIMapper.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiUIMapper.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiUIMapper.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiUIMapper.ts +4 -3
- package/src/nz/co/siliconst/ui5/metaui/openapi/heuristics/plugins/ProtobufVariantHeuristic-dbg.js +12 -8
- package/src/nz/co/siliconst/ui5/metaui/openapi/heuristics/plugins/ProtobufVariantHeuristic-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/openapi/heuristics/plugins/ProtobufVariantHeuristic.d.ts +1 -1
- package/src/nz/co/siliconst/ui5/metaui/openapi/heuristics/plugins/ProtobufVariantHeuristic.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/openapi/heuristics/plugins/ProtobufVariantHeuristic.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/openapi/heuristics/plugins/ProtobufVariantHeuristic.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/openapi/heuristics/plugins/ProtobufVariantHeuristic.ts +16 -12
- package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi2Parser-dbg.js +20 -12
- package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi2Parser-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi2Parser.d.ts +5 -5
- package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi2Parser.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi2Parser.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi2Parser.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi2Parser.ts +25 -17
- package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi3Parser-dbg.js +18 -11
- package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi3Parser-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi3Parser.d.ts +5 -5
- package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi3Parser.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi3Parser.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi3Parser.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi3Parser.ts +23 -16
- package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApiPropertyMapper-dbg.js +24 -100
- package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApiPropertyMapper-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApiPropertyMapper.d.ts +10 -74
- package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApiPropertyMapper.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApiPropertyMapper.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApiPropertyMapper.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApiPropertyMapper.ts +54 -117
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin-dbg.js +7 -4
- 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 +1 -1
- 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 +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 +6 -4
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin-dbg.js +4 -4
- 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 +1 -1
- 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 +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 +5 -5
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin-dbg.js +129 -9
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.d.ts +45 -4
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.ts +143 -13
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin-dbg.js +35 -14
- 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 +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 +38 -14
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin-dbg.js +2 -2
- 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 +1 -1
- 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 +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 +3 -3
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin-dbg.js +69 -20
- 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 +2 -1
- 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 +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 +77 -21
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin-dbg.js +2 -2
- 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 +1 -1
- 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 +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 +3 -3
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin-dbg.js +2 -2
- 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 +1 -1
- 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 +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 +3 -3
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DictionaryMapPlugin-dbg.js +1 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DictionaryMapPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DictionaryMapPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DictionaryMapPlugin.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DictionaryMapPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DictionaryMapPlugin.ts +6 -5
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin-dbg.js +8 -3
- 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 +1 -1
- 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 +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 +9 -4
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/EmailPlugin-dbg.js +2 -2
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/EmailPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/EmailPlugin.d.ts +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/EmailPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/EmailPlugin.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/EmailPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/EmailPlugin.ts +3 -3
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin-dbg.js +2 -2
- 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 +1 -1
- 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 +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 +3 -3
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin-dbg.js +2 -2
- 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 +1 -1
- 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 +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 +3 -3
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/LinkPlugin-dbg.js +2 -2
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/LinkPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/LinkPlugin.d.ts +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/LinkPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/LinkPlugin.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/LinkPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/LinkPlugin.ts +3 -3
- 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 +1 -1
- 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 +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiInputPlugin-dbg.js +6 -5
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiInputPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiInputPlugin.d.ts +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiInputPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiInputPlugin.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiInputPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiInputPlugin.ts +9 -8
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin-dbg.js +2 -2
- 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 +1 -1
- 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 +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 +3 -3
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin-dbg.js +35 -20
- 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 +1 -1
- 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 +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 +39 -22
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin-dbg.js +5 -3
- 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 +1 -1
- 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 +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 +4 -3
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/PasswordPlugin-dbg.js +2 -2
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/PasswordPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/PasswordPlugin.d.ts +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/PasswordPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/PasswordPlugin.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/PasswordPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/PasswordPlugin.ts +3 -3
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin-dbg.js +2 -2
- 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 +1 -1
- 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 +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 +3 -3
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ReferencePlugin-dbg.js +28 -12
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ReferencePlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ReferencePlugin.d.ts +5 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ReferencePlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ReferencePlugin.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ReferencePlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ReferencePlugin.ts +29 -10
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin-dbg.js +2 -2
- 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 +1 -1
- 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 +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 +3 -3
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin-dbg.js +2 -2
- 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 +1 -1
- 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 +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 +3 -3
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin-dbg.js +2 -2
- 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 +1 -1
- 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 +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 +3 -3
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StepInputPlugin-dbg.js +13 -3
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StepInputPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StepInputPlugin.d.ts +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StepInputPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StepInputPlugin.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StepInputPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StepInputPlugin.ts +14 -5
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin-dbg.js +2 -2
- 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 +1 -1
- 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 +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 +3 -3
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin-dbg.js +2 -2
- 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 +1 -1
- 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 +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 +3 -3
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin-dbg.js +58 -56
- 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 +2 -5
- 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 +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 +66 -55
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin-dbg.js +2 -2
- 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 +1 -1
- 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 +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 +3 -3
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin-dbg.js +2 -2
- 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 +1 -1
- 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 +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 +3 -3
- package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/LiveSearchPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/LiveSearchPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/LiveSearchPlugin.ts +110 -109
- package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/ODataListBindingPlugin-dbg.js +2 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/ODataListBindingPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/ODataListBindingPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/ODataListBindingPlugin.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/ODataListBindingPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/ODataListBindingPlugin.ts +66 -64
- package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteDropdownPlugin-dbg.js +29 -8
- package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteDropdownPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteDropdownPlugin.d.ts +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteDropdownPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteDropdownPlugin.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteDropdownPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteDropdownPlugin.ts +145 -118
- package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteValueHelpPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteValueHelpPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteValueHelpPlugin.ts +106 -105
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/IsNotNullConditionPlugin-dbg.js +41 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/IsNotNullConditionPlugin-dbg.js.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/IsNotNullConditionPlugin.d.ts +24 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/IsNotNullConditionPlugin.d.ts.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/IsNotNullConditionPlugin.js +2 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/IsNotNullConditionPlugin.js.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/IsNotNullConditionPlugin.ts +34 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/IsNullConditionPlugin-dbg.js +41 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/IsNullConditionPlugin-dbg.js.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/IsNullConditionPlugin.d.ts +24 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/IsNullConditionPlugin.d.ts.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/IsNullConditionPlugin.js +2 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/IsNullConditionPlugin.js.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/IsNullConditionPlugin.ts +34 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/NumericGreaterThanConditionPlugin-dbg.js +52 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/NumericGreaterThanConditionPlugin-dbg.js.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/NumericGreaterThanConditionPlugin.d.ts +30 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/NumericGreaterThanConditionPlugin.d.ts.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/NumericGreaterThanConditionPlugin.js +2 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/NumericGreaterThanConditionPlugin.js.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/NumericGreaterThanConditionPlugin.ts +45 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/NumericLessThanConditionPlugin-dbg.js +52 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/NumericLessThanConditionPlugin-dbg.js.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/NumericLessThanConditionPlugin.d.ts +30 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/NumericLessThanConditionPlugin.d.ts.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/NumericLessThanConditionPlugin.js +2 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/NumericLessThanConditionPlugin.js.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/NumericLessThanConditionPlugin.ts +45 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/StringEqualsConditionPlugin-dbg.js +41 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/StringEqualsConditionPlugin-dbg.js.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/StringEqualsConditionPlugin.d.ts +24 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/StringEqualsConditionPlugin.d.ts.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/StringEqualsConditionPlugin.js +2 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/StringEqualsConditionPlugin.js.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/StringEqualsConditionPlugin.ts +34 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/EditableEffectPlugin-dbg.js +40 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/EditableEffectPlugin-dbg.js.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/EditableEffectPlugin.d.ts +28 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/EditableEffectPlugin.d.ts.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/EditableEffectPlugin.js +2 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/EditableEffectPlugin.js.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/EditableEffectPlugin.ts +34 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/RequirementEffectPlugin-dbg.js +40 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/RequirementEffectPlugin-dbg.js.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/RequirementEffectPlugin.d.ts +28 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/RequirementEffectPlugin.d.ts.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/RequirementEffectPlugin.js +2 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/RequirementEffectPlugin.js.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/RequirementEffectPlugin.ts +34 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/ValidityEffectPlugin-dbg.js +40 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/ValidityEffectPlugin-dbg.js.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/ValidityEffectPlugin.d.ts +28 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/ValidityEffectPlugin.d.ts.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/ValidityEffectPlugin.js +2 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/ValidityEffectPlugin.js.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/ValidityEffectPlugin.ts +34 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/VisibilityEffectPlugin-dbg.js +40 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/VisibilityEffectPlugin-dbg.js.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/VisibilityEffectPlugin.d.ts +28 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/VisibilityEffectPlugin.d.ts.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/VisibilityEffectPlugin.js +2 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/VisibilityEffectPlugin.js.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/VisibilityEffectPlugin.ts +34 -0
- package/src/nz/co/siliconst/ui5/metaui/services/SchemaProvider-dbg.js +33 -0
- package/src/nz/co/siliconst/ui5/metaui/services/SchemaProvider-dbg.js.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/services/SchemaProvider.d.ts +14 -0
- package/src/nz/co/siliconst/ui5/metaui/services/SchemaProvider.d.ts.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/services/SchemaProvider.js +2 -0
- package/src/nz/co/siliconst/ui5/metaui/services/SchemaProvider.js.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/services/SchemaProvider.ts +24 -0
- package/src/nz/co/siliconst/ui5/metaui/core/ConditionEngine-dbg.js +0 -75
- package/src/nz/co/siliconst/ui5/metaui/core/ConditionEngine-dbg.js.map +0 -1
- package/src/nz/co/siliconst/ui5/metaui/core/ConditionEngine.d.ts +0 -47
- package/src/nz/co/siliconst/ui5/metaui/core/ConditionEngine.d.ts.map +0 -1
- package/src/nz/co/siliconst/ui5/metaui/core/ConditionEngine.js +0 -2
- package/src/nz/co/siliconst/ui5/metaui/core/ConditionEngine.js.map +0 -1
- package/src/nz/co/siliconst/ui5/metaui/core/ConditionEngine.ts +0 -72
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Engine.js","names":["ConditionEngine","___ConditionEngine","PluginRegistry","___PluginRegistry","Logger","___utils_Logger","DefaultLayoutGenerator","___DefaultLayoutGenerator","Engine","conditionEngine","activePlugins","isEditable","hasPartialRenderingErrors","useMessageManager","constructor","editable","pluginRegistry","this","getInstance","build","schema","model","modelName","onSubmit","engineScopeId","onChange","activeModel","isValid","fieldKey","errorMessage","controlId","handleEvent","layoutStrategy","type","layoutManager","getLayout","render","error","msg","message","showErrorPopup","Text","text","generateField","fieldMeta","bindingPath","isTemplate","plugin","getPlugin","ui","widget","setEditable","setUseMessageManager","push","path","scopeId","undefined","control","registerPlugin","generateLayout","ensureLayout","warn","validateAll","applyVisualState","errors","item","result","validate","setVisualValidationState","replace","name","getPluginByPath","cleanPath","startsWith","match","find","p","destroy","messageManager","Messaging","existingMessages","getMessageModel","getData","messagesToRemove","targetPath","matched","filter","getTarget","getMessageProcessor","getId","length","removeMessages","__exports","__esModule"],"sources":["Engine.ts"],"sourcesContent":["/**\n * @file Engine.ts\n * @description The central orchestrator that routes data between the Layout Factory and Plugin Registry (v2).\n */\n\nimport { ISchema, IPropertyMetadata } from \"../interfaces/ISchema\";\nimport { ILayoutManager } from \"../interfaces/ILayoutManager\";\nimport { IPlugin, IPluginValidationResult } from \"../interfaces/IPlugin\";\nimport { ConditionEngine } from \"./ConditionEngine\";\nimport { PluginRegistry } from \"./PluginRegistry\";\nimport Control from \"sap/ui/core/Control\";\nimport VBox from \"sap/m/VBox\";\nimport Text from \"sap/m/Text\";\nimport { Logger } from \"../utils/Logger\";\nimport { DefaultLayoutGenerator } from \"./DefaultLayoutGenerator\";\nimport Core from \"sap/ui/core/Core\";\nimport Messaging from \"sap/ui/core/Messaging\";\n\n/**\n * The Engine is responsible for translating a normalized schema into a physical UI5 layout.\n * It delegates layout generation to the configured `LayoutManager` and field generation to the `PluginRegistry`.\n * It strictly routes execution flow and tracks active plugins for validation.\n * It embodies the \"Plugin-First Philosophy\" by routing all complex field and layout rendering\n * through discrete, decoupled plugins rather than handling native overrides.\n * \n * @namespace nz.co.siliconst.ui5.metaui.core\n * @public\n */\nexport class Engine {\n /** Handles dynamic conditional logic across the active form. */\n private conditionEngine: ConditionEngine | null = null;\n\n /** Array of all instantiated plugins generated during the current build. */\n private activePlugins: { plugin: IPlugin, path: string }[] = [];\n\n /** Deterministic scope ID injected by the host control to prevent clone collisions. */\n public engineScopeId?: string;\n\n private activeModel?: any;\n\n /** Reference to the GeneratorHost that instantiated this engine, for retrieving global definitions. */\n public host?: unknown;\n\n /** Callback to notify the host that an internal field changed. */\n public onChange?: (isValid: boolean, fieldKey?: string, errorMessage?: string, controlId?: string) => void;\n\n /** Tracks whether the entire engine is running in Editable mode. */\n public readonly isEditable: boolean = true;\n\n /** Tracks if any fields or sub-layouts failed to render, requiring a warning strip. */\n public hasPartialRenderingErrors: boolean = false;\n\n /** Tracks whether the engine should delegate visual state to the global MessageManager. */\n public readonly useMessageManager: boolean = false;\n\n /** The injected PluginRegistry instance */\n public readonly pluginRegistry: PluginRegistry;\n\n /**\n * Initializes a new Engine instance.\n * @param editable Whether the engine should render form fields as editable or read-only.\n * @param useMessageManager Whether to delegate visual state to UI5 MessageManager.\n * @param pluginRegistry Optional injected plugin registry. Defaults to singleton.\n */\n constructor(editable: boolean = true, useMessageManager: boolean = false, pluginRegistry?: PluginRegistry) {\n this.isEditable = editable;\n this.useMessageManager = useMessageManager;\n this.pluginRegistry = pluginRegistry || PluginRegistry.getInstance();\n }\n\n /**\n * Bootstraps the layout generation process by resolving the correct layout strategy.\n * \n * @param schema The normalized JSON schema representing the view.\n * @param model The active StateManager JSONModel instance.\n * @param modelName The UI5 model alias used for isolation.\n * @param onSubmit Callback fired when form is submitted.\n * @param engineScopeId Deterministic scope ID for this engine instance.\n * @param onChange Callback fired when field values change.\n * @returns The generated root UI5 Control container.\n */\n public build(schema: ISchema, model: any, modelName: string = \"meta\", onSubmit?: () => void, engineScopeId?: string, onChange?: (isValid: boolean, fieldKey?: string, errorMessage?: string, controlId?: string) => void): Control {\n this.conditionEngine = new ConditionEngine(schema);\n this.activePlugins = [];\n this.activeModel = model;\n this.engineScopeId = engineScopeId;\n this.onChange = (isValid: boolean, fieldKey?: string, errorMessage?: string, controlId?: string) => {\n if (this.conditionEngine && fieldKey) {\n this.conditionEngine.handleEvent(fieldKey, isValid);\n }\n if (onChange) {\n onChange(isValid, fieldKey, errorMessage, controlId);\n }\n };\n\n try {\n const layoutStrategy = schema.layoutStrategy || (schema.type === \"array\" ? \"table\" : \"form\");\n const layoutManager = this.pluginRegistry.getLayout(layoutStrategy);\n\n return layoutManager.render(schema, modelName, this, onSubmit);\n } catch (error) {\n this.hasPartialRenderingErrors = true;\n const msg = (error as Error).message;\n Logger.error(\"[MetaUI Engine] Critical error during layout generation\", msg);\n Logger.showErrorPopup(`Engine failed to generate the layout.\\n\\nDetails: ${msg}`);\n return new Text({ text: \"Critical Layout Error\" });\n }\n }\n\n /**\n * Instantiates the correct plugin for a specific field based on type and widget hints,\n * and tracks the plugin for global validation.\n * \n * @param fieldMeta The metadata schema specific to the field.\n * @param bindingPath The JSON path representing the field within the payload.\n * @param modelName The UI5 JSONModel name used for data binding.\n * @returns The generated UI5 Control for the field.\n */\n public generateField(fieldMeta: IPropertyMetadata, bindingPath: string, modelName: string, isTemplate: boolean = false): Control {\n try {\n const plugin = this.pluginRegistry.getPlugin(fieldMeta.type || \"string\", fieldMeta.ui?.widget);\n if (typeof plugin.setEditable === \"function\") {\n plugin.setEditable(this.isEditable);\n }\n\n if (typeof plugin.setUseMessageManager === \"function\") {\n plugin.setUseMessageManager(this.useMessageManager);\n }\n\n if (!isTemplate) {\n this.activePlugins.push({ plugin, path: bindingPath });\n }\n const scopeId = isTemplate ? undefined : this.engineScopeId;\n const control = plugin.render(fieldMeta, bindingPath, modelName, scopeId, this.onChange, this.activeModel);\n\n if (this.conditionEngine) {\n this.conditionEngine.registerPlugin(bindingPath, plugin);\n }\n\n return control;\n } catch (error) {\n this.hasPartialRenderingErrors = true;\n const msg = (error as Error).message;\n Logger.error(`[MetaUI Engine] Failed to generate field at ${bindingPath}`, msg);\n Logger.showErrorPopup(`Failed to generate field '${bindingPath}'.\\n\\nDetails: ${msg}`);\n return new Text({ text: `[Error generating field ${bindingPath}]` });\n }\n }\n\n /**\n * Generates a sub-layout (like an embedded table or nested form) without \n * destroying the current Engine state or Condition tracking.\n * \n * @param schema The normalized JSON schema representing the view.\n * @param modelName The UI5 JSONModel name used for data binding (defaults to \"meta\").\n * @param bindingPath Optional path to bind the sub-layout to a specific array/object property.\n * @returns The generated root UI5 Control container.\n */\n public generateLayout(schema: ISchema, modelName: string, bindingPath?: string): Control {\n try {\n if (DefaultLayoutGenerator.ensureLayout(schema)) {\n Logger.warn(`[MetaUI Engine] Missing 'uiLayout' array in sub-schema for ${bindingPath}. Synthesized a default layout mapping.`);\n }\n\n const layoutStrategy = schema.layoutStrategy || (schema.type === \"array\" ? \"table\" : \"form\");\n const layoutManager = this.pluginRegistry.getLayout(layoutStrategy);\n return layoutManager.render(schema, modelName, this, undefined, bindingPath);\n } catch (error) {\n this.hasPartialRenderingErrors = true;\n const msg = (error as Error).message;\n Logger.error(`[MetaUI Engine] Critical error generating sub-layout for ${bindingPath}`, msg);\n Logger.showErrorPopup(`Engine failed to generate a sub-layout.\\n\\nDetails: ${msg}`);\n return new Text({ text: \"Critical Sub-Layout Error\" });\n }\n }\n\n /**\n * Iterates through all active plugins and triggers their internal validation pipelines.\n * \n * @param applyVisualState If true, explicitly instructs the plugin to natively paint its own ValueState.\n * @returns {IPluginValidationResult[]} Array of validation error objects. Empty array if valid.\n */\n public validateAll(applyVisualState: boolean = false): IPluginValidationResult[] {\n const errors: IPluginValidationResult[] = [];\n for (const item of this.activePlugins) {\n try {\n const result = item.plugin.validate();\n if (applyVisualState && typeof item.plugin.setVisualValidationState === \"function\") {\n item.plugin.setVisualValidationState(result.isValid, result.errorMessage);\n }\n\n if (!result.isValid) {\n // Ensure the path is bound to the error so GeneratorHost knows where to target it\n result.fieldKey = result.fieldKey || item.path.replace(/^\\//, \"\");\n errors.push(result);\n // Add console log to find which plugin fails silently\n Logger.error(\"[MetaUI Validation] Plugin failed validation silently:\", item.path || item.plugin.constructor.name);\n }\n } catch (error) {\n Logger.error(`[MetaUI Engine] Error validating plugin at ${item.path}`, (error as Error).message);\n }\n }\n return errors;\n }\n\n /**\n * Retrieves an active plugin instance by its absolute binding path.\n * Useful for programmatic field manipulation (e.g., custom error injection).\n * \n * @param path The binding path (e.g. \"/General/CustomerName\").\n * @returns {IPlugin | undefined} The plugin instance, or undefined if not found.\n */\n public getPluginByPath(path: string): import(\"../interfaces/IPlugin\").IPlugin | undefined {\n const cleanPath = path.startsWith(\"/\") ? path : `/${path}`;\n const match = this.activePlugins.find(p => p.path === cleanPath || p.path === `/${cleanPath}`);\n return match ? match.plugin : undefined;\n }\n\n /**\n * Cleans up internal state and destroys the condition engine to prevent memory leaks.\n */\n public destroy(): void {\n if (this.conditionEngine) {\n this.conditionEngine.destroy();\n this.conditionEngine = null;\n }\n\n // ------------------------------------------------------------------------\n // Ghost Error Prevention\n // Flush MessageManager for active plugins before destroying their controls\n // ------------------------------------------------------------------------\n const messageManager = Messaging;\n const existingMessages = messageManager.getMessageModel().getData();\n const messagesToRemove: unknown[] = [];\n\n for (const item of this.activePlugins) {\n if (this.activeModel) {\n const targetPath = `/${item.path.replace(/^\\//, \"\")}`;\n const matched = (existingMessages as { getTarget: () => string, getMessageProcessor: () => { getId: () => string } }[]).filter(msg =>\n msg.getTarget() === targetPath && msg.getMessageProcessor() && msg.getMessageProcessor().getId() === this.activeModel!.getId()\n );\n messagesToRemove.push(...matched);\n }\n if (typeof item.plugin.destroy === \"function\") {\n item.plugin.destroy();\n }\n }\n\n if (messagesToRemove.length > 0) {\n messageManager.removeMessages(messagesToRemove);\n }\n\n this.activePlugins = [];\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"Engine.js","names":["PluginRegistry","___PluginRegistry","Logger","___utils_Logger","DefaultLayoutGenerator","___DefaultLayoutGenerator","GlobalPipeline","___PipelineManager","Engine","activePlugins","templatePlugins","validationLedger","Map","isEditable","hasPartialRenderingErrors","useMessageManager","constructor","editable","pluginRegistry","this","getInstance","build","schema","model","modelName","onSubmit","engineScopeId","onChange","activeModel","isValid","fieldKey","errorMessage","controlId","reportSchemaError","layoutStrategy","type","layoutManager","getLayout","render","error","msg","message","showErrorPopup","Text","text","generateField","fieldMeta","bindingPath","isTemplate","plugin","getPlugin","ui","widget","setEditable","setUseMessageManager","push","path","scopeId","undefined","control","generateLayout","ensureLayout","warn","validateAll","applyVisualState","errors","item","result","validate","replace","name","host","getStateManager","stateManager","payload","extractPayload","getSchema","getParsedSchema","arrayErrors","validatePayloadArrays","forEach","err","filter","e","onArrayMutated","arrayPath","clearArrayMessages","currentPath","properties","key","Object","keys","propSchema","childPath","items","Array","isArray","index","itemPath","propMeta","propPath","val","validatorsToRun","argsMap","required","maxLength","minLength","pattern","regex","minimum","maximum","min","max","format","length","res","executeValidation","fieldLabel","label","getPluginByPath","cleanPath","match","find","p","fieldPath","has","set","schemaError","policyError","get","resolveVisualState","reportPolicyError","ledgerEntry","isError","setVisualValidationState","setNativeControlError","targetPath","generatedContent","rootControl","traverseAndSetError","bindingInfos","getBindingInfo","info","parts","boundPath","endsWith","context","getBindingContext","activeModelName","fullPath","getPath","cleanedFullPath","setValueState","setValueStateText","getAggregation","getMetadata","aggs","getAggregations","aggName","child","c","destroy","clear","__exports","__esModule"],"sources":["Engine.ts"],"sourcesContent":["/**\n * @file Engine.ts\n * @description The central orchestrator that routes data between the Layout Factory and Plugin Registry (v2).\n */\n\nimport { ISchema, IPropertyMetadata } from \"../interfaces/ISchema\";\nimport { ILayoutManager } from \"../interfaces/ILayoutManager\";\nimport { IPlugin, IPluginValidationResult } from \"../interfaces/IPlugin\";\n\nimport { PluginRegistry } from \"./PluginRegistry\";\nimport Control from \"sap/ui/core/Control\";\nimport VBox from \"sap/m/VBox\";\nimport Text from \"sap/m/Text\";\nimport { Logger } from \"../utils/Logger\";\nimport { DefaultLayoutGenerator } from \"./DefaultLayoutGenerator\";\nimport Core from \"sap/ui/core/Core\";\nimport Messaging from \"sap/ui/core/Messaging\";\nimport { GlobalPipeline } from \"./PipelineManager\";\n\n/**\n * The Engine is responsible for translating a normalized schema into a physical UI5 layout.\n * It delegates layout generation to the configured `LayoutManager` and field generation to the `PluginRegistry`.\n * It strictly routes execution flow and tracks active plugins for validation.\n * It embodies the \"Plugin-First Philosophy\" by routing all complex field and layout rendering\n * through discrete, decoupled plugins rather than handling native overrides.\n * \n * @namespace nz.co.siliconst.ui5.metaui.core\n * @public\n */\nexport class Engine {\n\n\n /** Array of all instantiated plugins generated during the current build. */\n private activePlugins: { plugin: IPlugin, path: string }[] = [];\n\n /** Array of template plugins generated for table rows to prevent memory leaks during destruction. */\n private templatePlugins: { plugin: IPlugin, path: string }[] = [];\n\n /** Deterministic scope ID injected by the host control to prevent clone collisions. */\n public engineScopeId?: string;\n\n private activeModel?: unknown;\n\n /** Ledger tracking local vs cross-field errors to prevent visual race conditions. */\n private validationLedger: Map<string, { schemaError: string | null, policyError: string | null }> = new Map();\n\n /** Reference to the GeneratorHost that instantiated this engine, for retrieving global definitions. */\n public host?: unknown;\n\n /** Callback to notify the host that an internal field changed. */\n public onChange?: (isValid: boolean, fieldKey?: string, errorMessage?: string, controlId?: string) => void;\n\n /** Tracks whether the entire engine is running in Editable mode. */\n public readonly isEditable: boolean = true;\n\n /** Tracks if any fields or sub-layouts failed to render, requiring a warning strip. */\n public hasPartialRenderingErrors: boolean = false;\n\n /** Tracks whether the engine should delegate visual state to the global MessageManager. */\n public readonly useMessageManager: boolean = false;\n\n /** The injected PluginRegistry instance */\n public readonly pluginRegistry: PluginRegistry;\n\n /**\n * Initializes a new Engine instance.\n * @param editable Whether the engine should render form fields as editable or read-only.\n * @param useMessageManager Whether to delegate visual state to UI5 MessageManager.\n * @param pluginRegistry Optional injected plugin registry. Defaults to singleton.\n */\n constructor(editable: boolean = true, useMessageManager: boolean = false, pluginRegistry?: PluginRegistry) {\n this.isEditable = editable;\n this.useMessageManager = useMessageManager;\n this.pluginRegistry = pluginRegistry || PluginRegistry.getInstance();\n }\n\n /**\n * Bootstraps the layout generation process by resolving the correct layout strategy.\n * \n * @param schema The normalized JSON schema representing the view.\n * @param model The active StateManager JSONModel instance.\n * @param modelName The UI5 model alias used for isolation.\n * @param onSubmit Callback fired when form is submitted.\n * @param engineScopeId Deterministic scope ID for this engine instance.\n * @param onChange Callback fired when field values change.\n * @returns The generated root UI5 Control container.\n */\n public build(schema: ISchema, model: unknown, modelName: string = \"meta\", onSubmit?: () => void, engineScopeId?: string, onChange?: (isValid: boolean, fieldKey?: string, errorMessage?: string, controlId?: string) => void): Control {\n\n this.activePlugins = [];\n this.activeModel = model;\n this.engineScopeId = engineScopeId;\n this.onChange = (isValid: boolean, fieldKey?: string, errorMessage?: string, controlId?: string) => {\n if (fieldKey) {\n this.reportSchemaError(fieldKey, isValid ? null : errorMessage || \"Invalid input\");\n }\n\n if (onChange) {\n onChange(isValid, fieldKey, errorMessage, controlId);\n }\n };\n\n try {\n const layoutStrategy = schema.layoutStrategy || (schema.type === \"array\" ? \"table\" : \"form\");\n const layoutManager = this.pluginRegistry.getLayout(layoutStrategy);\n\n return layoutManager.render(schema, modelName, this, onSubmit);\n } catch (error) {\n this.hasPartialRenderingErrors = true;\n const msg = (error as Error).message;\n Logger.error(\"[MetaUI Engine] Critical error during layout generation\", msg);\n Logger.showErrorPopup(`Engine failed to generate the layout.\\n\\nDetails: ${msg}`);\n return new Text({ text: \"Critical Layout Error\" });\n }\n }\n\n /**\n * Instantiates the correct plugin for a specific field based on type and widget hints,\n * and tracks the plugin for global validation.\n * \n * @param fieldMeta The metadata schema specific to the field.\n * @param bindingPath The JSON path representing the field within the payload.\n * @param modelName The UI5 JSONModel name used for data binding.\n * @returns The generated UI5 Control for the field.\n */\n public generateField(fieldMeta: IPropertyMetadata, bindingPath: string, modelName: string, isTemplate: boolean = false): Control {\n try {\n const plugin = this.pluginRegistry.getPlugin(fieldMeta.type || \"string\", fieldMeta.ui?.widget);\n if (typeof plugin.setEditable === \"function\") {\n plugin.setEditable(this.isEditable);\n }\n\n if (typeof plugin.setUseMessageManager === \"function\") {\n plugin.setUseMessageManager(this.useMessageManager);\n }\n\n if (!isTemplate) {\n this.activePlugins.push({ plugin, path: bindingPath });\n } else {\n this.templatePlugins.push({ plugin, path: bindingPath });\n }\n const scopeId = isTemplate ? undefined : this.engineScopeId;\n const control = plugin.render(fieldMeta, bindingPath, modelName, scopeId, this.onChange, this.activeModel);\n\n\n\n return control;\n } catch (error) {\n this.hasPartialRenderingErrors = true;\n const msg = (error as Error).message;\n Logger.error(`[MetaUI Engine] Failed to generate field at ${bindingPath}`, msg);\n Logger.showErrorPopup(`Failed to generate field '${bindingPath}'.\\n\\nDetails: ${msg}`);\n return new Text({ text: `[Error generating field ${bindingPath}]` });\n }\n }\n\n /**\n * Generates a sub-layout (like an embedded table or nested form) without \n * destroying the current Engine state or Condition tracking.\n * \n * @param schema The normalized JSON schema representing the view.\n * @param modelName The UI5 JSONModel name used for data binding (defaults to \"meta\").\n * @param bindingPath Optional path to bind the sub-layout to a specific array/object property.\n * @returns The generated root UI5 Control container.\n */\n public generateLayout(schema: ISchema, modelName: string, bindingPath?: string): Control {\n try {\n if (DefaultLayoutGenerator.ensureLayout(schema)) {\n Logger.warn(`[MetaUI Engine] Missing 'uiLayout' array in sub-schema for ${bindingPath}. Synthesized a default layout mapping.`);\n }\n\n const layoutStrategy = schema.layoutStrategy || (schema.type === \"array\" ? \"table\" : \"form\");\n const layoutManager = this.pluginRegistry.getLayout(layoutStrategy);\n return layoutManager.render(schema, modelName, this, undefined, bindingPath);\n } catch (error) {\n this.hasPartialRenderingErrors = true;\n const msg = (error as Error).message;\n Logger.error(`[MetaUI Engine] Critical error generating sub-layout for ${bindingPath}`, msg);\n Logger.showErrorPopup(`Engine failed to generate a sub-layout.\\n\\nDetails: ${msg}`);\n return new Text({ text: \"Critical Sub-Layout Error\" });\n }\n }\n\n /**\n * Iterates through all active plugins and triggers their internal validation pipelines.\n * \n * @param applyVisualState If true, explicitly instructs the plugin to natively paint its own ValueState.\n * @returns {IPluginValidationResult[]} Array of validation error objects. Empty array if valid.\n */\n public validateAll(applyVisualState: boolean = false): IPluginValidationResult[] {\n const errors: IPluginValidationResult[] = [];\n for (const item of this.activePlugins) {\n try {\n const result = item.plugin.validate();\n if (applyVisualState) {\n this.reportSchemaError(item.path, result.isValid ? null : result.errorMessage || \"Invalid input\");\n }\n\n if (!result.isValid) {\n // Ensure the path is bound to the error so GeneratorHost knows where to target it\n result.fieldKey = result.fieldKey || item.path.replace(/^\\//, \"\");\n errors.push(result);\n // Add console log to find which plugin fails silently\n Logger.error(\"[MetaUI Validation] Plugin failed validation silently:\", item.path || item.plugin.constructor.name);\n }\n } catch (error) {\n Logger.error(`[MetaUI Engine] Error validating plugin at ${item.path}`, (error as Error).message);\n }\n }\n\n // 2. Recursively validate arrays via StateManager payload traversing for Table layout rows\n if (this.host && typeof (this.host as any).getStateManager === \"function\") {\n const stateManager = (this.host as any).getStateManager();\n if (stateManager) {\n const payload = stateManager.extractPayload();\n const schema = stateManager.getSchema ? stateManager.getSchema() : (this.host as any).getParsedSchema?.();\n if (payload && schema) {\n const arrayErrors = this.validatePayloadArrays(schema, payload, \"\");\n if (applyVisualState) {\n arrayErrors.forEach(err => {\n if (err.fieldKey) {\n this.reportSchemaError(err.fieldKey, err.isValid ? null : err.errorMessage || \"Invalid input\");\n }\n });\n }\n errors.push(...arrayErrors.filter(e => !e.isValid));\n }\n }\n }\n\n return errors;\n }\n\n public onArrayMutated(arrayPath: string): void {\n if (this.host && typeof (this.host as any).getStateManager === \"function\") {\n const stateManager = (this.host as any).getStateManager();\n if (stateManager && typeof stateManager.clearArrayMessages === \"function\") {\n stateManager.clearArrayMessages(arrayPath);\n }\n }\n }\n\n private validatePayloadArrays(schema: any, payload: any, currentPath: string): IPluginValidationResult[] {\n const errors: IPluginValidationResult[] = [];\n if (!schema || !payload || typeof payload !== \"object\") return errors;\n\n if (schema.type === \"object\" && schema.properties) {\n for (const key of Object.keys(schema.properties)) {\n const propSchema = schema.properties[key];\n if (payload[key] !== undefined) {\n const childPath = currentPath ? `${currentPath}/${key}` : key;\n errors.push(...this.validatePayloadArrays(propSchema, payload[key], childPath));\n }\n }\n } else if (schema.type === \"array\" && schema.items && Array.isArray(payload)) {\n payload.forEach((item, index) => {\n const itemPath = currentPath ? `${currentPath}/${index}` : `${index}`;\n if (schema.items.type === \"object\" && schema.items.properties) {\n for (const key of Object.keys(schema.items.properties)) {\n const propMeta = schema.items.properties[key];\n const propPath = `${itemPath}/${key}`;\n const val = item ? item[key] : undefined;\n \n const validatorsToRun: string[] = [];\n const argsMap: Record<string, unknown> = {};\n\n if (propMeta.required) validatorsToRun.push(\"required\");\n if (propMeta.maxLength !== undefined) {\n validatorsToRun.push(\"maxLength\");\n argsMap[\"maxLength\"] = propMeta.maxLength;\n }\n if (propMeta.minLength !== undefined) {\n validatorsToRun.push(\"minLength\");\n argsMap[\"minLength\"] = propMeta.minLength;\n }\n if (propMeta.pattern !== undefined) {\n validatorsToRun.push(\"pattern\");\n argsMap[\"pattern\"] = { regex: propMeta.pattern };\n }\n if (propMeta.minimum !== undefined || propMeta.maximum !== undefined) {\n validatorsToRun.push(\"range\");\n argsMap[\"range\"] = { min: propMeta.minimum, max: propMeta.maximum };\n }\n const format = propMeta.ui?.format;\n if (format === \"email\" || format === \"url\" || format === \"iban\") {\n validatorsToRun.push(format);\n }\n \n if (validatorsToRun.length > 0) {\n const res = GlobalPipeline.executeValidation(val, validatorsToRun, argsMap);\n if (!res.isValid) {\n errors.push({\n isValid: false,\n errorMessage: res.errorMessage,\n fieldKey: propPath,\n fieldLabel: propMeta.ui?.label || key\n });\n } else {\n errors.push({ isValid: true, fieldKey: propPath }); // Push successful state to clear old errors\n }\n }\n }\n }\n });\n }\n return errors;\n }\n\n /**\n * Retrieves an active plugin instance by its absolute binding path.\n * Useful for programmatic field manipulation (e.g., custom error injection).\n * \n * @param path The binding path (e.g. \"/General/CustomerName\").\n * @returns {IPlugin | undefined} The plugin instance, or undefined if not found.\n */\n public getPluginByPath(path: string): import(\"../interfaces/IPlugin\").IPlugin | undefined {\n const cleanPath = path.replace(/^\\//, \"\");\n const match = this.activePlugins.find(p => p.path.replace(/^\\//, \"\") === cleanPath);\n return match ? match.plugin : undefined;\n }\n\n /**\n * Reports a localized schema validation error to the coordinator ledger.\n */\n public reportSchemaError(fieldPath: string, errorMessage: string | null): void {\n const cleanPath = fieldPath.replace(/^\\//, \"\");\n if (!this.validationLedger.has(cleanPath)) {\n this.validationLedger.set(cleanPath, { schemaError: null, policyError: null });\n }\n this.validationLedger.get(cleanPath)!.schemaError = errorMessage;\n this.resolveVisualState(cleanPath);\n }\n\n /**\n * Reports a cross-field policy error to the coordinator ledger.\n */\n public reportPolicyError(fieldPath: string, errorMessage: string | null): void {\n const cleanPath = fieldPath.replace(/^\\//, \"\");\n if (!this.validationLedger.has(cleanPath)) {\n this.validationLedger.set(cleanPath, { schemaError: null, policyError: null });\n }\n this.validationLedger.get(cleanPath)!.policyError = errorMessage;\n this.resolveVisualState(cleanPath);\n }\n\n /**\n * Computes the final visual state by checking both engines and applies it to the plugin.\n */\n private resolveVisualState(cleanPath: string): void {\n const plugin = this.getPluginByPath(cleanPath);\n const ledgerEntry = this.validationLedger.get(cleanPath);\n if (!ledgerEntry) return;\n\n const isError = ledgerEntry.policyError !== null || ledgerEntry.schemaError !== null;\n const errorMessage = ledgerEntry.policyError || ledgerEntry.schemaError;\n\n if (plugin && typeof plugin.setVisualValidationState === \"function\") {\n plugin.setVisualValidationState(!isError, isError ? errorMessage || undefined : undefined);\n } else {\n // Un-tracked template clones (Table Layout rows)\n this.setNativeControlError(cleanPath, isError ? errorMessage || undefined : undefined);\n }\n }\n\n private setNativeControlError(targetPath: string, errorMessage?: string): void {\n if (this.host && (this.host as any).generatedContent) {\n const rootControl = (this.host as any).generatedContent;\n this.traverseAndSetError(rootControl, targetPath, errorMessage);\n }\n }\n\n private traverseAndSetError(control: any, targetPath: string, errorMessage?: string): void {\n if (!control) return;\n \n const bindingInfos = [control.getBindingInfo(\"value\"), control.getBindingInfo(\"selectedKey\"), control.getBindingInfo(\"dateValue\"), control.getBindingInfo(\"selected\")];\n for (const info of bindingInfos) {\n if (info && info.parts && info.parts.length > 0) {\n const boundPath = info.parts[0].path;\n // UI5 relative bindings drop the leading slash in the context, but retain it in the path\n if (boundPath === targetPath || targetPath.endsWith(boundPath)) {\n // Ensure we match the exact row context path\n const context = control.getBindingContext((this.host as any).activeModelName);\n if (context) {\n const fullPath = context.getPath() + \"/\" + boundPath;\n const cleanedFullPath = fullPath.replace(/^\\//, \"\");\n if (cleanedFullPath === targetPath) {\n if (typeof control.setValueState === \"function\") {\n control.setValueState(errorMessage ? \"Error\" : \"None\");\n if (typeof control.setValueStateText === \"function\") {\n control.setValueStateText(errorMessage || \"\");\n }\n }\n }\n }\n }\n }\n }\n \n if (typeof control.getAggregation === \"function\" && typeof control.getMetadata === \"function\") {\n const aggs = control.getMetadata().getAggregations();\n for (const aggName in aggs) {\n const child = control.getAggregation(aggName);\n if (Array.isArray(child)) {\n child.forEach(c => this.traverseAndSetError(c, targetPath, errorMessage));\n } else if (child) {\n this.traverseAndSetError(child, targetPath, errorMessage);\n }\n }\n }\n }\n\n /**\n * Cleans up internal state and destroys the condition engine to prevent memory leaks.\n */\n public destroy(): void {\n\n\n for (const item of this.activePlugins) {\n if (typeof item.plugin.destroy === \"function\") {\n item.plugin.destroy();\n }\n }\n\n for (const item of this.templatePlugins) {\n if (typeof item.plugin.destroy === \"function\") {\n item.plugin.destroy();\n }\n }\n\n this.validationLedger.clear();\n this.activePlugins = [];\n this.templatePlugins = [];\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
import { ISchema, IPropertyMetadata } from "../interfaces/ISchema";
|
|
7
7
|
import { ILayoutManager } from "../interfaces/ILayoutManager";
|
|
8
8
|
import { IPlugin, IPluginValidationResult } from "../interfaces/IPlugin";
|
|
9
|
-
|
|
9
|
+
|
|
10
10
|
import { PluginRegistry } from "./PluginRegistry";
|
|
11
11
|
import Control from "sap/ui/core/Control";
|
|
12
12
|
import VBox from "sap/m/VBox";
|
|
@@ -15,6 +15,7 @@ import { Logger } from "../utils/Logger";
|
|
|
15
15
|
import { DefaultLayoutGenerator } from "./DefaultLayoutGenerator";
|
|
16
16
|
import Core from "sap/ui/core/Core";
|
|
17
17
|
import Messaging from "sap/ui/core/Messaging";
|
|
18
|
+
import { GlobalPipeline } from "./PipelineManager";
|
|
18
19
|
|
|
19
20
|
/**
|
|
20
21
|
* The Engine is responsible for translating a normalized schema into a physical UI5 layout.
|
|
@@ -27,16 +28,21 @@ import Messaging from "sap/ui/core/Messaging";
|
|
|
27
28
|
* @public
|
|
28
29
|
*/
|
|
29
30
|
export class Engine {
|
|
30
|
-
|
|
31
|
-
private conditionEngine: ConditionEngine | null = null;
|
|
31
|
+
|
|
32
32
|
|
|
33
33
|
/** Array of all instantiated plugins generated during the current build. */
|
|
34
34
|
private activePlugins: { plugin: IPlugin, path: string }[] = [];
|
|
35
35
|
|
|
36
|
+
/** Array of template plugins generated for table rows to prevent memory leaks during destruction. */
|
|
37
|
+
private templatePlugins: { plugin: IPlugin, path: string }[] = [];
|
|
38
|
+
|
|
36
39
|
/** Deterministic scope ID injected by the host control to prevent clone collisions. */
|
|
37
40
|
public engineScopeId?: string;
|
|
38
41
|
|
|
39
|
-
private activeModel?:
|
|
42
|
+
private activeModel?: unknown;
|
|
43
|
+
|
|
44
|
+
/** Ledger tracking local vs cross-field errors to prevent visual race conditions. */
|
|
45
|
+
private validationLedger: Map<string, { schemaError: string | null, policyError: string | null }> = new Map();
|
|
40
46
|
|
|
41
47
|
/** Reference to the GeneratorHost that instantiated this engine, for retrieving global definitions. */
|
|
42
48
|
public host?: unknown;
|
|
@@ -79,15 +85,16 @@ export class Engine {
|
|
|
79
85
|
* @param onChange Callback fired when field values change.
|
|
80
86
|
* @returns The generated root UI5 Control container.
|
|
81
87
|
*/
|
|
82
|
-
public build(schema: ISchema, model:
|
|
83
|
-
|
|
88
|
+
public build(schema: ISchema, model: unknown, modelName: string = "meta", onSubmit?: () => void, engineScopeId?: string, onChange?: (isValid: boolean, fieldKey?: string, errorMessage?: string, controlId?: string) => void): Control {
|
|
89
|
+
|
|
84
90
|
this.activePlugins = [];
|
|
85
91
|
this.activeModel = model;
|
|
86
92
|
this.engineScopeId = engineScopeId;
|
|
87
93
|
this.onChange = (isValid: boolean, fieldKey?: string, errorMessage?: string, controlId?: string) => {
|
|
88
|
-
if (
|
|
89
|
-
this.
|
|
94
|
+
if (fieldKey) {
|
|
95
|
+
this.reportSchemaError(fieldKey, isValid ? null : errorMessage || "Invalid input");
|
|
90
96
|
}
|
|
97
|
+
|
|
91
98
|
if (onChange) {
|
|
92
99
|
onChange(isValid, fieldKey, errorMessage, controlId);
|
|
93
100
|
}
|
|
@@ -129,13 +136,13 @@ export class Engine {
|
|
|
129
136
|
|
|
130
137
|
if (!isTemplate) {
|
|
131
138
|
this.activePlugins.push({ plugin, path: bindingPath });
|
|
139
|
+
} else {
|
|
140
|
+
this.templatePlugins.push({ plugin, path: bindingPath });
|
|
132
141
|
}
|
|
133
142
|
const scopeId = isTemplate ? undefined : this.engineScopeId;
|
|
134
143
|
const control = plugin.render(fieldMeta, bindingPath, modelName, scopeId, this.onChange, this.activeModel);
|
|
135
144
|
|
|
136
|
-
|
|
137
|
-
this.conditionEngine.registerPlugin(bindingPath, plugin);
|
|
138
|
-
}
|
|
145
|
+
|
|
139
146
|
|
|
140
147
|
return control;
|
|
141
148
|
} catch (error) {
|
|
@@ -185,8 +192,8 @@ export class Engine {
|
|
|
185
192
|
for (const item of this.activePlugins) {
|
|
186
193
|
try {
|
|
187
194
|
const result = item.plugin.validate();
|
|
188
|
-
if (applyVisualState
|
|
189
|
-
item.
|
|
195
|
+
if (applyVisualState) {
|
|
196
|
+
this.reportSchemaError(item.path, result.isValid ? null : result.errorMessage || "Invalid input");
|
|
190
197
|
}
|
|
191
198
|
|
|
192
199
|
if (!result.isValid) {
|
|
@@ -200,6 +207,102 @@ export class Engine {
|
|
|
200
207
|
Logger.error(`[MetaUI Engine] Error validating plugin at ${item.path}`, (error as Error).message);
|
|
201
208
|
}
|
|
202
209
|
}
|
|
210
|
+
|
|
211
|
+
// 2. Recursively validate arrays via StateManager payload traversing for Table layout rows
|
|
212
|
+
if (this.host && typeof (this.host as any).getStateManager === "function") {
|
|
213
|
+
const stateManager = (this.host as any).getStateManager();
|
|
214
|
+
if (stateManager) {
|
|
215
|
+
const payload = stateManager.extractPayload();
|
|
216
|
+
const schema = stateManager.getSchema ? stateManager.getSchema() : (this.host as any).getParsedSchema?.();
|
|
217
|
+
if (payload && schema) {
|
|
218
|
+
const arrayErrors = this.validatePayloadArrays(schema, payload, "");
|
|
219
|
+
if (applyVisualState) {
|
|
220
|
+
arrayErrors.forEach(err => {
|
|
221
|
+
if (err.fieldKey) {
|
|
222
|
+
this.reportSchemaError(err.fieldKey, err.isValid ? null : err.errorMessage || "Invalid input");
|
|
223
|
+
}
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
errors.push(...arrayErrors.filter(e => !e.isValid));
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
return errors;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
public onArrayMutated(arrayPath: string): void {
|
|
235
|
+
if (this.host && typeof (this.host as any).getStateManager === "function") {
|
|
236
|
+
const stateManager = (this.host as any).getStateManager();
|
|
237
|
+
if (stateManager && typeof stateManager.clearArrayMessages === "function") {
|
|
238
|
+
stateManager.clearArrayMessages(arrayPath);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
private validatePayloadArrays(schema: any, payload: any, currentPath: string): IPluginValidationResult[] {
|
|
244
|
+
const errors: IPluginValidationResult[] = [];
|
|
245
|
+
if (!schema || !payload || typeof payload !== "object") return errors;
|
|
246
|
+
|
|
247
|
+
if (schema.type === "object" && schema.properties) {
|
|
248
|
+
for (const key of Object.keys(schema.properties)) {
|
|
249
|
+
const propSchema = schema.properties[key];
|
|
250
|
+
if (payload[key] !== undefined) {
|
|
251
|
+
const childPath = currentPath ? `${currentPath}/${key}` : key;
|
|
252
|
+
errors.push(...this.validatePayloadArrays(propSchema, payload[key], childPath));
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
} else if (schema.type === "array" && schema.items && Array.isArray(payload)) {
|
|
256
|
+
payload.forEach((item, index) => {
|
|
257
|
+
const itemPath = currentPath ? `${currentPath}/${index}` : `${index}`;
|
|
258
|
+
if (schema.items.type === "object" && schema.items.properties) {
|
|
259
|
+
for (const key of Object.keys(schema.items.properties)) {
|
|
260
|
+
const propMeta = schema.items.properties[key];
|
|
261
|
+
const propPath = `${itemPath}/${key}`;
|
|
262
|
+
const val = item ? item[key] : undefined;
|
|
263
|
+
|
|
264
|
+
const validatorsToRun: string[] = [];
|
|
265
|
+
const argsMap: Record<string, unknown> = {};
|
|
266
|
+
|
|
267
|
+
if (propMeta.required) validatorsToRun.push("required");
|
|
268
|
+
if (propMeta.maxLength !== undefined) {
|
|
269
|
+
validatorsToRun.push("maxLength");
|
|
270
|
+
argsMap["maxLength"] = propMeta.maxLength;
|
|
271
|
+
}
|
|
272
|
+
if (propMeta.minLength !== undefined) {
|
|
273
|
+
validatorsToRun.push("minLength");
|
|
274
|
+
argsMap["minLength"] = propMeta.minLength;
|
|
275
|
+
}
|
|
276
|
+
if (propMeta.pattern !== undefined) {
|
|
277
|
+
validatorsToRun.push("pattern");
|
|
278
|
+
argsMap["pattern"] = { regex: propMeta.pattern };
|
|
279
|
+
}
|
|
280
|
+
if (propMeta.minimum !== undefined || propMeta.maximum !== undefined) {
|
|
281
|
+
validatorsToRun.push("range");
|
|
282
|
+
argsMap["range"] = { min: propMeta.minimum, max: propMeta.maximum };
|
|
283
|
+
}
|
|
284
|
+
const format = propMeta.ui?.format;
|
|
285
|
+
if (format === "email" || format === "url" || format === "iban") {
|
|
286
|
+
validatorsToRun.push(format);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
if (validatorsToRun.length > 0) {
|
|
290
|
+
const res = GlobalPipeline.executeValidation(val, validatorsToRun, argsMap);
|
|
291
|
+
if (!res.isValid) {
|
|
292
|
+
errors.push({
|
|
293
|
+
isValid: false,
|
|
294
|
+
errorMessage: res.errorMessage,
|
|
295
|
+
fieldKey: propPath,
|
|
296
|
+
fieldLabel: propMeta.ui?.label || key
|
|
297
|
+
});
|
|
298
|
+
} else {
|
|
299
|
+
errors.push({ isValid: true, fieldKey: propPath }); // Push successful state to clear old errors
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
});
|
|
305
|
+
}
|
|
203
306
|
return errors;
|
|
204
307
|
}
|
|
205
308
|
|
|
@@ -211,45 +314,121 @@ export class Engine {
|
|
|
211
314
|
* @returns {IPlugin | undefined} The plugin instance, or undefined if not found.
|
|
212
315
|
*/
|
|
213
316
|
public getPluginByPath(path: string): import("../interfaces/IPlugin").IPlugin | undefined {
|
|
214
|
-
const cleanPath = path.
|
|
215
|
-
const match = this.activePlugins.find(p => p.path
|
|
317
|
+
const cleanPath = path.replace(/^\//, "");
|
|
318
|
+
const match = this.activePlugins.find(p => p.path.replace(/^\//, "") === cleanPath);
|
|
216
319
|
return match ? match.plugin : undefined;
|
|
217
320
|
}
|
|
218
321
|
|
|
322
|
+
/**
|
|
323
|
+
* Reports a localized schema validation error to the coordinator ledger.
|
|
324
|
+
*/
|
|
325
|
+
public reportSchemaError(fieldPath: string, errorMessage: string | null): void {
|
|
326
|
+
const cleanPath = fieldPath.replace(/^\//, "");
|
|
327
|
+
if (!this.validationLedger.has(cleanPath)) {
|
|
328
|
+
this.validationLedger.set(cleanPath, { schemaError: null, policyError: null });
|
|
329
|
+
}
|
|
330
|
+
this.validationLedger.get(cleanPath)!.schemaError = errorMessage;
|
|
331
|
+
this.resolveVisualState(cleanPath);
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
/**
|
|
335
|
+
* Reports a cross-field policy error to the coordinator ledger.
|
|
336
|
+
*/
|
|
337
|
+
public reportPolicyError(fieldPath: string, errorMessage: string | null): void {
|
|
338
|
+
const cleanPath = fieldPath.replace(/^\//, "");
|
|
339
|
+
if (!this.validationLedger.has(cleanPath)) {
|
|
340
|
+
this.validationLedger.set(cleanPath, { schemaError: null, policyError: null });
|
|
341
|
+
}
|
|
342
|
+
this.validationLedger.get(cleanPath)!.policyError = errorMessage;
|
|
343
|
+
this.resolveVisualState(cleanPath);
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
/**
|
|
347
|
+
* Computes the final visual state by checking both engines and applies it to the plugin.
|
|
348
|
+
*/
|
|
349
|
+
private resolveVisualState(cleanPath: string): void {
|
|
350
|
+
const plugin = this.getPluginByPath(cleanPath);
|
|
351
|
+
const ledgerEntry = this.validationLedger.get(cleanPath);
|
|
352
|
+
if (!ledgerEntry) return;
|
|
353
|
+
|
|
354
|
+
const isError = ledgerEntry.policyError !== null || ledgerEntry.schemaError !== null;
|
|
355
|
+
const errorMessage = ledgerEntry.policyError || ledgerEntry.schemaError;
|
|
356
|
+
|
|
357
|
+
if (plugin && typeof plugin.setVisualValidationState === "function") {
|
|
358
|
+
plugin.setVisualValidationState(!isError, isError ? errorMessage || undefined : undefined);
|
|
359
|
+
} else {
|
|
360
|
+
// Un-tracked template clones (Table Layout rows)
|
|
361
|
+
this.setNativeControlError(cleanPath, isError ? errorMessage || undefined : undefined);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
private setNativeControlError(targetPath: string, errorMessage?: string): void {
|
|
366
|
+
if (this.host && (this.host as any).generatedContent) {
|
|
367
|
+
const rootControl = (this.host as any).generatedContent;
|
|
368
|
+
this.traverseAndSetError(rootControl, targetPath, errorMessage);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
private traverseAndSetError(control: any, targetPath: string, errorMessage?: string): void {
|
|
373
|
+
if (!control) return;
|
|
374
|
+
|
|
375
|
+
const bindingInfos = [control.getBindingInfo("value"), control.getBindingInfo("selectedKey"), control.getBindingInfo("dateValue"), control.getBindingInfo("selected")];
|
|
376
|
+
for (const info of bindingInfos) {
|
|
377
|
+
if (info && info.parts && info.parts.length > 0) {
|
|
378
|
+
const boundPath = info.parts[0].path;
|
|
379
|
+
// UI5 relative bindings drop the leading slash in the context, but retain it in the path
|
|
380
|
+
if (boundPath === targetPath || targetPath.endsWith(boundPath)) {
|
|
381
|
+
// Ensure we match the exact row context path
|
|
382
|
+
const context = control.getBindingContext((this.host as any).activeModelName);
|
|
383
|
+
if (context) {
|
|
384
|
+
const fullPath = context.getPath() + "/" + boundPath;
|
|
385
|
+
const cleanedFullPath = fullPath.replace(/^\//, "");
|
|
386
|
+
if (cleanedFullPath === targetPath) {
|
|
387
|
+
if (typeof control.setValueState === "function") {
|
|
388
|
+
control.setValueState(errorMessage ? "Error" : "None");
|
|
389
|
+
if (typeof control.setValueStateText === "function") {
|
|
390
|
+
control.setValueStateText(errorMessage || "");
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
if (typeof control.getAggregation === "function" && typeof control.getMetadata === "function") {
|
|
400
|
+
const aggs = control.getMetadata().getAggregations();
|
|
401
|
+
for (const aggName in aggs) {
|
|
402
|
+
const child = control.getAggregation(aggName);
|
|
403
|
+
if (Array.isArray(child)) {
|
|
404
|
+
child.forEach(c => this.traverseAndSetError(c, targetPath, errorMessage));
|
|
405
|
+
} else if (child) {
|
|
406
|
+
this.traverseAndSetError(child, targetPath, errorMessage);
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
|
|
219
412
|
/**
|
|
220
413
|
* Cleans up internal state and destroys the condition engine to prevent memory leaks.
|
|
221
414
|
*/
|
|
222
415
|
public destroy(): void {
|
|
223
|
-
if (this.conditionEngine) {
|
|
224
|
-
this.conditionEngine.destroy();
|
|
225
|
-
this.conditionEngine = null;
|
|
226
|
-
}
|
|
227
416
|
|
|
228
|
-
// ------------------------------------------------------------------------
|
|
229
|
-
// Ghost Error Prevention
|
|
230
|
-
// Flush MessageManager for active plugins before destroying their controls
|
|
231
|
-
// ------------------------------------------------------------------------
|
|
232
|
-
const messageManager = Messaging;
|
|
233
|
-
const existingMessages = messageManager.getMessageModel().getData();
|
|
234
|
-
const messagesToRemove: unknown[] = [];
|
|
235
417
|
|
|
236
418
|
for (const item of this.activePlugins) {
|
|
237
|
-
if (this.activeModel) {
|
|
238
|
-
const targetPath = `/${item.path.replace(/^\//, "")}`;
|
|
239
|
-
const matched = (existingMessages as { getTarget: () => string, getMessageProcessor: () => { getId: () => string } }[]).filter(msg =>
|
|
240
|
-
msg.getTarget() === targetPath && msg.getMessageProcessor() && msg.getMessageProcessor().getId() === this.activeModel!.getId()
|
|
241
|
-
);
|
|
242
|
-
messagesToRemove.push(...matched);
|
|
243
|
-
}
|
|
244
419
|
if (typeof item.plugin.destroy === "function") {
|
|
245
420
|
item.plugin.destroy();
|
|
246
421
|
}
|
|
247
422
|
}
|
|
248
423
|
|
|
249
|
-
|
|
250
|
-
|
|
424
|
+
for (const item of this.templatePlugins) {
|
|
425
|
+
if (typeof item.plugin.destroy === "function") {
|
|
426
|
+
item.plugin.destroy();
|
|
427
|
+
}
|
|
251
428
|
}
|
|
252
429
|
|
|
430
|
+
this.validationLedger.clear();
|
|
253
431
|
this.activePlugins = [];
|
|
432
|
+
this.templatePlugins = [];
|
|
254
433
|
}
|
|
255
434
|
}
|
|
@@ -44,10 +44,12 @@ sap.ui.define(["./SchemaNormalizer", "../constants/MetaUIConstants"], function (
|
|
|
44
44
|
if (isInlineObject && meta.properties) {
|
|
45
45
|
// Transform this Control into a Group containing its properties
|
|
46
46
|
const newGroup = {
|
|
47
|
+
...element,
|
|
47
48
|
type: "Group",
|
|
48
|
-
label: meta.ui?.label || bindingPath.split("/").pop(),
|
|
49
|
+
label: element.label || meta.ui?.label || bindingPath.split("/").pop(),
|
|
49
50
|
elements: []
|
|
50
51
|
};
|
|
52
|
+
delete newGroup.scope;
|
|
51
53
|
|
|
52
54
|
// Add all child properties as controls
|
|
53
55
|
for (const childKey of Object.keys(meta.properties)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LayoutMutator-dbg.js","names":["SchemaNormalizer","___SchemaNormalizer","RENDER_MODE","___constants_MetaUIConstants","SCHEMA_TYPE","LayoutMutator","apply","schema","uiLayout","Array","isArray","expandElements","elements","rootSchema","expanded","element","type","push","scope","meta","bindingPath","resolveScope","hasExplicitWidget","ui","widget","isInlineObject","OBJECT","renderMode","INLINE","properties","newGroup","label","split","pop","childKey","Object","keys","e","__exports","__esModule"],"sources":["LayoutMutator.ts"],"sourcesContent":["/**\n * @file LayoutMutator.ts\n * @description Intercepts the generated schema before rendering to dynamically mutate the UI layout based on inline rendering rules.\n */\n\nimport { ISchema, ILayoutElement } from \"../interfaces/ISchema\";\nimport { SchemaNormalizer } from \"./SchemaNormalizer\";\nimport { RENDER_MODE, SCHEMA_TYPE } from \"../constants/MetaUIConstants\";\n\nexport class LayoutMutator {\n /**\n * Mutates the `uiLayout` array to expand nested inline objects into native Groups.\n * @param schema The normalized root schema.\n */\n public static apply(schema: ISchema): void {\n if (!schema || !schema.uiLayout || !Array.isArray(schema.uiLayout)) {\n return; // No layout to mutate\n }\n\n schema.uiLayout = this.expandElements(schema.uiLayout, schema);\n }\n\n private static expandElements(elements: ILayoutElement[], rootSchema: ISchema): ILayoutElement[] {\n const expanded: ILayoutElement[] = [];\n\n for (const element of elements) {\n if (element.type === \"Group\") {\n // Recursively expand group elements\n if (element.elements) {\n element.elements = this.expandElements(element.elements, rootSchema);\n }\n expanded.push(element);\n } else if (element.type === \"Control\") {\n if (!element.scope) {\n expanded.push(element);\n continue;\n }\n // Resolve the schema to see if this control points to an inline object\n try {\n const { meta, bindingPath } = SchemaNormalizer.resolveScope(rootSchema, element.scope);\n \n const hasExplicitWidget = !!meta?.ui?.widget;\n const isInlineObject = meta?.type === SCHEMA_TYPE.OBJECT && meta.ui?.renderMode === RENDER_MODE.INLINE && !hasExplicitWidget;\n\n if (isInlineObject && meta.properties) {\n // Transform this Control into a Group containing its properties\n const newGroup: ILayoutElement = {\n type: \"Group\",\n label: meta.ui?.label || bindingPath.split(\"/\").pop(),\n elements: []\n };\n\n // Add all child properties as controls\n for (const childKey of Object.keys(meta.properties)) {\n newGroup.elements!.push({\n type: \"Control\",\n scope: `${element.scope}/properties/${childKey}`\n });\n }\n\n // Recursively expand this new group in case it contains further inline objects\n newGroup.elements = this.expandElements(newGroup.elements!, rootSchema);\n \n expanded.push(newGroup);\n } else {\n // Scalar control, keep as is\n expanded.push(element);\n }\n } catch (e) {\n // Scope not found, keep element to let normal error handling report it\n expanded.push(element);\n }\n } else {\n expanded.push(element);\n }\n }\n\n return expanded;\n }\n}\n"],"mappings":";;;EAAA;AACA;AACA;AACA;EAHA,MAMSA,gBAAgB,GAAAC,mBAAA;EAAA,MAChBC,WAAW,GAAAC,4BAAA;EAAA,MAAEC,WAAW,GAAAD,4BAAA;EAE1B,MAAME,aAAa,CAAC;IACvB;AACJ;AACA;AACA;IACI,OAAcC,KAAKA,CAACC,MAAe,EAAQ;MACvC,IAAI,CAACA,MAAM,IAAI,CAACA,MAAM,CAACC,QAAQ,IAAI,CAACC,KAAK,CAACC,OAAO,CAACH,MAAM,CAACC,QAAQ,CAAC,EAAE;QAChE,OAAO,CAAC;MACZ;MAEAD,MAAM,CAACC,QAAQ,GAAG,IAAI,CAACG,cAAc,CAACJ,MAAM,CAACC,QAAQ,EAAED,MAAM,CAAC;IAClE;IAEA,OAAeI,cAAcA,CAACC,QAA0B,EAAEC,UAAmB,EAAoB;MAC7F,MAAMC,QAA0B,GAAG,EAAE;MAErC,KAAK,MAAMC,OAAO,IAAIH,QAAQ,EAAE;QAC5B,IAAIG,OAAO,CAACC,IAAI,KAAK,OAAO,EAAE;UAC1B;UACA,IAAID,OAAO,CAACH,QAAQ,EAAE;YAClBG,OAAO,CAACH,QAAQ,GAAG,IAAI,CAACD,cAAc,CAACI,OAAO,CAACH,QAAQ,EAAEC,UAAU,CAAC;UACxE;UACAC,QAAQ,CAACG,IAAI,CAACF,OAAO,CAAC;QAC1B,CAAC,MAAM,IAAIA,OAAO,CAACC,IAAI,KAAK,SAAS,EAAE;UACnC,IAAI,CAACD,OAAO,CAACG,KAAK,EAAE;YAChBJ,QAAQ,CAACG,IAAI,CAACF,OAAO,CAAC;YACtB;UACJ;UACA;UACA,IAAI;YACA,MAAM;cAAEI,IAAI;cAAEC;YAAY,CAAC,GAAGpB,gBAAgB,CAACqB,YAAY,CAACR,UAAU,EAAEE,OAAO,CAACG,KAAK,CAAC;YAEtF,MAAMI,iBAAiB,GAAG,CAAC,CAACH,IAAI,EAAEI,EAAE,EAAEC,MAAM;YAC5C,MAAMC,cAAc,GAAGN,IAAI,EAAEH,IAAI,KAAKZ,WAAW,CAACsB,MAAM,IAAIP,IAAI,CAACI,EAAE,EAAEI,UAAU,KAAKzB,WAAW,CAAC0B,MAAM,IAAI,CAACN,iBAAiB;YAE5H,IAAIG,cAAc,IAAIN,IAAI,CAACU,UAAU,EAAE;cACnC;cACA,MAAMC,QAAwB,GAAG;
|
|
1
|
+
{"version":3,"file":"LayoutMutator-dbg.js","names":["SchemaNormalizer","___SchemaNormalizer","RENDER_MODE","___constants_MetaUIConstants","SCHEMA_TYPE","LayoutMutator","apply","schema","uiLayout","Array","isArray","expandElements","elements","rootSchema","expanded","element","type","push","scope","meta","bindingPath","resolveScope","hasExplicitWidget","ui","widget","isInlineObject","OBJECT","renderMode","INLINE","properties","newGroup","label","split","pop","childKey","Object","keys","e","__exports","__esModule"],"sources":["LayoutMutator.ts"],"sourcesContent":["/**\n * @file LayoutMutator.ts\n * @description Intercepts the generated schema before rendering to dynamically mutate the UI layout based on inline rendering rules.\n */\n\nimport { ISchema, ILayoutElement } from \"../interfaces/ISchema\";\nimport { SchemaNormalizer } from \"./SchemaNormalizer\";\nimport { RENDER_MODE, SCHEMA_TYPE } from \"../constants/MetaUIConstants\";\n\nexport class LayoutMutator {\n /**\n * Mutates the `uiLayout` array to expand nested inline objects into native Groups.\n * @param schema The normalized root schema.\n */\n public static apply(schema: ISchema): void {\n if (!schema || !schema.uiLayout || !Array.isArray(schema.uiLayout)) {\n return; // No layout to mutate\n }\n\n schema.uiLayout = this.expandElements(schema.uiLayout, schema);\n }\n\n private static expandElements(elements: ILayoutElement[], rootSchema: ISchema): ILayoutElement[] {\n const expanded: ILayoutElement[] = [];\n\n for (const element of elements) {\n if (element.type === \"Group\") {\n // Recursively expand group elements\n if (element.elements) {\n element.elements = this.expandElements(element.elements, rootSchema);\n }\n expanded.push(element);\n } else if (element.type === \"Control\") {\n if (!element.scope) {\n expanded.push(element);\n continue;\n }\n // Resolve the schema to see if this control points to an inline object\n try {\n const { meta, bindingPath } = SchemaNormalizer.resolveScope(rootSchema, element.scope);\n \n const hasExplicitWidget = !!meta?.ui?.widget;\n const isInlineObject = meta?.type === SCHEMA_TYPE.OBJECT && meta.ui?.renderMode === RENDER_MODE.INLINE && !hasExplicitWidget;\n\n if (isInlineObject && meta.properties) {\n // Transform this Control into a Group containing its properties\n const newGroup: ILayoutElement = {\n ...element,\n type: \"Group\",\n label: element.label || meta.ui?.label || bindingPath.split(\"/\").pop(),\n elements: []\n };\n delete newGroup.scope;\n\n // Add all child properties as controls\n for (const childKey of Object.keys(meta.properties)) {\n newGroup.elements!.push({\n type: \"Control\",\n scope: `${element.scope}/properties/${childKey}`\n });\n }\n\n // Recursively expand this new group in case it contains further inline objects\n newGroup.elements = this.expandElements(newGroup.elements!, rootSchema);\n \n expanded.push(newGroup);\n } else {\n // Scalar control, keep as is\n expanded.push(element);\n }\n } catch (e) {\n // Scope not found, keep element to let normal error handling report it\n expanded.push(element);\n }\n } else {\n expanded.push(element);\n }\n }\n\n return expanded;\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LayoutMutator.d.ts","sourceRoot":"../../../../../../../..","sources":["src/nz/co/siliconst/ui5/metaui/core/LayoutMutator.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,+CAA+C,CAAC;IAC/D;;;OAGG;IAEH,OAAO,EAAE,OAAO,EAAkB,MAAM,+CAA+C,CAAC;IAIxF,MAAa,aAAa;QACtB;;;WAGG;eACW,KAAK,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI;QAQ1C,OAAO,CAAC,MAAM,CAAC,cAAc;
|
|
1
|
+
{"version":3,"file":"LayoutMutator.d.ts","sourceRoot":"../../../../../../../..","sources":["src/nz/co/siliconst/ui5/metaui/core/LayoutMutator.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,+CAA+C,CAAC;IAC/D;;;OAGG;IAEH,OAAO,EAAE,OAAO,EAAkB,MAAM,+CAA+C,CAAC;IAIxF,MAAa,aAAa;QACtB;;;WAGG;eACW,KAAK,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI;QAQ1C,OAAO,CAAC,MAAM,CAAC,cAAc;KA2DhC;CAEA"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
sap.ui.define(["./SchemaNormalizer","../constants/MetaUIConstants"],function(e,t){"use strict";const s=e["SchemaNormalizer"];const o=t["RENDER_MODE"];const n=t["SCHEMA_TYPE"];class p{static apply(e){if(!e||!e.uiLayout||!Array.isArray(e.uiLayout)){return}e.uiLayout=this.expandElements(e.uiLayout,e)}static expandElements(e,t){const p=[];for(const r of e){if(r.type==="Group"){if(r.elements){r.elements=this.expandElements(r.elements,t)}p.push(r)}else if(r.type==="Control"){if(!r.scope){p.push(r);continue}try{const{meta:e,bindingPath:i}=s.resolveScope(t,r.scope);const
|
|
1
|
+
sap.ui.define(["./SchemaNormalizer","../constants/MetaUIConstants"],function(e,t){"use strict";const s=e["SchemaNormalizer"];const o=t["RENDER_MODE"];const n=t["SCHEMA_TYPE"];class p{static apply(e){if(!e||!e.uiLayout||!Array.isArray(e.uiLayout)){return}e.uiLayout=this.expandElements(e.uiLayout,e)}static expandElements(e,t){const p=[];for(const r of e){if(r.type==="Group"){if(r.elements){r.elements=this.expandElements(r.elements,t)}p.push(r)}else if(r.type==="Control"){if(!r.scope){p.push(r);continue}try{const{meta:e,bindingPath:i}=s.resolveScope(t,r.scope);const a=!!e?.ui?.widget;const u=e?.type===n.OBJECT&&e.ui?.renderMode===o.INLINE&&!a;if(u&&e.properties){const s={...r,type:"Group",label:r.label||e.ui?.label||i.split("/").pop(),elements:[]};delete s.scope;for(const t of Object.keys(e.properties)){s.elements.push({type:"Control",scope:`${r.scope}/properties/${t}`})}s.elements=this.expandElements(s.elements,t);p.push(s)}else{p.push(r)}}catch(e){p.push(r)}}else{p.push(r)}}return p}}var r={__esModule:true};r.LayoutMutator=p;return r});
|
|
2
2
|
//# sourceMappingURL=LayoutMutator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LayoutMutator.js","names":["SchemaNormalizer","___SchemaNormalizer","RENDER_MODE","___constants_MetaUIConstants","SCHEMA_TYPE","LayoutMutator","apply","schema","uiLayout","Array","isArray","this","expandElements","elements","rootSchema","expanded","element","type","push","scope","meta","bindingPath","resolveScope","hasExplicitWidget","ui","widget","isInlineObject","OBJECT","renderMode","INLINE","properties","newGroup","label","split","pop","childKey","Object","keys","e","__exports","__esModule"],"sources":["LayoutMutator.ts"],"sourcesContent":["/**\n * @file LayoutMutator.ts\n * @description Intercepts the generated schema before rendering to dynamically mutate the UI layout based on inline rendering rules.\n */\n\nimport { ISchema, ILayoutElement } from \"../interfaces/ISchema\";\nimport { SchemaNormalizer } from \"./SchemaNormalizer\";\nimport { RENDER_MODE, SCHEMA_TYPE } from \"../constants/MetaUIConstants\";\n\nexport class LayoutMutator {\n /**\n * Mutates the `uiLayout` array to expand nested inline objects into native Groups.\n * @param schema The normalized root schema.\n */\n public static apply(schema: ISchema): void {\n if (!schema || !schema.uiLayout || !Array.isArray(schema.uiLayout)) {\n return; // No layout to mutate\n }\n\n schema.uiLayout = this.expandElements(schema.uiLayout, schema);\n }\n\n private static expandElements(elements: ILayoutElement[], rootSchema: ISchema): ILayoutElement[] {\n const expanded: ILayoutElement[] = [];\n\n for (const element of elements) {\n if (element.type === \"Group\") {\n // Recursively expand group elements\n if (element.elements) {\n element.elements = this.expandElements(element.elements, rootSchema);\n }\n expanded.push(element);\n } else if (element.type === \"Control\") {\n if (!element.scope) {\n expanded.push(element);\n continue;\n }\n // Resolve the schema to see if this control points to an inline object\n try {\n const { meta, bindingPath } = SchemaNormalizer.resolveScope(rootSchema, element.scope);\n \n const hasExplicitWidget = !!meta?.ui?.widget;\n const isInlineObject = meta?.type === SCHEMA_TYPE.OBJECT && meta.ui?.renderMode === RENDER_MODE.INLINE && !hasExplicitWidget;\n\n if (isInlineObject && meta.properties) {\n // Transform this Control into a Group containing its properties\n const newGroup: ILayoutElement = {\n type: \"Group\",\n label: meta.ui?.label || bindingPath.split(\"/\").pop(),\n elements: []\n };\n\n // Add all child properties as controls\n for (const childKey of Object.keys(meta.properties)) {\n newGroup.elements!.push({\n type: \"Control\",\n scope: `${element.scope}/properties/${childKey}`\n });\n }\n\n // Recursively expand this new group in case it contains further inline objects\n newGroup.elements = this.expandElements(newGroup.elements!, rootSchema);\n \n expanded.push(newGroup);\n } else {\n // Scalar control, keep as is\n expanded.push(element);\n }\n } catch (e) {\n // Scope not found, keep element to let normal error handling report it\n expanded.push(element);\n }\n } else {\n expanded.push(element);\n }\n }\n\n return expanded;\n }\n}\n"],"mappings":"+FAAA,MAMSA,EAAgBC,EAAA,0BAChBC,EAAWC,EAAA,qBAAEC,EAAWD,EAAA,eAE1B,MAAME,EAKT,YAAcC,CAAMC,GAChB,IAAKA,IAAWA,EAAOC,WAAaC,MAAMC,QAAQH,EAAOC,UAAW,CAChE,MACJ,CAEAD,EAAOC,SAAWG,KAAKC,eAAeL,EAAOC,SAAUD,EAC3D,CAEA,qBAAeK,CAAeC,EAA4BC,GACtD,MAAMC,EAA6B,GAEnC,IAAK,MAAMC,KAAWH,EAAU,CAC5B,GAAIG,EAAQC,OAAS,QAAS,CAE1B,GAAID,EAAQH,SAAU,CAClBG,EAAQH,SAAWF,KAAKC,eAAeI,EAAQH,SAAUC,EAC7D,CACAC,EAASG,KAAKF,EAClB,MAAO,GAAIA,EAAQC,OAAS,UAAW,CACnC,IAAKD,EAAQG,MAAO,CAChBJ,EAASG,KAAKF,GACd,QACJ,CAEA,IACI,MAAMI,KAAEA,EAAIC,YAAEA,GAAgBrB,EAAiBsB,aAAaR,EAAYE,EAAQG,OAEhF,MAAMI,IAAsBH,GAAMI,IAAIC,OACtC,MAAMC,EAAiBN,GAAMH,OAASb,EAAYuB,QAAUP,EAAKI,IAAII,aAAe1B,EAAY2B,SAAWN,EAE3G,GAAIG,GAAkBN,EAAKU,WAAY,CAEnC,MAAMC,EAA2B,
|
|
1
|
+
{"version":3,"file":"LayoutMutator.js","names":["SchemaNormalizer","___SchemaNormalizer","RENDER_MODE","___constants_MetaUIConstants","SCHEMA_TYPE","LayoutMutator","apply","schema","uiLayout","Array","isArray","this","expandElements","elements","rootSchema","expanded","element","type","push","scope","meta","bindingPath","resolveScope","hasExplicitWidget","ui","widget","isInlineObject","OBJECT","renderMode","INLINE","properties","newGroup","label","split","pop","childKey","Object","keys","e","__exports","__esModule"],"sources":["LayoutMutator.ts"],"sourcesContent":["/**\n * @file LayoutMutator.ts\n * @description Intercepts the generated schema before rendering to dynamically mutate the UI layout based on inline rendering rules.\n */\n\nimport { ISchema, ILayoutElement } from \"../interfaces/ISchema\";\nimport { SchemaNormalizer } from \"./SchemaNormalizer\";\nimport { RENDER_MODE, SCHEMA_TYPE } from \"../constants/MetaUIConstants\";\n\nexport class LayoutMutator {\n /**\n * Mutates the `uiLayout` array to expand nested inline objects into native Groups.\n * @param schema The normalized root schema.\n */\n public static apply(schema: ISchema): void {\n if (!schema || !schema.uiLayout || !Array.isArray(schema.uiLayout)) {\n return; // No layout to mutate\n }\n\n schema.uiLayout = this.expandElements(schema.uiLayout, schema);\n }\n\n private static expandElements(elements: ILayoutElement[], rootSchema: ISchema): ILayoutElement[] {\n const expanded: ILayoutElement[] = [];\n\n for (const element of elements) {\n if (element.type === \"Group\") {\n // Recursively expand group elements\n if (element.elements) {\n element.elements = this.expandElements(element.elements, rootSchema);\n }\n expanded.push(element);\n } else if (element.type === \"Control\") {\n if (!element.scope) {\n expanded.push(element);\n continue;\n }\n // Resolve the schema to see if this control points to an inline object\n try {\n const { meta, bindingPath } = SchemaNormalizer.resolveScope(rootSchema, element.scope);\n \n const hasExplicitWidget = !!meta?.ui?.widget;\n const isInlineObject = meta?.type === SCHEMA_TYPE.OBJECT && meta.ui?.renderMode === RENDER_MODE.INLINE && !hasExplicitWidget;\n\n if (isInlineObject && meta.properties) {\n // Transform this Control into a Group containing its properties\n const newGroup: ILayoutElement = {\n ...element,\n type: \"Group\",\n label: element.label || meta.ui?.label || bindingPath.split(\"/\").pop(),\n elements: []\n };\n delete newGroup.scope;\n\n // Add all child properties as controls\n for (const childKey of Object.keys(meta.properties)) {\n newGroup.elements!.push({\n type: \"Control\",\n scope: `${element.scope}/properties/${childKey}`\n });\n }\n\n // Recursively expand this new group in case it contains further inline objects\n newGroup.elements = this.expandElements(newGroup.elements!, rootSchema);\n \n expanded.push(newGroup);\n } else {\n // Scalar control, keep as is\n expanded.push(element);\n }\n } catch (e) {\n // Scope not found, keep element to let normal error handling report it\n expanded.push(element);\n }\n } else {\n expanded.push(element);\n }\n }\n\n return expanded;\n }\n}\n"],"mappings":"+FAAA,MAMSA,EAAgBC,EAAA,0BAChBC,EAAWC,EAAA,qBAAEC,EAAWD,EAAA,eAE1B,MAAME,EAKT,YAAcC,CAAMC,GAChB,IAAKA,IAAWA,EAAOC,WAAaC,MAAMC,QAAQH,EAAOC,UAAW,CAChE,MACJ,CAEAD,EAAOC,SAAWG,KAAKC,eAAeL,EAAOC,SAAUD,EAC3D,CAEA,qBAAeK,CAAeC,EAA4BC,GACtD,MAAMC,EAA6B,GAEnC,IAAK,MAAMC,KAAWH,EAAU,CAC5B,GAAIG,EAAQC,OAAS,QAAS,CAE1B,GAAID,EAAQH,SAAU,CAClBG,EAAQH,SAAWF,KAAKC,eAAeI,EAAQH,SAAUC,EAC7D,CACAC,EAASG,KAAKF,EAClB,MAAO,GAAIA,EAAQC,OAAS,UAAW,CACnC,IAAKD,EAAQG,MAAO,CAChBJ,EAASG,KAAKF,GACd,QACJ,CAEA,IACI,MAAMI,KAAEA,EAAIC,YAAEA,GAAgBrB,EAAiBsB,aAAaR,EAAYE,EAAQG,OAEhF,MAAMI,IAAsBH,GAAMI,IAAIC,OACtC,MAAMC,EAAiBN,GAAMH,OAASb,EAAYuB,QAAUP,EAAKI,IAAII,aAAe1B,EAAY2B,SAAWN,EAE3G,GAAIG,GAAkBN,EAAKU,WAAY,CAEnC,MAAMC,EAA2B,IAC1Bf,EACHC,KAAM,QACNe,MAAOhB,EAAQgB,OAASZ,EAAKI,IAAIQ,OAASX,EAAYY,MAAM,KAAKC,MACjErB,SAAU,WAEPkB,EAASZ,MAGhB,IAAK,MAAMgB,KAAYC,OAAOC,KAAKjB,EAAKU,YAAa,CACjDC,EAASlB,SAAUK,KAAK,CACpBD,KAAM,UACNE,MAAO,GAAGH,EAAQG,oBAAoBgB,KAE9C,CAGAJ,EAASlB,SAAWF,KAAKC,eAAemB,EAASlB,SAAWC,GAE5DC,EAASG,KAAKa,EAClB,KAAO,CAEHhB,EAASG,KAAKF,EAClB,CACJ,CAAE,MAAOsB,GAELvB,EAASG,KAAKF,EAClB,CACJ,KAAO,CACHD,EAASG,KAAKF,EAClB,CACJ,CAEA,OAAOD,CACX,EACH,IAAAwB,EAAA,CAAAC,WAAA,MAAAD,EAAAlC,gBAAA,OAAAkC,CAAA","ignoreList":[]}
|
|
@@ -45,10 +45,12 @@ export class LayoutMutator {
|
|
|
45
45
|
if (isInlineObject && meta.properties) {
|
|
46
46
|
// Transform this Control into a Group containing its properties
|
|
47
47
|
const newGroup: ILayoutElement = {
|
|
48
|
+
...element,
|
|
48
49
|
type: "Group",
|
|
49
|
-
label: meta.ui?.label || bindingPath.split("/").pop(),
|
|
50
|
+
label: element.label || meta.ui?.label || bindingPath.split("/").pop(),
|
|
50
51
|
elements: []
|
|
51
52
|
};
|
|
53
|
+
delete newGroup.scope;
|
|
52
54
|
|
|
53
55
|
// Add all child properties as controls
|
|
54
56
|
for (const childKey of Object.keys(meta.properties)) {
|
|
@@ -76,9 +76,11 @@ sap.ui.define(["./PluginRegistry", "../utils/Logger", "../constants/MetaUIConsta
|
|
|
76
76
|
delete node.$ref;
|
|
77
77
|
if (node.ui?.widget === WIDGET_TYPE.REFERENCE) delete node.ui.widget;
|
|
78
78
|
node.ui.renderMode = RENDER_MODE.INLINE;
|
|
79
|
+
visited.delete(node);
|
|
79
80
|
return resolvedScore;
|
|
80
81
|
} else {
|
|
81
82
|
node.ui.renderMode = RENDER_MODE.DIALOG;
|
|
83
|
+
visited.delete(node);
|
|
82
84
|
return 1;
|
|
83
85
|
}
|
|
84
86
|
}
|
|
@@ -97,9 +99,11 @@ sap.ui.define(["./PluginRegistry", "../utils/Logger", "../constants/MetaUIConsta
|
|
|
97
99
|
node.ui.layoutBudget = budget;
|
|
98
100
|
if (arrayScore <= budget) {
|
|
99
101
|
node.ui.renderMode = RENDER_MODE.INLINE;
|
|
102
|
+
visited.delete(node);
|
|
100
103
|
return arrayScore;
|
|
101
104
|
} else {
|
|
102
105
|
node.ui.renderMode = RENDER_MODE.DIALOG;
|
|
106
|
+
visited.delete(node);
|
|
103
107
|
return 1;
|
|
104
108
|
}
|
|
105
109
|
}
|
|
@@ -119,6 +123,7 @@ sap.ui.define(["./PluginRegistry", "../utils/Logger", "../constants/MetaUIConsta
|
|
|
119
123
|
}
|
|
120
124
|
node.ui = node.ui || {};
|
|
121
125
|
node.ui.layoutBudget = budget;
|
|
126
|
+
visited.delete(node);
|
|
122
127
|
if (totalScore <= budget) {
|
|
123
128
|
node.ui.renderMode = RENDER_MODE.INLINE;
|
|
124
129
|
return totalScore;
|