@siliconst/metaui 1.4.17 → 1.4.20

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 (395) hide show
  1. package/package.json +1 -1
  2. package/src/nz/co/siliconst/ui5/metaui/ai/AIConfig-dbg.js +47 -0
  3. package/src/nz/co/siliconst/ui5/metaui/ai/AIConfig-dbg.js.map +1 -0
  4. package/src/nz/co/siliconst/ui5/metaui/ai/AIConfig.d.ts +28 -0
  5. package/src/nz/co/siliconst/ui5/metaui/ai/AIConfig.d.ts.map +1 -0
  6. package/src/nz/co/siliconst/ui5/metaui/ai/AIConfig.js +2 -0
  7. package/src/nz/co/siliconst/ui5/metaui/ai/AIConfig.js.map +1 -0
  8. package/src/nz/co/siliconst/ui5/metaui/ai/AIConfig.ts +39 -0
  9. package/src/nz/co/siliconst/ui5/metaui/ai/BaseAIGenerator-dbg.js +83 -0
  10. package/src/nz/co/siliconst/ui5/metaui/ai/BaseAIGenerator-dbg.js.map +1 -0
  11. package/src/nz/co/siliconst/ui5/metaui/ai/BaseAIGenerator.d.ts +30 -0
  12. package/src/nz/co/siliconst/ui5/metaui/ai/BaseAIGenerator.d.ts.map +1 -0
  13. package/src/nz/co/siliconst/ui5/metaui/ai/BaseAIGenerator.js +2 -0
  14. package/src/nz/co/siliconst/ui5/metaui/ai/BaseAIGenerator.js.map +1 -0
  15. package/src/nz/co/siliconst/ui5/metaui/ai/BaseAIGenerator.ts +74 -0
  16. package/src/nz/co/siliconst/ui5/metaui/ai/MockLLMProxy-dbg.js +61 -0
  17. package/src/nz/co/siliconst/ui5/metaui/ai/MockLLMProxy-dbg.js.map +1 -0
  18. package/src/nz/co/siliconst/ui5/metaui/ai/MockLLMProxy.d.ts +13 -0
  19. package/src/nz/co/siliconst/ui5/metaui/ai/MockLLMProxy.d.ts.map +1 -0
  20. package/src/nz/co/siliconst/ui5/metaui/ai/MockLLMProxy.js +2 -0
  21. package/src/nz/co/siliconst/ui5/metaui/ai/MockLLMProxy.js.map +1 -0
  22. package/src/nz/co/siliconst/ui5/metaui/ai/MockLLMProxy.ts +59 -0
  23. package/src/nz/co/siliconst/ui5/metaui/ai/RestLLMProxy-dbg.js +50 -0
  24. package/src/nz/co/siliconst/ui5/metaui/ai/RestLLMProxy-dbg.js.map +1 -0
  25. package/src/nz/co/siliconst/ui5/metaui/ai/RestLLMProxy.d.ts +12 -0
  26. package/src/nz/co/siliconst/ui5/metaui/ai/RestLLMProxy.d.ts.map +1 -0
  27. package/src/nz/co/siliconst/ui5/metaui/ai/RestLLMProxy.js +2 -0
  28. package/src/nz/co/siliconst/ui5/metaui/ai/RestLLMProxy.js.map +1 -0
  29. package/src/nz/co/siliconst/ui5/metaui/ai/RestLLMProxy.ts +44 -0
  30. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost-dbg.js +79 -13
  31. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost-dbg.js.map +1 -1
  32. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.d.ts +12 -0
  33. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.d.ts.map +1 -1
  34. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.js +1 -1
  35. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.js.map +1 -1
  36. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.ts +77 -15
  37. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost-dbg.js +31 -1
  38. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost-dbg.js.map +1 -1
  39. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.d.ts +15 -0
  40. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.d.ts.map +1 -1
  41. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.js +1 -1
  42. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.js.map +1 -1
  43. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.ts +26 -1
  44. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate-dbg.js +35 -0
  45. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate-dbg.js.map +1 -1
  46. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate.d.ts +8 -0
  47. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate.d.ts.map +1 -1
  48. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate.js +1 -1
  49. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate.js.map +1 -1
  50. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate.ts +37 -0
  51. package/src/nz/co/siliconst/ui5/metaui/core/DefaultLayoutGenerator-dbg.js +11 -32
  52. package/src/nz/co/siliconst/ui5/metaui/core/DefaultLayoutGenerator-dbg.js.map +1 -1
  53. package/src/nz/co/siliconst/ui5/metaui/core/DefaultLayoutGenerator.d.ts.map +1 -1
  54. package/src/nz/co/siliconst/ui5/metaui/core/DefaultLayoutGenerator.js +1 -1
  55. package/src/nz/co/siliconst/ui5/metaui/core/DefaultLayoutGenerator.js.map +1 -1
  56. package/src/nz/co/siliconst/ui5/metaui/core/DefaultLayoutGenerator.ts +9 -13
  57. package/src/nz/co/siliconst/ui5/metaui/core/Engine-dbg.js +6 -2
  58. package/src/nz/co/siliconst/ui5/metaui/core/Engine-dbg.js.map +1 -1
  59. package/src/nz/co/siliconst/ui5/metaui/core/Engine.d.ts +2 -0
  60. package/src/nz/co/siliconst/ui5/metaui/core/Engine.d.ts.map +1 -1
  61. package/src/nz/co/siliconst/ui5/metaui/core/Engine.js +1 -1
  62. package/src/nz/co/siliconst/ui5/metaui/core/Engine.js.map +1 -1
  63. package/src/nz/co/siliconst/ui5/metaui/core/Engine.ts +12 -7
  64. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry-dbg.js +3 -0
  65. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry-dbg.js.map +1 -1
  66. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry.d.ts.map +1 -1
  67. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry.js +1 -1
  68. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry.js.map +1 -1
  69. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry.ts +3 -0
  70. package/src/nz/co/siliconst/ui5/metaui/core/SchemaBuilderRegistry-dbg.js +3 -3
  71. package/src/nz/co/siliconst/ui5/metaui/core/SchemaBuilderRegistry-dbg.js.map +1 -1
  72. package/src/nz/co/siliconst/ui5/metaui/core/SchemaBuilderRegistry.d.ts +1 -1
  73. package/src/nz/co/siliconst/ui5/metaui/core/SchemaBuilderRegistry.d.ts.map +1 -1
  74. package/src/nz/co/siliconst/ui5/metaui/core/SchemaBuilderRegistry.js +1 -1
  75. package/src/nz/co/siliconst/ui5/metaui/core/SchemaBuilderRegistry.js.map +1 -1
  76. package/src/nz/co/siliconst/ui5/metaui/core/SchemaBuilderRegistry.ts +3 -3
  77. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer-dbg.js +4 -4
  78. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer-dbg.js.map +1 -1
  79. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.d.ts +2 -2
  80. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.d.ts.map +1 -1
  81. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.js +1 -1
  82. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.js.map +1 -1
  83. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.ts +10 -10
  84. package/src/nz/co/siliconst/ui5/metaui/core/SchemaValidator-dbg.js +1 -1
  85. package/src/nz/co/siliconst/ui5/metaui/core/SchemaValidator-dbg.js.map +1 -1
  86. package/src/nz/co/siliconst/ui5/metaui/core/SchemaValidator.js +1 -1
  87. package/src/nz/co/siliconst/ui5/metaui/core/SchemaValidator.js.map +1 -1
  88. package/src/nz/co/siliconst/ui5/metaui/core/SchemaValidator.ts +1 -1
  89. package/src/nz/co/siliconst/ui5/metaui/interfaces/IPlugin-dbg.js.map +1 -1
  90. package/src/nz/co/siliconst/ui5/metaui/interfaces/IPlugin.d.ts +1 -1
  91. package/src/nz/co/siliconst/ui5/metaui/interfaces/IPlugin.d.ts.map +1 -1
  92. package/src/nz/co/siliconst/ui5/metaui/interfaces/IPlugin.ts +1 -1
  93. package/src/nz/co/siliconst/ui5/metaui/interfaces/ISchema-dbg.js.map +1 -1
  94. package/src/nz/co/siliconst/ui5/metaui/interfaces/ISchema.d.ts +19 -3
  95. package/src/nz/co/siliconst/ui5/metaui/interfaces/ISchema.d.ts.map +1 -1
  96. package/src/nz/co/siliconst/ui5/metaui/interfaces/ISchema.ts +22 -3
  97. package/src/nz/co/siliconst/ui5/metaui/interfaces/ISchemaBuilderPlugin-dbg.js.map +1 -1
  98. package/src/nz/co/siliconst/ui5/metaui/interfaces/ISchemaBuilderPlugin.d.ts +3 -2
  99. package/src/nz/co/siliconst/ui5/metaui/interfaces/ISchemaBuilderPlugin.d.ts.map +1 -1
  100. package/src/nz/co/siliconst/ui5/metaui/interfaces/ISchemaBuilderPlugin.ts +3 -2
  101. package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout-dbg.js +18 -2
  102. package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout-dbg.js.map +1 -1
  103. package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout.d.ts.map +1 -1
  104. package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout.js +1 -1
  105. package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout.js.map +1 -1
  106. package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout.ts +19 -2
  107. package/src/nz/co/siliconst/ui5/metaui/library-dbg.js +1 -1
  108. package/src/nz/co/siliconst/ui5/metaui/library-dbg.js.map +1 -1
  109. package/src/nz/co/siliconst/ui5/metaui/library-preload.js +62 -43
  110. package/src/nz/co/siliconst/ui5/metaui/library-preload.js.map +1 -1
  111. package/src/nz/co/siliconst/ui5/metaui/library.d.ts +4 -0
  112. package/src/nz/co/siliconst/ui5/metaui/library.d.ts.map +1 -1
  113. package/src/nz/co/siliconst/ui5/metaui/library.js +1 -1
  114. package/src/nz/co/siliconst/ui5/metaui/library.js.map +1 -1
  115. package/src/nz/co/siliconst/ui5/metaui/library.ts +6 -0
  116. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiBuilder-dbg.js +93 -0
  117. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiBuilder-dbg.js.map +1 -0
  118. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiBuilder.d.ts +52 -0
  119. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiBuilder.d.ts.map +1 -0
  120. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiBuilder.js +2 -0
  121. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiBuilder.js.map +1 -0
  122. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiBuilder.ts +88 -0
  123. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiParserFactory-dbg.js +47 -0
  124. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiParserFactory-dbg.js.map +1 -0
  125. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiParserFactory.d.ts +25 -0
  126. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiParserFactory.d.ts.map +1 -0
  127. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiParserFactory.js +2 -0
  128. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiParserFactory.js.map +1 -0
  129. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiParserFactory.ts +43 -0
  130. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiRefResolver-dbg.js +68 -0
  131. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiRefResolver-dbg.js.map +1 -0
  132. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiRefResolver.d.ts +21 -0
  133. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiRefResolver.d.ts.map +1 -0
  134. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiRefResolver.js +2 -0
  135. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiRefResolver.js.map +1 -0
  136. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiRefResolver.ts +61 -0
  137. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiTypeMapper-dbg.js +45 -0
  138. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiTypeMapper-dbg.js.map +1 -0
  139. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiTypeMapper.d.ts +25 -0
  140. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiTypeMapper.d.ts.map +1 -0
  141. package/src/nz/co/siliconst/ui5/metaui/{swagger/SwaggerTypeMapper.js → openapi/OpenApiTypeMapper.js} +2 -2
  142. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiTypeMapper.js.map +1 -0
  143. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiTypeMapper.ts +36 -0
  144. package/src/nz/co/siliconst/ui5/metaui/{swagger/SwaggerUIMapper-dbg.js → openapi/OpenApiUIMapper-dbg.js} +23 -14
  145. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiUIMapper-dbg.js.map +1 -0
  146. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiUIMapper.d.ts +34 -0
  147. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiUIMapper.d.ts.map +1 -0
  148. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiUIMapper.js +2 -0
  149. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiUIMapper.js.map +1 -0
  150. package/src/nz/co/siliconst/ui5/metaui/{swagger/SwaggerUIMapper.ts → openapi/OpenApiUIMapper.ts} +22 -13
  151. package/src/nz/co/siliconst/ui5/metaui/openapi/heuristics/OpenApiHeuristicEngine-dbg.js +50 -0
  152. package/src/nz/co/siliconst/ui5/metaui/openapi/heuristics/OpenApiHeuristicEngine-dbg.js.map +1 -0
  153. package/src/nz/co/siliconst/ui5/metaui/openapi/heuristics/OpenApiHeuristicEngine.d.ts +25 -0
  154. package/src/nz/co/siliconst/ui5/metaui/openapi/heuristics/OpenApiHeuristicEngine.d.ts.map +1 -0
  155. package/src/nz/co/siliconst/ui5/metaui/openapi/heuristics/OpenApiHeuristicEngine.js +2 -0
  156. package/src/nz/co/siliconst/ui5/metaui/openapi/heuristics/OpenApiHeuristicEngine.js.map +1 -0
  157. package/src/nz/co/siliconst/ui5/metaui/openapi/heuristics/OpenApiHeuristicEngine.ts +43 -0
  158. package/src/nz/co/siliconst/ui5/metaui/openapi/heuristics/interfaces/IHeuristicPlugin-dbg.js +2 -0
  159. package/src/nz/co/siliconst/ui5/metaui/openapi/heuristics/interfaces/IHeuristicPlugin-dbg.js.map +1 -0
  160. package/src/nz/co/siliconst/ui5/metaui/openapi/heuristics/interfaces/IHeuristicPlugin.d.ts +23 -0
  161. package/src/nz/co/siliconst/ui5/metaui/openapi/heuristics/interfaces/IHeuristicPlugin.d.ts.map +1 -0
  162. package/src/nz/co/siliconst/ui5/metaui/openapi/heuristics/interfaces/IHeuristicPlugin.js +2 -0
  163. package/src/nz/co/siliconst/ui5/metaui/openapi/heuristics/interfaces/IHeuristicPlugin.js.map +1 -0
  164. package/src/nz/co/siliconst/ui5/metaui/openapi/heuristics/interfaces/IHeuristicPlugin.ts +21 -0
  165. package/src/nz/co/siliconst/ui5/metaui/openapi/heuristics/plugins/ProtobufVariantHeuristic-dbg.js +117 -0
  166. package/src/nz/co/siliconst/ui5/metaui/openapi/heuristics/plugins/ProtobufVariantHeuristic-dbg.js.map +1 -0
  167. package/src/nz/co/siliconst/ui5/metaui/openapi/heuristics/plugins/ProtobufVariantHeuristic.d.ts +47 -0
  168. package/src/nz/co/siliconst/ui5/metaui/openapi/heuristics/plugins/ProtobufVariantHeuristic.d.ts.map +1 -0
  169. package/src/nz/co/siliconst/ui5/metaui/openapi/heuristics/plugins/ProtobufVariantHeuristic.js +2 -0
  170. package/src/nz/co/siliconst/ui5/metaui/openapi/heuristics/plugins/ProtobufVariantHeuristic.js.map +1 -0
  171. package/src/nz/co/siliconst/ui5/metaui/openapi/heuristics/plugins/ProtobufVariantHeuristic.ts +113 -0
  172. package/src/nz/co/siliconst/ui5/metaui/openapi/interfaces/IOpenApiParserPlugin-dbg.js +2 -0
  173. package/src/nz/co/siliconst/ui5/metaui/openapi/interfaces/IOpenApiParserPlugin-dbg.js.map +1 -0
  174. package/src/nz/co/siliconst/ui5/metaui/openapi/interfaces/IOpenApiParserPlugin.d.ts +26 -0
  175. package/src/nz/co/siliconst/ui5/metaui/openapi/interfaces/IOpenApiParserPlugin.d.ts.map +1 -0
  176. package/src/nz/co/siliconst/ui5/metaui/openapi/interfaces/IOpenApiParserPlugin.js +2 -0
  177. package/src/nz/co/siliconst/ui5/metaui/openapi/interfaces/IOpenApiParserPlugin.js.map +1 -0
  178. package/src/nz/co/siliconst/ui5/metaui/openapi/interfaces/IOpenApiParserPlugin.ts +25 -0
  179. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi2Parser-dbg.js +106 -0
  180. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi2Parser-dbg.js.map +1 -0
  181. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi2Parser.d.ts +27 -0
  182. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi2Parser.d.ts.map +1 -0
  183. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi2Parser.js +2 -0
  184. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi2Parser.js.map +1 -0
  185. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi2Parser.ts +104 -0
  186. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi3Parser-dbg.js +107 -0
  187. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi3Parser-dbg.js.map +1 -0
  188. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi3Parser.d.ts +27 -0
  189. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi3Parser.d.ts.map +1 -0
  190. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi3Parser.js +2 -0
  191. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi3Parser.js.map +1 -0
  192. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi3Parser.ts +105 -0
  193. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApiPropertyMapper-dbg.js +347 -0
  194. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApiPropertyMapper-dbg.js.map +1 -0
  195. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApiPropertyMapper.d.ts +110 -0
  196. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApiPropertyMapper.d.ts.map +1 -0
  197. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApiPropertyMapper.js +2 -0
  198. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApiPropertyMapper.js.map +1 -0
  199. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApiPropertyMapper.ts +377 -0
  200. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin-dbg.js +11 -0
  201. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin-dbg.js.map +1 -1
  202. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin.d.ts.map +1 -1
  203. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin.js +1 -1
  204. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin.js.map +1 -1
  205. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin.ts +13 -0
  206. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin-dbg.js +2 -2
  207. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin-dbg.js.map +1 -1
  208. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin.js +1 -1
  209. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin.js.map +1 -1
  210. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin.ts +2 -2
  211. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin-dbg.js +31 -7
  212. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin-dbg.js.map +1 -1
  213. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.d.ts +17 -1
  214. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.d.ts.map +1 -1
  215. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.js +1 -1
  216. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.js.map +1 -1
  217. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.ts +33 -8
  218. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin-dbg.js +3 -4
  219. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin-dbg.js.map +1 -1
  220. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin.d.ts.map +1 -1
  221. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin.js +1 -1
  222. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin.js.map +1 -1
  223. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin.ts +3 -4
  224. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin-dbg.js +2 -2
  225. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin-dbg.js.map +1 -1
  226. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin.js +1 -1
  227. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin.js.map +1 -1
  228. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin.ts +2 -2
  229. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin-dbg.js +1 -1
  230. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin-dbg.js.map +1 -1
  231. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin.js +1 -1
  232. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin.js.map +1 -1
  233. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin.ts +1 -1
  234. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin-dbg.js +4 -8
  235. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin-dbg.js.map +1 -1
  236. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin.d.ts.map +1 -1
  237. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin.js +1 -1
  238. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin.js.map +1 -1
  239. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin.ts +4 -8
  240. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin-dbg.js +4 -8
  241. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin-dbg.js.map +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 +4 -8
  246. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DictionaryMapPlugin-dbg.js +217 -0
  247. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DictionaryMapPlugin-dbg.js.map +1 -0
  248. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DictionaryMapPlugin.d.ts +26 -0
  249. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DictionaryMapPlugin.d.ts.map +1 -0
  250. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DictionaryMapPlugin.js +2 -0
  251. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DictionaryMapPlugin.js.map +1 -0
  252. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DictionaryMapPlugin.ts +249 -0
  253. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin-dbg.js +3 -4
  254. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin-dbg.js.map +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 +3 -4
  259. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin-dbg.js +3 -3
  260. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin-dbg.js.map +1 -1
  261. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin.js +1 -1
  262. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin.js.map +1 -1
  263. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin.ts +3 -3
  264. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin-dbg.js +3 -4
  265. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin-dbg.js.map +1 -1
  266. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin.d.ts.map +1 -1
  267. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin.js +1 -1
  268. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin.js.map +1 -1
  269. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin.ts +4 -5
  270. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MessageStripPlugin-dbg.js +1 -1
  271. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MessageStripPlugin-dbg.js.map +1 -1
  272. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MessageStripPlugin.js +1 -1
  273. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MessageStripPlugin.js.map +1 -1
  274. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MessageStripPlugin.ts +1 -1
  275. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiInputPlugin-dbg.js +115 -49
  276. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiInputPlugin-dbg.js.map +1 -1
  277. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiInputPlugin.d.ts +17 -2
  278. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiInputPlugin.d.ts.map +1 -1
  279. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiInputPlugin.js +1 -1
  280. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiInputPlugin.js.map +1 -1
  281. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiInputPlugin.ts +114 -54
  282. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin-dbg.js +3 -4
  283. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin-dbg.js.map +1 -1
  284. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin.d.ts.map +1 -1
  285. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin.js +1 -1
  286. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin.js.map +1 -1
  287. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin.ts +3 -4
  288. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin-dbg.js +3 -2
  289. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin-dbg.js.map +1 -1
  290. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin.d.ts.map +1 -1
  291. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin.js +1 -1
  292. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin.js.map +1 -1
  293. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin.ts +3 -2
  294. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin-dbg.js +2 -2
  295. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin-dbg.js.map +1 -1
  296. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin.js +1 -1
  297. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin.js.map +1 -1
  298. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin.ts +2 -2
  299. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ReferencePlugin-dbg.js +194 -0
  300. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ReferencePlugin-dbg.js.map +1 -0
  301. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ReferencePlugin.d.ts +25 -0
  302. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ReferencePlugin.d.ts.map +1 -0
  303. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ReferencePlugin.js +2 -0
  304. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ReferencePlugin.js.map +1 -0
  305. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ReferencePlugin.ts +192 -0
  306. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin-dbg.js +2 -2
  307. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin-dbg.js.map +1 -1
  308. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin.js +1 -1
  309. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin.js.map +1 -1
  310. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin.ts +2 -2
  311. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin-dbg.js +2 -2
  312. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin-dbg.js.map +1 -1
  313. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin.js +1 -1
  314. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin.js.map +1 -1
  315. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin.ts +2 -2
  316. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin-dbg.js +2 -2
  317. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin-dbg.js.map +1 -1
  318. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin.js +1 -1
  319. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin.js.map +1 -1
  320. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin.ts +2 -2
  321. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StepInputPlugin-dbg.js +2 -2
  322. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StepInputPlugin-dbg.js.map +1 -1
  323. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StepInputPlugin.js +1 -1
  324. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StepInputPlugin.js.map +1 -1
  325. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StepInputPlugin.ts +2 -2
  326. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin-dbg.js +2 -2
  327. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin-dbg.js.map +1 -1
  328. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin.js +1 -1
  329. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin.js.map +1 -1
  330. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin.ts +2 -2
  331. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin-dbg.js +3 -4
  332. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin-dbg.js.map +1 -1
  333. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin.d.ts.map +1 -1
  334. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin.js +1 -1
  335. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin.js.map +1 -1
  336. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin.ts +3 -4
  337. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin-dbg.js +2 -2
  338. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin-dbg.js.map +1 -1
  339. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin.js +1 -1
  340. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin.js.map +1 -1
  341. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin.ts +2 -2
  342. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin-dbg.js +4 -8
  343. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin-dbg.js.map +1 -1
  344. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin.d.ts.map +1 -1
  345. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin.js +1 -1
  346. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin.js.map +1 -1
  347. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin.ts +4 -8
  348. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin-dbg.js +3 -4
  349. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin-dbg.js.map +1 -1
  350. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin.d.ts.map +1 -1
  351. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin.js +1 -1
  352. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin.js.map +1 -1
  353. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin.ts +3 -4
  354. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/LiveSearchPlugin-dbg.js +2 -2
  355. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/LiveSearchPlugin-dbg.js.map +1 -1
  356. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/LiveSearchPlugin.js +1 -1
  357. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/LiveSearchPlugin.js.map +1 -1
  358. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/LiveSearchPlugin.ts +2 -2
  359. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteValueHelpPlugin-dbg.js +2 -2
  360. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteValueHelpPlugin-dbg.js.map +1 -1
  361. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteValueHelpPlugin.js +1 -1
  362. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteValueHelpPlugin.js.map +1 -1
  363. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteValueHelpPlugin.ts +2 -2
  364. package/src/nz/co/siliconst/ui5/metaui/swagger/OpenApiExtractor-dbg.js +146 -0
  365. package/src/nz/co/siliconst/ui5/metaui/swagger/OpenApiExtractor-dbg.js.map +1 -0
  366. package/src/nz/co/siliconst/ui5/metaui/swagger/OpenApiExtractor.d.ts +27 -0
  367. package/src/nz/co/siliconst/ui5/metaui/swagger/OpenApiExtractor.d.ts.map +1 -0
  368. package/src/nz/co/siliconst/ui5/metaui/swagger/OpenApiExtractor.js +2 -0
  369. package/src/nz/co/siliconst/ui5/metaui/swagger/OpenApiExtractor.js.map +1 -0
  370. package/src/nz/co/siliconst/ui5/metaui/swagger/OpenApiExtractor.ts +160 -0
  371. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerBuilder-dbg.js +0 -226
  372. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerBuilder-dbg.js.map +0 -1
  373. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerBuilder.d.ts +0 -63
  374. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerBuilder.d.ts.map +0 -1
  375. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerBuilder.js +0 -2
  376. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerBuilder.js.map +0 -1
  377. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerBuilder.ts +0 -233
  378. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerRefResolver-dbg.js +0 -43
  379. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerRefResolver-dbg.js.map +0 -1
  380. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerRefResolver.d.ts +0 -15
  381. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerRefResolver.d.ts.map +0 -1
  382. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerRefResolver.js +0 -2
  383. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerRefResolver.js.map +0 -1
  384. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerRefResolver.ts +0 -37
  385. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerTypeMapper-dbg.js +0 -37
  386. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerTypeMapper-dbg.js.map +0 -1
  387. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerTypeMapper.d.ts +0 -18
  388. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerTypeMapper.d.ts.map +0 -1
  389. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerTypeMapper.js.map +0 -1
  390. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerTypeMapper.ts +0 -28
  391. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerUIMapper-dbg.js.map +0 -1
  392. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerUIMapper.d.ts +0 -27
  393. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerUIMapper.d.ts.map +0 -1
  394. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerUIMapper.js +0 -2
  395. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerUIMapper.js.map +0 -1
@@ -0,0 +1,217 @@
1
+ sap.ui.define(["./BasePlugin", "../../core/PluginRegistry", "sap/m/VBox", "sap/m/HBox", "sap/m/Input", "sap/m/Button", "sap/m/Title", "sap/m/Table", "sap/m/Column", "sap/m/Label", "sap/m/ColumnListItem", "sap/ui/model/json/JSONModel", "sap/m/Dialog"], function (___BasePlugin, ____core_PluginRegistry, VBox, HBox, Input, Button, Title, Table, Column, Label, ColumnListItem, JSONModel, Dialog) {
2
+ "use strict";
3
+
4
+ /**
5
+ * @file DictionaryMapPlugin.ts
6
+ * @description Plugin for rendering open-ended JSON Dictionaries (additionalProperties).
7
+ */
8
+ const BasePlugin = ___BasePlugin["BasePlugin"];
9
+ const PluginRegistry = ____core_PluginRegistry["PluginRegistry"];
10
+ /**
11
+ * Plugin for rendering open-ended JSON Dictionaries (additionalProperties).
12
+ * Uses a local JSONModel and sap.m.Table to provide a stable, zero-hack UI5 two-way binding experience.
13
+ *
14
+ * @public
15
+ */
16
+ class DictionaryMapPlugin extends BasePlugin {
17
+ _isSyncing = false;
18
+ _binding = null;
19
+ canHandle(schema) {
20
+ return schema.type === "object" && typeof schema.additionalProperties === "object";
21
+ }
22
+ render(schema, bindingPath, modelName, engineScopeId, onChange, model) {
23
+ this.onChange = onChange;
24
+ this.metadata = schema;
25
+ const valueSchema = schema.additionalProperties || {
26
+ type: "string"
27
+ };
28
+ const container = new VBox({
29
+ width: "100%"
30
+ }).addStyleClass("sapUiSmallMarginTopBottom");
31
+ const absolutePath = bindingPath.startsWith("/") ? bindingPath : `/${bindingPath}`;
32
+
33
+ // 1. Initialize local flat array model for the Table
34
+ const currentData = model ? model.getProperty(absolutePath) || {} : {};
35
+ const localItems = Object.keys(currentData).map(k => ({
36
+ key: k,
37
+ value: currentData[k]
38
+ }));
39
+ const localModel = new JSONModel({
40
+ items: localItems
41
+ });
42
+
43
+ // Setup listener to flush local model back to parent dictionary model
44
+ const syncToParent = () => {
45
+ if (!model) return;
46
+ this._isSyncing = true;
47
+ const items = localModel.getProperty("/items");
48
+ const newDict = {};
49
+ items.forEach(item => {
50
+ if (item.key && item.key.trim() !== "") {
51
+ newDict[item.key] = item.value;
52
+ }
53
+ });
54
+ model.setProperty(absolutePath, newDict);
55
+ if (this.onChange) this.onChange();
56
+ this._isSyncing = false;
57
+ };
58
+ if (model) {
59
+ this._binding = model.bindProperty(absolutePath);
60
+ this._binding.attachChange(() => {
61
+ if (this._isSyncing) return;
62
+ const currentData = model.getProperty(absolutePath) || {};
63
+ const localItems = Object.keys(currentData).map(k => ({
64
+ key: k,
65
+ value: currentData[k]
66
+ }));
67
+ localModel.setProperty("/items", localItems);
68
+ });
69
+ this._binding.initialize();
70
+ }
71
+ const headerItems = [new Title({
72
+ text: schema.title || schema.ui?.label || "Dictionary Map",
73
+ level: "H5"
74
+ })];
75
+ if (this.isEditable) {
76
+ headerItems.push(new Button({
77
+ text: "Add Property",
78
+ icon: "sap-icon://add",
79
+ press: () => {
80
+ const items = localModel.getProperty("/items");
81
+ items.push({
82
+ key: "",
83
+ value: null
84
+ });
85
+ localModel.setProperty("/items", items);
86
+ syncToParent();
87
+ }
88
+ }));
89
+ }
90
+ const header = new HBox({
91
+ justifyContent: "SpaceBetween",
92
+ alignItems: "Center",
93
+ items: headerItems
94
+ }).addStyleClass("sapUiSmallMarginBottom");
95
+ container.addItem(header);
96
+
97
+ // 2. Build the Table
98
+ const columns = [new Column({
99
+ header: new Label({
100
+ text: "Key"
101
+ })
102
+ }), new Column({
103
+ header: new Label({
104
+ text: "Value"
105
+ })
106
+ })];
107
+ if (this.isEditable) {
108
+ columns.push(new Column({
109
+ width: "4rem",
110
+ hAlign: "Center"
111
+ }));
112
+ }
113
+ const table = new Table({
114
+ mode: "None",
115
+ noDataText: "No metadata properties defined.",
116
+ columns: columns
117
+ });
118
+ table.setModel(localModel, "localDict");
119
+ table.bindItems({
120
+ path: "localDict>/items",
121
+ factory: (sId, oContext) => {
122
+ const rowPath = oContext.getPath();
123
+
124
+ // Key Input
125
+ const keyInput = new Input({
126
+ value: "{localDict>key}",
127
+ editable: this.isEditable,
128
+ change: () => syncToParent()
129
+ });
130
+
131
+ // Value Control
132
+ const plugin = PluginRegistry.getInstance().getPlugin(valueSchema.type || "string", valueSchema.ui?.widget);
133
+
134
+ // Temporarily override value schema readOnly state if the dictionary as a whole is readOnly
135
+ const effectiveValueSchema = {
136
+ ...valueSchema
137
+ };
138
+ if (!this.isEditable) {
139
+ if (!effectiveValueSchema.ui) effectiveValueSchema.ui = {};
140
+ effectiveValueSchema.ui.readOnly = true;
141
+ }
142
+ const valueControl = plugin.render(effectiveValueSchema, `${rowPath}/value`, "localDict", "dict_" + Date.now(), () => syncToParent(), localModel);
143
+ const cells = [keyInput, valueControl];
144
+ if (this.isEditable) {
145
+ const delBtn = new Button({
146
+ icon: "sap-icon://delete",
147
+ type: "Reject",
148
+ press: () => {
149
+ const items = localModel.getProperty("/items");
150
+ const matchIndex = parseInt(rowPath.split("/").pop() || "0", 10);
151
+ items.splice(matchIndex, 1);
152
+ localModel.setProperty("/items", items);
153
+ syncToParent();
154
+ }
155
+ });
156
+ cells.push(delBtn);
157
+ }
158
+ return new ColumnListItem({
159
+ cells
160
+ });
161
+ }
162
+ });
163
+ container.addItem(table);
164
+ this.control = new Button({
165
+ id: this.generateStableId(engineScopeId, bindingPath),
166
+ text: !this.isEditable ? "View Dictionary" : "Edit Dictionary",
167
+ icon: !this.isEditable ? "sap-icon://display" : "sap-icon://form",
168
+ press: () => {
169
+ const dialog = new Dialog({
170
+ title: schema.title || schema.ui?.label || "Dictionary Map",
171
+ contentWidth: "600px",
172
+ contentHeight: "400px",
173
+ horizontalScrolling: false,
174
+ content: [container],
175
+ buttons: [new Button({
176
+ text: !this.isEditable ? "Close" : "OK",
177
+ type: "Emphasized",
178
+ press: () => {
179
+ dialog.close();
180
+ }
181
+ })],
182
+ afterClose: () => {
183
+ // Remove container so it isn't destroyed when the dialog is destroyed
184
+ dialog.removeAllContent();
185
+ dialog.destroy();
186
+ }
187
+ });
188
+
189
+ // Add dependent to ensure models are inherited properly if needed
190
+ if (this.control) {
191
+ this.control.addDependent(dialog);
192
+ }
193
+ dialog.open();
194
+ }
195
+ });
196
+ return this.control;
197
+ }
198
+ getValue() {
199
+ return null;
200
+ }
201
+ validate() {
202
+ return {
203
+ isValid: true
204
+ };
205
+ }
206
+ applyState() {}
207
+ destroy() {
208
+ if (this._binding) {
209
+ this._binding.destroy();
210
+ this._binding = null;
211
+ }
212
+ super.destroy();
213
+ }
214
+ }
215
+ return DictionaryMapPlugin;
216
+ });
217
+ //# sourceMappingURL=DictionaryMapPlugin-dbg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DictionaryMapPlugin-dbg.js","names":["BasePlugin","___BasePlugin","PluginRegistry","____core_PluginRegistry","DictionaryMapPlugin","_isSyncing","_binding","canHandle","schema","type","additionalProperties","render","bindingPath","modelName","engineScopeId","onChange","model","metadata","valueSchema","container","VBox","width","addStyleClass","absolutePath","startsWith","currentData","getProperty","localItems","Object","keys","map","k","key","value","localModel","JSONModel","items","syncToParent","newDict","forEach","item","trim","setProperty","bindProperty","attachChange","initialize","headerItems","Title","text","title","ui","label","level","isEditable","push","Button","icon","press","header","HBox","justifyContent","alignItems","addItem","columns","Column","Label","hAlign","table","Table","mode","noDataText","setModel","bindItems","path","factory","sId","oContext","rowPath","getPath","keyInput","Input","editable","change","plugin","getInstance","getPlugin","widget","effectiveValueSchema","readOnly","valueControl","Date","now","cells","delBtn","matchIndex","parseInt","split","pop","splice","ColumnListItem","control","id","generateStableId","dialog","Dialog","contentWidth","contentHeight","horizontalScrolling","content","buttons","close","afterClose","removeAllContent","destroy","addDependent","open","getValue","validate","isValid","applyState"],"sources":["DictionaryMapPlugin.ts"],"sourcesContent":["/**\n * @file DictionaryMapPlugin.ts\n * @description Plugin for rendering open-ended JSON Dictionaries (additionalProperties).\n */\n\nimport { BasePlugin } from \"./BasePlugin\";\nimport { ISchema, IPropertyMetadata } from \"../../interfaces/ISchema\";\nimport { PluginRegistry } from \"../../core/PluginRegistry\";\nimport VBox from \"sap/m/VBox\";\nimport HBox from \"sap/m/HBox\";\nimport Input from \"sap/m/Input\";\nimport Button from \"sap/m/Button\";\nimport Title from \"sap/m/Title\";\nimport Table from \"sap/m/Table\";\nimport Column from \"sap/m/Column\";\nimport Label from \"sap/m/Label\";\nimport ColumnListItem from \"sap/m/ColumnListItem\";\nimport JSONModel from \"sap/ui/model/json/JSONModel\";\nimport Control from \"sap/ui/core/Control\";\nimport Dialog from \"sap/m/Dialog\";\nimport Toolbar from \"sap/m/Toolbar\";\nimport ToolbarSpacer from \"sap/m/ToolbarSpacer\";\n\n/**\n * Plugin for rendering open-ended JSON Dictionaries (additionalProperties).\n * Uses a local JSONModel and sap.m.Table to provide a stable, zero-hack UI5 two-way binding experience.\n * \n * @public\n */\nexport default class DictionaryMapPlugin extends BasePlugin {\n private _isSyncing: boolean = false;\n private _binding: sap.ui.model.PropertyBinding | null = null;\n\n public canHandle(schema: ISchema | IPropertyMetadata): boolean {\n return schema.type === \"object\" && typeof schema.additionalProperties === \"object\";\n }\n\n public render(\n schema: ISchema | IPropertyMetadata, \n bindingPath: string, \n modelName: string, \n engineScopeId: string, \n onChange?: () => void, \n model?: sap.ui.model.Model\n ): Control {\n this.onChange = onChange;\n this.metadata = schema as IPropertyMetadata;\n\n\n\n const valueSchema = (schema.additionalProperties as IPropertyMetadata) || { type: \"string\" };\n const container = new VBox({ width: \"100%\" }).addStyleClass(\"sapUiSmallMarginTopBottom\");\n \n const absolutePath = bindingPath.startsWith(\"/\") ? bindingPath : `/${bindingPath}`;\n \n // 1. Initialize local flat array model for the Table\n const currentData = model ? model.getProperty(absolutePath) || {} : {};\n\n \n const localItems = Object.keys(currentData).map(k => ({ key: k, value: currentData[k] }));\n const localModel = new JSONModel({ items: localItems });\n \n // Setup listener to flush local model back to parent dictionary model\n const syncToParent = () => {\n if (!model) return;\n this._isSyncing = true;\n const items = localModel.getProperty(\"/items\") as any[];\n const newDict: Record<string, any> = {};\n items.forEach(item => {\n if (item.key && item.key.trim() !== \"\") {\n newDict[item.key] = item.value;\n }\n });\n\n model.setProperty(absolutePath, newDict);\n if (this.onChange) this.onChange();\n this._isSyncing = false;\n };\n\n if (model) {\n this._binding = model.bindProperty(absolutePath);\n this._binding.attachChange(() => {\n if (this._isSyncing) return;\n const currentData = model.getProperty(absolutePath) || {};\n\n const localItems = Object.keys(currentData).map(k => ({ key: k, value: currentData[k] }));\n localModel.setProperty(\"/items\", localItems);\n });\n this._binding.initialize();\n }\n\n const headerItems: Control[] = [\n new Title({ text: schema.title || schema.ui?.label || \"Dictionary Map\", level: \"H5\" })\n ];\n\n if (this.isEditable) {\n headerItems.push(\n new Button({\n text: \"Add Property\",\n icon: \"sap-icon://add\",\n press: () => {\n const items = localModel.getProperty(\"/items\") as any[];\n items.push({ key: \"\", value: null });\n localModel.setProperty(\"/items\", items);\n syncToParent();\n }\n })\n );\n }\n\n const header = new HBox({\n justifyContent: \"SpaceBetween\",\n alignItems: \"Center\",\n items: headerItems\n }).addStyleClass(\"sapUiSmallMarginBottom\");\n\n container.addItem(header);\n\n // 2. Build the Table\n const columns = [\n new Column({ header: new Label({ text: \"Key\" }) }),\n new Column({ header: new Label({ text: \"Value\" }) })\n ];\n\n if (this.isEditable) {\n columns.push(new Column({ width: \"4rem\", hAlign: \"Center\" }));\n }\n\n const table = new Table({\n mode: \"None\",\n noDataText: \"No metadata properties defined.\",\n columns: columns\n });\n\n table.setModel(localModel, \"localDict\");\n\n table.bindItems({\n path: \"localDict>/items\",\n factory: (sId: string, oContext: sap.ui.model.Context) => {\n const rowPath = oContext.getPath();\n \n // Key Input\n const keyInput = new Input({\n value: \"{localDict>key}\",\n editable: this.isEditable,\n change: () => syncToParent()\n });\n\n // Value Control\n const plugin = PluginRegistry.getInstance().getPlugin(valueSchema.type || \"string\", valueSchema.ui?.widget);\n \n // Temporarily override value schema readOnly state if the dictionary as a whole is readOnly\n const effectiveValueSchema = { ...valueSchema };\n if (!this.isEditable) {\n if (!effectiveValueSchema.ui) effectiveValueSchema.ui = {};\n effectiveValueSchema.ui.readOnly = true;\n }\n\n const valueControl = plugin.render(\n effectiveValueSchema,\n `${rowPath}/value`,\n \"localDict\",\n \"dict_\" + Date.now(),\n () => syncToParent(),\n localModel\n );\n\n const cells: Control[] = [keyInput, valueControl];\n\n if (this.isEditable) {\n const delBtn = new Button({\n icon: \"sap-icon://delete\",\n type: \"Reject\",\n press: () => {\n const items = localModel.getProperty(\"/items\") as any[];\n const matchIndex = parseInt(rowPath.split(\"/\").pop() || \"0\", 10);\n items.splice(matchIndex, 1);\n localModel.setProperty(\"/items\", items);\n syncToParent();\n }\n });\n cells.push(delBtn);\n }\n\n return new ColumnListItem({ cells });\n }\n });\n\n container.addItem(table);\n\n this.control = new Button({\n id: this.generateStableId(engineScopeId, bindingPath),\n text: !this.isEditable ? \"View Dictionary\" : \"Edit Dictionary\",\n icon: !this.isEditable ? \"sap-icon://display\" : \"sap-icon://form\",\n press: () => {\n\n const dialog = new Dialog({\n title: schema.title || schema.ui?.label || \"Dictionary Map\",\n contentWidth: \"600px\",\n contentHeight: \"400px\",\n horizontalScrolling: false,\n content: [container],\n buttons: [\n new Button({\n text: !this.isEditable ? \"Close\" : \"OK\",\n type: \"Emphasized\",\n press: () => {\n dialog.close();\n }\n })\n ],\n afterClose: () => {\n // Remove container so it isn't destroyed when the dialog is destroyed\n dialog.removeAllContent();\n dialog.destroy();\n }\n });\n \n // Add dependent to ensure models are inherited properly if needed\n if (this.control) {\n this.control.addDependent(dialog);\n }\n \n dialog.open();\n }\n });\n\n return this.control as Control;\n }\n\n protected getValue(): unknown {\n return null;\n }\n\n public validate(): import(\"../../interfaces/IPlugin\").IPluginValidationResult {\n return { isValid: true };\n }\n\n protected applyState(): void {\n }\n\n public destroy(): void {\n if (this._binding) {\n this._binding.destroy();\n this._binding = null;\n }\n super.destroy();\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,26 @@
1
+ declare module "nz/co/siliconst/ui5/metaui/plugins/controls/DictionaryMapPlugin" {
2
+ /**
3
+ * @file DictionaryMapPlugin.ts
4
+ * @description Plugin for rendering open-ended JSON Dictionaries (additionalProperties).
5
+ */
6
+ import { BasePlugin } from "nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin";
7
+ import { ISchema, IPropertyMetadata } from "nz/co/siliconst/ui5/metaui/interfaces/ISchema";
8
+ import Control from "sap/ui/core/Control";
9
+ /**
10
+ * Plugin for rendering open-ended JSON Dictionaries (additionalProperties).
11
+ * Uses a local JSONModel and sap.m.Table to provide a stable, zero-hack UI5 two-way binding experience.
12
+ *
13
+ * @public
14
+ */
15
+ export default class DictionaryMapPlugin extends BasePlugin {
16
+ private _isSyncing;
17
+ private _binding;
18
+ canHandle(schema: ISchema | IPropertyMetadata): boolean;
19
+ render(schema: ISchema | IPropertyMetadata, bindingPath: string, modelName: string, engineScopeId: string, onChange?: () => void, model?: sap.ui.model.Model): Control;
20
+ protected getValue(): unknown;
21
+ validate(): import("nz/co/siliconst/ui5/metaui/interfaces/IPlugin").IPluginValidationResult;
22
+ protected applyState(): void;
23
+ destroy(): void;
24
+ }
25
+ }
26
+ //# sourceMappingURL=DictionaryMapPlugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DictionaryMapPlugin.d.ts","sourceRoot":"../../../../../../../../..","sources":["src/nz/co/siliconst/ui5/metaui/plugins/controls/DictionaryMapPlugin.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,iEAAiE,CAAC;IACjF;;;OAGG;IAEH,OAAO,EAAE,UAAU,EAAE,MAAM,wDAAwD,CAAC;IACpF,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;IAY3F,OAAO,OAAO,MAAM,qBAAqB,CAAC;IAK1C;;;;;OAKG;IACH,MAAM,CAAC,OAAO,OAAO,mBAAoB,SAAQ,UAAU;QACvD,OAAO,CAAC,UAAU,CAAkB;QACpC,OAAO,CAAC,QAAQ,CAA6C;QAEtD,SAAS,CAAC,MAAM,EAAE,OAAO,GAAG,iBAAiB,GAAG,OAAO;QAIvD,MAAM,CACT,MAAM,EAAE,OAAO,GAAG,iBAAiB,EACnC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,QAAQ,CAAC,EAAE,MAAM,IAAI,EACrB,KAAK,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,GAC3B,OAAO;QA0LV,SAAS,CAAC,QAAQ,IAAI,OAAO;QAItB,QAAQ,IAAI,OAAO,+CAA+C,EAAE,uBAAuB;QAIlG,SAAS,CAAC,UAAU,IAAI,IAAI;QAGrB,OAAO,IAAI,IAAI;KAOzB;CAEA"}
@@ -0,0 +1,2 @@
1
+ sap.ui.define(["./BasePlugin","../../core/PluginRegistry","sap/m/VBox","sap/m/HBox","sap/m/Input","sap/m/Button","sap/m/Title","sap/m/Table","sap/m/Column","sap/m/Label","sap/m/ColumnListItem","sap/ui/model/json/JSONModel","sap/m/Dialog"],function(t,e,i,n,s,o,a,l,r,c,d,p,u){"use strict";const h=t["BasePlugin"];const y=e["PluginRegistry"];class g extends h{_isSyncing=false;_binding=null;canHandle(t){return t.type==="object"&&typeof t.additionalProperties==="object"}render(t,e,h,g,m,b){this.onChange=m;this.metadata=t;const f=t.additionalProperties||{type:"string"};const w=new i({width:"100%"}).addStyleClass("sapUiSmallMarginTopBottom");const P=e.startsWith("/")?e:`/${e}`;const C=b?b.getProperty(P)||{}:{};const S=Object.keys(C).map(t=>({key:t,value:C[t]}));const x=new p({items:S});const D=()=>{if(!b)return;this._isSyncing=true;const t=x.getProperty("/items");const e={};t.forEach(t=>{if(t.key&&t.key.trim()!==""){e[t.key]=t.value}});b.setProperty(P,e);if(this.onChange)this.onChange();this._isSyncing=false};if(b){this._binding=b.bindProperty(P);this._binding.attachChange(()=>{if(this._isSyncing)return;const t=b.getProperty(P)||{};const e=Object.keys(t).map(e=>({key:e,value:t[e]}));x.setProperty("/items",e)});this._binding.initialize()}const _=[new a({text:t.title||t.ui?.label||"Dictionary Map",level:"H5"})];if(this.isEditable){_.push(new o({text:"Add Property",icon:"sap-icon://add",press:()=>{const t=x.getProperty("/items");t.push({key:"",value:null});x.setProperty("/items",t);D()}}))}const E=new n({justifyContent:"SpaceBetween",alignItems:"Center",items:_}).addStyleClass("sapUiSmallMarginBottom");w.addItem(E);const k=[new r({header:new c({text:"Key"})}),new r({header:new c({text:"Value"})})];if(this.isEditable){k.push(new r({width:"4rem",hAlign:"Center"}))}const v=new l({mode:"None",noDataText:"No metadata properties defined.",columns:k});v.setModel(x,"localDict");v.bindItems({path:"localDict>/items",factory:(t,e)=>{const i=e.getPath();const n=new s({value:"{localDict>key}",editable:this.isEditable,change:()=>D()});const a=y.getInstance().getPlugin(f.type||"string",f.ui?.widget);const l={...f};if(!this.isEditable){if(!l.ui)l.ui={};l.ui.readOnly=true}const r=a.render(l,`${i}/value`,"localDict","dict_"+Date.now(),()=>D(),x);const c=[n,r];if(this.isEditable){const t=new o({icon:"sap-icon://delete",type:"Reject",press:()=>{const t=x.getProperty("/items");const e=parseInt(i.split("/").pop()||"0",10);t.splice(e,1);x.setProperty("/items",t);D()}});c.push(t)}return new d({cells:c})}});w.addItem(v);this.control=new o({id:this.generateStableId(g,e),text:!this.isEditable?"View Dictionary":"Edit Dictionary",icon:!this.isEditable?"sap-icon://display":"sap-icon://form",press:()=>{const e=new u({title:t.title||t.ui?.label||"Dictionary Map",contentWidth:"600px",contentHeight:"400px",horizontalScrolling:false,content:[w],buttons:[new o({text:!this.isEditable?"Close":"OK",type:"Emphasized",press:()=>{e.close()}})],afterClose:()=>{e.removeAllContent();e.destroy()}});if(this.control){this.control.addDependent(e)}e.open()}});return this.control}getValue(){return null}validate(){return{isValid:true}}applyState(){}destroy(){if(this._binding){this._binding.destroy();this._binding=null}super.destroy()}}return g});
2
+ //# sourceMappingURL=DictionaryMapPlugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DictionaryMapPlugin.js","names":["BasePlugin","___BasePlugin","PluginRegistry","____core_PluginRegistry","DictionaryMapPlugin","_isSyncing","_binding","canHandle","schema","type","additionalProperties","render","bindingPath","modelName","engineScopeId","onChange","model","this","metadata","valueSchema","container","VBox","width","addStyleClass","absolutePath","startsWith","currentData","getProperty","localItems","Object","keys","map","k","key","value","localModel","JSONModel","items","syncToParent","newDict","forEach","item","trim","setProperty","bindProperty","attachChange","initialize","headerItems","Title","text","title","ui","label","level","isEditable","push","Button","icon","press","header","HBox","justifyContent","alignItems","addItem","columns","Column","Label","hAlign","table","Table","mode","noDataText","setModel","bindItems","path","factory","sId","oContext","rowPath","getPath","keyInput","Input","editable","change","plugin","getInstance","getPlugin","widget","effectiveValueSchema","readOnly","valueControl","Date","now","cells","delBtn","matchIndex","parseInt","split","pop","splice","ColumnListItem","control","id","generateStableId","dialog","Dialog","contentWidth","contentHeight","horizontalScrolling","content","buttons","close","afterClose","removeAllContent","destroy","addDependent","open","getValue","validate","isValid","applyState","super"],"sources":["DictionaryMapPlugin.ts"],"sourcesContent":["/**\n * @file DictionaryMapPlugin.ts\n * @description Plugin for rendering open-ended JSON Dictionaries (additionalProperties).\n */\n\nimport { BasePlugin } from \"./BasePlugin\";\nimport { ISchema, IPropertyMetadata } from \"../../interfaces/ISchema\";\nimport { PluginRegistry } from \"../../core/PluginRegistry\";\nimport VBox from \"sap/m/VBox\";\nimport HBox from \"sap/m/HBox\";\nimport Input from \"sap/m/Input\";\nimport Button from \"sap/m/Button\";\nimport Title from \"sap/m/Title\";\nimport Table from \"sap/m/Table\";\nimport Column from \"sap/m/Column\";\nimport Label from \"sap/m/Label\";\nimport ColumnListItem from \"sap/m/ColumnListItem\";\nimport JSONModel from \"sap/ui/model/json/JSONModel\";\nimport Control from \"sap/ui/core/Control\";\nimport Dialog from \"sap/m/Dialog\";\nimport Toolbar from \"sap/m/Toolbar\";\nimport ToolbarSpacer from \"sap/m/ToolbarSpacer\";\n\n/**\n * Plugin for rendering open-ended JSON Dictionaries (additionalProperties).\n * Uses a local JSONModel and sap.m.Table to provide a stable, zero-hack UI5 two-way binding experience.\n * \n * @public\n */\nexport default class DictionaryMapPlugin extends BasePlugin {\n private _isSyncing: boolean = false;\n private _binding: sap.ui.model.PropertyBinding | null = null;\n\n public canHandle(schema: ISchema | IPropertyMetadata): boolean {\n return schema.type === \"object\" && typeof schema.additionalProperties === \"object\";\n }\n\n public render(\n schema: ISchema | IPropertyMetadata, \n bindingPath: string, \n modelName: string, \n engineScopeId: string, \n onChange?: () => void, \n model?: sap.ui.model.Model\n ): Control {\n this.onChange = onChange;\n this.metadata = schema as IPropertyMetadata;\n\n\n\n const valueSchema = (schema.additionalProperties as IPropertyMetadata) || { type: \"string\" };\n const container = new VBox({ width: \"100%\" }).addStyleClass(\"sapUiSmallMarginTopBottom\");\n \n const absolutePath = bindingPath.startsWith(\"/\") ? bindingPath : `/${bindingPath}`;\n \n // 1. Initialize local flat array model for the Table\n const currentData = model ? model.getProperty(absolutePath) || {} : {};\n\n \n const localItems = Object.keys(currentData).map(k => ({ key: k, value: currentData[k] }));\n const localModel = new JSONModel({ items: localItems });\n \n // Setup listener to flush local model back to parent dictionary model\n const syncToParent = () => {\n if (!model) return;\n this._isSyncing = true;\n const items = localModel.getProperty(\"/items\") as any[];\n const newDict: Record<string, any> = {};\n items.forEach(item => {\n if (item.key && item.key.trim() !== \"\") {\n newDict[item.key] = item.value;\n }\n });\n\n model.setProperty(absolutePath, newDict);\n if (this.onChange) this.onChange();\n this._isSyncing = false;\n };\n\n if (model) {\n this._binding = model.bindProperty(absolutePath);\n this._binding.attachChange(() => {\n if (this._isSyncing) return;\n const currentData = model.getProperty(absolutePath) || {};\n\n const localItems = Object.keys(currentData).map(k => ({ key: k, value: currentData[k] }));\n localModel.setProperty(\"/items\", localItems);\n });\n this._binding.initialize();\n }\n\n const headerItems: Control[] = [\n new Title({ text: schema.title || schema.ui?.label || \"Dictionary Map\", level: \"H5\" })\n ];\n\n if (this.isEditable) {\n headerItems.push(\n new Button({\n text: \"Add Property\",\n icon: \"sap-icon://add\",\n press: () => {\n const items = localModel.getProperty(\"/items\") as any[];\n items.push({ key: \"\", value: null });\n localModel.setProperty(\"/items\", items);\n syncToParent();\n }\n })\n );\n }\n\n const header = new HBox({\n justifyContent: \"SpaceBetween\",\n alignItems: \"Center\",\n items: headerItems\n }).addStyleClass(\"sapUiSmallMarginBottom\");\n\n container.addItem(header);\n\n // 2. Build the Table\n const columns = [\n new Column({ header: new Label({ text: \"Key\" }) }),\n new Column({ header: new Label({ text: \"Value\" }) })\n ];\n\n if (this.isEditable) {\n columns.push(new Column({ width: \"4rem\", hAlign: \"Center\" }));\n }\n\n const table = new Table({\n mode: \"None\",\n noDataText: \"No metadata properties defined.\",\n columns: columns\n });\n\n table.setModel(localModel, \"localDict\");\n\n table.bindItems({\n path: \"localDict>/items\",\n factory: (sId: string, oContext: sap.ui.model.Context) => {\n const rowPath = oContext.getPath();\n \n // Key Input\n const keyInput = new Input({\n value: \"{localDict>key}\",\n editable: this.isEditable,\n change: () => syncToParent()\n });\n\n // Value Control\n const plugin = PluginRegistry.getInstance().getPlugin(valueSchema.type || \"string\", valueSchema.ui?.widget);\n \n // Temporarily override value schema readOnly state if the dictionary as a whole is readOnly\n const effectiveValueSchema = { ...valueSchema };\n if (!this.isEditable) {\n if (!effectiveValueSchema.ui) effectiveValueSchema.ui = {};\n effectiveValueSchema.ui.readOnly = true;\n }\n\n const valueControl = plugin.render(\n effectiveValueSchema,\n `${rowPath}/value`,\n \"localDict\",\n \"dict_\" + Date.now(),\n () => syncToParent(),\n localModel\n );\n\n const cells: Control[] = [keyInput, valueControl];\n\n if (this.isEditable) {\n const delBtn = new Button({\n icon: \"sap-icon://delete\",\n type: \"Reject\",\n press: () => {\n const items = localModel.getProperty(\"/items\") as any[];\n const matchIndex = parseInt(rowPath.split(\"/\").pop() || \"0\", 10);\n items.splice(matchIndex, 1);\n localModel.setProperty(\"/items\", items);\n syncToParent();\n }\n });\n cells.push(delBtn);\n }\n\n return new ColumnListItem({ cells });\n }\n });\n\n container.addItem(table);\n\n this.control = new Button({\n id: this.generateStableId(engineScopeId, bindingPath),\n text: !this.isEditable ? \"View Dictionary\" : \"Edit Dictionary\",\n icon: !this.isEditable ? \"sap-icon://display\" : \"sap-icon://form\",\n press: () => {\n\n const dialog = new Dialog({\n title: schema.title || schema.ui?.label || \"Dictionary Map\",\n contentWidth: \"600px\",\n contentHeight: \"400px\",\n horizontalScrolling: false,\n content: [container],\n buttons: [\n new Button({\n text: !this.isEditable ? \"Close\" : \"OK\",\n type: \"Emphasized\",\n press: () => {\n dialog.close();\n }\n })\n ],\n afterClose: () => {\n // Remove container so it isn't destroyed when the dialog is destroyed\n dialog.removeAllContent();\n dialog.destroy();\n }\n });\n \n // Add dependent to ensure models are inherited properly if needed\n if (this.control) {\n this.control.addDependent(dialog);\n }\n \n dialog.open();\n }\n });\n\n return this.control as Control;\n }\n\n protected getValue(): unknown {\n return null;\n }\n\n public validate(): import(\"../../interfaces/IPlugin\").IPluginValidationResult {\n return { isValid: true };\n }\n\n protected applyState(): void {\n }\n\n public destroy(): void {\n if (this._binding) {\n this._binding.destroy();\n this._binding = null;\n }\n super.destroy();\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,249 @@
1
+ /**
2
+ * @file DictionaryMapPlugin.ts
3
+ * @description Plugin for rendering open-ended JSON Dictionaries (additionalProperties).
4
+ */
5
+
6
+ import { BasePlugin } from "./BasePlugin";
7
+ import { ISchema, IPropertyMetadata } from "../../interfaces/ISchema";
8
+ import { PluginRegistry } from "../../core/PluginRegistry";
9
+ import VBox from "sap/m/VBox";
10
+ import HBox from "sap/m/HBox";
11
+ import Input from "sap/m/Input";
12
+ import Button from "sap/m/Button";
13
+ import Title from "sap/m/Title";
14
+ import Table from "sap/m/Table";
15
+ import Column from "sap/m/Column";
16
+ import Label from "sap/m/Label";
17
+ import ColumnListItem from "sap/m/ColumnListItem";
18
+ import JSONModel from "sap/ui/model/json/JSONModel";
19
+ import Control from "sap/ui/core/Control";
20
+ import Dialog from "sap/m/Dialog";
21
+ import Toolbar from "sap/m/Toolbar";
22
+ import ToolbarSpacer from "sap/m/ToolbarSpacer";
23
+
24
+ /**
25
+ * Plugin for rendering open-ended JSON Dictionaries (additionalProperties).
26
+ * Uses a local JSONModel and sap.m.Table to provide a stable, zero-hack UI5 two-way binding experience.
27
+ *
28
+ * @public
29
+ */
30
+ export default class DictionaryMapPlugin extends BasePlugin {
31
+ private _isSyncing: boolean = false;
32
+ private _binding: sap.ui.model.PropertyBinding | null = null;
33
+
34
+ public canHandle(schema: ISchema | IPropertyMetadata): boolean {
35
+ return schema.type === "object" && typeof schema.additionalProperties === "object";
36
+ }
37
+
38
+ public render(
39
+ schema: ISchema | IPropertyMetadata,
40
+ bindingPath: string,
41
+ modelName: string,
42
+ engineScopeId: string,
43
+ onChange?: () => void,
44
+ model?: sap.ui.model.Model
45
+ ): Control {
46
+ this.onChange = onChange;
47
+ this.metadata = schema as IPropertyMetadata;
48
+
49
+
50
+
51
+ const valueSchema = (schema.additionalProperties as IPropertyMetadata) || { type: "string" };
52
+ const container = new VBox({ width: "100%" }).addStyleClass("sapUiSmallMarginTopBottom");
53
+
54
+ const absolutePath = bindingPath.startsWith("/") ? bindingPath : `/${bindingPath}`;
55
+
56
+ // 1. Initialize local flat array model for the Table
57
+ const currentData = model ? model.getProperty(absolutePath) || {} : {};
58
+
59
+
60
+ const localItems = Object.keys(currentData).map(k => ({ key: k, value: currentData[k] }));
61
+ const localModel = new JSONModel({ items: localItems });
62
+
63
+ // Setup listener to flush local model back to parent dictionary model
64
+ const syncToParent = () => {
65
+ if (!model) return;
66
+ this._isSyncing = true;
67
+ const items = localModel.getProperty("/items") as any[];
68
+ const newDict: Record<string, any> = {};
69
+ items.forEach(item => {
70
+ if (item.key && item.key.trim() !== "") {
71
+ newDict[item.key] = item.value;
72
+ }
73
+ });
74
+
75
+ model.setProperty(absolutePath, newDict);
76
+ if (this.onChange) this.onChange();
77
+ this._isSyncing = false;
78
+ };
79
+
80
+ if (model) {
81
+ this._binding = model.bindProperty(absolutePath);
82
+ this._binding.attachChange(() => {
83
+ if (this._isSyncing) return;
84
+ const currentData = model.getProperty(absolutePath) || {};
85
+
86
+ const localItems = Object.keys(currentData).map(k => ({ key: k, value: currentData[k] }));
87
+ localModel.setProperty("/items", localItems);
88
+ });
89
+ this._binding.initialize();
90
+ }
91
+
92
+ const headerItems: Control[] = [
93
+ new Title({ text: schema.title || schema.ui?.label || "Dictionary Map", level: "H5" })
94
+ ];
95
+
96
+ if (this.isEditable) {
97
+ headerItems.push(
98
+ new Button({
99
+ text: "Add Property",
100
+ icon: "sap-icon://add",
101
+ press: () => {
102
+ const items = localModel.getProperty("/items") as any[];
103
+ items.push({ key: "", value: null });
104
+ localModel.setProperty("/items", items);
105
+ syncToParent();
106
+ }
107
+ })
108
+ );
109
+ }
110
+
111
+ const header = new HBox({
112
+ justifyContent: "SpaceBetween",
113
+ alignItems: "Center",
114
+ items: headerItems
115
+ }).addStyleClass("sapUiSmallMarginBottom");
116
+
117
+ container.addItem(header);
118
+
119
+ // 2. Build the Table
120
+ const columns = [
121
+ new Column({ header: new Label({ text: "Key" }) }),
122
+ new Column({ header: new Label({ text: "Value" }) })
123
+ ];
124
+
125
+ if (this.isEditable) {
126
+ columns.push(new Column({ width: "4rem", hAlign: "Center" }));
127
+ }
128
+
129
+ const table = new Table({
130
+ mode: "None",
131
+ noDataText: "No metadata properties defined.",
132
+ columns: columns
133
+ });
134
+
135
+ table.setModel(localModel, "localDict");
136
+
137
+ table.bindItems({
138
+ path: "localDict>/items",
139
+ factory: (sId: string, oContext: sap.ui.model.Context) => {
140
+ const rowPath = oContext.getPath();
141
+
142
+ // Key Input
143
+ const keyInput = new Input({
144
+ value: "{localDict>key}",
145
+ editable: this.isEditable,
146
+ change: () => syncToParent()
147
+ });
148
+
149
+ // Value Control
150
+ const plugin = PluginRegistry.getInstance().getPlugin(valueSchema.type || "string", valueSchema.ui?.widget);
151
+
152
+ // Temporarily override value schema readOnly state if the dictionary as a whole is readOnly
153
+ const effectiveValueSchema = { ...valueSchema };
154
+ if (!this.isEditable) {
155
+ if (!effectiveValueSchema.ui) effectiveValueSchema.ui = {};
156
+ effectiveValueSchema.ui.readOnly = true;
157
+ }
158
+
159
+ const valueControl = plugin.render(
160
+ effectiveValueSchema,
161
+ `${rowPath}/value`,
162
+ "localDict",
163
+ "dict_" + Date.now(),
164
+ () => syncToParent(),
165
+ localModel
166
+ );
167
+
168
+ const cells: Control[] = [keyInput, valueControl];
169
+
170
+ if (this.isEditable) {
171
+ const delBtn = new Button({
172
+ icon: "sap-icon://delete",
173
+ type: "Reject",
174
+ press: () => {
175
+ const items = localModel.getProperty("/items") as any[];
176
+ const matchIndex = parseInt(rowPath.split("/").pop() || "0", 10);
177
+ items.splice(matchIndex, 1);
178
+ localModel.setProperty("/items", items);
179
+ syncToParent();
180
+ }
181
+ });
182
+ cells.push(delBtn);
183
+ }
184
+
185
+ return new ColumnListItem({ cells });
186
+ }
187
+ });
188
+
189
+ container.addItem(table);
190
+
191
+ this.control = new Button({
192
+ id: this.generateStableId(engineScopeId, bindingPath),
193
+ text: !this.isEditable ? "View Dictionary" : "Edit Dictionary",
194
+ icon: !this.isEditable ? "sap-icon://display" : "sap-icon://form",
195
+ press: () => {
196
+
197
+ const dialog = new Dialog({
198
+ title: schema.title || schema.ui?.label || "Dictionary Map",
199
+ contentWidth: "600px",
200
+ contentHeight: "400px",
201
+ horizontalScrolling: false,
202
+ content: [container],
203
+ buttons: [
204
+ new Button({
205
+ text: !this.isEditable ? "Close" : "OK",
206
+ type: "Emphasized",
207
+ press: () => {
208
+ dialog.close();
209
+ }
210
+ })
211
+ ],
212
+ afterClose: () => {
213
+ // Remove container so it isn't destroyed when the dialog is destroyed
214
+ dialog.removeAllContent();
215
+ dialog.destroy();
216
+ }
217
+ });
218
+
219
+ // Add dependent to ensure models are inherited properly if needed
220
+ if (this.control) {
221
+ this.control.addDependent(dialog);
222
+ }
223
+
224
+ dialog.open();
225
+ }
226
+ });
227
+
228
+ return this.control as Control;
229
+ }
230
+
231
+ protected getValue(): unknown {
232
+ return null;
233
+ }
234
+
235
+ public validate(): import("../../interfaces/IPlugin").IPluginValidationResult {
236
+ return { isValid: true };
237
+ }
238
+
239
+ protected applyState(): void {
240
+ }
241
+
242
+ public destroy(): void {
243
+ if (this._binding) {
244
+ this._binding.destroy();
245
+ this._binding = null;
246
+ }
247
+ super.destroy();
248
+ }
249
+ }
@@ -35,20 +35,19 @@ sap.ui.define(["./BasePlugin", "sap/m/Select", "sap/ui/core/Item", "sap/m/Text"]
35
35
  })) : [];
36
36
  this.control = new TextControl({
37
37
  id: this.generateStableId(engineScopeId, bindingPath),
38
- text: {
39
- path: `${modelName}>${bindingPath}`,
38
+ text: this.generateBindingInfo(bindingPath, modelName, undefined, {
40
39
  formatter: key => {
41
40
  const match = valueHelpArray.find(vh => vh.key === key);
42
41
  return match ? match.text : key;
43
42
  }
44
- }
43
+ })
45
44
  });
46
45
  this.applyCommonDirectives(this.control, fieldMetadata, modelName);
47
46
  return this.control;
48
47
  }
49
48
  const select = new Select({
50
49
  id: this.generateStableId(engineScopeId, bindingPath),
51
- selectedKey: `{${modelName}>${bindingPath}}`,
50
+ selectedKey: this.generateBindingInfo(bindingPath, modelName),
52
51
  enabled: !fieldMetadata.ui?.readOnly,
53
52
  forceSelection: false,
54
53
  change: oEvent => {