@siliconst/metaui 1.4.4 → 1.4.6

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 (204) hide show
  1. package/package.json +1 -1
  2. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost-dbg.js +42 -3
  3. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost-dbg.js.map +1 -1
  4. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.d.ts +7 -1
  5. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.d.ts.map +1 -1
  6. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.js +1 -1
  7. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.js.map +1 -1
  8. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.ts +45 -1
  9. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost-dbg.js +5 -5
  10. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost-dbg.js.map +1 -1
  11. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.d.ts +1 -1
  12. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.js +1 -1
  13. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.js.map +1 -1
  14. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.ts +4 -4
  15. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ODataDelegate-dbg.js +122 -0
  16. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ODataDelegate-dbg.js.map +1 -0
  17. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ODataDelegate.d.ts +49 -0
  18. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ODataDelegate.d.ts.map +1 -0
  19. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ODataDelegate.js +2 -0
  20. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ODataDelegate.js.map +1 -0
  21. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ODataDelegate.ts +118 -0
  22. package/src/nz/co/siliconst/ui5/metaui/core/DefaultLayoutGenerator-dbg.js +24 -8
  23. package/src/nz/co/siliconst/ui5/metaui/core/DefaultLayoutGenerator-dbg.js.map +1 -1
  24. package/src/nz/co/siliconst/ui5/metaui/core/DefaultLayoutGenerator.d.ts +1 -0
  25. package/src/nz/co/siliconst/ui5/metaui/core/DefaultLayoutGenerator.d.ts.map +1 -1
  26. package/src/nz/co/siliconst/ui5/metaui/core/DefaultLayoutGenerator.js +1 -1
  27. package/src/nz/co/siliconst/ui5/metaui/core/DefaultLayoutGenerator.js.map +1 -1
  28. package/src/nz/co/siliconst/ui5/metaui/core/DefaultLayoutGenerator.ts +26 -9
  29. package/src/nz/co/siliconst/ui5/metaui/core/Engine-dbg.js +5 -5
  30. package/src/nz/co/siliconst/ui5/metaui/core/Engine-dbg.js.map +1 -1
  31. package/src/nz/co/siliconst/ui5/metaui/core/Engine.d.ts +3 -3
  32. package/src/nz/co/siliconst/ui5/metaui/core/Engine.d.ts.map +1 -1
  33. package/src/nz/co/siliconst/ui5/metaui/core/Engine.js +1 -1
  34. package/src/nz/co/siliconst/ui5/metaui/core/Engine.js.map +1 -1
  35. package/src/nz/co/siliconst/ui5/metaui/core/Engine.ts +5 -5
  36. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer-dbg.js +45 -1
  37. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer-dbg.js.map +1 -1
  38. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.d.ts +10 -1
  39. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.d.ts.map +1 -1
  40. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.js +1 -1
  41. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.js.map +1 -1
  42. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.ts +45 -2
  43. package/src/nz/co/siliconst/ui5/metaui/interfaces/IPlugin-dbg.js.map +1 -1
  44. package/src/nz/co/siliconst/ui5/metaui/interfaces/IPlugin.d.ts +3 -3
  45. package/src/nz/co/siliconst/ui5/metaui/interfaces/IPlugin.d.ts.map +1 -1
  46. package/src/nz/co/siliconst/ui5/metaui/interfaces/IPlugin.ts +3 -3
  47. package/src/nz/co/siliconst/ui5/metaui/layouts/CompactLayout-dbg.js +10 -6
  48. package/src/nz/co/siliconst/ui5/metaui/layouts/CompactLayout-dbg.js.map +1 -1
  49. package/src/nz/co/siliconst/ui5/metaui/layouts/CompactLayout.d.ts.map +1 -1
  50. package/src/nz/co/siliconst/ui5/metaui/layouts/CompactLayout.js +1 -1
  51. package/src/nz/co/siliconst/ui5/metaui/layouts/CompactLayout.js.map +1 -1
  52. package/src/nz/co/siliconst/ui5/metaui/layouts/CompactLayout.ts +5 -5
  53. package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout-dbg.js +10 -6
  54. package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout-dbg.js.map +1 -1
  55. package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout.d.ts.map +1 -1
  56. package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout.js +1 -1
  57. package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout.js.map +1 -1
  58. package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout.ts +5 -5
  59. package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout-dbg.js +24 -31
  60. package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout-dbg.js.map +1 -1
  61. package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout.d.ts.map +1 -1
  62. package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout.js +1 -1
  63. package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout.js.map +1 -1
  64. package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout.ts +20 -31
  65. package/src/nz/co/siliconst/ui5/metaui/layouts/WizardLayout-dbg.js +8 -4
  66. package/src/nz/co/siliconst/ui5/metaui/layouts/WizardLayout-dbg.js.map +1 -1
  67. package/src/nz/co/siliconst/ui5/metaui/layouts/WizardLayout.d.ts.map +1 -1
  68. package/src/nz/co/siliconst/ui5/metaui/layouts/WizardLayout.js +1 -1
  69. package/src/nz/co/siliconst/ui5/metaui/layouts/WizardLayout.js.map +1 -1
  70. package/src/nz/co/siliconst/ui5/metaui/layouts/WizardLayout.ts +3 -3
  71. package/src/nz/co/siliconst/ui5/metaui/library-preload.js +36 -35
  72. package/src/nz/co/siliconst/ui5/metaui/library-preload.js.map +1 -1
  73. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/ClearFormActionPlugin-dbg.js +2 -2
  74. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/ClearFormActionPlugin-dbg.js.map +1 -1
  75. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/ClearFormActionPlugin.js +1 -1
  76. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/ClearFormActionPlugin.js.map +1 -1
  77. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/ClearFormActionPlugin.ts +2 -2
  78. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/SubmitFormActionPlugin-dbg.js +2 -2
  79. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/SubmitFormActionPlugin-dbg.js.map +1 -1
  80. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/SubmitFormActionPlugin.js +1 -1
  81. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/SubmitFormActionPlugin.js.map +1 -1
  82. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/SubmitFormActionPlugin.ts +2 -2
  83. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin-dbg.js +5 -5
  84. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin-dbg.js.map +1 -1
  85. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin.js +1 -1
  86. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin.js.map +1 -1
  87. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin.ts +5 -5
  88. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin-dbg.js +2 -2
  89. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin-dbg.js.map +1 -1
  90. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin.js +1 -1
  91. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin.js.map +1 -1
  92. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin.ts +2 -2
  93. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin-dbg.js +6 -6
  94. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin-dbg.js.map +1 -1
  95. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.d.ts +5 -5
  96. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.d.ts.map +1 -1
  97. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.js +1 -1
  98. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.js.map +1 -1
  99. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.ts +6 -6
  100. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin-dbg.js +2 -2
  101. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin-dbg.js.map +1 -1
  102. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin.js +1 -1
  103. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin.js.map +1 -1
  104. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin.ts +2 -2
  105. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin-dbg.js +2 -2
  106. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin-dbg.js.map +1 -1
  107. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin.js +1 -1
  108. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin.js.map +1 -1
  109. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin.ts +2 -2
  110. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin-dbg.js +2 -2
  111. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin-dbg.js.map +1 -1
  112. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin.js +1 -1
  113. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin.js.map +1 -1
  114. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin.ts +2 -2
  115. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin-dbg.js +2 -2
  116. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin-dbg.js.map +1 -1
  117. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin.js +1 -1
  118. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin.js.map +1 -1
  119. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin.ts +2 -2
  120. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin-dbg.js +2 -2
  121. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin-dbg.js.map +1 -1
  122. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin.js +1 -1
  123. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin.js.map +1 -1
  124. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin.ts +2 -2
  125. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin-dbg.js +2 -2
  126. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin-dbg.js.map +1 -1
  127. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin.js +1 -1
  128. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin.js.map +1 -1
  129. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin.ts +2 -2
  130. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin-dbg.js +2 -2
  131. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin-dbg.js.map +1 -1
  132. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin.js +1 -1
  133. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin.js.map +1 -1
  134. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin.ts +2 -2
  135. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin-dbg.js +2 -2
  136. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin-dbg.js.map +1 -1
  137. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin.js +1 -1
  138. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin.js.map +1 -1
  139. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin.ts +2 -2
  140. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin-dbg.js +2 -2
  141. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin-dbg.js.map +1 -1
  142. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin.js +1 -1
  143. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin.js.map +1 -1
  144. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin.ts +2 -2
  145. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin-dbg.js +2 -2
  146. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin-dbg.js.map +1 -1
  147. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin.js +1 -1
  148. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin.js.map +1 -1
  149. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin.ts +2 -2
  150. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin-dbg.js +5 -5
  151. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin-dbg.js.map +1 -1
  152. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin.js +1 -1
  153. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin.js.map +1 -1
  154. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin.ts +5 -5
  155. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin-dbg.js +2 -2
  156. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin-dbg.js.map +1 -1
  157. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin.js +1 -1
  158. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin.js.map +1 -1
  159. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin.ts +2 -2
  160. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin-dbg.js +2 -2
  161. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin-dbg.js.map +1 -1
  162. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin.js +1 -1
  163. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin.js.map +1 -1
  164. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin.ts +2 -2
  165. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin-dbg.js +2 -2
  166. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin-dbg.js.map +1 -1
  167. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin.js +1 -1
  168. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin.js.map +1 -1
  169. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin.ts +2 -2
  170. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin-dbg.js +2 -2
  171. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin-dbg.js.map +1 -1
  172. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin.js +1 -1
  173. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin.js.map +1 -1
  174. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin.ts +2 -2
  175. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin-dbg.js +2 -2
  176. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin-dbg.js.map +1 -1
  177. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin.js +1 -1
  178. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin.js.map +1 -1
  179. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin.ts +2 -2
  180. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin-dbg.js +2 -2
  181. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin-dbg.js.map +1 -1
  182. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin.js +1 -1
  183. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin.js.map +1 -1
  184. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin.ts +2 -2
  185. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin-dbg.js +2 -2
  186. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin-dbg.js.map +1 -1
  187. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin.js +1 -1
  188. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin.js.map +1 -1
  189. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin.ts +2 -2
  190. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin-dbg.js +2 -2
  191. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin-dbg.js.map +1 -1
  192. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin.js +1 -1
  193. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin.js.map +1 -1
  194. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin.ts +2 -2
  195. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin-dbg.js +2 -2
  196. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin-dbg.js.map +1 -1
  197. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin.js +1 -1
  198. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin.js.map +1 -1
  199. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin.ts +2 -2
  200. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteDropdownPlugin-dbg.js +2 -2
  201. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteDropdownPlugin-dbg.js.map +1 -1
  202. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteDropdownPlugin.js +1 -1
  203. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteDropdownPlugin.js.map +1 -1
  204. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteDropdownPlugin.ts +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"SchemaNormalizer-dbg.js","names":["Logger","___utils_Logger","SchemaNormalizer","normalize","rawSchema","data","schemaObj","JSON","parse","e","msg","message","error","showErrorPopup","Array","isArray","inferSchemaFromData","normalized","title","type","items","layoutStrategy","uiLayout","additionalProperties","targetProperties","properties","inferred","deepMergeProperties","normalizeProperties","normalizePropertyMetadata","base","override","merged","key","Object","keys","overrideVal","baseVal","normalizedProps","prop","keyName","ui","label","generateLabel","isKey","readOnly","widget","valueHelp","enum","undefined","visibleOn","enabledOn","format","validators","formatter","args","rows","fullWidth","required","maxLength","minimum","maximum","pattern","precision","scale","name","spaced","replace","split","filter","w","length","map","word","charAt","toUpperCase","slice","toLowerCase","join","trim","schema","inferPropertiesFromObject","obj","val","__exports","__esModule"],"sources":["SchemaNormalizer.ts"],"sourcesContent":["/**\n * @file SchemaNormalizer.ts\n * @description Transforms and validates incoming JSON payloads into the strict v2 ISchema dictionary matrix.\n */\n\nimport { ISchema, IPropertyMetadata, FieldType } from \"../interfaces/ISchema\";\nimport { Logger } from \"../utils/Logger\";\n\nexport class SchemaNormalizer {\n\n /**\n * Validates that the provided raw payload conforms to the required ISchema structures.\n */\n public static normalize(rawSchema?: any, data?: any): ISchema {\n let schemaObj = rawSchema;\n\n if (typeof schemaObj === \"string\") {\n try {\n schemaObj = JSON.parse(schemaObj);\n } catch (e) {\n const msg = (e as Error).message;\n Logger.error(\"[MetaUI SchemaNormalizer] Failed to parse schema string.\", msg);\n Logger.showErrorPopup(`Failed to parse the provided JSON schema.\\n\\nDetails: ${msg}`);\n schemaObj = null;\n }\n }\n\n if (!schemaObj || typeof schemaObj !== 'object' || Array.isArray(schemaObj)) {\n return this.inferSchemaFromData(data);\n }\n\n try {\n // It is an object. Ensure it conforms to v2 structure.\n const normalized: ISchema = {\n title: schemaObj.title,\n type: schemaObj.type || (schemaObj.items ? \"array\" : \"object\"),\n layoutStrategy: schemaObj.layoutStrategy,\n uiLayout: schemaObj.uiLayout,\n additionalProperties: schemaObj.additionalProperties\n };\n\n let targetProperties = schemaObj.properties || {};\n\n if (schemaObj.additionalProperties === true && data) {\n const inferred = this.inferSchemaFromData(data);\n if (inferred.type === \"object\" && inferred.properties) {\n targetProperties = this.deepMergeProperties(inferred.properties, targetProperties);\n } else if (inferred.type === \"array\" && inferred.items && inferred.items.properties) {\n // Array schema merging could be added here if we want full support.\n }\n }\n\n if (normalized.type === \"object\") {\n normalized.properties = this.normalizeProperties(targetProperties);\n } else if (normalized.type === \"array\") {\n // Future expansion: array deep merge\n normalized.items = this.normalizePropertyMetadata(schemaObj.items || { type: \"object\", properties: {} }, \"items\");\n }\n\n return normalized;\n } catch (error) {\n const msg = (error as Error).message;\n Logger.error(\"[MetaUI SchemaNormalizer] Critical error normalizing schema object.\", msg);\n Logger.showErrorPopup(`Schema Normalization failed.\\n\\nDetails: ${msg}`);\n // Fallback to empty object to prevent hard crash downstream\n return { type: \"object\", properties: {} };\n }\n }\n\n private static deepMergeProperties(base: any, override: any): any {\n const merged = { ...base };\n for (const key of Object.keys(override)) {\n const overrideVal = override[key];\n const baseVal = merged[key];\n\n if (baseVal && typeof baseVal === \"object\" && !Array.isArray(baseVal) &&\n overrideVal && typeof overrideVal === \"object\" && !Array.isArray(overrideVal)) {\n merged[key] = this.deepMergeProperties(baseVal, overrideVal);\n } else {\n merged[key] = overrideVal;\n }\n }\n return merged;\n }\n\n private static normalizeProperties(properties: any): Record<string, IPropertyMetadata> {\n const normalizedProps: Record<string, IPropertyMetadata> = {};\n for (const key of Object.keys(properties)) {\n normalizedProps[key] = this.normalizePropertyMetadata(properties[key], key);\n }\n return normalizedProps;\n }\n\n private static normalizePropertyMetadata(prop: any, keyName: string): IPropertyMetadata {\n const normalized: IPropertyMetadata = {\n type: prop.type || \"string\",\n ui: {\n label: prop.ui?.label || this.generateLabel(keyName),\n isKey: !!prop.ui?.isKey,\n readOnly: !!prop.ui?.readOnly,\n widget: prop.ui?.widget || (prop.valueHelp || prop.enum ? \"select\" : undefined),\n visibleOn: prop.ui?.visibleOn,\n enabledOn: prop.ui?.enabledOn,\n format: prop.ui?.format,\n validators: prop.ui?.validators,\n formatter: prop.ui?.formatter,\n args: prop.ui?.args,\n rows: prop.ui?.rows,\n fullWidth: prop.ui?.fullWidth\n },\n required: !!prop.required,\n maxLength: prop.maxLength,\n minimum: prop.minimum,\n maximum: prop.maximum,\n pattern: prop.pattern,\n precision: prop.precision,\n scale: prop.scale,\n valueHelp: prop.valueHelp,\n enum: prop.enum\n };\n\n if (normalized.type === \"object\" && prop.properties) {\n normalized.properties = this.normalizeProperties(prop.properties);\n normalized.uiLayout = prop.uiLayout;\n } else if (normalized.type === \"array\" && prop.items) {\n normalized.items = this.normalizePropertyMetadata(prop.items, \"items\");\n normalized.uiLayout = prop.uiLayout;\n }\n\n return normalized;\n }\n\n /**\n * Generates a Title Case label from camelCase or snake_case technical names.\n */\n private static generateLabel(name: string): string {\n if (!name) return \"\";\n let spaced = name.replace(/([A-Z])/g, \" $1\").replace(/_/g, \" \");\n return spaced.split(' ')\n .filter(w => w.length > 0)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(' ')\n .trim();\n }\n\n /**\n * Infers a v2 ISchema structure dynamically from a plain data payload.\n */\n private static inferSchemaFromData(data: any): ISchema {\n const schema: ISchema = { type: \"object\", properties: {}, layoutStrategy: \"compact\", title: \"\" };\n\n if (!data || typeof data !== \"object\") {\n return schema;\n }\n\n if (Array.isArray(data)) {\n schema.type = \"array\";\n schema.layoutStrategy = \"table\";\n schema.items = {\n type: \"object\",\n layoutStrategy: \"compact\",\n properties: data.length > 0 ? this.inferPropertiesFromObject(data[0]) : {}\n };\n } else {\n schema.type = \"object\";\n schema.properties = this.inferPropertiesFromObject(data);\n }\n\n return schema;\n }\n\n private static inferPropertiesFromObject(obj: any): Record<string, IPropertyMetadata> {\n const properties: Record<string, IPropertyMetadata> = {};\n if (!obj || typeof obj !== \"object\") return properties;\n\n for (const key of Object.keys(obj)) {\n const val = obj[key];\n if (val === null || val === undefined) continue;\n\n if (typeof val === \"object\" && !Array.isArray(val)) continue;\n\n let type: FieldType = \"string\";\n let items: IPropertyMetadata | undefined;\n\n if (typeof val === \"number\") type = \"number\";\n else if (typeof val === \"boolean\") type = \"boolean\";\n else if (Array.isArray(val)) {\n type = \"array\";\n items = {\n type: \"object\",\n properties: val.length > 0 ? this.inferPropertiesFromObject(val[0]) : {}\n };\n }\n\n properties[key] = {\n type,\n items,\n ui: {\n label: this.generateLabel(key),\n isKey: false,\n readOnly: false\n }\n };\n }\n\n return properties;\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"SchemaNormalizer-dbg.js","names":["Logger","___utils_Logger","SchemaNormalizer","normalize","rawSchema","data","schemaObj","JSON","parse","e","msg","message","error","showErrorPopup","Array","isArray","inferSchemaFromData","normalized","title","type","items","layoutStrategy","uiLayout","additionalProperties","targetProperties","properties","inferred","deepMergeProperties","normalizeProperties","normalizePropertyMetadata","base","override","merged","key","Object","keys","overrideVal","baseVal","normalizedProps","prop","keyName","ui","label","generateLabel","isKey","readOnly","widget","valueHelp","enum","undefined","visibleOn","enabledOn","format","validators","formatter","args","rows","fullWidth","required","maxLength","minimum","maximum","pattern","precision","scale","name","spaced","replace","split","filter","w","length","map","word","charAt","toUpperCase","slice","toLowerCase","join","trim","schema","inferPropertiesFromObject","obj","val","nestedProps","resolveScope","scope","startsWith","meta","bindingPath","propKey","pathSegments","current","debug","stringify","i","segment","__exports","__esModule"],"sources":["SchemaNormalizer.ts"],"sourcesContent":["/**\n * @file SchemaNormalizer.ts\n * @description Transforms and validates incoming JSON payloads into the strict v2 ISchema dictionary matrix.\n */\n\nimport { ISchema, IPropertyMetadata, FieldType } from \"../interfaces/ISchema\";\nimport { Logger } from \"../utils/Logger\";\n\nexport class SchemaNormalizer {\n\n /**\n * Validates that the provided raw payload conforms to the required ISchema structures.\n */\n public static normalize(rawSchema?: any, data?: any): ISchema {\n let schemaObj = rawSchema;\n\n if (typeof schemaObj === \"string\") {\n try {\n schemaObj = JSON.parse(schemaObj);\n } catch (e) {\n const msg = (e as Error).message;\n Logger.error(\"[MetaUI SchemaNormalizer] Failed to parse schema string.\", msg);\n Logger.showErrorPopup(`Failed to parse the provided JSON schema.\\n\\nDetails: ${msg}`);\n schemaObj = null;\n }\n }\n\n if (!schemaObj || typeof schemaObj !== 'object' || Array.isArray(schemaObj)) {\n return this.inferSchemaFromData(data);\n }\n\n try {\n // It is an object. Ensure it conforms to v2 structure.\n const normalized: ISchema = {\n title: schemaObj.title,\n type: schemaObj.type || (schemaObj.items ? \"array\" : \"object\"),\n layoutStrategy: schemaObj.layoutStrategy,\n uiLayout: schemaObj.uiLayout,\n additionalProperties: schemaObj.additionalProperties\n };\n\n let targetProperties = schemaObj.properties || {};\n\n if (schemaObj.additionalProperties === true && data) {\n const inferred = this.inferSchemaFromData(data);\n if (inferred.type === \"object\" && inferred.properties) {\n targetProperties = this.deepMergeProperties(inferred.properties, targetProperties);\n } else if (inferred.type === \"array\" && inferred.items && inferred.items.properties) {\n // Array schema merging could be added here if we want full support.\n }\n }\n\n if (normalized.type === \"object\") {\n normalized.properties = this.normalizeProperties(targetProperties);\n } else if (normalized.type === \"array\") {\n // Future expansion: array deep merge\n normalized.items = this.normalizePropertyMetadata(schemaObj.items || { type: \"object\", properties: {} }, \"items\");\n }\n\n return normalized;\n } catch (error) {\n const msg = (error as Error).message;\n Logger.error(\"[MetaUI SchemaNormalizer] Critical error normalizing schema object.\", msg);\n Logger.showErrorPopup(`Schema Normalization failed.\\n\\nDetails: ${msg}`);\n // Fallback to empty object to prevent hard crash downstream\n return { type: \"object\", properties: {} };\n }\n }\n\n private static deepMergeProperties(base: any, override: any): any {\n const merged = { ...base };\n for (const key of Object.keys(override)) {\n const overrideVal = override[key];\n const baseVal = merged[key];\n\n if (baseVal && typeof baseVal === \"object\" && !Array.isArray(baseVal) &&\n overrideVal && typeof overrideVal === \"object\" && !Array.isArray(overrideVal)) {\n merged[key] = this.deepMergeProperties(baseVal, overrideVal);\n } else {\n merged[key] = overrideVal;\n }\n }\n return merged;\n }\n\n private static normalizeProperties(properties: any): Record<string, IPropertyMetadata> {\n const normalizedProps: Record<string, IPropertyMetadata> = {};\n for (const key of Object.keys(properties)) {\n normalizedProps[key] = this.normalizePropertyMetadata(properties[key], key);\n }\n return normalizedProps;\n }\n\n private static normalizePropertyMetadata(prop: any, keyName: string): IPropertyMetadata {\n const normalized: IPropertyMetadata = {\n type: prop.type || \"string\",\n ui: {\n label: prop.ui?.label || this.generateLabel(keyName),\n isKey: !!prop.ui?.isKey,\n readOnly: !!prop.ui?.readOnly,\n widget: prop.ui?.widget || (prop.valueHelp || prop.enum ? \"select\" : undefined),\n visibleOn: prop.ui?.visibleOn,\n enabledOn: prop.ui?.enabledOn,\n format: prop.ui?.format,\n validators: prop.ui?.validators,\n formatter: prop.ui?.formatter,\n args: prop.ui?.args,\n rows: prop.ui?.rows,\n fullWidth: prop.ui?.fullWidth\n },\n required: !!prop.required,\n maxLength: prop.maxLength,\n minimum: prop.minimum,\n maximum: prop.maximum,\n pattern: prop.pattern,\n precision: prop.precision,\n scale: prop.scale,\n valueHelp: prop.valueHelp,\n enum: prop.enum\n };\n\n if (normalized.type === \"object\" && prop.properties) {\n normalized.properties = this.normalizeProperties(prop.properties);\n normalized.uiLayout = prop.uiLayout;\n } else if (normalized.type === \"array\" && prop.items) {\n normalized.items = this.normalizePropertyMetadata(prop.items, \"items\");\n normalized.uiLayout = prop.uiLayout;\n }\n\n return normalized;\n }\n\n /**\n * Generates a Title Case label from camelCase or snake_case technical names.\n */\n private static generateLabel(name: string): string {\n if (!name) return \"\";\n let spaced = name.replace(/([A-Z])/g, \" $1\").replace(/_/g, \" \");\n return spaced.split(' ')\n .filter(w => w.length > 0)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(' ')\n .trim();\n }\n\n /**\n * Infers a v2 ISchema structure dynamically from a plain data payload.\n */\n private static inferSchemaFromData(data: any): ISchema {\n const schema: ISchema = { type: \"object\", properties: {}, layoutStrategy: \"compact\", title: \"\" };\n\n if (!data || typeof data !== \"object\") {\n return schema;\n }\n\n if (Array.isArray(data)) {\n schema.type = \"array\";\n schema.layoutStrategy = \"table\";\n schema.items = {\n type: \"object\",\n layoutStrategy: \"compact\",\n properties: data.length > 0 ? this.inferPropertiesFromObject(data[0]) : {}\n };\n } else {\n schema.type = \"object\";\n schema.properties = this.inferPropertiesFromObject(data);\n }\n\n return schema;\n }\n\n private static inferPropertiesFromObject(obj: any): Record<string, IPropertyMetadata> {\n const properties: Record<string, IPropertyMetadata> = {};\n if (!obj || typeof obj !== \"object\") return properties;\n\n for (const key of Object.keys(obj)) {\n const val = obj[key];\n if (val === null || val === undefined) continue;\n\n let type: FieldType = \"string\";\n let items: IPropertyMetadata | undefined;\n let nestedProps: Record<string, IPropertyMetadata> | undefined;\n\n if (typeof val === \"number\") type = \"number\";\n else if (typeof val === \"boolean\") type = \"boolean\";\n else if (Array.isArray(val)) {\n type = \"array\";\n items = {\n type: \"object\",\n properties: val.length > 0 ? this.inferPropertiesFromObject(val[0]) : {}\n };\n } else if (typeof val === \"object\") {\n type = \"object\";\n nestedProps = this.inferPropertiesFromObject(val);\n }\n\n properties[key] = {\n type,\n items,\n properties: nestedProps,\n ui: {\n label: this.generateLabel(key),\n isKey: false,\n readOnly: false\n }\n };\n }\n\n return properties;\n }\n\n /**\n * Resolves a JSON Schema scope (e.g. '#/properties/header/properties/id')\n * against the ISchema, returning the PropertyMetadata and the UI5 binding path.\n */\n public static resolveScope(schema: ISchema, scope: string): { meta: IPropertyMetadata | undefined, bindingPath: string, propKey: string } {\n if (!scope || !scope.startsWith(\"#/properties/\")) {\n return { meta: undefined, bindingPath: scope || \"\", propKey: scope || \"\" };\n }\n \n const pathSegments = scope.replace(\"#/properties/\", \"\").split(\"/properties/\");\n let current: any = schema.properties;\n let meta: IPropertyMetadata | undefined;\n \n Logger.debug(\"[MetaUI SchemaNormalizer]\", `Resolving scope '${scope}' with segments: ${JSON.stringify(pathSegments)}`, \"SchemaNormalizer\");\n Logger.debug(\"[MetaUI SchemaNormalizer]\", `Root schema keys: ${Object.keys(schema.properties || {})}`, \"SchemaNormalizer\");\n\n for (let i = 0; i < pathSegments.length; i++) {\n const segment = pathSegments[i];\n if (!current) {\n Logger.debug(\"[MetaUI SchemaNormalizer]\", `current is undefined at segment '${segment}'`, \"SchemaNormalizer\");\n meta = undefined;\n break;\n }\n meta = current[segment];\n Logger.debug(\"[MetaUI SchemaNormalizer]\", `Segment '${segment}' resolved to meta: ${!!meta}. Available keys in current: ${Object.keys(current)}`, \"SchemaNormalizer\");\n if (i < pathSegments.length - 1) {\n current = meta?.properties;\n }\n }\n \n const bindingPath = pathSegments.join(\"/\");\n const propKey = scope.replace(\"#/properties/\", \"\"); // The original raw string for logging\n \n return {\n meta,\n bindingPath,\n propKey\n };\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -3,7 +3,7 @@ declare module "nz/co/siliconst/ui5/metaui/core/SchemaNormalizer" {
3
3
  * @file SchemaNormalizer.ts
4
4
  * @description Transforms and validates incoming JSON payloads into the strict v2 ISchema dictionary matrix.
5
5
  */
6
- import { ISchema } from "nz/co/siliconst/ui5/metaui/interfaces/ISchema";
6
+ import { ISchema, IPropertyMetadata } from "nz/co/siliconst/ui5/metaui/interfaces/ISchema";
7
7
  export class SchemaNormalizer {
8
8
  /**
9
9
  * Validates that the provided raw payload conforms to the required ISchema structures.
@@ -21,6 +21,15 @@ declare module "nz/co/siliconst/ui5/metaui/core/SchemaNormalizer" {
21
21
  */
22
22
  private static inferSchemaFromData;
23
23
  private static inferPropertiesFromObject;
24
+ /**
25
+ * Resolves a JSON Schema scope (e.g. '#/properties/header/properties/id')
26
+ * against the ISchema, returning the PropertyMetadata and the UI5 binding path.
27
+ */
28
+ static resolveScope(schema: ISchema, scope: string): {
29
+ meta: IPropertyMetadata | undefined;
30
+ bindingPath: string;
31
+ propKey: string;
32
+ };
24
33
  }
25
34
  }
26
35
  //# sourceMappingURL=SchemaNormalizer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SchemaNormalizer.d.ts","sourceRoot":"../../../../../../../..","sources":["src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,kDAAkD,CAAC;IAClE;;;OAGG;IAEH,OAAO,EAAE,OAAO,EAAgC,MAAM,+CAA+C,CAAC;IAGtG,MAAa,gBAAgB;QAEzB;;WAEG;eACW,SAAS,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,OAAO;QAwD7D,OAAO,CAAC,MAAM,CAAC,mBAAmB;QAgBlC,OAAO,CAAC,MAAM,CAAC,mBAAmB;QAQlC,OAAO,CAAC,MAAM,CAAC,yBAAyB;QAuCxC;;WAEG;QACH,OAAO,CAAC,MAAM,CAAC,aAAa;QAU5B;;WAEG;QACH,OAAO,CAAC,MAAM,CAAC,mBAAmB;QAuBlC,OAAO,CAAC,MAAM,CAAC,yBAAyB;KAoC3C;CAEA"}
1
+ {"version":3,"file":"SchemaNormalizer.d.ts","sourceRoot":"../../../../../../../..","sources":["src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,kDAAkD,CAAC;IAClE;;;OAGG;IAEH,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAa,MAAM,+CAA+C,CAAC;IAGtG,MAAa,gBAAgB;QAEzB;;WAEG;eACW,SAAS,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,OAAO;QAwD7D,OAAO,CAAC,MAAM,CAAC,mBAAmB;QAgBlC,OAAO,CAAC,MAAM,CAAC,mBAAmB;QAQlC,OAAO,CAAC,MAAM,CAAC,yBAAyB;QAuCxC;;WAEG;QACH,OAAO,CAAC,MAAM,CAAC,aAAa;QAU5B;;WAEG;QACH,OAAO,CAAC,MAAM,CAAC,mBAAmB;QAuBlC,OAAO,CAAC,MAAM,CAAC,yBAAyB;QAwCxC;;;WAGG;eACW,YAAY,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG;YAAE,IAAI,EAAE,iBAAiB,GAAG,SAAS,CAAC;YAAC,WAAW,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE;KAmC5I;CAEA"}
@@ -1,2 +1,2 @@
1
- sap.ui.define(["../utils/Logger"],function(e){"use strict";const t=e["Logger"];class r{static normalize(e,r){let i=e;if(typeof i==="string"){try{i=JSON.parse(i)}catch(e){const r=e.message;t.error("[MetaUI SchemaNormalizer] Failed to parse schema string.",r);t.showErrorPopup(`Failed to parse the provided JSON schema.\n\nDetails: ${r}`);i=null}}if(!i||typeof i!=="object"||Array.isArray(i)){return this.inferSchemaFromData(r)}try{const e={title:i.title,type:i.type||(i.items?"array":"object"),layoutStrategy:i.layoutStrategy,uiLayout:i.uiLayout,additionalProperties:i.additionalProperties};let t=i.properties||{};if(i.additionalProperties===true&&r){const e=this.inferSchemaFromData(r);if(e.type==="object"&&e.properties){t=this.deepMergeProperties(e.properties,t)}else if(e.type==="array"&&e.items&&e.items.properties){}}if(e.type==="object"){e.properties=this.normalizeProperties(t)}else if(e.type==="array"){e.items=this.normalizePropertyMetadata(i.items||{type:"object",properties:{}},"items")}return e}catch(e){const r=e.message;t.error("[MetaUI SchemaNormalizer] Critical error normalizing schema object.",r);t.showErrorPopup(`Schema Normalization failed.\n\nDetails: ${r}`);return{type:"object",properties:{}}}}static deepMergeProperties(e,t){const r={...e};for(const e of Object.keys(t)){const i=t[e];const a=r[e];if(a&&typeof a==="object"&&!Array.isArray(a)&&i&&typeof i==="object"&&!Array.isArray(i)){r[e]=this.deepMergeProperties(a,i)}else{r[e]=i}}return r}static normalizeProperties(e){const t={};for(const r of Object.keys(e)){t[r]=this.normalizePropertyMetadata(e[r],r)}return t}static normalizePropertyMetadata(e,t){const r={type:e.type||"string",ui:{label:e.ui?.label||this.generateLabel(t),isKey:!!e.ui?.isKey,readOnly:!!e.ui?.readOnly,widget:e.ui?.widget||(e.valueHelp||e.enum?"select":undefined),visibleOn:e.ui?.visibleOn,enabledOn:e.ui?.enabledOn,format:e.ui?.format,validators:e.ui?.validators,formatter:e.ui?.formatter,args:e.ui?.args,rows:e.ui?.rows,fullWidth:e.ui?.fullWidth},required:!!e.required,maxLength:e.maxLength,minimum:e.minimum,maximum:e.maximum,pattern:e.pattern,precision:e.precision,scale:e.scale,valueHelp:e.valueHelp,enum:e.enum};if(r.type==="object"&&e.properties){r.properties=this.normalizeProperties(e.properties);r.uiLayout=e.uiLayout}else if(r.type==="array"&&e.items){r.items=this.normalizePropertyMetadata(e.items,"items");r.uiLayout=e.uiLayout}return r}static generateLabel(e){if(!e)return"";let t=e.replace(/([A-Z])/g," $1").replace(/_/g," ");return t.split(" ").filter(e=>e.length>0).map(e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join(" ").trim()}static inferSchemaFromData(e){const t={type:"object",properties:{},layoutStrategy:"compact",title:""};if(!e||typeof e!=="object"){return t}if(Array.isArray(e)){t.type="array";t.layoutStrategy="table";t.items={type:"object",layoutStrategy:"compact",properties:e.length>0?this.inferPropertiesFromObject(e[0]):{}}}else{t.type="object";t.properties=this.inferPropertiesFromObject(e)}return t}static inferPropertiesFromObject(e){const t={};if(!e||typeof e!=="object")return t;for(const r of Object.keys(e)){const i=e[r];if(i===null||i===undefined)continue;if(typeof i==="object"&&!Array.isArray(i))continue;let a="string";let o;if(typeof i==="number")a="number";else if(typeof i==="boolean")a="boolean";else if(Array.isArray(i)){a="array";o={type:"object",properties:i.length>0?this.inferPropertiesFromObject(i[0]):{}}}t[r]={type:a,items:o,ui:{label:this.generateLabel(r),isKey:false,readOnly:false}}}return t}}var i={__esModule:true};i.SchemaNormalizer=r;return i});
1
+ sap.ui.define(["../utils/Logger"],function(e){"use strict";const t=e["Logger"];class r{static normalize(e,r){let i=e;if(typeof i==="string"){try{i=JSON.parse(i)}catch(e){const r=e.message;t.error("[MetaUI SchemaNormalizer] Failed to parse schema string.",r);t.showErrorPopup(`Failed to parse the provided JSON schema.\n\nDetails: ${r}`);i=null}}if(!i||typeof i!=="object"||Array.isArray(i)){return this.inferSchemaFromData(r)}try{const e={title:i.title,type:i.type||(i.items?"array":"object"),layoutStrategy:i.layoutStrategy,uiLayout:i.uiLayout,additionalProperties:i.additionalProperties};let t=i.properties||{};if(i.additionalProperties===true&&r){const e=this.inferSchemaFromData(r);if(e.type==="object"&&e.properties){t=this.deepMergeProperties(e.properties,t)}else if(e.type==="array"&&e.items&&e.items.properties){}}if(e.type==="object"){e.properties=this.normalizeProperties(t)}else if(e.type==="array"){e.items=this.normalizePropertyMetadata(i.items||{type:"object",properties:{}},"items")}return e}catch(e){const r=e.message;t.error("[MetaUI SchemaNormalizer] Critical error normalizing schema object.",r);t.showErrorPopup(`Schema Normalization failed.\n\nDetails: ${r}`);return{type:"object",properties:{}}}}static deepMergeProperties(e,t){const r={...e};for(const e of Object.keys(t)){const i=t[e];const a=r[e];if(a&&typeof a==="object"&&!Array.isArray(a)&&i&&typeof i==="object"&&!Array.isArray(i)){r[e]=this.deepMergeProperties(a,i)}else{r[e]=i}}return r}static normalizeProperties(e){const t={};for(const r of Object.keys(e)){t[r]=this.normalizePropertyMetadata(e[r],r)}return t}static normalizePropertyMetadata(e,t){const r={type:e.type||"string",ui:{label:e.ui?.label||this.generateLabel(t),isKey:!!e.ui?.isKey,readOnly:!!e.ui?.readOnly,widget:e.ui?.widget||(e.valueHelp||e.enum?"select":undefined),visibleOn:e.ui?.visibleOn,enabledOn:e.ui?.enabledOn,format:e.ui?.format,validators:e.ui?.validators,formatter:e.ui?.formatter,args:e.ui?.args,rows:e.ui?.rows,fullWidth:e.ui?.fullWidth},required:!!e.required,maxLength:e.maxLength,minimum:e.minimum,maximum:e.maximum,pattern:e.pattern,precision:e.precision,scale:e.scale,valueHelp:e.valueHelp,enum:e.enum};if(r.type==="object"&&e.properties){r.properties=this.normalizeProperties(e.properties);r.uiLayout=e.uiLayout}else if(r.type==="array"&&e.items){r.items=this.normalizePropertyMetadata(e.items,"items");r.uiLayout=e.uiLayout}return r}static generateLabel(e){if(!e)return"";let t=e.replace(/([A-Z])/g," $1").replace(/_/g," ");return t.split(" ").filter(e=>e.length>0).map(e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join(" ").trim()}static inferSchemaFromData(e){const t={type:"object",properties:{},layoutStrategy:"compact",title:""};if(!e||typeof e!=="object"){return t}if(Array.isArray(e)){t.type="array";t.layoutStrategy="table";t.items={type:"object",layoutStrategy:"compact",properties:e.length>0?this.inferPropertiesFromObject(e[0]):{}}}else{t.type="object";t.properties=this.inferPropertiesFromObject(e)}return t}static inferPropertiesFromObject(e){const t={};if(!e||typeof e!=="object")return t;for(const r of Object.keys(e)){const i=e[r];if(i===null||i===undefined)continue;let a="string";let o;let s;if(typeof i==="number")a="number";else if(typeof i==="boolean")a="boolean";else if(Array.isArray(i)){a="array";o={type:"object",properties:i.length>0?this.inferPropertiesFromObject(i[0]):{}}}else if(typeof i==="object"){a="object";s=this.inferPropertiesFromObject(i)}t[r]={type:a,items:o,properties:s,ui:{label:this.generateLabel(r),isKey:false,readOnly:false}}}return t}static resolveScope(e,r){if(!r||!r.startsWith("#/properties/")){return{meta:undefined,bindingPath:r||"",propKey:r||""}}const i=r.replace("#/properties/","").split("/properties/");let a=e.properties;let o;t.debug("[MetaUI SchemaNormalizer]",`Resolving scope '${r}' with segments: ${JSON.stringify(i)}`,"SchemaNormalizer");t.debug("[MetaUI SchemaNormalizer]",`Root schema keys: ${Object.keys(e.properties||{})}`,"SchemaNormalizer");for(let e=0;e<i.length;e++){const r=i[e];if(!a){t.debug("[MetaUI SchemaNormalizer]",`current is undefined at segment '${r}'`,"SchemaNormalizer");o=undefined;break}o=a[r];t.debug("[MetaUI SchemaNormalizer]",`Segment '${r}' resolved to meta: ${!!o}. Available keys in current: ${Object.keys(a)}`,"SchemaNormalizer");if(e<i.length-1){a=o?.properties}}const s=i.join("/");const n=r.replace("#/properties/","");return{meta:o,bindingPath:s,propKey:n}}}var i={__esModule:true};i.SchemaNormalizer=r;return i});
2
2
  //# sourceMappingURL=SchemaNormalizer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SchemaNormalizer.js","names":["Logger","___utils_Logger","SchemaNormalizer","normalize","rawSchema","data","schemaObj","JSON","parse","e","msg","message","error","showErrorPopup","Array","isArray","this","inferSchemaFromData","normalized","title","type","items","layoutStrategy","uiLayout","additionalProperties","targetProperties","properties","inferred","deepMergeProperties","normalizeProperties","normalizePropertyMetadata","base","override","merged","key","Object","keys","overrideVal","baseVal","normalizedProps","prop","keyName","ui","label","generateLabel","isKey","readOnly","widget","valueHelp","enum","undefined","visibleOn","enabledOn","format","validators","formatter","args","rows","fullWidth","required","maxLength","minimum","maximum","pattern","precision","scale","name","spaced","replace","split","filter","w","length","map","word","charAt","toUpperCase","slice","toLowerCase","join","trim","schema","inferPropertiesFromObject","obj","val","__exports","__esModule"],"sources":["SchemaNormalizer.ts"],"sourcesContent":["/**\n * @file SchemaNormalizer.ts\n * @description Transforms and validates incoming JSON payloads into the strict v2 ISchema dictionary matrix.\n */\n\nimport { ISchema, IPropertyMetadata, FieldType } from \"../interfaces/ISchema\";\nimport { Logger } from \"../utils/Logger\";\n\nexport class SchemaNormalizer {\n\n /**\n * Validates that the provided raw payload conforms to the required ISchema structures.\n */\n public static normalize(rawSchema?: any, data?: any): ISchema {\n let schemaObj = rawSchema;\n\n if (typeof schemaObj === \"string\") {\n try {\n schemaObj = JSON.parse(schemaObj);\n } catch (e) {\n const msg = (e as Error).message;\n Logger.error(\"[MetaUI SchemaNormalizer] Failed to parse schema string.\", msg);\n Logger.showErrorPopup(`Failed to parse the provided JSON schema.\\n\\nDetails: ${msg}`);\n schemaObj = null;\n }\n }\n\n if (!schemaObj || typeof schemaObj !== 'object' || Array.isArray(schemaObj)) {\n return this.inferSchemaFromData(data);\n }\n\n try {\n // It is an object. Ensure it conforms to v2 structure.\n const normalized: ISchema = {\n title: schemaObj.title,\n type: schemaObj.type || (schemaObj.items ? \"array\" : \"object\"),\n layoutStrategy: schemaObj.layoutStrategy,\n uiLayout: schemaObj.uiLayout,\n additionalProperties: schemaObj.additionalProperties\n };\n\n let targetProperties = schemaObj.properties || {};\n\n if (schemaObj.additionalProperties === true && data) {\n const inferred = this.inferSchemaFromData(data);\n if (inferred.type === \"object\" && inferred.properties) {\n targetProperties = this.deepMergeProperties(inferred.properties, targetProperties);\n } else if (inferred.type === \"array\" && inferred.items && inferred.items.properties) {\n // Array schema merging could be added here if we want full support.\n }\n }\n\n if (normalized.type === \"object\") {\n normalized.properties = this.normalizeProperties(targetProperties);\n } else if (normalized.type === \"array\") {\n // Future expansion: array deep merge\n normalized.items = this.normalizePropertyMetadata(schemaObj.items || { type: \"object\", properties: {} }, \"items\");\n }\n\n return normalized;\n } catch (error) {\n const msg = (error as Error).message;\n Logger.error(\"[MetaUI SchemaNormalizer] Critical error normalizing schema object.\", msg);\n Logger.showErrorPopup(`Schema Normalization failed.\\n\\nDetails: ${msg}`);\n // Fallback to empty object to prevent hard crash downstream\n return { type: \"object\", properties: {} };\n }\n }\n\n private static deepMergeProperties(base: any, override: any): any {\n const merged = { ...base };\n for (const key of Object.keys(override)) {\n const overrideVal = override[key];\n const baseVal = merged[key];\n\n if (baseVal && typeof baseVal === \"object\" && !Array.isArray(baseVal) &&\n overrideVal && typeof overrideVal === \"object\" && !Array.isArray(overrideVal)) {\n merged[key] = this.deepMergeProperties(baseVal, overrideVal);\n } else {\n merged[key] = overrideVal;\n }\n }\n return merged;\n }\n\n private static normalizeProperties(properties: any): Record<string, IPropertyMetadata> {\n const normalizedProps: Record<string, IPropertyMetadata> = {};\n for (const key of Object.keys(properties)) {\n normalizedProps[key] = this.normalizePropertyMetadata(properties[key], key);\n }\n return normalizedProps;\n }\n\n private static normalizePropertyMetadata(prop: any, keyName: string): IPropertyMetadata {\n const normalized: IPropertyMetadata = {\n type: prop.type || \"string\",\n ui: {\n label: prop.ui?.label || this.generateLabel(keyName),\n isKey: !!prop.ui?.isKey,\n readOnly: !!prop.ui?.readOnly,\n widget: prop.ui?.widget || (prop.valueHelp || prop.enum ? \"select\" : undefined),\n visibleOn: prop.ui?.visibleOn,\n enabledOn: prop.ui?.enabledOn,\n format: prop.ui?.format,\n validators: prop.ui?.validators,\n formatter: prop.ui?.formatter,\n args: prop.ui?.args,\n rows: prop.ui?.rows,\n fullWidth: prop.ui?.fullWidth\n },\n required: !!prop.required,\n maxLength: prop.maxLength,\n minimum: prop.minimum,\n maximum: prop.maximum,\n pattern: prop.pattern,\n precision: prop.precision,\n scale: prop.scale,\n valueHelp: prop.valueHelp,\n enum: prop.enum\n };\n\n if (normalized.type === \"object\" && prop.properties) {\n normalized.properties = this.normalizeProperties(prop.properties);\n normalized.uiLayout = prop.uiLayout;\n } else if (normalized.type === \"array\" && prop.items) {\n normalized.items = this.normalizePropertyMetadata(prop.items, \"items\");\n normalized.uiLayout = prop.uiLayout;\n }\n\n return normalized;\n }\n\n /**\n * Generates a Title Case label from camelCase or snake_case technical names.\n */\n private static generateLabel(name: string): string {\n if (!name) return \"\";\n let spaced = name.replace(/([A-Z])/g, \" $1\").replace(/_/g, \" \");\n return spaced.split(' ')\n .filter(w => w.length > 0)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(' ')\n .trim();\n }\n\n /**\n * Infers a v2 ISchema structure dynamically from a plain data payload.\n */\n private static inferSchemaFromData(data: any): ISchema {\n const schema: ISchema = { type: \"object\", properties: {}, layoutStrategy: \"compact\", title: \"\" };\n\n if (!data || typeof data !== \"object\") {\n return schema;\n }\n\n if (Array.isArray(data)) {\n schema.type = \"array\";\n schema.layoutStrategy = \"table\";\n schema.items = {\n type: \"object\",\n layoutStrategy: \"compact\",\n properties: data.length > 0 ? this.inferPropertiesFromObject(data[0]) : {}\n };\n } else {\n schema.type = \"object\";\n schema.properties = this.inferPropertiesFromObject(data);\n }\n\n return schema;\n }\n\n private static inferPropertiesFromObject(obj: any): Record<string, IPropertyMetadata> {\n const properties: Record<string, IPropertyMetadata> = {};\n if (!obj || typeof obj !== \"object\") return properties;\n\n for (const key of Object.keys(obj)) {\n const val = obj[key];\n if (val === null || val === undefined) continue;\n\n if (typeof val === \"object\" && !Array.isArray(val)) continue;\n\n let type: FieldType = \"string\";\n let items: IPropertyMetadata | undefined;\n\n if (typeof val === \"number\") type = \"number\";\n else if (typeof val === \"boolean\") type = \"boolean\";\n else if (Array.isArray(val)) {\n type = \"array\";\n items = {\n type: \"object\",\n properties: val.length > 0 ? this.inferPropertiesFromObject(val[0]) : {}\n };\n }\n\n properties[key] = {\n type,\n items,\n ui: {\n label: this.generateLabel(key),\n isKey: false,\n readOnly: false\n }\n };\n }\n\n return properties;\n }\n}\n"],"mappings":"2DAAA,MAMSA,EAAMC,EAAA,UAER,MAAMC,EAKT,gBAAcC,CAAUC,EAAiBC,GACrC,IAAIC,EAAYF,EAEhB,UAAWE,IAAc,SAAU,CAC/B,IACIA,EAAYC,KAAKC,MAAMF,EAC3B,CAAE,MAAOG,GACL,MAAMC,EAAOD,EAAYE,QACzBX,EAAOY,MAAM,2DAA4DF,GACzEV,EAAOa,eAAe,yDAAyDH,KAC/EJ,EAAY,IAChB,CACJ,CAEA,IAAKA,UAAoBA,IAAc,UAAYQ,MAAMC,QAAQT,GAAY,CACzE,OAAOU,KAAKC,oBAAoBZ,EACpC,CAEA,IAEI,MAAMa,EAAsB,CACxBC,MAAOb,EAAUa,MACjBC,KAAMd,EAAUc,OAASd,EAAUe,MAAQ,QAAU,UACrDC,eAAgBhB,EAAUgB,eAC1BC,SAAUjB,EAAUiB,SACpBC,qBAAsBlB,EAAUkB,sBAGpC,IAAIC,EAAmBnB,EAAUoB,YAAc,CAAC,EAEhD,GAAIpB,EAAUkB,uBAAyB,MAAQnB,EAAM,CACjD,MAAMsB,EAAWX,KAAKC,oBAAoBZ,GAC1C,GAAIsB,EAASP,OAAS,UAAYO,EAASD,WAAY,CACnDD,EAAmBT,KAAKY,oBAAoBD,EAASD,WAAYD,EACrE,MAAO,GAAIE,EAASP,OAAS,SAAWO,EAASN,OAASM,EAASN,MAAMK,WAAY,CACjF,CAER,CAEA,GAAIR,EAAWE,OAAS,SAAU,CAC9BF,EAAWQ,WAAaV,KAAKa,oBAAoBJ,EACrD,MAAO,GAAIP,EAAWE,OAAS,QAAS,CAEpCF,EAAWG,MAAQL,KAAKc,0BAA0BxB,EAAUe,OAAS,CAAED,KAAM,SAAUM,WAAY,CAAC,GAAK,QAC7G,CAEA,OAAOR,CACX,CAAE,MAAON,GACL,MAAMF,EAAOE,EAAgBD,QAC7BX,EAAOY,MAAM,sEAAuEF,GACpFV,EAAOa,eAAe,4CAA4CH,KAElE,MAAO,CAAEU,KAAM,SAAUM,WAAY,CAAC,EAC1C,CACJ,CAEA,0BAAeE,CAAoBG,EAAWC,GAC1C,MAAMC,EAAS,IAAKF,GACpB,IAAK,MAAMG,KAAOC,OAAOC,KAAKJ,GAAW,CACrC,MAAMK,EAAcL,EAASE,GAC7B,MAAMI,EAAUL,EAAOC,GAEvB,GAAII,UAAkBA,IAAY,WAAaxB,MAAMC,QAAQuB,IACzDD,UAAsBA,IAAgB,WAAavB,MAAMC,QAAQsB,GAAc,CAC/EJ,EAAOC,GAAOlB,KAAKY,oBAAoBU,EAASD,EACpD,KAAO,CACHJ,EAAOC,GAAOG,CAClB,CACJ,CACA,OAAOJ,CACX,CAEA,0BAAeJ,CAAoBH,GAC/B,MAAMa,EAAqD,CAAC,EAC5D,IAAK,MAAML,KAAOC,OAAOC,KAAKV,GAAa,CACvCa,EAAgBL,GAAOlB,KAAKc,0BAA0BJ,EAAWQ,GAAMA,EAC3E,CACA,OAAOK,CACX,CAEA,gCAAeT,CAA0BU,EAAWC,GAChD,MAAMvB,EAAgC,CAClCE,KAAMoB,EAAKpB,MAAQ,SACnBsB,GAAI,CACAC,MAAOH,EAAKE,IAAIC,OAAS3B,KAAK4B,cAAcH,GAC5CI,QAASL,EAAKE,IAAIG,MAClBC,WAAYN,EAAKE,IAAII,SACrBC,OAAQP,EAAKE,IAAIK,SAAWP,EAAKQ,WAAaR,EAAKS,KAAO,SAAWC,WACrEC,UAAWX,EAAKE,IAAIS,UACpBC,UAAWZ,EAAKE,IAAIU,UACpBC,OAAQb,EAAKE,IAAIW,OACjBC,WAAYd,EAAKE,IAAIY,WACrBC,UAAWf,EAAKE,IAAIa,UACpBC,KAAMhB,EAAKE,IAAIc,KACfC,KAAMjB,EAAKE,IAAIe,KACfC,UAAWlB,EAAKE,IAAIgB,WAExBC,WAAYnB,EAAKmB,SACjBC,UAAWpB,EAAKoB,UAChBC,QAASrB,EAAKqB,QACdC,QAAStB,EAAKsB,QACdC,QAASvB,EAAKuB,QACdC,UAAWxB,EAAKwB,UAChBC,MAAOzB,EAAKyB,MACZjB,UAAWR,EAAKQ,UAChBC,KAAMT,EAAKS,MAGf,GAAI/B,EAAWE,OAAS,UAAYoB,EAAKd,WAAY,CACjDR,EAAWQ,WAAaV,KAAKa,oBAAoBW,EAAKd,YACtDR,EAAWK,SAAWiB,EAAKjB,QAC/B,MAAO,GAAIL,EAAWE,OAAS,SAAWoB,EAAKnB,MAAO,CAClDH,EAAWG,MAAQL,KAAKc,0BAA0BU,EAAKnB,MAAO,SAC9DH,EAAWK,SAAWiB,EAAKjB,QAC/B,CAEA,OAAOL,CACX,CAKA,oBAAe0B,CAAcsB,GACzB,IAAKA,EAAM,MAAO,GAClB,IAAIC,EAASD,EAAKE,QAAQ,WAAY,OAAOA,QAAQ,KAAM,KAC3D,OAAOD,EAAOE,MAAM,KACfC,OAAOC,GAAKA,EAAEC,OAAS,GACvBC,IAAIC,GAAQA,EAAKC,OAAO,GAAGC,cAAgBF,EAAKG,MAAM,GAAGC,eACzDC,KAAK,KACLC,MACT,CAKA,0BAAe/D,CAAoBZ,GAC/B,MAAM4E,EAAkB,CAAE7D,KAAM,SAAUM,WAAY,CAAC,EAAGJ,eAAgB,UAAWH,MAAO,IAE5F,IAAKd,UAAeA,IAAS,SAAU,CACnC,OAAO4E,CACX,CAEA,GAAInE,MAAMC,QAAQV,GAAO,CACrB4E,EAAO7D,KAAO,QACd6D,EAAO3D,eAAiB,QACxB2D,EAAO5D,MAAQ,CACXD,KAAM,SACNE,eAAgB,UAChBI,WAAYrB,EAAKmE,OAAS,EAAIxD,KAAKkE,0BAA0B7E,EAAK,IAAM,CAAC,EAEjF,KAAO,CACH4E,EAAO7D,KAAO,SACd6D,EAAOvD,WAAaV,KAAKkE,0BAA0B7E,EACvD,CAEA,OAAO4E,CACX,CAEA,gCAAeC,CAA0BC,GACrC,MAAMzD,EAAgD,CAAC,EACvD,IAAKyD,UAAcA,IAAQ,SAAU,OAAOzD,EAE5C,IAAK,MAAMQ,KAAOC,OAAOC,KAAK+C,GAAM,CAChC,MAAMC,EAAMD,EAAIjD,GAChB,GAAIkD,IAAQ,MAAQA,IAAQlC,UAAW,SAEvC,UAAWkC,IAAQ,WAAatE,MAAMC,QAAQqE,GAAM,SAEpD,IAAIhE,EAAkB,SACtB,IAAIC,EAEJ,UAAW+D,IAAQ,SAAUhE,EAAO,cAC/B,UAAWgE,IAAQ,UAAWhE,EAAO,eACrC,GAAIN,MAAMC,QAAQqE,GAAM,CACzBhE,EAAO,QACPC,EAAQ,CACJD,KAAM,SACNM,WAAY0D,EAAIZ,OAAS,EAAIxD,KAAKkE,0BAA0BE,EAAI,IAAM,CAAC,EAE/E,CAEA1D,EAAWQ,GAAO,CACdd,OACAC,QACAqB,GAAI,CACAC,MAAO3B,KAAK4B,cAAcV,GAC1BW,MAAO,MACPC,SAAU,OAGtB,CAEA,OAAOpB,CACX,EACH,IAAA2D,EAAA,CAAAC,WAAA,MAAAD,EAAAnF,mBAAA,OAAAmF,CAAA","ignoreList":[]}
1
+ {"version":3,"file":"SchemaNormalizer.js","names":["Logger","___utils_Logger","SchemaNormalizer","normalize","rawSchema","data","schemaObj","JSON","parse","e","msg","message","error","showErrorPopup","Array","isArray","this","inferSchemaFromData","normalized","title","type","items","layoutStrategy","uiLayout","additionalProperties","targetProperties","properties","inferred","deepMergeProperties","normalizeProperties","normalizePropertyMetadata","base","override","merged","key","Object","keys","overrideVal","baseVal","normalizedProps","prop","keyName","ui","label","generateLabel","isKey","readOnly","widget","valueHelp","enum","undefined","visibleOn","enabledOn","format","validators","formatter","args","rows","fullWidth","required","maxLength","minimum","maximum","pattern","precision","scale","name","spaced","replace","split","filter","w","length","map","word","charAt","toUpperCase","slice","toLowerCase","join","trim","schema","inferPropertiesFromObject","obj","val","nestedProps","resolveScope","scope","startsWith","meta","bindingPath","propKey","pathSegments","current","debug","stringify","i","segment","__exports","__esModule"],"sources":["SchemaNormalizer.ts"],"sourcesContent":["/**\n * @file SchemaNormalizer.ts\n * @description Transforms and validates incoming JSON payloads into the strict v2 ISchema dictionary matrix.\n */\n\nimport { ISchema, IPropertyMetadata, FieldType } from \"../interfaces/ISchema\";\nimport { Logger } from \"../utils/Logger\";\n\nexport class SchemaNormalizer {\n\n /**\n * Validates that the provided raw payload conforms to the required ISchema structures.\n */\n public static normalize(rawSchema?: any, data?: any): ISchema {\n let schemaObj = rawSchema;\n\n if (typeof schemaObj === \"string\") {\n try {\n schemaObj = JSON.parse(schemaObj);\n } catch (e) {\n const msg = (e as Error).message;\n Logger.error(\"[MetaUI SchemaNormalizer] Failed to parse schema string.\", msg);\n Logger.showErrorPopup(`Failed to parse the provided JSON schema.\\n\\nDetails: ${msg}`);\n schemaObj = null;\n }\n }\n\n if (!schemaObj || typeof schemaObj !== 'object' || Array.isArray(schemaObj)) {\n return this.inferSchemaFromData(data);\n }\n\n try {\n // It is an object. Ensure it conforms to v2 structure.\n const normalized: ISchema = {\n title: schemaObj.title,\n type: schemaObj.type || (schemaObj.items ? \"array\" : \"object\"),\n layoutStrategy: schemaObj.layoutStrategy,\n uiLayout: schemaObj.uiLayout,\n additionalProperties: schemaObj.additionalProperties\n };\n\n let targetProperties = schemaObj.properties || {};\n\n if (schemaObj.additionalProperties === true && data) {\n const inferred = this.inferSchemaFromData(data);\n if (inferred.type === \"object\" && inferred.properties) {\n targetProperties = this.deepMergeProperties(inferred.properties, targetProperties);\n } else if (inferred.type === \"array\" && inferred.items && inferred.items.properties) {\n // Array schema merging could be added here if we want full support.\n }\n }\n\n if (normalized.type === \"object\") {\n normalized.properties = this.normalizeProperties(targetProperties);\n } else if (normalized.type === \"array\") {\n // Future expansion: array deep merge\n normalized.items = this.normalizePropertyMetadata(schemaObj.items || { type: \"object\", properties: {} }, \"items\");\n }\n\n return normalized;\n } catch (error) {\n const msg = (error as Error).message;\n Logger.error(\"[MetaUI SchemaNormalizer] Critical error normalizing schema object.\", msg);\n Logger.showErrorPopup(`Schema Normalization failed.\\n\\nDetails: ${msg}`);\n // Fallback to empty object to prevent hard crash downstream\n return { type: \"object\", properties: {} };\n }\n }\n\n private static deepMergeProperties(base: any, override: any): any {\n const merged = { ...base };\n for (const key of Object.keys(override)) {\n const overrideVal = override[key];\n const baseVal = merged[key];\n\n if (baseVal && typeof baseVal === \"object\" && !Array.isArray(baseVal) &&\n overrideVal && typeof overrideVal === \"object\" && !Array.isArray(overrideVal)) {\n merged[key] = this.deepMergeProperties(baseVal, overrideVal);\n } else {\n merged[key] = overrideVal;\n }\n }\n return merged;\n }\n\n private static normalizeProperties(properties: any): Record<string, IPropertyMetadata> {\n const normalizedProps: Record<string, IPropertyMetadata> = {};\n for (const key of Object.keys(properties)) {\n normalizedProps[key] = this.normalizePropertyMetadata(properties[key], key);\n }\n return normalizedProps;\n }\n\n private static normalizePropertyMetadata(prop: any, keyName: string): IPropertyMetadata {\n const normalized: IPropertyMetadata = {\n type: prop.type || \"string\",\n ui: {\n label: prop.ui?.label || this.generateLabel(keyName),\n isKey: !!prop.ui?.isKey,\n readOnly: !!prop.ui?.readOnly,\n widget: prop.ui?.widget || (prop.valueHelp || prop.enum ? \"select\" : undefined),\n visibleOn: prop.ui?.visibleOn,\n enabledOn: prop.ui?.enabledOn,\n format: prop.ui?.format,\n validators: prop.ui?.validators,\n formatter: prop.ui?.formatter,\n args: prop.ui?.args,\n rows: prop.ui?.rows,\n fullWidth: prop.ui?.fullWidth\n },\n required: !!prop.required,\n maxLength: prop.maxLength,\n minimum: prop.minimum,\n maximum: prop.maximum,\n pattern: prop.pattern,\n precision: prop.precision,\n scale: prop.scale,\n valueHelp: prop.valueHelp,\n enum: prop.enum\n };\n\n if (normalized.type === \"object\" && prop.properties) {\n normalized.properties = this.normalizeProperties(prop.properties);\n normalized.uiLayout = prop.uiLayout;\n } else if (normalized.type === \"array\" && prop.items) {\n normalized.items = this.normalizePropertyMetadata(prop.items, \"items\");\n normalized.uiLayout = prop.uiLayout;\n }\n\n return normalized;\n }\n\n /**\n * Generates a Title Case label from camelCase or snake_case technical names.\n */\n private static generateLabel(name: string): string {\n if (!name) return \"\";\n let spaced = name.replace(/([A-Z])/g, \" $1\").replace(/_/g, \" \");\n return spaced.split(' ')\n .filter(w => w.length > 0)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(' ')\n .trim();\n }\n\n /**\n * Infers a v2 ISchema structure dynamically from a plain data payload.\n */\n private static inferSchemaFromData(data: any): ISchema {\n const schema: ISchema = { type: \"object\", properties: {}, layoutStrategy: \"compact\", title: \"\" };\n\n if (!data || typeof data !== \"object\") {\n return schema;\n }\n\n if (Array.isArray(data)) {\n schema.type = \"array\";\n schema.layoutStrategy = \"table\";\n schema.items = {\n type: \"object\",\n layoutStrategy: \"compact\",\n properties: data.length > 0 ? this.inferPropertiesFromObject(data[0]) : {}\n };\n } else {\n schema.type = \"object\";\n schema.properties = this.inferPropertiesFromObject(data);\n }\n\n return schema;\n }\n\n private static inferPropertiesFromObject(obj: any): Record<string, IPropertyMetadata> {\n const properties: Record<string, IPropertyMetadata> = {};\n if (!obj || typeof obj !== \"object\") return properties;\n\n for (const key of Object.keys(obj)) {\n const val = obj[key];\n if (val === null || val === undefined) continue;\n\n let type: FieldType = \"string\";\n let items: IPropertyMetadata | undefined;\n let nestedProps: Record<string, IPropertyMetadata> | undefined;\n\n if (typeof val === \"number\") type = \"number\";\n else if (typeof val === \"boolean\") type = \"boolean\";\n else if (Array.isArray(val)) {\n type = \"array\";\n items = {\n type: \"object\",\n properties: val.length > 0 ? this.inferPropertiesFromObject(val[0]) : {}\n };\n } else if (typeof val === \"object\") {\n type = \"object\";\n nestedProps = this.inferPropertiesFromObject(val);\n }\n\n properties[key] = {\n type,\n items,\n properties: nestedProps,\n ui: {\n label: this.generateLabel(key),\n isKey: false,\n readOnly: false\n }\n };\n }\n\n return properties;\n }\n\n /**\n * Resolves a JSON Schema scope (e.g. '#/properties/header/properties/id')\n * against the ISchema, returning the PropertyMetadata and the UI5 binding path.\n */\n public static resolveScope(schema: ISchema, scope: string): { meta: IPropertyMetadata | undefined, bindingPath: string, propKey: string } {\n if (!scope || !scope.startsWith(\"#/properties/\")) {\n return { meta: undefined, bindingPath: scope || \"\", propKey: scope || \"\" };\n }\n \n const pathSegments = scope.replace(\"#/properties/\", \"\").split(\"/properties/\");\n let current: any = schema.properties;\n let meta: IPropertyMetadata | undefined;\n \n Logger.debug(\"[MetaUI SchemaNormalizer]\", `Resolving scope '${scope}' with segments: ${JSON.stringify(pathSegments)}`, \"SchemaNormalizer\");\n Logger.debug(\"[MetaUI SchemaNormalizer]\", `Root schema keys: ${Object.keys(schema.properties || {})}`, \"SchemaNormalizer\");\n\n for (let i = 0; i < pathSegments.length; i++) {\n const segment = pathSegments[i];\n if (!current) {\n Logger.debug(\"[MetaUI SchemaNormalizer]\", `current is undefined at segment '${segment}'`, \"SchemaNormalizer\");\n meta = undefined;\n break;\n }\n meta = current[segment];\n Logger.debug(\"[MetaUI SchemaNormalizer]\", `Segment '${segment}' resolved to meta: ${!!meta}. Available keys in current: ${Object.keys(current)}`, \"SchemaNormalizer\");\n if (i < pathSegments.length - 1) {\n current = meta?.properties;\n }\n }\n \n const bindingPath = pathSegments.join(\"/\");\n const propKey = scope.replace(\"#/properties/\", \"\"); // The original raw string for logging\n \n return {\n meta,\n bindingPath,\n propKey\n };\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -177,10 +177,9 @@ export class SchemaNormalizer {
177
177
  const val = obj[key];
178
178
  if (val === null || val === undefined) continue;
179
179
 
180
- if (typeof val === "object" && !Array.isArray(val)) continue;
181
-
182
180
  let type: FieldType = "string";
183
181
  let items: IPropertyMetadata | undefined;
182
+ let nestedProps: Record<string, IPropertyMetadata> | undefined;
184
183
 
185
184
  if (typeof val === "number") type = "number";
186
185
  else if (typeof val === "boolean") type = "boolean";
@@ -190,11 +189,15 @@ export class SchemaNormalizer {
190
189
  type: "object",
191
190
  properties: val.length > 0 ? this.inferPropertiesFromObject(val[0]) : {}
192
191
  };
192
+ } else if (typeof val === "object") {
193
+ type = "object";
194
+ nestedProps = this.inferPropertiesFromObject(val);
193
195
  }
194
196
 
195
197
  properties[key] = {
196
198
  type,
197
199
  items,
200
+ properties: nestedProps,
198
201
  ui: {
199
202
  label: this.generateLabel(key),
200
203
  isKey: false,
@@ -205,4 +208,44 @@ export class SchemaNormalizer {
205
208
 
206
209
  return properties;
207
210
  }
211
+
212
+ /**
213
+ * Resolves a JSON Schema scope (e.g. '#/properties/header/properties/id')
214
+ * against the ISchema, returning the PropertyMetadata and the UI5 binding path.
215
+ */
216
+ public static resolveScope(schema: ISchema, scope: string): { meta: IPropertyMetadata | undefined, bindingPath: string, propKey: string } {
217
+ if (!scope || !scope.startsWith("#/properties/")) {
218
+ return { meta: undefined, bindingPath: scope || "", propKey: scope || "" };
219
+ }
220
+
221
+ const pathSegments = scope.replace("#/properties/", "").split("/properties/");
222
+ let current: any = schema.properties;
223
+ let meta: IPropertyMetadata | undefined;
224
+
225
+ Logger.debug("[MetaUI SchemaNormalizer]", `Resolving scope '${scope}' with segments: ${JSON.stringify(pathSegments)}`, "SchemaNormalizer");
226
+ Logger.debug("[MetaUI SchemaNormalizer]", `Root schema keys: ${Object.keys(schema.properties || {})}`, "SchemaNormalizer");
227
+
228
+ for (let i = 0; i < pathSegments.length; i++) {
229
+ const segment = pathSegments[i];
230
+ if (!current) {
231
+ Logger.debug("[MetaUI SchemaNormalizer]", `current is undefined at segment '${segment}'`, "SchemaNormalizer");
232
+ meta = undefined;
233
+ break;
234
+ }
235
+ meta = current[segment];
236
+ Logger.debug("[MetaUI SchemaNormalizer]", `Segment '${segment}' resolved to meta: ${!!meta}. Available keys in current: ${Object.keys(current)}`, "SchemaNormalizer");
237
+ if (i < pathSegments.length - 1) {
238
+ current = meta?.properties;
239
+ }
240
+ }
241
+
242
+ const bindingPath = pathSegments.join("/");
243
+ const propKey = scope.replace("#/properties/", ""); // The original raw string for logging
244
+
245
+ return {
246
+ meta,
247
+ bindingPath,
248
+ propKey
249
+ };
250
+ }
208
251
  }
@@ -1 +1 @@
1
- {"version":3,"file":"IPlugin-dbg.js","names":[],"sources":["IPlugin.ts"],"sourcesContent":["/**\n * @file IPlugin.ts\n * @description Contract for all discrete UI control generation plugins.\n * Enforces a strict lifecycle for rendering, validation, and dynamic state updates.\n */\n\nimport Control from \"sap/ui/core/Control\";\nimport { IPropertyMetadata } from \"./ISchema\";\n\nexport interface IPluginValidationResult {\n isValid: boolean;\n errorMessage?: string;\n fieldKey?: string;\n}\n\nexport interface IPlugin {\n /**\n * Instantiates the raw UI5 control and binds it to the specified data model.\n * \n * @param fieldMetadata The JSON Schema defining the field's constraints and UI hints.\n * @param bindingPath The specific JSON path representing the field within the payload.\n * @param modelName The UI5 JSONModel alias used for data binding (defaults to 'meta').\n * @param engineScopeId The deterministic scope ID provided by the Engine.\n * @param onChange The callback fired natively when a field value blur/change occurs.\n * @returns {Control} The generated UI5 control ready to be mounted.\n */\n render(fieldMetadata: IPropertyMetadata, bindingPath: string, modelName?: string, engineScopeId?: string, onChange?: (isValid: boolean, fieldKey?: string, errorMessage?: string, controlId?: string) => void): Control;\n\n /**\n * Triggers the internal validation pipeline for this specific plugin instance.\n * \n * @returns {IPluginValidationResult} The structural validity state and error messages.\n */\n validate(): IPluginValidationResult;\n\n /**\n * Executes when the ConditionEngine pushes dynamic metadata mutations to the field.\n * \n * @param newMetadata The mutated schema metadata.\n */\n onStateChange(newMetadata: IPropertyMetadata): void;\n\n /**\n * Optional lifecycle hook executed when the parent layout is destroyed.\n * Plugins must use this to destroy isolated JSONModels, custom EventBus listeners, \n * or embedded Dialogs to prevent memory leaks in the SAP Fiori Launchpad.\n */\n destroy?(): void;\n\n /**\n * Injects the global display mode context into the plugin before rendering.\n * @param mode True if the plugin should render in a read-only display mode.\n */\n setDisplayMode?(mode: boolean): void;\n}\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"file":"IPlugin-dbg.js","names":[],"sources":["IPlugin.ts"],"sourcesContent":["/**\n * @file IPlugin.ts\n * @description Contract for all discrete UI control generation plugins.\n * Enforces a strict lifecycle for rendering, validation, and dynamic state updates.\n */\n\nimport Control from \"sap/ui/core/Control\";\nimport { IPropertyMetadata } from \"./ISchema\";\n\nexport interface IPluginValidationResult {\n isValid: boolean;\n errorMessage?: string;\n fieldKey?: string;\n}\n\nexport interface IPlugin {\n /**\n * Instantiates the raw UI5 control and binds it to the specified data model.\n * \n * @param fieldMetadata The JSON Schema defining the field's constraints and UI hints.\n * @param bindingPath The specific JSON path representing the field within the payload.\n * @param modelName The UI5 JSONModel alias used for data binding (defaults to 'meta').\n * @param engineScopeId The deterministic scope ID provided by the Engine.\n * @param onChange The callback fired natively when a field value blur/change occurs.\n * @returns {Control} The generated UI5 control ready to be mounted.\n */\n render(fieldMetadata: IPropertyMetadata, bindingPath: string, modelName?: string, engineScopeId?: string, onChange?: (isValid: boolean, fieldKey?: string, errorMessage?: string, controlId?: string) => void): Control;\n\n /**\n * Triggers the internal validation pipeline for this specific plugin instance.\n * \n * @returns {IPluginValidationResult} The structural validity state and error messages.\n */\n validate(): IPluginValidationResult;\n\n /**\n * Executes when the ConditionEngine pushes dynamic metadata mutations to the field.\n * \n * @param newMetadata The mutated schema metadata.\n */\n onStateChange(newMetadata: IPropertyMetadata): void;\n\n /**\n * Optional lifecycle hook executed when the parent layout is destroyed.\n * Plugins must use this to destroy isolated JSONModels, custom EventBus listeners, \n * or embedded Dialogs to prevent memory leaks in the SAP Fiori Launchpad.\n */\n destroy?(): void;\n\n /**\n * Injects the global editable mode context into the plugin before rendering.\n * @param editable True if the plugin should render in an editable mode.\n */\n setEditable?(editable: boolean): void;\n}\n"],"mappings":"","ignoreList":[]}
@@ -42,10 +42,10 @@ declare module "nz/co/siliconst/ui5/metaui/interfaces/IPlugin" {
42
42
  */
43
43
  destroy?(): void;
44
44
  /**
45
- * Injects the global display mode context into the plugin before rendering.
46
- * @param mode True if the plugin should render in a read-only display mode.
45
+ * Injects the global editable mode context into the plugin before rendering.
46
+ * @param editable True if the plugin should render in an editable mode.
47
47
  */
48
- setDisplayMode?(mode: boolean): void;
48
+ setEditable?(editable: boolean): void;
49
49
  }
50
50
  }
51
51
  //# sourceMappingURL=IPlugin.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"IPlugin.d.ts","sourceRoot":"../../../../../../../..","sources":["src/nz/co/siliconst/ui5/metaui/interfaces/IPlugin.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,+CAA+C,CAAC;IAC/D;;;;OAIG;IAEH,OAAO,OAAO,MAAM,qBAAqB,CAAC;IAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;IAElF,UAAiB,uBAAuB;QACpC,OAAO,EAAE,OAAO,CAAC;QACjB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACrB;IAED,UAAiB,OAAO;QACpB;;;;;;;;;WASG;QACH,MAAM,CAAC,aAAa,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC;QAExN;;;;WAIG;QACH,QAAQ,IAAI,uBAAuB,CAAC;QAEpC;;;;WAIG;QACH,aAAa,CAAC,WAAW,EAAE,iBAAiB,GAAG,IAAI,CAAC;QAEpD;;;;WAIG;QACH,OAAO,CAAC,IAAI,IAAI,CAAC;QAEjB;;;WAGG;QACH,cAAc,CAAC,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;KACxC;CAEA"}
1
+ {"version":3,"file":"IPlugin.d.ts","sourceRoot":"../../../../../../../..","sources":["src/nz/co/siliconst/ui5/metaui/interfaces/IPlugin.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,+CAA+C,CAAC;IAC/D;;;;OAIG;IAEH,OAAO,OAAO,MAAM,qBAAqB,CAAC;IAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;IAElF,UAAiB,uBAAuB;QACpC,OAAO,EAAE,OAAO,CAAC;QACjB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACrB;IAED,UAAiB,OAAO;QACpB;;;;;;;;;WASG;QACH,MAAM,CAAC,aAAa,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC;QAExN;;;;WAIG;QACH,QAAQ,IAAI,uBAAuB,CAAC;QAEpC;;;;WAIG;QACH,aAAa,CAAC,WAAW,EAAE,iBAAiB,GAAG,IAAI,CAAC;QAEpD;;;;WAIG;QACH,OAAO,CAAC,IAAI,IAAI,CAAC;QAEjB;;;WAGG;QACH,WAAW,CAAC,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;KACzC;CAEA"}
@@ -48,8 +48,8 @@ export interface IPlugin {
48
48
  destroy?(): void;
49
49
 
50
50
  /**
51
- * Injects the global display mode context into the plugin before rendering.
52
- * @param mode True if the plugin should render in a read-only display mode.
51
+ * Injects the global editable mode context into the plugin before rendering.
52
+ * @param editable True if the plugin should render in an editable mode.
53
53
  */
54
- setDisplayMode?(mode: boolean): void;
54
+ setEditable?(editable: boolean): void;
55
55
  }
@@ -1,6 +1,7 @@
1
- sap.ui.define(["sap/m/VBox", "sap/m/Label", "../utils/Logger"], function (VBox, Label, ___utils_Logger) {
1
+ sap.ui.define(["sap/m/VBox", "sap/m/Label", "../core/SchemaNormalizer", "../utils/Logger"], function (VBox, Label, ___core_SchemaNormalizer, ___utils_Logger) {
2
2
  "use strict";
3
3
 
4
+ const SchemaNormalizer = ___core_SchemaNormalizer["SchemaNormalizer"];
4
5
  const Logger = ___utils_Logger["Logger"];
5
6
  /**
6
7
  * Layout Manager responsible for generating a dense, lightweight layout (no SimpleForm padding).
@@ -49,8 +50,11 @@ sap.ui.define(["sap/m/VBox", "sap/m/Label", "../utils/Logger"], function (VBox,
49
50
  Logger.error(`[MetaUI] Invalid scope '${element.scope}' in uiLayout Control.`, "", "CompactLayout");
50
51
  return;
51
52
  }
52
- const propKey = element.scope.replace("#/properties/", "");
53
- const meta = schema.properties?.[propKey];
53
+ const {
54
+ meta,
55
+ bindingPath,
56
+ propKey
57
+ } = SchemaNormalizer.resolveScope(schema, element.scope);
54
58
  if (!meta) {
55
59
  Logger.error(`[MetaUI] Property '${propKey}' not found in schema definitions.`, "", "CompactLayout");
56
60
  return;
@@ -61,13 +65,13 @@ sap.ui.define(["sap/m/VBox", "sap/m/Label", "../utils/Logger"], function (VBox,
61
65
  if (isSubLayout) {
62
66
  Logger.debug("[MetaUI CompactLayout]", `Routing property '${propKey}' to Table Sub-Layout.`, "CompactLayout");
63
67
  tableElements.push({
64
- scope: propKey,
68
+ scope: bindingPath,
65
69
  meta,
66
70
  label: element.label
67
71
  });
68
72
  } else {
69
- Logger.debug("[MetaUI CompactLayout]", `Rendering scalar field '${propKey}'.`, "CompactLayout");
70
- this._renderScalarField(container, element, propKey, meta, modelName, engine);
73
+ Logger.debug("[MetaUI CompactLayout]", `Rendering scalar field '${bindingPath}'.`, "CompactLayout");
74
+ this._renderScalarField(container, element, bindingPath, meta, modelName, engine);
71
75
  }
72
76
  } else {
73
77
  Logger.warn(`[MetaUI] Unsupported layout element type '${element.type}'.`, "", "CompactLayout");
@@ -1 +1 @@
1
- {"version":3,"file":"CompactLayout-dbg.js","names":["Logger","___utils_Logger","CompactLayout","render","schema","modelName","engine","onSubmit","container","VBox","renderType","addStyleClass","uiLayout","Array","isArray","warn","tableElements","renderElement","element","type","label","title","sap","m","Title","text","level","addItem","elements","forEach","scope","startsWith","error","propKey","replace","meta","properties","isCollectionOfRecords","items","hasExplicitWidget","ui","widget","isSubLayout","debug","push","_renderScalarField","field","subSchema","control","generateLayout","msg","message","showErrorPopup","labelText","Label","required","effectiveMeta","generateField","fieldBox","__exports","__esModule"],"sources":["CompactLayout.ts"],"sourcesContent":["/**\n * @file CompactLayout.ts\n * @description Generates a lightweight, dense VBox layout for use inside tight spaces like table cells.\n */\n\nimport VBox from \"sap/m/VBox\";\nimport Label from \"sap/m/Label\";\nimport Title from \"sap/ui/core/Title\";\nimport { IPropertyMetadata, ISchema, ILayoutElement } from \"../interfaces/ISchema\";\nimport { ILayoutManager } from \"../interfaces/ILayoutManager\";\nimport { Engine } from \"../core/Engine\";\nimport { Logger } from \"../utils/Logger\";\nimport Control from \"sap/ui/core/Control\";\n\n/**\n * Layout Manager responsible for generating a dense, lightweight layout (no SimpleForm padding).\n * Ideal for rendering objects dynamically inside table cells or side-panels.\n * \n * @namespace nz.co.siliconst.ui5.metaui.layouts\n * @public\n */\nexport class CompactLayout implements ILayoutManager {\n /**\n * Renders the JSON Schema properties into a dense VBox layout.\n * \n * @param schema The active JSON schema subset.\n * @param modelName The bound UI5 model name.\n * @param engine The central orchestrator for delegating plugin generation.\n * @param onSubmit Optional submit hook.\n * @returns {Control} The VBox wrapper containing the generated compact form.\n */\n public render(schema: ISchema, modelName: string, engine: Engine, onSubmit?: () => void): Control {\n const container = new VBox({ renderType: \"Bare\" });\n container.addStyleClass(\"sapUiTinyMargin\");\n\n if (!schema.uiLayout || !Array.isArray(schema.uiLayout)) {\n Logger.warn(\"[MetaUI] Missing 'uiLayout' array in schema. CompactLayout will not render any fields.\");\n return container;\n }\n\n const tableElements: { scope: string, meta: IPropertyMetadata, label?: string }[] = [];\n\n // Recursively render layout elements\n const renderElement = (element: ILayoutElement) => {\n if (element.type === \"Group\") {\n if (element.label) {\n const title = new sap.m.Title({ text: element.label, level: \"H5\" });\n title.addStyleClass(\"sapUiTinyMarginTop sapUiTinyMarginBottom\");\n container.addItem(title);\n }\n \n if (element.elements && Array.isArray(element.elements)) {\n element.elements.forEach(renderElement);\n }\n } else if (element.type === \"Control\") {\n if (!element.scope || !element.scope.startsWith(\"#/properties/\")) {\n Logger.error(`[MetaUI] Invalid scope '${element.scope}' in uiLayout Control.`, \"\", \"CompactLayout\");\n return;\n }\n \n const propKey = element.scope.replace(\"#/properties/\", \"\");\n const meta = schema.properties?.[propKey];\n \n if (!meta) {\n Logger.error(`[MetaUI] Property '${propKey}' not found in schema definitions.`, \"\", \"CompactLayout\");\n return;\n }\n\n const isCollectionOfRecords = meta.items?.type === \"object\" || meta.items?.properties;\n const hasExplicitWidget = !!meta.ui?.widget;\n const isSubLayout = meta.type === \"array\" && isCollectionOfRecords && !hasExplicitWidget;\n\n if (isSubLayout) {\n Logger.debug(\"[MetaUI CompactLayout]\", `Routing property '${propKey}' to Table Sub-Layout.`, \"CompactLayout\");\n tableElements.push({ scope: propKey, meta, label: element.label });\n } else {\n Logger.debug(\"[MetaUI CompactLayout]\", `Rendering scalar field '${propKey}'.`, \"CompactLayout\");\n this._renderScalarField(container, element, propKey, meta, modelName, engine);\n }\n } else {\n Logger.warn(`[MetaUI] Unsupported layout element type '${element.type}'.`, \"\", \"CompactLayout\");\n }\n };\n\n // Render everything defined in the layout\n schema.uiLayout.forEach(renderElement);\n\n // Render array/table sub-layouts full width below the fields\n tableElements.forEach(field => {\n try {\n const subSchema = {\n type: \"array\",\n title: field.label || field.meta.ui?.label || field.scope,\n items: field.meta.items || { type: \"object\", properties: {} },\n uiLayout: field.meta.items?.uiLayout\n };\n \n const control = engine.generateLayout(subSchema as ISchema, modelName, `/${field.scope}`);\n if (control) {\n control.addStyleClass(\"sapUiTinyMarginTop\");\n container.addItem(control);\n }\n } catch (error) {\n const msg = (error as Error).message;\n Logger.error(`[MetaUI] Failed to render array field ${field.scope}`, msg, \"CompactLayout\");\n Logger.showErrorPopup(`Failed to render array field '${field.scope}'.\\n\\nDetails: ${msg}`);\n }\n });\n\n return container;\n }\n\n private _renderScalarField(container: VBox, element: ILayoutElement, propKey: string, meta: IPropertyMetadata, modelName: string, engine: Engine): void {\n try {\n const labelText = element.label || meta.ui?.label || propKey;\n const label = new Label({\n text: labelText,\n required: meta.required\n });\n label.addStyleClass(\"sapUiTinyMarginTop\");\n\n const effectiveMeta = { ...meta };\n if (element.widget) {\n effectiveMeta.ui = { ...meta.ui, widget: element.widget };\n }\n\n const control = engine.generateField(effectiveMeta, `/${propKey}`, modelName);\n control.addStyleClass(\"sapUiTinyMarginBottom\");\n\n // Wrap label and field tightly\n const fieldBox = new VBox({ renderType: \"Bare\", items: [label, control] });\n container.addItem(fieldBox);\n } catch (error) {\n const msg = (error as Error).message;\n Logger.error(`[MetaUI] Failed to render field ${propKey}`, msg, \"CompactLayout\");\n Logger.showErrorPopup(`Failed to render field '${propKey}'.\\n\\nDetails: ${msg}`);\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"CompactLayout-dbg.js","names":["SchemaNormalizer","___core_SchemaNormalizer","Logger","___utils_Logger","CompactLayout","render","schema","modelName","engine","onSubmit","container","VBox","renderType","addStyleClass","uiLayout","Array","isArray","warn","tableElements","renderElement","element","type","label","title","sap","m","Title","text","level","addItem","elements","forEach","scope","startsWith","error","meta","bindingPath","propKey","resolveScope","isCollectionOfRecords","items","properties","hasExplicitWidget","ui","widget","isSubLayout","debug","push","_renderScalarField","field","subSchema","control","generateLayout","msg","message","showErrorPopup","labelText","Label","required","effectiveMeta","generateField","fieldBox","__exports","__esModule"],"sources":["CompactLayout.ts"],"sourcesContent":["/**\n * @file CompactLayout.ts\n * @description Generates a lightweight, dense VBox layout for use inside tight spaces like table cells.\n */\n\nimport VBox from \"sap/m/VBox\";\nimport Label from \"sap/m/Label\";\nimport Title from \"sap/ui/core/Title\";\nimport { IPropertyMetadata, ISchema, ILayoutElement } from \"../interfaces/ISchema\";\nimport { ILayoutManager } from \"../interfaces/ILayoutManager\";\nimport { Engine } from \"../core/Engine\";\nimport { SchemaNormalizer } from \"../core/SchemaNormalizer\";\nimport { Logger } from \"../utils/Logger\";\nimport Control from \"sap/ui/core/Control\";\n\n/**\n * Layout Manager responsible for generating a dense, lightweight layout (no SimpleForm padding).\n * Ideal for rendering objects dynamically inside table cells or side-panels.\n * \n * @namespace nz.co.siliconst.ui5.metaui.layouts\n * @public\n */\nexport class CompactLayout implements ILayoutManager {\n /**\n * Renders the JSON Schema properties into a dense VBox layout.\n * \n * @param schema The active JSON schema subset.\n * @param modelName The bound UI5 model name.\n * @param engine The central orchestrator for delegating plugin generation.\n * @param onSubmit Optional submit hook.\n * @returns {Control} The VBox wrapper containing the generated compact form.\n */\n public render(schema: ISchema, modelName: string, engine: Engine, onSubmit?: () => void): Control {\n const container = new VBox({ renderType: \"Bare\" });\n container.addStyleClass(\"sapUiTinyMargin\");\n\n if (!schema.uiLayout || !Array.isArray(schema.uiLayout)) {\n Logger.warn(\"[MetaUI] Missing 'uiLayout' array in schema. CompactLayout will not render any fields.\");\n return container;\n }\n\n const tableElements: { scope: string, meta: IPropertyMetadata, label?: string }[] = [];\n\n // Recursively render layout elements\n const renderElement = (element: ILayoutElement) => {\n if (element.type === \"Group\") {\n if (element.label) {\n const title = new sap.m.Title({ text: element.label, level: \"H5\" });\n title.addStyleClass(\"sapUiTinyMarginTop sapUiTinyMarginBottom\");\n container.addItem(title);\n }\n \n if (element.elements && Array.isArray(element.elements)) {\n element.elements.forEach(renderElement);\n }\n } else if (element.type === \"Control\") {\n if (!element.scope || !element.scope.startsWith(\"#/properties/\")) {\n Logger.error(`[MetaUI] Invalid scope '${element.scope}' in uiLayout Control.`, \"\", \"CompactLayout\");\n return;\n }\n \n const { meta, bindingPath, propKey } = SchemaNormalizer.resolveScope(schema, element.scope);\n \n if (!meta) {\n Logger.error(`[MetaUI] Property '${propKey}' not found in schema definitions.`, \"\", \"CompactLayout\");\n return;\n }\n\n const isCollectionOfRecords = meta.items?.type === \"object\" || meta.items?.properties;\n const hasExplicitWidget = !!meta.ui?.widget;\n const isSubLayout = meta.type === \"array\" && isCollectionOfRecords && !hasExplicitWidget;\n\n if (isSubLayout) {\n Logger.debug(\"[MetaUI CompactLayout]\", `Routing property '${propKey}' to Table Sub-Layout.`, \"CompactLayout\");\n tableElements.push({ scope: bindingPath, meta, label: element.label });\n } else {\n Logger.debug(\"[MetaUI CompactLayout]\", `Rendering scalar field '${bindingPath}'.`, \"CompactLayout\");\n this._renderScalarField(container, element, bindingPath, meta, modelName, engine);\n }\n } else {\n Logger.warn(`[MetaUI] Unsupported layout element type '${element.type}'.`, \"\", \"CompactLayout\");\n }\n };\n\n // Render everything defined in the layout\n schema.uiLayout.forEach(renderElement);\n\n // Render array/table sub-layouts full width below the fields\n tableElements.forEach(field => {\n try {\n const subSchema = {\n type: \"array\",\n title: field.label || field.meta.ui?.label || field.scope,\n items: field.meta.items || { type: \"object\", properties: {} },\n uiLayout: field.meta.items?.uiLayout\n };\n \n const control = engine.generateLayout(subSchema as ISchema, modelName, `/${field.scope}`);\n if (control) {\n control.addStyleClass(\"sapUiTinyMarginTop\");\n container.addItem(control);\n }\n } catch (error) {\n const msg = (error as Error).message;\n Logger.error(`[MetaUI] Failed to render array field ${field.scope}`, msg, \"CompactLayout\");\n Logger.showErrorPopup(`Failed to render array field '${field.scope}'.\\n\\nDetails: ${msg}`);\n }\n });\n\n return container;\n }\n\n private _renderScalarField(container: VBox, element: ILayoutElement, propKey: string, meta: IPropertyMetadata, modelName: string, engine: Engine): void {\n try {\n const labelText = element.label || meta.ui?.label || propKey;\n const label = new Label({\n text: labelText,\n required: meta.required\n });\n label.addStyleClass(\"sapUiTinyMarginTop\");\n\n const effectiveMeta = { ...meta };\n if (element.widget) {\n effectiveMeta.ui = { ...meta.ui, widget: element.widget };\n }\n\n const control = engine.generateField(effectiveMeta, `/${propKey}`, modelName);\n control.addStyleClass(\"sapUiTinyMarginBottom\");\n\n // Wrap label and field tightly\n const fieldBox = new VBox({ renderType: \"Bare\", items: [label, control] });\n container.addItem(fieldBox);\n } catch (error) {\n const msg = (error as Error).message;\n Logger.error(`[MetaUI] Failed to render field ${propKey}`, msg, \"CompactLayout\");\n Logger.showErrorPopup(`Failed to render field '${propKey}'.\\n\\nDetails: ${msg}`);\n }\n }\n}\n"],"mappings":";;;QAWSA,gBAAgB,GAAAC,wBAAA;EAAA,MAChBC,MAAM,GAAAC,eAAA;EAGf;AACA;AACA;AACA;AACA;AACA;AACA;EACO,MAAMC,aAAa,CAA2B;IACjD;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACWC,MAAMA,CAACC,MAAe,EAAEC,SAAiB,EAAEC,MAAc,EAAEC,QAAqB,EAAW;MAC9F,MAAMC,SAAS,GAAG,IAAIC,IAAI,CAAC;QAAEC,UAAU,EAAE;MAAO,CAAC,CAAC;MAClDF,SAAS,CAACG,aAAa,CAAC,iBAAiB,CAAC;MAE1C,IAAI,CAACP,MAAM,CAACQ,QAAQ,IAAI,CAACC,KAAK,CAACC,OAAO,CAACV,MAAM,CAACQ,QAAQ,CAAC,EAAE;QACrDZ,MAAM,CAACe,IAAI,CAAC,wFAAwF,CAAC;QACrG,OAAOP,SAAS;MACpB;MAEA,MAAMQ,aAA2E,GAAG,EAAE;;MAEtF;MACA,MAAMC,aAAa,GAAIC,OAAuB,IAAK;QAC/C,IAAIA,OAAO,CAACC,IAAI,KAAK,OAAO,EAAE;UAC1B,IAAID,OAAO,CAACE,KAAK,EAAE;YACf,MAAMC,KAAK,GAAG,IAAIC,GAAG,CAACC,CAAC,CAACC,KAAK,CAAC;cAAEC,IAAI,EAAEP,OAAO,CAACE,KAAK;cAAEM,KAAK,EAAE;YAAK,CAAC,CAAC;YACnEL,KAAK,CAACV,aAAa,CAAC,0CAA0C,CAAC;YAC/DH,SAAS,CAACmB,OAAO,CAACN,KAAK,CAAC;UAC5B;UAEA,IAAIH,OAAO,CAACU,QAAQ,IAAIf,KAAK,CAACC,OAAO,CAACI,OAAO,CAACU,QAAQ,CAAC,EAAE;YACrDV,OAAO,CAACU,QAAQ,CAACC,OAAO,CAACZ,aAAa,CAAC;UAC3C;QACJ,CAAC,MAAM,IAAIC,OAAO,CAACC,IAAI,KAAK,SAAS,EAAE;UACnC,IAAI,CAACD,OAAO,CAACY,KAAK,IAAI,CAACZ,OAAO,CAACY,KAAK,CAACC,UAAU,CAAC,eAAe,CAAC,EAAE;YAC9D/B,MAAM,CAACgC,KAAK,CAAC,2BAA2Bd,OAAO,CAACY,KAAK,wBAAwB,EAAE,EAAE,EAAE,eAAe,CAAC;YACnG;UACJ;UAEA,MAAM;YAAEG,IAAI;YAAEC,WAAW;YAAEC;UAAQ,CAAC,GAAGrC,gBAAgB,CAACsC,YAAY,CAAChC,MAAM,EAAEc,OAAO,CAACY,KAAK,CAAC;UAE3F,IAAI,CAACG,IAAI,EAAE;YACPjC,MAAM,CAACgC,KAAK,CAAC,sBAAsBG,OAAO,oCAAoC,EAAE,EAAE,EAAE,eAAe,CAAC;YACpG;UACJ;UAEA,MAAME,qBAAqB,GAAGJ,IAAI,CAACK,KAAK,EAAEnB,IAAI,KAAK,QAAQ,IAAIc,IAAI,CAACK,KAAK,EAAEC,UAAU;UACrF,MAAMC,iBAAiB,GAAG,CAAC,CAACP,IAAI,CAACQ,EAAE,EAAEC,MAAM;UAC3C,MAAMC,WAAW,GAAGV,IAAI,CAACd,IAAI,KAAK,OAAO,IAAIkB,qBAAqB,IAAI,CAACG,iBAAiB;UAExF,IAAIG,WAAW,EAAE;YACb3C,MAAM,CAAC4C,KAAK,CAAC,wBAAwB,EAAE,qBAAqBT,OAAO,wBAAwB,EAAE,eAAe,CAAC;YAC7GnB,aAAa,CAAC6B,IAAI,CAAC;cAAEf,KAAK,EAAEI,WAAW;cAAED,IAAI;cAAEb,KAAK,EAAEF,OAAO,CAACE;YAAM,CAAC,CAAC;UAC1E,CAAC,MAAM;YACHpB,MAAM,CAAC4C,KAAK,CAAC,wBAAwB,EAAE,2BAA2BV,WAAW,IAAI,EAAE,eAAe,CAAC;YACnG,IAAI,CAACY,kBAAkB,CAACtC,SAAS,EAAEU,OAAO,EAAEgB,WAAW,EAAED,IAAI,EAAE5B,SAAS,EAAEC,MAAM,CAAC;UACrF;QACJ,CAAC,MAAM;UACHN,MAAM,CAACe,IAAI,CAAC,6CAA6CG,OAAO,CAACC,IAAI,IAAI,EAAE,EAAE,EAAE,eAAe,CAAC;QACnG;MACJ,CAAC;;MAED;MACAf,MAAM,CAACQ,QAAQ,CAACiB,OAAO,CAACZ,aAAa,CAAC;;MAEtC;MACAD,aAAa,CAACa,OAAO,CAACkB,KAAK,IAAI;QAC3B,IAAI;UACA,MAAMC,SAAS,GAAG;YACd7B,IAAI,EAAE,OAAO;YACbE,KAAK,EAAE0B,KAAK,CAAC3B,KAAK,IAAI2B,KAAK,CAACd,IAAI,CAACQ,EAAE,EAAErB,KAAK,IAAI2B,KAAK,CAACjB,KAAK;YACzDQ,KAAK,EAAES,KAAK,CAACd,IAAI,CAACK,KAAK,IAAI;cAAEnB,IAAI,EAAE,QAAQ;cAAEoB,UAAU,EAAE,CAAC;YAAE,CAAC;YAC7D3B,QAAQ,EAAEmC,KAAK,CAACd,IAAI,CAACK,KAAK,EAAE1B;UAChC,CAAC;UAED,MAAMqC,OAAO,GAAG3C,MAAM,CAAC4C,cAAc,CAACF,SAAS,EAAa3C,SAAS,EAAE,IAAI0C,KAAK,CAACjB,KAAK,EAAE,CAAC;UACzF,IAAImB,OAAO,EAAE;YACTA,OAAO,CAACtC,aAAa,CAAC,oBAAoB,CAAC;YAC3CH,SAAS,CAACmB,OAAO,CAACsB,OAAO,CAAC;UAC9B;QACJ,CAAC,CAAC,OAAOjB,KAAK,EAAE;UACZ,MAAMmB,GAAG,GAAInB,KAAK,CAAWoB,OAAO;UACpCpD,MAAM,CAACgC,KAAK,CAAC,yCAAyCe,KAAK,CAACjB,KAAK,EAAE,EAAEqB,GAAG,EAAE,eAAe,CAAC;UAC1FnD,MAAM,CAACqD,cAAc,CAAC,iCAAiCN,KAAK,CAACjB,KAAK,kBAAkBqB,GAAG,EAAE,CAAC;QAC9F;MACJ,CAAC,CAAC;MAEF,OAAO3C,SAAS;IACpB;IAEQsC,kBAAkBA,CAACtC,SAAe,EAAEU,OAAuB,EAAEiB,OAAe,EAAEF,IAAuB,EAAE5B,SAAiB,EAAEC,MAAc,EAAQ;MACpJ,IAAI;QACA,MAAMgD,SAAS,GAAGpC,OAAO,CAACE,KAAK,IAAIa,IAAI,CAACQ,EAAE,EAAErB,KAAK,IAAIe,OAAO;QAC5D,MAAMf,KAAK,GAAG,IAAImC,KAAK,CAAC;UACpB9B,IAAI,EAAE6B,SAAS;UACfE,QAAQ,EAAEvB,IAAI,CAACuB;QACnB,CAAC,CAAC;QACFpC,KAAK,CAACT,aAAa,CAAC,oBAAoB,CAAC;QAEzC,MAAM8C,aAAa,GAAG;UAAE,GAAGxB;QAAK,CAAC;QACjC,IAAIf,OAAO,CAACwB,MAAM,EAAE;UAChBe,aAAa,CAAChB,EAAE,GAAG;YAAE,GAAGR,IAAI,CAACQ,EAAE;YAAEC,MAAM,EAAExB,OAAO,CAACwB;UAAO,CAAC;QAC7D;QAEA,MAAMO,OAAO,GAAG3C,MAAM,CAACoD,aAAa,CAACD,aAAa,EAAE,IAAItB,OAAO,EAAE,EAAE9B,SAAS,CAAC;QAC7E4C,OAAO,CAACtC,aAAa,CAAC,uBAAuB,CAAC;;QAE9C;QACA,MAAMgD,QAAQ,GAAG,IAAIlD,IAAI,CAAC;UAAEC,UAAU,EAAE,MAAM;UAAE4B,KAAK,EAAE,CAAClB,KAAK,EAAE6B,OAAO;QAAE,CAAC,CAAC;QAC1EzC,SAAS,CAACmB,OAAO,CAACgC,QAAQ,CAAC;MAC/B,CAAC,CAAC,OAAO3B,KAAK,EAAE;QACZ,MAAMmB,GAAG,GAAInB,KAAK,CAAWoB,OAAO;QACpCpD,MAAM,CAACgC,KAAK,CAAC,mCAAmCG,OAAO,EAAE,EAAEgB,GAAG,EAAE,eAAe,CAAC;QAChFnD,MAAM,CAACqD,cAAc,CAAC,2BAA2BlB,OAAO,kBAAkBgB,GAAG,EAAE,CAAC;MACpF;IACJ;EACJ;EAAC,IAAAS,SAAA;IAAAC,UAAA;EAAA;EAAAD,SAAA,CAAA1D,aAAA,GAAAA,aAAA;EAAA,OAAA0D,SAAA;AAAA","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"CompactLayout.d.ts","sourceRoot":"../../../../../../../..","sources":["src/nz/co/siliconst/ui5/metaui/layouts/CompactLayout.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,kDAAkD,CAAC;IASlE,OAAO,EAAqB,OAAO,EAAkB,MAAM,+CAA+C,CAAC;IAC3G,OAAO,EAAE,cAAc,EAAE,MAAM,sDAAsD,CAAC;IACtF,OAAO,EAAE,MAAM,EAAE,MAAM,wCAAwC,CAAC;IAEhE,OAAO,OAAO,MAAM,qBAAqB,CAAC;IAE1C;;;;;;OAMG;IACH,MAAa,aAAc,YAAW,cAAc;QAChD;;;;;;;;WAQG;QACI,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO;QAiFjG,OAAO,CAAC,kBAAkB;KA0B7B;CAEA"}
1
+ {"version":3,"file":"CompactLayout.d.ts","sourceRoot":"../../../../../../../..","sources":["src/nz/co/siliconst/ui5/metaui/layouts/CompactLayout.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,kDAAkD,CAAC;IASlE,OAAO,EAAqB,OAAO,EAAkB,MAAM,+CAA+C,CAAC;IAC3G,OAAO,EAAE,cAAc,EAAE,MAAM,sDAAsD,CAAC;IACtF,OAAO,EAAE,MAAM,EAAE,MAAM,wCAAwC,CAAC;IAGhE,OAAO,OAAO,MAAM,qBAAqB,CAAC;IAE1C;;;;;;OAMG;IACH,MAAa,aAAc,YAAW,cAAc;QAChD;;;;;;;;WAQG;QACI,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO;QAgFjG,OAAO,CAAC,kBAAkB;KA0B7B;CAEA"}
@@ -1,2 +1,2 @@
1
- sap.ui.define(["sap/m/VBox","sap/m/Label","../utils/Logger"],function(e,t,a){"use strict";const r=a["Logger"];class o{render(t,a,o,i){const s=new e({renderType:"Bare"});s.addStyleClass("sapUiTinyMargin");if(!t.uiLayout||!Array.isArray(t.uiLayout)){r.warn("[MetaUI] Missing 'uiLayout' array in schema. CompactLayout will not render any fields.");return s}const n=[];const l=e=>{if(e.type==="Group"){if(e.label){const t=new sap.m.Title({text:e.label,level:"H5"});t.addStyleClass("sapUiTinyMarginTop sapUiTinyMarginBottom");s.addItem(t)}if(e.elements&&Array.isArray(e.elements)){e.elements.forEach(l)}}else if(e.type==="Control"){if(!e.scope||!e.scope.startsWith("#/properties/")){r.error(`[MetaUI] Invalid scope '${e.scope}' in uiLayout Control.`,"","CompactLayout");return}const i=e.scope.replace("#/properties/","");const l=t.properties?.[i];if(!l){r.error(`[MetaUI] Property '${i}' not found in schema definitions.`,"","CompactLayout");return}const p=l.items?.type==="object"||l.items?.properties;const c=!!l.ui?.widget;const u=l.type==="array"&&p&&!c;if(u){r.debug("[MetaUI CompactLayout]",`Routing property '${i}' to Table Sub-Layout.`,"CompactLayout");n.push({scope:i,meta:l,label:e.label})}else{r.debug("[MetaUI CompactLayout]",`Rendering scalar field '${i}'.`,"CompactLayout");this._renderScalarField(s,e,i,l,a,o)}}else{r.warn(`[MetaUI] Unsupported layout element type '${e.type}'.`,"","CompactLayout")}};t.uiLayout.forEach(l);n.forEach(e=>{try{const t={type:"array",title:e.label||e.meta.ui?.label||e.scope,items:e.meta.items||{type:"object",properties:{}},uiLayout:e.meta.items?.uiLayout};const r=o.generateLayout(t,a,`/${e.scope}`);if(r){r.addStyleClass("sapUiTinyMarginTop");s.addItem(r)}}catch(t){const a=t.message;r.error(`[MetaUI] Failed to render array field ${e.scope}`,a,"CompactLayout");r.showErrorPopup(`Failed to render array field '${e.scope}'.\n\nDetails: ${a}`)}});return s}_renderScalarField(a,o,i,s,n,l){try{const r=o.label||s.ui?.label||i;const p=new t({text:r,required:s.required});p.addStyleClass("sapUiTinyMarginTop");const c={...s};if(o.widget){c.ui={...s.ui,widget:o.widget}}const u=l.generateField(c,`/${i}`,n);u.addStyleClass("sapUiTinyMarginBottom");const y=new e({renderType:"Bare",items:[p,u]});a.addItem(y)}catch(e){const t=e.message;r.error(`[MetaUI] Failed to render field ${i}`,t,"CompactLayout");r.showErrorPopup(`Failed to render field '${i}'.\n\nDetails: ${t}`)}}}var i={__esModule:true};i.CompactLayout=o;return i});
1
+ sap.ui.define(["sap/m/VBox","sap/m/Label","../core/SchemaNormalizer","../utils/Logger"],function(e,t,a,r){"use strict";const o=a["SchemaNormalizer"];const i=r["Logger"];class s{render(t,a,r,s){const n=new e({renderType:"Bare"});n.addStyleClass("sapUiTinyMargin");if(!t.uiLayout||!Array.isArray(t.uiLayout)){i.warn("[MetaUI] Missing 'uiLayout' array in schema. CompactLayout will not render any fields.");return n}const l=[];const p=e=>{if(e.type==="Group"){if(e.label){const t=new sap.m.Title({text:e.label,level:"H5"});t.addStyleClass("sapUiTinyMarginTop sapUiTinyMarginBottom");n.addItem(t)}if(e.elements&&Array.isArray(e.elements)){e.elements.forEach(p)}}else if(e.type==="Control"){if(!e.scope||!e.scope.startsWith("#/properties/")){i.error(`[MetaUI] Invalid scope '${e.scope}' in uiLayout Control.`,"","CompactLayout");return}const{meta:s,bindingPath:p,propKey:c}=o.resolveScope(t,e.scope);if(!s){i.error(`[MetaUI] Property '${c}' not found in schema definitions.`,"","CompactLayout");return}const y=s.items?.type==="object"||s.items?.properties;const u=!!s.ui?.widget;const d=s.type==="array"&&y&&!u;if(d){i.debug("[MetaUI CompactLayout]",`Routing property '${c}' to Table Sub-Layout.`,"CompactLayout");l.push({scope:p,meta:s,label:e.label})}else{i.debug("[MetaUI CompactLayout]",`Rendering scalar field '${p}'.`,"CompactLayout");this._renderScalarField(n,e,p,s,a,r)}}else{i.warn(`[MetaUI] Unsupported layout element type '${e.type}'.`,"","CompactLayout")}};t.uiLayout.forEach(p);l.forEach(e=>{try{const t={type:"array",title:e.label||e.meta.ui?.label||e.scope,items:e.meta.items||{type:"object",properties:{}},uiLayout:e.meta.items?.uiLayout};const o=r.generateLayout(t,a,`/${e.scope}`);if(o){o.addStyleClass("sapUiTinyMarginTop");n.addItem(o)}}catch(t){const a=t.message;i.error(`[MetaUI] Failed to render array field ${e.scope}`,a,"CompactLayout");i.showErrorPopup(`Failed to render array field '${e.scope}'.\n\nDetails: ${a}`)}});return n}_renderScalarField(a,r,o,s,n,l){try{const i=r.label||s.ui?.label||o;const p=new t({text:i,required:s.required});p.addStyleClass("sapUiTinyMarginTop");const c={...s};if(r.widget){c.ui={...s.ui,widget:r.widget}}const y=l.generateField(c,`/${o}`,n);y.addStyleClass("sapUiTinyMarginBottom");const u=new e({renderType:"Bare",items:[p,y]});a.addItem(u)}catch(e){const t=e.message;i.error(`[MetaUI] Failed to render field ${o}`,t,"CompactLayout");i.showErrorPopup(`Failed to render field '${o}'.\n\nDetails: ${t}`)}}}var n={__esModule:true};n.CompactLayout=s;return n});
2
2
  //# sourceMappingURL=CompactLayout.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CompactLayout.js","names":["Logger","___utils_Logger","CompactLayout","render","schema","modelName","engine","onSubmit","container","VBox","renderType","addStyleClass","uiLayout","Array","isArray","warn","tableElements","renderElement","element","type","label","title","sap","m","Title","text","level","addItem","elements","forEach","scope","startsWith","error","propKey","replace","meta","properties","isCollectionOfRecords","items","hasExplicitWidget","ui","widget","isSubLayout","debug","push","this","_renderScalarField","field","subSchema","control","generateLayout","msg","message","showErrorPopup","labelText","Label","required","effectiveMeta","generateField","fieldBox","__exports","__esModule"],"sources":["CompactLayout.ts"],"sourcesContent":["/**\n * @file CompactLayout.ts\n * @description Generates a lightweight, dense VBox layout for use inside tight spaces like table cells.\n */\n\nimport VBox from \"sap/m/VBox\";\nimport Label from \"sap/m/Label\";\nimport Title from \"sap/ui/core/Title\";\nimport { IPropertyMetadata, ISchema, ILayoutElement } from \"../interfaces/ISchema\";\nimport { ILayoutManager } from \"../interfaces/ILayoutManager\";\nimport { Engine } from \"../core/Engine\";\nimport { Logger } from \"../utils/Logger\";\nimport Control from \"sap/ui/core/Control\";\n\n/**\n * Layout Manager responsible for generating a dense, lightweight layout (no SimpleForm padding).\n * Ideal for rendering objects dynamically inside table cells or side-panels.\n * \n * @namespace nz.co.siliconst.ui5.metaui.layouts\n * @public\n */\nexport class CompactLayout implements ILayoutManager {\n /**\n * Renders the JSON Schema properties into a dense VBox layout.\n * \n * @param schema The active JSON schema subset.\n * @param modelName The bound UI5 model name.\n * @param engine The central orchestrator for delegating plugin generation.\n * @param onSubmit Optional submit hook.\n * @returns {Control} The VBox wrapper containing the generated compact form.\n */\n public render(schema: ISchema, modelName: string, engine: Engine, onSubmit?: () => void): Control {\n const container = new VBox({ renderType: \"Bare\" });\n container.addStyleClass(\"sapUiTinyMargin\");\n\n if (!schema.uiLayout || !Array.isArray(schema.uiLayout)) {\n Logger.warn(\"[MetaUI] Missing 'uiLayout' array in schema. CompactLayout will not render any fields.\");\n return container;\n }\n\n const tableElements: { scope: string, meta: IPropertyMetadata, label?: string }[] = [];\n\n // Recursively render layout elements\n const renderElement = (element: ILayoutElement) => {\n if (element.type === \"Group\") {\n if (element.label) {\n const title = new sap.m.Title({ text: element.label, level: \"H5\" });\n title.addStyleClass(\"sapUiTinyMarginTop sapUiTinyMarginBottom\");\n container.addItem(title);\n }\n \n if (element.elements && Array.isArray(element.elements)) {\n element.elements.forEach(renderElement);\n }\n } else if (element.type === \"Control\") {\n if (!element.scope || !element.scope.startsWith(\"#/properties/\")) {\n Logger.error(`[MetaUI] Invalid scope '${element.scope}' in uiLayout Control.`, \"\", \"CompactLayout\");\n return;\n }\n \n const propKey = element.scope.replace(\"#/properties/\", \"\");\n const meta = schema.properties?.[propKey];\n \n if (!meta) {\n Logger.error(`[MetaUI] Property '${propKey}' not found in schema definitions.`, \"\", \"CompactLayout\");\n return;\n }\n\n const isCollectionOfRecords = meta.items?.type === \"object\" || meta.items?.properties;\n const hasExplicitWidget = !!meta.ui?.widget;\n const isSubLayout = meta.type === \"array\" && isCollectionOfRecords && !hasExplicitWidget;\n\n if (isSubLayout) {\n Logger.debug(\"[MetaUI CompactLayout]\", `Routing property '${propKey}' to Table Sub-Layout.`, \"CompactLayout\");\n tableElements.push({ scope: propKey, meta, label: element.label });\n } else {\n Logger.debug(\"[MetaUI CompactLayout]\", `Rendering scalar field '${propKey}'.`, \"CompactLayout\");\n this._renderScalarField(container, element, propKey, meta, modelName, engine);\n }\n } else {\n Logger.warn(`[MetaUI] Unsupported layout element type '${element.type}'.`, \"\", \"CompactLayout\");\n }\n };\n\n // Render everything defined in the layout\n schema.uiLayout.forEach(renderElement);\n\n // Render array/table sub-layouts full width below the fields\n tableElements.forEach(field => {\n try {\n const subSchema = {\n type: \"array\",\n title: field.label || field.meta.ui?.label || field.scope,\n items: field.meta.items || { type: \"object\", properties: {} },\n uiLayout: field.meta.items?.uiLayout\n };\n \n const control = engine.generateLayout(subSchema as ISchema, modelName, `/${field.scope}`);\n if (control) {\n control.addStyleClass(\"sapUiTinyMarginTop\");\n container.addItem(control);\n }\n } catch (error) {\n const msg = (error as Error).message;\n Logger.error(`[MetaUI] Failed to render array field ${field.scope}`, msg, \"CompactLayout\");\n Logger.showErrorPopup(`Failed to render array field '${field.scope}'.\\n\\nDetails: ${msg}`);\n }\n });\n\n return container;\n }\n\n private _renderScalarField(container: VBox, element: ILayoutElement, propKey: string, meta: IPropertyMetadata, modelName: string, engine: Engine): void {\n try {\n const labelText = element.label || meta.ui?.label || propKey;\n const label = new Label({\n text: labelText,\n required: meta.required\n });\n label.addStyleClass(\"sapUiTinyMarginTop\");\n\n const effectiveMeta = { ...meta };\n if (element.widget) {\n effectiveMeta.ui = { ...meta.ui, widget: element.widget };\n }\n\n const control = engine.generateField(effectiveMeta, `/${propKey}`, modelName);\n control.addStyleClass(\"sapUiTinyMarginBottom\");\n\n // Wrap label and field tightly\n const fieldBox = new VBox({ renderType: \"Bare\", items: [label, control] });\n container.addItem(fieldBox);\n } catch (error) {\n const msg = (error as Error).message;\n Logger.error(`[MetaUI] Failed to render field ${propKey}`, msg, \"CompactLayout\");\n Logger.showErrorPopup(`Failed to render field '${propKey}'.\\n\\nDetails: ${msg}`);\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"CompactLayout.js","names":["SchemaNormalizer","___core_SchemaNormalizer","Logger","___utils_Logger","CompactLayout","render","schema","modelName","engine","onSubmit","container","VBox","renderType","addStyleClass","uiLayout","Array","isArray","warn","tableElements","renderElement","element","type","label","title","sap","m","Title","text","level","addItem","elements","forEach","scope","startsWith","error","meta","bindingPath","propKey","resolveScope","isCollectionOfRecords","items","properties","hasExplicitWidget","ui","widget","isSubLayout","debug","push","this","_renderScalarField","field","subSchema","control","generateLayout","msg","message","showErrorPopup","labelText","Label","required","effectiveMeta","generateField","fieldBox","__exports","__esModule"],"sources":["CompactLayout.ts"],"sourcesContent":["/**\n * @file CompactLayout.ts\n * @description Generates a lightweight, dense VBox layout for use inside tight spaces like table cells.\n */\n\nimport VBox from \"sap/m/VBox\";\nimport Label from \"sap/m/Label\";\nimport Title from \"sap/ui/core/Title\";\nimport { IPropertyMetadata, ISchema, ILayoutElement } from \"../interfaces/ISchema\";\nimport { ILayoutManager } from \"../interfaces/ILayoutManager\";\nimport { Engine } from \"../core/Engine\";\nimport { SchemaNormalizer } from \"../core/SchemaNormalizer\";\nimport { Logger } from \"../utils/Logger\";\nimport Control from \"sap/ui/core/Control\";\n\n/**\n * Layout Manager responsible for generating a dense, lightweight layout (no SimpleForm padding).\n * Ideal for rendering objects dynamically inside table cells or side-panels.\n * \n * @namespace nz.co.siliconst.ui5.metaui.layouts\n * @public\n */\nexport class CompactLayout implements ILayoutManager {\n /**\n * Renders the JSON Schema properties into a dense VBox layout.\n * \n * @param schema The active JSON schema subset.\n * @param modelName The bound UI5 model name.\n * @param engine The central orchestrator for delegating plugin generation.\n * @param onSubmit Optional submit hook.\n * @returns {Control} The VBox wrapper containing the generated compact form.\n */\n public render(schema: ISchema, modelName: string, engine: Engine, onSubmit?: () => void): Control {\n const container = new VBox({ renderType: \"Bare\" });\n container.addStyleClass(\"sapUiTinyMargin\");\n\n if (!schema.uiLayout || !Array.isArray(schema.uiLayout)) {\n Logger.warn(\"[MetaUI] Missing 'uiLayout' array in schema. CompactLayout will not render any fields.\");\n return container;\n }\n\n const tableElements: { scope: string, meta: IPropertyMetadata, label?: string }[] = [];\n\n // Recursively render layout elements\n const renderElement = (element: ILayoutElement) => {\n if (element.type === \"Group\") {\n if (element.label) {\n const title = new sap.m.Title({ text: element.label, level: \"H5\" });\n title.addStyleClass(\"sapUiTinyMarginTop sapUiTinyMarginBottom\");\n container.addItem(title);\n }\n \n if (element.elements && Array.isArray(element.elements)) {\n element.elements.forEach(renderElement);\n }\n } else if (element.type === \"Control\") {\n if (!element.scope || !element.scope.startsWith(\"#/properties/\")) {\n Logger.error(`[MetaUI] Invalid scope '${element.scope}' in uiLayout Control.`, \"\", \"CompactLayout\");\n return;\n }\n \n const { meta, bindingPath, propKey } = SchemaNormalizer.resolveScope(schema, element.scope);\n \n if (!meta) {\n Logger.error(`[MetaUI] Property '${propKey}' not found in schema definitions.`, \"\", \"CompactLayout\");\n return;\n }\n\n const isCollectionOfRecords = meta.items?.type === \"object\" || meta.items?.properties;\n const hasExplicitWidget = !!meta.ui?.widget;\n const isSubLayout = meta.type === \"array\" && isCollectionOfRecords && !hasExplicitWidget;\n\n if (isSubLayout) {\n Logger.debug(\"[MetaUI CompactLayout]\", `Routing property '${propKey}' to Table Sub-Layout.`, \"CompactLayout\");\n tableElements.push({ scope: bindingPath, meta, label: element.label });\n } else {\n Logger.debug(\"[MetaUI CompactLayout]\", `Rendering scalar field '${bindingPath}'.`, \"CompactLayout\");\n this._renderScalarField(container, element, bindingPath, meta, modelName, engine);\n }\n } else {\n Logger.warn(`[MetaUI] Unsupported layout element type '${element.type}'.`, \"\", \"CompactLayout\");\n }\n };\n\n // Render everything defined in the layout\n schema.uiLayout.forEach(renderElement);\n\n // Render array/table sub-layouts full width below the fields\n tableElements.forEach(field => {\n try {\n const subSchema = {\n type: \"array\",\n title: field.label || field.meta.ui?.label || field.scope,\n items: field.meta.items || { type: \"object\", properties: {} },\n uiLayout: field.meta.items?.uiLayout\n };\n \n const control = engine.generateLayout(subSchema as ISchema, modelName, `/${field.scope}`);\n if (control) {\n control.addStyleClass(\"sapUiTinyMarginTop\");\n container.addItem(control);\n }\n } catch (error) {\n const msg = (error as Error).message;\n Logger.error(`[MetaUI] Failed to render array field ${field.scope}`, msg, \"CompactLayout\");\n Logger.showErrorPopup(`Failed to render array field '${field.scope}'.\\n\\nDetails: ${msg}`);\n }\n });\n\n return container;\n }\n\n private _renderScalarField(container: VBox, element: ILayoutElement, propKey: string, meta: IPropertyMetadata, modelName: string, engine: Engine): void {\n try {\n const labelText = element.label || meta.ui?.label || propKey;\n const label = new Label({\n text: labelText,\n required: meta.required\n });\n label.addStyleClass(\"sapUiTinyMarginTop\");\n\n const effectiveMeta = { ...meta };\n if (element.widget) {\n effectiveMeta.ui = { ...meta.ui, widget: element.widget };\n }\n\n const control = engine.generateField(effectiveMeta, `/${propKey}`, modelName);\n control.addStyleClass(\"sapUiTinyMarginBottom\");\n\n // Wrap label and field tightly\n const fieldBox = new VBox({ renderType: \"Bare\", items: [label, control] });\n container.addItem(fieldBox);\n } catch (error) {\n const msg = (error as Error).message;\n Logger.error(`[MetaUI] Failed to render field ${propKey}`, msg, \"CompactLayout\");\n Logger.showErrorPopup(`Failed to render field '${propKey}'.\\n\\nDetails: ${msg}`);\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -9,6 +9,7 @@ import Title from "sap/ui/core/Title";
9
9
  import { IPropertyMetadata, ISchema, ILayoutElement } from "../interfaces/ISchema";
10
10
  import { ILayoutManager } from "../interfaces/ILayoutManager";
11
11
  import { Engine } from "../core/Engine";
12
+ import { SchemaNormalizer } from "../core/SchemaNormalizer";
12
13
  import { Logger } from "../utils/Logger";
13
14
  import Control from "sap/ui/core/Control";
14
15
 
@@ -58,8 +59,7 @@ export class CompactLayout implements ILayoutManager {
58
59
  return;
59
60
  }
60
61
 
61
- const propKey = element.scope.replace("#/properties/", "");
62
- const meta = schema.properties?.[propKey];
62
+ const { meta, bindingPath, propKey } = SchemaNormalizer.resolveScope(schema, element.scope);
63
63
 
64
64
  if (!meta) {
65
65
  Logger.error(`[MetaUI] Property '${propKey}' not found in schema definitions.`, "", "CompactLayout");
@@ -72,10 +72,10 @@ export class CompactLayout implements ILayoutManager {
72
72
 
73
73
  if (isSubLayout) {
74
74
  Logger.debug("[MetaUI CompactLayout]", `Routing property '${propKey}' to Table Sub-Layout.`, "CompactLayout");
75
- tableElements.push({ scope: propKey, meta, label: element.label });
75
+ tableElements.push({ scope: bindingPath, meta, label: element.label });
76
76
  } else {
77
- Logger.debug("[MetaUI CompactLayout]", `Rendering scalar field '${propKey}'.`, "CompactLayout");
78
- this._renderScalarField(container, element, propKey, meta, modelName, engine);
77
+ Logger.debug("[MetaUI CompactLayout]", `Rendering scalar field '${bindingPath}'.`, "CompactLayout");
78
+ this._renderScalarField(container, element, bindingPath, meta, modelName, engine);
79
79
  }
80
80
  } else {
81
81
  Logger.warn(`[MetaUI] Unsupported layout element type '${element.type}'.`, "", "CompactLayout");