@siliconst/metaui 1.4.5 → 1.4.7

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 (329) hide show
  1. package/package.json +1 -1
  2. package/src/nz/co/siliconst/ui5/metaui/controls/CameraControl-dbg.js +13 -0
  3. package/src/nz/co/siliconst/ui5/metaui/controls/CameraControl-dbg.js.map +1 -1
  4. package/src/nz/co/siliconst/ui5/metaui/controls/CameraControl.d.ts +10 -0
  5. package/src/nz/co/siliconst/ui5/metaui/controls/CameraControl.d.ts.map +1 -1
  6. package/src/nz/co/siliconst/ui5/metaui/controls/CameraControl.js.map +1 -1
  7. package/src/nz/co/siliconst/ui5/metaui/controls/CameraControl.ts +10 -0
  8. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost-dbg.js +49 -6
  9. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost-dbg.js.map +1 -1
  10. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.d.ts +48 -5
  11. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.d.ts.map +1 -1
  12. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.js +1 -1
  13. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.js.map +1 -1
  14. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.ts +49 -5
  15. package/src/nz/co/siliconst/ui5/metaui/controls/GeolocationControl-dbg.js +32 -1
  16. package/src/nz/co/siliconst/ui5/metaui/controls/GeolocationControl-dbg.js.map +1 -1
  17. package/src/nz/co/siliconst/ui5/metaui/controls/GeolocationControl.d.ts +7 -0
  18. package/src/nz/co/siliconst/ui5/metaui/controls/GeolocationControl.d.ts.map +1 -1
  19. package/src/nz/co/siliconst/ui5/metaui/controls/GeolocationControl.js +1 -1
  20. package/src/nz/co/siliconst/ui5/metaui/controls/GeolocationControl.js.map +1 -1
  21. package/src/nz/co/siliconst/ui5/metaui/controls/GeolocationControl.ts +11 -1
  22. package/src/nz/co/siliconst/ui5/metaui/controls/RichTextControl-dbg.js +20 -0
  23. package/src/nz/co/siliconst/ui5/metaui/controls/RichTextControl-dbg.js.map +1 -1
  24. package/src/nz/co/siliconst/ui5/metaui/controls/RichTextControl.d.ts +12 -0
  25. package/src/nz/co/siliconst/ui5/metaui/controls/RichTextControl.d.ts.map +1 -1
  26. package/src/nz/co/siliconst/ui5/metaui/controls/RichTextControl.js +1 -1
  27. package/src/nz/co/siliconst/ui5/metaui/controls/RichTextControl.js.map +1 -1
  28. package/src/nz/co/siliconst/ui5/metaui/controls/RichTextControl.ts +21 -0
  29. package/src/nz/co/siliconst/ui5/metaui/controls/SignatureControl-dbg.js +9 -0
  30. package/src/nz/co/siliconst/ui5/metaui/controls/SignatureControl-dbg.js.map +1 -1
  31. package/src/nz/co/siliconst/ui5/metaui/controls/SignatureControl.d.ts +7 -0
  32. package/src/nz/co/siliconst/ui5/metaui/controls/SignatureControl.d.ts.map +1 -1
  33. package/src/nz/co/siliconst/ui5/metaui/controls/SignatureControl.js.map +1 -1
  34. package/src/nz/co/siliconst/ui5/metaui/controls/SignatureControl.ts +7 -0
  35. package/src/nz/co/siliconst/ui5/metaui/controls/VoiceInputControl-dbg.js +13 -0
  36. package/src/nz/co/siliconst/ui5/metaui/controls/VoiceInputControl-dbg.js.map +1 -1
  37. package/src/nz/co/siliconst/ui5/metaui/controls/VoiceInputControl.d.ts +10 -0
  38. package/src/nz/co/siliconst/ui5/metaui/controls/VoiceInputControl.d.ts.map +1 -1
  39. package/src/nz/co/siliconst/ui5/metaui/controls/VoiceInputControl.js.map +1 -1
  40. package/src/nz/co/siliconst/ui5/metaui/controls/VoiceInputControl.ts +10 -0
  41. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost-dbg.js +46 -10
  42. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost-dbg.js.map +1 -1
  43. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.d.ts +17 -5
  44. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.d.ts.map +1 -1
  45. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.js +1 -1
  46. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.js.map +1 -1
  47. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.ts +48 -8
  48. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate-dbg.js +5 -0
  49. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate-dbg.js.map +1 -1
  50. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate.d.ts +4 -0
  51. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate.d.ts.map +1 -1
  52. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate.js.map +1 -1
  53. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate.ts +4 -0
  54. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DialogDelegate-dbg.js +4 -0
  55. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DialogDelegate-dbg.js.map +1 -1
  56. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DialogDelegate.d.ts +4 -0
  57. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DialogDelegate.d.ts.map +1 -1
  58. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DialogDelegate.js.map +1 -1
  59. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DialogDelegate.ts +4 -0
  60. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate-dbg.js +4 -0
  61. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate-dbg.js.map +1 -1
  62. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate.d.ts +4 -0
  63. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate.d.ts.map +1 -1
  64. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate.js.map +1 -1
  65. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate.ts +4 -0
  66. package/src/nz/co/siliconst/ui5/metaui/core/DefaultLayoutGenerator-dbg.js +45 -12
  67. package/src/nz/co/siliconst/ui5/metaui/core/DefaultLayoutGenerator-dbg.js.map +1 -1
  68. package/src/nz/co/siliconst/ui5/metaui/core/DefaultLayoutGenerator.d.ts +6 -0
  69. package/src/nz/co/siliconst/ui5/metaui/core/DefaultLayoutGenerator.d.ts.map +1 -1
  70. package/src/nz/co/siliconst/ui5/metaui/core/DefaultLayoutGenerator.js +1 -1
  71. package/src/nz/co/siliconst/ui5/metaui/core/DefaultLayoutGenerator.js.map +1 -1
  72. package/src/nz/co/siliconst/ui5/metaui/core/DefaultLayoutGenerator.ts +25 -12
  73. package/src/nz/co/siliconst/ui5/metaui/core/Engine-dbg.js +30 -17
  74. package/src/nz/co/siliconst/ui5/metaui/core/Engine-dbg.js.map +1 -1
  75. package/src/nz/co/siliconst/ui5/metaui/core/Engine.d.ts +8 -8
  76. package/src/nz/co/siliconst/ui5/metaui/core/Engine.d.ts.map +1 -1
  77. package/src/nz/co/siliconst/ui5/metaui/core/Engine.js +1 -1
  78. package/src/nz/co/siliconst/ui5/metaui/core/Engine.js.map +1 -1
  79. package/src/nz/co/siliconst/ui5/metaui/core/Engine.ts +39 -32
  80. package/src/nz/co/siliconst/ui5/metaui/core/PipelineManager-dbg.js +17 -3
  81. package/src/nz/co/siliconst/ui5/metaui/core/PipelineManager-dbg.js.map +1 -1
  82. package/src/nz/co/siliconst/ui5/metaui/core/PipelineManager.d.ts +4 -0
  83. package/src/nz/co/siliconst/ui5/metaui/core/PipelineManager.d.ts.map +1 -1
  84. package/src/nz/co/siliconst/ui5/metaui/core/PipelineManager.js +1 -1
  85. package/src/nz/co/siliconst/ui5/metaui/core/PipelineManager.js.map +1 -1
  86. package/src/nz/co/siliconst/ui5/metaui/core/PipelineManager.ts +13 -3
  87. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry-dbg.js +158 -106
  88. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry-dbg.js.map +1 -1
  89. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry.d.ts +25 -26
  90. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry.d.ts.map +1 -1
  91. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry.js +1 -1
  92. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry.js.map +1 -1
  93. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry.ts +176 -113
  94. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer-dbg.js +26 -0
  95. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer-dbg.js.map +1 -1
  96. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.d.ts +22 -0
  97. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.d.ts.map +1 -1
  98. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.js.map +1 -1
  99. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.ts +22 -0
  100. package/src/nz/co/siliconst/ui5/metaui/core/StateManager-dbg.js +6 -0
  101. package/src/nz/co/siliconst/ui5/metaui/core/StateManager-dbg.js.map +1 -1
  102. package/src/nz/co/siliconst/ui5/metaui/core/StateManager.d.ts +5 -0
  103. package/src/nz/co/siliconst/ui5/metaui/core/StateManager.d.ts.map +1 -1
  104. package/src/nz/co/siliconst/ui5/metaui/core/StateManager.js.map +1 -1
  105. package/src/nz/co/siliconst/ui5/metaui/core/StateManager.ts +5 -0
  106. package/src/nz/co/siliconst/ui5/metaui/interfaces/IPlugin-dbg.js.map +1 -1
  107. package/src/nz/co/siliconst/ui5/metaui/interfaces/IPlugin.d.ts +3 -3
  108. package/src/nz/co/siliconst/ui5/metaui/interfaces/IPlugin.d.ts.map +1 -1
  109. package/src/nz/co/siliconst/ui5/metaui/interfaces/IPlugin.ts +3 -3
  110. package/src/nz/co/siliconst/ui5/metaui/layouts/CompactLayout-dbg.js +10 -0
  111. package/src/nz/co/siliconst/ui5/metaui/layouts/CompactLayout-dbg.js.map +1 -1
  112. package/src/nz/co/siliconst/ui5/metaui/layouts/CompactLayout.d.ts +9 -0
  113. package/src/nz/co/siliconst/ui5/metaui/layouts/CompactLayout.d.ts.map +1 -1
  114. package/src/nz/co/siliconst/ui5/metaui/layouts/CompactLayout.js.map +1 -1
  115. package/src/nz/co/siliconst/ui5/metaui/layouts/CompactLayout.ts +9 -0
  116. package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout-dbg.js +10 -0
  117. package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout-dbg.js.map +1 -1
  118. package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout.d.ts +9 -0
  119. package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout.d.ts.map +1 -1
  120. package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout.js.map +1 -1
  121. package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout.ts +9 -0
  122. package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout-dbg.js +2 -2
  123. package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout-dbg.js.map +1 -1
  124. package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout.js +1 -1
  125. package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout.js.map +1 -1
  126. package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout.ts +2 -2
  127. package/src/nz/co/siliconst/ui5/metaui/layouts/WizardLayout-dbg.js +9 -0
  128. package/src/nz/co/siliconst/ui5/metaui/layouts/WizardLayout-dbg.js.map +1 -1
  129. package/src/nz/co/siliconst/ui5/metaui/layouts/WizardLayout.d.ts +8 -0
  130. package/src/nz/co/siliconst/ui5/metaui/layouts/WizardLayout.d.ts.map +1 -1
  131. package/src/nz/co/siliconst/ui5/metaui/layouts/WizardLayout.js.map +1 -1
  132. package/src/nz/co/siliconst/ui5/metaui/layouts/WizardLayout.ts +8 -0
  133. package/src/nz/co/siliconst/ui5/metaui/library-dbg.js +2 -32
  134. package/src/nz/co/siliconst/ui5/metaui/library-dbg.js.map +1 -1
  135. package/src/nz/co/siliconst/ui5/metaui/library-preload.js +36 -37
  136. package/src/nz/co/siliconst/ui5/metaui/library-preload.js.map +1 -1
  137. package/src/nz/co/siliconst/ui5/metaui/library.d.ts +0 -6
  138. package/src/nz/co/siliconst/ui5/metaui/library.d.ts.map +1 -1
  139. package/src/nz/co/siliconst/ui5/metaui/library.js +1 -1
  140. package/src/nz/co/siliconst/ui5/metaui/library.js.map +1 -1
  141. package/src/nz/co/siliconst/ui5/metaui/library.ts +0 -33
  142. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/ClearFormActionPlugin-dbg.js +2 -2
  143. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/ClearFormActionPlugin-dbg.js.map +1 -1
  144. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/ClearFormActionPlugin.js +1 -1
  145. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/ClearFormActionPlugin.js.map +1 -1
  146. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/ClearFormActionPlugin.ts +2 -2
  147. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/SubmitFormActionPlugin-dbg.js +2 -2
  148. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/SubmitFormActionPlugin-dbg.js.map +1 -1
  149. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/SubmitFormActionPlugin.js +1 -1
  150. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/SubmitFormActionPlugin.js.map +1 -1
  151. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/SubmitFormActionPlugin.ts +2 -2
  152. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin-dbg.js +23 -5
  153. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin-dbg.js.map +1 -1
  154. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin.d.ts +16 -0
  155. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin.d.ts.map +1 -1
  156. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin.js +1 -1
  157. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin.js.map +1 -1
  158. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin.ts +21 -5
  159. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin-dbg.js +21 -2
  160. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin-dbg.js.map +1 -1
  161. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin.d.ts +17 -0
  162. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin.d.ts.map +1 -1
  163. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin.js +1 -1
  164. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin.js.map +1 -1
  165. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin.ts +19 -2
  166. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin-dbg.js +6 -6
  167. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin-dbg.js.map +1 -1
  168. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.d.ts +5 -5
  169. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.d.ts.map +1 -1
  170. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.js +1 -1
  171. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.js.map +1 -1
  172. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.ts +6 -6
  173. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin-dbg.js +3 -2
  174. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin-dbg.js.map +1 -1
  175. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin.d.ts.map +1 -1
  176. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin.js +1 -1
  177. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin.js.map +1 -1
  178. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin.ts +4 -2
  179. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin-dbg.js +21 -2
  180. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin-dbg.js.map +1 -1
  181. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin.d.ts +17 -0
  182. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin.d.ts.map +1 -1
  183. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin.js +1 -1
  184. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin.js.map +1 -1
  185. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin.ts +19 -2
  186. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin-dbg.js +31 -2
  187. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin-dbg.js.map +1 -1
  188. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin.d.ts +25 -0
  189. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin.d.ts.map +1 -1
  190. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin.js +1 -1
  191. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin.js.map +1 -1
  192. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin.ts +27 -2
  193. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin-dbg.js +21 -2
  194. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin-dbg.js.map +1 -1
  195. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin.d.ts +17 -0
  196. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin.d.ts.map +1 -1
  197. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin.js +1 -1
  198. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin.js.map +1 -1
  199. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin.ts +19 -2
  200. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin-dbg.js +21 -2
  201. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin-dbg.js.map +1 -1
  202. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin.d.ts +17 -0
  203. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin.d.ts.map +1 -1
  204. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin.js +1 -1
  205. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin.js.map +1 -1
  206. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin.ts +19 -2
  207. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin-dbg.js +4 -2
  208. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin-dbg.js.map +1 -1
  209. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin.d.ts +2 -0
  210. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin.d.ts.map +1 -1
  211. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin.js +1 -1
  212. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin.js.map +1 -1
  213. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin.ts +4 -2
  214. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin-dbg.js +21 -2
  215. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin-dbg.js.map +1 -1
  216. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin.d.ts +17 -0
  217. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin.d.ts.map +1 -1
  218. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin.js +1 -1
  219. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin.js.map +1 -1
  220. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin.ts +19 -2
  221. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin-dbg.js +21 -2
  222. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin-dbg.js.map +1 -1
  223. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin.d.ts +17 -0
  224. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin.d.ts.map +1 -1
  225. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin.js +1 -1
  226. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin.js.map +1 -1
  227. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin.ts +19 -2
  228. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MessageStripPlugin-dbg.js +18 -0
  229. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MessageStripPlugin-dbg.js.map +1 -1
  230. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MessageStripPlugin.d.ts +16 -0
  231. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MessageStripPlugin.d.ts.map +1 -1
  232. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MessageStripPlugin.js.map +1 -1
  233. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MessageStripPlugin.ts +16 -0
  234. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin-dbg.js +21 -2
  235. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin-dbg.js.map +1 -1
  236. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin.d.ts +17 -0
  237. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin.d.ts.map +1 -1
  238. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin.js +1 -1
  239. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin.js.map +1 -1
  240. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin.ts +19 -2
  241. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin-dbg.js +21 -2
  242. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin-dbg.js.map +1 -1
  243. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin.d.ts +17 -0
  244. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin.d.ts.map +1 -1
  245. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin.js +1 -1
  246. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin.js.map +1 -1
  247. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin.ts +19 -2
  248. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin-dbg.js +28 -5
  249. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin-dbg.js.map +1 -1
  250. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin.d.ts +20 -0
  251. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin.d.ts.map +1 -1
  252. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin.js +1 -1
  253. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin.js.map +1 -1
  254. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin.ts +25 -5
  255. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin-dbg.js +21 -2
  256. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin-dbg.js.map +1 -1
  257. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin.d.ts +17 -0
  258. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin.d.ts.map +1 -1
  259. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin.js +1 -1
  260. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin.js.map +1 -1
  261. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin.ts +19 -2
  262. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin-dbg.js +21 -2
  263. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin-dbg.js.map +1 -1
  264. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin.d.ts +17 -0
  265. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin.d.ts.map +1 -1
  266. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin.js +1 -1
  267. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin.js.map +1 -1
  268. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin.ts +19 -2
  269. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin-dbg.js +21 -2
  270. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin-dbg.js.map +1 -1
  271. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin.d.ts +17 -0
  272. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin.d.ts.map +1 -1
  273. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin.js +1 -1
  274. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin.js.map +1 -1
  275. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin.ts +19 -2
  276. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin-dbg.js +21 -2
  277. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin-dbg.js.map +1 -1
  278. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin.d.ts +17 -0
  279. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin.d.ts.map +1 -1
  280. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin.js +1 -1
  281. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin.js.map +1 -1
  282. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin.ts +19 -2
  283. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin-dbg.js +4 -2
  284. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin-dbg.js.map +1 -1
  285. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin.d.ts +2 -0
  286. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin.d.ts.map +1 -1
  287. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin.js +1 -1
  288. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin.js.map +1 -1
  289. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin.ts +4 -2
  290. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin-dbg.js +21 -2
  291. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin-dbg.js.map +1 -1
  292. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin.d.ts +17 -0
  293. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin.d.ts.map +1 -1
  294. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin.js +1 -1
  295. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin.js.map +1 -1
  296. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin.ts +19 -2
  297. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin-dbg.js +21 -2
  298. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin-dbg.js.map +1 -1
  299. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin.d.ts +17 -0
  300. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin.d.ts.map +1 -1
  301. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin.js +1 -1
  302. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin.js.map +1 -1
  303. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin.ts +19 -2
  304. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin-dbg.js +21 -2
  305. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin-dbg.js.map +1 -1
  306. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin.d.ts +17 -0
  307. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin.d.ts.map +1 -1
  308. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin.js +1 -1
  309. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin.js.map +1 -1
  310. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin.ts +19 -2
  311. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin-dbg.js +21 -2
  312. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin-dbg.js.map +1 -1
  313. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin.d.ts +17 -0
  314. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin.d.ts.map +1 -1
  315. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin.js +1 -1
  316. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin.js.map +1 -1
  317. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin.ts +19 -2
  318. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteDropdownPlugin-dbg.js +2 -2
  319. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteDropdownPlugin-dbg.js.map +1 -1
  320. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteDropdownPlugin.js +1 -1
  321. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteDropdownPlugin.js.map +1 -1
  322. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteDropdownPlugin.ts +2 -2
  323. package/src/nz/co/siliconst/ui5/metaui/core/LayoutRegistry-dbg.js +0 -32
  324. package/src/nz/co/siliconst/ui5/metaui/core/LayoutRegistry-dbg.js.map +0 -1
  325. package/src/nz/co/siliconst/ui5/metaui/core/LayoutRegistry.d.ts +0 -16
  326. package/src/nz/co/siliconst/ui5/metaui/core/LayoutRegistry.d.ts.map +0 -1
  327. package/src/nz/co/siliconst/ui5/metaui/core/LayoutRegistry.js +0 -2
  328. package/src/nz/co/siliconst/ui5/metaui/core/LayoutRegistry.js.map +0 -1
  329. package/src/nz/co/siliconst/ui5/metaui/core/LayoutRegistry.ts +0 -26
@@ -1 +1 @@
1
- {"version":3,"file":"SignatureControl-dbg.js","names":["BaseHardwareControl","_interopRequireDefault","__BaseHardwareControl","SignatureControl","renderer","metadata","properties","events","isDrawing","canvasCtx","canvasEl","init","canvasHtml","HTML","content","afterRendering","onCanvasRendered","bind","addStyleClass","clearBtn","Button","icon","text","press","clearSignature","vBox","VBox","items","setAggregation","domRef","getDomRef","getContext","lineWidth","lineCap","strokeStyle","addEventListener","startDrawing","draw","stopDrawing","startDrawingTouch","passive","drawTouch","val","getValue","startsWith","loadImageOntoCanvas","dataUrl","img","window","Image","onload","clearRect","width","height","drawImage","src","getCoordinates","e","x","y","rect","getBoundingClientRect","clientX","clientY","type","touches","left","top","preventDefault","pos","lineTo","stroke","beginPath","moveTo","saveSignature","setValueAndFire","MessageToast","show","toDataURL","setValue","value"],"sources":["SignatureControl.ts"],"sourcesContent":["import BaseHardwareControl from \"./BaseHardwareControl\";\nimport Button from \"sap/m/Button\";\nimport VBox from \"sap/m/VBox\";\nimport HTML from \"sap/ui/core/HTML\";\nimport MessageToast from \"sap/m/MessageToast\";\n\n/**\n * SignatureControl\n * Provides an HTML5 Canvas for capturing signatures.\n */\nexport default class SignatureControl extends BaseHardwareControl {\n static readonly renderer = \"nz.co.siliconst.ui5.metaui.controls.BaseHardwareControlRenderer\";\n static readonly metadata = {\n properties: {},\n events: {}\n };\n\n private vBox!: VBox;\n private clearBtn!: Button;\n private canvasHtml!: HTML;\n private isDrawing = false;\n private canvasCtx: CanvasRenderingContext2D | null = null;\n private canvasEl: HTMLCanvasElement | null = null;\n\n public init(): void {\n super.init();\n\n this.canvasHtml = new HTML({\n content: \"<canvas width='400' height='200' style='border: 1px solid #ccc; background-color: #fff; touch-action: none; cursor: crosshair;'></canvas>\",\n afterRendering: this.onCanvasRendered.bind(this)\n }).addStyleClass(\"sapUiSmallMarginBottom\");\n\n this.clearBtn = new Button({\n icon: \"sap-icon://sys-cancel\",\n text: \"Clear Signature\",\n press: this.clearSignature.bind(this)\n });\n\n this.vBox = new VBox({\n items: [this.canvasHtml, this.clearBtn]\n });\n\n this.setAggregation(\"_content\", this.vBox);\n }\n\n private onCanvasRendered(): void {\n const domRef = this.canvasHtml.getDomRef() as HTMLElement;\n if (!domRef) return;\n \n this.canvasEl = domRef as HTMLCanvasElement;\n this.canvasCtx = this.canvasEl.getContext(\"2d\");\n if (this.canvasCtx) {\n this.canvasCtx.lineWidth = 2;\n this.canvasCtx.lineCap = \"round\";\n this.canvasCtx.strokeStyle = \"#000\";\n }\n\n // Mouse events\n this.canvasEl.addEventListener(\"mousedown\", this.startDrawing.bind(this));\n this.canvasEl.addEventListener(\"mousemove\", this.draw.bind(this));\n this.canvasEl.addEventListener(\"mouseup\", this.stopDrawing.bind(this));\n this.canvasEl.addEventListener(\"mouseout\", this.stopDrawing.bind(this));\n \n // Touch events\n this.canvasEl.addEventListener(\"touchstart\", this.startDrawingTouch.bind(this), { passive: false });\n this.canvasEl.addEventListener(\"touchmove\", this.drawTouch.bind(this), { passive: false });\n this.canvasEl.addEventListener(\"touchend\", this.stopDrawing.bind(this));\n\n // Restore existing signature if any\n const val = this.getValue();\n if (val && typeof val === \"string\" && val.startsWith(\"data:image\")) {\n this.loadImageOntoCanvas(val);\n }\n }\n\n private loadImageOntoCanvas(dataUrl: string): void {\n const img = new window.Image();\n img.onload = () => {\n if (this.canvasCtx && this.canvasEl) {\n this.canvasCtx.clearRect(0, 0, this.canvasEl.width, this.canvasEl.height);\n this.canvasCtx.drawImage(img, 0, 0, this.canvasEl.width, this.canvasEl.height);\n }\n };\n img.src = dataUrl;\n }\n\n private getCoordinates(e: MouseEvent | TouchEvent): { x: number, y: number } {\n if (!this.canvasEl) return { x: 0, y: 0 };\n const rect = this.canvasEl.getBoundingClientRect();\n \n let clientX, clientY;\n if (e.type.startsWith(\"touch\")) {\n clientX = (e as TouchEvent).touches[0].clientX;\n clientY = (e as TouchEvent).touches[0].clientY;\n } else {\n clientX = (e as MouseEvent).clientX;\n clientY = (e as MouseEvent).clientY;\n }\n \n return {\n x: clientX - rect.left,\n y: clientY - rect.top\n };\n }\n\n private startDrawing(e: MouseEvent): void {\n this.isDrawing = true;\n this.draw(e);\n }\n\n private startDrawingTouch(e: TouchEvent): void {\n e.preventDefault(); // Prevent scrolling\n this.isDrawing = true;\n this.drawTouch(e);\n }\n\n private draw(e: MouseEvent): void {\n if (!this.isDrawing || !this.canvasCtx) return;\n const pos = this.getCoordinates(e);\n this.canvasCtx.lineTo(pos.x, pos.y);\n this.canvasCtx.stroke();\n this.canvasCtx.beginPath();\n this.canvasCtx.moveTo(pos.x, pos.y);\n }\n\n private drawTouch(e: TouchEvent): void {\n if (!this.isDrawing || !this.canvasCtx) return;\n e.preventDefault(); // Prevent scrolling\n const pos = this.getCoordinates(e);\n this.canvasCtx.lineTo(pos.x, pos.y);\n this.canvasCtx.stroke();\n this.canvasCtx.beginPath();\n this.canvasCtx.moveTo(pos.x, pos.y);\n }\n\n private stopDrawing(): void {\n if (!this.isDrawing) return;\n this.isDrawing = false;\n if (this.canvasCtx) {\n this.canvasCtx.beginPath(); // Reset path\n this.saveSignature();\n }\n }\n\n private clearSignature(): void {\n if (this.canvasCtx && this.canvasEl) {\n this.canvasCtx.clearRect(0, 0, this.canvasEl.width, this.canvasEl.height);\n }\n this.setValueAndFire(null);\n MessageToast.show(\"Signature cleared.\");\n }\n\n private saveSignature(): void {\n if (this.canvasEl) {\n const dataUrl = this.canvasEl.toDataURL(\"image/png\");\n this.setValueAndFire(dataUrl);\n }\n }\n\n public setValue(value: any): this {\n super.setValue(value);\n if (value && typeof value === \"string\" && value.startsWith(\"data:image\")) {\n this.loadImageOntoCanvas(value);\n } else if (!value && this.canvasCtx && this.canvasEl) {\n this.canvasCtx.clearRect(0, 0, this.canvasEl.width, this.canvasEl.height);\n }\n return this;\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"SignatureControl-dbg.js","names":["BaseHardwareControl","_interopRequireDefault","__BaseHardwareControl","SignatureControl","renderer","metadata","properties","events","isDrawing","canvasCtx","canvasEl","init","canvasHtml","HTML","content","afterRendering","onCanvasRendered","bind","addStyleClass","clearBtn","Button","icon","text","press","clearSignature","vBox","VBox","items","setAggregation","domRef","getDomRef","getContext","lineWidth","lineCap","strokeStyle","addEventListener","startDrawing","draw","stopDrawing","startDrawingTouch","passive","drawTouch","val","getValue","startsWith","loadImageOntoCanvas","dataUrl","img","window","Image","onload","clearRect","width","height","drawImage","src","getCoordinates","e","x","y","rect","getBoundingClientRect","clientX","clientY","type","touches","left","top","preventDefault","pos","lineTo","stroke","beginPath","moveTo","saveSignature","setValueAndFire","MessageToast","show","toDataURL","setValue","value"],"sources":["SignatureControl.ts"],"sourcesContent":["import BaseHardwareControl from \"./BaseHardwareControl\";\nimport Button from \"sap/m/Button\";\nimport VBox from \"sap/m/VBox\";\nimport HTML from \"sap/ui/core/HTML\";\nimport MessageToast from \"sap/m/MessageToast\";\n\n/**\n * SignatureControl\n * Provides an HTML5 Canvas for capturing signatures.\n */\nexport default class SignatureControl extends BaseHardwareControl {\n static readonly renderer = \"nz.co.siliconst.ui5.metaui.controls.BaseHardwareControlRenderer\";\n static readonly metadata = {\n properties: {},\n events: {}\n };\n\n private vBox!: VBox;\n private clearBtn!: Button;\n private canvasHtml!: HTML;\n private isDrawing = false;\n private canvasCtx: CanvasRenderingContext2D | null = null;\n private canvasEl: HTMLCanvasElement | null = null;\n\n /**\n * Initializes the control and builds the canvas drawing surface.\n */\n public init(): void {\n super.init();\n\n this.canvasHtml = new HTML({\n content: \"<canvas width='400' height='200' style='border: 1px solid #ccc; background-color: #fff; touch-action: none; cursor: crosshair;'></canvas>\",\n afterRendering: this.onCanvasRendered.bind(this)\n }).addStyleClass(\"sapUiSmallMarginBottom\");\n\n this.clearBtn = new Button({\n icon: \"sap-icon://sys-cancel\",\n text: \"Clear Signature\",\n press: this.clearSignature.bind(this)\n });\n\n this.vBox = new VBox({\n items: [this.canvasHtml, this.clearBtn]\n });\n\n this.setAggregation(\"_content\", this.vBox);\n }\n\n private onCanvasRendered(): void {\n const domRef = this.canvasHtml.getDomRef() as HTMLElement;\n if (!domRef) return;\n \n this.canvasEl = domRef as HTMLCanvasElement;\n this.canvasCtx = this.canvasEl.getContext(\"2d\");\n if (this.canvasCtx) {\n this.canvasCtx.lineWidth = 2;\n this.canvasCtx.lineCap = \"round\";\n this.canvasCtx.strokeStyle = \"#000\";\n }\n\n // Mouse events\n this.canvasEl.addEventListener(\"mousedown\", this.startDrawing.bind(this));\n this.canvasEl.addEventListener(\"mousemove\", this.draw.bind(this));\n this.canvasEl.addEventListener(\"mouseup\", this.stopDrawing.bind(this));\n this.canvasEl.addEventListener(\"mouseout\", this.stopDrawing.bind(this));\n \n // Touch events\n this.canvasEl.addEventListener(\"touchstart\", this.startDrawingTouch.bind(this), { passive: false });\n this.canvasEl.addEventListener(\"touchmove\", this.drawTouch.bind(this), { passive: false });\n this.canvasEl.addEventListener(\"touchend\", this.stopDrawing.bind(this));\n\n // Restore existing signature if any\n const val = this.getValue();\n if (val && typeof val === \"string\" && val.startsWith(\"data:image\")) {\n this.loadImageOntoCanvas(val);\n }\n }\n\n private loadImageOntoCanvas(dataUrl: string): void {\n const img = new window.Image();\n img.onload = () => {\n if (this.canvasCtx && this.canvasEl) {\n this.canvasCtx.clearRect(0, 0, this.canvasEl.width, this.canvasEl.height);\n this.canvasCtx.drawImage(img, 0, 0, this.canvasEl.width, this.canvasEl.height);\n }\n };\n img.src = dataUrl;\n }\n\n private getCoordinates(e: MouseEvent | TouchEvent): { x: number, y: number } {\n if (!this.canvasEl) return { x: 0, y: 0 };\n const rect = this.canvasEl.getBoundingClientRect();\n \n let clientX, clientY;\n if (e.type.startsWith(\"touch\")) {\n clientX = (e as TouchEvent).touches[0].clientX;\n clientY = (e as TouchEvent).touches[0].clientY;\n } else {\n clientX = (e as MouseEvent).clientX;\n clientY = (e as MouseEvent).clientY;\n }\n \n return {\n x: clientX - rect.left,\n y: clientY - rect.top\n };\n }\n\n private startDrawing(e: MouseEvent): void {\n this.isDrawing = true;\n this.draw(e);\n }\n\n private startDrawingTouch(e: TouchEvent): void {\n e.preventDefault(); // Prevent scrolling\n this.isDrawing = true;\n this.drawTouch(e);\n }\n\n private draw(e: MouseEvent): void {\n if (!this.isDrawing || !this.canvasCtx) return;\n const pos = this.getCoordinates(e);\n this.canvasCtx.lineTo(pos.x, pos.y);\n this.canvasCtx.stroke();\n this.canvasCtx.beginPath();\n this.canvasCtx.moveTo(pos.x, pos.y);\n }\n\n private drawTouch(e: TouchEvent): void {\n if (!this.isDrawing || !this.canvasCtx) return;\n e.preventDefault(); // Prevent scrolling\n const pos = this.getCoordinates(e);\n this.canvasCtx.lineTo(pos.x, pos.y);\n this.canvasCtx.stroke();\n this.canvasCtx.beginPath();\n this.canvasCtx.moveTo(pos.x, pos.y);\n }\n\n private stopDrawing(): void {\n if (!this.isDrawing) return;\n this.isDrawing = false;\n if (this.canvasCtx) {\n this.canvasCtx.beginPath(); // Reset path\n this.saveSignature();\n }\n }\n\n private clearSignature(): void {\n if (this.canvasCtx && this.canvasEl) {\n this.canvasCtx.clearRect(0, 0, this.canvasEl.width, this.canvasEl.height);\n }\n this.setValueAndFire(null);\n MessageToast.show(\"Signature cleared.\");\n }\n\n private saveSignature(): void {\n if (this.canvasEl) {\n const dataUrl = this.canvasEl.toDataURL(\"image/png\");\n this.setValueAndFire(dataUrl);\n }\n }\n\n /**\n * Sets the value of the control programmatically and re-draws the canvas.\n * @param value The base64 data URL string representing the signature image.\n */\n public setValue(value: any): this {\n super.setValue(value);\n if (value && typeof value === \"string\" && value.startsWith(\"data:image\")) {\n this.loadImageOntoCanvas(value);\n } else if (!value && this.canvasCtx && this.canvasEl) {\n this.canvasCtx.clearRect(0, 0, this.canvasEl.width, this.canvasEl.height);\n }\n return this;\n }\n}\n"],"mappings":";;;;;;QAAOA,mBAAmB,GAAAC,sBAAA,CAAAC,qBAAA;EAM1B;AACA;AACA;AACA;EACe,MAAMC,gBAAgB,SAASH,mBAAmB,CAAC;IAC9D,OAAgBI,QAAQ,GAAG,iEAAiE;IAC5F,OAAgBC,QAAQ,GAAG;MACvBC,UAAU,EAAE,CAAC,CAAC;MACdC,MAAM,EAAE,CAAC;IACb,CAAC;IAKOC,SAAS,GAAG,KAAK;IACjBC,SAAS,GAAoC,IAAI;IACjDC,QAAQ,GAA6B,IAAI;;IAEjD;AACJ;AACA;IACWC,IAAIA,CAAA,EAAS;MAChB,KAAK,CAACA,IAAI,CAAC,CAAC;MAEZ,IAAI,CAACC,UAAU,GAAG,IAAIC,IAAI,CAAC;QACvBC,OAAO,EAAE,2IAA2I;QACpJC,cAAc,EAAE,IAAI,CAACC,gBAAgB,CAACC,IAAI,CAAC,IAAI;MACnD,CAAC,CAAC,CAACC,aAAa,CAAC,wBAAwB,CAAC;MAE1C,IAAI,CAACC,QAAQ,GAAG,IAAIC,MAAM,CAAC;QACvBC,IAAI,EAAE,uBAAuB;QAC7BC,IAAI,EAAE,iBAAiB;QACvBC,KAAK,EAAE,IAAI,CAACC,cAAc,CAACP,IAAI,CAAC,IAAI;MACxC,CAAC,CAAC;MAEF,IAAI,CAACQ,IAAI,GAAG,IAAIC,IAAI,CAAC;QACjBC,KAAK,EAAE,CAAC,IAAI,CAACf,UAAU,EAAE,IAAI,CAACO,QAAQ;MAC1C,CAAC,CAAC;MAEF,IAAI,CAACS,cAAc,CAAC,UAAU,EAAE,IAAI,CAACH,IAAI,CAAC;IAC9C;IAEQT,gBAAgBA,CAAA,EAAS;MAC7B,MAAMa,MAAM,GAAG,IAAI,CAACjB,UAAU,CAACkB,SAAS,CAAC,CAAgB;MACzD,IAAI,CAACD,MAAM,EAAE;MAEb,IAAI,CAACnB,QAAQ,GAAGmB,MAA2B;MAC3C,IAAI,CAACpB,SAAS,GAAG,IAAI,CAACC,QAAQ,CAACqB,UAAU,CAAC,IAAI,CAAC;MAC/C,IAAI,IAAI,CAACtB,SAAS,EAAE;QAChB,IAAI,CAACA,SAAS,CAACuB,SAAS,GAAG,CAAC;QAC5B,IAAI,CAACvB,SAAS,CAACwB,OAAO,GAAG,OAAO;QAChC,IAAI,CAACxB,SAAS,CAACyB,WAAW,GAAG,MAAM;MACvC;;MAEA;MACA,IAAI,CAACxB,QAAQ,CAACyB,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAACC,YAAY,CAACnB,IAAI,CAAC,IAAI,CAAC,CAAC;MACzE,IAAI,CAACP,QAAQ,CAACyB,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAACE,IAAI,CAACpB,IAAI,CAAC,IAAI,CAAC,CAAC;MACjE,IAAI,CAACP,QAAQ,CAACyB,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAACG,WAAW,CAACrB,IAAI,CAAC,IAAI,CAAC,CAAC;MACtE,IAAI,CAACP,QAAQ,CAACyB,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAACG,WAAW,CAACrB,IAAI,CAAC,IAAI,CAAC,CAAC;;MAEvE;MACA,IAAI,CAACP,QAAQ,CAACyB,gBAAgB,CAAC,YAAY,EAAE,IAAI,CAACI,iBAAiB,CAACtB,IAAI,CAAC,IAAI,CAAC,EAAE;QAAEuB,OAAO,EAAE;MAAM,CAAC,CAAC;MACnG,IAAI,CAAC9B,QAAQ,CAACyB,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAACM,SAAS,CAACxB,IAAI,CAAC,IAAI,CAAC,EAAE;QAAEuB,OAAO,EAAE;MAAM,CAAC,CAAC;MAC1F,IAAI,CAAC9B,QAAQ,CAACyB,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAACG,WAAW,CAACrB,IAAI,CAAC,IAAI,CAAC,CAAC;;MAEvE;MACA,MAAMyB,GAAG,GAAG,IAAI,CAACC,QAAQ,CAAC,CAAC;MAC3B,IAAID,GAAG,IAAI,OAAOA,GAAG,KAAK,QAAQ,IAAIA,GAAG,CAACE,UAAU,CAAC,YAAY,CAAC,EAAE;QAChE,IAAI,CAACC,mBAAmB,CAACH,GAAG,CAAC;MACjC;IACJ;IAEQG,mBAAmBA,CAACC,OAAe,EAAQ;MAC/C,MAAMC,GAAG,GAAG,IAAIC,MAAM,CAACC,KAAK,CAAC,CAAC;MAC9BF,GAAG,CAACG,MAAM,GAAG,MAAM;QACf,IAAI,IAAI,CAACzC,SAAS,IAAI,IAAI,CAACC,QAAQ,EAAE;UACjC,IAAI,CAACD,SAAS,CAAC0C,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAACzC,QAAQ,CAAC0C,KAAK,EAAE,IAAI,CAAC1C,QAAQ,CAAC2C,MAAM,CAAC;UACzE,IAAI,CAAC5C,SAAS,CAAC6C,SAAS,CAACP,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAACrC,QAAQ,CAAC0C,KAAK,EAAE,IAAI,CAAC1C,QAAQ,CAAC2C,MAAM,CAAC;QAClF;MACJ,CAAC;MACDN,GAAG,CAACQ,GAAG,GAAGT,OAAO;IACrB;IAEQU,cAAcA,CAACC,CAA0B,EAA4B;MACzE,IAAI,CAAC,IAAI,CAAC/C,QAAQ,EAAE,OAAO;QAAEgD,CAAC,EAAE,CAAC;QAAEC,CAAC,EAAE;MAAE,CAAC;MACzC,MAAMC,IAAI,GAAG,IAAI,CAAClD,QAAQ,CAACmD,qBAAqB,CAAC,CAAC;MAElD,IAAIC,OAAO,EAAEC,OAAO;MACpB,IAAIN,CAAC,CAACO,IAAI,CAACpB,UAAU,CAAC,OAAO,CAAC,EAAE;QAC5BkB,OAAO,GAAIL,CAAC,CAAgBQ,OAAO,CAAC,CAAC,CAAC,CAACH,OAAO;QAC9CC,OAAO,GAAIN,CAAC,CAAgBQ,OAAO,CAAC,CAAC,CAAC,CAACF,OAAO;MAClD,CAAC,MAAM;QACHD,OAAO,GAAIL,CAAC,CAAgBK,OAAO;QACnCC,OAAO,GAAIN,CAAC,CAAgBM,OAAO;MACvC;MAEA,OAAO;QACHL,CAAC,EAAEI,OAAO,GAAGF,IAAI,CAACM,IAAI;QACtBP,CAAC,EAAEI,OAAO,GAAGH,IAAI,CAACO;MACtB,CAAC;IACL;IAEQ/B,YAAYA,CAACqB,CAAa,EAAQ;MACtC,IAAI,CAACjD,SAAS,GAAG,IAAI;MACrB,IAAI,CAAC6B,IAAI,CAACoB,CAAC,CAAC;IAChB;IAEQlB,iBAAiBA,CAACkB,CAAa,EAAQ;MAC3CA,CAAC,CAACW,cAAc,CAAC,CAAC,CAAC,CAAC;MACpB,IAAI,CAAC5D,SAAS,GAAG,IAAI;MACrB,IAAI,CAACiC,SAAS,CAACgB,CAAC,CAAC;IACrB;IAEQpB,IAAIA,CAACoB,CAAa,EAAQ;MAC9B,IAAI,CAAC,IAAI,CAACjD,SAAS,IAAI,CAAC,IAAI,CAACC,SAAS,EAAE;MACxC,MAAM4D,GAAG,GAAG,IAAI,CAACb,cAAc,CAACC,CAAC,CAAC;MAClC,IAAI,CAAChD,SAAS,CAAC6D,MAAM,CAACD,GAAG,CAACX,CAAC,EAAEW,GAAG,CAACV,CAAC,CAAC;MACnC,IAAI,CAAClD,SAAS,CAAC8D,MAAM,CAAC,CAAC;MACvB,IAAI,CAAC9D,SAAS,CAAC+D,SAAS,CAAC,CAAC;MAC1B,IAAI,CAAC/D,SAAS,CAACgE,MAAM,CAACJ,GAAG,CAACX,CAAC,EAAEW,GAAG,CAACV,CAAC,CAAC;IACvC;IAEQlB,SAASA,CAACgB,CAAa,EAAQ;MACnC,IAAI,CAAC,IAAI,CAACjD,SAAS,IAAI,CAAC,IAAI,CAACC,SAAS,EAAE;MACxCgD,CAAC,CAACW,cAAc,CAAC,CAAC,CAAC,CAAC;MACpB,MAAMC,GAAG,GAAG,IAAI,CAACb,cAAc,CAACC,CAAC,CAAC;MAClC,IAAI,CAAChD,SAAS,CAAC6D,MAAM,CAACD,GAAG,CAACX,CAAC,EAAEW,GAAG,CAACV,CAAC,CAAC;MACnC,IAAI,CAAClD,SAAS,CAAC8D,MAAM,CAAC,CAAC;MACvB,IAAI,CAAC9D,SAAS,CAAC+D,SAAS,CAAC,CAAC;MAC1B,IAAI,CAAC/D,SAAS,CAACgE,MAAM,CAACJ,GAAG,CAACX,CAAC,EAAEW,GAAG,CAACV,CAAC,CAAC;IACvC;IAEQrB,WAAWA,CAAA,EAAS;MACxB,IAAI,CAAC,IAAI,CAAC9B,SAAS,EAAE;MACrB,IAAI,CAACA,SAAS,GAAG,KAAK;MACtB,IAAI,IAAI,CAACC,SAAS,EAAE;QAChB,IAAI,CAACA,SAAS,CAAC+D,SAAS,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,CAACE,aAAa,CAAC,CAAC;MACxB;IACJ;IAEQlD,cAAcA,CAAA,EAAS;MAC3B,IAAI,IAAI,CAACf,SAAS,IAAI,IAAI,CAACC,QAAQ,EAAE;QACjC,IAAI,CAACD,SAAS,CAAC0C,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAACzC,QAAQ,CAAC0C,KAAK,EAAE,IAAI,CAAC1C,QAAQ,CAAC2C,MAAM,CAAC;MAC7E;MACA,IAAI,CAACsB,eAAe,CAAC,IAAI,CAAC;MAC1BC,YAAY,CAACC,IAAI,CAAC,oBAAoB,CAAC;IAC3C;IAEQH,aAAaA,CAAA,EAAS;MAC1B,IAAI,IAAI,CAAChE,QAAQ,EAAE;QACf,MAAMoC,OAAO,GAAG,IAAI,CAACpC,QAAQ,CAACoE,SAAS,CAAC,WAAW,CAAC;QACpD,IAAI,CAACH,eAAe,CAAC7B,OAAO,CAAC;MACjC;IACJ;;IAEA;AACJ;AACA;AACA;IACWiC,QAAQA,CAACC,KAAU,EAAQ;MAC9B,KAAK,CAACD,QAAQ,CAACC,KAAK,CAAC;MACrB,IAAIA,KAAK,IAAI,OAAOA,KAAK,KAAK,QAAQ,IAAIA,KAAK,CAACpC,UAAU,CAAC,YAAY,CAAC,EAAE;QACtE,IAAI,CAACC,mBAAmB,CAACmC,KAAK,CAAC;MACnC,CAAC,MAAM,IAAI,CAACA,KAAK,IAAI,IAAI,CAACvE,SAAS,IAAI,IAAI,CAACC,QAAQ,EAAE;QAClD,IAAI,CAACD,SAAS,CAAC0C,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAACzC,QAAQ,CAAC0C,KAAK,EAAE,IAAI,CAAC1C,QAAQ,CAAC2C,MAAM,CAAC;MAC7E;MACA,OAAO,IAAI;IACf;EACJ;EAAC,OAAAlD,gBAAA;AAAA","ignoreList":[]}
@@ -16,6 +16,9 @@ declare module "nz/co/siliconst/ui5/metaui/controls/SignatureControl" {
16
16
  private isDrawing;
17
17
  private canvasCtx;
18
18
  private canvasEl;
19
+ /**
20
+ * Initializes the control and builds the canvas drawing surface.
21
+ */
19
22
  init(): void;
20
23
  private onCanvasRendered;
21
24
  private loadImageOntoCanvas;
@@ -27,6 +30,10 @@ declare module "nz/co/siliconst/ui5/metaui/controls/SignatureControl" {
27
30
  private stopDrawing;
28
31
  private clearSignature;
29
32
  private saveSignature;
33
+ /**
34
+ * Sets the value of the control programmatically and re-draws the canvas.
35
+ * @param value The base64 data URL string representing the signature image.
36
+ */
30
37
  setValue(value: any): this;
31
38
  }
32
39
  }
@@ -1 +1 @@
1
- {"version":3,"file":"SignatureControl.d.ts","sourceRoot":"../../../../../../../..","sources":["src/nz/co/siliconst/ui5/metaui/controls/SignatureControl.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,sDAAsD,CAAC;IACtE,OAAO,mBAAmB,MAAM,yDAAyD,CAAC;IAM1F;;;OAGG;IACH,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,mBAAmB;QAC7D,MAAM,CAAC,QAAQ,CAAC,QAAQ,qEAAqE;QAC7F,MAAM,CAAC,QAAQ,CAAC,QAAQ;;;UAGtB;QAEF,OAAO,CAAC,IAAI,CAAQ;QACpB,OAAO,CAAC,QAAQ,CAAU;QAC1B,OAAO,CAAC,UAAU,CAAQ;QAC1B,OAAO,CAAC,SAAS,CAAS;QAC1B,OAAO,CAAC,SAAS,CAAyC;QAC1D,OAAO,CAAC,QAAQ,CAAkC;QAE3C,IAAI,IAAI,IAAI;QAqBnB,OAAO,CAAC,gBAAgB;QA8BxB,OAAO,CAAC,mBAAmB;QAW3B,OAAO,CAAC,cAAc;QAmBtB,OAAO,CAAC,YAAY;QAKpB,OAAO,CAAC,iBAAiB;QAMzB,OAAO,CAAC,IAAI;QASZ,OAAO,CAAC,SAAS;QAUjB,OAAO,CAAC,WAAW;QASnB,OAAO,CAAC,cAAc;QAQtB,OAAO,CAAC,aAAa;QAOd,QAAQ,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI;KASpC;CAEA"}
1
+ {"version":3,"file":"SignatureControl.d.ts","sourceRoot":"../../../../../../../..","sources":["src/nz/co/siliconst/ui5/metaui/controls/SignatureControl.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,sDAAsD,CAAC;IACtE,OAAO,mBAAmB,MAAM,yDAAyD,CAAC;IAM1F;;;OAGG;IACH,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,mBAAmB;QAC7D,MAAM,CAAC,QAAQ,CAAC,QAAQ,qEAAqE;QAC7F,MAAM,CAAC,QAAQ,CAAC,QAAQ;;;UAGtB;QAEF,OAAO,CAAC,IAAI,CAAQ;QACpB,OAAO,CAAC,QAAQ,CAAU;QAC1B,OAAO,CAAC,UAAU,CAAQ;QAC1B,OAAO,CAAC,SAAS,CAAS;QAC1B,OAAO,CAAC,SAAS,CAAyC;QAC1D,OAAO,CAAC,QAAQ,CAAkC;QAElD;;WAEG;QACI,IAAI,IAAI,IAAI;QAqBnB,OAAO,CAAC,gBAAgB;QA8BxB,OAAO,CAAC,mBAAmB;QAW3B,OAAO,CAAC,cAAc;QAmBtB,OAAO,CAAC,YAAY;QAKpB,OAAO,CAAC,iBAAiB;QAMzB,OAAO,CAAC,IAAI;QASZ,OAAO,CAAC,SAAS;QAUjB,OAAO,CAAC,WAAW;QASnB,OAAO,CAAC,cAAc;QAQtB,OAAO,CAAC,aAAa;QAOrB;;;WAGG;QACI,QAAQ,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI;KASpC;CAEA"}
@@ -1 +1 @@
1
- {"version":3,"file":"SignatureControl.js","names":["BaseHardwareControl","_interopRequireDefault","__BaseHardwareControl","SignatureControl","static","properties","events","isDrawing","canvasCtx","canvasEl","init","super","this","canvasHtml","HTML","content","afterRendering","onCanvasRendered","bind","addStyleClass","clearBtn","Button","icon","text","press","clearSignature","vBox","VBox","items","setAggregation","domRef","getDomRef","getContext","lineWidth","lineCap","strokeStyle","addEventListener","startDrawing","draw","stopDrawing","startDrawingTouch","passive","drawTouch","val","getValue","startsWith","loadImageOntoCanvas","dataUrl","img","window","Image","onload","clearRect","width","height","drawImage","src","getCoordinates","e","x","y","rect","getBoundingClientRect","clientX","clientY","type","touches","left","top","preventDefault","pos","lineTo","stroke","beginPath","moveTo","saveSignature","setValueAndFire","MessageToast","show","toDataURL","setValue","value"],"sources":["SignatureControl.ts"],"sourcesContent":["import BaseHardwareControl from \"./BaseHardwareControl\";\nimport Button from \"sap/m/Button\";\nimport VBox from \"sap/m/VBox\";\nimport HTML from \"sap/ui/core/HTML\";\nimport MessageToast from \"sap/m/MessageToast\";\n\n/**\n * SignatureControl\n * Provides an HTML5 Canvas for capturing signatures.\n */\nexport default class SignatureControl extends BaseHardwareControl {\n static readonly renderer = \"nz.co.siliconst.ui5.metaui.controls.BaseHardwareControlRenderer\";\n static readonly metadata = {\n properties: {},\n events: {}\n };\n\n private vBox!: VBox;\n private clearBtn!: Button;\n private canvasHtml!: HTML;\n private isDrawing = false;\n private canvasCtx: CanvasRenderingContext2D | null = null;\n private canvasEl: HTMLCanvasElement | null = null;\n\n public init(): void {\n super.init();\n\n this.canvasHtml = new HTML({\n content: \"<canvas width='400' height='200' style='border: 1px solid #ccc; background-color: #fff; touch-action: none; cursor: crosshair;'></canvas>\",\n afterRendering: this.onCanvasRendered.bind(this)\n }).addStyleClass(\"sapUiSmallMarginBottom\");\n\n this.clearBtn = new Button({\n icon: \"sap-icon://sys-cancel\",\n text: \"Clear Signature\",\n press: this.clearSignature.bind(this)\n });\n\n this.vBox = new VBox({\n items: [this.canvasHtml, this.clearBtn]\n });\n\n this.setAggregation(\"_content\", this.vBox);\n }\n\n private onCanvasRendered(): void {\n const domRef = this.canvasHtml.getDomRef() as HTMLElement;\n if (!domRef) return;\n \n this.canvasEl = domRef as HTMLCanvasElement;\n this.canvasCtx = this.canvasEl.getContext(\"2d\");\n if (this.canvasCtx) {\n this.canvasCtx.lineWidth = 2;\n this.canvasCtx.lineCap = \"round\";\n this.canvasCtx.strokeStyle = \"#000\";\n }\n\n // Mouse events\n this.canvasEl.addEventListener(\"mousedown\", this.startDrawing.bind(this));\n this.canvasEl.addEventListener(\"mousemove\", this.draw.bind(this));\n this.canvasEl.addEventListener(\"mouseup\", this.stopDrawing.bind(this));\n this.canvasEl.addEventListener(\"mouseout\", this.stopDrawing.bind(this));\n \n // Touch events\n this.canvasEl.addEventListener(\"touchstart\", this.startDrawingTouch.bind(this), { passive: false });\n this.canvasEl.addEventListener(\"touchmove\", this.drawTouch.bind(this), { passive: false });\n this.canvasEl.addEventListener(\"touchend\", this.stopDrawing.bind(this));\n\n // Restore existing signature if any\n const val = this.getValue();\n if (val && typeof val === \"string\" && val.startsWith(\"data:image\")) {\n this.loadImageOntoCanvas(val);\n }\n }\n\n private loadImageOntoCanvas(dataUrl: string): void {\n const img = new window.Image();\n img.onload = () => {\n if (this.canvasCtx && this.canvasEl) {\n this.canvasCtx.clearRect(0, 0, this.canvasEl.width, this.canvasEl.height);\n this.canvasCtx.drawImage(img, 0, 0, this.canvasEl.width, this.canvasEl.height);\n }\n };\n img.src = dataUrl;\n }\n\n private getCoordinates(e: MouseEvent | TouchEvent): { x: number, y: number } {\n if (!this.canvasEl) return { x: 0, y: 0 };\n const rect = this.canvasEl.getBoundingClientRect();\n \n let clientX, clientY;\n if (e.type.startsWith(\"touch\")) {\n clientX = (e as TouchEvent).touches[0].clientX;\n clientY = (e as TouchEvent).touches[0].clientY;\n } else {\n clientX = (e as MouseEvent).clientX;\n clientY = (e as MouseEvent).clientY;\n }\n \n return {\n x: clientX - rect.left,\n y: clientY - rect.top\n };\n }\n\n private startDrawing(e: MouseEvent): void {\n this.isDrawing = true;\n this.draw(e);\n }\n\n private startDrawingTouch(e: TouchEvent): void {\n e.preventDefault(); // Prevent scrolling\n this.isDrawing = true;\n this.drawTouch(e);\n }\n\n private draw(e: MouseEvent): void {\n if (!this.isDrawing || !this.canvasCtx) return;\n const pos = this.getCoordinates(e);\n this.canvasCtx.lineTo(pos.x, pos.y);\n this.canvasCtx.stroke();\n this.canvasCtx.beginPath();\n this.canvasCtx.moveTo(pos.x, pos.y);\n }\n\n private drawTouch(e: TouchEvent): void {\n if (!this.isDrawing || !this.canvasCtx) return;\n e.preventDefault(); // Prevent scrolling\n const pos = this.getCoordinates(e);\n this.canvasCtx.lineTo(pos.x, pos.y);\n this.canvasCtx.stroke();\n this.canvasCtx.beginPath();\n this.canvasCtx.moveTo(pos.x, pos.y);\n }\n\n private stopDrawing(): void {\n if (!this.isDrawing) return;\n this.isDrawing = false;\n if (this.canvasCtx) {\n this.canvasCtx.beginPath(); // Reset path\n this.saveSignature();\n }\n }\n\n private clearSignature(): void {\n if (this.canvasCtx && this.canvasEl) {\n this.canvasCtx.clearRect(0, 0, this.canvasEl.width, this.canvasEl.height);\n }\n this.setValueAndFire(null);\n MessageToast.show(\"Signature cleared.\");\n }\n\n private saveSignature(): void {\n if (this.canvasEl) {\n const dataUrl = this.canvasEl.toDataURL(\"image/png\");\n this.setValueAndFire(dataUrl);\n }\n }\n\n public setValue(value: any): this {\n super.setValue(value);\n if (value && typeof value === \"string\" && value.startsWith(\"data:image\")) {\n this.loadImageOntoCanvas(value);\n } else if (!value && this.canvasCtx && this.canvasEl) {\n this.canvasCtx.clearRect(0, 0, this.canvasEl.width, this.canvasEl.height);\n }\n return this;\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"SignatureControl.js","names":["BaseHardwareControl","_interopRequireDefault","__BaseHardwareControl","SignatureControl","static","properties","events","isDrawing","canvasCtx","canvasEl","init","super","this","canvasHtml","HTML","content","afterRendering","onCanvasRendered","bind","addStyleClass","clearBtn","Button","icon","text","press","clearSignature","vBox","VBox","items","setAggregation","domRef","getDomRef","getContext","lineWidth","lineCap","strokeStyle","addEventListener","startDrawing","draw","stopDrawing","startDrawingTouch","passive","drawTouch","val","getValue","startsWith","loadImageOntoCanvas","dataUrl","img","window","Image","onload","clearRect","width","height","drawImage","src","getCoordinates","e","x","y","rect","getBoundingClientRect","clientX","clientY","type","touches","left","top","preventDefault","pos","lineTo","stroke","beginPath","moveTo","saveSignature","setValueAndFire","MessageToast","show","toDataURL","setValue","value"],"sources":["SignatureControl.ts"],"sourcesContent":["import BaseHardwareControl from \"./BaseHardwareControl\";\nimport Button from \"sap/m/Button\";\nimport VBox from \"sap/m/VBox\";\nimport HTML from \"sap/ui/core/HTML\";\nimport MessageToast from \"sap/m/MessageToast\";\n\n/**\n * SignatureControl\n * Provides an HTML5 Canvas for capturing signatures.\n */\nexport default class SignatureControl extends BaseHardwareControl {\n static readonly renderer = \"nz.co.siliconst.ui5.metaui.controls.BaseHardwareControlRenderer\";\n static readonly metadata = {\n properties: {},\n events: {}\n };\n\n private vBox!: VBox;\n private clearBtn!: Button;\n private canvasHtml!: HTML;\n private isDrawing = false;\n private canvasCtx: CanvasRenderingContext2D | null = null;\n private canvasEl: HTMLCanvasElement | null = null;\n\n /**\n * Initializes the control and builds the canvas drawing surface.\n */\n public init(): void {\n super.init();\n\n this.canvasHtml = new HTML({\n content: \"<canvas width='400' height='200' style='border: 1px solid #ccc; background-color: #fff; touch-action: none; cursor: crosshair;'></canvas>\",\n afterRendering: this.onCanvasRendered.bind(this)\n }).addStyleClass(\"sapUiSmallMarginBottom\");\n\n this.clearBtn = new Button({\n icon: \"sap-icon://sys-cancel\",\n text: \"Clear Signature\",\n press: this.clearSignature.bind(this)\n });\n\n this.vBox = new VBox({\n items: [this.canvasHtml, this.clearBtn]\n });\n\n this.setAggregation(\"_content\", this.vBox);\n }\n\n private onCanvasRendered(): void {\n const domRef = this.canvasHtml.getDomRef() as HTMLElement;\n if (!domRef) return;\n \n this.canvasEl = domRef as HTMLCanvasElement;\n this.canvasCtx = this.canvasEl.getContext(\"2d\");\n if (this.canvasCtx) {\n this.canvasCtx.lineWidth = 2;\n this.canvasCtx.lineCap = \"round\";\n this.canvasCtx.strokeStyle = \"#000\";\n }\n\n // Mouse events\n this.canvasEl.addEventListener(\"mousedown\", this.startDrawing.bind(this));\n this.canvasEl.addEventListener(\"mousemove\", this.draw.bind(this));\n this.canvasEl.addEventListener(\"mouseup\", this.stopDrawing.bind(this));\n this.canvasEl.addEventListener(\"mouseout\", this.stopDrawing.bind(this));\n \n // Touch events\n this.canvasEl.addEventListener(\"touchstart\", this.startDrawingTouch.bind(this), { passive: false });\n this.canvasEl.addEventListener(\"touchmove\", this.drawTouch.bind(this), { passive: false });\n this.canvasEl.addEventListener(\"touchend\", this.stopDrawing.bind(this));\n\n // Restore existing signature if any\n const val = this.getValue();\n if (val && typeof val === \"string\" && val.startsWith(\"data:image\")) {\n this.loadImageOntoCanvas(val);\n }\n }\n\n private loadImageOntoCanvas(dataUrl: string): void {\n const img = new window.Image();\n img.onload = () => {\n if (this.canvasCtx && this.canvasEl) {\n this.canvasCtx.clearRect(0, 0, this.canvasEl.width, this.canvasEl.height);\n this.canvasCtx.drawImage(img, 0, 0, this.canvasEl.width, this.canvasEl.height);\n }\n };\n img.src = dataUrl;\n }\n\n private getCoordinates(e: MouseEvent | TouchEvent): { x: number, y: number } {\n if (!this.canvasEl) return { x: 0, y: 0 };\n const rect = this.canvasEl.getBoundingClientRect();\n \n let clientX, clientY;\n if (e.type.startsWith(\"touch\")) {\n clientX = (e as TouchEvent).touches[0].clientX;\n clientY = (e as TouchEvent).touches[0].clientY;\n } else {\n clientX = (e as MouseEvent).clientX;\n clientY = (e as MouseEvent).clientY;\n }\n \n return {\n x: clientX - rect.left,\n y: clientY - rect.top\n };\n }\n\n private startDrawing(e: MouseEvent): void {\n this.isDrawing = true;\n this.draw(e);\n }\n\n private startDrawingTouch(e: TouchEvent): void {\n e.preventDefault(); // Prevent scrolling\n this.isDrawing = true;\n this.drawTouch(e);\n }\n\n private draw(e: MouseEvent): void {\n if (!this.isDrawing || !this.canvasCtx) return;\n const pos = this.getCoordinates(e);\n this.canvasCtx.lineTo(pos.x, pos.y);\n this.canvasCtx.stroke();\n this.canvasCtx.beginPath();\n this.canvasCtx.moveTo(pos.x, pos.y);\n }\n\n private drawTouch(e: TouchEvent): void {\n if (!this.isDrawing || !this.canvasCtx) return;\n e.preventDefault(); // Prevent scrolling\n const pos = this.getCoordinates(e);\n this.canvasCtx.lineTo(pos.x, pos.y);\n this.canvasCtx.stroke();\n this.canvasCtx.beginPath();\n this.canvasCtx.moveTo(pos.x, pos.y);\n }\n\n private stopDrawing(): void {\n if (!this.isDrawing) return;\n this.isDrawing = false;\n if (this.canvasCtx) {\n this.canvasCtx.beginPath(); // Reset path\n this.saveSignature();\n }\n }\n\n private clearSignature(): void {\n if (this.canvasCtx && this.canvasEl) {\n this.canvasCtx.clearRect(0, 0, this.canvasEl.width, this.canvasEl.height);\n }\n this.setValueAndFire(null);\n MessageToast.show(\"Signature cleared.\");\n }\n\n private saveSignature(): void {\n if (this.canvasEl) {\n const dataUrl = this.canvasEl.toDataURL(\"image/png\");\n this.setValueAndFire(dataUrl);\n }\n }\n\n /**\n * Sets the value of the control programmatically and re-draws the canvas.\n * @param value The base64 data URL string representing the signature image.\n */\n public setValue(value: any): this {\n super.setValue(value);\n if (value && typeof value === \"string\" && value.startsWith(\"data:image\")) {\n this.loadImageOntoCanvas(value);\n } else if (!value && this.canvasCtx && this.canvasEl) {\n this.canvasCtx.clearRect(0, 0, this.canvasEl.width, this.canvasEl.height);\n }\n return this;\n }\n}\n"],"mappings":"oOAAOA,EAAmBC,EAAAC,GAUX,MAAMC,UAAyBH,EAC1CI,gBAA2B,kEAC3BA,gBAA2B,CACvBC,WAAY,CAAC,EACbC,OAAQ,CAAC,GAMLC,UAAY,MACZC,UAA6C,KAC7CC,SAAqC,KAKtCC,OACHC,MAAMD,OAENE,KAAKC,WAAa,IAAIC,EAAK,CACvBC,QAAS,4IACTC,eAAgBJ,KAAKK,iBAAiBC,KAAKN,QAC5CO,cAAc,0BAEjBP,KAAKQ,SAAW,IAAIC,EAAO,CACvBC,KAAM,wBACNC,KAAM,kBACNC,MAAOZ,KAAKa,eAAeP,KAAKN,QAGpCA,KAAKc,KAAO,IAAIC,EAAK,CACjBC,MAAO,CAAChB,KAAKC,WAAYD,KAAKQ,YAGlCR,KAAKiB,eAAe,WAAYjB,KAAKc,KACzC,CAEQT,mBACJ,MAAMa,EAASlB,KAAKC,WAAWkB,YAC/B,IAAKD,EAAQ,OAEblB,KAAKH,SAAWqB,EAChBlB,KAAKJ,UAAYI,KAAKH,SAASuB,WAAW,MAC1C,GAAIpB,KAAKJ,UAAW,CAChBI,KAAKJ,UAAUyB,UAAY,EAC3BrB,KAAKJ,UAAU0B,QAAU,QACzBtB,KAAKJ,UAAU2B,YAAc,MACjC,CAGAvB,KAAKH,SAAS2B,iBAAiB,YAAaxB,KAAKyB,aAAanB,KAAKN,OACnEA,KAAKH,SAAS2B,iBAAiB,YAAaxB,KAAK0B,KAAKpB,KAAKN,OAC3DA,KAAKH,SAAS2B,iBAAiB,UAAWxB,KAAK2B,YAAYrB,KAAKN,OAChEA,KAAKH,SAAS2B,iBAAiB,WAAYxB,KAAK2B,YAAYrB,KAAKN,OAGjEA,KAAKH,SAAS2B,iBAAiB,aAAcxB,KAAK4B,kBAAkBtB,KAAKN,MAAO,CAAE6B,QAAS,QAC3F7B,KAAKH,SAAS2B,iBAAiB,YAAaxB,KAAK8B,UAAUxB,KAAKN,MAAO,CAAE6B,QAAS,QAClF7B,KAAKH,SAAS2B,iBAAiB,WAAYxB,KAAK2B,YAAYrB,KAAKN,OAGjE,MAAM+B,EAAM/B,KAAKgC,WACjB,GAAID,UAAcA,IAAQ,UAAYA,EAAIE,WAAW,cAAe,CAChEjC,KAAKkC,oBAAoBH,EAC7B,CACJ,CAEQG,oBAAoBC,GACxB,MAAMC,EAAM,IAAIC,OAAOC,MACvBF,EAAIG,OAAS,KACT,GAAIvC,KAAKJ,WAAaI,KAAKH,SAAU,CACjCG,KAAKJ,UAAU4C,UAAU,EAAG,EAAGxC,KAAKH,SAAS4C,MAAOzC,KAAKH,SAAS6C,QAClE1C,KAAKJ,UAAU+C,UAAUP,EAAK,EAAG,EAAGpC,KAAKH,SAAS4C,MAAOzC,KAAKH,SAAS6C,OAC3E,GAEJN,EAAIQ,IAAMT,CACd,CAEQU,eAAeC,GACnB,IAAK9C,KAAKH,SAAU,MAAO,CAAEkD,EAAG,EAAGC,EAAG,GACtC,MAAMC,EAAOjD,KAAKH,SAASqD,wBAE3B,IAAIC,EAASC,EACb,GAAIN,EAAEO,KAAKpB,WAAW,SAAU,CAC5BkB,EAAWL,EAAiBQ,QAAQ,GAAGH,QACvCC,EAAWN,EAAiBQ,QAAQ,GAAGF,OAC3C,KAAO,CACHD,EAAWL,EAAiBK,QAC5BC,EAAWN,EAAiBM,OAChC,CAEA,MAAO,CACHL,EAAGI,EAAUF,EAAKM,KAClBP,EAAGI,EAAUH,EAAKO,IAE1B,CAEQ/B,aAAaqB,GACjB9C,KAAKL,UAAY,KACjBK,KAAK0B,KAAKoB,EACd,CAEQlB,kBAAkBkB,GACtBA,EAAEW,iBACFzD,KAAKL,UAAY,KACjBK,KAAK8B,UAAUgB,EACnB,CAEQpB,KAAKoB,GACT,IAAK9C,KAAKL,YAAcK,KAAKJ,UAAW,OACxC,MAAM8D,EAAM1D,KAAK6C,eAAeC,GAChC9C,KAAKJ,UAAU+D,OAAOD,EAAIX,EAAGW,EAAIV,GACjChD,KAAKJ,UAAUgE,SACf5D,KAAKJ,UAAUiE,YACf7D,KAAKJ,UAAUkE,OAAOJ,EAAIX,EAAGW,EAAIV,EACrC,CAEQlB,UAAUgB,GACd,IAAK9C,KAAKL,YAAcK,KAAKJ,UAAW,OACxCkD,EAAEW,iBACF,MAAMC,EAAM1D,KAAK6C,eAAeC,GAChC9C,KAAKJ,UAAU+D,OAAOD,EAAIX,EAAGW,EAAIV,GACjChD,KAAKJ,UAAUgE,SACf5D,KAAKJ,UAAUiE,YACf7D,KAAKJ,UAAUkE,OAAOJ,EAAIX,EAAGW,EAAIV,EACrC,CAEQrB,cACJ,IAAK3B,KAAKL,UAAW,OACrBK,KAAKL,UAAY,MACjB,GAAIK,KAAKJ,UAAW,CAChBI,KAAKJ,UAAUiE,YACf7D,KAAK+D,eACT,CACJ,CAEQlD,iBACJ,GAAIb,KAAKJ,WAAaI,KAAKH,SAAU,CACjCG,KAAKJ,UAAU4C,UAAU,EAAG,EAAGxC,KAAKH,SAAS4C,MAAOzC,KAAKH,SAAS6C,OACtE,CACA1C,KAAKgE,gBAAgB,MACrBC,EAAaC,KAAK,qBACtB,CAEQH,gBACJ,GAAI/D,KAAKH,SAAU,CACf,MAAMsC,EAAUnC,KAAKH,SAASsE,UAAU,aACxCnE,KAAKgE,gBAAgB7B,EACzB,CACJ,CAMOiC,SAASC,GACZtE,MAAMqE,SAASC,GACf,GAAIA,UAAgBA,IAAU,UAAYA,EAAMpC,WAAW,cAAe,CACtEjC,KAAKkC,oBAAoBmC,EAC7B,MAAO,IAAKA,GAASrE,KAAKJ,WAAaI,KAAKH,SAAU,CAClDG,KAAKJ,UAAU4C,UAAU,EAAG,EAAGxC,KAAKH,SAAS4C,MAAOzC,KAAKH,SAAS6C,OACtE,CACA,OAAO1C,IACX,EACH,OAAAT,CAAA","ignoreList":[]}
@@ -22,6 +22,9 @@ export default class SignatureControl extends BaseHardwareControl {
22
22
  private canvasCtx: CanvasRenderingContext2D | null = null;
23
23
  private canvasEl: HTMLCanvasElement | null = null;
24
24
 
25
+ /**
26
+ * Initializes the control and builds the canvas drawing surface.
27
+ */
25
28
  public init(): void {
26
29
  super.init();
27
30
 
@@ -157,6 +160,10 @@ export default class SignatureControl extends BaseHardwareControl {
157
160
  }
158
161
  }
159
162
 
163
+ /**
164
+ * Sets the value of the control programmatically and re-draws the canvas.
165
+ * @param value The base64 data URL string representing the signature image.
166
+ */
160
167
  public setValue(value: any): this {
161
168
  super.setValue(value);
162
169
  if (value && typeof value === "string" && value.startsWith("data:image")) {
@@ -18,6 +18,10 @@ sap.ui.define(["./BaseHardwareControl", "sap/m/Button", "sap/m/VBox", "sap/m/Tex
18
18
  };
19
19
  recognition = null;
20
20
  isRecording = false;
21
+
22
+ /**
23
+ * Initializes the dictation interface and requests Web Speech API setup.
24
+ */
21
25
  init() {
22
26
  super.init();
23
27
  this.textArea = new TextArea({
@@ -129,6 +133,11 @@ sap.ui.define(["./BaseHardwareControl", "sap/m/Button", "sap/m/VBox", "sap/m/Tex
129
133
  this.startBtn.setText("Start Dictation");
130
134
  this.startBtn.setType("Emphasized");
131
135
  }
136
+
137
+ /**
138
+ * Lifecycle hook called before the control is rendered to the DOM.
139
+ * Handles browser support visual state.
140
+ */
132
141
  onBeforeRendering() {
133
142
  const readOnly = this.getProperty("readOnly");
134
143
  this.textArea.setEditable(!readOnly);
@@ -143,6 +152,10 @@ sap.ui.define(["./BaseHardwareControl", "sap/m/Button", "sap/m/VBox", "sap/m/Tex
143
152
  }
144
153
  }
145
154
  }
155
+
156
+ /**
157
+ * Cleans up hardware event listeners when the control is destroyed.
158
+ */
146
159
  exit() {
147
160
  this.stopDictation();
148
161
  if (this.recognition) {
@@ -1 +1 @@
1
- {"version":3,"file":"VoiceInputControl-dbg.js","names":["BaseHardwareControl","_interopRequireDefault","__BaseHardwareControl","Logger","___utils_Logger","VoiceInputControl","renderer","metadata","properties","events","recognition","isRecording","init","textArea","TextArea","rows","width","placeholder","liveChange","oEvent","setValueAndFire","getParameter","startBtn","Button","icon","text","type","press","toggleDictation","bind","hBox","HBox","items","addStyleClass","vBox","VBox","setAggregation","initSpeechRecognition","stopDictation","startDictation","SpeechRecognition","window","webkitSpeechRecognition","continuous","interimResults","onresult","event","finalTranscript","interimTranscript","i","resultIndex","results","length","isFinal","transcript","currentVal","getValue","newVal","setValue","onstart","setIcon","setText","setType","MessageToast","show","onerror","error","sap","ui","require","MessageBox","onend","warn","setEnabled","setTooltip","start","err","message","stop","e","onBeforeRendering","readOnly","getProperty","setEditable","undefined","exit"],"sources":["VoiceInputControl.ts"],"sourcesContent":["import BaseHardwareControl from \"./BaseHardwareControl\";\nimport Button from \"sap/m/Button\";\nimport VBox from \"sap/m/VBox\";\nimport TextArea from \"sap/m/TextArea\";\nimport MessageToast from \"sap/m/MessageToast\";\nimport HBox from \"sap/m/HBox\";\nimport { Logger } from \"../utils/Logger\";\n\n/**\n * VoiceInputControl\n * Provides a UI to dictate text using the browser's native Web Speech API.\n */\nexport default class VoiceInputControl extends BaseHardwareControl {\n static readonly renderer = \"nz.co.siliconst.ui5.metaui.controls.BaseHardwareControlRenderer\";\n static readonly metadata = {\n properties: {},\n events: {}\n };\n\n private vBox!: VBox;\n private textArea!: TextArea;\n private startBtn!: Button;\n private stopBtn!: Button;\n \n private recognition: any = null;\n private isRecording: boolean = false;\n\n public init(): void {\n super.init();\n\n this.textArea = new TextArea({\n rows: 3,\n width: \"100%\",\n placeholder: \"Dictated text will appear here...\",\n liveChange: (oEvent: sap.ui.base.Event) => {\n this.setValueAndFire(oEvent.getParameter(\"value\"));\n }\n });\n\n this.startBtn = new Button({\n icon: \"sap-icon://microphone\",\n text: \"Start Dictation\",\n type: \"Emphasized\",\n press: this.toggleDictation.bind(this)\n });\n\n const hBox = new HBox({\n items: [this.startBtn]\n }).addStyleClass(\"sapUiSmallMarginTop\");\n\n this.vBox = new VBox({\n items: [this.textArea, hBox]\n });\n\n this.setAggregation(\"_content\", this.vBox);\n this.initSpeechRecognition();\n }\n\n private toggleDictation(): void {\n if (this.isRecording) {\n this.stopDictation();\n } else {\n this.startDictation();\n }\n }\n\n private initSpeechRecognition(): void {\n const SpeechRecognition = (window as unknown).SpeechRecognition || (window as unknown).webkitSpeechRecognition;\n if (SpeechRecognition) {\n this.recognition = new SpeechRecognition();\n this.recognition.continuous = true;\n this.recognition.interimResults = true;\n\n this.recognition.onresult = (event: any) => {\n let finalTranscript = \"\";\n let interimTranscript = \"\";\n\n for (let i = event.resultIndex; i < event.results.length; ++i) {\n if (event.results[i].isFinal) {\n finalTranscript += event.results[i][0].transcript;\n } else {\n interimTranscript += event.results[i][0].transcript;\n }\n }\n\n // Append the new final transcript to whatever was already in the textarea\n const currentVal = this.getValue() || \"\";\n const newVal = currentVal ? currentVal + \" \" + finalTranscript : finalTranscript;\n \n if (finalTranscript) {\n this.textArea.setValue(newVal);\n this.setValueAndFire(newVal);\n } else if (interimTranscript) {\n // Just show interim temporarily in textarea without saving to model\n this.textArea.setValue(currentVal ? currentVal + \" \" + interimTranscript : interimTranscript);\n }\n };\n\n this.recognition.onstart = () => {\n this.isRecording = true;\n this.startBtn.setIcon(\"sap-icon://stop\");\n this.startBtn.setText(\"Stop Recording\");\n this.startBtn.setType(\"Reject\");\n MessageToast.show(\"Listening... Please speak now.\");\n };\n\n this.recognition.onerror = (event: any) => {\n Logger.error(\"Speech recognition error\", event.error, \"VoiceInputControl\");\n sap.ui.require([\"sap/m/MessageBox\"], (MessageBox: unknown) => {\n MessageBox.error(\"Microphone Error: \" + event.error + \"\\n\\nPlease ensure you have a working microphone attached and have not blocked access in your browser settings.\");\n });\n this.stopDictation();\n };\n \n this.recognition.onend = () => {\n // If it ends natively (e.g. timeout), update UI\n this.stopDictation();\n };\n } else {\n Logger.warn(\"Web Speech API not supported in this browser.\", \"\", \"VoiceInputControl\");\n this.startBtn.setEnabled(false);\n this.startBtn.setTooltip(\"Speech Recognition is not supported in this browser.\");\n }\n }\n\n private startDictation(): void {\n if (!this.recognition) return;\n \n try {\n this.recognition.start();\n MessageToast.show(\"Requesting microphone access...\");\n // Provide immediate UI feedback in case browser delays the onstart event\n this.startBtn.setIcon(\"sap-icon://stop\");\n this.startBtn.setText(\"Requesting mic...\");\n this.startBtn.setType(\"Reject\");\n } catch (err: any) {\n Logger.error(\"Failed to start speech recognition\", err.message || err, \"VoiceInputControl\");\n sap.ui.require([\"sap/m/MessageBox\"], (MessageBox: unknown) => {\n MessageBox.error(\"Failed to start dictation. Please ensure you have a working microphone and have granted browser permissions.\\n\\nDetails: \" + (err.message || err));\n });\n this.stopDictation();\n }\n }\n\n private stopDictation(): void {\n if (!this.recognition) return;\n \n try {\n this.recognition.stop();\n } catch(e) {}\n \n this.isRecording = false;\n this.startBtn.setIcon(\"sap-icon://microphone\");\n this.startBtn.setText(\"Start Dictation\");\n this.startBtn.setType(\"Emphasized\");\n }\n\n public onBeforeRendering(): void {\n const readOnly = this.getProperty(\"readOnly\");\n this.textArea.setEditable(!readOnly);\n \n // Only enable if it's not readonly AND the browser supports speech recognition\n this.startBtn.setEnabled(!readOnly && !!this.recognition);\n\n const currentVal = this.getProperty(\"value\");\n if (currentVal !== undefined && currentVal !== null) {\n // Only update text area if we aren't currently dictating interim results\n if (!this.isRecording) {\n this.textArea.setValue(currentVal as string);\n }\n }\n }\n\n public exit(): void {\n this.stopDictation();\n if (this.recognition) {\n this.recognition.onstart = null;\n this.recognition.onresult = null;\n this.recognition.onerror = null;\n this.recognition.onend = null;\n this.recognition = null;\n }\n super.exit();\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"VoiceInputControl-dbg.js","names":["BaseHardwareControl","_interopRequireDefault","__BaseHardwareControl","Logger","___utils_Logger","VoiceInputControl","renderer","metadata","properties","events","recognition","isRecording","init","textArea","TextArea","rows","width","placeholder","liveChange","oEvent","setValueAndFire","getParameter","startBtn","Button","icon","text","type","press","toggleDictation","bind","hBox","HBox","items","addStyleClass","vBox","VBox","setAggregation","initSpeechRecognition","stopDictation","startDictation","SpeechRecognition","window","webkitSpeechRecognition","continuous","interimResults","onresult","event","finalTranscript","interimTranscript","i","resultIndex","results","length","isFinal","transcript","currentVal","getValue","newVal","setValue","onstart","setIcon","setText","setType","MessageToast","show","onerror","error","sap","ui","require","MessageBox","onend","warn","setEnabled","setTooltip","start","err","message","stop","e","onBeforeRendering","readOnly","getProperty","setEditable","undefined","exit"],"sources":["VoiceInputControl.ts"],"sourcesContent":["import BaseHardwareControl from \"./BaseHardwareControl\";\nimport Button from \"sap/m/Button\";\nimport VBox from \"sap/m/VBox\";\nimport TextArea from \"sap/m/TextArea\";\nimport MessageToast from \"sap/m/MessageToast\";\nimport HBox from \"sap/m/HBox\";\nimport { Logger } from \"../utils/Logger\";\n\n/**\n * VoiceInputControl\n * Provides a UI to dictate text using the browser's native Web Speech API.\n */\nexport default class VoiceInputControl extends BaseHardwareControl {\n static readonly renderer = \"nz.co.siliconst.ui5.metaui.controls.BaseHardwareControlRenderer\";\n static readonly metadata = {\n properties: {},\n events: {}\n };\n\n private vBox!: VBox;\n private textArea!: TextArea;\n private startBtn!: Button;\n private stopBtn!: Button;\n \n private recognition: any = null;\n private isRecording: boolean = false;\n\n /**\n * Initializes the dictation interface and requests Web Speech API setup.\n */\n public init(): void {\n super.init();\n\n this.textArea = new TextArea({\n rows: 3,\n width: \"100%\",\n placeholder: \"Dictated text will appear here...\",\n liveChange: (oEvent: sap.ui.base.Event) => {\n this.setValueAndFire(oEvent.getParameter(\"value\"));\n }\n });\n\n this.startBtn = new Button({\n icon: \"sap-icon://microphone\",\n text: \"Start Dictation\",\n type: \"Emphasized\",\n press: this.toggleDictation.bind(this)\n });\n\n const hBox = new HBox({\n items: [this.startBtn]\n }).addStyleClass(\"sapUiSmallMarginTop\");\n\n this.vBox = new VBox({\n items: [this.textArea, hBox]\n });\n\n this.setAggregation(\"_content\", this.vBox);\n this.initSpeechRecognition();\n }\n\n private toggleDictation(): void {\n if (this.isRecording) {\n this.stopDictation();\n } else {\n this.startDictation();\n }\n }\n\n private initSpeechRecognition(): void {\n const SpeechRecognition = (window as unknown).SpeechRecognition || (window as unknown).webkitSpeechRecognition;\n if (SpeechRecognition) {\n this.recognition = new SpeechRecognition();\n this.recognition.continuous = true;\n this.recognition.interimResults = true;\n\n this.recognition.onresult = (event: any) => {\n let finalTranscript = \"\";\n let interimTranscript = \"\";\n\n for (let i = event.resultIndex; i < event.results.length; ++i) {\n if (event.results[i].isFinal) {\n finalTranscript += event.results[i][0].transcript;\n } else {\n interimTranscript += event.results[i][0].transcript;\n }\n }\n\n // Append the new final transcript to whatever was already in the textarea\n const currentVal = this.getValue() || \"\";\n const newVal = currentVal ? currentVal + \" \" + finalTranscript : finalTranscript;\n \n if (finalTranscript) {\n this.textArea.setValue(newVal);\n this.setValueAndFire(newVal);\n } else if (interimTranscript) {\n // Just show interim temporarily in textarea without saving to model\n this.textArea.setValue(currentVal ? currentVal + \" \" + interimTranscript : interimTranscript);\n }\n };\n\n this.recognition.onstart = () => {\n this.isRecording = true;\n this.startBtn.setIcon(\"sap-icon://stop\");\n this.startBtn.setText(\"Stop Recording\");\n this.startBtn.setType(\"Reject\");\n MessageToast.show(\"Listening... Please speak now.\");\n };\n\n this.recognition.onerror = (event: any) => {\n Logger.error(\"Speech recognition error\", event.error, \"VoiceInputControl\");\n sap.ui.require([\"sap/m/MessageBox\"], (MessageBox: unknown) => {\n MessageBox.error(\"Microphone Error: \" + event.error + \"\\n\\nPlease ensure you have a working microphone attached and have not blocked access in your browser settings.\");\n });\n this.stopDictation();\n };\n \n this.recognition.onend = () => {\n // If it ends natively (e.g. timeout), update UI\n this.stopDictation();\n };\n } else {\n Logger.warn(\"Web Speech API not supported in this browser.\", \"\", \"VoiceInputControl\");\n this.startBtn.setEnabled(false);\n this.startBtn.setTooltip(\"Speech Recognition is not supported in this browser.\");\n }\n }\n\n private startDictation(): void {\n if (!this.recognition) return;\n \n try {\n this.recognition.start();\n MessageToast.show(\"Requesting microphone access...\");\n // Provide immediate UI feedback in case browser delays the onstart event\n this.startBtn.setIcon(\"sap-icon://stop\");\n this.startBtn.setText(\"Requesting mic...\");\n this.startBtn.setType(\"Reject\");\n } catch (err: any) {\n Logger.error(\"Failed to start speech recognition\", err.message || err, \"VoiceInputControl\");\n sap.ui.require([\"sap/m/MessageBox\"], (MessageBox: unknown) => {\n MessageBox.error(\"Failed to start dictation. Please ensure you have a working microphone and have granted browser permissions.\\n\\nDetails: \" + (err.message || err));\n });\n this.stopDictation();\n }\n }\n\n private stopDictation(): void {\n if (!this.recognition) return;\n \n try {\n this.recognition.stop();\n } catch(e) {}\n \n this.isRecording = false;\n this.startBtn.setIcon(\"sap-icon://microphone\");\n this.startBtn.setText(\"Start Dictation\");\n this.startBtn.setType(\"Emphasized\");\n }\n\n /**\n * Lifecycle hook called before the control is rendered to the DOM.\n * Handles browser support visual state.\n */\n public onBeforeRendering(): void {\n const readOnly = this.getProperty(\"readOnly\");\n this.textArea.setEditable(!readOnly);\n \n // Only enable if it's not readonly AND the browser supports speech recognition\n this.startBtn.setEnabled(!readOnly && !!this.recognition);\n\n const currentVal = this.getProperty(\"value\");\n if (currentVal !== undefined && currentVal !== null) {\n // Only update text area if we aren't currently dictating interim results\n if (!this.isRecording) {\n this.textArea.setValue(currentVal as string);\n }\n }\n }\n\n /**\n * Cleans up hardware event listeners when the control is destroyed.\n */\n public exit(): void {\n this.stopDictation();\n if (this.recognition) {\n this.recognition.onstart = null;\n this.recognition.onresult = null;\n this.recognition.onerror = null;\n this.recognition.onend = null;\n this.recognition = null;\n }\n super.exit();\n }\n}\n"],"mappings":";;;;;;QAAOA,mBAAmB,GAAAC,sBAAA,CAAAC,qBAAA;EAAA,MAMjBC,MAAM,GAAAC,eAAA;EAEf;AACA;AACA;AACA;EACe,MAAMC,iBAAiB,SAASL,mBAAmB,CAAC;IAC/D,OAAgBM,QAAQ,GAAG,iEAAiE;IAC5F,OAAgBC,QAAQ,GAAG;MACvBC,UAAU,EAAE,CAAC,CAAC;MACdC,MAAM,EAAE,CAAC;IACb,CAAC;IAOOC,WAAW,GAAQ,IAAI;IACvBC,WAAW,GAAY,KAAK;;IAEpC;AACJ;AACA;IACWC,IAAIA,CAAA,EAAS;MAChB,KAAK,CAACA,IAAI,CAAC,CAAC;MAEZ,IAAI,CAACC,QAAQ,GAAG,IAAIC,QAAQ,CAAC;QACzBC,IAAI,EAAE,CAAC;QACPC,KAAK,EAAE,MAAM;QACbC,WAAW,EAAE,mCAAmC;QAChDC,UAAU,EAAGC,MAAyB,IAAK;UACvC,IAAI,CAACC,eAAe,CAACD,MAAM,CAACE,YAAY,CAAC,OAAO,CAAC,CAAC;QACtD;MACJ,CAAC,CAAC;MAEF,IAAI,CAACC,QAAQ,GAAG,IAAIC,MAAM,CAAC;QACvBC,IAAI,EAAE,uBAAuB;QAC7BC,IAAI,EAAE,iBAAiB;QACvBC,IAAI,EAAE,YAAY;QAClBC,KAAK,EAAE,IAAI,CAACC,eAAe,CAACC,IAAI,CAAC,IAAI;MACzC,CAAC,CAAC;MAEF,MAAMC,IAAI,GAAG,IAAIC,IAAI,CAAC;QAClBC,KAAK,EAAE,CAAC,IAAI,CAACV,QAAQ;MACzB,CAAC,CAAC,CAACW,aAAa,CAAC,qBAAqB,CAAC;MAEvC,IAAI,CAACC,IAAI,GAAG,IAAIC,IAAI,CAAC;QACjBH,KAAK,EAAE,CAAC,IAAI,CAACnB,QAAQ,EAAEiB,IAAI;MAC/B,CAAC,CAAC;MAEF,IAAI,CAACM,cAAc,CAAC,UAAU,EAAE,IAAI,CAACF,IAAI,CAAC;MAC1C,IAAI,CAACG,qBAAqB,CAAC,CAAC;IAChC;IAEQT,eAAeA,CAAA,EAAS;MAC5B,IAAI,IAAI,CAACjB,WAAW,EAAE;QAClB,IAAI,CAAC2B,aAAa,CAAC,CAAC;MACxB,CAAC,MAAM;QACH,IAAI,CAACC,cAAc,CAAC,CAAC;MACzB;IACJ;IAEQF,qBAAqBA,CAAA,EAAS;MAClC,MAAMG,iBAAiB,GAAIC,MAAM,CAAaD,iBAAiB,IAAKC,MAAM,CAAaC,uBAAuB;MAC9G,IAAIF,iBAAiB,EAAE;QACnB,IAAI,CAAC9B,WAAW,GAAG,IAAI8B,iBAAiB,CAAC,CAAC;QAC1C,IAAI,CAAC9B,WAAW,CAACiC,UAAU,GAAG,IAAI;QAClC,IAAI,CAACjC,WAAW,CAACkC,cAAc,GAAG,IAAI;QAEtC,IAAI,CAAClC,WAAW,CAACmC,QAAQ,GAAIC,KAAU,IAAK;UACxC,IAAIC,eAAe,GAAG,EAAE;UACxB,IAAIC,iBAAiB,GAAG,EAAE;UAE1B,KAAK,IAAIC,CAAC,GAAGH,KAAK,CAACI,WAAW,EAAED,CAAC,GAAGH,KAAK,CAACK,OAAO,CAACC,MAAM,EAAE,EAAEH,CAAC,EAAE;YAC3D,IAAIH,KAAK,CAACK,OAAO,CAACF,CAAC,CAAC,CAACI,OAAO,EAAE;cAC1BN,eAAe,IAAID,KAAK,CAACK,OAAO,CAACF,CAAC,CAAC,CAAC,CAAC,CAAC,CAACK,UAAU;YACrD,CAAC,MAAM;cACHN,iBAAiB,IAAIF,KAAK,CAACK,OAAO,CAACF,CAAC,CAAC,CAAC,CAAC,CAAC,CAACK,UAAU;YACvD;UACJ;;UAEA;UACA,MAAMC,UAAU,GAAG,IAAI,CAACC,QAAQ,CAAC,CAAC,IAAI,EAAE;UACxC,MAAMC,MAAM,GAAGF,UAAU,GAAGA,UAAU,GAAG,GAAG,GAAGR,eAAe,GAAGA,eAAe;UAEhF,IAAIA,eAAe,EAAE;YACjB,IAAI,CAAClC,QAAQ,CAAC6C,QAAQ,CAACD,MAAM,CAAC;YAC9B,IAAI,CAACrC,eAAe,CAACqC,MAAM,CAAC;UAChC,CAAC,MAAM,IAAIT,iBAAiB,EAAE;YAC1B;YACA,IAAI,CAACnC,QAAQ,CAAC6C,QAAQ,CAACH,UAAU,GAAGA,UAAU,GAAG,GAAG,GAAGP,iBAAiB,GAAGA,iBAAiB,CAAC;UACjG;QACJ,CAAC;QAED,IAAI,CAACtC,WAAW,CAACiD,OAAO,GAAG,MAAM;UAC7B,IAAI,CAAChD,WAAW,GAAG,IAAI;UACvB,IAAI,CAACW,QAAQ,CAACsC,OAAO,CAAC,iBAAiB,CAAC;UACxC,IAAI,CAACtC,QAAQ,CAACuC,OAAO,CAAC,gBAAgB,CAAC;UACvC,IAAI,CAACvC,QAAQ,CAACwC,OAAO,CAAC,QAAQ,CAAC;UAC/BC,YAAY,CAACC,IAAI,CAAC,gCAAgC,CAAC;QACvD,CAAC;QAED,IAAI,CAACtD,WAAW,CAACuD,OAAO,GAAInB,KAAU,IAAK;UACvC3C,MAAM,CAAC+D,KAAK,CAAC,0BAA0B,EAAEpB,KAAK,CAACoB,KAAK,EAAE,mBAAmB,CAAC;UAC1EC,GAAG,CAACC,EAAE,CAACC,OAAO,CAAC,CAAC,kBAAkB,CAAC,EAAGC,UAAmB,IAAK;YAC1DA,UAAU,CAACJ,KAAK,CAAC,oBAAoB,GAAGpB,KAAK,CAACoB,KAAK,GAAG,gHAAgH,CAAC;UAC3K,CAAC,CAAC;UACF,IAAI,CAAC5B,aAAa,CAAC,CAAC;QACxB,CAAC;QAED,IAAI,CAAC5B,WAAW,CAAC6D,KAAK,GAAG,MAAM;UAC3B;UACA,IAAI,CAACjC,aAAa,CAAC,CAAC;QACxB,CAAC;MACL,CAAC,MAAM;QACHnC,MAAM,CAACqE,IAAI,CAAC,+CAA+C,EAAE,EAAE,EAAE,mBAAmB,CAAC;QACrF,IAAI,CAAClD,QAAQ,CAACmD,UAAU,CAAC,KAAK,CAAC;QAC/B,IAAI,CAACnD,QAAQ,CAACoD,UAAU,CAAC,sDAAsD,CAAC;MACpF;IACJ;IAEQnC,cAAcA,CAAA,EAAS;MAC3B,IAAI,CAAC,IAAI,CAAC7B,WAAW,EAAE;MAEvB,IAAI;QACA,IAAI,CAACA,WAAW,CAACiE,KAAK,CAAC,CAAC;QACxBZ,YAAY,CAACC,IAAI,CAAC,iCAAiC,CAAC;QACpD;QACA,IAAI,CAAC1C,QAAQ,CAACsC,OAAO,CAAC,iBAAiB,CAAC;QACxC,IAAI,CAACtC,QAAQ,CAACuC,OAAO,CAAC,mBAAmB,CAAC;QAC1C,IAAI,CAACvC,QAAQ,CAACwC,OAAO,CAAC,QAAQ,CAAC;MACnC,CAAC,CAAC,OAAOc,GAAQ,EAAE;QACfzE,MAAM,CAAC+D,KAAK,CAAC,oCAAoC,EAAEU,GAAG,CAACC,OAAO,IAAID,GAAG,EAAE,mBAAmB,CAAC;QAC3FT,GAAG,CAACC,EAAE,CAACC,OAAO,CAAC,CAAC,kBAAkB,CAAC,EAAGC,UAAmB,IAAK;UAC1DA,UAAU,CAACJ,KAAK,CAAC,2HAA2H,IAAIU,GAAG,CAACC,OAAO,IAAID,GAAG,CAAC,CAAC;QACxK,CAAC,CAAC;QACF,IAAI,CAACtC,aAAa,CAAC,CAAC;MACxB;IACJ;IAEQA,aAAaA,CAAA,EAAS;MAC1B,IAAI,CAAC,IAAI,CAAC5B,WAAW,EAAE;MAEvB,IAAI;QACA,IAAI,CAACA,WAAW,CAACoE,IAAI,CAAC,CAAC;MAC3B,CAAC,CAAC,OAAMC,CAAC,EAAE,CAAC;MAEZ,IAAI,CAACpE,WAAW,GAAG,KAAK;MACxB,IAAI,CAACW,QAAQ,CAACsC,OAAO,CAAC,uBAAuB,CAAC;MAC9C,IAAI,CAACtC,QAAQ,CAACuC,OAAO,CAAC,iBAAiB,CAAC;MACxC,IAAI,CAACvC,QAAQ,CAACwC,OAAO,CAAC,YAAY,CAAC;IACvC;;IAEA;AACJ;AACA;AACA;IACWkB,iBAAiBA,CAAA,EAAS;MAC7B,MAAMC,QAAQ,GAAG,IAAI,CAACC,WAAW,CAAC,UAAU,CAAC;MAC7C,IAAI,CAACrE,QAAQ,CAACsE,WAAW,CAAC,CAACF,QAAQ,CAAC;;MAEpC;MACA,IAAI,CAAC3D,QAAQ,CAACmD,UAAU,CAAC,CAACQ,QAAQ,IAAI,CAAC,CAAC,IAAI,CAACvE,WAAW,CAAC;MAEzD,MAAM6C,UAAU,GAAG,IAAI,CAAC2B,WAAW,CAAC,OAAO,CAAC;MAC5C,IAAI3B,UAAU,KAAK6B,SAAS,IAAI7B,UAAU,KAAK,IAAI,EAAE;QACjD;QACA,IAAI,CAAC,IAAI,CAAC5C,WAAW,EAAE;UACnB,IAAI,CAACE,QAAQ,CAAC6C,QAAQ,CAACH,UAAoB,CAAC;QAChD;MACJ;IACJ;;IAEA;AACJ;AACA;IACW8B,IAAIA,CAAA,EAAS;MAChB,IAAI,CAAC/C,aAAa,CAAC,CAAC;MACpB,IAAI,IAAI,CAAC5B,WAAW,EAAE;QAClB,IAAI,CAACA,WAAW,CAACiD,OAAO,GAAG,IAAI;QAC/B,IAAI,CAACjD,WAAW,CAACmC,QAAQ,GAAG,IAAI;QAChC,IAAI,CAACnC,WAAW,CAACuD,OAAO,GAAG,IAAI;QAC/B,IAAI,CAACvD,WAAW,CAAC6D,KAAK,GAAG,IAAI;QAC7B,IAAI,CAAC7D,WAAW,GAAG,IAAI;MAC3B;MACA,KAAK,CAAC2E,IAAI,CAAC,CAAC;IAChB;EACJ;EAAC,OAAAhF,iBAAA;AAAA","ignoreList":[]}
@@ -16,12 +16,22 @@ declare module "nz/co/siliconst/ui5/metaui/controls/VoiceInputControl" {
16
16
  private stopBtn;
17
17
  private recognition;
18
18
  private isRecording;
19
+ /**
20
+ * Initializes the dictation interface and requests Web Speech API setup.
21
+ */
19
22
  init(): void;
20
23
  private toggleDictation;
21
24
  private initSpeechRecognition;
22
25
  private startDictation;
23
26
  private stopDictation;
27
+ /**
28
+ * Lifecycle hook called before the control is rendered to the DOM.
29
+ * Handles browser support visual state.
30
+ */
24
31
  onBeforeRendering(): void;
32
+ /**
33
+ * Cleans up hardware event listeners when the control is destroyed.
34
+ */
25
35
  exit(): void;
26
36
  }
27
37
  }
@@ -1 +1 @@
1
- {"version":3,"file":"VoiceInputControl.d.ts","sourceRoot":"../../../../../../../..","sources":["src/nz/co/siliconst/ui5/metaui/controls/VoiceInputControl.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,uDAAuD,CAAC;IACvE,OAAO,mBAAmB,MAAM,yDAAyD,CAAC;IAQ1F;;;OAGG;IACH,MAAM,CAAC,OAAO,OAAO,iBAAkB,SAAQ,mBAAmB;QAC9D,MAAM,CAAC,QAAQ,CAAC,QAAQ,qEAAqE;QAC7F,MAAM,CAAC,QAAQ,CAAC,QAAQ;;;UAGtB;QAEF,OAAO,CAAC,IAAI,CAAQ;QACpB,OAAO,CAAC,QAAQ,CAAY;QAC5B,OAAO,CAAC,QAAQ,CAAU;QAC1B,OAAO,CAAC,OAAO,CAAU;QAEzB,OAAO,CAAC,WAAW,CAAa;QAChC,OAAO,CAAC,WAAW,CAAkB;QAE9B,IAAI,IAAI,IAAI;QA+BnB,OAAO,CAAC,eAAe;QAQvB,OAAO,CAAC,qBAAqB;QA2D7B,OAAO,CAAC,cAAc;QAmBtB,OAAO,CAAC,aAAa;QAad,iBAAiB,IAAI,IAAI;QAgBzB,IAAI,IAAI,IAAI;KAWtB;CAEA"}
1
+ {"version":3,"file":"VoiceInputControl.d.ts","sourceRoot":"../../../../../../../..","sources":["src/nz/co/siliconst/ui5/metaui/controls/VoiceInputControl.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,uDAAuD,CAAC;IACvE,OAAO,mBAAmB,MAAM,yDAAyD,CAAC;IAQ1F;;;OAGG;IACH,MAAM,CAAC,OAAO,OAAO,iBAAkB,SAAQ,mBAAmB;QAC9D,MAAM,CAAC,QAAQ,CAAC,QAAQ,qEAAqE;QAC7F,MAAM,CAAC,QAAQ,CAAC,QAAQ;;;UAGtB;QAEF,OAAO,CAAC,IAAI,CAAQ;QACpB,OAAO,CAAC,QAAQ,CAAY;QAC5B,OAAO,CAAC,QAAQ,CAAU;QAC1B,OAAO,CAAC,OAAO,CAAU;QAEzB,OAAO,CAAC,WAAW,CAAa;QAChC,OAAO,CAAC,WAAW,CAAkB;QAErC;;WAEG;QACI,IAAI,IAAI,IAAI;QA+BnB,OAAO,CAAC,eAAe;QAQvB,OAAO,CAAC,qBAAqB;QA2D7B,OAAO,CAAC,cAAc;QAmBtB,OAAO,CAAC,aAAa;QAarB;;;WAGG;QACI,iBAAiB,IAAI,IAAI;QAgBhC;;WAEG;QACI,IAAI,IAAI,IAAI;KAWtB;CAEA"}
@@ -1 +1 @@
1
- {"version":3,"file":"VoiceInputControl.js","names":["BaseHardwareControl","_interopRequireDefault","__BaseHardwareControl","Logger","___utils_Logger","VoiceInputControl","static","properties","events","recognition","isRecording","init","super","this","textArea","TextArea","rows","width","placeholder","liveChange","oEvent","setValueAndFire","getParameter","startBtn","Button","icon","text","type","press","toggleDictation","bind","hBox","HBox","items","addStyleClass","vBox","VBox","setAggregation","initSpeechRecognition","stopDictation","startDictation","SpeechRecognition","window","webkitSpeechRecognition","continuous","interimResults","onresult","event","finalTranscript","interimTranscript","i","resultIndex","results","length","isFinal","transcript","currentVal","getValue","newVal","setValue","onstart","setIcon","setText","setType","MessageToast","show","onerror","error","sap","ui","require","MessageBox","onend","warn","setEnabled","setTooltip","start","err","message","stop","e","onBeforeRendering","readOnly","getProperty","setEditable","undefined","exit"],"sources":["VoiceInputControl.ts"],"sourcesContent":["import BaseHardwareControl from \"./BaseHardwareControl\";\nimport Button from \"sap/m/Button\";\nimport VBox from \"sap/m/VBox\";\nimport TextArea from \"sap/m/TextArea\";\nimport MessageToast from \"sap/m/MessageToast\";\nimport HBox from \"sap/m/HBox\";\nimport { Logger } from \"../utils/Logger\";\n\n/**\n * VoiceInputControl\n * Provides a UI to dictate text using the browser's native Web Speech API.\n */\nexport default class VoiceInputControl extends BaseHardwareControl {\n static readonly renderer = \"nz.co.siliconst.ui5.metaui.controls.BaseHardwareControlRenderer\";\n static readonly metadata = {\n properties: {},\n events: {}\n };\n\n private vBox!: VBox;\n private textArea!: TextArea;\n private startBtn!: Button;\n private stopBtn!: Button;\n \n private recognition: any = null;\n private isRecording: boolean = false;\n\n public init(): void {\n super.init();\n\n this.textArea = new TextArea({\n rows: 3,\n width: \"100%\",\n placeholder: \"Dictated text will appear here...\",\n liveChange: (oEvent: sap.ui.base.Event) => {\n this.setValueAndFire(oEvent.getParameter(\"value\"));\n }\n });\n\n this.startBtn = new Button({\n icon: \"sap-icon://microphone\",\n text: \"Start Dictation\",\n type: \"Emphasized\",\n press: this.toggleDictation.bind(this)\n });\n\n const hBox = new HBox({\n items: [this.startBtn]\n }).addStyleClass(\"sapUiSmallMarginTop\");\n\n this.vBox = new VBox({\n items: [this.textArea, hBox]\n });\n\n this.setAggregation(\"_content\", this.vBox);\n this.initSpeechRecognition();\n }\n\n private toggleDictation(): void {\n if (this.isRecording) {\n this.stopDictation();\n } else {\n this.startDictation();\n }\n }\n\n private initSpeechRecognition(): void {\n const SpeechRecognition = (window as unknown).SpeechRecognition || (window as unknown).webkitSpeechRecognition;\n if (SpeechRecognition) {\n this.recognition = new SpeechRecognition();\n this.recognition.continuous = true;\n this.recognition.interimResults = true;\n\n this.recognition.onresult = (event: any) => {\n let finalTranscript = \"\";\n let interimTranscript = \"\";\n\n for (let i = event.resultIndex; i < event.results.length; ++i) {\n if (event.results[i].isFinal) {\n finalTranscript += event.results[i][0].transcript;\n } else {\n interimTranscript += event.results[i][0].transcript;\n }\n }\n\n // Append the new final transcript to whatever was already in the textarea\n const currentVal = this.getValue() || \"\";\n const newVal = currentVal ? currentVal + \" \" + finalTranscript : finalTranscript;\n \n if (finalTranscript) {\n this.textArea.setValue(newVal);\n this.setValueAndFire(newVal);\n } else if (interimTranscript) {\n // Just show interim temporarily in textarea without saving to model\n this.textArea.setValue(currentVal ? currentVal + \" \" + interimTranscript : interimTranscript);\n }\n };\n\n this.recognition.onstart = () => {\n this.isRecording = true;\n this.startBtn.setIcon(\"sap-icon://stop\");\n this.startBtn.setText(\"Stop Recording\");\n this.startBtn.setType(\"Reject\");\n MessageToast.show(\"Listening... Please speak now.\");\n };\n\n this.recognition.onerror = (event: any) => {\n Logger.error(\"Speech recognition error\", event.error, \"VoiceInputControl\");\n sap.ui.require([\"sap/m/MessageBox\"], (MessageBox: unknown) => {\n MessageBox.error(\"Microphone Error: \" + event.error + \"\\n\\nPlease ensure you have a working microphone attached and have not blocked access in your browser settings.\");\n });\n this.stopDictation();\n };\n \n this.recognition.onend = () => {\n // If it ends natively (e.g. timeout), update UI\n this.stopDictation();\n };\n } else {\n Logger.warn(\"Web Speech API not supported in this browser.\", \"\", \"VoiceInputControl\");\n this.startBtn.setEnabled(false);\n this.startBtn.setTooltip(\"Speech Recognition is not supported in this browser.\");\n }\n }\n\n private startDictation(): void {\n if (!this.recognition) return;\n \n try {\n this.recognition.start();\n MessageToast.show(\"Requesting microphone access...\");\n // Provide immediate UI feedback in case browser delays the onstart event\n this.startBtn.setIcon(\"sap-icon://stop\");\n this.startBtn.setText(\"Requesting mic...\");\n this.startBtn.setType(\"Reject\");\n } catch (err: any) {\n Logger.error(\"Failed to start speech recognition\", err.message || err, \"VoiceInputControl\");\n sap.ui.require([\"sap/m/MessageBox\"], (MessageBox: unknown) => {\n MessageBox.error(\"Failed to start dictation. Please ensure you have a working microphone and have granted browser permissions.\\n\\nDetails: \" + (err.message || err));\n });\n this.stopDictation();\n }\n }\n\n private stopDictation(): void {\n if (!this.recognition) return;\n \n try {\n this.recognition.stop();\n } catch(e) {}\n \n this.isRecording = false;\n this.startBtn.setIcon(\"sap-icon://microphone\");\n this.startBtn.setText(\"Start Dictation\");\n this.startBtn.setType(\"Emphasized\");\n }\n\n public onBeforeRendering(): void {\n const readOnly = this.getProperty(\"readOnly\");\n this.textArea.setEditable(!readOnly);\n \n // Only enable if it's not readonly AND the browser supports speech recognition\n this.startBtn.setEnabled(!readOnly && !!this.recognition);\n\n const currentVal = this.getProperty(\"value\");\n if (currentVal !== undefined && currentVal !== null) {\n // Only update text area if we aren't currently dictating interim results\n if (!this.isRecording) {\n this.textArea.setValue(currentVal as string);\n }\n }\n }\n\n public exit(): void {\n this.stopDictation();\n if (this.recognition) {\n this.recognition.onstart = null;\n this.recognition.onresult = null;\n this.recognition.onerror = null;\n this.recognition.onend = null;\n this.recognition = null;\n }\n super.exit();\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"VoiceInputControl.js","names":["BaseHardwareControl","_interopRequireDefault","__BaseHardwareControl","Logger","___utils_Logger","VoiceInputControl","static","properties","events","recognition","isRecording","init","super","this","textArea","TextArea","rows","width","placeholder","liveChange","oEvent","setValueAndFire","getParameter","startBtn","Button","icon","text","type","press","toggleDictation","bind","hBox","HBox","items","addStyleClass","vBox","VBox","setAggregation","initSpeechRecognition","stopDictation","startDictation","SpeechRecognition","window","webkitSpeechRecognition","continuous","interimResults","onresult","event","finalTranscript","interimTranscript","i","resultIndex","results","length","isFinal","transcript","currentVal","getValue","newVal","setValue","onstart","setIcon","setText","setType","MessageToast","show","onerror","error","sap","ui","require","MessageBox","onend","warn","setEnabled","setTooltip","start","err","message","stop","e","onBeforeRendering","readOnly","getProperty","setEditable","undefined","exit"],"sources":["VoiceInputControl.ts"],"sourcesContent":["import BaseHardwareControl from \"./BaseHardwareControl\";\nimport Button from \"sap/m/Button\";\nimport VBox from \"sap/m/VBox\";\nimport TextArea from \"sap/m/TextArea\";\nimport MessageToast from \"sap/m/MessageToast\";\nimport HBox from \"sap/m/HBox\";\nimport { Logger } from \"../utils/Logger\";\n\n/**\n * VoiceInputControl\n * Provides a UI to dictate text using the browser's native Web Speech API.\n */\nexport default class VoiceInputControl extends BaseHardwareControl {\n static readonly renderer = \"nz.co.siliconst.ui5.metaui.controls.BaseHardwareControlRenderer\";\n static readonly metadata = {\n properties: {},\n events: {}\n };\n\n private vBox!: VBox;\n private textArea!: TextArea;\n private startBtn!: Button;\n private stopBtn!: Button;\n \n private recognition: any = null;\n private isRecording: boolean = false;\n\n /**\n * Initializes the dictation interface and requests Web Speech API setup.\n */\n public init(): void {\n super.init();\n\n this.textArea = new TextArea({\n rows: 3,\n width: \"100%\",\n placeholder: \"Dictated text will appear here...\",\n liveChange: (oEvent: sap.ui.base.Event) => {\n this.setValueAndFire(oEvent.getParameter(\"value\"));\n }\n });\n\n this.startBtn = new Button({\n icon: \"sap-icon://microphone\",\n text: \"Start Dictation\",\n type: \"Emphasized\",\n press: this.toggleDictation.bind(this)\n });\n\n const hBox = new HBox({\n items: [this.startBtn]\n }).addStyleClass(\"sapUiSmallMarginTop\");\n\n this.vBox = new VBox({\n items: [this.textArea, hBox]\n });\n\n this.setAggregation(\"_content\", this.vBox);\n this.initSpeechRecognition();\n }\n\n private toggleDictation(): void {\n if (this.isRecording) {\n this.stopDictation();\n } else {\n this.startDictation();\n }\n }\n\n private initSpeechRecognition(): void {\n const SpeechRecognition = (window as unknown).SpeechRecognition || (window as unknown).webkitSpeechRecognition;\n if (SpeechRecognition) {\n this.recognition = new SpeechRecognition();\n this.recognition.continuous = true;\n this.recognition.interimResults = true;\n\n this.recognition.onresult = (event: any) => {\n let finalTranscript = \"\";\n let interimTranscript = \"\";\n\n for (let i = event.resultIndex; i < event.results.length; ++i) {\n if (event.results[i].isFinal) {\n finalTranscript += event.results[i][0].transcript;\n } else {\n interimTranscript += event.results[i][0].transcript;\n }\n }\n\n // Append the new final transcript to whatever was already in the textarea\n const currentVal = this.getValue() || \"\";\n const newVal = currentVal ? currentVal + \" \" + finalTranscript : finalTranscript;\n \n if (finalTranscript) {\n this.textArea.setValue(newVal);\n this.setValueAndFire(newVal);\n } else if (interimTranscript) {\n // Just show interim temporarily in textarea without saving to model\n this.textArea.setValue(currentVal ? currentVal + \" \" + interimTranscript : interimTranscript);\n }\n };\n\n this.recognition.onstart = () => {\n this.isRecording = true;\n this.startBtn.setIcon(\"sap-icon://stop\");\n this.startBtn.setText(\"Stop Recording\");\n this.startBtn.setType(\"Reject\");\n MessageToast.show(\"Listening... Please speak now.\");\n };\n\n this.recognition.onerror = (event: any) => {\n Logger.error(\"Speech recognition error\", event.error, \"VoiceInputControl\");\n sap.ui.require([\"sap/m/MessageBox\"], (MessageBox: unknown) => {\n MessageBox.error(\"Microphone Error: \" + event.error + \"\\n\\nPlease ensure you have a working microphone attached and have not blocked access in your browser settings.\");\n });\n this.stopDictation();\n };\n \n this.recognition.onend = () => {\n // If it ends natively (e.g. timeout), update UI\n this.stopDictation();\n };\n } else {\n Logger.warn(\"Web Speech API not supported in this browser.\", \"\", \"VoiceInputControl\");\n this.startBtn.setEnabled(false);\n this.startBtn.setTooltip(\"Speech Recognition is not supported in this browser.\");\n }\n }\n\n private startDictation(): void {\n if (!this.recognition) return;\n \n try {\n this.recognition.start();\n MessageToast.show(\"Requesting microphone access...\");\n // Provide immediate UI feedback in case browser delays the onstart event\n this.startBtn.setIcon(\"sap-icon://stop\");\n this.startBtn.setText(\"Requesting mic...\");\n this.startBtn.setType(\"Reject\");\n } catch (err: any) {\n Logger.error(\"Failed to start speech recognition\", err.message || err, \"VoiceInputControl\");\n sap.ui.require([\"sap/m/MessageBox\"], (MessageBox: unknown) => {\n MessageBox.error(\"Failed to start dictation. Please ensure you have a working microphone and have granted browser permissions.\\n\\nDetails: \" + (err.message || err));\n });\n this.stopDictation();\n }\n }\n\n private stopDictation(): void {\n if (!this.recognition) return;\n \n try {\n this.recognition.stop();\n } catch(e) {}\n \n this.isRecording = false;\n this.startBtn.setIcon(\"sap-icon://microphone\");\n this.startBtn.setText(\"Start Dictation\");\n this.startBtn.setType(\"Emphasized\");\n }\n\n /**\n * Lifecycle hook called before the control is rendered to the DOM.\n * Handles browser support visual state.\n */\n public onBeforeRendering(): void {\n const readOnly = this.getProperty(\"readOnly\");\n this.textArea.setEditable(!readOnly);\n \n // Only enable if it's not readonly AND the browser supports speech recognition\n this.startBtn.setEnabled(!readOnly && !!this.recognition);\n\n const currentVal = this.getProperty(\"value\");\n if (currentVal !== undefined && currentVal !== null) {\n // Only update text area if we aren't currently dictating interim results\n if (!this.isRecording) {\n this.textArea.setValue(currentVal as string);\n }\n }\n }\n\n /**\n * Cleans up hardware event listeners when the control is destroyed.\n */\n public exit(): void {\n this.stopDictation();\n if (this.recognition) {\n this.recognition.onstart = null;\n this.recognition.onresult = null;\n this.recognition.onerror = null;\n this.recognition.onend = null;\n this.recognition = null;\n }\n super.exit();\n }\n}\n"],"mappings":"qQAAOA,EAAmBC,EAAAC,GAAA,MAMjBC,EAAMC,EAAA,UAMA,MAAMC,UAA0BL,EAC3CM,gBAA2B,kEAC3BA,gBAA2B,CACvBC,WAAY,CAAC,EACbC,OAAQ,CAAC,GAQLC,YAAmB,KACnBC,YAAuB,MAKxBC,OACHC,MAAMD,OAENE,KAAKC,SAAW,IAAIC,EAAS,CACzBC,KAAM,EACNC,MAAO,OACPC,YAAa,oCACbC,WAAaC,IACTP,KAAKQ,gBAAgBD,EAAOE,aAAa,aAIjDT,KAAKU,SAAW,IAAIC,EAAO,CACvBC,KAAM,wBACNC,KAAM,kBACNC,KAAM,aACNC,MAAOf,KAAKgB,gBAAgBC,KAAKjB,QAGrC,MAAMkB,EAAO,IAAIC,EAAK,CAClBC,MAAO,CAACpB,KAAKU,YACdW,cAAc,uBAEjBrB,KAAKsB,KAAO,IAAIC,EAAK,CACjBH,MAAO,CAACpB,KAAKC,SAAUiB,KAG3BlB,KAAKwB,eAAe,WAAYxB,KAAKsB,MACrCtB,KAAKyB,uBACT,CAEQT,kBACJ,GAAIhB,KAAKH,YAAa,CAClBG,KAAK0B,eACT,KAAO,CACH1B,KAAK2B,gBACT,CACJ,CAEQF,wBACJ,MAAMG,EAAqBC,OAAmBD,mBAAsBC,OAAmBC,wBACvF,GAAIF,EAAmB,CACnB5B,KAAKJ,YAAc,IAAIgC,EACvB5B,KAAKJ,YAAYmC,WAAa,KAC9B/B,KAAKJ,YAAYoC,eAAiB,KAElChC,KAAKJ,YAAYqC,SAAYC,IACzB,IAAIC,EAAkB,GACtB,IAAIC,EAAoB,GAExB,IAAK,IAAIC,EAAIH,EAAMI,YAAaD,EAAIH,EAAMK,QAAQC,SAAUH,EAAG,CAC3D,GAAIH,EAAMK,QAAQF,GAAGI,QAAS,CAC1BN,GAAmBD,EAAMK,QAAQF,GAAG,GAAGK,UAC3C,KAAO,CACHN,GAAqBF,EAAMK,QAAQF,GAAG,GAAGK,UAC7C,CACJ,CAGA,MAAMC,EAAa3C,KAAK4C,YAAc,GACtC,MAAMC,EAASF,EAAaA,EAAa,IAAMR,EAAkBA,EAEjE,GAAIA,EAAiB,CACjBnC,KAAKC,SAAS6C,SAASD,GACvB7C,KAAKQ,gBAAgBqC,EACzB,MAAO,GAAIT,EAAmB,CAE1BpC,KAAKC,SAAS6C,SAASH,EAAaA,EAAa,IAAMP,EAAoBA,EAC/E,GAGJpC,KAAKJ,YAAYmD,QAAU,KACvB/C,KAAKH,YAAc,KACnBG,KAAKU,SAASsC,QAAQ,mBACtBhD,KAAKU,SAASuC,QAAQ,kBACtBjD,KAAKU,SAASwC,QAAQ,UACtBC,EAAaC,KAAK,mCAGtBpD,KAAKJ,YAAYyD,QAAWnB,IACxB5C,EAAOgE,MAAM,2BAA4BpB,EAAMoB,MAAO,qBACtDC,IAAIC,GAAGC,QAAQ,CAAC,oBAAsBC,IAClCA,EAAWJ,MAAM,qBAAuBpB,EAAMoB,MAAQ,oHAE1DtD,KAAK0B,iBAGT1B,KAAKJ,YAAY+D,MAAQ,KAErB3D,KAAK0B,gBAEb,KAAO,CACHpC,EAAOsE,KAAK,gDAAiD,GAAI,qBACjE5D,KAAKU,SAASmD,WAAW,OACzB7D,KAAKU,SAASoD,WAAW,uDAC7B,CACJ,CAEQnC,iBACJ,IAAK3B,KAAKJ,YAAa,OAEvB,IACII,KAAKJ,YAAYmE,QACjBZ,EAAaC,KAAK,mCAElBpD,KAAKU,SAASsC,QAAQ,mBACtBhD,KAAKU,SAASuC,QAAQ,qBACtBjD,KAAKU,SAASwC,QAAQ,SAC1B,CAAE,MAAOc,GACL1E,EAAOgE,MAAM,qCAAsCU,EAAIC,SAAWD,EAAK,qBACvET,IAAIC,GAAGC,QAAQ,CAAC,oBAAsBC,IAClCA,EAAWJ,MAAM,6HAA+HU,EAAIC,SAAWD,MAEnKhE,KAAK0B,eACT,CACJ,CAEQA,gBACJ,IAAK1B,KAAKJ,YAAa,OAEvB,IACII,KAAKJ,YAAYsE,MACrB,CAAE,MAAMC,GAAI,CAEZnE,KAAKH,YAAc,MACnBG,KAAKU,SAASsC,QAAQ,yBACtBhD,KAAKU,SAASuC,QAAQ,mBACtBjD,KAAKU,SAASwC,QAAQ,aAC1B,CAMOkB,oBACH,MAAMC,EAAWrE,KAAKsE,YAAY,YAClCtE,KAAKC,SAASsE,aAAaF,GAG3BrE,KAAKU,SAASmD,YAAYQ,KAAcrE,KAAKJ,aAE7C,MAAM+C,EAAa3C,KAAKsE,YAAY,SACpC,GAAI3B,IAAe6B,WAAa7B,IAAe,KAAM,CAEjD,IAAK3C,KAAKH,YAAa,CACnBG,KAAKC,SAAS6C,SAASH,EAC3B,CACJ,CACJ,CAKO8B,OACHzE,KAAK0B,gBACL,GAAI1B,KAAKJ,YAAa,CAClBI,KAAKJ,YAAYmD,QAAU,KAC3B/C,KAAKJ,YAAYqC,SAAW,KAC5BjC,KAAKJ,YAAYyD,QAAU,KAC3BrD,KAAKJ,YAAY+D,MAAQ,KACzB3D,KAAKJ,YAAc,IACvB,CACAG,MAAM0E,MACV,EACH,OAAAjF,CAAA","ignoreList":[]}
@@ -25,6 +25,9 @@ export default class VoiceInputControl extends BaseHardwareControl {
25
25
  private recognition: any = null;
26
26
  private isRecording: boolean = false;
27
27
 
28
+ /**
29
+ * Initializes the dictation interface and requests Web Speech API setup.
30
+ */
28
31
  public init(): void {
29
32
  super.init();
30
33
 
@@ -155,6 +158,10 @@ export default class VoiceInputControl extends BaseHardwareControl {
155
158
  this.startBtn.setType("Emphasized");
156
159
  }
157
160
 
161
+ /**
162
+ * Lifecycle hook called before the control is rendered to the DOM.
163
+ * Handles browser support visual state.
164
+ */
158
165
  public onBeforeRendering(): void {
159
166
  const readOnly = this.getProperty("readOnly");
160
167
  this.textArea.setEditable(!readOnly);
@@ -171,6 +178,9 @@ export default class VoiceInputControl extends BaseHardwareControl {
171
178
  }
172
179
  }
173
180
 
181
+ /**
182
+ * Cleans up hardware event listeners when the control is destroyed.
183
+ */
174
184
  public exit(): void {
175
185
  this.stopDictation();
176
186
  if (this.recognition) {
@@ -1,4 +1,4 @@
1
- sap.ui.define(["sap/ui/core/Control", "../../utils/Logger", "../../core/SchemaNormalizer", "../../core/SchemaValidator", "../../core/Engine", "../../core/StateManager", "./delegates/DataSyncDelegate", "./delegates/ValidationDelegate", "./delegates/DialogDelegate", "sap/m/MessageBox"], function (Control, ____utils_Logger, ____core_SchemaNormalizer, ____core_SchemaValidator, ____core_Engine, ____core_StateManager, ___delegates_DataSyncDelegate, ___delegates_ValidationDelegate, ___delegates_DialogDelegate, MessageBox) {
1
+ sap.ui.define(["sap/ui/core/Control", "../../utils/Logger", "../../core/SchemaNormalizer", "../../core/SchemaValidator", "../../core/Engine", "../../core/StateManager", "./delegates/DataSyncDelegate", "./delegates/ValidationDelegate", "./delegates/DialogDelegate", "sap/m/MessageBox", "../../core/PluginRegistry"], function (Control, ____utils_Logger, ____core_SchemaNormalizer, ____core_SchemaValidator, ____core_Engine, ____core_StateManager, ___delegates_DataSyncDelegate, ___delegates_ValidationDelegate, ___delegates_DialogDelegate, MessageBox, ____core_PluginRegistry) {
2
2
  "use strict";
3
3
 
4
4
  const Logger = ____utils_Logger["Logger"];
@@ -9,6 +9,7 @@ sap.ui.define(["sap/ui/core/Control", "../../utils/Logger", "../../core/SchemaNo
9
9
  const DataSyncDelegate = ___delegates_DataSyncDelegate["DataSyncDelegate"];
10
10
  const ValidationDelegate = ___delegates_ValidationDelegate["ValidationDelegate"];
11
11
  const DialogDelegate = ___delegates_DialogDelegate["DialogDelegate"];
12
+ const PluginRegistry = ____core_PluginRegistry["PluginRegistry"];
12
13
  /**
13
14
  * Base wrapper element for embedding the dynamic form natively via Explicit Schemas.
14
15
  *
@@ -69,9 +70,9 @@ sap.ui.define(["sap/ui/core/Control", "../../utils/Logger", "../../core/SchemaNo
69
70
  type: "boolean",
70
71
  defaultValue: false
71
72
  },
72
- displayMode: {
73
+ editable: {
73
74
  type: "boolean",
74
- defaultValue: false
75
+ defaultValue: true
75
76
  }
76
77
  },
77
78
  aggregations: {
@@ -159,6 +160,11 @@ sap.ui.define(["sap/ui/core/Control", "../../utils/Logger", "../../core/SchemaNo
159
160
  this.activeModelName = "";
160
161
  /** Cached schema for intelligent diffing during inference mode hot-swaps */
161
162
  this.parsedSchema = null;
163
+ /**
164
+ * Internal reference to the active debounce timeout.
165
+ * Prevents sequential redundant layouts from being generated when properties are set rapidly.
166
+ */
167
+ this._generateTimeoutId = null;
162
168
  },
163
169
  /**
164
170
  * Initializes the control and instantiates the composition delegates.
@@ -340,7 +346,7 @@ sap.ui.define(["sap/ui/core/Control", "../../utils/Logger", "../../core/SchemaNo
340
346
  this.dataSyncDelegate.handleInputDataHotSwap(propertyName, value, suppressInvalidate);
341
347
  return this;
342
348
  }
343
- if (propertyName === "displayMode" || propertyName === "debugMode" || propertyName === "schemaDefinition") {
349
+ if (propertyName === "editable" || propertyName === "debugMode" || propertyName === "schemaDefinition") {
344
350
  const currentVal = this.getProperty(propertyName);
345
351
  if (currentVal !== value) {
346
352
  Control.prototype.setProperty.call(this, propertyName, value, suppressInvalidate);
@@ -357,16 +363,38 @@ sap.ui.define(["sap/ui/core/Control", "../../utils/Logger", "../../core/SchemaNo
357
363
  return Control.prototype.setProperty.call(this, propertyName, value, suppressInvalidate);
358
364
  },
359
365
  /**
360
- * The core rendering pipeline.
361
- * Normalizes the schema, sets up the state manager, orchestrates the engine build,
362
- * and sets the generated UI components into the internal aggregation tree.
366
+ * The core rendering pipeline entry point.
367
+ * Debounces concurrent or rapid consecutive calls to prevent UI tearing and redundant network requests.
368
+ * Delays execution by 50ms to allow all synchronous property bindings to settle before orchestrating the build.
369
+ * @returns Promise that resolves when the layout is successfully built and mounted.
363
370
  */
364
- generate: function _generate() {
371
+ generate: async function _generate() {
372
+ return new Promise(resolve => {
373
+ if (this._generateTimeoutId !== null) {
374
+ window.clearTimeout(this._generateTimeoutId);
375
+ }
376
+ this._generateTimeoutId = window.setTimeout(async () => {
377
+ this._generateTimeoutId = null;
378
+ try {
379
+ await this._doGenerate();
380
+ } catch (e) {
381
+ Logger.error("[MetaUI]", "Error in deferred generate: " + e, "GeneratorHost");
382
+ }
383
+ resolve();
384
+ }, 50);
385
+ });
386
+ },
387
+ /**
388
+ * The underlying synchronous generator orchestration method.
389
+ * Normalizes the schema, sets up the state manager, loads missing plugins over the network,
390
+ * orchestrates the Engine build, and mounts the generated UI components into the internal tree.
391
+ */
392
+ _doGenerate: async function _doGenerate() {
365
393
  try {
366
394
  this.tearDownGeneratedLayout();
367
395
 
368
396
  // CRITICAL FIX: Extract the unsaved internal payload BEFORE destroying the state manager
369
- // Otherwise, toggling displayMode (or other structural properties) will wipe user inputs!
397
+ // Otherwise, toggling editable (or other structural properties) will wipe user inputs!
370
398
  let internalPayload = null;
371
399
  if (this.stateManager) {
372
400
  internalPayload = this.stateManager.extractPayload();
@@ -416,16 +444,24 @@ sap.ui.define(["sap/ui/core/Control", "../../utils/Logger", "../../core/SchemaNo
416
444
  }
417
445
  }
418
446
  }
447
+ const pathsToLoad = PluginRegistry.getInstance().getPathsToLoad(normalizedSchema);
448
+ const needsNetworkLoad = Array.from(pathsToLoad).some(path => !sap.ui.require(path));
449
+ if (needsNetworkLoad) {
450
+ this.setBusy(true);
451
+ await PluginRegistry.getInstance().preloadDependencies(normalizedSchema);
452
+ this.setBusy(false);
453
+ }
419
454
  this.activeModelName = "metaUI_" + this.getId();
420
455
  this.stateManager = new StateManager(finalData, normalizedSchema, this.activeModelName);
421
456
  this.setModel(this.stateManager.getModel(), this.activeModelName);
422
- this.engine = new Engine(this.getProperty("displayMode"));
457
+ this.engine = new Engine(this.getProperty("editable"));
423
458
  this.generatedContent = this.engine.build(normalizedSchema, this.stateManager.getModel(), this.activeModelName, this.triggerSubmit.bind(this), this.getId(), this.onInternalFieldChange.bind(this));
424
459
  this.setAggregation("_content", this.generatedContent);
425
460
  this.validationDelegate.registerObject(this.generatedContent);
426
461
  const payload = this.stateManager.extractPayload();
427
462
  this.dataSyncDelegate.pushToBindings(payload);
428
463
  } catch (error) {
464
+ this.setBusy(false);
429
465
  Logger.error("[MetaUI]", "Fatal crash during layout generation: " + error.message, "GeneratorHost");
430
466
  this.validationDelegate.mountCrashBoundary(error);
431
467
  }