@siliconst/metaui 1.4.6 → 1.4.8

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 (433) hide show
  1. package/package.json +1 -1
  2. package/src/nz/co/siliconst/ui5/metaui/controls/BaseHardwareControl-dbg.js.map +1 -1
  3. package/src/nz/co/siliconst/ui5/metaui/controls/BaseHardwareControl.d.ts +2 -2
  4. package/src/nz/co/siliconst/ui5/metaui/controls/BaseHardwareControl.d.ts.map +1 -1
  5. package/src/nz/co/siliconst/ui5/metaui/controls/BaseHardwareControl.js.map +1 -1
  6. package/src/nz/co/siliconst/ui5/metaui/controls/BaseHardwareControl.ts +2 -2
  7. package/src/nz/co/siliconst/ui5/metaui/controls/BaseHardwareControlRenderer-dbg.js.map +1 -1
  8. package/src/nz/co/siliconst/ui5/metaui/controls/BaseHardwareControlRenderer.js.map +1 -1
  9. package/src/nz/co/siliconst/ui5/metaui/controls/BaseHardwareControlRenderer.ts +2 -2
  10. package/src/nz/co/siliconst/ui5/metaui/controls/CameraControl-dbg.js +16 -2
  11. package/src/nz/co/siliconst/ui5/metaui/controls/CameraControl-dbg.js.map +1 -1
  12. package/src/nz/co/siliconst/ui5/metaui/controls/CameraControl.d.ts +11 -1
  13. package/src/nz/co/siliconst/ui5/metaui/controls/CameraControl.d.ts.map +1 -1
  14. package/src/nz/co/siliconst/ui5/metaui/controls/CameraControl.js +1 -1
  15. package/src/nz/co/siliconst/ui5/metaui/controls/CameraControl.js.map +1 -1
  16. package/src/nz/co/siliconst/ui5/metaui/controls/CameraControl.ts +14 -3
  17. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost-dbg.js +48 -5
  18. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost-dbg.js.map +1 -1
  19. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.d.ts +48 -5
  20. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.d.ts.map +1 -1
  21. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.js +1 -1
  22. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.js.map +1 -1
  23. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.ts +55 -10
  24. package/src/nz/co/siliconst/ui5/metaui/controls/GeolocationControl-dbg.js +32 -1
  25. package/src/nz/co/siliconst/ui5/metaui/controls/GeolocationControl-dbg.js.map +1 -1
  26. package/src/nz/co/siliconst/ui5/metaui/controls/GeolocationControl.d.ts +7 -0
  27. package/src/nz/co/siliconst/ui5/metaui/controls/GeolocationControl.d.ts.map +1 -1
  28. package/src/nz/co/siliconst/ui5/metaui/controls/GeolocationControl.js +1 -1
  29. package/src/nz/co/siliconst/ui5/metaui/controls/GeolocationControl.js.map +1 -1
  30. package/src/nz/co/siliconst/ui5/metaui/controls/GeolocationControl.ts +11 -1
  31. package/src/nz/co/siliconst/ui5/metaui/controls/RichTextControl-dbg.js +20 -0
  32. package/src/nz/co/siliconst/ui5/metaui/controls/RichTextControl-dbg.js.map +1 -1
  33. package/src/nz/co/siliconst/ui5/metaui/controls/RichTextControl.d.ts +12 -0
  34. package/src/nz/co/siliconst/ui5/metaui/controls/RichTextControl.d.ts.map +1 -1
  35. package/src/nz/co/siliconst/ui5/metaui/controls/RichTextControl.js +1 -1
  36. package/src/nz/co/siliconst/ui5/metaui/controls/RichTextControl.js.map +1 -1
  37. package/src/nz/co/siliconst/ui5/metaui/controls/RichTextControl.ts +21 -0
  38. package/src/nz/co/siliconst/ui5/metaui/controls/SignatureControl-dbg.js +38 -7
  39. package/src/nz/co/siliconst/ui5/metaui/controls/SignatureControl-dbg.js.map +1 -1
  40. package/src/nz/co/siliconst/ui5/metaui/controls/SignatureControl.d.ts +17 -1
  41. package/src/nz/co/siliconst/ui5/metaui/controls/SignatureControl.d.ts.map +1 -1
  42. package/src/nz/co/siliconst/ui5/metaui/controls/SignatureControl.js +1 -1
  43. package/src/nz/co/siliconst/ui5/metaui/controls/SignatureControl.js.map +1 -1
  44. package/src/nz/co/siliconst/ui5/metaui/controls/SignatureControl.ts +46 -8
  45. package/src/nz/co/siliconst/ui5/metaui/controls/VoiceInputControl-dbg.js +22 -6
  46. package/src/nz/co/siliconst/ui5/metaui/controls/VoiceInputControl-dbg.js.map +1 -1
  47. package/src/nz/co/siliconst/ui5/metaui/controls/VoiceInputControl.d.ts +41 -0
  48. package/src/nz/co/siliconst/ui5/metaui/controls/VoiceInputControl.d.ts.map +1 -1
  49. package/src/nz/co/siliconst/ui5/metaui/controls/VoiceInputControl.js +1 -1
  50. package/src/nz/co/siliconst/ui5/metaui/controls/VoiceInputControl.js.map +1 -1
  51. package/src/nz/co/siliconst/ui5/metaui/controls/VoiceInputControl.ts +57 -12
  52. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost-dbg.js +33 -5
  53. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost-dbg.js.map +1 -1
  54. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.d.ts +15 -4
  55. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.d.ts.map +1 -1
  56. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.js +1 -1
  57. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.js.map +1 -1
  58. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.ts +40 -7
  59. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate-dbg.js +5 -0
  60. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate-dbg.js.map +1 -1
  61. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate.d.ts +7 -3
  62. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate.d.ts.map +1 -1
  63. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate.js.map +1 -1
  64. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate.ts +8 -4
  65. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DialogDelegate-dbg.js +4 -0
  66. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DialogDelegate-dbg.js.map +1 -1
  67. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DialogDelegate.d.ts +5 -1
  68. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DialogDelegate.d.ts.map +1 -1
  69. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DialogDelegate.js.map +1 -1
  70. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DialogDelegate.ts +5 -1
  71. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ODataDelegate-dbg.js +1 -1
  72. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ODataDelegate-dbg.js.map +1 -1
  73. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ODataDelegate.d.ts +4 -3
  74. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ODataDelegate.d.ts.map +1 -1
  75. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ODataDelegate.js.map +1 -1
  76. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ODataDelegate.ts +9 -8
  77. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate-dbg.js +7 -3
  78. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate-dbg.js.map +1 -1
  79. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate.d.ts +5 -1
  80. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate.d.ts.map +1 -1
  81. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate.js +1 -1
  82. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate.js.map +1 -1
  83. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate.ts +11 -6
  84. package/src/nz/co/siliconst/ui5/metaui/core/ConditionEngine-dbg.js.map +1 -1
  85. package/src/nz/co/siliconst/ui5/metaui/core/ConditionEngine.d.ts +1 -1
  86. package/src/nz/co/siliconst/ui5/metaui/core/ConditionEngine.d.ts.map +1 -1
  87. package/src/nz/co/siliconst/ui5/metaui/core/ConditionEngine.js.map +1 -1
  88. package/src/nz/co/siliconst/ui5/metaui/core/ConditionEngine.ts +1 -1
  89. package/src/nz/co/siliconst/ui5/metaui/core/DefaultLayoutGenerator-dbg.js +45 -12
  90. package/src/nz/co/siliconst/ui5/metaui/core/DefaultLayoutGenerator-dbg.js.map +1 -1
  91. package/src/nz/co/siliconst/ui5/metaui/core/DefaultLayoutGenerator.d.ts +6 -0
  92. package/src/nz/co/siliconst/ui5/metaui/core/DefaultLayoutGenerator.d.ts.map +1 -1
  93. package/src/nz/co/siliconst/ui5/metaui/core/DefaultLayoutGenerator.js +1 -1
  94. package/src/nz/co/siliconst/ui5/metaui/core/DefaultLayoutGenerator.js.map +1 -1
  95. package/src/nz/co/siliconst/ui5/metaui/core/DefaultLayoutGenerator.ts +26 -13
  96. package/src/nz/co/siliconst/ui5/metaui/core/Engine-dbg.js +25 -12
  97. package/src/nz/co/siliconst/ui5/metaui/core/Engine-dbg.js.map +1 -1
  98. package/src/nz/co/siliconst/ui5/metaui/core/Engine.d.ts +5 -5
  99. package/src/nz/co/siliconst/ui5/metaui/core/Engine.d.ts.map +1 -1
  100. package/src/nz/co/siliconst/ui5/metaui/core/Engine.js +1 -1
  101. package/src/nz/co/siliconst/ui5/metaui/core/Engine.js.map +1 -1
  102. package/src/nz/co/siliconst/ui5/metaui/core/Engine.ts +35 -28
  103. package/src/nz/co/siliconst/ui5/metaui/core/PipelineManager-dbg.js +17 -3
  104. package/src/nz/co/siliconst/ui5/metaui/core/PipelineManager-dbg.js.map +1 -1
  105. package/src/nz/co/siliconst/ui5/metaui/core/PipelineManager.d.ts +5 -1
  106. package/src/nz/co/siliconst/ui5/metaui/core/PipelineManager.d.ts.map +1 -1
  107. package/src/nz/co/siliconst/ui5/metaui/core/PipelineManager.js +1 -1
  108. package/src/nz/co/siliconst/ui5/metaui/core/PipelineManager.js.map +1 -1
  109. package/src/nz/co/siliconst/ui5/metaui/core/PipelineManager.ts +14 -4
  110. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry-dbg.js +162 -106
  111. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry-dbg.js.map +1 -1
  112. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry.d.ts +25 -26
  113. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry.d.ts.map +1 -1
  114. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry.js +1 -1
  115. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry.js.map +1 -1
  116. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry.ts +180 -113
  117. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer-dbg.js +26 -0
  118. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer-dbg.js.map +1 -1
  119. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.d.ts +23 -1
  120. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.d.ts.map +1 -1
  121. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.js.map +1 -1
  122. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.ts +29 -7
  123. package/src/nz/co/siliconst/ui5/metaui/core/SchemaValidator-dbg.js.map +1 -1
  124. package/src/nz/co/siliconst/ui5/metaui/core/SchemaValidator.d.ts +1 -1
  125. package/src/nz/co/siliconst/ui5/metaui/core/SchemaValidator.d.ts.map +1 -1
  126. package/src/nz/co/siliconst/ui5/metaui/core/SchemaValidator.js.map +1 -1
  127. package/src/nz/co/siliconst/ui5/metaui/core/SchemaValidator.ts +1 -1
  128. package/src/nz/co/siliconst/ui5/metaui/core/StateManager-dbg.js +6 -0
  129. package/src/nz/co/siliconst/ui5/metaui/core/StateManager-dbg.js.map +1 -1
  130. package/src/nz/co/siliconst/ui5/metaui/core/StateManager.d.ts +7 -2
  131. package/src/nz/co/siliconst/ui5/metaui/core/StateManager.d.ts.map +1 -1
  132. package/src/nz/co/siliconst/ui5/metaui/core/StateManager.js.map +1 -1
  133. package/src/nz/co/siliconst/ui5/metaui/core/StateManager.ts +11 -6
  134. package/src/nz/co/siliconst/ui5/metaui/interfaces/IPipeline-dbg.js.map +1 -1
  135. package/src/nz/co/siliconst/ui5/metaui/interfaces/IPipeline.d.ts +1 -1
  136. package/src/nz/co/siliconst/ui5/metaui/interfaces/IPipeline.d.ts.map +1 -1
  137. package/src/nz/co/siliconst/ui5/metaui/interfaces/IPipeline.ts +1 -1
  138. package/src/nz/co/siliconst/ui5/metaui/layouts/CompactLayout-dbg.js +10 -0
  139. package/src/nz/co/siliconst/ui5/metaui/layouts/CompactLayout-dbg.js.map +1 -1
  140. package/src/nz/co/siliconst/ui5/metaui/layouts/CompactLayout.d.ts +9 -0
  141. package/src/nz/co/siliconst/ui5/metaui/layouts/CompactLayout.d.ts.map +1 -1
  142. package/src/nz/co/siliconst/ui5/metaui/layouts/CompactLayout.js.map +1 -1
  143. package/src/nz/co/siliconst/ui5/metaui/layouts/CompactLayout.ts +9 -0
  144. package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout-dbg.js +10 -0
  145. package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout-dbg.js.map +1 -1
  146. package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout.d.ts +9 -0
  147. package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout.d.ts.map +1 -1
  148. package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout.js.map +1 -1
  149. package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout.ts +10 -1
  150. package/src/nz/co/siliconst/ui5/metaui/layouts/WizardLayout-dbg.js +9 -0
  151. package/src/nz/co/siliconst/ui5/metaui/layouts/WizardLayout-dbg.js.map +1 -1
  152. package/src/nz/co/siliconst/ui5/metaui/layouts/WizardLayout.d.ts +8 -0
  153. package/src/nz/co/siliconst/ui5/metaui/layouts/WizardLayout.d.ts.map +1 -1
  154. package/src/nz/co/siliconst/ui5/metaui/layouts/WizardLayout.js.map +1 -1
  155. package/src/nz/co/siliconst/ui5/metaui/layouts/WizardLayout.ts +9 -1
  156. package/src/nz/co/siliconst/ui5/metaui/library-dbg.js +3 -33
  157. package/src/nz/co/siliconst/ui5/metaui/library-dbg.js.map +1 -1
  158. package/src/nz/co/siliconst/ui5/metaui/library-preload.js +33 -34
  159. package/src/nz/co/siliconst/ui5/metaui/library-preload.js.map +1 -1
  160. package/src/nz/co/siliconst/ui5/metaui/library.d.ts +14 -7
  161. package/src/nz/co/siliconst/ui5/metaui/library.d.ts.map +1 -1
  162. package/src/nz/co/siliconst/ui5/metaui/library.js +1 -1
  163. package/src/nz/co/siliconst/ui5/metaui/library.js.map +1 -1
  164. package/src/nz/co/siliconst/ui5/metaui/library.ts +15 -34
  165. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/ClearFormActionPlugin-dbg.js.map +1 -1
  166. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/ClearFormActionPlugin.d.ts +1 -1
  167. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/ClearFormActionPlugin.d.ts.map +1 -1
  168. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/ClearFormActionPlugin.js.map +1 -1
  169. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/ClearFormActionPlugin.ts +1 -1
  170. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/SubmitFormActionPlugin-dbg.js +0 -2
  171. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/SubmitFormActionPlugin-dbg.js.map +1 -1
  172. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/SubmitFormActionPlugin.d.ts +1 -1
  173. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/SubmitFormActionPlugin.d.ts.map +1 -1
  174. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/SubmitFormActionPlugin.js.map +1 -1
  175. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/SubmitFormActionPlugin.ts +2 -4
  176. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/UrlNavigationActionPlugin-dbg.js.map +1 -1
  177. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/UrlNavigationActionPlugin.d.ts +1 -1
  178. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/UrlNavigationActionPlugin.d.ts.map +1 -1
  179. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/UrlNavigationActionPlugin.js.map +1 -1
  180. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/UrlNavigationActionPlugin.ts +1 -1
  181. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin-dbg.js +18 -0
  182. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin-dbg.js.map +1 -1
  183. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin.d.ts +17 -1
  184. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin.d.ts.map +1 -1
  185. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin.js.map +1 -1
  186. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin.ts +20 -4
  187. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin-dbg.js +21 -8
  188. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin-dbg.js.map +1 -1
  189. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin.d.ts +18 -1
  190. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin.d.ts.map +1 -1
  191. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin.js +1 -1
  192. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin.js.map +1 -1
  193. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin.ts +25 -13
  194. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin-dbg.js.map +1 -1
  195. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.d.ts +2 -2
  196. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.d.ts.map +1 -1
  197. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.js.map +1 -1
  198. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.ts +5 -5
  199. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin-dbg.js +2 -3
  200. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin-dbg.js.map +1 -1
  201. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin.d.ts +1 -1
  202. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin.d.ts.map +1 -1
  203. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin.js +1 -1
  204. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin.js.map +1 -1
  205. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin.ts +5 -3
  206. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin-dbg.js +20 -3
  207. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin-dbg.js.map +1 -1
  208. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin.d.ts +18 -1
  209. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin.d.ts.map +1 -1
  210. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin.js +1 -1
  211. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin.js.map +1 -1
  212. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin.ts +23 -6
  213. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin-dbg.js +30 -3
  214. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin-dbg.js.map +1 -1
  215. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin.d.ts +26 -1
  216. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin.d.ts.map +1 -1
  217. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin.js +1 -1
  218. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin.js.map +1 -1
  219. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin.ts +39 -14
  220. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin-dbg.js +20 -3
  221. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin-dbg.js.map +1 -1
  222. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin.d.ts +18 -1
  223. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin.d.ts.map +1 -1
  224. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin.js +1 -1
  225. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin.js.map +1 -1
  226. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin.ts +20 -3
  227. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin-dbg.js +20 -3
  228. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin-dbg.js.map +1 -1
  229. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin.d.ts +18 -1
  230. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin.d.ts.map +1 -1
  231. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin.js +1 -1
  232. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin.js.map +1 -1
  233. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin.ts +20 -3
  234. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin-dbg.js +4 -4
  235. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin-dbg.js.map +1 -1
  236. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin.d.ts +4 -2
  237. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin.d.ts.map +1 -1
  238. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin.js +1 -1
  239. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin.js.map +1 -1
  240. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin.ts +6 -4
  241. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin-dbg.js +20 -3
  242. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin-dbg.js.map +1 -1
  243. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin.d.ts +18 -1
  244. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin.d.ts.map +1 -1
  245. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin.js +1 -1
  246. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin.js.map +1 -1
  247. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin.ts +20 -3
  248. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin-dbg.js +20 -3
  249. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin-dbg.js.map +1 -1
  250. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin.d.ts +18 -1
  251. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin.d.ts.map +1 -1
  252. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin.js +1 -1
  253. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin.js.map +1 -1
  254. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin.ts +23 -6
  255. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MessageStripPlugin-dbg.js +18 -0
  256. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MessageStripPlugin-dbg.js.map +1 -1
  257. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MessageStripPlugin.d.ts +17 -1
  258. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MessageStripPlugin.d.ts.map +1 -1
  259. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MessageStripPlugin.js.map +1 -1
  260. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MessageStripPlugin.ts +17 -1
  261. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin-dbg.js +20 -3
  262. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin-dbg.js.map +1 -1
  263. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin.d.ts +18 -1
  264. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin.d.ts.map +1 -1
  265. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin.js +1 -1
  266. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin.js.map +1 -1
  267. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin.ts +21 -4
  268. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin-dbg.js +20 -3
  269. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin-dbg.js.map +1 -1
  270. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin.d.ts +18 -1
  271. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin.d.ts.map +1 -1
  272. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin.js +1 -1
  273. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin.js.map +1 -1
  274. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin.ts +20 -3
  275. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin-dbg.js +23 -0
  276. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin-dbg.js.map +1 -1
  277. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin.d.ts +21 -1
  278. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin.d.ts.map +1 -1
  279. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin.js.map +1 -1
  280. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin.ts +28 -7
  281. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin-dbg.js +20 -3
  282. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin-dbg.js.map +1 -1
  283. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin.d.ts +18 -1
  284. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin.d.ts.map +1 -1
  285. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin.js +1 -1
  286. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin.js.map +1 -1
  287. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin.ts +20 -3
  288. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin-dbg.js +20 -3
  289. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin-dbg.js.map +1 -1
  290. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin.d.ts +17 -0
  291. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin.d.ts.map +1 -1
  292. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin.js +1 -1
  293. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin.js.map +1 -1
  294. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin.ts +22 -5
  295. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin-dbg.js +20 -3
  296. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin-dbg.js.map +1 -1
  297. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin.d.ts +18 -1
  298. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin.d.ts.map +1 -1
  299. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin.js +1 -1
  300. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin.js.map +1 -1
  301. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin.ts +25 -8
  302. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin-dbg.js +20 -3
  303. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin-dbg.js.map +1 -1
  304. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin.d.ts +18 -1
  305. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin.d.ts.map +1 -1
  306. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin.js +1 -1
  307. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin.js.map +1 -1
  308. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin.ts +22 -5
  309. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin-dbg.js +4 -4
  310. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin-dbg.js.map +1 -1
  311. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin.d.ts +4 -2
  312. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin.d.ts.map +1 -1
  313. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin.js +1 -1
  314. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin.js.map +1 -1
  315. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin.ts +8 -6
  316. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin-dbg.js +20 -3
  317. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin-dbg.js.map +1 -1
  318. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin.d.ts +18 -1
  319. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin.d.ts.map +1 -1
  320. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin.js +1 -1
  321. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin.js.map +1 -1
  322. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin.ts +22 -5
  323. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin-dbg.js +20 -3
  324. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin-dbg.js.map +1 -1
  325. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin.d.ts +18 -1
  326. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin.d.ts.map +1 -1
  327. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin.js +1 -1
  328. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin.js.map +1 -1
  329. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin.ts +22 -5
  330. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin-dbg.js +20 -3
  331. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin-dbg.js.map +1 -1
  332. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin.d.ts +18 -1
  333. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin.d.ts.map +1 -1
  334. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin.js +1 -1
  335. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin.js.map +1 -1
  336. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin.ts +22 -5
  337. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin-dbg.js +20 -3
  338. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin-dbg.js.map +1 -1
  339. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin.d.ts +18 -1
  340. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin.d.ts.map +1 -1
  341. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin.js +1 -1
  342. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin.js.map +1 -1
  343. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin.ts +24 -7
  344. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/LiveSearchPlugin-dbg.js +9 -0
  345. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/LiveSearchPlugin-dbg.js.map +1 -1
  346. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/LiveSearchPlugin.d.ts +8 -1
  347. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/LiveSearchPlugin.d.ts.map +1 -1
  348. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/LiveSearchPlugin.js.map +1 -1
  349. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/LiveSearchPlugin.ts +13 -6
  350. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/ODataListBindingPlugin-dbg.js +9 -0
  351. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/ODataListBindingPlugin-dbg.js.map +1 -1
  352. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/ODataListBindingPlugin.d.ts +8 -1
  353. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/ODataListBindingPlugin.d.ts.map +1 -1
  354. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/ODataListBindingPlugin.js.map +1 -1
  355. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/ODataListBindingPlugin.ts +10 -3
  356. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteDropdownPlugin-dbg.js +19 -0
  357. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteDropdownPlugin-dbg.js.map +1 -1
  358. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteDropdownPlugin.d.ts +18 -1
  359. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteDropdownPlugin.d.ts.map +1 -1
  360. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteDropdownPlugin.js.map +1 -1
  361. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteDropdownPlugin.ts +19 -2
  362. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteValueHelpPlugin-dbg.js +23 -0
  363. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteValueHelpPlugin-dbg.js.map +1 -1
  364. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteValueHelpPlugin.d.ts +20 -1
  365. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteValueHelpPlugin.d.ts.map +1 -1
  366. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteValueHelpPlugin.js.map +1 -1
  367. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteValueHelpPlugin.ts +25 -6
  368. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/CurrencyFormatterPlugin-dbg.js.map +1 -1
  369. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/CurrencyFormatterPlugin.d.ts +1 -1
  370. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/CurrencyFormatterPlugin.d.ts.map +1 -1
  371. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/CurrencyFormatterPlugin.js.map +1 -1
  372. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/CurrencyFormatterPlugin.ts +2 -2
  373. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/DateFormatterPlugin-dbg.js +6 -0
  374. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/DateFormatterPlugin-dbg.js.map +1 -1
  375. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/DateFormatterPlugin.d.ts +6 -1
  376. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/DateFormatterPlugin.d.ts.map +1 -1
  377. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/DateFormatterPlugin.js.map +1 -1
  378. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/DateFormatterPlugin.ts +7 -2
  379. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/PhoneFormatterPlugin-dbg.js +5 -0
  380. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/PhoneFormatterPlugin-dbg.js.map +1 -1
  381. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/PhoneFormatterPlugin.d.ts +6 -1
  382. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/PhoneFormatterPlugin.d.ts.map +1 -1
  383. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/PhoneFormatterPlugin.js.map +1 -1
  384. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/PhoneFormatterPlugin.ts +6 -1
  385. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/TextCaseFormatterPlugin-dbg.js +5 -0
  386. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/TextCaseFormatterPlugin-dbg.js.map +1 -1
  387. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/TextCaseFormatterPlugin.d.ts +6 -1
  388. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/TextCaseFormatterPlugin.d.ts.map +1 -1
  389. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/TextCaseFormatterPlugin.js.map +1 -1
  390. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/TextCaseFormatterPlugin.ts +6 -1
  391. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/EmailValidatorPlugin-dbg.js.map +1 -1
  392. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/EmailValidatorPlugin.d.ts +1 -1
  393. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/EmailValidatorPlugin.d.ts.map +1 -1
  394. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/EmailValidatorPlugin.js.map +1 -1
  395. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/EmailValidatorPlugin.ts +1 -1
  396. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/IbanValidatorPlugin-dbg.js +6 -0
  397. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/IbanValidatorPlugin-dbg.js.map +1 -1
  398. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/IbanValidatorPlugin.d.ts +7 -1
  399. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/IbanValidatorPlugin.d.ts.map +1 -1
  400. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/IbanValidatorPlugin.js.map +1 -1
  401. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/IbanValidatorPlugin.ts +7 -1
  402. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/MinLengthValidatorPlugin-dbg.js +6 -0
  403. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/MinLengthValidatorPlugin-dbg.js.map +1 -1
  404. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/MinLengthValidatorPlugin.d.ts +7 -1
  405. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/MinLengthValidatorPlugin.d.ts.map +1 -1
  406. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/MinLengthValidatorPlugin.js.map +1 -1
  407. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/MinLengthValidatorPlugin.ts +7 -1
  408. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/PatternValidatorPlugin-dbg.js +6 -0
  409. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/PatternValidatorPlugin-dbg.js.map +1 -1
  410. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/PatternValidatorPlugin.d.ts +7 -1
  411. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/PatternValidatorPlugin.d.ts.map +1 -1
  412. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/PatternValidatorPlugin.js.map +1 -1
  413. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/PatternValidatorPlugin.ts +7 -1
  414. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/RangeValidatorPlugin-dbg.js +6 -0
  415. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/RangeValidatorPlugin-dbg.js.map +1 -1
  416. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/RangeValidatorPlugin.d.ts +7 -1
  417. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/RangeValidatorPlugin.d.ts.map +1 -1
  418. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/RangeValidatorPlugin.js.map +1 -1
  419. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/RangeValidatorPlugin.ts +7 -1
  420. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/UrlValidatorPlugin-dbg.js +6 -0
  421. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/UrlValidatorPlugin-dbg.js.map +1 -1
  422. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/UrlValidatorPlugin.d.ts +7 -1
  423. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/UrlValidatorPlugin.d.ts.map +1 -1
  424. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/UrlValidatorPlugin.js.map +1 -1
  425. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/UrlValidatorPlugin.ts +7 -1
  426. package/src/nz/co/siliconst/ui5/metaui/typings/ui5-custom.d.ts +20 -0
  427. package/src/nz/co/siliconst/ui5/metaui/core/LayoutRegistry-dbg.js +0 -32
  428. package/src/nz/co/siliconst/ui5/metaui/core/LayoutRegistry-dbg.js.map +0 -1
  429. package/src/nz/co/siliconst/ui5/metaui/core/LayoutRegistry.d.ts +0 -16
  430. package/src/nz/co/siliconst/ui5/metaui/core/LayoutRegistry.d.ts.map +0 -1
  431. package/src/nz/co/siliconst/ui5/metaui/core/LayoutRegistry.js +0 -2
  432. package/src/nz/co/siliconst/ui5/metaui/core/LayoutRegistry.js.map +0 -1
  433. package/src/nz/co/siliconst/ui5/metaui/core/LayoutRegistry.ts +0 -26
@@ -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({
@@ -51,9 +55,9 @@ sap.ui.define(["./BaseHardwareControl", "sap/m/Button", "sap/m/VBox", "sap/m/Tex
51
55
  }
52
56
  }
53
57
  initSpeechRecognition() {
54
- const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
55
- if (SpeechRecognition) {
56
- this.recognition = new SpeechRecognition();
58
+ const SpeechRecognitionClass = window.SpeechRecognition || window.webkitSpeechRecognition;
59
+ if (SpeechRecognitionClass) {
60
+ this.recognition = new SpeechRecognitionClass();
57
61
  this.recognition.continuous = true;
58
62
  this.recognition.interimResults = true;
59
63
  this.recognition.onresult = event => {
@@ -112,9 +116,10 @@ sap.ui.define(["./BaseHardwareControl", "sap/m/Button", "sap/m/VBox", "sap/m/Tex
112
116
  this.startBtn.setText("Requesting mic...");
113
117
  this.startBtn.setType("Reject");
114
118
  } catch (err) {
115
- Logger.error("Failed to start speech recognition", err.message || err, "VoiceInputControl");
119
+ const error = err;
120
+ Logger.error("Failed to start speech recognition", error.message || String(error), "VoiceInputControl");
116
121
  sap.ui.require(["sap/m/MessageBox"], MessageBox => {
117
- MessageBox.error("Failed to start dictation. Please ensure you have a working microphone and have granted browser permissions.\n\nDetails: " + (err.message || err));
122
+ MessageBox.error("Failed to start dictation. Please ensure you have a working microphone and have granted browser permissions.\n\nDetails: " + (error.message || String(error)));
118
123
  });
119
124
  this.stopDictation();
120
125
  }
@@ -123,12 +128,19 @@ sap.ui.define(["./BaseHardwareControl", "sap/m/Button", "sap/m/VBox", "sap/m/Tex
123
128
  if (!this.recognition) return;
124
129
  try {
125
130
  this.recognition.stop();
126
- } catch (e) {}
131
+ } catch (e) {
132
+ Logger.warn("Failed to gracefully stop speech recognition.", String(e), "VoiceInputControl");
133
+ }
127
134
  this.isRecording = false;
128
135
  this.startBtn.setIcon("sap-icon://microphone");
129
136
  this.startBtn.setText("Start Dictation");
130
137
  this.startBtn.setType("Emphasized");
131
138
  }
139
+
140
+ /**
141
+ * Lifecycle hook called before the control is rendered to the DOM.
142
+ * Handles browser support visual state.
143
+ */
132
144
  onBeforeRendering() {
133
145
  const readOnly = this.getProperty("readOnly");
134
146
  this.textArea.setEditable(!readOnly);
@@ -143,6 +155,10 @@ sap.ui.define(["./BaseHardwareControl", "sap/m/Button", "sap/m/VBox", "sap/m/Tex
143
155
  }
144
156
  }
145
157
  }
158
+
159
+ /**
160
+ * Cleans up hardware event listeners when the control is destroyed.
161
+ */
146
162
  exit() {
147
163
  this.stopDictation();
148
164
  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","SpeechRecognitionClass","window","SpeechRecognition","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","String","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\ndeclare global {\n interface Window {\n SpeechRecognition: new () => SpeechRecognition;\n webkitSpeechRecognition: new () => SpeechRecognition;\n }\n interface SpeechRecognition {\n continuous: boolean;\n interimResults: boolean;\n onresult: (event: SpeechRecognitionEvent) => void;\n onstart: () => void;\n onerror: (event: SpeechRecognitionErrorEvent) => void;\n onend: () => void;\n start(): void;\n stop(): void;\n }\n interface SpeechRecognitionEvent {\n resultIndex: number;\n results: {\n length: number;\n [index: number]: {\n isFinal: boolean;\n [index: number]: {\n transcript: string;\n };\n };\n };\n }\n interface SpeechRecognitionErrorEvent {\n error: string;\n }\n}\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: SpeechRecognition | null = 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 SpeechRecognitionClass = window.SpeechRecognition || window.webkitSpeechRecognition;\n if (SpeechRecognitionClass) {\n this.recognition = new SpeechRecognitionClass();\n this.recognition.continuous = true;\n this.recognition.interimResults = true;\n\n this.recognition.onresult = (event: SpeechRecognitionEvent) => {\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: SpeechRecognitionErrorEvent) => {\n Logger.error(\"Speech recognition error\", event.error, \"VoiceInputControl\");\n sap.ui.require([\"sap/m/MessageBox\"], (MessageBox: typeof import(\"sap/m/MessageBox\").default) => {\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) {\n const error = err as Error;\n Logger.error(\"Failed to start speech recognition\", error.message || String(error), \"VoiceInputControl\");\n sap.ui.require([\"sap/m/MessageBox\"], (MessageBox: typeof import(\"sap/m/MessageBox\").default) => {\n MessageBox.error(\"Failed to start dictation. Please ensure you have a working microphone and have granted browser permissions.\\n\\nDetails: \" + (error.message || String(error)));\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 Logger.warn(\"Failed to gracefully stop speech recognition.\", String(e), \"VoiceInputControl\");\n }\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":"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","ignoreList":[]}
@@ -1,5 +1,36 @@
1
1
  declare module "nz/co/siliconst/ui5/metaui/controls/VoiceInputControl" {
2
2
  import BaseHardwareControl from "nz/co/siliconst/ui5/metaui/controls/BaseHardwareControl";
3
+ global {
4
+ interface Window {
5
+ SpeechRecognition: new () => SpeechRecognition;
6
+ webkitSpeechRecognition: new () => SpeechRecognition;
7
+ }
8
+ interface SpeechRecognition {
9
+ continuous: boolean;
10
+ interimResults: boolean;
11
+ onresult: (event: SpeechRecognitionEvent) => void;
12
+ onstart: () => void;
13
+ onerror: (event: SpeechRecognitionErrorEvent) => void;
14
+ onend: () => void;
15
+ start(): void;
16
+ stop(): void;
17
+ }
18
+ interface SpeechRecognitionEvent {
19
+ resultIndex: number;
20
+ results: {
21
+ length: number;
22
+ [index: number]: {
23
+ isFinal: boolean;
24
+ [index: number]: {
25
+ transcript: string;
26
+ };
27
+ };
28
+ };
29
+ }
30
+ interface SpeechRecognitionErrorEvent {
31
+ error: string;
32
+ }
33
+ }
3
34
  /**
4
35
  * VoiceInputControl
5
36
  * Provides a UI to dictate text using the browser's native Web Speech API.
@@ -16,12 +47,22 @@ declare module "nz/co/siliconst/ui5/metaui/controls/VoiceInputControl" {
16
47
  private stopBtn;
17
48
  private recognition;
18
49
  private isRecording;
50
+ /**
51
+ * Initializes the dictation interface and requests Web Speech API setup.
52
+ */
19
53
  init(): void;
20
54
  private toggleDictation;
21
55
  private initSpeechRecognition;
22
56
  private startDictation;
23
57
  private stopDictation;
58
+ /**
59
+ * Lifecycle hook called before the control is rendered to the DOM.
60
+ * Handles browser support visual state.
61
+ */
24
62
  onBeforeRendering(): void;
63
+ /**
64
+ * Cleans up hardware event listeners when the control is destroyed.
65
+ */
25
66
  exit(): void;
26
67
  }
27
68
  }
@@ -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;IAQlF,MAAM,CAAC;QACX,UAAU,MAAM;YACZ,iBAAiB,EAAE,UAAU,iBAAiB,CAAC;YAC/C,uBAAuB,EAAE,UAAU,iBAAiB,CAAC;SACxD;QACD,UAAU,iBAAiB;YACvB,UAAU,EAAE,OAAO,CAAC;YACpB,cAAc,EAAE,OAAO,CAAC;YACxB,QAAQ,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,IAAI,CAAC;YAClD,OAAO,EAAE,MAAM,IAAI,CAAC;YACpB,OAAO,EAAE,CAAC,KAAK,EAAE,2BAA2B,KAAK,IAAI,CAAC;YACtD,KAAK,EAAE,MAAM,IAAI,CAAC;YAClB,KAAK,IAAI,IAAI,CAAC;YACd,IAAI,IAAI,IAAI,CAAC;SAChB;QACD,UAAU,sBAAsB;YAC5B,WAAW,EAAE,MAAM,CAAC;YACpB,OAAO,EAAE;gBACL,MAAM,EAAE,MAAM,CAAC;gBACf,CAAC,KAAK,EAAE,MAAM,GAAG;oBACb,OAAO,EAAE,OAAO,CAAC;oBACjB,CAAC,KAAK,EAAE,MAAM,GAAG;wBACb,UAAU,EAAE,MAAM,CAAC;qBACtB,CAAC;iBACL,CAAC;aACL,CAAC;SACL;QACD,UAAU,2BAA2B;YACjC,KAAK,EAAE,MAAM,CAAC;SACjB;KACJ;IAED;;;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,CAAkC;QACrD,OAAO,CAAC,WAAW,CAAkB;QAErC;;WAEG;QACI,IAAI,IAAI,IAAI;QA+BnB,OAAO,CAAC,eAAe;QAQvB,OAAO,CAAC,qBAAqB;QA2D7B,OAAO,CAAC,cAAc;QAoBtB,OAAO,CAAC,aAAa;QAerB;;;WAGG;QACI,iBAAiB,IAAI,IAAI;QAgBhC;;WAEG;QACI,IAAI,IAAI,IAAI;KAWtB;CAEA"}
@@ -1,2 +1,2 @@
1
- sap.ui.define(["./BaseHardwareControl","sap/m/Button","sap/m/VBox","sap/m/TextArea","sap/m/MessageToast","sap/m/HBox","../utils/Logger"],function(t,e,i,s,n,o,r){"use strict";function a(t){return t&&t.__esModule&&typeof t.default!=="undefined"?t.default:t}const c=a(t);const h=r["Logger"];class l extends c{static renderer="nz.co.siliconst.ui5.metaui.controls.BaseHardwareControlRenderer";static metadata={properties:{},events:{}};recognition=null;isRecording=false;init(){super.init();this.textArea=new s({rows:3,width:"100%",placeholder:"Dictated text will appear here...",liveChange:t=>{this.setValueAndFire(t.getParameter("value"))}});this.startBtn=new e({icon:"sap-icon://microphone",text:"Start Dictation",type:"Emphasized",press:this.toggleDictation.bind(this)});const t=new o({items:[this.startBtn]}).addStyleClass("sapUiSmallMarginTop");this.vBox=new i({items:[this.textArea,t]});this.setAggregation("_content",this.vBox);this.initSpeechRecognition()}toggleDictation(){if(this.isRecording){this.stopDictation()}else{this.startDictation()}}initSpeechRecognition(){const t=window.SpeechRecognition||window.webkitSpeechRecognition;if(t){this.recognition=new t;this.recognition.continuous=true;this.recognition.interimResults=true;this.recognition.onresult=t=>{let e="";let i="";for(let s=t.resultIndex;s<t.results.length;++s){if(t.results[s].isFinal){e+=t.results[s][0].transcript}else{i+=t.results[s][0].transcript}}const s=this.getValue()||"";const n=s?s+" "+e:e;if(e){this.textArea.setValue(n);this.setValueAndFire(n)}else if(i){this.textArea.setValue(s?s+" "+i:i)}};this.recognition.onstart=()=>{this.isRecording=true;this.startBtn.setIcon("sap-icon://stop");this.startBtn.setText("Stop Recording");this.startBtn.setType("Reject");n.show("Listening... Please speak now.")};this.recognition.onerror=t=>{h.error("Speech recognition error",t.error,"VoiceInputControl");sap.ui.require(["sap/m/MessageBox"],e=>{e.error("Microphone Error: "+t.error+"\n\nPlease ensure you have a working microphone attached and have not blocked access in your browser settings.")});this.stopDictation()};this.recognition.onend=()=>{this.stopDictation()}}else{h.warn("Web Speech API not supported in this browser.","","VoiceInputControl");this.startBtn.setEnabled(false);this.startBtn.setTooltip("Speech Recognition is not supported in this browser.")}}startDictation(){if(!this.recognition)return;try{this.recognition.start();n.show("Requesting microphone access...");this.startBtn.setIcon("sap-icon://stop");this.startBtn.setText("Requesting mic...");this.startBtn.setType("Reject")}catch(t){h.error("Failed to start speech recognition",t.message||t,"VoiceInputControl");sap.ui.require(["sap/m/MessageBox"],e=>{e.error("Failed to start dictation. Please ensure you have a working microphone and have granted browser permissions.\n\nDetails: "+(t.message||t))});this.stopDictation()}}stopDictation(){if(!this.recognition)return;try{this.recognition.stop()}catch(t){}this.isRecording=false;this.startBtn.setIcon("sap-icon://microphone");this.startBtn.setText("Start Dictation");this.startBtn.setType("Emphasized")}onBeforeRendering(){const t=this.getProperty("readOnly");this.textArea.setEditable(!t);this.startBtn.setEnabled(!t&&!!this.recognition);const e=this.getProperty("value");if(e!==undefined&&e!==null){if(!this.isRecording){this.textArea.setValue(e)}}}exit(){this.stopDictation();if(this.recognition){this.recognition.onstart=null;this.recognition.onresult=null;this.recognition.onerror=null;this.recognition.onend=null;this.recognition=null}super.exit()}}return l});
1
+ sap.ui.define(["./BaseHardwareControl","sap/m/Button","sap/m/VBox","sap/m/TextArea","sap/m/MessageToast","sap/m/HBox","../utils/Logger"],function(t,e,i,s,n,o,r){"use strict";function a(t){return t&&t.__esModule&&typeof t.default!=="undefined"?t.default:t}const c=a(t);const h=r["Logger"];class l extends c{static renderer="nz.co.siliconst.ui5.metaui.controls.BaseHardwareControlRenderer";static metadata={properties:{},events:{}};recognition=null;isRecording=false;init(){super.init();this.textArea=new s({rows:3,width:"100%",placeholder:"Dictated text will appear here...",liveChange:t=>{this.setValueAndFire(t.getParameter("value"))}});this.startBtn=new e({icon:"sap-icon://microphone",text:"Start Dictation",type:"Emphasized",press:this.toggleDictation.bind(this)});const t=new o({items:[this.startBtn]}).addStyleClass("sapUiSmallMarginTop");this.vBox=new i({items:[this.textArea,t]});this.setAggregation("_content",this.vBox);this.initSpeechRecognition()}toggleDictation(){if(this.isRecording){this.stopDictation()}else{this.startDictation()}}initSpeechRecognition(){const t=window.SpeechRecognition||window.webkitSpeechRecognition;if(t){this.recognition=new t;this.recognition.continuous=true;this.recognition.interimResults=true;this.recognition.onresult=t=>{let e="";let i="";for(let s=t.resultIndex;s<t.results.length;++s){if(t.results[s].isFinal){e+=t.results[s][0].transcript}else{i+=t.results[s][0].transcript}}const s=this.getValue()||"";const n=s?s+" "+e:e;if(e){this.textArea.setValue(n);this.setValueAndFire(n)}else if(i){this.textArea.setValue(s?s+" "+i:i)}};this.recognition.onstart=()=>{this.isRecording=true;this.startBtn.setIcon("sap-icon://stop");this.startBtn.setText("Stop Recording");this.startBtn.setType("Reject");n.show("Listening... Please speak now.")};this.recognition.onerror=t=>{h.error("Speech recognition error",t.error,"VoiceInputControl");sap.ui.require(["sap/m/MessageBox"],e=>{e.error("Microphone Error: "+t.error+"\n\nPlease ensure you have a working microphone attached and have not blocked access in your browser settings.")});this.stopDictation()};this.recognition.onend=()=>{this.stopDictation()}}else{h.warn("Web Speech API not supported in this browser.","","VoiceInputControl");this.startBtn.setEnabled(false);this.startBtn.setTooltip("Speech Recognition is not supported in this browser.")}}startDictation(){if(!this.recognition)return;try{this.recognition.start();n.show("Requesting microphone access...");this.startBtn.setIcon("sap-icon://stop");this.startBtn.setText("Requesting mic...");this.startBtn.setType("Reject")}catch(t){const e=t;h.error("Failed to start speech recognition",e.message||String(e),"VoiceInputControl");sap.ui.require(["sap/m/MessageBox"],t=>{t.error("Failed to start dictation. Please ensure you have a working microphone and have granted browser permissions.\n\nDetails: "+(e.message||String(e)))});this.stopDictation()}}stopDictation(){if(!this.recognition)return;try{this.recognition.stop()}catch(t){h.warn("Failed to gracefully stop speech recognition.",String(t),"VoiceInputControl")}this.isRecording=false;this.startBtn.setIcon("sap-icon://microphone");this.startBtn.setText("Start Dictation");this.startBtn.setType("Emphasized")}onBeforeRendering(){const t=this.getProperty("readOnly");this.textArea.setEditable(!t);this.startBtn.setEnabled(!t&&!!this.recognition);const e=this.getProperty("value");if(e!==undefined&&e!==null){if(!this.isRecording){this.textArea.setValue(e)}}}exit(){this.stopDictation();if(this.recognition){this.recognition.onstart=null;this.recognition.onresult=null;this.recognition.onerror=null;this.recognition.onend=null;this.recognition=null}super.exit()}}return l});
2
2
  //# sourceMappingURL=VoiceInputControl.js.map
@@ -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","SpeechRecognitionClass","window","SpeechRecognition","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","String","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\ndeclare global {\n interface Window {\n SpeechRecognition: new () => SpeechRecognition;\n webkitSpeechRecognition: new () => SpeechRecognition;\n }\n interface SpeechRecognition {\n continuous: boolean;\n interimResults: boolean;\n onresult: (event: SpeechRecognitionEvent) => void;\n onstart: () => void;\n onerror: (event: SpeechRecognitionErrorEvent) => void;\n onend: () => void;\n start(): void;\n stop(): void;\n }\n interface SpeechRecognitionEvent {\n resultIndex: number;\n results: {\n length: number;\n [index: number]: {\n isFinal: boolean;\n [index: number]: {\n transcript: string;\n };\n };\n };\n }\n interface SpeechRecognitionErrorEvent {\n error: string;\n }\n}\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: SpeechRecognition | null = 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 SpeechRecognitionClass = window.SpeechRecognition || window.webkitSpeechRecognition;\n if (SpeechRecognitionClass) {\n this.recognition = new SpeechRecognitionClass();\n this.recognition.continuous = true;\n this.recognition.interimResults = true;\n\n this.recognition.onresult = (event: SpeechRecognitionEvent) => {\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: SpeechRecognitionErrorEvent) => {\n Logger.error(\"Speech recognition error\", event.error, \"VoiceInputControl\");\n sap.ui.require([\"sap/m/MessageBox\"], (MessageBox: typeof import(\"sap/m/MessageBox\").default) => {\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) {\n const error = err as Error;\n Logger.error(\"Failed to start speech recognition\", error.message || String(error), \"VoiceInputControl\");\n sap.ui.require([\"sap/m/MessageBox\"], (MessageBox: typeof import(\"sap/m/MessageBox\").default) => {\n MessageBox.error(\"Failed to start dictation. Please ensure you have a working microphone and have granted browser permissions.\\n\\nDetails: \" + (error.message || String(error)));\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 Logger.warn(\"Failed to gracefully stop speech recognition.\", String(e), \"VoiceInputControl\");\n }\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":"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","ignoreList":[]}
@@ -6,6 +6,38 @@ import MessageToast from "sap/m/MessageToast";
6
6
  import HBox from "sap/m/HBox";
7
7
  import { Logger } from "../utils/Logger";
8
8
 
9
+ declare global {
10
+ interface Window {
11
+ SpeechRecognition: new () => SpeechRecognition;
12
+ webkitSpeechRecognition: new () => SpeechRecognition;
13
+ }
14
+ interface SpeechRecognition {
15
+ continuous: boolean;
16
+ interimResults: boolean;
17
+ onresult: (event: SpeechRecognitionEvent) => void;
18
+ onstart: () => void;
19
+ onerror: (event: SpeechRecognitionErrorEvent) => void;
20
+ onend: () => void;
21
+ start(): void;
22
+ stop(): void;
23
+ }
24
+ interface SpeechRecognitionEvent {
25
+ resultIndex: number;
26
+ results: {
27
+ length: number;
28
+ [index: number]: {
29
+ isFinal: boolean;
30
+ [index: number]: {
31
+ transcript: string;
32
+ };
33
+ };
34
+ };
35
+ }
36
+ interface SpeechRecognitionErrorEvent {
37
+ error: string;
38
+ }
39
+ }
40
+
9
41
  /**
10
42
  * VoiceInputControl
11
43
  * Provides a UI to dictate text using the browser's native Web Speech API.
@@ -22,9 +54,12 @@ export default class VoiceInputControl extends BaseHardwareControl {
22
54
  private startBtn!: Button;
23
55
  private stopBtn!: Button;
24
56
 
25
- private recognition: any = null;
57
+ private recognition: SpeechRecognition | null = null;
26
58
  private isRecording: boolean = false;
27
59
 
60
+ /**
61
+ * Initializes the dictation interface and requests Web Speech API setup.
62
+ */
28
63
  public init(): void {
29
64
  super.init();
30
65
 
@@ -65,13 +100,13 @@ export default class VoiceInputControl extends BaseHardwareControl {
65
100
  }
66
101
 
67
102
  private initSpeechRecognition(): void {
68
- const SpeechRecognition = (window as unknown).SpeechRecognition || (window as unknown).webkitSpeechRecognition;
69
- if (SpeechRecognition) {
70
- this.recognition = new SpeechRecognition();
103
+ const SpeechRecognitionClass = window.SpeechRecognition || window.webkitSpeechRecognition;
104
+ if (SpeechRecognitionClass) {
105
+ this.recognition = new SpeechRecognitionClass();
71
106
  this.recognition.continuous = true;
72
107
  this.recognition.interimResults = true;
73
108
 
74
- this.recognition.onresult = (event: any) => {
109
+ this.recognition.onresult = (event: SpeechRecognitionEvent) => {
75
110
  let finalTranscript = "";
76
111
  let interimTranscript = "";
77
112
 
@@ -104,9 +139,9 @@ export default class VoiceInputControl extends BaseHardwareControl {
104
139
  MessageToast.show("Listening... Please speak now.");
105
140
  };
106
141
 
107
- this.recognition.onerror = (event: any) => {
142
+ this.recognition.onerror = (event: SpeechRecognitionErrorEvent) => {
108
143
  Logger.error("Speech recognition error", event.error, "VoiceInputControl");
109
- sap.ui.require(["sap/m/MessageBox"], (MessageBox: unknown) => {
144
+ sap.ui.require(["sap/m/MessageBox"], (MessageBox: typeof import("sap/m/MessageBox").default) => {
110
145
  MessageBox.error("Microphone Error: " + event.error + "\n\nPlease ensure you have a working microphone attached and have not blocked access in your browser settings.");
111
146
  });
112
147
  this.stopDictation();
@@ -133,10 +168,11 @@ export default class VoiceInputControl extends BaseHardwareControl {
133
168
  this.startBtn.setIcon("sap-icon://stop");
134
169
  this.startBtn.setText("Requesting mic...");
135
170
  this.startBtn.setType("Reject");
136
- } catch (err: any) {
137
- Logger.error("Failed to start speech recognition", err.message || err, "VoiceInputControl");
138
- sap.ui.require(["sap/m/MessageBox"], (MessageBox: unknown) => {
139
- MessageBox.error("Failed to start dictation. Please ensure you have a working microphone and have granted browser permissions.\n\nDetails: " + (err.message || err));
171
+ } catch (err) {
172
+ const error = err as Error;
173
+ Logger.error("Failed to start speech recognition", error.message || String(error), "VoiceInputControl");
174
+ sap.ui.require(["sap/m/MessageBox"], (MessageBox: typeof import("sap/m/MessageBox").default) => {
175
+ MessageBox.error("Failed to start dictation. Please ensure you have a working microphone and have granted browser permissions.\n\nDetails: " + (error.message || String(error)));
140
176
  });
141
177
  this.stopDictation();
142
178
  }
@@ -147,7 +183,9 @@ export default class VoiceInputControl extends BaseHardwareControl {
147
183
 
148
184
  try {
149
185
  this.recognition.stop();
150
- } catch(e) {}
186
+ } catch(e) {
187
+ Logger.warn("Failed to gracefully stop speech recognition.", String(e), "VoiceInputControl");
188
+ }
151
189
 
152
190
  this.isRecording = false;
153
191
  this.startBtn.setIcon("sap-icon://microphone");
@@ -155,6 +193,10 @@ export default class VoiceInputControl extends BaseHardwareControl {
155
193
  this.startBtn.setType("Emphasized");
156
194
  }
157
195
 
196
+ /**
197
+ * Lifecycle hook called before the control is rendered to the DOM.
198
+ * Handles browser support visual state.
199
+ */
158
200
  public onBeforeRendering(): void {
159
201
  const readOnly = this.getProperty("readOnly");
160
202
  this.textArea.setEditable(!readOnly);
@@ -171,6 +213,9 @@ export default class VoiceInputControl extends BaseHardwareControl {
171
213
  }
172
214
  }
173
215
 
216
+ /**
217
+ * Cleans up hardware event listeners when the control is destroyed.
218
+ */
174
219
  public exit(): void {
175
220
  this.stopDictation();
176
221
  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
  *
@@ -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.
@@ -357,11 +363,25 @@ 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
+ * Uses Promise resolution to debounce concurrent or rapid consecutive calls natively without arbitrary timeouts.
368
+ * @returns Promise that resolves when the layout is successfully built and mounted.
363
369
  */
364
- generate: function _generate() {
370
+ generate: async function _generate() {
371
+ return Promise.resolve().then(async () => {
372
+ try {
373
+ await this._doGenerate();
374
+ } catch (e) {
375
+ Logger.error("[MetaUI]", "Error in deferred generate: " + e, "GeneratorHost");
376
+ }
377
+ });
378
+ },
379
+ /**
380
+ * The underlying synchronous generator orchestration method.
381
+ * Normalizes the schema, sets up the state manager, loads missing plugins over the network,
382
+ * orchestrates the Engine build, and mounts the generated UI components into the internal tree.
383
+ */
384
+ _doGenerate: async function _doGenerate() {
365
385
  try {
366
386
  this.tearDownGeneratedLayout();
367
387
 
@@ -416,6 +436,13 @@ sap.ui.define(["sap/ui/core/Control", "../../utils/Logger", "../../core/SchemaNo
416
436
  }
417
437
  }
418
438
  }
439
+ const pathsToLoad = PluginRegistry.getInstance().getPathsToLoad(normalizedSchema);
440
+ const needsNetworkLoad = Array.from(pathsToLoad).some(path => !sap.ui.require(path));
441
+ if (needsNetworkLoad) {
442
+ this.setBusy(true);
443
+ await PluginRegistry.getInstance().preloadDependencies(normalizedSchema);
444
+ this.setBusy(false);
445
+ }
419
446
  this.activeModelName = "metaUI_" + this.getId();
420
447
  this.stateManager = new StateManager(finalData, normalizedSchema, this.activeModelName);
421
448
  this.setModel(this.stateManager.getModel(), this.activeModelName);
@@ -426,6 +453,7 @@ sap.ui.define(["sap/ui/core/Control", "../../utils/Logger", "../../core/SchemaNo
426
453
  const payload = this.stateManager.extractPayload();
427
454
  this.dataSyncDelegate.pushToBindings(payload);
428
455
  } catch (error) {
456
+ this.setBusy(false);
429
457
  Logger.error("[MetaUI]", "Fatal crash during layout generation: " + error.message, "GeneratorHost");
430
458
  this.validationDelegate.mountCrashBoundary(error);
431
459
  }