@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.
Files changed (499) hide show
  1. package/README.md +1 -1
  2. package/package.json +1 -1
  3. package/src/nz/co/siliconst/ui5/metaui/ai/BaseAIGenerator-dbg.js +22 -20
  4. package/src/nz/co/siliconst/ui5/metaui/ai/BaseAIGenerator-dbg.js.map +1 -1
  5. package/src/nz/co/siliconst/ui5/metaui/ai/BaseAIGenerator.d.ts +3 -3
  6. package/src/nz/co/siliconst/ui5/metaui/ai/BaseAIGenerator.d.ts.map +1 -1
  7. package/src/nz/co/siliconst/ui5/metaui/ai/BaseAIGenerator.js +1 -1
  8. package/src/nz/co/siliconst/ui5/metaui/ai/BaseAIGenerator.js.map +1 -1
  9. package/src/nz/co/siliconst/ui5/metaui/ai/BaseAIGenerator.ts +24 -16
  10. package/src/nz/co/siliconst/ui5/metaui/ai/RestLLMProxy-dbg.js.map +1 -1
  11. package/src/nz/co/siliconst/ui5/metaui/ai/RestLLMProxy.js.map +1 -1
  12. package/src/nz/co/siliconst/ui5/metaui/ai/RestLLMProxy.ts +2 -2
  13. package/src/nz/co/siliconst/ui5/metaui/constants/MetaUIConstants-dbg.js +62 -2
  14. package/src/nz/co/siliconst/ui5/metaui/constants/MetaUIConstants-dbg.js.map +1 -1
  15. package/src/nz/co/siliconst/ui5/metaui/constants/MetaUIConstants.d.ts +54 -0
  16. package/src/nz/co/siliconst/ui5/metaui/constants/MetaUIConstants.d.ts.map +1 -1
  17. package/src/nz/co/siliconst/ui5/metaui/constants/MetaUIConstants.js +1 -1
  18. package/src/nz/co/siliconst/ui5/metaui/constants/MetaUIConstants.js.map +1 -1
  19. package/src/nz/co/siliconst/ui5/metaui/constants/MetaUIConstants.ts +59 -2
  20. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost-dbg.js +43 -47
  21. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost-dbg.js.map +1 -1
  22. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.d.ts +2 -2
  23. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.d.ts.map +1 -1
  24. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.js +1 -1
  25. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.js.map +1 -1
  26. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.ts +61 -66
  27. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost-dbg.js +120 -63
  28. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost-dbg.js.map +1 -1
  29. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.d.ts +16 -4
  30. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.d.ts.map +1 -1
  31. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.js +1 -1
  32. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.js.map +1 -1
  33. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.ts +126 -65
  34. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate-dbg.js +41 -38
  35. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate-dbg.js.map +1 -1
  36. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate.d.ts +6 -4
  37. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate.d.ts.map +1 -1
  38. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate.js +1 -1
  39. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate.js.map +1 -1
  40. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate.ts +47 -39
  41. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DialogDelegate-dbg.js +41 -2
  42. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DialogDelegate-dbg.js.map +1 -1
  43. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DialogDelegate.d.ts +6 -2
  44. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DialogDelegate.d.ts.map +1 -1
  45. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DialogDelegate.js +1 -1
  46. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DialogDelegate.js.map +1 -1
  47. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DialogDelegate.ts +47 -2
  48. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate-dbg.js +7 -2
  49. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate-dbg.js.map +1 -1
  50. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate.d.ts +4 -1
  51. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate.d.ts.map +1 -1
  52. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate.js +1 -1
  53. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate.js.map +1 -1
  54. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate.ts +7 -2
  55. package/src/nz/co/siliconst/ui5/metaui/core/Engine-dbg.js +212 -34
  56. package/src/nz/co/siliconst/ui5/metaui/core/Engine-dbg.js.map +1 -1
  57. package/src/nz/co/siliconst/ui5/metaui/core/Engine.d.ts +21 -3
  58. package/src/nz/co/siliconst/ui5/metaui/core/Engine.d.ts.map +1 -1
  59. package/src/nz/co/siliconst/ui5/metaui/core/Engine.js +1 -1
  60. package/src/nz/co/siliconst/ui5/metaui/core/Engine.js.map +1 -1
  61. package/src/nz/co/siliconst/ui5/metaui/core/Engine.ts +214 -35
  62. package/src/nz/co/siliconst/ui5/metaui/core/LayoutMutator-dbg.js +3 -1
  63. package/src/nz/co/siliconst/ui5/metaui/core/LayoutMutator-dbg.js.map +1 -1
  64. package/src/nz/co/siliconst/ui5/metaui/core/LayoutMutator.d.ts.map +1 -1
  65. package/src/nz/co/siliconst/ui5/metaui/core/LayoutMutator.js +1 -1
  66. package/src/nz/co/siliconst/ui5/metaui/core/LayoutMutator.js.map +1 -1
  67. package/src/nz/co/siliconst/ui5/metaui/core/LayoutMutator.ts +3 -1
  68. package/src/nz/co/siliconst/ui5/metaui/core/LayoutScorer-dbg.js +5 -0
  69. package/src/nz/co/siliconst/ui5/metaui/core/LayoutScorer-dbg.js.map +1 -1
  70. package/src/nz/co/siliconst/ui5/metaui/core/LayoutScorer.d.ts.map +1 -1
  71. package/src/nz/co/siliconst/ui5/metaui/core/LayoutScorer.js +1 -1
  72. package/src/nz/co/siliconst/ui5/metaui/core/LayoutScorer.js.map +1 -1
  73. package/src/nz/co/siliconst/ui5/metaui/core/LayoutScorer.ts +6 -0
  74. package/src/nz/co/siliconst/ui5/metaui/core/PipelineManager-dbg.js +8 -0
  75. package/src/nz/co/siliconst/ui5/metaui/core/PipelineManager-dbg.js.map +1 -1
  76. package/src/nz/co/siliconst/ui5/metaui/core/PipelineManager.d.ts.map +1 -1
  77. package/src/nz/co/siliconst/ui5/metaui/core/PipelineManager.js +1 -1
  78. package/src/nz/co/siliconst/ui5/metaui/core/PipelineManager.js.map +1 -1
  79. package/src/nz/co/siliconst/ui5/metaui/core/PipelineManager.ts +7 -0
  80. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry-dbg.js +127 -50
  81. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry-dbg.js.map +1 -1
  82. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry.d.ts +13 -0
  83. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry.d.ts.map +1 -1
  84. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry.js +1 -1
  85. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry.js.map +1 -1
  86. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry.ts +140 -57
  87. package/src/nz/co/siliconst/ui5/metaui/core/PolicyEngine-dbg.js +229 -0
  88. package/src/nz/co/siliconst/ui5/metaui/core/PolicyEngine-dbg.js.map +1 -0
  89. package/src/nz/co/siliconst/ui5/metaui/core/PolicyEngine.d.ts +68 -0
  90. package/src/nz/co/siliconst/ui5/metaui/core/PolicyEngine.d.ts.map +1 -0
  91. package/src/nz/co/siliconst/ui5/metaui/core/PolicyEngine.js +2 -0
  92. package/src/nz/co/siliconst/ui5/metaui/core/PolicyEngine.js.map +1 -0
  93. package/src/nz/co/siliconst/ui5/metaui/core/PolicyEngine.ts +227 -0
  94. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer-dbg.js +34 -13
  95. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer-dbg.js.map +1 -1
  96. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.d.ts +4 -4
  97. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.d.ts.map +1 -1
  98. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.js +1 -1
  99. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.js.map +1 -1
  100. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.ts +45 -20
  101. package/src/nz/co/siliconst/ui5/metaui/core/SchemaValidator-dbg.js +15 -3
  102. package/src/nz/co/siliconst/ui5/metaui/core/SchemaValidator-dbg.js.map +1 -1
  103. package/src/nz/co/siliconst/ui5/metaui/core/SchemaValidator.d.ts.map +1 -1
  104. package/src/nz/co/siliconst/ui5/metaui/core/SchemaValidator.js +1 -1
  105. package/src/nz/co/siliconst/ui5/metaui/core/SchemaValidator.js.map +1 -1
  106. package/src/nz/co/siliconst/ui5/metaui/core/SchemaValidator.ts +15 -1
  107. package/src/nz/co/siliconst/ui5/metaui/core/StateManager-dbg.js +82 -16
  108. package/src/nz/co/siliconst/ui5/metaui/core/StateManager-dbg.js.map +1 -1
  109. package/src/nz/co/siliconst/ui5/metaui/core/StateManager.d.ts +16 -0
  110. package/src/nz/co/siliconst/ui5/metaui/core/StateManager.d.ts.map +1 -1
  111. package/src/nz/co/siliconst/ui5/metaui/core/StateManager.js +1 -1
  112. package/src/nz/co/siliconst/ui5/metaui/core/StateManager.js.map +1 -1
  113. package/src/nz/co/siliconst/ui5/metaui/core/StateManager.ts +89 -17
  114. package/src/nz/co/siliconst/ui5/metaui/interfaces/IPlugin-dbg.js.map +1 -1
  115. package/src/nz/co/siliconst/ui5/metaui/interfaces/IPlugin.d.ts +12 -1
  116. package/src/nz/co/siliconst/ui5/metaui/interfaces/IPlugin.d.ts.map +1 -1
  117. package/src/nz/co/siliconst/ui5/metaui/interfaces/IPlugin.ts +13 -1
  118. package/src/nz/co/siliconst/ui5/metaui/interfaces/IPolicyPlugin-dbg.js +2 -0
  119. package/src/nz/co/siliconst/ui5/metaui/interfaces/IPolicyPlugin-dbg.js.map +1 -0
  120. package/src/nz/co/siliconst/ui5/metaui/interfaces/IPolicyPlugin.d.ts +50 -0
  121. package/src/nz/co/siliconst/ui5/metaui/interfaces/IPolicyPlugin.d.ts.map +1 -0
  122. package/src/nz/co/siliconst/ui5/metaui/interfaces/IPolicyPlugin.js +2 -0
  123. package/src/nz/co/siliconst/ui5/metaui/interfaces/IPolicyPlugin.js.map +1 -0
  124. package/src/nz/co/siliconst/ui5/metaui/interfaces/IPolicyPlugin.ts +49 -0
  125. package/src/nz/co/siliconst/ui5/metaui/interfaces/ISchema-dbg.js.map +1 -1
  126. package/src/nz/co/siliconst/ui5/metaui/interfaces/ISchema.d.ts +21 -1
  127. package/src/nz/co/siliconst/ui5/metaui/interfaces/ISchema.d.ts.map +1 -1
  128. package/src/nz/co/siliconst/ui5/metaui/interfaces/ISchema.ts +24 -1
  129. package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout-dbg.js +26 -31
  130. package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout-dbg.js.map +1 -1
  131. package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout.d.ts.map +1 -1
  132. package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout.js +1 -1
  133. package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout.js.map +1 -1
  134. package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout.ts +22 -25
  135. package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout-dbg.js +40 -6
  136. package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout-dbg.js.map +1 -1
  137. package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout.d.ts.map +1 -1
  138. package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout.js +1 -1
  139. package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout.js.map +1 -1
  140. package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout.ts +37 -5
  141. package/src/nz/co/siliconst/ui5/metaui/library-preload.js +69 -56
  142. package/src/nz/co/siliconst/ui5/metaui/library-preload.js.map +1 -1
  143. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiParserFactory-dbg.js +3 -2
  144. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiParserFactory-dbg.js.map +1 -1
  145. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiParserFactory.d.ts +1 -1
  146. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiParserFactory.d.ts.map +1 -1
  147. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiParserFactory.js +1 -1
  148. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiParserFactory.js.map +1 -1
  149. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiParserFactory.ts +4 -3
  150. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiRefResolver-dbg.js.map +1 -1
  151. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiRefResolver.d.ts +1 -1
  152. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiRefResolver.d.ts.map +1 -1
  153. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiRefResolver.js.map +1 -1
  154. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiRefResolver.ts +4 -4
  155. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiUIMapper-dbg.js +2 -1
  156. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiUIMapper-dbg.js.map +1 -1
  157. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiUIMapper.d.ts +1 -1
  158. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiUIMapper.d.ts.map +1 -1
  159. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiUIMapper.js +1 -1
  160. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiUIMapper.js.map +1 -1
  161. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiUIMapper.ts +4 -3
  162. package/src/nz/co/siliconst/ui5/metaui/openapi/heuristics/plugins/ProtobufVariantHeuristic-dbg.js +12 -8
  163. package/src/nz/co/siliconst/ui5/metaui/openapi/heuristics/plugins/ProtobufVariantHeuristic-dbg.js.map +1 -1
  164. package/src/nz/co/siliconst/ui5/metaui/openapi/heuristics/plugins/ProtobufVariantHeuristic.d.ts +1 -1
  165. package/src/nz/co/siliconst/ui5/metaui/openapi/heuristics/plugins/ProtobufVariantHeuristic.d.ts.map +1 -1
  166. package/src/nz/co/siliconst/ui5/metaui/openapi/heuristics/plugins/ProtobufVariantHeuristic.js +1 -1
  167. package/src/nz/co/siliconst/ui5/metaui/openapi/heuristics/plugins/ProtobufVariantHeuristic.js.map +1 -1
  168. package/src/nz/co/siliconst/ui5/metaui/openapi/heuristics/plugins/ProtobufVariantHeuristic.ts +16 -12
  169. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi2Parser-dbg.js +20 -12
  170. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi2Parser-dbg.js.map +1 -1
  171. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi2Parser.d.ts +5 -5
  172. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi2Parser.d.ts.map +1 -1
  173. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi2Parser.js +1 -1
  174. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi2Parser.js.map +1 -1
  175. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi2Parser.ts +25 -17
  176. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi3Parser-dbg.js +18 -11
  177. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi3Parser-dbg.js.map +1 -1
  178. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi3Parser.d.ts +5 -5
  179. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi3Parser.d.ts.map +1 -1
  180. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi3Parser.js +1 -1
  181. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi3Parser.js.map +1 -1
  182. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi3Parser.ts +23 -16
  183. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApiPropertyMapper-dbg.js +24 -100
  184. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApiPropertyMapper-dbg.js.map +1 -1
  185. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApiPropertyMapper.d.ts +10 -74
  186. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApiPropertyMapper.d.ts.map +1 -1
  187. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApiPropertyMapper.js +1 -1
  188. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApiPropertyMapper.js.map +1 -1
  189. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApiPropertyMapper.ts +54 -117
  190. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin-dbg.js +7 -4
  191. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin-dbg.js.map +1 -1
  192. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin.d.ts +1 -1
  193. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin.d.ts.map +1 -1
  194. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin.js +1 -1
  195. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin.js.map +1 -1
  196. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin.ts +6 -4
  197. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin-dbg.js +4 -4
  198. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin-dbg.js.map +1 -1
  199. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin.d.ts +1 -1
  200. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin.d.ts.map +1 -1
  201. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin.js +1 -1
  202. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin.js.map +1 -1
  203. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin.ts +5 -5
  204. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin-dbg.js +129 -9
  205. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin-dbg.js.map +1 -1
  206. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.d.ts +45 -4
  207. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.d.ts.map +1 -1
  208. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.js +1 -1
  209. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.js.map +1 -1
  210. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.ts +143 -13
  211. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin-dbg.js +35 -14
  212. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin-dbg.js.map +1 -1
  213. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin.d.ts +1 -1
  214. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin.d.ts.map +1 -1
  215. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin.js +1 -1
  216. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin.js.map +1 -1
  217. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin.ts +38 -14
  218. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin-dbg.js +2 -2
  219. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin-dbg.js.map +1 -1
  220. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin.d.ts +1 -1
  221. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin.d.ts.map +1 -1
  222. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin.js +1 -1
  223. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin.js.map +1 -1
  224. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin.ts +3 -3
  225. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin-dbg.js +69 -20
  226. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin-dbg.js.map +1 -1
  227. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin.d.ts +2 -1
  228. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin.d.ts.map +1 -1
  229. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin.js +1 -1
  230. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin.js.map +1 -1
  231. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin.ts +77 -21
  232. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin-dbg.js +2 -2
  233. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin-dbg.js.map +1 -1
  234. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin.d.ts +1 -1
  235. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin.d.ts.map +1 -1
  236. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin.js +1 -1
  237. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin.js.map +1 -1
  238. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin.ts +3 -3
  239. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin-dbg.js +2 -2
  240. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin-dbg.js.map +1 -1
  241. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin.d.ts +1 -1
  242. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin.d.ts.map +1 -1
  243. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin.js +1 -1
  244. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin.js.map +1 -1
  245. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin.ts +3 -3
  246. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DictionaryMapPlugin-dbg.js +1 -0
  247. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DictionaryMapPlugin-dbg.js.map +1 -1
  248. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DictionaryMapPlugin.d.ts.map +1 -1
  249. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DictionaryMapPlugin.js +1 -1
  250. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DictionaryMapPlugin.js.map +1 -1
  251. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DictionaryMapPlugin.ts +6 -5
  252. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin-dbg.js +8 -3
  253. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin-dbg.js.map +1 -1
  254. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin.d.ts +1 -1
  255. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin.d.ts.map +1 -1
  256. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin.js +1 -1
  257. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin.js.map +1 -1
  258. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin.ts +9 -4
  259. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/EmailPlugin-dbg.js +2 -2
  260. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/EmailPlugin-dbg.js.map +1 -1
  261. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/EmailPlugin.d.ts +1 -1
  262. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/EmailPlugin.d.ts.map +1 -1
  263. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/EmailPlugin.js +1 -1
  264. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/EmailPlugin.js.map +1 -1
  265. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/EmailPlugin.ts +3 -3
  266. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin-dbg.js +2 -2
  267. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin-dbg.js.map +1 -1
  268. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin.d.ts +1 -1
  269. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin.d.ts.map +1 -1
  270. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin.js +1 -1
  271. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin.js.map +1 -1
  272. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin.ts +3 -3
  273. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin-dbg.js +2 -2
  274. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin-dbg.js.map +1 -1
  275. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin.d.ts +1 -1
  276. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin.d.ts.map +1 -1
  277. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin.js +1 -1
  278. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin.js.map +1 -1
  279. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin.ts +3 -3
  280. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/LinkPlugin-dbg.js +2 -2
  281. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/LinkPlugin-dbg.js.map +1 -1
  282. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/LinkPlugin.d.ts +1 -1
  283. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/LinkPlugin.d.ts.map +1 -1
  284. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/LinkPlugin.js +1 -1
  285. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/LinkPlugin.js.map +1 -1
  286. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/LinkPlugin.ts +3 -3
  287. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MessageStripPlugin-dbg.js.map +1 -1
  288. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MessageStripPlugin.d.ts +1 -1
  289. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MessageStripPlugin.d.ts.map +1 -1
  290. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MessageStripPlugin.js.map +1 -1
  291. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MessageStripPlugin.ts +1 -1
  292. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiInputPlugin-dbg.js +6 -5
  293. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiInputPlugin-dbg.js.map +1 -1
  294. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiInputPlugin.d.ts +1 -1
  295. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiInputPlugin.d.ts.map +1 -1
  296. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiInputPlugin.js +1 -1
  297. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiInputPlugin.js.map +1 -1
  298. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiInputPlugin.ts +9 -8
  299. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin-dbg.js +2 -2
  300. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin-dbg.js.map +1 -1
  301. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin.d.ts +1 -1
  302. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin.d.ts.map +1 -1
  303. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin.js +1 -1
  304. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin.js.map +1 -1
  305. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin.ts +3 -3
  306. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin-dbg.js +35 -20
  307. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin-dbg.js.map +1 -1
  308. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin.d.ts +1 -1
  309. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin.d.ts.map +1 -1
  310. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin.js +1 -1
  311. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin.js.map +1 -1
  312. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin.ts +39 -22
  313. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin-dbg.js +5 -3
  314. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin-dbg.js.map +1 -1
  315. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin.d.ts +1 -1
  316. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin.d.ts.map +1 -1
  317. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin.js +1 -1
  318. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin.js.map +1 -1
  319. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin.ts +4 -3
  320. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/PasswordPlugin-dbg.js +2 -2
  321. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/PasswordPlugin-dbg.js.map +1 -1
  322. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/PasswordPlugin.d.ts +1 -1
  323. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/PasswordPlugin.d.ts.map +1 -1
  324. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/PasswordPlugin.js +1 -1
  325. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/PasswordPlugin.js.map +1 -1
  326. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/PasswordPlugin.ts +3 -3
  327. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin-dbg.js +2 -2
  328. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin-dbg.js.map +1 -1
  329. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin.d.ts +1 -1
  330. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin.d.ts.map +1 -1
  331. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin.js +1 -1
  332. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin.js.map +1 -1
  333. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin.ts +3 -3
  334. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ReferencePlugin-dbg.js +28 -12
  335. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ReferencePlugin-dbg.js.map +1 -1
  336. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ReferencePlugin.d.ts +5 -1
  337. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ReferencePlugin.d.ts.map +1 -1
  338. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ReferencePlugin.js +1 -1
  339. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ReferencePlugin.js.map +1 -1
  340. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ReferencePlugin.ts +29 -10
  341. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin-dbg.js +2 -2
  342. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin-dbg.js.map +1 -1
  343. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin.d.ts +1 -1
  344. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin.d.ts.map +1 -1
  345. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin.js +1 -1
  346. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin.js.map +1 -1
  347. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin.ts +3 -3
  348. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin-dbg.js +2 -2
  349. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin-dbg.js.map +1 -1
  350. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin.d.ts +1 -1
  351. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin.d.ts.map +1 -1
  352. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin.js +1 -1
  353. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin.js.map +1 -1
  354. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin.ts +3 -3
  355. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin-dbg.js +2 -2
  356. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin-dbg.js.map +1 -1
  357. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin.d.ts +1 -1
  358. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin.d.ts.map +1 -1
  359. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin.js +1 -1
  360. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin.js.map +1 -1
  361. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin.ts +3 -3
  362. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StepInputPlugin-dbg.js +13 -3
  363. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StepInputPlugin-dbg.js.map +1 -1
  364. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StepInputPlugin.d.ts +1 -1
  365. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StepInputPlugin.d.ts.map +1 -1
  366. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StepInputPlugin.js +1 -1
  367. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StepInputPlugin.js.map +1 -1
  368. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StepInputPlugin.ts +14 -5
  369. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin-dbg.js +2 -2
  370. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin-dbg.js.map +1 -1
  371. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin.d.ts +1 -1
  372. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin.d.ts.map +1 -1
  373. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin.js +1 -1
  374. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin.js.map +1 -1
  375. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin.ts +3 -3
  376. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin-dbg.js +2 -2
  377. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin-dbg.js.map +1 -1
  378. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin.d.ts +1 -1
  379. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin.d.ts.map +1 -1
  380. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin.js +1 -1
  381. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin.js.map +1 -1
  382. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin.ts +3 -3
  383. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin-dbg.js +58 -56
  384. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin-dbg.js.map +1 -1
  385. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin.d.ts +2 -5
  386. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin.d.ts.map +1 -1
  387. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin.js +1 -1
  388. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin.js.map +1 -1
  389. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin.ts +66 -55
  390. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin-dbg.js +2 -2
  391. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin-dbg.js.map +1 -1
  392. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin.d.ts +1 -1
  393. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin.d.ts.map +1 -1
  394. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin.js +1 -1
  395. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin.js.map +1 -1
  396. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin.ts +3 -3
  397. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin-dbg.js +2 -2
  398. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin-dbg.js.map +1 -1
  399. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin.d.ts +1 -1
  400. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin.d.ts.map +1 -1
  401. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin.js +1 -1
  402. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin.js.map +1 -1
  403. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin.ts +3 -3
  404. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/LiveSearchPlugin-dbg.js.map +1 -1
  405. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/LiveSearchPlugin.js.map +1 -1
  406. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/LiveSearchPlugin.ts +110 -109
  407. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/ODataListBindingPlugin-dbg.js +2 -1
  408. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/ODataListBindingPlugin-dbg.js.map +1 -1
  409. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/ODataListBindingPlugin.d.ts.map +1 -1
  410. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/ODataListBindingPlugin.js +1 -1
  411. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/ODataListBindingPlugin.js.map +1 -1
  412. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/ODataListBindingPlugin.ts +66 -64
  413. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteDropdownPlugin-dbg.js +29 -8
  414. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteDropdownPlugin-dbg.js.map +1 -1
  415. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteDropdownPlugin.d.ts +1 -1
  416. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteDropdownPlugin.d.ts.map +1 -1
  417. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteDropdownPlugin.js +1 -1
  418. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteDropdownPlugin.js.map +1 -1
  419. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteDropdownPlugin.ts +145 -118
  420. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteValueHelpPlugin-dbg.js.map +1 -1
  421. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteValueHelpPlugin.js.map +1 -1
  422. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteValueHelpPlugin.ts +106 -105
  423. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/IsNotNullConditionPlugin-dbg.js +41 -0
  424. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/IsNotNullConditionPlugin-dbg.js.map +1 -0
  425. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/IsNotNullConditionPlugin.d.ts +24 -0
  426. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/IsNotNullConditionPlugin.d.ts.map +1 -0
  427. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/IsNotNullConditionPlugin.js +2 -0
  428. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/IsNotNullConditionPlugin.js.map +1 -0
  429. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/IsNotNullConditionPlugin.ts +34 -0
  430. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/IsNullConditionPlugin-dbg.js +41 -0
  431. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/IsNullConditionPlugin-dbg.js.map +1 -0
  432. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/IsNullConditionPlugin.d.ts +24 -0
  433. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/IsNullConditionPlugin.d.ts.map +1 -0
  434. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/IsNullConditionPlugin.js +2 -0
  435. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/IsNullConditionPlugin.js.map +1 -0
  436. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/IsNullConditionPlugin.ts +34 -0
  437. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/NumericGreaterThanConditionPlugin-dbg.js +52 -0
  438. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/NumericGreaterThanConditionPlugin-dbg.js.map +1 -0
  439. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/NumericGreaterThanConditionPlugin.d.ts +30 -0
  440. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/NumericGreaterThanConditionPlugin.d.ts.map +1 -0
  441. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/NumericGreaterThanConditionPlugin.js +2 -0
  442. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/NumericGreaterThanConditionPlugin.js.map +1 -0
  443. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/NumericGreaterThanConditionPlugin.ts +45 -0
  444. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/NumericLessThanConditionPlugin-dbg.js +52 -0
  445. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/NumericLessThanConditionPlugin-dbg.js.map +1 -0
  446. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/NumericLessThanConditionPlugin.d.ts +30 -0
  447. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/NumericLessThanConditionPlugin.d.ts.map +1 -0
  448. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/NumericLessThanConditionPlugin.js +2 -0
  449. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/NumericLessThanConditionPlugin.js.map +1 -0
  450. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/NumericLessThanConditionPlugin.ts +45 -0
  451. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/StringEqualsConditionPlugin-dbg.js +41 -0
  452. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/StringEqualsConditionPlugin-dbg.js.map +1 -0
  453. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/StringEqualsConditionPlugin.d.ts +24 -0
  454. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/StringEqualsConditionPlugin.d.ts.map +1 -0
  455. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/StringEqualsConditionPlugin.js +2 -0
  456. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/StringEqualsConditionPlugin.js.map +1 -0
  457. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/conditions/StringEqualsConditionPlugin.ts +34 -0
  458. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/EditableEffectPlugin-dbg.js +40 -0
  459. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/EditableEffectPlugin-dbg.js.map +1 -0
  460. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/EditableEffectPlugin.d.ts +28 -0
  461. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/EditableEffectPlugin.d.ts.map +1 -0
  462. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/EditableEffectPlugin.js +2 -0
  463. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/EditableEffectPlugin.js.map +1 -0
  464. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/EditableEffectPlugin.ts +34 -0
  465. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/RequirementEffectPlugin-dbg.js +40 -0
  466. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/RequirementEffectPlugin-dbg.js.map +1 -0
  467. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/RequirementEffectPlugin.d.ts +28 -0
  468. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/RequirementEffectPlugin.d.ts.map +1 -0
  469. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/RequirementEffectPlugin.js +2 -0
  470. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/RequirementEffectPlugin.js.map +1 -0
  471. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/RequirementEffectPlugin.ts +34 -0
  472. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/ValidityEffectPlugin-dbg.js +40 -0
  473. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/ValidityEffectPlugin-dbg.js.map +1 -0
  474. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/ValidityEffectPlugin.d.ts +28 -0
  475. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/ValidityEffectPlugin.d.ts.map +1 -0
  476. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/ValidityEffectPlugin.js +2 -0
  477. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/ValidityEffectPlugin.js.map +1 -0
  478. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/ValidityEffectPlugin.ts +34 -0
  479. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/VisibilityEffectPlugin-dbg.js +40 -0
  480. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/VisibilityEffectPlugin-dbg.js.map +1 -0
  481. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/VisibilityEffectPlugin.d.ts +28 -0
  482. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/VisibilityEffectPlugin.d.ts.map +1 -0
  483. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/VisibilityEffectPlugin.js +2 -0
  484. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/VisibilityEffectPlugin.js.map +1 -0
  485. package/src/nz/co/siliconst/ui5/metaui/plugins/policies/effects/VisibilityEffectPlugin.ts +34 -0
  486. package/src/nz/co/siliconst/ui5/metaui/services/SchemaProvider-dbg.js +33 -0
  487. package/src/nz/co/siliconst/ui5/metaui/services/SchemaProvider-dbg.js.map +1 -0
  488. package/src/nz/co/siliconst/ui5/metaui/services/SchemaProvider.d.ts +14 -0
  489. package/src/nz/co/siliconst/ui5/metaui/services/SchemaProvider.d.ts.map +1 -0
  490. package/src/nz/co/siliconst/ui5/metaui/services/SchemaProvider.js +2 -0
  491. package/src/nz/co/siliconst/ui5/metaui/services/SchemaProvider.js.map +1 -0
  492. package/src/nz/co/siliconst/ui5/metaui/services/SchemaProvider.ts +24 -0
  493. package/src/nz/co/siliconst/ui5/metaui/core/ConditionEngine-dbg.js +0 -75
  494. package/src/nz/co/siliconst/ui5/metaui/core/ConditionEngine-dbg.js.map +0 -1
  495. package/src/nz/co/siliconst/ui5/metaui/core/ConditionEngine.d.ts +0 -47
  496. package/src/nz/co/siliconst/ui5/metaui/core/ConditionEngine.d.ts.map +0 -1
  497. package/src/nz/co/siliconst/ui5/metaui/core/ConditionEngine.js +0 -2
  498. package/src/nz/co/siliconst/ui5/metaui/core/ConditionEngine.js.map +0 -1
  499. 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
- import { ConditionEngine } from "./ConditionEngine";
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
- /** Handles dynamic conditional logic across the active form. */
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?: any;
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: any, modelName: string = "meta", onSubmit?: () => void, engineScopeId?: string, onChange?: (isValid: boolean, fieldKey?: string, errorMessage?: string, controlId?: string) => void): Control {
83
- this.conditionEngine = new ConditionEngine(schema);
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 (this.conditionEngine && fieldKey) {
89
- this.conditionEngine.handleEvent(fieldKey, isValid);
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
- if (this.conditionEngine) {
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 && typeof item.plugin.setVisualValidationState === "function") {
189
- item.plugin.setVisualValidationState(result.isValid, result.errorMessage);
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.startsWith("/") ? path : `/${path}`;
215
- const match = this.activePlugins.find(p => p.path === cleanPath || p.path === `/${cleanPath}`);
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
- if (messagesToRemove.length > 0) {
250
- messageManager.removeMessages(messagesToRemove);
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":"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","ignoreList":[]}
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;KAyDhC;CAEA"}
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 u=!!e?.ui?.widget;const a=e?.type===n.OBJECT&&e.ui?.renderMode===o.INLINE&&!u;if(a&&e.properties){const s={type:"Group",label:e.ui?.label||i.split("/").pop(),elements:[]};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});
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,CAC7Bd,KAAM,QACNe,MAAOZ,EAAKI,IAAIQ,OAASX,EAAYY,MAAM,KAAKC,MAChDrB,SAAU,IAId,IAAK,MAAMsB,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":[]}
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;