@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
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
sap.ui.define(["./PluginRegistry", "../utils/Logger"], function (___PluginRegistry, ___utils_Logger) {
|
|
2
|
+
"use strict";
|
|
3
|
+
|
|
4
|
+
const PluginRegistry = ___PluginRegistry["PluginRegistry"];
|
|
5
|
+
const Logger = ___utils_Logger["Logger"];
|
|
6
|
+
/**
|
|
7
|
+
* The PolicyEngine is responsible for evaluating complex, cross-field conditional logic defined in the schema's `uiPolicies` array.
|
|
8
|
+
* It operates strictly on the JSON payload structure and returns an array of `IDeltaState` mutations which the GeneratorHost
|
|
9
|
+
* then applies to the individual active plugins.
|
|
10
|
+
*
|
|
11
|
+
*
|
|
12
|
+
* @namespace nz.co.siliconst.ui5.metaui.core
|
|
13
|
+
*/
|
|
14
|
+
class PolicyEngine {
|
|
15
|
+
/** Caches the last computed state matrix for differential delta emission */
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Instantiates the PolicyEngine with an array of policies.
|
|
19
|
+
* @param policies Array of uiPolicies defined in the root schema.
|
|
20
|
+
*/
|
|
21
|
+
constructor(policies) {
|
|
22
|
+
this.policies = policies || [];
|
|
23
|
+
this.lastStateMatrix = new Map();
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Safely traverses a JSON payload using a JSON pointer.
|
|
28
|
+
* Handles UI5 model prefixes (like metaui>) seamlessly.
|
|
29
|
+
*
|
|
30
|
+
* @param data The root JSON object representing the form payload.
|
|
31
|
+
* @param pointer The JSON pointer to traverse (e.g., "/Customer/Age").
|
|
32
|
+
* @returns The resolved value, or undefined if the path does not exist.
|
|
33
|
+
*/
|
|
34
|
+
resolvePointer(data, pointer) {
|
|
35
|
+
if (!data || !pointer) return undefined;
|
|
36
|
+
// Strip leading slash and any UI5 prefixes
|
|
37
|
+
const cleanPointer = pointer.replace(/^\//, "").replace(/^metaui>\/?/, "");
|
|
38
|
+
if (!cleanPointer) return data;
|
|
39
|
+
const parts = cleanPointer.split("/");
|
|
40
|
+
let current = data;
|
|
41
|
+
for (const part of parts) {
|
|
42
|
+
if (current === undefined || current === null) return undefined;
|
|
43
|
+
current = current[part];
|
|
44
|
+
}
|
|
45
|
+
return current;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Evaluates a complex condition tree against the live JSON payload.
|
|
50
|
+
*
|
|
51
|
+
* @param condition The condition block to evaluate.
|
|
52
|
+
* @param data The live JSON payload from the StateManager.
|
|
53
|
+
* @returns True if all condition parameters are met, otherwise false.
|
|
54
|
+
*/
|
|
55
|
+
evaluateCondition(condition, data) {
|
|
56
|
+
// If there are multiple operators, we treat them as AND for now
|
|
57
|
+
let result = true;
|
|
58
|
+
const registry = PluginRegistry.getInstance();
|
|
59
|
+
for (const [key, payload] of Object.entries(condition)) {
|
|
60
|
+
const plugin = registry.getPolicyConditionPlugin(key);
|
|
61
|
+
if (plugin) {
|
|
62
|
+
if (!plugin.evaluate(payload, data, this.resolvePointer.bind(this))) {
|
|
63
|
+
result = false;
|
|
64
|
+
}
|
|
65
|
+
} else {
|
|
66
|
+
Logger.warn(`[MetaUI PolicyEngine] Unrecognized condition operator: ${key}`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return result;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Expands relative $row policies into absolute index policies for each physical row.
|
|
74
|
+
* Uses generic stringification to decouple from specific condition operator plugins.
|
|
75
|
+
*/
|
|
76
|
+
expandRowPolicies(data, policies) {
|
|
77
|
+
const expanded = [];
|
|
78
|
+
for (const policy of policies) {
|
|
79
|
+
const policyStr = JSON.stringify(policy);
|
|
80
|
+
if (policyStr.includes("$row")) {
|
|
81
|
+
// Extract the array path (everything before "/$row" inside a JSON string value)
|
|
82
|
+
const match = policyStr.match(/"([^"]+)\/\$row/);
|
|
83
|
+
if (match) {
|
|
84
|
+
const arrayPath = match[1];
|
|
85
|
+
const arrayData = this.resolvePointer(data, arrayPath);
|
|
86
|
+
if (Array.isArray(arrayData)) {
|
|
87
|
+
for (let i = 0; i < arrayData.length; i++) {
|
|
88
|
+
const cloneStr = policyStr.replace(/\$row/g, String(i));
|
|
89
|
+
expanded.push(JSON.parse(cloneStr));
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
} else {
|
|
93
|
+
// Fallback if path couldn't be parsed
|
|
94
|
+
expanded.push(policy);
|
|
95
|
+
}
|
|
96
|
+
} else {
|
|
97
|
+
expanded.push(policy);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return expanded;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Evaluates policies against the given data payload using a State Resolution Matrix.
|
|
105
|
+
* @param data The JSON data payload.
|
|
106
|
+
* @returns Array of delta states to apply to the UI.
|
|
107
|
+
*/
|
|
108
|
+
evaluate(data) {
|
|
109
|
+
if (!this.policies || this.policies.length === 0) {
|
|
110
|
+
return [];
|
|
111
|
+
}
|
|
112
|
+
const expandedPolicies = this.expandRowPolicies(data, this.policies);
|
|
113
|
+
|
|
114
|
+
// Ledger: target -> property -> { forcedFalse: number, forcedTrue: number, lastMessage?: string }
|
|
115
|
+
const ledger = new Map();
|
|
116
|
+
const initTargetInLedger = target => {
|
|
117
|
+
if (!ledger.has(target)) {
|
|
118
|
+
ledger.set(target, {
|
|
119
|
+
visibility: {
|
|
120
|
+
forcedFalse: 0,
|
|
121
|
+
forcedTrue: 0
|
|
122
|
+
},
|
|
123
|
+
validity: {
|
|
124
|
+
forcedFalse: 0,
|
|
125
|
+
forcedTrue: 0
|
|
126
|
+
},
|
|
127
|
+
required: {
|
|
128
|
+
forcedFalse: 0,
|
|
129
|
+
forcedTrue: 0
|
|
130
|
+
},
|
|
131
|
+
editable: {
|
|
132
|
+
forcedFalse: 0,
|
|
133
|
+
forcedTrue: 0
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
// 1. Build the Composite State Ledger Matrix
|
|
140
|
+
for (const policy of expandedPolicies) {
|
|
141
|
+
const isConditionMet = this.evaluateCondition(policy.condition, data);
|
|
142
|
+
for (const target of policy.targets) {
|
|
143
|
+
initTargetInLedger(target);
|
|
144
|
+
const currentLedger = ledger.get(target);
|
|
145
|
+
const effectPlugin = PluginRegistry.getInstance().getPolicyEffectPlugin(policy.effect);
|
|
146
|
+
if (!effectPlugin) {
|
|
147
|
+
Logger.error(`[MetaUI PolicyEngine] Unrecognized policy effect: ${policy.effect}`);
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
const mapped = effectPlugin.resolveState(isConditionMet, policy.effect);
|
|
151
|
+
|
|
152
|
+
// Track forces. For restrictable properties (visibility, validity, editable), forcedFalse acts as a lock.
|
|
153
|
+
// For required, forcedTrue acts as a lock.
|
|
154
|
+
if (mapped.value) {
|
|
155
|
+
currentLedger[mapped.property].forcedTrue++;
|
|
156
|
+
} else {
|
|
157
|
+
currentLedger[mapped.property].forcedFalse++;
|
|
158
|
+
if (mapped.property === "validity" && isConditionMet && policy.message) {
|
|
159
|
+
currentLedger.validity.lastMessage = policy.message;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
const newStateMatrix = new Map();
|
|
165
|
+
|
|
166
|
+
// 2. Resolve the Ledger into a concrete State Matrix
|
|
167
|
+
for (const [target, stateMap] of ledger.entries()) {
|
|
168
|
+
newStateMatrix.set(target, {
|
|
169
|
+
// False (Hidden) wins if ANY policy forced it false
|
|
170
|
+
visibility: stateMap.visibility.forcedFalse > 0 ? false : true,
|
|
171
|
+
// False (Invalid) wins if ANY policy forced it false
|
|
172
|
+
validity: stateMap.validity.forcedFalse > 0 ? false : true,
|
|
173
|
+
// True (Required) wins if ANY policy forced it true
|
|
174
|
+
required: stateMap.required.forcedTrue > 0 ? true : false,
|
|
175
|
+
// False (Disabled) wins if ANY policy forced it false
|
|
176
|
+
editable: stateMap.editable.forcedFalse > 0 ? false : true,
|
|
177
|
+
errorMessage: stateMap.validity.lastMessage
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
const deltas = [];
|
|
181
|
+
|
|
182
|
+
// 3. Differential Emission
|
|
183
|
+
for (const [target, newState] of newStateMatrix.entries()) {
|
|
184
|
+
const lastState = this.lastStateMatrix.get(target) || {};
|
|
185
|
+
if (newState.visibility !== undefined && newState.visibility !== lastState.visibility) {
|
|
186
|
+
deltas.push({
|
|
187
|
+
target,
|
|
188
|
+
property: "visibility",
|
|
189
|
+
value: newState.visibility
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
if (newState.validity !== undefined && newState.validity !== lastState.validity) {
|
|
193
|
+
if (newState.validity !== lastState.validity || newState.errorMessage !== lastState.errorMessage) {
|
|
194
|
+
deltas.push({
|
|
195
|
+
target,
|
|
196
|
+
property: "validity",
|
|
197
|
+
value: newState.validity,
|
|
198
|
+
errorMessage: newState.errorMessage
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
if (newState.required !== undefined && newState.required !== lastState.required) {
|
|
203
|
+
deltas.push({
|
|
204
|
+
target,
|
|
205
|
+
property: "required",
|
|
206
|
+
value: newState.required
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
if (newState.editable !== undefined && newState.editable !== lastState.editable) {
|
|
210
|
+
deltas.push({
|
|
211
|
+
target,
|
|
212
|
+
property: "editable",
|
|
213
|
+
value: newState.editable
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// Cache for next evaluation sweep
|
|
219
|
+
this.lastStateMatrix = newStateMatrix;
|
|
220
|
+
return deltas;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
var __exports = {
|
|
224
|
+
__esModule: true
|
|
225
|
+
};
|
|
226
|
+
__exports.PolicyEngine = PolicyEngine;
|
|
227
|
+
return __exports;
|
|
228
|
+
});
|
|
229
|
+
//# sourceMappingURL=PolicyEngine-dbg.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PolicyEngine-dbg.js","names":["PluginRegistry","___PluginRegistry","Logger","___utils_Logger","PolicyEngine","constructor","policies","lastStateMatrix","Map","resolvePointer","data","pointer","undefined","cleanPointer","replace","parts","split","current","part","evaluateCondition","condition","result","registry","getInstance","key","payload","Object","entries","plugin","getPolicyConditionPlugin","evaluate","bind","warn","expandRowPolicies","expanded","policy","policyStr","JSON","stringify","includes","match","arrayPath","arrayData","Array","isArray","i","length","cloneStr","String","push","parse","expandedPolicies","ledger","initTargetInLedger","target","has","set","visibility","forcedFalse","forcedTrue","validity","required","editable","isConditionMet","targets","currentLedger","get","effectPlugin","getPolicyEffectPlugin","effect","error","mapped","resolveState","value","property","message","lastMessage","newStateMatrix","stateMap","errorMessage","deltas","newState","lastState","__exports","__esModule"],"sources":["PolicyEngine.ts"],"sourcesContent":["import { IPolicy, IPolicyCondition, PolicyEffectType } from \"../interfaces/ISchema\";\nimport { PluginRegistry } from \"./PluginRegistry\";\nimport { Logger } from \"../utils/Logger\";\n\nexport type PropertyName = \"visibility\" | \"validity\" | \"required\" | \"editable\";\n\nexport interface IDeltaState {\n /** The absolute JSON pointer path of the target property (e.g., \"/VisitorInfo/PassportNumber\") */\n target: string;\n /** The UI5 visual or structural state to mutate */\n property: PropertyName;\n /** The boolean value to apply to the state */\n value: boolean;\n /** An optional custom error message to paint onto the field if validity is false */\n errorMessage?: string;\n}\n\ninterface ITargetState {\n visibility?: boolean;\n validity?: boolean;\n required?: boolean;\n editable?: boolean;\n errorMessage?: string;\n}\n\n/**\n * The PolicyEngine is responsible for evaluating complex, cross-field conditional logic defined in the schema's `uiPolicies` array.\n * It operates strictly on the JSON payload structure and returns an array of `IDeltaState` mutations which the GeneratorHost\n * then applies to the individual active plugins.\n * \n * \n * @namespace nz.co.siliconst.ui5.metaui.core\n */\nexport class PolicyEngine {\n private policies: IPolicy[];\n\n /** Caches the last computed state matrix for differential delta emission */\n private lastStateMatrix: Map<string, ITargetState>;\n\n /**\n * Instantiates the PolicyEngine with an array of policies.\n * @param policies Array of uiPolicies defined in the root schema.\n */\n constructor(policies: IPolicy[]) {\n this.policies = policies || [];\n this.lastStateMatrix = new Map();\n }\n\n /**\n * Safely traverses a JSON payload using a JSON pointer.\n * Handles UI5 model prefixes (like metaui>) seamlessly.\n * \n * @param data The root JSON object representing the form payload.\n * @param pointer The JSON pointer to traverse (e.g., \"/Customer/Age\").\n * @returns The resolved value, or undefined if the path does not exist.\n */\n private resolvePointer(data: unknown, pointer: string): unknown {\n if (!data || !pointer) return undefined;\n // Strip leading slash and any UI5 prefixes\n const cleanPointer = pointer.replace(/^\\//, \"\").replace(/^metaui>\\/?/, \"\");\n if (!cleanPointer) return data;\n\n const parts = cleanPointer.split(\"/\");\n let current = data as Record<string, unknown>;\n for (const part of parts) {\n if (current === undefined || current === null) return undefined;\n current = current[part] as Record<string, unknown>;\n }\n return current;\n }\n\n /**\n * Evaluates a complex condition tree against the live JSON payload.\n * \n * @param condition The condition block to evaluate.\n * @param data The live JSON payload from the StateManager.\n * @returns True if all condition parameters are met, otherwise false.\n */\n private evaluateCondition(condition: IPolicyCondition, data: unknown): boolean {\n // If there are multiple operators, we treat them as AND for now\n let result = true;\n const registry = PluginRegistry.getInstance();\n\n for (const [key, payload] of Object.entries(condition)) {\n const plugin = registry.getPolicyConditionPlugin(key);\n if (plugin) {\n if (!plugin.evaluate(payload, data, this.resolvePointer.bind(this))) {\n result = false;\n }\n } else {\n Logger.warn(`[MetaUI PolicyEngine] Unrecognized condition operator: ${key}`);\n }\n }\n\n return result;\n }\n\n /**\n * Expands relative $row policies into absolute index policies for each physical row.\n * Uses generic stringification to decouple from specific condition operator plugins.\n */\n private expandRowPolicies(data: unknown, policies: IPolicy[]): IPolicy[] {\n const expanded: IPolicy[] = [];\n for (const policy of policies) {\n const policyStr = JSON.stringify(policy);\n if (policyStr.includes(\"$row\")) {\n // Extract the array path (everything before \"/$row\" inside a JSON string value)\n const match = policyStr.match(/\"([^\"]+)\\/\\$row/);\n if (match) {\n const arrayPath = match[1];\n const arrayData = this.resolvePointer(data, arrayPath);\n if (Array.isArray(arrayData)) {\n for (let i = 0; i < arrayData.length; i++) {\n const cloneStr = policyStr.replace(/\\$row/g, String(i));\n expanded.push(JSON.parse(cloneStr));\n }\n }\n } else {\n // Fallback if path couldn't be parsed\n expanded.push(policy);\n }\n } else {\n expanded.push(policy);\n }\n }\n return expanded;\n }\n\n /**\n * Evaluates policies against the given data payload using a State Resolution Matrix.\n * @param data The JSON data payload.\n * @returns Array of delta states to apply to the UI.\n */\n public evaluate(data: unknown): IDeltaState[] {\n if (!this.policies || this.policies.length === 0) {\n return [];\n }\n\n const expandedPolicies = this.expandRowPolicies(data, this.policies);\n\n // Ledger: target -> property -> { forcedFalse: number, forcedTrue: number, lastMessage?: string }\n const ledger = new Map<string, Record<PropertyName, { forcedFalse: number, forcedTrue: number, lastMessage?: string }>>();\n\n const initTargetInLedger = (target: string) => {\n if (!ledger.has(target)) {\n ledger.set(target, {\n visibility: { forcedFalse: 0, forcedTrue: 0 },\n validity: { forcedFalse: 0, forcedTrue: 0 },\n required: { forcedFalse: 0, forcedTrue: 0 },\n editable: { forcedFalse: 0, forcedTrue: 0 }\n });\n }\n };\n\n // 1. Build the Composite State Ledger Matrix\n for (const policy of expandedPolicies) {\n const isConditionMet = this.evaluateCondition(policy.condition, data);\n\n for (const target of policy.targets) {\n initTargetInLedger(target);\n const currentLedger = ledger.get(target)!;\n\n const effectPlugin = PluginRegistry.getInstance().getPolicyEffectPlugin(policy.effect);\n if (!effectPlugin) {\n Logger.error(`[MetaUI PolicyEngine] Unrecognized policy effect: ${policy.effect}`);\n continue;\n }\n const mapped = effectPlugin.resolveState(isConditionMet, policy.effect);\n\n // Track forces. For restrictable properties (visibility, validity, editable), forcedFalse acts as a lock.\n // For required, forcedTrue acts as a lock.\n if (mapped.value) {\n currentLedger[mapped.property].forcedTrue++;\n } else {\n currentLedger[mapped.property].forcedFalse++;\n if (mapped.property === \"validity\" && isConditionMet && policy.message) {\n currentLedger.validity.lastMessage = policy.message;\n }\n }\n }\n }\n\n const newStateMatrix = new Map<string, ITargetState>();\n\n // 2. Resolve the Ledger into a concrete State Matrix\n for (const [target, stateMap] of ledger.entries()) {\n newStateMatrix.set(target, {\n // False (Hidden) wins if ANY policy forced it false\n visibility: stateMap.visibility.forcedFalse > 0 ? false : true,\n // False (Invalid) wins if ANY policy forced it false\n validity: stateMap.validity.forcedFalse > 0 ? false : true,\n // True (Required) wins if ANY policy forced it true\n required: stateMap.required.forcedTrue > 0 ? true : false,\n // False (Disabled) wins if ANY policy forced it false\n editable: stateMap.editable.forcedFalse > 0 ? false : true,\n errorMessage: stateMap.validity.lastMessage\n });\n }\n\n const deltas: IDeltaState[] = [];\n\n // 3. Differential Emission\n for (const [target, newState] of newStateMatrix.entries()) {\n const lastState = this.lastStateMatrix.get(target) || {};\n\n if (newState.visibility !== undefined && newState.visibility !== lastState.visibility) {\n deltas.push({ target, property: \"visibility\", value: newState.visibility });\n }\n if (newState.validity !== undefined && newState.validity !== lastState.validity) {\n if (newState.validity !== lastState.validity || newState.errorMessage !== lastState.errorMessage) {\n deltas.push({ target, property: \"validity\", value: newState.validity, errorMessage: newState.errorMessage });\n }\n }\n if (newState.required !== undefined && newState.required !== lastState.required) {\n deltas.push({ target, property: \"required\", value: newState.required });\n }\n if (newState.editable !== undefined && newState.editable !== lastState.editable) {\n deltas.push({ target, property: \"editable\", value: newState.editable });\n }\n }\n\n // Cache for next evaluation sweep\n this.lastStateMatrix = newStateMatrix;\n\n return deltas;\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
declare module "nz/co/siliconst/ui5/metaui/core/PolicyEngine" {
|
|
2
|
+
import { IPolicy } from "nz/co/siliconst/ui5/metaui/interfaces/ISchema";
|
|
3
|
+
export type PropertyName = "visibility" | "validity" | "required" | "editable";
|
|
4
|
+
export interface IDeltaState {
|
|
5
|
+
/** The absolute JSON pointer path of the target property (e.g., "/VisitorInfo/PassportNumber") */
|
|
6
|
+
target: string;
|
|
7
|
+
/** The UI5 visual or structural state to mutate */
|
|
8
|
+
property: PropertyName;
|
|
9
|
+
/** The boolean value to apply to the state */
|
|
10
|
+
value: boolean;
|
|
11
|
+
/** An optional custom error message to paint onto the field if validity is false */
|
|
12
|
+
errorMessage?: string;
|
|
13
|
+
}
|
|
14
|
+
interface ITargetState {
|
|
15
|
+
visibility?: boolean;
|
|
16
|
+
validity?: boolean;
|
|
17
|
+
required?: boolean;
|
|
18
|
+
editable?: boolean;
|
|
19
|
+
errorMessage?: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* The PolicyEngine is responsible for evaluating complex, cross-field conditional logic defined in the schema's `uiPolicies` array.
|
|
23
|
+
* It operates strictly on the JSON payload structure and returns an array of `IDeltaState` mutations which the GeneratorHost
|
|
24
|
+
* then applies to the individual active plugins.
|
|
25
|
+
*
|
|
26
|
+
*
|
|
27
|
+
* @namespace nz.co.siliconst.ui5.metaui.core
|
|
28
|
+
*/
|
|
29
|
+
export class PolicyEngine {
|
|
30
|
+
private policies;
|
|
31
|
+
/** Caches the last computed state matrix for differential delta emission */
|
|
32
|
+
private lastStateMatrix;
|
|
33
|
+
/**
|
|
34
|
+
* Instantiates the PolicyEngine with an array of policies.
|
|
35
|
+
* @param policies Array of uiPolicies defined in the root schema.
|
|
36
|
+
*/
|
|
37
|
+
constructor(policies: IPolicy[]);
|
|
38
|
+
/**
|
|
39
|
+
* Safely traverses a JSON payload using a JSON pointer.
|
|
40
|
+
* Handles UI5 model prefixes (like metaui>) seamlessly.
|
|
41
|
+
*
|
|
42
|
+
* @param data The root JSON object representing the form payload.
|
|
43
|
+
* @param pointer The JSON pointer to traverse (e.g., "/Customer/Age").
|
|
44
|
+
* @returns The resolved value, or undefined if the path does not exist.
|
|
45
|
+
*/
|
|
46
|
+
private resolvePointer;
|
|
47
|
+
/**
|
|
48
|
+
* Evaluates a complex condition tree against the live JSON payload.
|
|
49
|
+
*
|
|
50
|
+
* @param condition The condition block to evaluate.
|
|
51
|
+
* @param data The live JSON payload from the StateManager.
|
|
52
|
+
* @returns True if all condition parameters are met, otherwise false.
|
|
53
|
+
*/
|
|
54
|
+
private evaluateCondition;
|
|
55
|
+
/**
|
|
56
|
+
* Expands relative $row policies into absolute index policies for each physical row.
|
|
57
|
+
* Uses generic stringification to decouple from specific condition operator plugins.
|
|
58
|
+
*/
|
|
59
|
+
private expandRowPolicies;
|
|
60
|
+
/**
|
|
61
|
+
* Evaluates policies against the given data payload using a State Resolution Matrix.
|
|
62
|
+
* @param data The JSON data payload.
|
|
63
|
+
* @returns Array of delta states to apply to the UI.
|
|
64
|
+
*/
|
|
65
|
+
evaluate(data: unknown): IDeltaState[];
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=PolicyEngine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PolicyEngine.d.ts","sourceRoot":"../../../../../../../..","sources":["src/nz/co/siliconst/ui5/metaui/core/PolicyEngine.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,8CAA8C,CAAC;IAC9D,OAAO,EAAE,OAAO,EAAsC,MAAM,+CAA+C,CAAC;IAI5G,KAAY,YAAY,GAAG,YAAY,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC;IAE/E,UAAiB,WAAW;QACxB,kGAAkG;QAClG,MAAM,EAAE,MAAM,CAAC;QACf,mDAAmD;QACnD,QAAQ,EAAE,YAAY,CAAC;QACvB,8CAA8C;QAC9C,KAAK,EAAE,OAAO,CAAC;QACf,oFAAoF;QACpF,YAAY,CAAC,EAAE,MAAM,CAAC;KACzB;IAED,UAAU,YAAY;QAClB,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,YAAY,CAAC,EAAE,MAAM,CAAC;KACzB;IAED;;;;;;;OAOG;IACH,MAAa,YAAY;QACrB,OAAO,CAAC,QAAQ,CAAY;QAE5B,4EAA4E;QAC5E,OAAO,CAAC,eAAe,CAA4B;QAEnD;;;WAGG;oBACS,QAAQ,EAAE,OAAO,EAAE;QAK/B;;;;;;;WAOG;QACH,OAAO,CAAC,cAAc;QAetB;;;;;;WAMG;QACH,OAAO,CAAC,iBAAiB;QAmBzB;;;WAGG;QACH,OAAO,CAAC,iBAAiB;QA2BzB;;;;WAIG;QACI,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,WAAW,EAAE;KA6FhD;CAEA"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
sap.ui.define(["./PluginRegistry","../utils/Logger"],function(e,i){"use strict";const t=e["PluginRegistry"];const r=i["Logger"];class s{constructor(e){this.policies=e||[];this.lastStateMatrix=new Map}resolvePointer(e,i){if(!e||!i)return undefined;const t=i.replace(/^\//,"").replace(/^metaui>\/?/,"");if(!t)return e;const r=t.split("/");let s=e;for(const e of r){if(s===undefined||s===null)return undefined;s=s[e]}return s}evaluateCondition(e,i){let s=true;const o=t.getInstance();for(const[t,n]of Object.entries(e)){const e=o.getPolicyConditionPlugin(t);if(e){if(!e.evaluate(n,i,this.resolvePointer.bind(this))){s=false}}else{r.warn(`[MetaUI PolicyEngine] Unrecognized condition operator: ${t}`)}}return s}expandRowPolicies(e,i){const t=[];for(const r of i){const i=JSON.stringify(r);if(i.includes("$row")){const s=i.match(/"([^"]+)\/\$row/);if(s){const r=s[1];const o=this.resolvePointer(e,r);if(Array.isArray(o)){for(let e=0;e<o.length;e++){const r=i.replace(/\$row/g,String(e));t.push(JSON.parse(r))}}}else{t.push(r)}}else{t.push(r)}}return t}evaluate(e){if(!this.policies||this.policies.length===0){return[]}const i=this.expandRowPolicies(e,this.policies);const s=new Map;const o=e=>{if(!s.has(e)){s.set(e,{visibility:{forcedFalse:0,forcedTrue:0},validity:{forcedFalse:0,forcedTrue:0},required:{forcedFalse:0,forcedTrue:0},editable:{forcedFalse:0,forcedTrue:0}})}};for(const n of i){const i=this.evaluateCondition(n.condition,e);for(const e of n.targets){o(e);const a=s.get(e);const l=t.getInstance().getPolicyEffectPlugin(n.effect);if(!l){r.error(`[MetaUI PolicyEngine] Unrecognized policy effect: ${n.effect}`);continue}const c=l.resolveState(i,n.effect);if(c.value){a[c.property].forcedTrue++}else{a[c.property].forcedFalse++;if(c.property==="validity"&&i&&n.message){a.validity.lastMessage=n.message}}}}const n=new Map;for(const[e,i]of s.entries()){n.set(e,{visibility:i.visibility.forcedFalse>0?false:true,validity:i.validity.forcedFalse>0?false:true,required:i.required.forcedTrue>0?true:false,editable:i.editable.forcedFalse>0?false:true,errorMessage:i.validity.lastMessage})}const a=[];for(const[e,i]of n.entries()){const t=this.lastStateMatrix.get(e)||{};if(i.visibility!==undefined&&i.visibility!==t.visibility){a.push({target:e,property:"visibility",value:i.visibility})}if(i.validity!==undefined&&i.validity!==t.validity){if(i.validity!==t.validity||i.errorMessage!==t.errorMessage){a.push({target:e,property:"validity",value:i.validity,errorMessage:i.errorMessage})}}if(i.required!==undefined&&i.required!==t.required){a.push({target:e,property:"required",value:i.required})}if(i.editable!==undefined&&i.editable!==t.editable){a.push({target:e,property:"editable",value:i.editable})}}this.lastStateMatrix=n;return a}}var o={__esModule:true};o.PolicyEngine=s;return o});
|
|
2
|
+
//# sourceMappingURL=PolicyEngine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PolicyEngine.js","names":["PluginRegistry","___PluginRegistry","Logger","___utils_Logger","PolicyEngine","constructor","policies","this","lastStateMatrix","Map","resolvePointer","data","pointer","undefined","cleanPointer","replace","parts","split","current","part","evaluateCondition","condition","result","registry","getInstance","key","payload","Object","entries","plugin","getPolicyConditionPlugin","evaluate","bind","warn","expandRowPolicies","expanded","policy","policyStr","JSON","stringify","includes","match","arrayPath","arrayData","Array","isArray","i","length","cloneStr","String","push","parse","expandedPolicies","ledger","initTargetInLedger","target","has","set","visibility","forcedFalse","forcedTrue","validity","required","editable","isConditionMet","targets","currentLedger","get","effectPlugin","getPolicyEffectPlugin","effect","error","mapped","resolveState","value","property","message","lastMessage","newStateMatrix","stateMap","errorMessage","deltas","newState","lastState","__exports","__esModule"],"sources":["PolicyEngine.ts"],"sourcesContent":["import { IPolicy, IPolicyCondition, PolicyEffectType } from \"../interfaces/ISchema\";\nimport { PluginRegistry } from \"./PluginRegistry\";\nimport { Logger } from \"../utils/Logger\";\n\nexport type PropertyName = \"visibility\" | \"validity\" | \"required\" | \"editable\";\n\nexport interface IDeltaState {\n /** The absolute JSON pointer path of the target property (e.g., \"/VisitorInfo/PassportNumber\") */\n target: string;\n /** The UI5 visual or structural state to mutate */\n property: PropertyName;\n /** The boolean value to apply to the state */\n value: boolean;\n /** An optional custom error message to paint onto the field if validity is false */\n errorMessage?: string;\n}\n\ninterface ITargetState {\n visibility?: boolean;\n validity?: boolean;\n required?: boolean;\n editable?: boolean;\n errorMessage?: string;\n}\n\n/**\n * The PolicyEngine is responsible for evaluating complex, cross-field conditional logic defined in the schema's `uiPolicies` array.\n * It operates strictly on the JSON payload structure and returns an array of `IDeltaState` mutations which the GeneratorHost\n * then applies to the individual active plugins.\n * \n * \n * @namespace nz.co.siliconst.ui5.metaui.core\n */\nexport class PolicyEngine {\n private policies: IPolicy[];\n\n /** Caches the last computed state matrix for differential delta emission */\n private lastStateMatrix: Map<string, ITargetState>;\n\n /**\n * Instantiates the PolicyEngine with an array of policies.\n * @param policies Array of uiPolicies defined in the root schema.\n */\n constructor(policies: IPolicy[]) {\n this.policies = policies || [];\n this.lastStateMatrix = new Map();\n }\n\n /**\n * Safely traverses a JSON payload using a JSON pointer.\n * Handles UI5 model prefixes (like metaui>) seamlessly.\n * \n * @param data The root JSON object representing the form payload.\n * @param pointer The JSON pointer to traverse (e.g., \"/Customer/Age\").\n * @returns The resolved value, or undefined if the path does not exist.\n */\n private resolvePointer(data: unknown, pointer: string): unknown {\n if (!data || !pointer) return undefined;\n // Strip leading slash and any UI5 prefixes\n const cleanPointer = pointer.replace(/^\\//, \"\").replace(/^metaui>\\/?/, \"\");\n if (!cleanPointer) return data;\n\n const parts = cleanPointer.split(\"/\");\n let current = data as Record<string, unknown>;\n for (const part of parts) {\n if (current === undefined || current === null) return undefined;\n current = current[part] as Record<string, unknown>;\n }\n return current;\n }\n\n /**\n * Evaluates a complex condition tree against the live JSON payload.\n * \n * @param condition The condition block to evaluate.\n * @param data The live JSON payload from the StateManager.\n * @returns True if all condition parameters are met, otherwise false.\n */\n private evaluateCondition(condition: IPolicyCondition, data: unknown): boolean {\n // If there are multiple operators, we treat them as AND for now\n let result = true;\n const registry = PluginRegistry.getInstance();\n\n for (const [key, payload] of Object.entries(condition)) {\n const plugin = registry.getPolicyConditionPlugin(key);\n if (plugin) {\n if (!plugin.evaluate(payload, data, this.resolvePointer.bind(this))) {\n result = false;\n }\n } else {\n Logger.warn(`[MetaUI PolicyEngine] Unrecognized condition operator: ${key}`);\n }\n }\n\n return result;\n }\n\n /**\n * Expands relative $row policies into absolute index policies for each physical row.\n * Uses generic stringification to decouple from specific condition operator plugins.\n */\n private expandRowPolicies(data: unknown, policies: IPolicy[]): IPolicy[] {\n const expanded: IPolicy[] = [];\n for (const policy of policies) {\n const policyStr = JSON.stringify(policy);\n if (policyStr.includes(\"$row\")) {\n // Extract the array path (everything before \"/$row\" inside a JSON string value)\n const match = policyStr.match(/\"([^\"]+)\\/\\$row/);\n if (match) {\n const arrayPath = match[1];\n const arrayData = this.resolvePointer(data, arrayPath);\n if (Array.isArray(arrayData)) {\n for (let i = 0; i < arrayData.length; i++) {\n const cloneStr = policyStr.replace(/\\$row/g, String(i));\n expanded.push(JSON.parse(cloneStr));\n }\n }\n } else {\n // Fallback if path couldn't be parsed\n expanded.push(policy);\n }\n } else {\n expanded.push(policy);\n }\n }\n return expanded;\n }\n\n /**\n * Evaluates policies against the given data payload using a State Resolution Matrix.\n * @param data The JSON data payload.\n * @returns Array of delta states to apply to the UI.\n */\n public evaluate(data: unknown): IDeltaState[] {\n if (!this.policies || this.policies.length === 0) {\n return [];\n }\n\n const expandedPolicies = this.expandRowPolicies(data, this.policies);\n\n // Ledger: target -> property -> { forcedFalse: number, forcedTrue: number, lastMessage?: string }\n const ledger = new Map<string, Record<PropertyName, { forcedFalse: number, forcedTrue: number, lastMessage?: string }>>();\n\n const initTargetInLedger = (target: string) => {\n if (!ledger.has(target)) {\n ledger.set(target, {\n visibility: { forcedFalse: 0, forcedTrue: 0 },\n validity: { forcedFalse: 0, forcedTrue: 0 },\n required: { forcedFalse: 0, forcedTrue: 0 },\n editable: { forcedFalse: 0, forcedTrue: 0 }\n });\n }\n };\n\n // 1. Build the Composite State Ledger Matrix\n for (const policy of expandedPolicies) {\n const isConditionMet = this.evaluateCondition(policy.condition, data);\n\n for (const target of policy.targets) {\n initTargetInLedger(target);\n const currentLedger = ledger.get(target)!;\n\n const effectPlugin = PluginRegistry.getInstance().getPolicyEffectPlugin(policy.effect);\n if (!effectPlugin) {\n Logger.error(`[MetaUI PolicyEngine] Unrecognized policy effect: ${policy.effect}`);\n continue;\n }\n const mapped = effectPlugin.resolveState(isConditionMet, policy.effect);\n\n // Track forces. For restrictable properties (visibility, validity, editable), forcedFalse acts as a lock.\n // For required, forcedTrue acts as a lock.\n if (mapped.value) {\n currentLedger[mapped.property].forcedTrue++;\n } else {\n currentLedger[mapped.property].forcedFalse++;\n if (mapped.property === \"validity\" && isConditionMet && policy.message) {\n currentLedger.validity.lastMessage = policy.message;\n }\n }\n }\n }\n\n const newStateMatrix = new Map<string, ITargetState>();\n\n // 2. Resolve the Ledger into a concrete State Matrix\n for (const [target, stateMap] of ledger.entries()) {\n newStateMatrix.set(target, {\n // False (Hidden) wins if ANY policy forced it false\n visibility: stateMap.visibility.forcedFalse > 0 ? false : true,\n // False (Invalid) wins if ANY policy forced it false\n validity: stateMap.validity.forcedFalse > 0 ? false : true,\n // True (Required) wins if ANY policy forced it true\n required: stateMap.required.forcedTrue > 0 ? true : false,\n // False (Disabled) wins if ANY policy forced it false\n editable: stateMap.editable.forcedFalse > 0 ? false : true,\n errorMessage: stateMap.validity.lastMessage\n });\n }\n\n const deltas: IDeltaState[] = [];\n\n // 3. Differential Emission\n for (const [target, newState] of newStateMatrix.entries()) {\n const lastState = this.lastStateMatrix.get(target) || {};\n\n if (newState.visibility !== undefined && newState.visibility !== lastState.visibility) {\n deltas.push({ target, property: \"visibility\", value: newState.visibility });\n }\n if (newState.validity !== undefined && newState.validity !== lastState.validity) {\n if (newState.validity !== lastState.validity || newState.errorMessage !== lastState.errorMessage) {\n deltas.push({ target, property: \"validity\", value: newState.validity, errorMessage: newState.errorMessage });\n }\n }\n if (newState.required !== undefined && newState.required !== lastState.required) {\n deltas.push({ target, property: \"required\", value: newState.required });\n }\n if (newState.editable !== undefined && newState.editable !== lastState.editable) {\n deltas.push({ target, property: \"editable\", value: newState.editable });\n }\n }\n\n // Cache for next evaluation sweep\n this.lastStateMatrix = newStateMatrix;\n\n return deltas;\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
import { IPolicy, IPolicyCondition, PolicyEffectType } from "../interfaces/ISchema";
|
|
2
|
+
import { PluginRegistry } from "./PluginRegistry";
|
|
3
|
+
import { Logger } from "../utils/Logger";
|
|
4
|
+
|
|
5
|
+
export type PropertyName = "visibility" | "validity" | "required" | "editable";
|
|
6
|
+
|
|
7
|
+
export interface IDeltaState {
|
|
8
|
+
/** The absolute JSON pointer path of the target property (e.g., "/VisitorInfo/PassportNumber") */
|
|
9
|
+
target: string;
|
|
10
|
+
/** The UI5 visual or structural state to mutate */
|
|
11
|
+
property: PropertyName;
|
|
12
|
+
/** The boolean value to apply to the state */
|
|
13
|
+
value: boolean;
|
|
14
|
+
/** An optional custom error message to paint onto the field if validity is false */
|
|
15
|
+
errorMessage?: string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
interface ITargetState {
|
|
19
|
+
visibility?: boolean;
|
|
20
|
+
validity?: boolean;
|
|
21
|
+
required?: boolean;
|
|
22
|
+
editable?: boolean;
|
|
23
|
+
errorMessage?: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* The PolicyEngine is responsible for evaluating complex, cross-field conditional logic defined in the schema's `uiPolicies` array.
|
|
28
|
+
* It operates strictly on the JSON payload structure and returns an array of `IDeltaState` mutations which the GeneratorHost
|
|
29
|
+
* then applies to the individual active plugins.
|
|
30
|
+
*
|
|
31
|
+
*
|
|
32
|
+
* @namespace nz.co.siliconst.ui5.metaui.core
|
|
33
|
+
*/
|
|
34
|
+
export class PolicyEngine {
|
|
35
|
+
private policies: IPolicy[];
|
|
36
|
+
|
|
37
|
+
/** Caches the last computed state matrix for differential delta emission */
|
|
38
|
+
private lastStateMatrix: Map<string, ITargetState>;
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Instantiates the PolicyEngine with an array of policies.
|
|
42
|
+
* @param policies Array of uiPolicies defined in the root schema.
|
|
43
|
+
*/
|
|
44
|
+
constructor(policies: IPolicy[]) {
|
|
45
|
+
this.policies = policies || [];
|
|
46
|
+
this.lastStateMatrix = new Map();
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Safely traverses a JSON payload using a JSON pointer.
|
|
51
|
+
* Handles UI5 model prefixes (like metaui>) seamlessly.
|
|
52
|
+
*
|
|
53
|
+
* @param data The root JSON object representing the form payload.
|
|
54
|
+
* @param pointer The JSON pointer to traverse (e.g., "/Customer/Age").
|
|
55
|
+
* @returns The resolved value, or undefined if the path does not exist.
|
|
56
|
+
*/
|
|
57
|
+
private resolvePointer(data: unknown, pointer: string): unknown {
|
|
58
|
+
if (!data || !pointer) return undefined;
|
|
59
|
+
// Strip leading slash and any UI5 prefixes
|
|
60
|
+
const cleanPointer = pointer.replace(/^\//, "").replace(/^metaui>\/?/, "");
|
|
61
|
+
if (!cleanPointer) return data;
|
|
62
|
+
|
|
63
|
+
const parts = cleanPointer.split("/");
|
|
64
|
+
let current = data as Record<string, unknown>;
|
|
65
|
+
for (const part of parts) {
|
|
66
|
+
if (current === undefined || current === null) return undefined;
|
|
67
|
+
current = current[part] as Record<string, unknown>;
|
|
68
|
+
}
|
|
69
|
+
return current;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Evaluates a complex condition tree against the live JSON payload.
|
|
74
|
+
*
|
|
75
|
+
* @param condition The condition block to evaluate.
|
|
76
|
+
* @param data The live JSON payload from the StateManager.
|
|
77
|
+
* @returns True if all condition parameters are met, otherwise false.
|
|
78
|
+
*/
|
|
79
|
+
private evaluateCondition(condition: IPolicyCondition, data: unknown): boolean {
|
|
80
|
+
// If there are multiple operators, we treat them as AND for now
|
|
81
|
+
let result = true;
|
|
82
|
+
const registry = PluginRegistry.getInstance();
|
|
83
|
+
|
|
84
|
+
for (const [key, payload] of Object.entries(condition)) {
|
|
85
|
+
const plugin = registry.getPolicyConditionPlugin(key);
|
|
86
|
+
if (plugin) {
|
|
87
|
+
if (!plugin.evaluate(payload, data, this.resolvePointer.bind(this))) {
|
|
88
|
+
result = false;
|
|
89
|
+
}
|
|
90
|
+
} else {
|
|
91
|
+
Logger.warn(`[MetaUI PolicyEngine] Unrecognized condition operator: ${key}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return result;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Expands relative $row policies into absolute index policies for each physical row.
|
|
100
|
+
* Uses generic stringification to decouple from specific condition operator plugins.
|
|
101
|
+
*/
|
|
102
|
+
private expandRowPolicies(data: unknown, policies: IPolicy[]): IPolicy[] {
|
|
103
|
+
const expanded: IPolicy[] = [];
|
|
104
|
+
for (const policy of policies) {
|
|
105
|
+
const policyStr = JSON.stringify(policy);
|
|
106
|
+
if (policyStr.includes("$row")) {
|
|
107
|
+
// Extract the array path (everything before "/$row" inside a JSON string value)
|
|
108
|
+
const match = policyStr.match(/"([^"]+)\/\$row/);
|
|
109
|
+
if (match) {
|
|
110
|
+
const arrayPath = match[1];
|
|
111
|
+
const arrayData = this.resolvePointer(data, arrayPath);
|
|
112
|
+
if (Array.isArray(arrayData)) {
|
|
113
|
+
for (let i = 0; i < arrayData.length; i++) {
|
|
114
|
+
const cloneStr = policyStr.replace(/\$row/g, String(i));
|
|
115
|
+
expanded.push(JSON.parse(cloneStr));
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
} else {
|
|
119
|
+
// Fallback if path couldn't be parsed
|
|
120
|
+
expanded.push(policy);
|
|
121
|
+
}
|
|
122
|
+
} else {
|
|
123
|
+
expanded.push(policy);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return expanded;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Evaluates policies against the given data payload using a State Resolution Matrix.
|
|
131
|
+
* @param data The JSON data payload.
|
|
132
|
+
* @returns Array of delta states to apply to the UI.
|
|
133
|
+
*/
|
|
134
|
+
public evaluate(data: unknown): IDeltaState[] {
|
|
135
|
+
if (!this.policies || this.policies.length === 0) {
|
|
136
|
+
return [];
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
const expandedPolicies = this.expandRowPolicies(data, this.policies);
|
|
140
|
+
|
|
141
|
+
// Ledger: target -> property -> { forcedFalse: number, forcedTrue: number, lastMessage?: string }
|
|
142
|
+
const ledger = new Map<string, Record<PropertyName, { forcedFalse: number, forcedTrue: number, lastMessage?: string }>>();
|
|
143
|
+
|
|
144
|
+
const initTargetInLedger = (target: string) => {
|
|
145
|
+
if (!ledger.has(target)) {
|
|
146
|
+
ledger.set(target, {
|
|
147
|
+
visibility: { forcedFalse: 0, forcedTrue: 0 },
|
|
148
|
+
validity: { forcedFalse: 0, forcedTrue: 0 },
|
|
149
|
+
required: { forcedFalse: 0, forcedTrue: 0 },
|
|
150
|
+
editable: { forcedFalse: 0, forcedTrue: 0 }
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
// 1. Build the Composite State Ledger Matrix
|
|
156
|
+
for (const policy of expandedPolicies) {
|
|
157
|
+
const isConditionMet = this.evaluateCondition(policy.condition, data);
|
|
158
|
+
|
|
159
|
+
for (const target of policy.targets) {
|
|
160
|
+
initTargetInLedger(target);
|
|
161
|
+
const currentLedger = ledger.get(target)!;
|
|
162
|
+
|
|
163
|
+
const effectPlugin = PluginRegistry.getInstance().getPolicyEffectPlugin(policy.effect);
|
|
164
|
+
if (!effectPlugin) {
|
|
165
|
+
Logger.error(`[MetaUI PolicyEngine] Unrecognized policy effect: ${policy.effect}`);
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
const mapped = effectPlugin.resolveState(isConditionMet, policy.effect);
|
|
169
|
+
|
|
170
|
+
// Track forces. For restrictable properties (visibility, validity, editable), forcedFalse acts as a lock.
|
|
171
|
+
// For required, forcedTrue acts as a lock.
|
|
172
|
+
if (mapped.value) {
|
|
173
|
+
currentLedger[mapped.property].forcedTrue++;
|
|
174
|
+
} else {
|
|
175
|
+
currentLedger[mapped.property].forcedFalse++;
|
|
176
|
+
if (mapped.property === "validity" && isConditionMet && policy.message) {
|
|
177
|
+
currentLedger.validity.lastMessage = policy.message;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
const newStateMatrix = new Map<string, ITargetState>();
|
|
184
|
+
|
|
185
|
+
// 2. Resolve the Ledger into a concrete State Matrix
|
|
186
|
+
for (const [target, stateMap] of ledger.entries()) {
|
|
187
|
+
newStateMatrix.set(target, {
|
|
188
|
+
// False (Hidden) wins if ANY policy forced it false
|
|
189
|
+
visibility: stateMap.visibility.forcedFalse > 0 ? false : true,
|
|
190
|
+
// False (Invalid) wins if ANY policy forced it false
|
|
191
|
+
validity: stateMap.validity.forcedFalse > 0 ? false : true,
|
|
192
|
+
// True (Required) wins if ANY policy forced it true
|
|
193
|
+
required: stateMap.required.forcedTrue > 0 ? true : false,
|
|
194
|
+
// False (Disabled) wins if ANY policy forced it false
|
|
195
|
+
editable: stateMap.editable.forcedFalse > 0 ? false : true,
|
|
196
|
+
errorMessage: stateMap.validity.lastMessage
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
const deltas: IDeltaState[] = [];
|
|
201
|
+
|
|
202
|
+
// 3. Differential Emission
|
|
203
|
+
for (const [target, newState] of newStateMatrix.entries()) {
|
|
204
|
+
const lastState = this.lastStateMatrix.get(target) || {};
|
|
205
|
+
|
|
206
|
+
if (newState.visibility !== undefined && newState.visibility !== lastState.visibility) {
|
|
207
|
+
deltas.push({ target, property: "visibility", value: newState.visibility });
|
|
208
|
+
}
|
|
209
|
+
if (newState.validity !== undefined && newState.validity !== lastState.validity) {
|
|
210
|
+
if (newState.validity !== lastState.validity || newState.errorMessage !== lastState.errorMessage) {
|
|
211
|
+
deltas.push({ target, property: "validity", value: newState.validity, errorMessage: newState.errorMessage });
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
if (newState.required !== undefined && newState.required !== lastState.required) {
|
|
215
|
+
deltas.push({ target, property: "required", value: newState.required });
|
|
216
|
+
}
|
|
217
|
+
if (newState.editable !== undefined && newState.editable !== lastState.editable) {
|
|
218
|
+
deltas.push({ target, property: "editable", value: newState.editable });
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// Cache for next evaluation sweep
|
|
223
|
+
this.lastStateMatrix = newStateMatrix;
|
|
224
|
+
|
|
225
|
+
return deltas;
|
|
226
|
+
}
|
|
227
|
+
}
|