@siliconst/metaui 1.4.9 → 1.4.13

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 (307) hide show
  1. package/README.md +4 -178
  2. package/package.json +1 -1
  3. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost-dbg.js +56 -8
  4. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost-dbg.js.map +1 -1
  5. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.d.ts +27 -3
  6. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.d.ts.map +1 -1
  7. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.js +1 -1
  8. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.js.map +1 -1
  9. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.ts +52 -9
  10. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost-dbg.js +132 -18
  11. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost-dbg.js.map +1 -1
  12. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.d.ts +14 -9
  13. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.d.ts.map +1 -1
  14. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.js +1 -1
  15. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.js.map +1 -1
  16. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.ts +117 -18
  17. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate-dbg.js +1 -3
  18. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate-dbg.js.map +1 -1
  19. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate.d.ts.map +1 -1
  20. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate.js +1 -1
  21. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate.js.map +1 -1
  22. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate.ts +1 -3
  23. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DialogDelegate-dbg.js +9 -6
  24. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DialogDelegate-dbg.js.map +1 -1
  25. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DialogDelegate.d.ts +1 -1
  26. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DialogDelegate.d.ts.map +1 -1
  27. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DialogDelegate.js +1 -1
  28. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DialogDelegate.js.map +1 -1
  29. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DialogDelegate.ts +9 -6
  30. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate-dbg.js +56 -49
  31. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate-dbg.js.map +1 -1
  32. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate.d.ts +9 -4
  33. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate.d.ts.map +1 -1
  34. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate.js +1 -1
  35. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate.js.map +1 -1
  36. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate.ts +67 -50
  37. package/src/nz/co/siliconst/ui5/metaui/core/ConditionEngine-dbg.js +0 -2
  38. package/src/nz/co/siliconst/ui5/metaui/core/ConditionEngine-dbg.js.map +1 -1
  39. package/src/nz/co/siliconst/ui5/metaui/core/ConditionEngine.d.ts +0 -2
  40. package/src/nz/co/siliconst/ui5/metaui/core/ConditionEngine.d.ts.map +1 -1
  41. package/src/nz/co/siliconst/ui5/metaui/core/ConditionEngine.js.map +1 -1
  42. package/src/nz/co/siliconst/ui5/metaui/core/ConditionEngine.ts +0 -3
  43. package/src/nz/co/siliconst/ui5/metaui/core/DefaultLayoutGenerator-dbg.js +4 -6
  44. package/src/nz/co/siliconst/ui5/metaui/core/DefaultLayoutGenerator-dbg.js.map +1 -1
  45. package/src/nz/co/siliconst/ui5/metaui/core/DefaultLayoutGenerator.js +1 -1
  46. package/src/nz/co/siliconst/ui5/metaui/core/DefaultLayoutGenerator.js.map +1 -1
  47. package/src/nz/co/siliconst/ui5/metaui/core/DefaultLayoutGenerator.ts +4 -4
  48. package/src/nz/co/siliconst/ui5/metaui/core/Engine-dbg.js +36 -9
  49. package/src/nz/co/siliconst/ui5/metaui/core/Engine-dbg.js.map +1 -1
  50. package/src/nz/co/siliconst/ui5/metaui/core/Engine.d.ts +18 -2
  51. package/src/nz/co/siliconst/ui5/metaui/core/Engine.d.ts.map +1 -1
  52. package/src/nz/co/siliconst/ui5/metaui/core/Engine.js +1 -1
  53. package/src/nz/co/siliconst/ui5/metaui/core/Engine.js.map +1 -1
  54. package/src/nz/co/siliconst/ui5/metaui/core/Engine.ts +39 -5
  55. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry-dbg.js +19 -2
  56. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry-dbg.js.map +1 -1
  57. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry.d.ts +9 -0
  58. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry.d.ts.map +1 -1
  59. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry.js +1 -1
  60. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry.js.map +1 -1
  61. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry.ts +21 -7
  62. package/src/nz/co/siliconst/ui5/metaui/core/Registry-dbg.js +3 -1
  63. package/src/nz/co/siliconst/ui5/metaui/core/Registry-dbg.js.map +1 -1
  64. package/src/nz/co/siliconst/ui5/metaui/core/Registry.d.ts.map +1 -1
  65. package/src/nz/co/siliconst/ui5/metaui/core/Registry.js +1 -1
  66. package/src/nz/co/siliconst/ui5/metaui/core/Registry.js.map +1 -1
  67. package/src/nz/co/siliconst/ui5/metaui/core/Registry.ts +3 -1
  68. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer-dbg.js +54 -34
  69. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer-dbg.js.map +1 -1
  70. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.d.ts +3 -1
  71. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.d.ts.map +1 -1
  72. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.js +1 -1
  73. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.js.map +1 -1
  74. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.ts +55 -34
  75. package/src/nz/co/siliconst/ui5/metaui/core/SchemaValidator-dbg.js +7 -6
  76. package/src/nz/co/siliconst/ui5/metaui/core/SchemaValidator-dbg.js.map +1 -1
  77. package/src/nz/co/siliconst/ui5/metaui/core/SchemaValidator.d.ts.map +1 -1
  78. package/src/nz/co/siliconst/ui5/metaui/core/SchemaValidator.js +1 -1
  79. package/src/nz/co/siliconst/ui5/metaui/core/SchemaValidator.js.map +1 -1
  80. package/src/nz/co/siliconst/ui5/metaui/core/SchemaValidator.ts +7 -6
  81. package/src/nz/co/siliconst/ui5/metaui/core/StateManager-dbg.js +40 -11
  82. package/src/nz/co/siliconst/ui5/metaui/core/StateManager-dbg.js.map +1 -1
  83. package/src/nz/co/siliconst/ui5/metaui/core/StateManager.d.ts +6 -1
  84. package/src/nz/co/siliconst/ui5/metaui/core/StateManager.d.ts.map +1 -1
  85. package/src/nz/co/siliconst/ui5/metaui/core/StateManager.js +1 -1
  86. package/src/nz/co/siliconst/ui5/metaui/core/StateManager.js.map +1 -1
  87. package/src/nz/co/siliconst/ui5/metaui/core/StateManager.ts +39 -13
  88. package/src/nz/co/siliconst/ui5/metaui/interfaces/IPlugin-dbg.js.map +1 -1
  89. package/src/nz/co/siliconst/ui5/metaui/interfaces/IPlugin.d.ts +13 -0
  90. package/src/nz/co/siliconst/ui5/metaui/interfaces/IPlugin.d.ts.map +1 -1
  91. package/src/nz/co/siliconst/ui5/metaui/interfaces/IPlugin.ts +15 -0
  92. package/src/nz/co/siliconst/ui5/metaui/interfaces/ISchema-dbg.js.map +1 -1
  93. package/src/nz/co/siliconst/ui5/metaui/interfaces/ISchema.d.ts +1 -0
  94. package/src/nz/co/siliconst/ui5/metaui/interfaces/ISchema.d.ts.map +1 -1
  95. package/src/nz/co/siliconst/ui5/metaui/interfaces/ISchema.ts +1 -0
  96. package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout-dbg.js +10 -0
  97. package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout-dbg.js.map +1 -1
  98. package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout.d.ts.map +1 -1
  99. package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout.js +1 -1
  100. package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout.js.map +1 -1
  101. package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout.ts +10 -0
  102. package/src/nz/co/siliconst/ui5/metaui/library-dbg.js +1 -1
  103. package/src/nz/co/siliconst/ui5/metaui/library-dbg.js.map +1 -1
  104. package/src/nz/co/siliconst/ui5/metaui/library-preload.js +44 -43
  105. package/src/nz/co/siliconst/ui5/metaui/library-preload.js.map +1 -1
  106. package/src/nz/co/siliconst/ui5/metaui/library.d.ts +1 -0
  107. package/src/nz/co/siliconst/ui5/metaui/library.d.ts.map +1 -1
  108. package/src/nz/co/siliconst/ui5/metaui/library.js +1 -1
  109. package/src/nz/co/siliconst/ui5/metaui/library.js.map +1 -1
  110. package/src/nz/co/siliconst/ui5/metaui/library.ts +1 -0
  111. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin-dbg.js +6 -0
  112. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin-dbg.js.map +1 -1
  113. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin.d.ts.map +1 -1
  114. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin.js +1 -1
  115. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin.js.map +1 -1
  116. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin.ts +6 -0
  117. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin-dbg.js +2 -2
  118. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin-dbg.js.map +1 -1
  119. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin.js +1 -1
  120. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin.js.map +1 -1
  121. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin.ts +2 -2
  122. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin-dbg.js +77 -1
  123. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin-dbg.js.map +1 -1
  124. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.d.ts +17 -0
  125. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.d.ts.map +1 -1
  126. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.js +1 -1
  127. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.js.map +1 -1
  128. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.ts +67 -7
  129. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin-dbg.js +1 -1
  130. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin-dbg.js.map +1 -1
  131. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin.js +1 -1
  132. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin.js.map +1 -1
  133. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin.ts +1 -1
  134. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin-dbg.js +1 -1
  135. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin-dbg.js.map +1 -1
  136. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin.js +1 -1
  137. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin.js.map +1 -1
  138. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin.ts +1 -1
  139. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin-dbg.js +10 -3
  140. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin-dbg.js.map +1 -1
  141. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin.d.ts.map +1 -1
  142. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin.js +1 -1
  143. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin.js.map +1 -1
  144. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin.ts +10 -3
  145. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin-dbg.js +1 -1
  146. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin-dbg.js.map +1 -1
  147. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin.js +1 -1
  148. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin.js.map +1 -1
  149. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin.ts +1 -1
  150. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin-dbg.js +1 -1
  151. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin-dbg.js.map +1 -1
  152. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin.js +1 -1
  153. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin.js.map +1 -1
  154. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin.ts +1 -1
  155. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin-dbg.js +1 -1
  156. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin-dbg.js.map +1 -1
  157. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin.js +1 -1
  158. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin.js.map +1 -1
  159. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin.ts +1 -1
  160. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin-dbg.js +1 -1
  161. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin-dbg.js.map +1 -1
  162. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin.js +1 -1
  163. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin.js.map +1 -1
  164. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin.ts +1 -1
  165. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin-dbg.js +1 -1
  166. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin-dbg.js.map +1 -1
  167. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin.js +1 -1
  168. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin.js.map +1 -1
  169. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin.ts +1 -1
  170. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiInputPlugin-dbg.js +130 -0
  171. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiInputPlugin-dbg.js.map +1 -0
  172. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiInputPlugin.d.ts +39 -0
  173. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiInputPlugin.d.ts.map +1 -0
  174. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiInputPlugin.js +2 -0
  175. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiInputPlugin.js.map +1 -0
  176. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiInputPlugin.ts +127 -0
  177. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin-dbg.js +1 -1
  178. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin-dbg.js.map +1 -1
  179. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin.js +1 -1
  180. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin.js.map +1 -1
  181. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin.ts +1 -1
  182. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin-dbg.js +2 -2
  183. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin-dbg.js.map +1 -1
  184. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin.js +1 -1
  185. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin.js.map +1 -1
  186. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin.ts +2 -2
  187. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin-dbg.js +6 -0
  188. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin-dbg.js.map +1 -1
  189. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin.d.ts.map +1 -1
  190. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin.js +1 -1
  191. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin.js.map +1 -1
  192. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin.ts +6 -0
  193. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin-dbg.js +1 -1
  194. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin-dbg.js.map +1 -1
  195. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin.js +1 -1
  196. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin.js.map +1 -1
  197. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin.ts +1 -1
  198. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin-dbg.js +1 -1
  199. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin-dbg.js.map +1 -1
  200. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin.js +1 -1
  201. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin.js.map +1 -1
  202. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin.ts +1 -1
  203. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin-dbg.js +1 -1
  204. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin-dbg.js.map +1 -1
  205. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin.js +1 -1
  206. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin.js.map +1 -1
  207. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin.ts +1 -1
  208. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin-dbg.js +1 -1
  209. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin-dbg.js.map +1 -1
  210. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin.js +1 -1
  211. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin.js.map +1 -1
  212. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin.ts +1 -1
  213. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin-dbg.js +1 -1
  214. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin-dbg.js.map +1 -1
  215. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin.js +1 -1
  216. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin.js.map +1 -1
  217. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin.ts +1 -1
  218. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin-dbg.js +1 -1
  219. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin-dbg.js.map +1 -1
  220. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin.js +1 -1
  221. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin.js.map +1 -1
  222. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin.ts +1 -1
  223. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin-dbg.js +40 -4
  224. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin-dbg.js.map +1 -1
  225. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin.d.ts +4 -0
  226. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin.d.ts.map +1 -1
  227. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin.js +1 -1
  228. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin.js.map +1 -1
  229. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin.ts +41 -3
  230. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin-dbg.js +1 -1
  231. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin-dbg.js.map +1 -1
  232. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin.js +1 -1
  233. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin.js.map +1 -1
  234. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin.ts +1 -1
  235. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin-dbg.js +1 -1
  236. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin-dbg.js.map +1 -1
  237. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin.js +1 -1
  238. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin.js.map +1 -1
  239. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin.ts +1 -1
  240. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/LiveSearchPlugin-dbg.js.map +1 -1
  241. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/LiveSearchPlugin.js.map +1 -1
  242. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/LiveSearchPlugin.ts +1 -1
  243. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteValueHelpPlugin-dbg.js.map +1 -1
  244. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteValueHelpPlugin.js.map +1 -1
  245. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteValueHelpPlugin.ts +1 -1
  246. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/CurrencyFormatterPlugin-dbg.js.map +1 -1
  247. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/CurrencyFormatterPlugin.d.ts +1 -1
  248. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/CurrencyFormatterPlugin.d.ts.map +1 -1
  249. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/CurrencyFormatterPlugin.js.map +1 -1
  250. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/CurrencyFormatterPlugin.ts +2 -2
  251. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/DateFormatterPlugin-dbg.js.map +1 -1
  252. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/DateFormatterPlugin.d.ts +1 -1
  253. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/DateFormatterPlugin.d.ts.map +1 -1
  254. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/DateFormatterPlugin.js.map +1 -1
  255. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/DateFormatterPlugin.ts +1 -1
  256. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/PhoneFormatterPlugin-dbg.js +1 -1
  257. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/PhoneFormatterPlugin-dbg.js.map +1 -1
  258. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/PhoneFormatterPlugin.d.ts +1 -1
  259. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/PhoneFormatterPlugin.d.ts.map +1 -1
  260. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/PhoneFormatterPlugin.js +1 -1
  261. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/PhoneFormatterPlugin.js.map +1 -1
  262. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/PhoneFormatterPlugin.ts +2 -2
  263. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/TextCaseFormatterPlugin-dbg.js +1 -1
  264. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/TextCaseFormatterPlugin-dbg.js.map +1 -1
  265. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/TextCaseFormatterPlugin.d.ts +1 -1
  266. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/TextCaseFormatterPlugin.d.ts.map +1 -1
  267. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/TextCaseFormatterPlugin.js +1 -1
  268. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/TextCaseFormatterPlugin.js.map +1 -1
  269. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/TextCaseFormatterPlugin.ts +2 -2
  270. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/EmailValidatorPlugin-dbg.js +1 -1
  271. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/EmailValidatorPlugin-dbg.js.map +1 -1
  272. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/EmailValidatorPlugin.d.ts +1 -1
  273. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/EmailValidatorPlugin.d.ts.map +1 -1
  274. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/EmailValidatorPlugin.js +1 -1
  275. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/EmailValidatorPlugin.js.map +1 -1
  276. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/EmailValidatorPlugin.ts +3 -3
  277. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/IbanValidatorPlugin-dbg.js.map +1 -1
  278. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/IbanValidatorPlugin.d.ts +1 -1
  279. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/IbanValidatorPlugin.d.ts.map +1 -1
  280. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/IbanValidatorPlugin.js.map +1 -1
  281. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/IbanValidatorPlugin.ts +1 -1
  282. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/MinLengthValidatorPlugin-dbg.js.map +1 -1
  283. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/MinLengthValidatorPlugin.d.ts +1 -1
  284. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/MinLengthValidatorPlugin.d.ts.map +1 -1
  285. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/MinLengthValidatorPlugin.js.map +1 -1
  286. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/MinLengthValidatorPlugin.ts +1 -1
  287. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/PatternValidatorPlugin-dbg.js +2 -2
  288. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/PatternValidatorPlugin-dbg.js.map +1 -1
  289. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/PatternValidatorPlugin.d.ts +1 -1
  290. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/PatternValidatorPlugin.d.ts.map +1 -1
  291. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/PatternValidatorPlugin.js +1 -1
  292. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/PatternValidatorPlugin.js.map +1 -1
  293. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/PatternValidatorPlugin.ts +4 -4
  294. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/RangeValidatorPlugin-dbg.js +3 -2
  295. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/RangeValidatorPlugin-dbg.js.map +1 -1
  296. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/RangeValidatorPlugin.d.ts +1 -1
  297. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/RangeValidatorPlugin.d.ts.map +1 -1
  298. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/RangeValidatorPlugin.js +1 -1
  299. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/RangeValidatorPlugin.js.map +1 -1
  300. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/RangeValidatorPlugin.ts +4 -3
  301. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/UrlValidatorPlugin-dbg.js +3 -1
  302. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/UrlValidatorPlugin-dbg.js.map +1 -1
  303. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/UrlValidatorPlugin.d.ts +1 -1
  304. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/UrlValidatorPlugin.d.ts.map +1 -1
  305. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/UrlValidatorPlugin.js +1 -1
  306. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/UrlValidatorPlugin.js.map +1 -1
  307. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/UrlValidatorPlugin.ts +4 -3
@@ -0,0 +1,130 @@
1
+ sap.ui.define(["./BasePlugin", "sap/m/MultiInput", "sap/m/Token", "sap/m/Text"], function (___BasePlugin, MultiInput, Token, TextControl) {
2
+ "use strict";
3
+
4
+ /**
5
+ * @file MultiInputPlugin.ts
6
+ * @description Renders a sap.m.MultiInput for primitive arrays (e.g. arrays of strings).
7
+ */
8
+ const BasePlugin = ___BasePlugin["BasePlugin"];
9
+ /**
10
+ * Handles rendering logic for arrays of primitive strings.
11
+ * Users can type custom strings and press Enter to add them as tokens.
12
+ *
13
+ * @namespace nz.co.siliconst.ui5.metaui.plugins.controls
14
+ * @public
15
+ */
16
+ class MultiInputPlugin extends BasePlugin {
17
+ /**
18
+ * Renders a `sap.m.MultiInput` component.
19
+ *
20
+ * @param fieldMetadata The specific JSON schema properties for this field.
21
+ * @param bindingPath The JSON path bound to this control.
22
+ * @param modelName The UI5 JSONModel name.
23
+ * @param engineScopeId The deterministic scope ID.
24
+ * @param onChange The callback fired on value change.
25
+ * @returns {Control} The configured MultiInput control.
26
+ */
27
+ render(fieldMetadata, bindingPath, modelName = "meta", engineScopeId, onChange) {
28
+ this.onChange = onChange;
29
+ this.metadata = fieldMetadata;
30
+ if (!this.isEditable) {
31
+ this.control = new TextControl({
32
+ id: this.generateStableId(engineScopeId, bindingPath),
33
+ text: {
34
+ path: `${modelName}>${bindingPath}`,
35
+ formatter: val => Array.isArray(val) ? val.join(", ") : ""
36
+ }
37
+ });
38
+ this.applyCommonDirectives(this.control, fieldMetadata, modelName);
39
+ return this.control;
40
+ }
41
+ const mi = new MultiInput({
42
+ id: this.generateStableId(engineScopeId, bindingPath),
43
+ enabled: !fieldMetadata.ui?.readOnly,
44
+ placeholder: fieldMetadata.ui?.label || "Type and press Enter...",
45
+ showValueHelp: false,
46
+ // We don't have a list of options for primitive tags
47
+ tokenUpdate: oEvent => {
48
+ const params = oEvent.getParameters();
49
+ const type = params.type;
50
+ const model = mi.getModel(modelName);
51
+
52
+ // Get current array from model
53
+ const rawArr = model.getProperty(bindingPath);
54
+ const arr = Array.isArray(rawArr) ? [...rawArr] : [];
55
+ if (type === "added") {
56
+ const addedTokens = params.addedTokens;
57
+ addedTokens.forEach(t => arr.push(t.getText()));
58
+ } else if (type === "removed") {
59
+ const removedTokens = params.removedTokens;
60
+ removedTokens.forEach(t => {
61
+ const text = t.getText();
62
+ const idx = arr.indexOf(text);
63
+ if (idx > -1) {
64
+ arr.splice(idx, 1);
65
+ }
66
+ });
67
+ }
68
+
69
+ // Update model
70
+ model.setProperty(bindingPath, arr);
71
+
72
+ // Trigger engine validation/extraction
73
+ const result = this.validateAndApplyVisualState();
74
+ if (this.onChange) {
75
+ this.onChange(result.isValid, this.fieldKey);
76
+ }
77
+ }
78
+ });
79
+
80
+ // Add validator to instantly accept typed text as a token
81
+ mi.addValidator(args => {
82
+ return new Token({
83
+ key: args.text,
84
+ text: args.text
85
+ });
86
+ });
87
+
88
+ // Bind existing strings to tokens using a factory function
89
+ mi.bindAggregation("tokens", {
90
+ path: `${modelName}>${bindingPath}`,
91
+ factory: (sId, oContext) => {
92
+ const text = oContext.getObject() || "";
93
+ return new Token(sId, {
94
+ key: text,
95
+ text: text
96
+ });
97
+ }
98
+ });
99
+ this.control = mi;
100
+ this.applyCommonDirectives(this.control, fieldMetadata, modelName);
101
+ return this.control;
102
+ }
103
+
104
+ /**
105
+ * Retrieves the current primitive array from the model.
106
+ * @returns {unknown} The array of string tokens.
107
+ */
108
+ getValue() {
109
+ if (!this.control) return [];
110
+ const tokens = this.control.getTokens();
111
+ return tokens.map(t => t.getText());
112
+ }
113
+
114
+ /**
115
+ * Applies dynamic read-only state.
116
+ */
117
+ applyState() {
118
+ if (this.control && this.metadata) {
119
+ if (!this.isEditable) return;
120
+ this.control.setEnabled(!this.metadata.ui?.readOnly);
121
+ }
122
+ }
123
+ }
124
+ var __exports = {
125
+ __esModule: true
126
+ };
127
+ __exports.MultiInputPlugin = MultiInputPlugin;
128
+ return __exports;
129
+ });
130
+ //# sourceMappingURL=MultiInputPlugin-dbg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MultiInputPlugin-dbg.js","names":["BasePlugin","___BasePlugin","MultiInputPlugin","render","fieldMetadata","bindingPath","modelName","engineScopeId","onChange","metadata","isEditable","control","TextControl","id","generateStableId","text","path","formatter","val","Array","isArray","join","applyCommonDirectives","mi","MultiInput","enabled","ui","readOnly","placeholder","label","showValueHelp","tokenUpdate","oEvent","params","getParameters","type","model","getModel","rawArr","getProperty","arr","addedTokens","forEach","t","push","getText","removedTokens","idx","indexOf","splice","setProperty","result","validateAndApplyVisualState","isValid","fieldKey","addValidator","args","Token","key","bindAggregation","factory","sId","oContext","getObject","getValue","tokens","getTokens","map","applyState","setEnabled","__exports","__esModule"],"sources":["MultiInputPlugin.ts"],"sourcesContent":["/**\n * @file MultiInputPlugin.ts\n * @description Renders a sap.m.MultiInput for primitive arrays (e.g. arrays of strings).\n */\n\nimport { BasePlugin } from \"./BasePlugin\";\nimport { IPropertyMetadata } from \"../../interfaces/ISchema\";\nimport MultiInput from \"sap/m/MultiInput\";\nimport Token from \"sap/m/Token\";\nimport Control from \"sap/ui/core/Control\";\nimport TextControl from \"sap/m/Text\";\nimport JSONModel from \"sap/ui/model/json/JSONModel\";\nimport Event from \"sap/ui/base/Event\";\nimport Context from \"sap/ui/model/Context\";\n\n/**\n * Handles rendering logic for arrays of primitive strings.\n * Users can type custom strings and press Enter to add them as tokens.\n * \n * @namespace nz.co.siliconst.ui5.metaui.plugins.controls\n * @public\n */\nexport class MultiInputPlugin extends BasePlugin {\n /**\n * Renders a `sap.m.MultiInput` component.\n * \n * @param fieldMetadata The specific JSON schema properties for this field.\n * @param bindingPath The JSON path bound to this control.\n * @param modelName The UI5 JSONModel name.\n * @param engineScopeId The deterministic scope ID.\n * @param onChange The callback fired on value change.\n * @returns {Control} The configured MultiInput control.\n */\n public render(fieldMetadata: IPropertyMetadata, bindingPath: string, modelName: string = \"meta\", engineScopeId?: string, onChange?: (isValid: boolean, fieldKey?: string) => void): Control {\n this.onChange = onChange;\n this.metadata = fieldMetadata;\n\n if (!this.isEditable) {\n this.control = new TextControl({\n id: this.generateStableId(engineScopeId, bindingPath),\n text: {\n path: `${modelName}>${bindingPath}`,\n formatter: (val: unknown[]) => Array.isArray(val) ? val.join(\", \") : \"\"\n }\n });\n this.applyCommonDirectives(this.control, fieldMetadata, modelName);\n return this.control as Control;\n }\n \n const mi = new MultiInput({\n id: this.generateStableId(engineScopeId, bindingPath),\n enabled: !fieldMetadata.ui?.readOnly,\n placeholder: fieldMetadata.ui?.label || \"Type and press Enter...\",\n showValueHelp: false, // We don't have a list of options for primitive tags\n tokenUpdate: (oEvent: Event) => {\n const params = oEvent.getParameters();\n const type = params.type;\n const model = mi.getModel(modelName) as JSONModel;\n \n // Get current array from model\n const rawArr = model.getProperty(bindingPath);\n const arr: string[] = Array.isArray(rawArr) ? [...rawArr] : [];\n \n if (type === \"added\") {\n const addedTokens = params.addedTokens as Token[];\n addedTokens.forEach(t => arr.push(t.getText()));\n } else if (type === \"removed\") {\n const removedTokens = params.removedTokens as Token[];\n removedTokens.forEach(t => {\n const text = t.getText();\n const idx = arr.indexOf(text);\n if (idx > -1) {\n arr.splice(idx, 1);\n }\n });\n }\n \n // Update model\n model.setProperty(bindingPath, arr);\n \n // Trigger engine validation/extraction\n const result = this.validateAndApplyVisualState();\n if (this.onChange) {\n this.onChange(result.isValid, this.fieldKey);\n }\n }\n });\n\n // Add validator to instantly accept typed text as a token\n mi.addValidator((args: { text: string }) => {\n return new Token({ key: args.text, text: args.text });\n });\n\n // Bind existing strings to tokens using a factory function\n mi.bindAggregation(\"tokens\", {\n path: `${modelName}>${bindingPath}`,\n factory: (sId: string, oContext: Context) => {\n const text = (oContext.getObject() as string) || \"\";\n return new Token(sId, { key: text, text: text });\n }\n });\n\n this.control = mi;\n this.applyCommonDirectives(this.control, fieldMetadata, modelName);\n return this.control as Control;\n }\n\n /**\n * Retrieves the current primitive array from the model.\n * @returns {unknown} The array of string tokens.\n */\n protected getValue(): unknown {\n if (!this.control) return [];\n const tokens = (this.control as MultiInput).getTokens();\n return tokens.map(t => t.getText());\n }\n\n /**\n * Applies dynamic read-only state.\n */\n protected applyState(): void {\n if (this.control && this.metadata) {\n if (!this.isEditable) return;\n (this.control as MultiInput).setEnabled(!this.metadata.ui?.readOnly);\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,39 @@
1
+ declare module "nz/co/siliconst/ui5/metaui/plugins/controls/MultiInputPlugin" {
2
+ /**
3
+ * @file MultiInputPlugin.ts
4
+ * @description Renders a sap.m.MultiInput for primitive arrays (e.g. arrays of strings).
5
+ */
6
+ import { BasePlugin } from "nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin";
7
+ import { IPropertyMetadata } from "nz/co/siliconst/ui5/metaui/interfaces/ISchema";
8
+ import Control from "sap/ui/core/Control";
9
+ /**
10
+ * Handles rendering logic for arrays of primitive strings.
11
+ * Users can type custom strings and press Enter to add them as tokens.
12
+ *
13
+ * @namespace nz.co.siliconst.ui5.metaui.plugins.controls
14
+ * @public
15
+ */
16
+ export class MultiInputPlugin extends BasePlugin {
17
+ /**
18
+ * Renders a `sap.m.MultiInput` component.
19
+ *
20
+ * @param fieldMetadata The specific JSON schema properties for this field.
21
+ * @param bindingPath The JSON path bound to this control.
22
+ * @param modelName The UI5 JSONModel name.
23
+ * @param engineScopeId The deterministic scope ID.
24
+ * @param onChange The callback fired on value change.
25
+ * @returns {Control} The configured MultiInput control.
26
+ */
27
+ render(fieldMetadata: IPropertyMetadata, bindingPath: string, modelName?: string, engineScopeId?: string, onChange?: (isValid: boolean, fieldKey?: string) => void): Control;
28
+ /**
29
+ * Retrieves the current primitive array from the model.
30
+ * @returns {unknown} The array of string tokens.
31
+ */
32
+ protected getValue(): unknown;
33
+ /**
34
+ * Applies dynamic read-only state.
35
+ */
36
+ protected applyState(): void;
37
+ }
38
+ }
39
+ //# sourceMappingURL=MultiInputPlugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MultiInputPlugin.d.ts","sourceRoot":"../../../../../../../../..","sources":["src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiInputPlugin.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,8DAA8D,CAAC;IAC9E;;;OAGG;IAEH,OAAO,EAAE,UAAU,EAAE,MAAM,wDAAwD,CAAC;IACpF,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;IAGlF,OAAO,OAAO,MAAM,qBAAqB,CAAC;IAM1C;;;;;;OAMG;IACH,MAAa,gBAAiB,SAAQ,UAAU;QAC5C;;;;;;;;;WASG;QACI,MAAM,CAAC,aAAa,EAAE,iBAAiB,EAAG,WAAW,EAAE,MAAM,EAAG,SAAS,GAAE,MAAe,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO;QA0E7L;;;WAGG;QACH,SAAS,CAAC,QAAQ,IAAI,OAAO;QAM7B;;WAEG;QACH,SAAS,CAAC,UAAU,IAAI,IAAI;KAM/B;CAEA"}
@@ -0,0 +1,2 @@
1
+ sap.ui.define(["./BasePlugin","sap/m/MultiInput","sap/m/Token","sap/m/Text"],function(t,e,n,s){"use strict";const i=t["BasePlugin"];class a extends i{render(t,i,a="meta",o,r){this.onChange=r;this.metadata=t;if(!this.isEditable){this.control=new s({id:this.generateStableId(o,i),text:{path:`${a}>${i}`,formatter:t=>Array.isArray(t)?t.join(", "):""}});this.applyCommonDirectives(this.control,t,a);return this.control}const l=new e({id:this.generateStableId(o,i),enabled:!t.ui?.readOnly,placeholder:t.ui?.label||"Type and press Enter...",showValueHelp:false,tokenUpdate:t=>{const e=t.getParameters();const n=e.type;const s=l.getModel(a);const o=s.getProperty(i);const r=Array.isArray(o)?[...o]:[];if(n==="added"){const t=e.addedTokens;t.forEach(t=>r.push(t.getText()))}else if(n==="removed"){const t=e.removedTokens;t.forEach(t=>{const e=t.getText();const n=r.indexOf(e);if(n>-1){r.splice(n,1)}})}s.setProperty(i,r);const d=this.validateAndApplyVisualState();if(this.onChange){this.onChange(d.isValid,this.fieldKey)}}});l.addValidator(t=>new n({key:t.text,text:t.text}));l.bindAggregation("tokens",{path:`${a}>${i}`,factory:(t,e)=>{const s=e.getObject()||"";return new n(t,{key:s,text:s})}});this.control=l;this.applyCommonDirectives(this.control,t,a);return this.control}getValue(){if(!this.control)return[];const t=this.control.getTokens();return t.map(t=>t.getText())}applyState(){if(this.control&&this.metadata){if(!this.isEditable)return;this.control.setEnabled(!this.metadata.ui?.readOnly)}}}var o={__esModule:true};o.MultiInputPlugin=a;return o});
2
+ //# sourceMappingURL=MultiInputPlugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MultiInputPlugin.js","names":["BasePlugin","___BasePlugin","MultiInputPlugin","render","fieldMetadata","bindingPath","modelName","engineScopeId","onChange","this","metadata","isEditable","control","TextControl","id","generateStableId","text","path","formatter","val","Array","isArray","join","applyCommonDirectives","mi","MultiInput","enabled","ui","readOnly","placeholder","label","showValueHelp","tokenUpdate","oEvent","params","getParameters","type","model","getModel","rawArr","getProperty","arr","addedTokens","forEach","t","push","getText","removedTokens","idx","indexOf","splice","setProperty","result","validateAndApplyVisualState","isValid","fieldKey","addValidator","args","Token","key","bindAggregation","factory","sId","oContext","getObject","getValue","tokens","getTokens","map","applyState","setEnabled","__exports","__esModule"],"sources":["MultiInputPlugin.ts"],"sourcesContent":["/**\n * @file MultiInputPlugin.ts\n * @description Renders a sap.m.MultiInput for primitive arrays (e.g. arrays of strings).\n */\n\nimport { BasePlugin } from \"./BasePlugin\";\nimport { IPropertyMetadata } from \"../../interfaces/ISchema\";\nimport MultiInput from \"sap/m/MultiInput\";\nimport Token from \"sap/m/Token\";\nimport Control from \"sap/ui/core/Control\";\nimport TextControl from \"sap/m/Text\";\nimport JSONModel from \"sap/ui/model/json/JSONModel\";\nimport Event from \"sap/ui/base/Event\";\nimport Context from \"sap/ui/model/Context\";\n\n/**\n * Handles rendering logic for arrays of primitive strings.\n * Users can type custom strings and press Enter to add them as tokens.\n * \n * @namespace nz.co.siliconst.ui5.metaui.plugins.controls\n * @public\n */\nexport class MultiInputPlugin extends BasePlugin {\n /**\n * Renders a `sap.m.MultiInput` component.\n * \n * @param fieldMetadata The specific JSON schema properties for this field.\n * @param bindingPath The JSON path bound to this control.\n * @param modelName The UI5 JSONModel name.\n * @param engineScopeId The deterministic scope ID.\n * @param onChange The callback fired on value change.\n * @returns {Control} The configured MultiInput control.\n */\n public render(fieldMetadata: IPropertyMetadata, bindingPath: string, modelName: string = \"meta\", engineScopeId?: string, onChange?: (isValid: boolean, fieldKey?: string) => void): Control {\n this.onChange = onChange;\n this.metadata = fieldMetadata;\n\n if (!this.isEditable) {\n this.control = new TextControl({\n id: this.generateStableId(engineScopeId, bindingPath),\n text: {\n path: `${modelName}>${bindingPath}`,\n formatter: (val: unknown[]) => Array.isArray(val) ? val.join(\", \") : \"\"\n }\n });\n this.applyCommonDirectives(this.control, fieldMetadata, modelName);\n return this.control as Control;\n }\n \n const mi = new MultiInput({\n id: this.generateStableId(engineScopeId, bindingPath),\n enabled: !fieldMetadata.ui?.readOnly,\n placeholder: fieldMetadata.ui?.label || \"Type and press Enter...\",\n showValueHelp: false, // We don't have a list of options for primitive tags\n tokenUpdate: (oEvent: Event) => {\n const params = oEvent.getParameters();\n const type = params.type;\n const model = mi.getModel(modelName) as JSONModel;\n \n // Get current array from model\n const rawArr = model.getProperty(bindingPath);\n const arr: string[] = Array.isArray(rawArr) ? [...rawArr] : [];\n \n if (type === \"added\") {\n const addedTokens = params.addedTokens as Token[];\n addedTokens.forEach(t => arr.push(t.getText()));\n } else if (type === \"removed\") {\n const removedTokens = params.removedTokens as Token[];\n removedTokens.forEach(t => {\n const text = t.getText();\n const idx = arr.indexOf(text);\n if (idx > -1) {\n arr.splice(idx, 1);\n }\n });\n }\n \n // Update model\n model.setProperty(bindingPath, arr);\n \n // Trigger engine validation/extraction\n const result = this.validateAndApplyVisualState();\n if (this.onChange) {\n this.onChange(result.isValid, this.fieldKey);\n }\n }\n });\n\n // Add validator to instantly accept typed text as a token\n mi.addValidator((args: { text: string }) => {\n return new Token({ key: args.text, text: args.text });\n });\n\n // Bind existing strings to tokens using a factory function\n mi.bindAggregation(\"tokens\", {\n path: `${modelName}>${bindingPath}`,\n factory: (sId: string, oContext: Context) => {\n const text = (oContext.getObject() as string) || \"\";\n return new Token(sId, { key: text, text: text });\n }\n });\n\n this.control = mi;\n this.applyCommonDirectives(this.control, fieldMetadata, modelName);\n return this.control as Control;\n }\n\n /**\n * Retrieves the current primitive array from the model.\n * @returns {unknown} The array of string tokens.\n */\n protected getValue(): unknown {\n if (!this.control) return [];\n const tokens = (this.control as MultiInput).getTokens();\n return tokens.map(t => t.getText());\n }\n\n /**\n * Applies dynamic read-only state.\n */\n protected applyState(): void {\n if (this.control && this.metadata) {\n if (!this.isEditable) return;\n (this.control as MultiInput).setEnabled(!this.metadata.ui?.readOnly);\n }\n }\n}\n"],"mappings":"4GAAA,MAKSA,EAAUC,EAAA,cAiBZ,MAAMC,UAAyBF,EAW3BG,OAAOC,EAAmCC,EAAsBC,EAAoB,OAAQC,EAAwBC,GACvHC,KAAKD,SAAWA,EAChBC,KAAKC,SAAWN,EAEhB,IAAKK,KAAKE,WAAY,CAClBF,KAAKG,QAAU,IAAIC,EAAY,CAC3BC,GAAIL,KAAKM,iBAAiBR,EAAeF,GACzCW,KAAM,CACFC,KAAM,GAAGX,KAAaD,IACtBa,UAAYC,GAAmBC,MAAMC,QAAQF,GAAOA,EAAIG,KAAK,MAAQ,MAG7Eb,KAAKc,sBAAsBd,KAAKG,QAASR,EAAeE,GACxD,OAAOG,KAAKG,OAChB,CAEA,MAAMY,EAAK,IAAIC,EAAW,CACtBX,GAAIL,KAAKM,iBAAiBR,EAAeF,GACzCqB,SAAUtB,EAAcuB,IAAIC,SAC5BC,YAAazB,EAAcuB,IAAIG,OAAS,0BACxCC,cAAe,MACfC,YAAcC,IACV,MAAMC,EAASD,EAAOE,gBACtB,MAAMC,EAAOF,EAAOE,KACpB,MAAMC,EAAQb,EAAGc,SAAShC,GAG1B,MAAMiC,EAASF,EAAMG,YAAYnC,GACjC,MAAMoC,EAAgBrB,MAAMC,QAAQkB,GAAU,IAAIA,GAAU,GAE5D,GAAIH,IAAS,QAAS,CAClB,MAAMM,EAAcR,EAAOQ,YAC3BA,EAAYC,QAAQC,GAAKH,EAAII,KAAKD,EAAEE,WACxC,MAAO,GAAIV,IAAS,UAAW,CAC3B,MAAMW,EAAgBb,EAAOa,cAC7BA,EAAcJ,QAAQC,IAClB,MAAM5B,EAAO4B,EAAEE,UACf,MAAME,EAAMP,EAAIQ,QAAQjC,GACxB,GAAIgC,GAAO,EAAG,CACVP,EAAIS,OAAOF,EAAK,EACpB,GAER,CAGAX,EAAMc,YAAY9C,EAAaoC,GAG/B,MAAMW,EAAS3C,KAAK4C,8BACpB,GAAI5C,KAAKD,SAAU,CACfC,KAAKD,SAAS4C,EAAOE,QAAS7C,KAAK8C,SACvC,KAKR/B,EAAGgC,aAAcC,GACN,IAAIC,EAAM,CAAEC,IAAKF,EAAKzC,KAAMA,KAAMyC,EAAKzC,QAIlDQ,EAAGoC,gBAAgB,SAAU,CACzB3C,KAAM,GAAGX,KAAaD,IACtBwD,QAASA,CAACC,EAAaC,KACnB,MAAM/C,EAAQ+C,EAASC,aAA0B,GACjD,OAAO,IAAIN,EAAMI,EAAK,CAAEH,IAAK3C,EAAMA,KAAMA,OAIjDP,KAAKG,QAAUY,EACff,KAAKc,sBAAsBd,KAAKG,QAASR,EAAeE,GACxD,OAAOG,KAAKG,OAChB,CAMUqD,WACN,IAAKxD,KAAKG,QAAS,MAAO,GAC1B,MAAMsD,EAAUzD,KAAKG,QAAuBuD,YAC5C,OAAOD,EAAOE,IAAIxB,GAAKA,EAAEE,UAC7B,CAKUuB,aACN,GAAI5D,KAAKG,SAAWH,KAAKC,SAAU,CAC/B,IAAKD,KAAKE,WAAY,OACrBF,KAAKG,QAAuB0D,YAAY7D,KAAKC,SAASiB,IAAIC,SAC/D,CACJ,EACH,IAAA2C,EAAA,CAAAC,WAAA,MAAAD,EAAArE,mBAAA,OAAAqE,CAAA","ignoreList":[]}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * @file MultiInputPlugin.ts
3
+ * @description Renders a sap.m.MultiInput for primitive arrays (e.g. arrays of strings).
4
+ */
5
+
6
+ import { BasePlugin } from "./BasePlugin";
7
+ import { IPropertyMetadata } from "../../interfaces/ISchema";
8
+ import MultiInput from "sap/m/MultiInput";
9
+ import Token from "sap/m/Token";
10
+ import Control from "sap/ui/core/Control";
11
+ import TextControl from "sap/m/Text";
12
+ import JSONModel from "sap/ui/model/json/JSONModel";
13
+ import Event from "sap/ui/base/Event";
14
+ import Context from "sap/ui/model/Context";
15
+
16
+ /**
17
+ * Handles rendering logic for arrays of primitive strings.
18
+ * Users can type custom strings and press Enter to add them as tokens.
19
+ *
20
+ * @namespace nz.co.siliconst.ui5.metaui.plugins.controls
21
+ * @public
22
+ */
23
+ export class MultiInputPlugin extends BasePlugin {
24
+ /**
25
+ * Renders a `sap.m.MultiInput` component.
26
+ *
27
+ * @param fieldMetadata The specific JSON schema properties for this field.
28
+ * @param bindingPath The JSON path bound to this control.
29
+ * @param modelName The UI5 JSONModel name.
30
+ * @param engineScopeId The deterministic scope ID.
31
+ * @param onChange The callback fired on value change.
32
+ * @returns {Control} The configured MultiInput control.
33
+ */
34
+ public render(fieldMetadata: IPropertyMetadata, bindingPath: string, modelName: string = "meta", engineScopeId?: string, onChange?: (isValid: boolean, fieldKey?: string) => void): Control {
35
+ this.onChange = onChange;
36
+ this.metadata = fieldMetadata;
37
+
38
+ if (!this.isEditable) {
39
+ this.control = new TextControl({
40
+ id: this.generateStableId(engineScopeId, bindingPath),
41
+ text: {
42
+ path: `${modelName}>${bindingPath}`,
43
+ formatter: (val: unknown[]) => Array.isArray(val) ? val.join(", ") : ""
44
+ }
45
+ });
46
+ this.applyCommonDirectives(this.control, fieldMetadata, modelName);
47
+ return this.control as Control;
48
+ }
49
+
50
+ const mi = new MultiInput({
51
+ id: this.generateStableId(engineScopeId, bindingPath),
52
+ enabled: !fieldMetadata.ui?.readOnly,
53
+ placeholder: fieldMetadata.ui?.label || "Type and press Enter...",
54
+ showValueHelp: false, // We don't have a list of options for primitive tags
55
+ tokenUpdate: (oEvent: Event) => {
56
+ const params = oEvent.getParameters();
57
+ const type = params.type;
58
+ const model = mi.getModel(modelName) as JSONModel;
59
+
60
+ // Get current array from model
61
+ const rawArr = model.getProperty(bindingPath);
62
+ const arr: string[] = Array.isArray(rawArr) ? [...rawArr] : [];
63
+
64
+ if (type === "added") {
65
+ const addedTokens = params.addedTokens as Token[];
66
+ addedTokens.forEach(t => arr.push(t.getText()));
67
+ } else if (type === "removed") {
68
+ const removedTokens = params.removedTokens as Token[];
69
+ removedTokens.forEach(t => {
70
+ const text = t.getText();
71
+ const idx = arr.indexOf(text);
72
+ if (idx > -1) {
73
+ arr.splice(idx, 1);
74
+ }
75
+ });
76
+ }
77
+
78
+ // Update model
79
+ model.setProperty(bindingPath, arr);
80
+
81
+ // Trigger engine validation/extraction
82
+ const result = this.validateAndApplyVisualState();
83
+ if (this.onChange) {
84
+ this.onChange(result.isValid, this.fieldKey);
85
+ }
86
+ }
87
+ });
88
+
89
+ // Add validator to instantly accept typed text as a token
90
+ mi.addValidator((args: { text: string }) => {
91
+ return new Token({ key: args.text, text: args.text });
92
+ });
93
+
94
+ // Bind existing strings to tokens using a factory function
95
+ mi.bindAggregation("tokens", {
96
+ path: `${modelName}>${bindingPath}`,
97
+ factory: (sId: string, oContext: Context) => {
98
+ const text = (oContext.getObject() as string) || "";
99
+ return new Token(sId, { key: text, text: text });
100
+ }
101
+ });
102
+
103
+ this.control = mi;
104
+ this.applyCommonDirectives(this.control, fieldMetadata, modelName);
105
+ return this.control as Control;
106
+ }
107
+
108
+ /**
109
+ * Retrieves the current primitive array from the model.
110
+ * @returns {unknown} The array of string tokens.
111
+ */
112
+ protected getValue(): unknown {
113
+ if (!this.control) return [];
114
+ const tokens = (this.control as MultiInput).getTokens();
115
+ return tokens.map(t => t.getText());
116
+ }
117
+
118
+ /**
119
+ * Applies dynamic read-only state.
120
+ */
121
+ protected applyState(): void {
122
+ if (this.control && this.metadata) {
123
+ if (!this.isEditable) return;
124
+ (this.control as MultiInput).setEnabled(!this.metadata.ui?.readOnly);
125
+ }
126
+ }
127
+ }
@@ -45,7 +45,7 @@ sap.ui.define(["./BasePlugin", "sap/m/MultiComboBox", "sap/ui/core/Item", "sap/m
45
45
  placeholder: fieldMetadata.ui?.label || "Select items...",
46
46
  selectionChange: oEvent => {
47
47
  const keys = this.control.getSelectedKeys();
48
- const result = this.validate();
48
+ const result = this.validateAndApplyVisualState();
49
49
  if (this.onChange) {
50
50
  this.onChange(result.isValid, this.fieldKey);
51
51
  }
@@ -1 +1 @@
1
- {"version":3,"file":"MultiSelectPlugin-dbg.js","names":["BasePlugin","___BasePlugin","MultiSelectPlugin","render","fieldMetadata","bindingPath","modelName","engineScopeId","onChange","metadata","isEditable","control","TextControl","id","generateStableId","text","path","formatter","val","Array","isArray","join","applyCommonDirectives","mcb","MultiComboBox","selectedKeys","enabled","ui","readOnly","placeholder","label","selectionChange","oEvent","keys","getSelectedKeys","result","validate","isValid","fieldKey","enum","forEach","addItem","Item","key","toString","getValue","applyState","setEnabled","__exports","__esModule"],"sources":["MultiSelectPlugin.ts"],"sourcesContent":["/**\n * @file MultiSelectPlugin.ts\n * @description Renders a sap.m.MultiComboBox for selecting multiple string values.\n */\n\nimport { BasePlugin } from \"./BasePlugin\";\nimport { IPropertyMetadata } from \"../../interfaces/ISchema\";\nimport MultiComboBox from \"sap/m/MultiComboBox\";\nimport Item from \"sap/ui/core/Item\";\nimport Control from \"sap/ui/core/Control\";\nimport TextControl from \"sap/m/Text\";\n\n/**\n * Handles rendering logic for selecting multiple strings from a predefined list.\n * Expects the payload to be an array of strings.\n * \n * @namespace nz.co.siliconst.ui5.metaui.plugins.controls\n * @public\n */\nexport class MultiSelectPlugin extends BasePlugin {\n /**\n * Renders a `sap.m.MultiComboBox` component.\n * \n * @param fieldMetadata The specific JSON schema properties for this field.\n * @param bindingPath The JSON path bound to this control.\n * @param modelName The UI5 JSONModel name.\n * @param engineScopeId The deterministic scope ID.\n * @param onChange The callback fired on value change.\n * @returns {Control} The configured MultiComboBox control.\n */\n public render(fieldMetadata: IPropertyMetadata, bindingPath: string, modelName: string = \"meta\", engineScopeId?: string, onChange?: (isValid: boolean, fieldKey?: string) => void): Control {\n this.onChange = onChange;\n this.metadata = fieldMetadata;\n\n if (!this.isEditable) {\n \n this.control = new TextControl({\n id: this.generateStableId(engineScopeId, bindingPath),\n text: {\n path: `${modelName}>${bindingPath}`,\n formatter: (val: unknown[]) => Array.isArray(val) ? val.join(\", \") : \"\"\n }\n });\n this.applyCommonDirectives(this.control, fieldMetadata, modelName);\n return this.control as Control;\n }\n \n const mcb = new MultiComboBox({\n id: this.generateStableId(engineScopeId, bindingPath),\n selectedKeys: `{${modelName}>${bindingPath}}`,\n enabled: !fieldMetadata.ui?.readOnly,\n placeholder: fieldMetadata.ui?.label || \"Select items...\",\n selectionChange: (oEvent: sap.ui.base.Event) => {\n const keys = (this.control as MultiComboBox).getSelectedKeys();\n const result = this.validate();\n if (this.onChange) {\n this.onChange(result.isValid, this.fieldKey);\n }\n }\n });\n\n if (fieldMetadata.enum) {\n fieldMetadata.enum.forEach((val: string | number) => {\n mcb.addItem(new Item({ key: val.toString(), text: val.toString() }));\n });\n }\n\n this.control = mcb;\n this.applyCommonDirectives(this.control, fieldMetadata, modelName);\n return this.control as Control;\n }\n\n /**\n * Retrieves the current selection keys.\n * @returns {unknown} The selected keys.\n */\n protected getValue(): unknown {\n return this.control ? (this.control as MultiComboBox).getSelectedKeys() : [];\n }\n\n /**\n * Applies dynamic read-only state.\n */\n protected applyState(): void {\n if (this.control && this.metadata) {\n if (!this.isEditable) return;\n (this.control as MultiComboBox).setEnabled(!this.metadata.ui?.readOnly);\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"MultiSelectPlugin-dbg.js","names":["BasePlugin","___BasePlugin","MultiSelectPlugin","render","fieldMetadata","bindingPath","modelName","engineScopeId","onChange","metadata","isEditable","control","TextControl","id","generateStableId","text","path","formatter","val","Array","isArray","join","applyCommonDirectives","mcb","MultiComboBox","selectedKeys","enabled","ui","readOnly","placeholder","label","selectionChange","oEvent","keys","getSelectedKeys","result","validateAndApplyVisualState","isValid","fieldKey","enum","forEach","addItem","Item","key","toString","getValue","applyState","setEnabled","__exports","__esModule"],"sources":["MultiSelectPlugin.ts"],"sourcesContent":["/**\n * @file MultiSelectPlugin.ts\n * @description Renders a sap.m.MultiComboBox for selecting multiple string values.\n */\n\nimport { BasePlugin } from \"./BasePlugin\";\nimport { IPropertyMetadata } from \"../../interfaces/ISchema\";\nimport MultiComboBox from \"sap/m/MultiComboBox\";\nimport Item from \"sap/ui/core/Item\";\nimport Control from \"sap/ui/core/Control\";\nimport TextControl from \"sap/m/Text\";\n\n/**\n * Handles rendering logic for selecting multiple strings from a predefined list.\n * Expects the payload to be an array of strings.\n * \n * @namespace nz.co.siliconst.ui5.metaui.plugins.controls\n * @public\n */\nexport class MultiSelectPlugin extends BasePlugin {\n /**\n * Renders a `sap.m.MultiComboBox` component.\n * \n * @param fieldMetadata The specific JSON schema properties for this field.\n * @param bindingPath The JSON path bound to this control.\n * @param modelName The UI5 JSONModel name.\n * @param engineScopeId The deterministic scope ID.\n * @param onChange The callback fired on value change.\n * @returns {Control} The configured MultiComboBox control.\n */\n public render(fieldMetadata: IPropertyMetadata, bindingPath: string, modelName: string = \"meta\", engineScopeId?: string, onChange?: (isValid: boolean, fieldKey?: string) => void): Control {\n this.onChange = onChange;\n this.metadata = fieldMetadata;\n\n if (!this.isEditable) {\n \n this.control = new TextControl({\n id: this.generateStableId(engineScopeId, bindingPath),\n text: {\n path: `${modelName}>${bindingPath}`,\n formatter: (val: unknown[]) => Array.isArray(val) ? val.join(\", \") : \"\"\n }\n });\n this.applyCommonDirectives(this.control, fieldMetadata, modelName);\n return this.control as Control;\n }\n \n const mcb = new MultiComboBox({\n id: this.generateStableId(engineScopeId, bindingPath),\n selectedKeys: `{${modelName}>${bindingPath}}`,\n enabled: !fieldMetadata.ui?.readOnly,\n placeholder: fieldMetadata.ui?.label || \"Select items...\",\n selectionChange: (oEvent: sap.ui.base.Event) => {\n const keys = (this.control as MultiComboBox).getSelectedKeys();\n const result = this.validateAndApplyVisualState();\n if (this.onChange) {\n this.onChange(result.isValid, this.fieldKey);\n }\n }\n });\n\n if (fieldMetadata.enum) {\n fieldMetadata.enum.forEach((val: string | number) => {\n mcb.addItem(new Item({ key: val.toString(), text: val.toString() }));\n });\n }\n\n this.control = mcb;\n this.applyCommonDirectives(this.control, fieldMetadata, modelName);\n return this.control as Control;\n }\n\n /**\n * Retrieves the current selection keys.\n * @returns {unknown} The selected keys.\n */\n protected getValue(): unknown {\n return this.control ? (this.control as MultiComboBox).getSelectedKeys() : [];\n }\n\n /**\n * Applies dynamic read-only state.\n */\n protected applyState(): void {\n if (this.control && this.metadata) {\n if (!this.isEditable) return;\n (this.control as MultiComboBox).setEnabled(!this.metadata.ui?.readOnly);\n }\n }\n}\n"],"mappings":";;;EAAA;AACA;AACA;AACA;EAHA,MAKSA,UAAU,GAAAC,aAAA;EAOnB;AACA;AACA;AACA;AACA;AACA;AACA;EACO,MAAMC,iBAAiB,SAASF,UAAU,CAAC;IAC9C;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACWG,MAAMA,CAACC,aAAgC,EAAGC,WAAmB,EAAGC,SAAiB,GAAG,MAAM,EAAEC,aAAsB,EAAEC,QAAwD,EAAW;MAC1L,IAAI,CAACA,QAAQ,GAAGA,QAAQ;MACxB,IAAI,CAACC,QAAQ,GAAGL,aAAa;MAE7B,IAAI,CAAC,IAAI,CAACM,UAAU,EAAE;QAElB,IAAI,CAACC,OAAO,GAAG,IAAIC,WAAW,CAAC;UAC3BC,EAAE,EAAE,IAAI,CAACC,gBAAgB,CAACP,aAAa,EAAEF,WAAW,CAAC;UACrDU,IAAI,EAAE;YACFC,IAAI,EAAE,GAAGV,SAAS,IAAID,WAAW,EAAE;YACnCY,SAAS,EAAGC,GAAc,IAAKC,KAAK,CAACC,OAAO,CAACF,GAAG,CAAC,GAAGA,GAAG,CAACG,IAAI,CAAC,IAAI,CAAC,GAAG;UACzE;QACJ,CAAC,CAAC;QACF,IAAI,CAACC,qBAAqB,CAAC,IAAI,CAACX,OAAO,EAAEP,aAAa,EAAEE,SAAS,CAAC;QAClE,OAAO,IAAI,CAACK,OAAO;MACvB;MAEA,MAAMY,GAAG,GAAG,IAAIC,aAAa,CAAC;QAC1BX,EAAE,EAAE,IAAI,CAACC,gBAAgB,CAACP,aAAa,EAAEF,WAAW,CAAC;QACrDoB,YAAY,EAAE,IAAInB,SAAS,IAAID,WAAW,GAAG;QAC7CqB,OAAO,EAAE,CAACtB,aAAa,CAACuB,EAAE,EAAEC,QAAQ;QACpCC,WAAW,EAAEzB,aAAa,CAACuB,EAAE,EAAEG,KAAK,IAAI,iBAAiB;QACzDC,eAAe,EAAGC,MAAyB,IAAK;UAC5C,MAAMC,IAAI,GAAI,IAAI,CAACtB,OAAO,CAAmBuB,eAAe,CAAC,CAAC;UAC9D,MAAMC,MAAM,GAAG,IAAI,CAACC,2BAA2B,CAAC,CAAC;UACjD,IAAI,IAAI,CAAC5B,QAAQ,EAAE;YACf,IAAI,CAACA,QAAQ,CAAC2B,MAAM,CAACE,OAAO,EAAE,IAAI,CAACC,QAAQ,CAAC;UAChD;QACJ;MACJ,CAAC,CAAC;MAEF,IAAIlC,aAAa,CAACmC,IAAI,EAAE;QACpBnC,aAAa,CAACmC,IAAI,CAACC,OAAO,CAAEtB,GAAoB,IAAK;UACjDK,GAAG,CAACkB,OAAO,CAAC,IAAIC,IAAI,CAAC;YAAEC,GAAG,EAAEzB,GAAG,CAAC0B,QAAQ,CAAC,CAAC;YAAE7B,IAAI,EAAEG,GAAG,CAAC0B,QAAQ,CAAC;UAAE,CAAC,CAAC,CAAC;QACxE,CAAC,CAAC;MACN;MAEA,IAAI,CAACjC,OAAO,GAAGY,GAAG;MAClB,IAAI,CAACD,qBAAqB,CAAC,IAAI,CAACX,OAAO,EAAEP,aAAa,EAAEE,SAAS,CAAC;MAClE,OAAO,IAAI,CAACK,OAAO;IACvB;;IAEA;AACJ;AACA;AACA;IACckC,QAAQA,CAAA,EAAY;MAC1B,OAAO,IAAI,CAAClC,OAAO,GAAI,IAAI,CAACA,OAAO,CAAmBuB,eAAe,CAAC,CAAC,GAAG,EAAE;IAChF;;IAEA;AACJ;AACA;IACcY,UAAUA,CAAA,EAAS;MACzB,IAAI,IAAI,CAACnC,OAAO,IAAI,IAAI,CAACF,QAAQ,EAAE;QAC/B,IAAI,CAAC,IAAI,CAACC,UAAU,EAAE;QACrB,IAAI,CAACC,OAAO,CAAmBoC,UAAU,CAAC,CAAC,IAAI,CAACtC,QAAQ,CAACkB,EAAE,EAAEC,QAAQ,CAAC;MAC3E;IACJ;EACJ;EAAC,IAAAoB,SAAA;IAAAC,UAAA;EAAA;EAAAD,SAAA,CAAA9C,iBAAA,GAAAA,iBAAA;EAAA,OAAA8C,SAAA;AAAA","ignoreList":[]}
@@ -1,2 +1,2 @@
1
- sap.ui.define(["./BasePlugin","sap/m/MultiComboBox","sap/ui/core/Item","sap/m/Text"],function(t,e,i,s){"use strict";const n=t["BasePlugin"];class a extends n{render(t,n,a="meta",o,l){this.onChange=l;this.metadata=t;if(!this.isEditable){this.control=new s({id:this.generateStableId(o,n),text:{path:`${a}>${n}`,formatter:t=>Array.isArray(t)?t.join(", "):""}});this.applyCommonDirectives(this.control,t,a);return this.control}const r=new e({id:this.generateStableId(o,n),selectedKeys:`{${a}>${n}}`,enabled:!t.ui?.readOnly,placeholder:t.ui?.label||"Select items...",selectionChange:t=>{const e=this.control.getSelectedKeys();const i=this.validate();if(this.onChange){this.onChange(i.isValid,this.fieldKey)}}});if(t.enum){t.enum.forEach(t=>{r.addItem(new i({key:t.toString(),text:t.toString()}))})}this.control=r;this.applyCommonDirectives(this.control,t,a);return this.control}getValue(){return this.control?this.control.getSelectedKeys():[]}applyState(){if(this.control&&this.metadata){if(!this.isEditable)return;this.control.setEnabled(!this.metadata.ui?.readOnly)}}}var o={__esModule:true};o.MultiSelectPlugin=a;return o});
1
+ sap.ui.define(["./BasePlugin","sap/m/MultiComboBox","sap/ui/core/Item","sap/m/Text"],function(t,e,i,s){"use strict";const n=t["BasePlugin"];class a extends n{render(t,n,a="meta",o,l){this.onChange=l;this.metadata=t;if(!this.isEditable){this.control=new s({id:this.generateStableId(o,n),text:{path:`${a}>${n}`,formatter:t=>Array.isArray(t)?t.join(", "):""}});this.applyCommonDirectives(this.control,t,a);return this.control}const r=new e({id:this.generateStableId(o,n),selectedKeys:`{${a}>${n}}`,enabled:!t.ui?.readOnly,placeholder:t.ui?.label||"Select items...",selectionChange:t=>{const e=this.control.getSelectedKeys();const i=this.validateAndApplyVisualState();if(this.onChange){this.onChange(i.isValid,this.fieldKey)}}});if(t.enum){t.enum.forEach(t=>{r.addItem(new i({key:t.toString(),text:t.toString()}))})}this.control=r;this.applyCommonDirectives(this.control,t,a);return this.control}getValue(){return this.control?this.control.getSelectedKeys():[]}applyState(){if(this.control&&this.metadata){if(!this.isEditable)return;this.control.setEnabled(!this.metadata.ui?.readOnly)}}}var o={__esModule:true};o.MultiSelectPlugin=a;return o});
2
2
  //# sourceMappingURL=MultiSelectPlugin.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MultiSelectPlugin.js","names":["BasePlugin","___BasePlugin","MultiSelectPlugin","render","fieldMetadata","bindingPath","modelName","engineScopeId","onChange","this","metadata","isEditable","control","TextControl","id","generateStableId","text","path","formatter","val","Array","isArray","join","applyCommonDirectives","mcb","MultiComboBox","selectedKeys","enabled","ui","readOnly","placeholder","label","selectionChange","oEvent","keys","getSelectedKeys","result","validate","isValid","fieldKey","enum","forEach","addItem","Item","key","toString","getValue","applyState","setEnabled","__exports","__esModule"],"sources":["MultiSelectPlugin.ts"],"sourcesContent":["/**\n * @file MultiSelectPlugin.ts\n * @description Renders a sap.m.MultiComboBox for selecting multiple string values.\n */\n\nimport { BasePlugin } from \"./BasePlugin\";\nimport { IPropertyMetadata } from \"../../interfaces/ISchema\";\nimport MultiComboBox from \"sap/m/MultiComboBox\";\nimport Item from \"sap/ui/core/Item\";\nimport Control from \"sap/ui/core/Control\";\nimport TextControl from \"sap/m/Text\";\n\n/**\n * Handles rendering logic for selecting multiple strings from a predefined list.\n * Expects the payload to be an array of strings.\n * \n * @namespace nz.co.siliconst.ui5.metaui.plugins.controls\n * @public\n */\nexport class MultiSelectPlugin extends BasePlugin {\n /**\n * Renders a `sap.m.MultiComboBox` component.\n * \n * @param fieldMetadata The specific JSON schema properties for this field.\n * @param bindingPath The JSON path bound to this control.\n * @param modelName The UI5 JSONModel name.\n * @param engineScopeId The deterministic scope ID.\n * @param onChange The callback fired on value change.\n * @returns {Control} The configured MultiComboBox control.\n */\n public render(fieldMetadata: IPropertyMetadata, bindingPath: string, modelName: string = \"meta\", engineScopeId?: string, onChange?: (isValid: boolean, fieldKey?: string) => void): Control {\n this.onChange = onChange;\n this.metadata = fieldMetadata;\n\n if (!this.isEditable) {\n \n this.control = new TextControl({\n id: this.generateStableId(engineScopeId, bindingPath),\n text: {\n path: `${modelName}>${bindingPath}`,\n formatter: (val: unknown[]) => Array.isArray(val) ? val.join(\", \") : \"\"\n }\n });\n this.applyCommonDirectives(this.control, fieldMetadata, modelName);\n return this.control as Control;\n }\n \n const mcb = new MultiComboBox({\n id: this.generateStableId(engineScopeId, bindingPath),\n selectedKeys: `{${modelName}>${bindingPath}}`,\n enabled: !fieldMetadata.ui?.readOnly,\n placeholder: fieldMetadata.ui?.label || \"Select items...\",\n selectionChange: (oEvent: sap.ui.base.Event) => {\n const keys = (this.control as MultiComboBox).getSelectedKeys();\n const result = this.validate();\n if (this.onChange) {\n this.onChange(result.isValid, this.fieldKey);\n }\n }\n });\n\n if (fieldMetadata.enum) {\n fieldMetadata.enum.forEach((val: string | number) => {\n mcb.addItem(new Item({ key: val.toString(), text: val.toString() }));\n });\n }\n\n this.control = mcb;\n this.applyCommonDirectives(this.control, fieldMetadata, modelName);\n return this.control as Control;\n }\n\n /**\n * Retrieves the current selection keys.\n * @returns {unknown} The selected keys.\n */\n protected getValue(): unknown {\n return this.control ? (this.control as MultiComboBox).getSelectedKeys() : [];\n }\n\n /**\n * Applies dynamic read-only state.\n */\n protected applyState(): void {\n if (this.control && this.metadata) {\n if (!this.isEditable) return;\n (this.control as MultiComboBox).setEnabled(!this.metadata.ui?.readOnly);\n }\n }\n}\n"],"mappings":"oHAAA,MAKSA,EAAUC,EAAA,cAcZ,MAAMC,UAA0BF,EAW5BG,OAAOC,EAAmCC,EAAsBC,EAAoB,OAAQC,EAAwBC,GACvHC,KAAKD,SAAWA,EAChBC,KAAKC,SAAWN,EAEhB,IAAKK,KAAKE,WAAY,CAElBF,KAAKG,QAAU,IAAIC,EAAY,CAC3BC,GAAIL,KAAKM,iBAAiBR,EAAeF,GACzCW,KAAM,CACFC,KAAM,GAAGX,KAAaD,IACtBa,UAAYC,GAAmBC,MAAMC,QAAQF,GAAOA,EAAIG,KAAK,MAAQ,MAG7Eb,KAAKc,sBAAsBd,KAAKG,QAASR,EAAeE,GACxD,OAAOG,KAAKG,OAChB,CAEA,MAAMY,EAAM,IAAIC,EAAc,CAC1BX,GAAIL,KAAKM,iBAAiBR,EAAeF,GACzCqB,aAAc,IAAIpB,KAAaD,KAC/BsB,SAAUvB,EAAcwB,IAAIC,SAC5BC,YAAa1B,EAAcwB,IAAIG,OAAS,kBACxCC,gBAAkBC,IACd,MAAMC,EAAQzB,KAAKG,QAA0BuB,kBAC7C,MAAMC,EAAS3B,KAAK4B,WACpB,GAAI5B,KAAKD,SAAU,CACfC,KAAKD,SAAS4B,EAAOE,QAAS7B,KAAK8B,SACvC,KAIR,GAAInC,EAAcoC,KAAM,CACpBpC,EAAcoC,KAAKC,QAAStB,IACxBK,EAAIkB,QAAQ,IAAIC,EAAK,CAAEC,IAAKzB,EAAI0B,WAAY7B,KAAMG,EAAI0B,eAE9D,CAEApC,KAAKG,QAAUY,EACff,KAAKc,sBAAsBd,KAAKG,QAASR,EAAeE,GACxD,OAAOG,KAAKG,OAChB,CAMUkC,WACN,OAAOrC,KAAKG,QAAWH,KAAKG,QAA0BuB,kBAAoB,EAC9E,CAKUY,aACN,GAAItC,KAAKG,SAAWH,KAAKC,SAAU,CAC/B,IAAKD,KAAKE,WAAY,OACrBF,KAAKG,QAA0BoC,YAAYvC,KAAKC,SAASkB,IAAIC,SAClE,CACJ,EACH,IAAAoB,EAAA,CAAAC,WAAA,MAAAD,EAAA/C,oBAAA,OAAA+C,CAAA","ignoreList":[]}
1
+ {"version":3,"file":"MultiSelectPlugin.js","names":["BasePlugin","___BasePlugin","MultiSelectPlugin","render","fieldMetadata","bindingPath","modelName","engineScopeId","onChange","this","metadata","isEditable","control","TextControl","id","generateStableId","text","path","formatter","val","Array","isArray","join","applyCommonDirectives","mcb","MultiComboBox","selectedKeys","enabled","ui","readOnly","placeholder","label","selectionChange","oEvent","keys","getSelectedKeys","result","validateAndApplyVisualState","isValid","fieldKey","enum","forEach","addItem","Item","key","toString","getValue","applyState","setEnabled","__exports","__esModule"],"sources":["MultiSelectPlugin.ts"],"sourcesContent":["/**\n * @file MultiSelectPlugin.ts\n * @description Renders a sap.m.MultiComboBox for selecting multiple string values.\n */\n\nimport { BasePlugin } from \"./BasePlugin\";\nimport { IPropertyMetadata } from \"../../interfaces/ISchema\";\nimport MultiComboBox from \"sap/m/MultiComboBox\";\nimport Item from \"sap/ui/core/Item\";\nimport Control from \"sap/ui/core/Control\";\nimport TextControl from \"sap/m/Text\";\n\n/**\n * Handles rendering logic for selecting multiple strings from a predefined list.\n * Expects the payload to be an array of strings.\n * \n * @namespace nz.co.siliconst.ui5.metaui.plugins.controls\n * @public\n */\nexport class MultiSelectPlugin extends BasePlugin {\n /**\n * Renders a `sap.m.MultiComboBox` component.\n * \n * @param fieldMetadata The specific JSON schema properties for this field.\n * @param bindingPath The JSON path bound to this control.\n * @param modelName The UI5 JSONModel name.\n * @param engineScopeId The deterministic scope ID.\n * @param onChange The callback fired on value change.\n * @returns {Control} The configured MultiComboBox control.\n */\n public render(fieldMetadata: IPropertyMetadata, bindingPath: string, modelName: string = \"meta\", engineScopeId?: string, onChange?: (isValid: boolean, fieldKey?: string) => void): Control {\n this.onChange = onChange;\n this.metadata = fieldMetadata;\n\n if (!this.isEditable) {\n \n this.control = new TextControl({\n id: this.generateStableId(engineScopeId, bindingPath),\n text: {\n path: `${modelName}>${bindingPath}`,\n formatter: (val: unknown[]) => Array.isArray(val) ? val.join(\", \") : \"\"\n }\n });\n this.applyCommonDirectives(this.control, fieldMetadata, modelName);\n return this.control as Control;\n }\n \n const mcb = new MultiComboBox({\n id: this.generateStableId(engineScopeId, bindingPath),\n selectedKeys: `{${modelName}>${bindingPath}}`,\n enabled: !fieldMetadata.ui?.readOnly,\n placeholder: fieldMetadata.ui?.label || \"Select items...\",\n selectionChange: (oEvent: sap.ui.base.Event) => {\n const keys = (this.control as MultiComboBox).getSelectedKeys();\n const result = this.validateAndApplyVisualState();\n if (this.onChange) {\n this.onChange(result.isValid, this.fieldKey);\n }\n }\n });\n\n if (fieldMetadata.enum) {\n fieldMetadata.enum.forEach((val: string | number) => {\n mcb.addItem(new Item({ key: val.toString(), text: val.toString() }));\n });\n }\n\n this.control = mcb;\n this.applyCommonDirectives(this.control, fieldMetadata, modelName);\n return this.control as Control;\n }\n\n /**\n * Retrieves the current selection keys.\n * @returns {unknown} The selected keys.\n */\n protected getValue(): unknown {\n return this.control ? (this.control as MultiComboBox).getSelectedKeys() : [];\n }\n\n /**\n * Applies dynamic read-only state.\n */\n protected applyState(): void {\n if (this.control && this.metadata) {\n if (!this.isEditable) return;\n (this.control as MultiComboBox).setEnabled(!this.metadata.ui?.readOnly);\n }\n }\n}\n"],"mappings":"oHAAA,MAKSA,EAAUC,EAAA,cAcZ,MAAMC,UAA0BF,EAW5BG,OAAOC,EAAmCC,EAAsBC,EAAoB,OAAQC,EAAwBC,GACvHC,KAAKD,SAAWA,EAChBC,KAAKC,SAAWN,EAEhB,IAAKK,KAAKE,WAAY,CAElBF,KAAKG,QAAU,IAAIC,EAAY,CAC3BC,GAAIL,KAAKM,iBAAiBR,EAAeF,GACzCW,KAAM,CACFC,KAAM,GAAGX,KAAaD,IACtBa,UAAYC,GAAmBC,MAAMC,QAAQF,GAAOA,EAAIG,KAAK,MAAQ,MAG7Eb,KAAKc,sBAAsBd,KAAKG,QAASR,EAAeE,GACxD,OAAOG,KAAKG,OAChB,CAEA,MAAMY,EAAM,IAAIC,EAAc,CAC1BX,GAAIL,KAAKM,iBAAiBR,EAAeF,GACzCqB,aAAc,IAAIpB,KAAaD,KAC/BsB,SAAUvB,EAAcwB,IAAIC,SAC5BC,YAAa1B,EAAcwB,IAAIG,OAAS,kBACxCC,gBAAkBC,IACd,MAAMC,EAAQzB,KAAKG,QAA0BuB,kBAC7C,MAAMC,EAAS3B,KAAK4B,8BACpB,GAAI5B,KAAKD,SAAU,CACfC,KAAKD,SAAS4B,EAAOE,QAAS7B,KAAK8B,SACvC,KAIR,GAAInC,EAAcoC,KAAM,CACpBpC,EAAcoC,KAAKC,QAAStB,IACxBK,EAAIkB,QAAQ,IAAIC,EAAK,CAAEC,IAAKzB,EAAI0B,WAAY7B,KAAMG,EAAI0B,eAE9D,CAEApC,KAAKG,QAAUY,EACff,KAAKc,sBAAsBd,KAAKG,QAASR,EAAeE,GACxD,OAAOG,KAAKG,OAChB,CAMUkC,WACN,OAAOrC,KAAKG,QAAWH,KAAKG,QAA0BuB,kBAAoB,EAC9E,CAKUY,aACN,GAAItC,KAAKG,SAAWH,KAAKC,SAAU,CAC/B,IAAKD,KAAKE,WAAY,OACrBF,KAAKG,QAA0BoC,YAAYvC,KAAKC,SAASkB,IAAIC,SAClE,CACJ,EACH,IAAAoB,EAAA,CAAAC,WAAA,MAAAD,EAAA/C,oBAAA,OAAA+C,CAAA","ignoreList":[]}
@@ -52,7 +52,7 @@ export class MultiSelectPlugin extends BasePlugin {
52
52
  placeholder: fieldMetadata.ui?.label || "Select items...",
53
53
  selectionChange: (oEvent: sap.ui.base.Event) => {
54
54
  const keys = (this.control as MultiComboBox).getSelectedKeys();
55
- const result = this.validate();
55
+ const result = this.validateAndApplyVisualState();
56
56
  if (this.onChange) {
57
57
  this.onChange(result.isValid, this.fieldKey);
58
58
  }
@@ -34,12 +34,12 @@ sap.ui.define(["./BasePlugin", "sap/m/StepInput", "sap/m/Text"], function (___Ba
34
34
  this.control = new StepInput({
35
35
  id: this.generateStableId(engineScopeId, bindingPath),
36
36
  value: `{${modelName}>${bindingPath}}`,
37
- displayValuePrecision: fieldMetadata.scale || 0,
37
+ displayValuePrecision: fieldMetadata.scale !== undefined ? fieldMetadata.scale : fieldMetadata.type === "integer" ? 0 : 3,
38
38
  editable: !fieldMetadata.ui?.readOnly,
39
39
  required: fieldMetadata.required,
40
40
  change: oEvent => {
41
41
  const val = oEvent.getParameter("value");
42
- const result = this.validate();
42
+ const result = this.validateAndApplyVisualState();
43
43
  if (this.onChange) {
44
44
  this.onChange(result.isValid, this.fieldKey);
45
45
  }
@@ -1 +1 @@
1
- {"version":3,"file":"NumberPlugin-dbg.js","names":["BasePlugin","___BasePlugin","NumberPlugin","render","fieldMetadata","bindingPath","modelName","engineScopeId","onChange","metadata","isEditable","control","TextControl","id","generateStableId","text","applyCommonDirectives","StepInput","value","displayValuePrecision","scale","editable","ui","readOnly","required","change","oEvent","val","getParameter","result","validate","isValid","fieldKey","getValue","applyState","input","setEditable","setRequired","__exports","__esModule"],"sources":["NumberPlugin.ts"],"sourcesContent":["/**\n * @file NumberPlugin.ts\n * @description Renders a sap.m.StepInput for numeric data.\n */\n\nimport { BasePlugin } from \"./BasePlugin\";\nimport { IPropertyMetadata } from \"../../interfaces/ISchema\";\nimport StepInput from \"sap/m/StepInput\";\nimport Control from \"sap/ui/core/Control\";\nimport TextControl from \"sap/m/Text\";\n\n/**\n * Handles rendering and logic for numeric inputs.\n */\nexport class NumberPlugin extends BasePlugin {\n /**\n * Renders a `sap.m.StepInput` component for numeric evaluation.\n * \n * @param fieldMetadata The specific JSON schema properties for this field.\n * @param bindingPath The JSON path bound to this control.\n * @param modelName The UI5 JSONModel name.\n * @param engineScopeId The deterministic scope ID.\n * @param onChange The callback fired on value change.\n * @returns {Control} The configured StepInput control.\n */\n public render(fieldMetadata: IPropertyMetadata, bindingPath: string, modelName: string = \"meta\", engineScopeId?: string, onChange?: (isValid: boolean, fieldKey?: string) => void): Control {\n this.onChange = onChange;\n this.metadata = fieldMetadata;\n\n if (!this.isEditable) {\n \n this.control = new TextControl({\n id: this.generateStableId(engineScopeId, bindingPath),\n text: `{${modelName}>${bindingPath}}`\n });\n this.applyCommonDirectives(this.control, fieldMetadata, modelName);\n return this.control as Control;\n }\n\n this.control = new StepInput({\n id: this.generateStableId(engineScopeId, bindingPath),\n value: `{${modelName}>${bindingPath}}`,\n displayValuePrecision: fieldMetadata.scale || 0,\n editable: !fieldMetadata.ui?.readOnly,\n required: fieldMetadata.required,\n change: (oEvent: sap.ui.base.Event) => {\n const val = oEvent.getParameter(\"value\");\n const result = this.validate();\n if (this.onChange) {\n this.onChange(result.isValid, this.fieldKey);\n }\n }\n });\n\n this.applyCommonDirectives(this.control, fieldMetadata, modelName);\n\n return this.control as Control;\n }\n\n /**\n * Retrieves the current numeric state.\n * @returns {unknown} The numeric value.\n */\n protected getValue(): unknown {\n return this.control ? (this.control as StepInput).getValue() : null;\n }\n\n /**\n * Applies dynamic read-only state.\n */\n protected applyState(): void {\n if (this.control && this.metadata) {\n if (!this.isEditable) return;\n const input = this.control as StepInput;\n input.setEditable(!this.metadata.ui?.readOnly);\n input.setRequired(this.metadata.required);\n }\n }\n}\n"],"mappings":";;;EAAA;AACA;AACA;AACA;EAHA,MAKSA,UAAU,GAAAC,aAAA;EAMnB;AACA;AACA;EACO,MAAMC,YAAY,SAASF,UAAU,CAAC;IACzC;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACWG,MAAMA,CAACC,aAAgC,EAAGC,WAAmB,EAAGC,SAAiB,GAAG,MAAM,EAAEC,aAAsB,EAAEC,QAAwD,EAAW;MAC1L,IAAI,CAACA,QAAQ,GAAGA,QAAQ;MACxB,IAAI,CAACC,QAAQ,GAAGL,aAAa;MAE7B,IAAI,CAAC,IAAI,CAACM,UAAU,EAAE;QAElB,IAAI,CAACC,OAAO,GAAG,IAAIC,WAAW,CAAC;UAC3BC,EAAE,EAAE,IAAI,CAACC,gBAAgB,CAACP,aAAa,EAAEF,WAAW,CAAC;UACrDU,IAAI,EAAE,IAAIT,SAAS,IAAID,WAAW;QACtC,CAAC,CAAC;QACF,IAAI,CAACW,qBAAqB,CAAC,IAAI,CAACL,OAAO,EAAEP,aAAa,EAAEE,SAAS,CAAC;QAClE,OAAO,IAAI,CAACK,OAAO;MACvB;MAEA,IAAI,CAACA,OAAO,GAAG,IAAIM,SAAS,CAAC;QACzBJ,EAAE,EAAE,IAAI,CAACC,gBAAgB,CAACP,aAAa,EAAEF,WAAW,CAAC;QACrDa,KAAK,EAAE,IAAIZ,SAAS,IAAID,WAAW,GAAG;QACtCc,qBAAqB,EAAEf,aAAa,CAACgB,KAAK,IAAI,CAAC;QAC/CC,QAAQ,EAAE,CAACjB,aAAa,CAACkB,EAAE,EAAEC,QAAQ;QACrCC,QAAQ,EAAEpB,aAAa,CAACoB,QAAQ;QAChCC,MAAM,EAAGC,MAAyB,IAAK;UACnC,MAAMC,GAAG,GAAGD,MAAM,CAACE,YAAY,CAAC,OAAO,CAAC;UACxC,MAAMC,MAAM,GAAG,IAAI,CAACC,QAAQ,CAAC,CAAC;UAC9B,IAAI,IAAI,CAACtB,QAAQ,EAAE;YACf,IAAI,CAACA,QAAQ,CAACqB,MAAM,CAACE,OAAO,EAAE,IAAI,CAACC,QAAQ,CAAC;UAChD;QACJ;MACJ,CAAC,CAAC;MAEF,IAAI,CAAChB,qBAAqB,CAAC,IAAI,CAACL,OAAO,EAAEP,aAAa,EAAEE,SAAS,CAAC;MAElE,OAAO,IAAI,CAACK,OAAO;IACvB;;IAEA;AACJ;AACA;AACA;IACcsB,QAAQA,CAAA,EAAY;MAC1B,OAAO,IAAI,CAACtB,OAAO,GAAI,IAAI,CAACA,OAAO,CAAesB,QAAQ,CAAC,CAAC,GAAG,IAAI;IACvE;;IAEA;AACJ;AACA;IACcC,UAAUA,CAAA,EAAS;MACzB,IAAI,IAAI,CAACvB,OAAO,IAAI,IAAI,CAACF,QAAQ,EAAE;QAC/B,IAAI,CAAC,IAAI,CAACC,UAAU,EAAE;QACtB,MAAMyB,KAAK,GAAG,IAAI,CAACxB,OAAoB;QACvCwB,KAAK,CAACC,WAAW,CAAC,CAAC,IAAI,CAAC3B,QAAQ,CAACa,EAAE,EAAEC,QAAQ,CAAC;QAC9CY,KAAK,CAACE,WAAW,CAAC,IAAI,CAAC5B,QAAQ,CAACe,QAAQ,CAAC;MAC7C;IACJ;EACJ;EAAC,IAAAc,SAAA;IAAAC,UAAA;EAAA;EAAAD,SAAA,CAAApC,YAAA,GAAAA,YAAA;EAAA,OAAAoC,SAAA;AAAA","ignoreList":[]}
1
+ {"version":3,"file":"NumberPlugin-dbg.js","names":["BasePlugin","___BasePlugin","NumberPlugin","render","fieldMetadata","bindingPath","modelName","engineScopeId","onChange","metadata","isEditable","control","TextControl","id","generateStableId","text","applyCommonDirectives","StepInput","value","displayValuePrecision","scale","undefined","type","editable","ui","readOnly","required","change","oEvent","val","getParameter","result","validateAndApplyVisualState","isValid","fieldKey","getValue","applyState","input","setEditable","setRequired","__exports","__esModule"],"sources":["NumberPlugin.ts"],"sourcesContent":["/**\n * @file NumberPlugin.ts\n * @description Renders a sap.m.StepInput for numeric data.\n */\n\nimport { BasePlugin } from \"./BasePlugin\";\nimport { IPropertyMetadata } from \"../../interfaces/ISchema\";\nimport StepInput from \"sap/m/StepInput\";\nimport Control from \"sap/ui/core/Control\";\nimport TextControl from \"sap/m/Text\";\n\n/**\n * Handles rendering and logic for numeric inputs.\n */\nexport class NumberPlugin extends BasePlugin {\n /**\n * Renders a `sap.m.StepInput` component for numeric evaluation.\n * \n * @param fieldMetadata The specific JSON schema properties for this field.\n * @param bindingPath The JSON path bound to this control.\n * @param modelName The UI5 JSONModel name.\n * @param engineScopeId The deterministic scope ID.\n * @param onChange The callback fired on value change.\n * @returns {Control} The configured StepInput control.\n */\n public render(fieldMetadata: IPropertyMetadata, bindingPath: string, modelName: string = \"meta\", engineScopeId?: string, onChange?: (isValid: boolean, fieldKey?: string) => void): Control {\n this.onChange = onChange;\n this.metadata = fieldMetadata;\n\n if (!this.isEditable) {\n \n this.control = new TextControl({\n id: this.generateStableId(engineScopeId, bindingPath),\n text: `{${modelName}>${bindingPath}}`\n });\n this.applyCommonDirectives(this.control, fieldMetadata, modelName);\n return this.control as Control;\n }\n\n this.control = new StepInput({\n id: this.generateStableId(engineScopeId, bindingPath),\n value: `{${modelName}>${bindingPath}}`,\n displayValuePrecision: fieldMetadata.scale !== undefined ? fieldMetadata.scale : (fieldMetadata.type === \"integer\" ? 0 : 3),\n editable: !fieldMetadata.ui?.readOnly,\n required: fieldMetadata.required,\n change: (oEvent: sap.ui.base.Event) => {\n const val = oEvent.getParameter(\"value\");\n const result = this.validateAndApplyVisualState();\n if (this.onChange) {\n this.onChange(result.isValid, this.fieldKey);\n }\n }\n });\n\n this.applyCommonDirectives(this.control, fieldMetadata, modelName);\n\n return this.control as Control;\n }\n\n /**\n * Retrieves the current numeric state.\n * @returns {unknown} The numeric value.\n */\n protected getValue(): unknown {\n return this.control ? (this.control as StepInput).getValue() : null;\n }\n\n /**\n * Applies dynamic read-only state.\n */\n protected applyState(): void {\n if (this.control && this.metadata) {\n if (!this.isEditable) return;\n const input = this.control as StepInput;\n input.setEditable(!this.metadata.ui?.readOnly);\n input.setRequired(this.metadata.required);\n }\n }\n}\n"],"mappings":";;;EAAA;AACA;AACA;AACA;EAHA,MAKSA,UAAU,GAAAC,aAAA;EAMnB;AACA;AACA;EACO,MAAMC,YAAY,SAASF,UAAU,CAAC;IACzC;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACWG,MAAMA,CAACC,aAAgC,EAAGC,WAAmB,EAAGC,SAAiB,GAAG,MAAM,EAAEC,aAAsB,EAAEC,QAAwD,EAAW;MAC1L,IAAI,CAACA,QAAQ,GAAGA,QAAQ;MACxB,IAAI,CAACC,QAAQ,GAAGL,aAAa;MAE7B,IAAI,CAAC,IAAI,CAACM,UAAU,EAAE;QAElB,IAAI,CAACC,OAAO,GAAG,IAAIC,WAAW,CAAC;UAC3BC,EAAE,EAAE,IAAI,CAACC,gBAAgB,CAACP,aAAa,EAAEF,WAAW,CAAC;UACrDU,IAAI,EAAE,IAAIT,SAAS,IAAID,WAAW;QACtC,CAAC,CAAC;QACF,IAAI,CAACW,qBAAqB,CAAC,IAAI,CAACL,OAAO,EAAEP,aAAa,EAAEE,SAAS,CAAC;QAClE,OAAO,IAAI,CAACK,OAAO;MACvB;MAEA,IAAI,CAACA,OAAO,GAAG,IAAIM,SAAS,CAAC;QACzBJ,EAAE,EAAE,IAAI,CAACC,gBAAgB,CAACP,aAAa,EAAEF,WAAW,CAAC;QACrDa,KAAK,EAAE,IAAIZ,SAAS,IAAID,WAAW,GAAG;QACtCc,qBAAqB,EAAEf,aAAa,CAACgB,KAAK,KAAKC,SAAS,GAAGjB,aAAa,CAACgB,KAAK,GAAIhB,aAAa,CAACkB,IAAI,KAAK,SAAS,GAAG,CAAC,GAAG,CAAE;QAC3HC,QAAQ,EAAE,CAACnB,aAAa,CAACoB,EAAE,EAAEC,QAAQ;QACrCC,QAAQ,EAAEtB,aAAa,CAACsB,QAAQ;QAChCC,MAAM,EAAGC,MAAyB,IAAK;UACnC,MAAMC,GAAG,GAAGD,MAAM,CAACE,YAAY,CAAC,OAAO,CAAC;UACxC,MAAMC,MAAM,GAAG,IAAI,CAACC,2BAA2B,CAAC,CAAC;UACjD,IAAI,IAAI,CAACxB,QAAQ,EAAE;YACf,IAAI,CAACA,QAAQ,CAACuB,MAAM,CAACE,OAAO,EAAE,IAAI,CAACC,QAAQ,CAAC;UAChD;QACJ;MACJ,CAAC,CAAC;MAEF,IAAI,CAAClB,qBAAqB,CAAC,IAAI,CAACL,OAAO,EAAEP,aAAa,EAAEE,SAAS,CAAC;MAElE,OAAO,IAAI,CAACK,OAAO;IACvB;;IAEA;AACJ;AACA;AACA;IACcwB,QAAQA,CAAA,EAAY;MAC1B,OAAO,IAAI,CAACxB,OAAO,GAAI,IAAI,CAACA,OAAO,CAAewB,QAAQ,CAAC,CAAC,GAAG,IAAI;IACvE;;IAEA;AACJ;AACA;IACcC,UAAUA,CAAA,EAAS;MACzB,IAAI,IAAI,CAACzB,OAAO,IAAI,IAAI,CAACF,QAAQ,EAAE;QAC/B,IAAI,CAAC,IAAI,CAACC,UAAU,EAAE;QACtB,MAAM2B,KAAK,GAAG,IAAI,CAAC1B,OAAoB;QACvC0B,KAAK,CAACC,WAAW,CAAC,CAAC,IAAI,CAAC7B,QAAQ,CAACe,EAAE,EAAEC,QAAQ,CAAC;QAC9CY,KAAK,CAACE,WAAW,CAAC,IAAI,CAAC9B,QAAQ,CAACiB,QAAQ,CAAC;MAC7C;IACJ;EACJ;EAAC,IAAAc,SAAA;IAAAC,UAAA;EAAA;EAAAD,SAAA,CAAAtC,YAAA,GAAAA,YAAA;EAAA,OAAAsC,SAAA;AAAA","ignoreList":[]}
@@ -1,2 +1,2 @@
1
- sap.ui.define(["./BasePlugin","sap/m/StepInput","sap/m/Text"],function(t,e,i){"use strict";const a=t["BasePlugin"];class s extends a{render(t,a,s="meta",n,r){this.onChange=r;this.metadata=t;if(!this.isEditable){this.control=new i({id:this.generateStableId(n,a),text:`{${s}>${a}}`});this.applyCommonDirectives(this.control,t,s);return this.control}this.control=new e({id:this.generateStableId(n,a),value:`{${s}>${a}}`,displayValuePrecision:t.scale||0,editable:!t.ui?.readOnly,required:t.required,change:t=>{const e=t.getParameter("value");const i=this.validate();if(this.onChange){this.onChange(i.isValid,this.fieldKey)}}});this.applyCommonDirectives(this.control,t,s);return this.control}getValue(){return this.control?this.control.getValue():null}applyState(){if(this.control&&this.metadata){if(!this.isEditable)return;const t=this.control;t.setEditable(!this.metadata.ui?.readOnly);t.setRequired(this.metadata.required)}}}var n={__esModule:true};n.NumberPlugin=s;return n});
1
+ sap.ui.define(["./BasePlugin","sap/m/StepInput","sap/m/Text"],function(t,e,i){"use strict";const a=t["BasePlugin"];class s extends a{render(t,a,s="meta",n,r){this.onChange=r;this.metadata=t;if(!this.isEditable){this.control=new i({id:this.generateStableId(n,a),text:`{${s}>${a}}`});this.applyCommonDirectives(this.control,t,s);return this.control}this.control=new e({id:this.generateStableId(n,a),value:`{${s}>${a}}`,displayValuePrecision:t.scale!==undefined?t.scale:t.type==="integer"?0:3,editable:!t.ui?.readOnly,required:t.required,change:t=>{const e=t.getParameter("value");const i=this.validateAndApplyVisualState();if(this.onChange){this.onChange(i.isValid,this.fieldKey)}}});this.applyCommonDirectives(this.control,t,s);return this.control}getValue(){return this.control?this.control.getValue():null}applyState(){if(this.control&&this.metadata){if(!this.isEditable)return;const t=this.control;t.setEditable(!this.metadata.ui?.readOnly);t.setRequired(this.metadata.required)}}}var n={__esModule:true};n.NumberPlugin=s;return n});
2
2
  //# sourceMappingURL=NumberPlugin.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"NumberPlugin.js","names":["BasePlugin","___BasePlugin","NumberPlugin","render","fieldMetadata","bindingPath","modelName","engineScopeId","onChange","this","metadata","isEditable","control","TextControl","id","generateStableId","text","applyCommonDirectives","StepInput","value","displayValuePrecision","scale","editable","ui","readOnly","required","change","oEvent","val","getParameter","result","validate","isValid","fieldKey","getValue","applyState","input","setEditable","setRequired","__exports","__esModule"],"sources":["NumberPlugin.ts"],"sourcesContent":["/**\n * @file NumberPlugin.ts\n * @description Renders a sap.m.StepInput for numeric data.\n */\n\nimport { BasePlugin } from \"./BasePlugin\";\nimport { IPropertyMetadata } from \"../../interfaces/ISchema\";\nimport StepInput from \"sap/m/StepInput\";\nimport Control from \"sap/ui/core/Control\";\nimport TextControl from \"sap/m/Text\";\n\n/**\n * Handles rendering and logic for numeric inputs.\n */\nexport class NumberPlugin extends BasePlugin {\n /**\n * Renders a `sap.m.StepInput` component for numeric evaluation.\n * \n * @param fieldMetadata The specific JSON schema properties for this field.\n * @param bindingPath The JSON path bound to this control.\n * @param modelName The UI5 JSONModel name.\n * @param engineScopeId The deterministic scope ID.\n * @param onChange The callback fired on value change.\n * @returns {Control} The configured StepInput control.\n */\n public render(fieldMetadata: IPropertyMetadata, bindingPath: string, modelName: string = \"meta\", engineScopeId?: string, onChange?: (isValid: boolean, fieldKey?: string) => void): Control {\n this.onChange = onChange;\n this.metadata = fieldMetadata;\n\n if (!this.isEditable) {\n \n this.control = new TextControl({\n id: this.generateStableId(engineScopeId, bindingPath),\n text: `{${modelName}>${bindingPath}}`\n });\n this.applyCommonDirectives(this.control, fieldMetadata, modelName);\n return this.control as Control;\n }\n\n this.control = new StepInput({\n id: this.generateStableId(engineScopeId, bindingPath),\n value: `{${modelName}>${bindingPath}}`,\n displayValuePrecision: fieldMetadata.scale || 0,\n editable: !fieldMetadata.ui?.readOnly,\n required: fieldMetadata.required,\n change: (oEvent: sap.ui.base.Event) => {\n const val = oEvent.getParameter(\"value\");\n const result = this.validate();\n if (this.onChange) {\n this.onChange(result.isValid, this.fieldKey);\n }\n }\n });\n\n this.applyCommonDirectives(this.control, fieldMetadata, modelName);\n\n return this.control as Control;\n }\n\n /**\n * Retrieves the current numeric state.\n * @returns {unknown} The numeric value.\n */\n protected getValue(): unknown {\n return this.control ? (this.control as StepInput).getValue() : null;\n }\n\n /**\n * Applies dynamic read-only state.\n */\n protected applyState(): void {\n if (this.control && this.metadata) {\n if (!this.isEditable) return;\n const input = this.control as StepInput;\n input.setEditable(!this.metadata.ui?.readOnly);\n input.setRequired(this.metadata.required);\n }\n }\n}\n"],"mappings":"2FAAA,MAKSA,EAAUC,EAAA,cASZ,MAAMC,UAAqBF,EAWvBG,OAAOC,EAAmCC,EAAsBC,EAAoB,OAAQC,EAAwBC,GACvHC,KAAKD,SAAWA,EAChBC,KAAKC,SAAWN,EAEhB,IAAKK,KAAKE,WAAY,CAElBF,KAAKG,QAAU,IAAIC,EAAY,CAC3BC,GAAIL,KAAKM,iBAAiBR,EAAeF,GACzCW,KAAM,IAAIV,KAAaD,OAE3BI,KAAKQ,sBAAsBR,KAAKG,QAASR,EAAeE,GACxD,OAAOG,KAAKG,OAChB,CAEAH,KAAKG,QAAU,IAAIM,EAAU,CACzBJ,GAAIL,KAAKM,iBAAiBR,EAAeF,GACzCc,MAAO,IAAIb,KAAaD,KACxBe,sBAAuBhB,EAAciB,OAAS,EAC9CC,UAAWlB,EAAcmB,IAAIC,SAC7BC,SAAUrB,EAAcqB,SACxBC,OAASC,IACL,MAAMC,EAAMD,EAAOE,aAAa,SAChC,MAAMC,EAASrB,KAAKsB,WACpB,GAAItB,KAAKD,SAAU,CACfC,KAAKD,SAASsB,EAAOE,QAASvB,KAAKwB,SACvC,KAIRxB,KAAKQ,sBAAsBR,KAAKG,QAASR,EAAeE,GAExD,OAAOG,KAAKG,OAChB,CAMUsB,WACN,OAAOzB,KAAKG,QAAWH,KAAKG,QAAsBsB,WAAa,IACnE,CAKUC,aACN,GAAI1B,KAAKG,SAAWH,KAAKC,SAAU,CAC/B,IAAKD,KAAKE,WAAY,OACtB,MAAMyB,EAAQ3B,KAAKG,QACnBwB,EAAMC,aAAa5B,KAAKC,SAASa,IAAIC,UACrCY,EAAME,YAAY7B,KAAKC,SAASe,SACpC,CACJ,EACH,IAAAc,EAAA,CAAAC,WAAA,MAAAD,EAAArC,eAAA,OAAAqC,CAAA","ignoreList":[]}
1
+ {"version":3,"file":"NumberPlugin.js","names":["BasePlugin","___BasePlugin","NumberPlugin","render","fieldMetadata","bindingPath","modelName","engineScopeId","onChange","this","metadata","isEditable","control","TextControl","id","generateStableId","text","applyCommonDirectives","StepInput","value","displayValuePrecision","scale","undefined","type","editable","ui","readOnly","required","change","oEvent","val","getParameter","result","validateAndApplyVisualState","isValid","fieldKey","getValue","applyState","input","setEditable","setRequired","__exports","__esModule"],"sources":["NumberPlugin.ts"],"sourcesContent":["/**\n * @file NumberPlugin.ts\n * @description Renders a sap.m.StepInput for numeric data.\n */\n\nimport { BasePlugin } from \"./BasePlugin\";\nimport { IPropertyMetadata } from \"../../interfaces/ISchema\";\nimport StepInput from \"sap/m/StepInput\";\nimport Control from \"sap/ui/core/Control\";\nimport TextControl from \"sap/m/Text\";\n\n/**\n * Handles rendering and logic for numeric inputs.\n */\nexport class NumberPlugin extends BasePlugin {\n /**\n * Renders a `sap.m.StepInput` component for numeric evaluation.\n * \n * @param fieldMetadata The specific JSON schema properties for this field.\n * @param bindingPath The JSON path bound to this control.\n * @param modelName The UI5 JSONModel name.\n * @param engineScopeId The deterministic scope ID.\n * @param onChange The callback fired on value change.\n * @returns {Control} The configured StepInput control.\n */\n public render(fieldMetadata: IPropertyMetadata, bindingPath: string, modelName: string = \"meta\", engineScopeId?: string, onChange?: (isValid: boolean, fieldKey?: string) => void): Control {\n this.onChange = onChange;\n this.metadata = fieldMetadata;\n\n if (!this.isEditable) {\n \n this.control = new TextControl({\n id: this.generateStableId(engineScopeId, bindingPath),\n text: `{${modelName}>${bindingPath}}`\n });\n this.applyCommonDirectives(this.control, fieldMetadata, modelName);\n return this.control as Control;\n }\n\n this.control = new StepInput({\n id: this.generateStableId(engineScopeId, bindingPath),\n value: `{${modelName}>${bindingPath}}`,\n displayValuePrecision: fieldMetadata.scale !== undefined ? fieldMetadata.scale : (fieldMetadata.type === \"integer\" ? 0 : 3),\n editable: !fieldMetadata.ui?.readOnly,\n required: fieldMetadata.required,\n change: (oEvent: sap.ui.base.Event) => {\n const val = oEvent.getParameter(\"value\");\n const result = this.validateAndApplyVisualState();\n if (this.onChange) {\n this.onChange(result.isValid, this.fieldKey);\n }\n }\n });\n\n this.applyCommonDirectives(this.control, fieldMetadata, modelName);\n\n return this.control as Control;\n }\n\n /**\n * Retrieves the current numeric state.\n * @returns {unknown} The numeric value.\n */\n protected getValue(): unknown {\n return this.control ? (this.control as StepInput).getValue() : null;\n }\n\n /**\n * Applies dynamic read-only state.\n */\n protected applyState(): void {\n if (this.control && this.metadata) {\n if (!this.isEditable) return;\n const input = this.control as StepInput;\n input.setEditable(!this.metadata.ui?.readOnly);\n input.setRequired(this.metadata.required);\n }\n }\n}\n"],"mappings":"2FAAA,MAKSA,EAAUC,EAAA,cASZ,MAAMC,UAAqBF,EAWvBG,OAAOC,EAAmCC,EAAsBC,EAAoB,OAAQC,EAAwBC,GACvHC,KAAKD,SAAWA,EAChBC,KAAKC,SAAWN,EAEhB,IAAKK,KAAKE,WAAY,CAElBF,KAAKG,QAAU,IAAIC,EAAY,CAC3BC,GAAIL,KAAKM,iBAAiBR,EAAeF,GACzCW,KAAM,IAAIV,KAAaD,OAE3BI,KAAKQ,sBAAsBR,KAAKG,QAASR,EAAeE,GACxD,OAAOG,KAAKG,OAChB,CAEAH,KAAKG,QAAU,IAAIM,EAAU,CACzBJ,GAAIL,KAAKM,iBAAiBR,EAAeF,GACzCc,MAAO,IAAIb,KAAaD,KACxBe,sBAAuBhB,EAAciB,QAAUC,UAAYlB,EAAciB,MAASjB,EAAcmB,OAAS,UAAY,EAAI,EACzHC,UAAWpB,EAAcqB,IAAIC,SAC7BC,SAAUvB,EAAcuB,SACxBC,OAASC,IACL,MAAMC,EAAMD,EAAOE,aAAa,SAChC,MAAMC,EAASvB,KAAKwB,8BACpB,GAAIxB,KAAKD,SAAU,CACfC,KAAKD,SAASwB,EAAOE,QAASzB,KAAK0B,SACvC,KAIR1B,KAAKQ,sBAAsBR,KAAKG,QAASR,EAAeE,GAExD,OAAOG,KAAKG,OAChB,CAMUwB,WACN,OAAO3B,KAAKG,QAAWH,KAAKG,QAAsBwB,WAAa,IACnE,CAKUC,aACN,GAAI5B,KAAKG,SAAWH,KAAKC,SAAU,CAC/B,IAAKD,KAAKE,WAAY,OACtB,MAAM2B,EAAQ7B,KAAKG,QACnB0B,EAAMC,aAAa9B,KAAKC,SAASe,IAAIC,UACrCY,EAAME,YAAY/B,KAAKC,SAASiB,SACpC,CACJ,EACH,IAAAc,EAAA,CAAAC,WAAA,MAAAD,EAAAvC,eAAA,OAAAuC,CAAA","ignoreList":[]}
@@ -40,12 +40,12 @@ export class NumberPlugin extends BasePlugin {
40
40
  this.control = new StepInput({
41
41
  id: this.generateStableId(engineScopeId, bindingPath),
42
42
  value: `{${modelName}>${bindingPath}}`,
43
- displayValuePrecision: fieldMetadata.scale || 0,
43
+ displayValuePrecision: fieldMetadata.scale !== undefined ? fieldMetadata.scale : (fieldMetadata.type === "integer" ? 0 : 3),
44
44
  editable: !fieldMetadata.ui?.readOnly,
45
45
  required: fieldMetadata.required,
46
46
  change: (oEvent: sap.ui.base.Event) => {
47
47
  const val = oEvent.getParameter("value");
48
- const result = this.validate();
48
+ const result = this.validateAndApplyVisualState();
49
49
  if (this.onChange) {
50
50
  this.onChange(result.isValid, this.fieldKey);
51
51
  }
@@ -56,6 +56,12 @@ sap.ui.define(["./BasePlugin", "sap/m/Button"], function (___BasePlugin, Button)
56
56
  host.attachSubmit(e => {
57
57
  const payload = e.getParameter("payload");
58
58
  parentModel.setProperty(updatePath, payload);
59
+
60
+ // CRITICAL: Notify the parent Engine that this field mutated
61
+ // so it can trigger LiveUpdate syncs and validate!
62
+ if (this.onChange) {
63
+ this.onChange(true, propKey);
64
+ }
59
65
  });
60
66
  }
61
67
  const buttonText = field.ui?.dialogButtonText || (!this.isEditable ? "Close" : "OK");
@@ -1 +1 @@
1
- {"version":3,"file":"ObjectPlugin-dbg.js","names":["BasePlugin","___BasePlugin","ObjectPlugin","render","field","bindingPath","modelName","engineScopeId","onChange","metadata","propKey","startsWith","substring","subSchema","type","title","ui","label","properties","uiLayout","control","Button","id","generateStableId","text","isEditable","icon","press","oEvent","btn","getSource","parentModel","getModel","bindingContext","getBindingContext","updatePath","ctxPath","getPath","endsWith","nestedData","JSON","parse","stringify","getProperty","sap","require","DynamicHost","host","schemaDefinition","data","editable","attachSubmit","e","payload","getParameter","setProperty","buttonText","dialogButtonText","openInDialog","validate","isValid","getValue","applyState","__exports","__esModule"],"sources":["ObjectPlugin.ts"],"sourcesContent":["/**\n * @file ObjectPlugin.ts\n * @description Renders a button that opens a dialog to edit a nested object structure.\n */\n\nimport { BasePlugin } from \"./BasePlugin\";\nimport { IPluginValidationResult } from \"../../interfaces/IPlugin\";\nimport { ISchema, IPropertyMetadata } from \"../../interfaces/ISchema\";\nimport Control from \"sap/ui/core/Control\";\nimport Event from \"sap/ui/base/Event\";\nimport Button from \"sap/m/Button\";\nimport JSONModel from \"sap/ui/model/json/JSONModel\";\n\nexport class ObjectPlugin extends BasePlugin {\n /**\n * Renders a `sap.m.Button` to open a nested Object form dialog.\n * \n * @param field The specific JSON schema properties for this field.\n * @param bindingPath The JSON path bound to this control.\n * @param modelName The UI5 JSONModel name.\n * @param engineScopeId The deterministic scope ID.\n * @param onChange The callback fired on value change.\n * @returns {Control} The configured Button control.\n */\n public render(field: IPropertyMetadata, bindingPath: string, modelName: string = \"meta\", engineScopeId?: string, onChange?: (isValid: boolean, fieldKey?: string) => void): Control {\n this.onChange = onChange;\n this.metadata = field;\n const propKey = bindingPath.startsWith(\"/\") ? bindingPath.substring(1) : bindingPath;\n \n const subSchema: ISchema = {\n type: \"object\",\n title: field.ui?.label || propKey,\n properties: field.properties || {}\n };\n \n if (field.uiLayout) {\n subSchema.uiLayout = field.uiLayout;\n }\n\n this.control = new Button({\n id: this.generateStableId(engineScopeId, bindingPath),\n text: !this.isEditable ? \"View Details\" : \"Edit Details\",\n icon: !this.isEditable ? \"sap-icon://display\" : \"sap-icon://form\",\n press: (oEvent: Event) => {\n const btn = oEvent.getSource() as Button;\n const parentModel = btn.getModel(modelName) as JSONModel;\n if (!parentModel) return;\n \n const bindingContext = btn.getBindingContext(modelName);\n let updatePath = bindingPath;\n if (bindingContext && !bindingPath.startsWith(\"/\")) {\n const ctxPath = bindingContext.getPath();\n updatePath = ctxPath.endsWith(\"/\") ? ctxPath + bindingPath : (ctxPath === \"/\" ? \"/\" + bindingPath : ctxPath + \"/\" + bindingPath);\n }\n \n // Deep clone to prevent live-mutations on the parent model before 'Submit' is clicked\n const nestedData = JSON.parse(JSON.stringify(parentModel.getProperty(updatePath) || {}));\n\n sap.ui.require([\"nz/co/siliconst/ui5/metaui/controls/DynamicHost\"], (DynamicHost: typeof import(\"../../controls/DynamicHost\").default) => {\n const host = new DynamicHost({\n schemaDefinition: subSchema,\n data: nestedData,\n editable: this.isEditable\n });\n\n if (!!this.isEditable) {\n host.attachSubmit((e: Event) => {\n const payload = (e.getParameter(\"payload\") as unknown);\n parentModel.setProperty(updatePath, payload);\n });\n }\n\n const buttonText = field.ui?.dialogButtonText || (!this.isEditable ? \"Close\" : \"OK\");\n host.openInDialog(`Nested Details: ${field.ui?.label || propKey}`, buttonText);\n });\n }\n });\n\n return this.control as Control;\n }\n\n /**\n * Validates the object plugin (always true as validation is deferred to the dialog host).\n * @returns {IPluginValidationResult} The validation result.\n */\n public validate(): IPluginValidationResult {\n return { isValid: true };\n }\n\n /**\n * Read-only component for the engine, returns null.\n */\n protected getValue(): null {\n return null;\n }\n\n /**\n * Read-only component, no dynamic state handling needed for the button itself.\n */\n protected applyState(): void {\n // No dynamic state handling needed for the button\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"ObjectPlugin-dbg.js","names":["BasePlugin","___BasePlugin","ObjectPlugin","render","field","bindingPath","modelName","engineScopeId","onChange","metadata","propKey","startsWith","substring","subSchema","type","title","ui","label","properties","uiLayout","control","Button","id","generateStableId","text","isEditable","icon","press","oEvent","btn","getSource","parentModel","getModel","bindingContext","getBindingContext","updatePath","ctxPath","getPath","endsWith","nestedData","JSON","parse","stringify","getProperty","sap","require","DynamicHost","host","schemaDefinition","data","editable","attachSubmit","e","payload","getParameter","setProperty","buttonText","dialogButtonText","openInDialog","validate","isValid","getValue","applyState","__exports","__esModule"],"sources":["ObjectPlugin.ts"],"sourcesContent":["/**\n * @file ObjectPlugin.ts\n * @description Renders a button that opens a dialog to edit a nested object structure.\n */\n\nimport { BasePlugin } from \"./BasePlugin\";\nimport { IPluginValidationResult } from \"../../interfaces/IPlugin\";\nimport { ISchema, IPropertyMetadata } from \"../../interfaces/ISchema\";\nimport Control from \"sap/ui/core/Control\";\nimport Event from \"sap/ui/base/Event\";\nimport Button from \"sap/m/Button\";\nimport JSONModel from \"sap/ui/model/json/JSONModel\";\n\nexport class ObjectPlugin extends BasePlugin {\n /**\n * Renders a `sap.m.Button` to open a nested Object form dialog.\n * \n * @param field The specific JSON schema properties for this field.\n * @param bindingPath The JSON path bound to this control.\n * @param modelName The UI5 JSONModel name.\n * @param engineScopeId The deterministic scope ID.\n * @param onChange The callback fired on value change.\n * @returns {Control} The configured Button control.\n */\n public render(field: IPropertyMetadata, bindingPath: string, modelName: string = \"meta\", engineScopeId?: string, onChange?: (isValid: boolean, fieldKey?: string) => void): Control {\n this.onChange = onChange;\n this.metadata = field;\n const propKey = bindingPath.startsWith(\"/\") ? bindingPath.substring(1) : bindingPath;\n \n const subSchema: ISchema = {\n type: \"object\",\n title: field.ui?.label || propKey,\n properties: field.properties || {}\n };\n \n if (field.uiLayout) {\n subSchema.uiLayout = field.uiLayout;\n }\n\n this.control = new Button({\n id: this.generateStableId(engineScopeId, bindingPath),\n text: !this.isEditable ? \"View Details\" : \"Edit Details\",\n icon: !this.isEditable ? \"sap-icon://display\" : \"sap-icon://form\",\n press: (oEvent: Event) => {\n const btn = oEvent.getSource() as Button;\n const parentModel = btn.getModel(modelName) as JSONModel;\n if (!parentModel) return;\n \n const bindingContext = btn.getBindingContext(modelName);\n let updatePath = bindingPath;\n if (bindingContext && !bindingPath.startsWith(\"/\")) {\n const ctxPath = bindingContext.getPath();\n updatePath = ctxPath.endsWith(\"/\") ? ctxPath + bindingPath : (ctxPath === \"/\" ? \"/\" + bindingPath : ctxPath + \"/\" + bindingPath);\n }\n \n // Deep clone to prevent live-mutations on the parent model before 'Submit' is clicked\n const nestedData = JSON.parse(JSON.stringify(parentModel.getProperty(updatePath) || {}));\n\n sap.ui.require([\"nz/co/siliconst/ui5/metaui/controls/DynamicHost\"], (DynamicHost: typeof import(\"../../controls/DynamicHost\").default) => {\n const host = new DynamicHost({\n schemaDefinition: subSchema,\n data: nestedData,\n editable: this.isEditable\n });\n\n if (!!this.isEditable) {\n host.attachSubmit((e: Event) => {\n const payload = (e.getParameter(\"payload\") as unknown);\n parentModel.setProperty(updatePath, payload);\n \n // CRITICAL: Notify the parent Engine that this field mutated\n // so it can trigger LiveUpdate syncs and validate!\n if (this.onChange) {\n this.onChange(true, propKey);\n }\n });\n }\n\n const buttonText = field.ui?.dialogButtonText || (!this.isEditable ? \"Close\" : \"OK\");\n host.openInDialog(`Nested Details: ${field.ui?.label || propKey}`, buttonText);\n });\n }\n });\n\n return this.control as Control;\n }\n\n /**\n * Validates the object plugin (always true as validation is deferred to the dialog host).\n * @returns {IPluginValidationResult} The validation result.\n */\n public validate(): IPluginValidationResult {\n return { isValid: true };\n }\n\n /**\n * Read-only component for the engine, returns null.\n */\n protected getValue(): null {\n return null;\n }\n\n /**\n * Read-only component, no dynamic state handling needed for the button itself.\n */\n protected applyState(): void {\n // No dynamic state handling needed for the button\n }\n}\n"],"mappings":"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","ignoreList":[]}