@siliconst/metaui 1.4.7 → 1.4.9

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 (401) 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 +3 -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 +1 -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 +4 -3
  17. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost-dbg.js +8 -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 +6 -6
  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 +14 -10
  24. package/src/nz/co/siliconst/ui5/metaui/controls/RichTextControl-dbg.js +1 -1
  25. package/src/nz/co/siliconst/ui5/metaui/controls/RichTextControl-dbg.js.map +1 -1
  26. package/src/nz/co/siliconst/ui5/metaui/controls/RichTextControl.d.ts +2 -2
  27. package/src/nz/co/siliconst/ui5/metaui/controls/RichTextControl.d.ts.map +1 -1
  28. package/src/nz/co/siliconst/ui5/metaui/controls/RichTextControl.js.map +1 -1
  29. package/src/nz/co/siliconst/ui5/metaui/controls/RichTextControl.ts +2 -2
  30. package/src/nz/co/siliconst/ui5/metaui/controls/SignatureControl-dbg.js +30 -8
  31. package/src/nz/co/siliconst/ui5/metaui/controls/SignatureControl-dbg.js.map +1 -1
  32. package/src/nz/co/siliconst/ui5/metaui/controls/SignatureControl.d.ts +10 -1
  33. package/src/nz/co/siliconst/ui5/metaui/controls/SignatureControl.d.ts.map +1 -1
  34. package/src/nz/co/siliconst/ui5/metaui/controls/SignatureControl.js +1 -1
  35. package/src/nz/co/siliconst/ui5/metaui/controls/SignatureControl.js.map +1 -1
  36. package/src/nz/co/siliconst/ui5/metaui/controls/SignatureControl.ts +39 -8
  37. package/src/nz/co/siliconst/ui5/metaui/controls/VoiceInputControl-dbg.js +9 -6
  38. package/src/nz/co/siliconst/ui5/metaui/controls/VoiceInputControl-dbg.js.map +1 -1
  39. package/src/nz/co/siliconst/ui5/metaui/controls/VoiceInputControl.d.ts +31 -0
  40. package/src/nz/co/siliconst/ui5/metaui/controls/VoiceInputControl.d.ts.map +1 -1
  41. package/src/nz/co/siliconst/ui5/metaui/controls/VoiceInputControl.js +1 -1
  42. package/src/nz/co/siliconst/ui5/metaui/controls/VoiceInputControl.js.map +1 -1
  43. package/src/nz/co/siliconst/ui5/metaui/controls/VoiceInputControl.ts +47 -12
  44. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost-dbg.js +6 -14
  45. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost-dbg.js.map +1 -1
  46. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.d.ts +1 -2
  47. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.d.ts.map +1 -1
  48. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.js +1 -1
  49. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.js.map +1 -1
  50. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.ts +12 -19
  51. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate-dbg.js.map +1 -1
  52. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate.d.ts +3 -3
  53. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate.d.ts.map +1 -1
  54. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate.js.map +1 -1
  55. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate.ts +4 -4
  56. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DialogDelegate-dbg.js.map +1 -1
  57. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DialogDelegate.d.ts +1 -1
  58. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DialogDelegate.d.ts.map +1 -1
  59. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DialogDelegate.js.map +1 -1
  60. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DialogDelegate.ts +1 -1
  61. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ODataDelegate-dbg.js +1 -1
  62. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ODataDelegate-dbg.js.map +1 -1
  63. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ODataDelegate.d.ts +4 -3
  64. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ODataDelegate.d.ts.map +1 -1
  65. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ODataDelegate.js.map +1 -1
  66. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ODataDelegate.ts +10 -9
  67. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate-dbg.js +3 -3
  68. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate-dbg.js.map +1 -1
  69. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate.d.ts +1 -1
  70. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate.d.ts.map +1 -1
  71. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate.js +1 -1
  72. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate.js.map +1 -1
  73. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate.ts +7 -6
  74. package/src/nz/co/siliconst/ui5/metaui/core/ConditionEngine-dbg.js.map +1 -1
  75. package/src/nz/co/siliconst/ui5/metaui/core/ConditionEngine.d.ts +1 -1
  76. package/src/nz/co/siliconst/ui5/metaui/core/ConditionEngine.d.ts.map +1 -1
  77. package/src/nz/co/siliconst/ui5/metaui/core/ConditionEngine.js.map +1 -1
  78. package/src/nz/co/siliconst/ui5/metaui/core/ConditionEngine.ts +1 -1
  79. package/src/nz/co/siliconst/ui5/metaui/core/DefaultLayoutGenerator-dbg.js.map +1 -1
  80. package/src/nz/co/siliconst/ui5/metaui/core/DefaultLayoutGenerator.js.map +1 -1
  81. package/src/nz/co/siliconst/ui5/metaui/core/DefaultLayoutGenerator.ts +1 -1
  82. package/src/nz/co/siliconst/ui5/metaui/core/Engine-dbg.js.map +1 -1
  83. package/src/nz/co/siliconst/ui5/metaui/core/Engine.js.map +1 -1
  84. package/src/nz/co/siliconst/ui5/metaui/core/Engine.ts +2 -2
  85. package/src/nz/co/siliconst/ui5/metaui/core/PipelineManager-dbg.js.map +1 -1
  86. package/src/nz/co/siliconst/ui5/metaui/core/PipelineManager.d.ts +1 -1
  87. package/src/nz/co/siliconst/ui5/metaui/core/PipelineManager.d.ts.map +1 -1
  88. package/src/nz/co/siliconst/ui5/metaui/core/PipelineManager.js.map +1 -1
  89. package/src/nz/co/siliconst/ui5/metaui/core/PipelineManager.ts +1 -1
  90. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry-dbg.js +5 -1
  91. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry-dbg.js.map +1 -1
  92. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry.d.ts.map +1 -1
  93. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry.js +1 -1
  94. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry.js.map +1 -1
  95. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry.ts +9 -5
  96. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer-dbg.js.map +1 -1
  97. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.d.ts +1 -1
  98. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.d.ts.map +1 -1
  99. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.js.map +1 -1
  100. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.ts +7 -7
  101. package/src/nz/co/siliconst/ui5/metaui/core/SchemaValidator-dbg.js.map +1 -1
  102. package/src/nz/co/siliconst/ui5/metaui/core/SchemaValidator.d.ts +1 -1
  103. package/src/nz/co/siliconst/ui5/metaui/core/SchemaValidator.d.ts.map +1 -1
  104. package/src/nz/co/siliconst/ui5/metaui/core/SchemaValidator.js.map +1 -1
  105. package/src/nz/co/siliconst/ui5/metaui/core/SchemaValidator.ts +1 -1
  106. package/src/nz/co/siliconst/ui5/metaui/core/StateManager-dbg.js.map +1 -1
  107. package/src/nz/co/siliconst/ui5/metaui/core/StateManager.d.ts +2 -2
  108. package/src/nz/co/siliconst/ui5/metaui/core/StateManager.d.ts.map +1 -1
  109. package/src/nz/co/siliconst/ui5/metaui/core/StateManager.js.map +1 -1
  110. package/src/nz/co/siliconst/ui5/metaui/core/StateManager.ts +6 -6
  111. package/src/nz/co/siliconst/ui5/metaui/interfaces/IPipeline-dbg.js.map +1 -1
  112. package/src/nz/co/siliconst/ui5/metaui/interfaces/IPipeline.d.ts +1 -1
  113. package/src/nz/co/siliconst/ui5/metaui/interfaces/IPipeline.d.ts.map +1 -1
  114. package/src/nz/co/siliconst/ui5/metaui/interfaces/IPipeline.ts +1 -1
  115. package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout-dbg.js.map +1 -1
  116. package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout.js.map +1 -1
  117. package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout.ts +1 -1
  118. package/src/nz/co/siliconst/ui5/metaui/layouts/WizardLayout-dbg.js.map +1 -1
  119. package/src/nz/co/siliconst/ui5/metaui/layouts/WizardLayout.js.map +1 -1
  120. package/src/nz/co/siliconst/ui5/metaui/layouts/WizardLayout.ts +1 -1
  121. package/src/nz/co/siliconst/ui5/metaui/library-dbg.js +3 -3
  122. package/src/nz/co/siliconst/ui5/metaui/library-dbg.js.map +1 -1
  123. package/src/nz/co/siliconst/ui5/metaui/library-preload.js +33 -32
  124. package/src/nz/co/siliconst/ui5/metaui/library-preload.js.map +1 -1
  125. package/src/nz/co/siliconst/ui5/metaui/library.d.ts +27 -1
  126. package/src/nz/co/siliconst/ui5/metaui/library.d.ts.map +1 -1
  127. package/src/nz/co/siliconst/ui5/metaui/library.js +1 -1
  128. package/src/nz/co/siliconst/ui5/metaui/library.js.map +1 -1
  129. package/src/nz/co/siliconst/ui5/metaui/library.ts +34 -2
  130. package/src/nz/co/siliconst/ui5/metaui/manifest.json +2 -1
  131. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/ClearFormActionPlugin-dbg.js.map +1 -1
  132. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/ClearFormActionPlugin.d.ts +1 -1
  133. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/ClearFormActionPlugin.d.ts.map +1 -1
  134. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/ClearFormActionPlugin.js.map +1 -1
  135. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/ClearFormActionPlugin.ts +1 -1
  136. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/SubmitFormActionPlugin-dbg.js +0 -2
  137. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/SubmitFormActionPlugin-dbg.js.map +1 -1
  138. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/SubmitFormActionPlugin.d.ts +1 -1
  139. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/SubmitFormActionPlugin.d.ts.map +1 -1
  140. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/SubmitFormActionPlugin.js.map +1 -1
  141. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/SubmitFormActionPlugin.ts +2 -4
  142. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/UrlNavigationActionPlugin-dbg.js.map +1 -1
  143. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/UrlNavigationActionPlugin.d.ts +1 -1
  144. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/UrlNavigationActionPlugin.d.ts.map +1 -1
  145. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/UrlNavigationActionPlugin.js.map +1 -1
  146. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/UrlNavigationActionPlugin.ts +1 -1
  147. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin-dbg.js +5 -3
  148. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin-dbg.js.map +1 -1
  149. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin.d.ts +1 -1
  150. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin.d.ts.map +1 -1
  151. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin.js +1 -1
  152. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin.js.map +1 -1
  153. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin.ts +7 -6
  154. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin-dbg.js +3 -9
  155. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin-dbg.js.map +1 -1
  156. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin.d.ts +2 -2
  157. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin.d.ts.map +1 -1
  158. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin.js +1 -1
  159. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin.js.map +1 -1
  160. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin.ts +9 -14
  161. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin-dbg.js +14 -3
  162. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin-dbg.js.map +1 -1
  163. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.d.ts +2 -2
  164. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.d.ts.map +1 -1
  165. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.js +1 -1
  166. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.js.map +1 -1
  167. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.ts +19 -8
  168. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin-dbg.js +1 -3
  169. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin-dbg.js.map +1 -1
  170. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin.d.ts +1 -1
  171. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin.d.ts.map +1 -1
  172. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin.js +1 -1
  173. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin.js.map +1 -1
  174. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin.ts +3 -3
  175. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin-dbg.js +2 -4
  176. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin-dbg.js.map +1 -1
  177. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin.d.ts +2 -2
  178. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin.d.ts.map +1 -1
  179. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin.js +1 -1
  180. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin.js.map +1 -1
  181. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin.ts +7 -7
  182. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin-dbg.js +2 -4
  183. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin-dbg.js.map +1 -1
  184. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin.d.ts +2 -2
  185. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin.d.ts.map +1 -1
  186. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin.js +1 -1
  187. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin.js.map +1 -1
  188. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin.ts +15 -15
  189. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin-dbg.js +2 -4
  190. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin-dbg.js.map +1 -1
  191. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin.d.ts +2 -2
  192. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin.d.ts.map +1 -1
  193. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin.js +1 -1
  194. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin.js.map +1 -1
  195. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin.ts +4 -4
  196. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin-dbg.js +2 -4
  197. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin-dbg.js.map +1 -1
  198. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin.d.ts +2 -2
  199. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin.d.ts.map +1 -1
  200. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin.js +1 -1
  201. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin.js.map +1 -1
  202. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin.ts +4 -4
  203. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin-dbg.js +2 -4
  204. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin-dbg.js.map +1 -1
  205. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin.d.ts +2 -2
  206. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin.d.ts.map +1 -1
  207. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin.js +1 -1
  208. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin.js.map +1 -1
  209. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin.ts +4 -4
  210. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin-dbg.js +2 -4
  211. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin-dbg.js.map +1 -1
  212. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin.d.ts +2 -2
  213. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin.d.ts.map +1 -1
  214. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin.js +1 -1
  215. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin.js.map +1 -1
  216. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin.ts +4 -4
  217. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin-dbg.js +2 -4
  218. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin-dbg.js.map +1 -1
  219. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin.d.ts +2 -2
  220. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin.d.ts.map +1 -1
  221. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin.js +1 -1
  222. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin.js.map +1 -1
  223. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin.ts +7 -7
  224. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MessageStripPlugin-dbg.js.map +1 -1
  225. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MessageStripPlugin.d.ts +1 -1
  226. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MessageStripPlugin.d.ts.map +1 -1
  227. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MessageStripPlugin.js.map +1 -1
  228. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MessageStripPlugin.ts +1 -1
  229. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin-dbg.js +2 -4
  230. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin-dbg.js.map +1 -1
  231. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin.d.ts +2 -2
  232. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin.d.ts.map +1 -1
  233. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin.js +1 -1
  234. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin.js.map +1 -1
  235. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin.ts +5 -5
  236. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin-dbg.js +2 -4
  237. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin-dbg.js.map +1 -1
  238. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin.d.ts +2 -2
  239. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin.d.ts.map +1 -1
  240. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin.js +1 -1
  241. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin.js.map +1 -1
  242. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin.ts +4 -4
  243. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin-dbg.js +5 -3
  244. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin-dbg.js.map +1 -1
  245. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin.d.ts +1 -1
  246. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin.d.ts.map +1 -1
  247. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin.js +1 -1
  248. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin.js.map +1 -1
  249. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin.ts +11 -9
  250. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin-dbg.js +2 -4
  251. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin-dbg.js.map +1 -1
  252. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin.d.ts +2 -2
  253. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin.d.ts.map +1 -1
  254. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin.js +1 -1
  255. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin.js.map +1 -1
  256. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin.ts +4 -4
  257. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin-dbg.js +1 -3
  258. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin-dbg.js.map +1 -1
  259. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin.d.ts.map +1 -1
  260. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin.js +1 -1
  261. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin.js.map +1 -1
  262. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin.ts +5 -5
  263. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin-dbg.js +2 -4
  264. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin-dbg.js.map +1 -1
  265. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin.d.ts +2 -2
  266. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin.d.ts.map +1 -1
  267. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin.js +1 -1
  268. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin.js.map +1 -1
  269. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin.ts +9 -9
  270. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin-dbg.js +2 -4
  271. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin-dbg.js.map +1 -1
  272. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin.d.ts +2 -2
  273. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin.d.ts.map +1 -1
  274. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin.js +1 -1
  275. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin.js.map +1 -1
  276. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin.ts +6 -6
  277. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin-dbg.js +2 -4
  278. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin-dbg.js.map +1 -1
  279. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin.d.ts +2 -2
  280. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin.d.ts.map +1 -1
  281. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin.js +1 -1
  282. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin.js.map +1 -1
  283. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin.ts +6 -6
  284. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin-dbg.js +2 -4
  285. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin-dbg.js.map +1 -1
  286. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin.d.ts +2 -2
  287. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin.d.ts.map +1 -1
  288. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin.js +1 -1
  289. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin.js.map +1 -1
  290. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin.ts +6 -6
  291. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin-dbg.js +2 -4
  292. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin-dbg.js.map +1 -1
  293. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin.d.ts +2 -2
  294. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin.d.ts.map +1 -1
  295. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin.js +1 -1
  296. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin.js.map +1 -1
  297. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin.ts +6 -6
  298. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin-dbg.js +2 -4
  299. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin-dbg.js.map +1 -1
  300. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin.d.ts +2 -2
  301. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin.d.ts.map +1 -1
  302. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin.js +1 -1
  303. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin.js.map +1 -1
  304. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin.ts +6 -6
  305. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin-dbg.js +2 -4
  306. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin-dbg.js.map +1 -1
  307. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin.d.ts +2 -2
  308. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin.d.ts.map +1 -1
  309. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin.js +1 -1
  310. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin.js.map +1 -1
  311. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin.ts +8 -8
  312. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/LiveSearchPlugin-dbg.js +9 -0
  313. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/LiveSearchPlugin-dbg.js.map +1 -1
  314. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/LiveSearchPlugin.d.ts +8 -1
  315. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/LiveSearchPlugin.d.ts.map +1 -1
  316. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/LiveSearchPlugin.js.map +1 -1
  317. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/LiveSearchPlugin.ts +13 -6
  318. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/ODataListBindingPlugin-dbg.js +9 -0
  319. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/ODataListBindingPlugin-dbg.js.map +1 -1
  320. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/ODataListBindingPlugin.d.ts +8 -1
  321. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/ODataListBindingPlugin.d.ts.map +1 -1
  322. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/ODataListBindingPlugin.js.map +1 -1
  323. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/ODataListBindingPlugin.ts +10 -3
  324. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteDropdownPlugin-dbg.js +19 -0
  325. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteDropdownPlugin-dbg.js.map +1 -1
  326. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteDropdownPlugin.d.ts +18 -1
  327. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteDropdownPlugin.d.ts.map +1 -1
  328. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteDropdownPlugin.js.map +1 -1
  329. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteDropdownPlugin.ts +19 -2
  330. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteValueHelpPlugin-dbg.js +23 -0
  331. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteValueHelpPlugin-dbg.js.map +1 -1
  332. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteValueHelpPlugin.d.ts +20 -1
  333. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteValueHelpPlugin.d.ts.map +1 -1
  334. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteValueHelpPlugin.js.map +1 -1
  335. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteValueHelpPlugin.ts +25 -6
  336. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/CurrencyFormatterPlugin-dbg.js.map +1 -1
  337. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/CurrencyFormatterPlugin.d.ts +1 -1
  338. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/CurrencyFormatterPlugin.d.ts.map +1 -1
  339. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/CurrencyFormatterPlugin.js.map +1 -1
  340. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/CurrencyFormatterPlugin.ts +2 -2
  341. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/DateFormatterPlugin-dbg.js +6 -0
  342. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/DateFormatterPlugin-dbg.js.map +1 -1
  343. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/DateFormatterPlugin.d.ts +6 -1
  344. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/DateFormatterPlugin.d.ts.map +1 -1
  345. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/DateFormatterPlugin.js.map +1 -1
  346. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/DateFormatterPlugin.ts +7 -2
  347. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/PhoneFormatterPlugin-dbg.js +5 -0
  348. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/PhoneFormatterPlugin-dbg.js.map +1 -1
  349. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/PhoneFormatterPlugin.d.ts +6 -1
  350. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/PhoneFormatterPlugin.d.ts.map +1 -1
  351. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/PhoneFormatterPlugin.js.map +1 -1
  352. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/PhoneFormatterPlugin.ts +6 -1
  353. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/TextCaseFormatterPlugin-dbg.js +5 -0
  354. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/TextCaseFormatterPlugin-dbg.js.map +1 -1
  355. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/TextCaseFormatterPlugin.d.ts +6 -1
  356. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/TextCaseFormatterPlugin.d.ts.map +1 -1
  357. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/TextCaseFormatterPlugin.js.map +1 -1
  358. package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/TextCaseFormatterPlugin.ts +6 -1
  359. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/EmailValidatorPlugin-dbg.js.map +1 -1
  360. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/EmailValidatorPlugin.d.ts +1 -1
  361. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/EmailValidatorPlugin.d.ts.map +1 -1
  362. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/EmailValidatorPlugin.js.map +1 -1
  363. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/EmailValidatorPlugin.ts +1 -1
  364. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/IbanValidatorPlugin-dbg.js +6 -0
  365. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/IbanValidatorPlugin-dbg.js.map +1 -1
  366. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/IbanValidatorPlugin.d.ts +7 -1
  367. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/IbanValidatorPlugin.d.ts.map +1 -1
  368. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/IbanValidatorPlugin.js.map +1 -1
  369. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/IbanValidatorPlugin.ts +7 -1
  370. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/MinLengthValidatorPlugin-dbg.js +6 -0
  371. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/MinLengthValidatorPlugin-dbg.js.map +1 -1
  372. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/MinLengthValidatorPlugin.d.ts +7 -1
  373. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/MinLengthValidatorPlugin.d.ts.map +1 -1
  374. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/MinLengthValidatorPlugin.js.map +1 -1
  375. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/MinLengthValidatorPlugin.ts +7 -1
  376. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/PatternValidatorPlugin-dbg.js +6 -0
  377. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/PatternValidatorPlugin-dbg.js.map +1 -1
  378. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/PatternValidatorPlugin.d.ts +7 -1
  379. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/PatternValidatorPlugin.d.ts.map +1 -1
  380. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/PatternValidatorPlugin.js.map +1 -1
  381. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/PatternValidatorPlugin.ts +7 -1
  382. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/RangeValidatorPlugin-dbg.js +6 -0
  383. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/RangeValidatorPlugin-dbg.js.map +1 -1
  384. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/RangeValidatorPlugin.d.ts +7 -1
  385. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/RangeValidatorPlugin.d.ts.map +1 -1
  386. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/RangeValidatorPlugin.js.map +1 -1
  387. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/RangeValidatorPlugin.ts +7 -1
  388. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/UrlValidatorPlugin-dbg.js +6 -0
  389. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/UrlValidatorPlugin-dbg.js.map +1 -1
  390. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/UrlValidatorPlugin.d.ts +7 -1
  391. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/UrlValidatorPlugin.d.ts.map +1 -1
  392. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/UrlValidatorPlugin.js.map +1 -1
  393. package/src/nz/co/siliconst/ui5/metaui/plugins/validators/UrlValidatorPlugin.ts +7 -1
  394. package/src/nz/co/siliconst/ui5/metaui/typings/ui5-custom.d.ts +20 -0
  395. package/src/nz/co/siliconst/ui5/metaui/utils/ExpressionBuilder-dbg.js +50 -0
  396. package/src/nz/co/siliconst/ui5/metaui/utils/ExpressionBuilder-dbg.js.map +1 -0
  397. package/src/nz/co/siliconst/ui5/metaui/utils/ExpressionBuilder.d.ts +19 -0
  398. package/src/nz/co/siliconst/ui5/metaui/utils/ExpressionBuilder.d.ts.map +1 -0
  399. package/src/nz/co/siliconst/ui5/metaui/utils/ExpressionBuilder.js +2 -0
  400. package/src/nz/co/siliconst/ui5/metaui/utils/ExpressionBuilder.js.map +1 -0
  401. package/src/nz/co/siliconst/ui5/metaui/utils/ExpressionBuilder.ts +43 -0
@@ -22,6 +22,12 @@ export default class SignatureControl extends BaseHardwareControl {
22
22
  private canvasCtx: CanvasRenderingContext2D | null = null;
23
23
  private canvasEl: HTMLCanvasElement | null = null;
24
24
 
25
+ private boundStartDrawing!: (e: MouseEvent) => void;
26
+ private boundDraw!: (e: MouseEvent) => void;
27
+ private boundStopDrawing!: (e: MouseEvent | TouchEvent) => void;
28
+ private boundStartDrawingTouch!: (e: TouchEvent) => void;
29
+ private boundDrawTouch!: (e: TouchEvent) => void;
30
+
25
31
  /**
26
32
  * Initializes the control and builds the canvas drawing surface.
27
33
  */
@@ -44,6 +50,12 @@ export default class SignatureControl extends BaseHardwareControl {
44
50
  });
45
51
 
46
52
  this.setAggregation("_content", this.vBox);
53
+
54
+ this.boundStartDrawing = this.startDrawing.bind(this);
55
+ this.boundDraw = this.draw.bind(this);
56
+ this.boundStopDrawing = this.stopDrawing.bind(this);
57
+ this.boundStartDrawingTouch = this.startDrawingTouch.bind(this);
58
+ this.boundDrawTouch = this.drawTouch.bind(this);
47
59
  }
48
60
 
49
61
  private onCanvasRendered(): void {
@@ -59,15 +71,15 @@ export default class SignatureControl extends BaseHardwareControl {
59
71
  }
60
72
 
61
73
  // Mouse events
62
- this.canvasEl.addEventListener("mousedown", this.startDrawing.bind(this));
63
- this.canvasEl.addEventListener("mousemove", this.draw.bind(this));
64
- this.canvasEl.addEventListener("mouseup", this.stopDrawing.bind(this));
65
- this.canvasEl.addEventListener("mouseout", this.stopDrawing.bind(this));
74
+ this.canvasEl.addEventListener("mousedown", this.boundStartDrawing);
75
+ this.canvasEl.addEventListener("mousemove", this.boundDraw);
76
+ this.canvasEl.addEventListener("mouseup", this.boundStopDrawing);
77
+ this.canvasEl.addEventListener("mouseout", this.boundStopDrawing);
66
78
 
67
79
  // Touch events
68
- this.canvasEl.addEventListener("touchstart", this.startDrawingTouch.bind(this), { passive: false });
69
- this.canvasEl.addEventListener("touchmove", this.drawTouch.bind(this), { passive: false });
70
- this.canvasEl.addEventListener("touchend", this.stopDrawing.bind(this));
80
+ this.canvasEl.addEventListener("touchstart", this.boundStartDrawingTouch, { passive: false });
81
+ this.canvasEl.addEventListener("touchmove", this.boundDrawTouch, { passive: false });
82
+ this.canvasEl.addEventListener("touchend", this.boundStopDrawing);
71
83
 
72
84
  // Restore existing signature if any
73
85
  const val = this.getValue();
@@ -164,7 +176,7 @@ export default class SignatureControl extends BaseHardwareControl {
164
176
  * Sets the value of the control programmatically and re-draws the canvas.
165
177
  * @param value The base64 data URL string representing the signature image.
166
178
  */
167
- public setValue(value: any): this {
179
+ public setValue(value: unknown): this {
168
180
  super.setValue(value);
169
181
  if (value && typeof value === "string" && value.startsWith("data:image")) {
170
182
  this.loadImageOntoCanvas(value);
@@ -173,4 +185,23 @@ export default class SignatureControl extends BaseHardwareControl {
173
185
  }
174
186
  return this;
175
187
  }
188
+
189
+ /**
190
+ * Cleans up event listeners to prevent memory leaks when the control is destroyed.
191
+ */
192
+ public exit(): void {
193
+ if (this.canvasEl) {
194
+ this.canvasEl.removeEventListener("mousedown", this.boundStartDrawing as EventListener);
195
+ this.canvasEl.removeEventListener("mousemove", this.boundDraw as EventListener);
196
+ this.canvasEl.removeEventListener("mouseup", this.boundStopDrawing as EventListener);
197
+ this.canvasEl.removeEventListener("mouseout", this.boundStopDrawing as EventListener);
198
+
199
+ this.canvasEl.removeEventListener("touchstart", this.boundStartDrawingTouch as EventListener);
200
+ this.canvasEl.removeEventListener("touchmove", this.boundDrawTouch as EventListener);
201
+ this.canvasEl.removeEventListener("touchend", this.boundStopDrawing as EventListener);
202
+ }
203
+ this.canvasEl = null;
204
+ this.canvasCtx = null;
205
+ super.exit();
206
+ }
176
207
  }
@@ -55,9 +55,9 @@ sap.ui.define(["./BaseHardwareControl", "sap/m/Button", "sap/m/VBox", "sap/m/Tex
55
55
  }
56
56
  }
57
57
  initSpeechRecognition() {
58
- const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
59
- if (SpeechRecognition) {
60
- this.recognition = new SpeechRecognition();
58
+ const SpeechRecognitionClass = window.SpeechRecognition || window.webkitSpeechRecognition;
59
+ if (SpeechRecognitionClass) {
60
+ this.recognition = new SpeechRecognitionClass();
61
61
  this.recognition.continuous = true;
62
62
  this.recognition.interimResults = true;
63
63
  this.recognition.onresult = event => {
@@ -116,9 +116,10 @@ sap.ui.define(["./BaseHardwareControl", "sap/m/Button", "sap/m/VBox", "sap/m/Tex
116
116
  this.startBtn.setText("Requesting mic...");
117
117
  this.startBtn.setType("Reject");
118
118
  } catch (err) {
119
- 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");
120
121
  sap.ui.require(["sap/m/MessageBox"], MessageBox => {
121
- 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)));
122
123
  });
123
124
  this.stopDictation();
124
125
  }
@@ -127,7 +128,9 @@ sap.ui.define(["./BaseHardwareControl", "sap/m/Button", "sap/m/VBox", "sap/m/Tex
127
128
  if (!this.recognition) return;
128
129
  try {
129
130
  this.recognition.stop();
130
- } catch (e) {}
131
+ } catch (e) {
132
+ Logger.warn("Failed to gracefully stop speech recognition.", String(e), "VoiceInputControl");
133
+ }
131
134
  this.isRecording = false;
132
135
  this.startBtn.setIcon("sap-icon://microphone");
133
136
  this.startBtn.setText("Start Dictation");
@@ -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 /**\n * Initializes the dictation interface and requests Web Speech API setup.\n */\n public init(): void {\n super.init();\n\n this.textArea = new TextArea({\n rows: 3,\n width: \"100%\",\n placeholder: \"Dictated text will appear here...\",\n liveChange: (oEvent: sap.ui.base.Event) => {\n this.setValueAndFire(oEvent.getParameter(\"value\"));\n }\n });\n\n this.startBtn = new Button({\n icon: \"sap-icon://microphone\",\n text: \"Start Dictation\",\n type: \"Emphasized\",\n press: this.toggleDictation.bind(this)\n });\n\n const hBox = new HBox({\n items: [this.startBtn]\n }).addStyleClass(\"sapUiSmallMarginTop\");\n\n this.vBox = new VBox({\n items: [this.textArea, hBox]\n });\n\n this.setAggregation(\"_content\", this.vBox);\n this.initSpeechRecognition();\n }\n\n private toggleDictation(): void {\n if (this.isRecording) {\n this.stopDictation();\n } else {\n this.startDictation();\n }\n }\n\n private initSpeechRecognition(): void {\n const SpeechRecognition = (window as unknown).SpeechRecognition || (window as unknown).webkitSpeechRecognition;\n if (SpeechRecognition) {\n this.recognition = new SpeechRecognition();\n this.recognition.continuous = true;\n this.recognition.interimResults = true;\n\n this.recognition.onresult = (event: any) => {\n let finalTranscript = \"\";\n let interimTranscript = \"\";\n\n for (let i = event.resultIndex; i < event.results.length; ++i) {\n if (event.results[i].isFinal) {\n finalTranscript += event.results[i][0].transcript;\n } else {\n interimTranscript += event.results[i][0].transcript;\n }\n }\n\n // Append the new final transcript to whatever was already in the textarea\n const currentVal = this.getValue() || \"\";\n const newVal = currentVal ? currentVal + \" \" + finalTranscript : finalTranscript;\n \n if (finalTranscript) {\n this.textArea.setValue(newVal);\n this.setValueAndFire(newVal);\n } else if (interimTranscript) {\n // Just show interim temporarily in textarea without saving to model\n this.textArea.setValue(currentVal ? currentVal + \" \" + interimTranscript : interimTranscript);\n }\n };\n\n this.recognition.onstart = () => {\n this.isRecording = true;\n this.startBtn.setIcon(\"sap-icon://stop\");\n this.startBtn.setText(\"Stop Recording\");\n this.startBtn.setType(\"Reject\");\n MessageToast.show(\"Listening... Please speak now.\");\n };\n\n this.recognition.onerror = (event: any) => {\n Logger.error(\"Speech recognition error\", event.error, \"VoiceInputControl\");\n sap.ui.require([\"sap/m/MessageBox\"], (MessageBox: unknown) => {\n MessageBox.error(\"Microphone Error: \" + event.error + \"\\n\\nPlease ensure you have a working microphone attached and have not blocked access in your browser settings.\");\n });\n this.stopDictation();\n };\n \n this.recognition.onend = () => {\n // If it ends natively (e.g. timeout), update UI\n this.stopDictation();\n };\n } else {\n Logger.warn(\"Web Speech API not supported in this browser.\", \"\", \"VoiceInputControl\");\n this.startBtn.setEnabled(false);\n this.startBtn.setTooltip(\"Speech Recognition is not supported in this browser.\");\n }\n }\n\n private startDictation(): void {\n if (!this.recognition) return;\n \n try {\n this.recognition.start();\n MessageToast.show(\"Requesting microphone access...\");\n // Provide immediate UI feedback in case browser delays the onstart event\n this.startBtn.setIcon(\"sap-icon://stop\");\n this.startBtn.setText(\"Requesting mic...\");\n this.startBtn.setType(\"Reject\");\n } catch (err: any) {\n Logger.error(\"Failed to start speech recognition\", err.message || err, \"VoiceInputControl\");\n sap.ui.require([\"sap/m/MessageBox\"], (MessageBox: unknown) => {\n MessageBox.error(\"Failed to start dictation. Please ensure you have a working microphone and have granted browser permissions.\\n\\nDetails: \" + (err.message || err));\n });\n this.stopDictation();\n }\n }\n\n private stopDictation(): void {\n if (!this.recognition) return;\n \n try {\n this.recognition.stop();\n } catch(e) {}\n \n this.isRecording = false;\n this.startBtn.setIcon(\"sap-icon://microphone\");\n this.startBtn.setText(\"Start Dictation\");\n this.startBtn.setType(\"Emphasized\");\n }\n\n /**\n * Lifecycle hook called before the control is rendered to the DOM.\n * Handles browser support visual state.\n */\n public onBeforeRendering(): void {\n const readOnly = this.getProperty(\"readOnly\");\n this.textArea.setEditable(!readOnly);\n \n // Only enable if it's not readonly AND the browser supports speech recognition\n this.startBtn.setEnabled(!readOnly && !!this.recognition);\n\n const currentVal = this.getProperty(\"value\");\n if (currentVal !== undefined && currentVal !== null) {\n // Only update text area if we aren't currently dictating interim results\n if (!this.isRecording) {\n this.textArea.setValue(currentVal as string);\n }\n }\n }\n\n /**\n * Cleans up hardware event listeners when the control is destroyed.\n */\n public exit(): void {\n this.stopDictation();\n if (this.recognition) {\n this.recognition.onstart = null;\n this.recognition.onresult = null;\n this.recognition.onerror = null;\n this.recognition.onend = null;\n this.recognition = null;\n }\n super.exit();\n }\n}\n"],"mappings":";;;;;;QAAOA,mBAAmB,GAAAC,sBAAA,CAAAC,qBAAA;EAAA,MAMjBC,MAAM,GAAAC,eAAA;EAEf;AACA;AACA;AACA;EACe,MAAMC,iBAAiB,SAASL,mBAAmB,CAAC;IAC/D,OAAgBM,QAAQ,GAAG,iEAAiE;IAC5F,OAAgBC,QAAQ,GAAG;MACvBC,UAAU,EAAE,CAAC,CAAC;MACdC,MAAM,EAAE,CAAC;IACb,CAAC;IAOOC,WAAW,GAAQ,IAAI;IACvBC,WAAW,GAAY,KAAK;;IAEpC;AACJ;AACA;IACWC,IAAIA,CAAA,EAAS;MAChB,KAAK,CAACA,IAAI,CAAC,CAAC;MAEZ,IAAI,CAACC,QAAQ,GAAG,IAAIC,QAAQ,CAAC;QACzBC,IAAI,EAAE,CAAC;QACPC,KAAK,EAAE,MAAM;QACbC,WAAW,EAAE,mCAAmC;QAChDC,UAAU,EAAGC,MAAyB,IAAK;UACvC,IAAI,CAACC,eAAe,CAACD,MAAM,CAACE,YAAY,CAAC,OAAO,CAAC,CAAC;QACtD;MACJ,CAAC,CAAC;MAEF,IAAI,CAACC,QAAQ,GAAG,IAAIC,MAAM,CAAC;QACvBC,IAAI,EAAE,uBAAuB;QAC7BC,IAAI,EAAE,iBAAiB;QACvBC,IAAI,EAAE,YAAY;QAClBC,KAAK,EAAE,IAAI,CAACC,eAAe,CAACC,IAAI,CAAC,IAAI;MACzC,CAAC,CAAC;MAEF,MAAMC,IAAI,GAAG,IAAIC,IAAI,CAAC;QAClBC,KAAK,EAAE,CAAC,IAAI,CAACV,QAAQ;MACzB,CAAC,CAAC,CAACW,aAAa,CAAC,qBAAqB,CAAC;MAEvC,IAAI,CAACC,IAAI,GAAG,IAAIC,IAAI,CAAC;QACjBH,KAAK,EAAE,CAAC,IAAI,CAACnB,QAAQ,EAAEiB,IAAI;MAC/B,CAAC,CAAC;MAEF,IAAI,CAACM,cAAc,CAAC,UAAU,EAAE,IAAI,CAACF,IAAI,CAAC;MAC1C,IAAI,CAACG,qBAAqB,CAAC,CAAC;IAChC;IAEQT,eAAeA,CAAA,EAAS;MAC5B,IAAI,IAAI,CAACjB,WAAW,EAAE;QAClB,IAAI,CAAC2B,aAAa,CAAC,CAAC;MACxB,CAAC,MAAM;QACH,IAAI,CAACC,cAAc,CAAC,CAAC;MACzB;IACJ;IAEQF,qBAAqBA,CAAA,EAAS;MAClC,MAAMG,iBAAiB,GAAIC,MAAM,CAAaD,iBAAiB,IAAKC,MAAM,CAAaC,uBAAuB;MAC9G,IAAIF,iBAAiB,EAAE;QACnB,IAAI,CAAC9B,WAAW,GAAG,IAAI8B,iBAAiB,CAAC,CAAC;QAC1C,IAAI,CAAC9B,WAAW,CAACiC,UAAU,GAAG,IAAI;QAClC,IAAI,CAACjC,WAAW,CAACkC,cAAc,GAAG,IAAI;QAEtC,IAAI,CAAClC,WAAW,CAACmC,QAAQ,GAAIC,KAAU,IAAK;UACxC,IAAIC,eAAe,GAAG,EAAE;UACxB,IAAIC,iBAAiB,GAAG,EAAE;UAE1B,KAAK,IAAIC,CAAC,GAAGH,KAAK,CAACI,WAAW,EAAED,CAAC,GAAGH,KAAK,CAACK,OAAO,CAACC,MAAM,EAAE,EAAEH,CAAC,EAAE;YAC3D,IAAIH,KAAK,CAACK,OAAO,CAACF,CAAC,CAAC,CAACI,OAAO,EAAE;cAC1BN,eAAe,IAAID,KAAK,CAACK,OAAO,CAACF,CAAC,CAAC,CAAC,CAAC,CAAC,CAACK,UAAU;YACrD,CAAC,MAAM;cACHN,iBAAiB,IAAIF,KAAK,CAACK,OAAO,CAACF,CAAC,CAAC,CAAC,CAAC,CAAC,CAACK,UAAU;YACvD;UACJ;;UAEA;UACA,MAAMC,UAAU,GAAG,IAAI,CAACC,QAAQ,CAAC,CAAC,IAAI,EAAE;UACxC,MAAMC,MAAM,GAAGF,UAAU,GAAGA,UAAU,GAAG,GAAG,GAAGR,eAAe,GAAGA,eAAe;UAEhF,IAAIA,eAAe,EAAE;YACjB,IAAI,CAAClC,QAAQ,CAAC6C,QAAQ,CAACD,MAAM,CAAC;YAC9B,IAAI,CAACrC,eAAe,CAACqC,MAAM,CAAC;UAChC,CAAC,MAAM,IAAIT,iBAAiB,EAAE;YAC1B;YACA,IAAI,CAACnC,QAAQ,CAAC6C,QAAQ,CAACH,UAAU,GAAGA,UAAU,GAAG,GAAG,GAAGP,iBAAiB,GAAGA,iBAAiB,CAAC;UACjG;QACJ,CAAC;QAED,IAAI,CAACtC,WAAW,CAACiD,OAAO,GAAG,MAAM;UAC7B,IAAI,CAAChD,WAAW,GAAG,IAAI;UACvB,IAAI,CAACW,QAAQ,CAACsC,OAAO,CAAC,iBAAiB,CAAC;UACxC,IAAI,CAACtC,QAAQ,CAACuC,OAAO,CAAC,gBAAgB,CAAC;UACvC,IAAI,CAACvC,QAAQ,CAACwC,OAAO,CAAC,QAAQ,CAAC;UAC/BC,YAAY,CAACC,IAAI,CAAC,gCAAgC,CAAC;QACvD,CAAC;QAED,IAAI,CAACtD,WAAW,CAACuD,OAAO,GAAInB,KAAU,IAAK;UACvC3C,MAAM,CAAC+D,KAAK,CAAC,0BAA0B,EAAEpB,KAAK,CAACoB,KAAK,EAAE,mBAAmB,CAAC;UAC1EC,GAAG,CAACC,EAAE,CAACC,OAAO,CAAC,CAAC,kBAAkB,CAAC,EAAGC,UAAmB,IAAK;YAC1DA,UAAU,CAACJ,KAAK,CAAC,oBAAoB,GAAGpB,KAAK,CAACoB,KAAK,GAAG,gHAAgH,CAAC;UAC3K,CAAC,CAAC;UACF,IAAI,CAAC5B,aAAa,CAAC,CAAC;QACxB,CAAC;QAED,IAAI,CAAC5B,WAAW,CAAC6D,KAAK,GAAG,MAAM;UAC3B;UACA,IAAI,CAACjC,aAAa,CAAC,CAAC;QACxB,CAAC;MACL,CAAC,MAAM;QACHnC,MAAM,CAACqE,IAAI,CAAC,+CAA+C,EAAE,EAAE,EAAE,mBAAmB,CAAC;QACrF,IAAI,CAAClD,QAAQ,CAACmD,UAAU,CAAC,KAAK,CAAC;QAC/B,IAAI,CAACnD,QAAQ,CAACoD,UAAU,CAAC,sDAAsD,CAAC;MACpF;IACJ;IAEQnC,cAAcA,CAAA,EAAS;MAC3B,IAAI,CAAC,IAAI,CAAC7B,WAAW,EAAE;MAEvB,IAAI;QACA,IAAI,CAACA,WAAW,CAACiE,KAAK,CAAC,CAAC;QACxBZ,YAAY,CAACC,IAAI,CAAC,iCAAiC,CAAC;QACpD;QACA,IAAI,CAAC1C,QAAQ,CAACsC,OAAO,CAAC,iBAAiB,CAAC;QACxC,IAAI,CAACtC,QAAQ,CAACuC,OAAO,CAAC,mBAAmB,CAAC;QAC1C,IAAI,CAACvC,QAAQ,CAACwC,OAAO,CAAC,QAAQ,CAAC;MACnC,CAAC,CAAC,OAAOc,GAAQ,EAAE;QACfzE,MAAM,CAAC+D,KAAK,CAAC,oCAAoC,EAAEU,GAAG,CAACC,OAAO,IAAID,GAAG,EAAE,mBAAmB,CAAC;QAC3FT,GAAG,CAACC,EAAE,CAACC,OAAO,CAAC,CAAC,kBAAkB,CAAC,EAAGC,UAAmB,IAAK;UAC1DA,UAAU,CAACJ,KAAK,CAAC,2HAA2H,IAAIU,GAAG,CAACC,OAAO,IAAID,GAAG,CAAC,CAAC;QACxK,CAAC,CAAC;QACF,IAAI,CAACtC,aAAa,CAAC,CAAC;MACxB;IACJ;IAEQA,aAAaA,CAAA,EAAS;MAC1B,IAAI,CAAC,IAAI,CAAC5B,WAAW,EAAE;MAEvB,IAAI;QACA,IAAI,CAACA,WAAW,CAACoE,IAAI,CAAC,CAAC;MAC3B,CAAC,CAAC,OAAMC,CAAC,EAAE,CAAC;MAEZ,IAAI,CAACpE,WAAW,GAAG,KAAK;MACxB,IAAI,CAACW,QAAQ,CAACsC,OAAO,CAAC,uBAAuB,CAAC;MAC9C,IAAI,CAACtC,QAAQ,CAACuC,OAAO,CAAC,iBAAiB,CAAC;MACxC,IAAI,CAACvC,QAAQ,CAACwC,OAAO,CAAC,YAAY,CAAC;IACvC;;IAEA;AACJ;AACA;AACA;IACWkB,iBAAiBA,CAAA,EAAS;MAC7B,MAAMC,QAAQ,GAAG,IAAI,CAACC,WAAW,CAAC,UAAU,CAAC;MAC7C,IAAI,CAACrE,QAAQ,CAACsE,WAAW,CAAC,CAACF,QAAQ,CAAC;;MAEpC;MACA,IAAI,CAAC3D,QAAQ,CAACmD,UAAU,CAAC,CAACQ,QAAQ,IAAI,CAAC,CAAC,IAAI,CAACvE,WAAW,CAAC;MAEzD,MAAM6C,UAAU,GAAG,IAAI,CAAC2B,WAAW,CAAC,OAAO,CAAC;MAC5C,IAAI3B,UAAU,KAAK6B,SAAS,IAAI7B,UAAU,KAAK,IAAI,EAAE;QACjD;QACA,IAAI,CAAC,IAAI,CAAC5C,WAAW,EAAE;UACnB,IAAI,CAACE,QAAQ,CAAC6C,QAAQ,CAACH,UAAoB,CAAC;QAChD;MACJ;IACJ;;IAEA;AACJ;AACA;IACW8B,IAAIA,CAAA,EAAS;MAChB,IAAI,CAAC/C,aAAa,CAAC,CAAC;MACpB,IAAI,IAAI,CAAC5B,WAAW,EAAE;QAClB,IAAI,CAACA,WAAW,CAACiD,OAAO,GAAG,IAAI;QAC/B,IAAI,CAACjD,WAAW,CAACmC,QAAQ,GAAG,IAAI;QAChC,IAAI,CAACnC,WAAW,CAACuD,OAAO,GAAG,IAAI;QAC/B,IAAI,CAACvD,WAAW,CAAC6D,KAAK,GAAG,IAAI;QAC7B,IAAI,CAAC7D,WAAW,GAAG,IAAI;MAC3B;MACA,KAAK,CAAC2E,IAAI,CAAC,CAAC;IAChB;EACJ;EAAC,OAAAhF,iBAAA;AAAA","ignoreList":[]}
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.
@@ -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;QAErC;;WAEG;QACI,IAAI,IAAI,IAAI;QA+BnB,OAAO,CAAC,eAAe;QAQvB,OAAO,CAAC,qBAAqB;QA2D7B,OAAO,CAAC,cAAc;QAmBtB,OAAO,CAAC,aAAa;QAarB;;;WAGG;QACI,iBAAiB,IAAI,IAAI;QAgBhC;;WAEG;QACI,IAAI,IAAI,IAAI;KAWtB;CAEA"}
1
+ {"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 /**\n * Initializes the dictation interface and requests Web Speech API setup.\n */\n public init(): void {\n super.init();\n\n this.textArea = new TextArea({\n rows: 3,\n width: \"100%\",\n placeholder: \"Dictated text will appear here...\",\n liveChange: (oEvent: sap.ui.base.Event) => {\n this.setValueAndFire(oEvent.getParameter(\"value\"));\n }\n });\n\n this.startBtn = new Button({\n icon: \"sap-icon://microphone\",\n text: \"Start Dictation\",\n type: \"Emphasized\",\n press: this.toggleDictation.bind(this)\n });\n\n const hBox = new HBox({\n items: [this.startBtn]\n }).addStyleClass(\"sapUiSmallMarginTop\");\n\n this.vBox = new VBox({\n items: [this.textArea, hBox]\n });\n\n this.setAggregation(\"_content\", this.vBox);\n this.initSpeechRecognition();\n }\n\n private toggleDictation(): void {\n if (this.isRecording) {\n this.stopDictation();\n } else {\n this.startDictation();\n }\n }\n\n private initSpeechRecognition(): void {\n const SpeechRecognition = (window as unknown).SpeechRecognition || (window as unknown).webkitSpeechRecognition;\n if (SpeechRecognition) {\n this.recognition = new SpeechRecognition();\n this.recognition.continuous = true;\n this.recognition.interimResults = true;\n\n this.recognition.onresult = (event: any) => {\n let finalTranscript = \"\";\n let interimTranscript = \"\";\n\n for (let i = event.resultIndex; i < event.results.length; ++i) {\n if (event.results[i].isFinal) {\n finalTranscript += event.results[i][0].transcript;\n } else {\n interimTranscript += event.results[i][0].transcript;\n }\n }\n\n // Append the new final transcript to whatever was already in the textarea\n const currentVal = this.getValue() || \"\";\n const newVal = currentVal ? currentVal + \" \" + finalTranscript : finalTranscript;\n \n if (finalTranscript) {\n this.textArea.setValue(newVal);\n this.setValueAndFire(newVal);\n } else if (interimTranscript) {\n // Just show interim temporarily in textarea without saving to model\n this.textArea.setValue(currentVal ? currentVal + \" \" + interimTranscript : interimTranscript);\n }\n };\n\n this.recognition.onstart = () => {\n this.isRecording = true;\n this.startBtn.setIcon(\"sap-icon://stop\");\n this.startBtn.setText(\"Stop Recording\");\n this.startBtn.setType(\"Reject\");\n MessageToast.show(\"Listening... Please speak now.\");\n };\n\n this.recognition.onerror = (event: any) => {\n Logger.error(\"Speech recognition error\", event.error, \"VoiceInputControl\");\n sap.ui.require([\"sap/m/MessageBox\"], (MessageBox: unknown) => {\n MessageBox.error(\"Microphone Error: \" + event.error + \"\\n\\nPlease ensure you have a working microphone attached and have not blocked access in your browser settings.\");\n });\n this.stopDictation();\n };\n \n this.recognition.onend = () => {\n // If it ends natively (e.g. timeout), update UI\n this.stopDictation();\n };\n } else {\n Logger.warn(\"Web Speech API not supported in this browser.\", \"\", \"VoiceInputControl\");\n this.startBtn.setEnabled(false);\n this.startBtn.setTooltip(\"Speech Recognition is not supported in this browser.\");\n }\n }\n\n private startDictation(): void {\n if (!this.recognition) return;\n \n try {\n this.recognition.start();\n MessageToast.show(\"Requesting microphone access...\");\n // Provide immediate UI feedback in case browser delays the onstart event\n this.startBtn.setIcon(\"sap-icon://stop\");\n this.startBtn.setText(\"Requesting mic...\");\n this.startBtn.setType(\"Reject\");\n } catch (err: any) {\n Logger.error(\"Failed to start speech recognition\", err.message || err, \"VoiceInputControl\");\n sap.ui.require([\"sap/m/MessageBox\"], (MessageBox: unknown) => {\n MessageBox.error(\"Failed to start dictation. Please ensure you have a working microphone and have granted browser permissions.\\n\\nDetails: \" + (err.message || err));\n });\n this.stopDictation();\n }\n }\n\n private stopDictation(): void {\n if (!this.recognition) return;\n \n try {\n this.recognition.stop();\n } catch(e) {}\n \n this.isRecording = false;\n this.startBtn.setIcon(\"sap-icon://microphone\");\n this.startBtn.setText(\"Start Dictation\");\n this.startBtn.setType(\"Emphasized\");\n }\n\n /**\n * Lifecycle hook called before the control is rendered to the DOM.\n * Handles browser support visual state.\n */\n public onBeforeRendering(): void {\n const readOnly = this.getProperty(\"readOnly\");\n this.textArea.setEditable(!readOnly);\n \n // Only enable if it's not readonly AND the browser supports speech recognition\n this.startBtn.setEnabled(!readOnly && !!this.recognition);\n\n const currentVal = this.getProperty(\"value\");\n if (currentVal !== undefined && currentVal !== null) {\n // Only update text area if we aren't currently dictating interim results\n if (!this.isRecording) {\n this.textArea.setValue(currentVal as string);\n }\n }\n }\n\n /**\n * Cleans up hardware event listeners when the control is destroyed.\n */\n public exit(): void {\n this.stopDictation();\n if (this.recognition) {\n this.recognition.onstart = null;\n this.recognition.onresult = null;\n this.recognition.onerror = null;\n this.recognition.onend = null;\n this.recognition = null;\n }\n super.exit();\n }\n}\n"],"mappings":"qQAAOA,EAAmBC,EAAAC,GAAA,MAMjBC,EAAMC,EAAA,UAMA,MAAMC,UAA0BL,EAC3CM,gBAA2B,kEAC3BA,gBAA2B,CACvBC,WAAY,CAAC,EACbC,OAAQ,CAAC,GAQLC,YAAmB,KACnBC,YAAuB,MAKxBC,OACHC,MAAMD,OAENE,KAAKC,SAAW,IAAIC,EAAS,CACzBC,KAAM,EACNC,MAAO,OACPC,YAAa,oCACbC,WAAaC,IACTP,KAAKQ,gBAAgBD,EAAOE,aAAa,aAIjDT,KAAKU,SAAW,IAAIC,EAAO,CACvBC,KAAM,wBACNC,KAAM,kBACNC,KAAM,aACNC,MAAOf,KAAKgB,gBAAgBC,KAAKjB,QAGrC,MAAMkB,EAAO,IAAIC,EAAK,CAClBC,MAAO,CAACpB,KAAKU,YACdW,cAAc,uBAEjBrB,KAAKsB,KAAO,IAAIC,EAAK,CACjBH,MAAO,CAACpB,KAAKC,SAAUiB,KAG3BlB,KAAKwB,eAAe,WAAYxB,KAAKsB,MACrCtB,KAAKyB,uBACT,CAEQT,kBACJ,GAAIhB,KAAKH,YAAa,CAClBG,KAAK0B,eACT,KAAO,CACH1B,KAAK2B,gBACT,CACJ,CAEQF,wBACJ,MAAMG,EAAqBC,OAAmBD,mBAAsBC,OAAmBC,wBACvF,GAAIF,EAAmB,CACnB5B,KAAKJ,YAAc,IAAIgC,EACvB5B,KAAKJ,YAAYmC,WAAa,KAC9B/B,KAAKJ,YAAYoC,eAAiB,KAElChC,KAAKJ,YAAYqC,SAAYC,IACzB,IAAIC,EAAkB,GACtB,IAAIC,EAAoB,GAExB,IAAK,IAAIC,EAAIH,EAAMI,YAAaD,EAAIH,EAAMK,QAAQC,SAAUH,EAAG,CAC3D,GAAIH,EAAMK,QAAQF,GAAGI,QAAS,CAC1BN,GAAmBD,EAAMK,QAAQF,GAAG,GAAGK,UAC3C,KAAO,CACHN,GAAqBF,EAAMK,QAAQF,GAAG,GAAGK,UAC7C,CACJ,CAGA,MAAMC,EAAa3C,KAAK4C,YAAc,GACtC,MAAMC,EAASF,EAAaA,EAAa,IAAMR,EAAkBA,EAEjE,GAAIA,EAAiB,CACjBnC,KAAKC,SAAS6C,SAASD,GACvB7C,KAAKQ,gBAAgBqC,EACzB,MAAO,GAAIT,EAAmB,CAE1BpC,KAAKC,SAAS6C,SAASH,EAAaA,EAAa,IAAMP,EAAoBA,EAC/E,GAGJpC,KAAKJ,YAAYmD,QAAU,KACvB/C,KAAKH,YAAc,KACnBG,KAAKU,SAASsC,QAAQ,mBACtBhD,KAAKU,SAASuC,QAAQ,kBACtBjD,KAAKU,SAASwC,QAAQ,UACtBC,EAAaC,KAAK,mCAGtBpD,KAAKJ,YAAYyD,QAAWnB,IACxB5C,EAAOgE,MAAM,2BAA4BpB,EAAMoB,MAAO,qBACtDC,IAAIC,GAAGC,QAAQ,CAAC,oBAAsBC,IAClCA,EAAWJ,MAAM,qBAAuBpB,EAAMoB,MAAQ,oHAE1DtD,KAAK0B,iBAGT1B,KAAKJ,YAAY+D,MAAQ,KAErB3D,KAAK0B,gBAEb,KAAO,CACHpC,EAAOsE,KAAK,gDAAiD,GAAI,qBACjE5D,KAAKU,SAASmD,WAAW,OACzB7D,KAAKU,SAASoD,WAAW,uDAC7B,CACJ,CAEQnC,iBACJ,IAAK3B,KAAKJ,YAAa,OAEvB,IACII,KAAKJ,YAAYmE,QACjBZ,EAAaC,KAAK,mCAElBpD,KAAKU,SAASsC,QAAQ,mBACtBhD,KAAKU,SAASuC,QAAQ,qBACtBjD,KAAKU,SAASwC,QAAQ,SAC1B,CAAE,MAAOc,GACL1E,EAAOgE,MAAM,qCAAsCU,EAAIC,SAAWD,EAAK,qBACvET,IAAIC,GAAGC,QAAQ,CAAC,oBAAsBC,IAClCA,EAAWJ,MAAM,6HAA+HU,EAAIC,SAAWD,MAEnKhE,KAAK0B,eACT,CACJ,CAEQA,gBACJ,IAAK1B,KAAKJ,YAAa,OAEvB,IACII,KAAKJ,YAAYsE,MACrB,CAAE,MAAMC,GAAI,CAEZnE,KAAKH,YAAc,MACnBG,KAAKU,SAASsC,QAAQ,yBACtBhD,KAAKU,SAASuC,QAAQ,mBACtBjD,KAAKU,SAASwC,QAAQ,aAC1B,CAMOkB,oBACH,MAAMC,EAAWrE,KAAKsE,YAAY,YAClCtE,KAAKC,SAASsE,aAAaF,GAG3BrE,KAAKU,SAASmD,YAAYQ,KAAcrE,KAAKJ,aAE7C,MAAM+C,EAAa3C,KAAKsE,YAAY,SACpC,GAAI3B,IAAe6B,WAAa7B,IAAe,KAAM,CAEjD,IAAK3C,KAAKH,YAAa,CACnBG,KAAKC,SAAS6C,SAASH,EAC3B,CACJ,CACJ,CAKO8B,OACHzE,KAAK0B,gBACL,GAAI1B,KAAKJ,YAAa,CAClBI,KAAKJ,YAAYmD,QAAU,KAC3B/C,KAAKJ,YAAYqC,SAAW,KAC5BjC,KAAKJ,YAAYyD,QAAU,KAC3BrD,KAAKJ,YAAY+D,MAAQ,KACzB3D,KAAKJ,YAAc,IACvB,CACAG,MAAM0E,MACV,EACH,OAAAjF,CAAA","ignoreList":[]}
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":"qQAAOA,EAAmBC,EAAAC,GAAA,MAMjBC,EAAMC,EAAA,UAsCA,MAAMC,UAA0BL,EAC3CM,gBAA2B,kEAC3BA,gBAA2B,CACvBC,WAAY,CAAC,EACbC,OAAQ,CAAC,GAQLC,YAAwC,KACxCC,YAAuB,MAKxBC,OACHC,MAAMD,OAENE,KAAKC,SAAW,IAAIC,EAAS,CACzBC,KAAM,EACNC,MAAO,OACPC,YAAa,oCACbC,WAAaC,IACTP,KAAKQ,gBAAgBD,EAAOE,aAAa,aAIjDT,KAAKU,SAAW,IAAIC,EAAO,CACvBC,KAAM,wBACNC,KAAM,kBACNC,KAAM,aACNC,MAAOf,KAAKgB,gBAAgBC,KAAKjB,QAGrC,MAAMkB,EAAO,IAAIC,EAAK,CAClBC,MAAO,CAACpB,KAAKU,YACdW,cAAc,uBAEjBrB,KAAKsB,KAAO,IAAIC,EAAK,CACjBH,MAAO,CAACpB,KAAKC,SAAUiB,KAG3BlB,KAAKwB,eAAe,WAAYxB,KAAKsB,MACrCtB,KAAKyB,uBACT,CAEQT,kBACJ,GAAIhB,KAAKH,YAAa,CAClBG,KAAK0B,eACT,KAAO,CACH1B,KAAK2B,gBACT,CACJ,CAEQF,wBACJ,MAAMG,EAAyBC,OAAOC,mBAAqBD,OAAOE,wBAClE,GAAIH,EAAwB,CACxB5B,KAAKJ,YAAc,IAAIgC,EACvB5B,KAAKJ,YAAYoC,WAAa,KAC9BhC,KAAKJ,YAAYqC,eAAiB,KAElCjC,KAAKJ,YAAYsC,SAAYC,IACzB,IAAIC,EAAkB,GACtB,IAAIC,EAAoB,GAExB,IAAK,IAAIC,EAAIH,EAAMI,YAAaD,EAAIH,EAAMK,QAAQC,SAAUH,EAAG,CAC3D,GAAIH,EAAMK,QAAQF,GAAGI,QAAS,CAC1BN,GAAmBD,EAAMK,QAAQF,GAAG,GAAGK,UAC3C,KAAO,CACHN,GAAqBF,EAAMK,QAAQF,GAAG,GAAGK,UAC7C,CACJ,CAGA,MAAMC,EAAa5C,KAAK6C,YAAc,GACtC,MAAMC,EAASF,EAAaA,EAAa,IAAMR,EAAkBA,EAEjE,GAAIA,EAAiB,CACjBpC,KAAKC,SAAS8C,SAASD,GACvB9C,KAAKQ,gBAAgBsC,EACzB,MAAO,GAAIT,EAAmB,CAE1BrC,KAAKC,SAAS8C,SAASH,EAAaA,EAAa,IAAMP,EAAoBA,EAC/E,GAGJrC,KAAKJ,YAAYoD,QAAU,KACvBhD,KAAKH,YAAc,KACnBG,KAAKU,SAASuC,QAAQ,mBACtBjD,KAAKU,SAASwC,QAAQ,kBACtBlD,KAAKU,SAASyC,QAAQ,UACtBC,EAAaC,KAAK,mCAGtBrD,KAAKJ,YAAY0D,QAAWnB,IACxB7C,EAAOiE,MAAM,2BAA4BpB,EAAMoB,MAAO,qBACtDC,IAAIC,GAAGC,QAAQ,CAAC,oBAAsBC,IAClCA,EAAWJ,MAAM,qBAAuBpB,EAAMoB,MAAQ,oHAE1DvD,KAAK0B,iBAGT1B,KAAKJ,YAAYgE,MAAQ,KAErB5D,KAAK0B,gBAEb,KAAO,CACHpC,EAAOuE,KAAK,gDAAiD,GAAI,qBACjE7D,KAAKU,SAASoD,WAAW,OACzB9D,KAAKU,SAASqD,WAAW,uDAC7B,CACJ,CAEQpC,iBACJ,IAAK3B,KAAKJ,YAAa,OAEvB,IACII,KAAKJ,YAAYoE,QACjBZ,EAAaC,KAAK,mCAElBrD,KAAKU,SAASuC,QAAQ,mBACtBjD,KAAKU,SAASwC,QAAQ,qBACtBlD,KAAKU,SAASyC,QAAQ,SAC1B,CAAE,MAAOc,GACL,MAAMV,EAAQU,EACd3E,EAAOiE,MAAM,qCAAsCA,EAAMW,SAAWC,OAAOZ,GAAQ,qBACnFC,IAAIC,GAAGC,QAAQ,CAAC,oBAAsBC,IAClCA,EAAWJ,MAAM,6HAA+HA,EAAMW,SAAWC,OAAOZ,OAE5KvD,KAAK0B,eACT,CACJ,CAEQA,gBACJ,IAAK1B,KAAKJ,YAAa,OAEvB,IACII,KAAKJ,YAAYwE,MACrB,CAAE,MAAMC,GACJ/E,EAAOuE,KAAK,gDAAiDM,OAAOE,GAAI,oBAC5E,CAEArE,KAAKH,YAAc,MACnBG,KAAKU,SAASuC,QAAQ,yBACtBjD,KAAKU,SAASwC,QAAQ,mBACtBlD,KAAKU,SAASyC,QAAQ,aAC1B,CAMOmB,oBACH,MAAMC,EAAWvE,KAAKwE,YAAY,YAClCxE,KAAKC,SAASwE,aAAaF,GAG3BvE,KAAKU,SAASoD,YAAYS,KAAcvE,KAAKJ,aAE7C,MAAMgD,EAAa5C,KAAKwE,YAAY,SACpC,GAAI5B,IAAe8B,WAAa9B,IAAe,KAAM,CAEjD,IAAK5C,KAAKH,YAAa,CACnBG,KAAKC,SAAS8C,SAASH,EAC3B,CACJ,CACJ,CAKO+B,OACH3E,KAAK0B,gBACL,GAAI1B,KAAKJ,YAAa,CAClBI,KAAKJ,YAAYoD,QAAU,KAC3BhD,KAAKJ,YAAYsC,SAAW,KAC5BlC,KAAKJ,YAAY0D,QAAU,KAC3BtD,KAAKJ,YAAYgE,MAAQ,KACzB5D,KAAKJ,YAAc,IACvB,CACAG,MAAM4E,MACV,EACH,OAAAnF,CAAA","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,7 +54,7 @@ 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
 
28
60
  /**
@@ -68,13 +100,13 @@ export default class VoiceInputControl extends BaseHardwareControl {
68
100
  }
69
101
 
70
102
  private initSpeechRecognition(): void {
71
- const SpeechRecognition = (window as unknown).SpeechRecognition || (window as unknown).webkitSpeechRecognition;
72
- if (SpeechRecognition) {
73
- this.recognition = new SpeechRecognition();
103
+ const SpeechRecognitionClass = window.SpeechRecognition || window.webkitSpeechRecognition;
104
+ if (SpeechRecognitionClass) {
105
+ this.recognition = new SpeechRecognitionClass();
74
106
  this.recognition.continuous = true;
75
107
  this.recognition.interimResults = true;
76
108
 
77
- this.recognition.onresult = (event: any) => {
109
+ this.recognition.onresult = (event: SpeechRecognitionEvent) => {
78
110
  let finalTranscript = "";
79
111
  let interimTranscript = "";
80
112
 
@@ -107,9 +139,9 @@ export default class VoiceInputControl extends BaseHardwareControl {
107
139
  MessageToast.show("Listening... Please speak now.");
108
140
  };
109
141
 
110
- this.recognition.onerror = (event: any) => {
142
+ this.recognition.onerror = (event: SpeechRecognitionErrorEvent) => {
111
143
  Logger.error("Speech recognition error", event.error, "VoiceInputControl");
112
- sap.ui.require(["sap/m/MessageBox"], (MessageBox: unknown) => {
144
+ sap.ui.require(["sap/m/MessageBox"], (MessageBox: typeof import("sap/m/MessageBox").default) => {
113
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.");
114
146
  });
115
147
  this.stopDictation();
@@ -136,10 +168,11 @@ export default class VoiceInputControl extends BaseHardwareControl {
136
168
  this.startBtn.setIcon("sap-icon://stop");
137
169
  this.startBtn.setText("Requesting mic...");
138
170
  this.startBtn.setType("Reject");
139
- } catch (err: any) {
140
- Logger.error("Failed to start speech recognition", err.message || err, "VoiceInputControl");
141
- sap.ui.require(["sap/m/MessageBox"], (MessageBox: unknown) => {
142
- 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)));
143
176
  });
144
177
  this.stopDictation();
145
178
  }
@@ -150,7 +183,9 @@ export default class VoiceInputControl extends BaseHardwareControl {
150
183
 
151
184
  try {
152
185
  this.recognition.stop();
153
- } catch(e) {}
186
+ } catch(e) {
187
+ Logger.warn("Failed to gracefully stop speech recognition.", String(e), "VoiceInputControl");
188
+ }
154
189
 
155
190
  this.isRecording = false;
156
191
  this.startBtn.setIcon("sap-icon://microphone");
@@ -364,24 +364,16 @@ sap.ui.define(["sap/ui/core/Control", "../../utils/Logger", "../../core/SchemaNo
364
364
  },
365
365
  /**
366
366
  * The core rendering pipeline entry point.
367
- * Debounces concurrent or rapid consecutive calls to prevent UI tearing and redundant network requests.
368
- * Delays execution by 50ms to allow all synchronous property bindings to settle before orchestrating the build.
367
+ * Uses Promise resolution to debounce concurrent or rapid consecutive calls natively without arbitrary timeouts.
369
368
  * @returns Promise that resolves when the layout is successfully built and mounted.
370
369
  */
371
370
  generate: async function _generate() {
372
- return new Promise(resolve => {
373
- if (this._generateTimeoutId !== null) {
374
- window.clearTimeout(this._generateTimeoutId);
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");
375
376
  }
376
- this._generateTimeoutId = window.setTimeout(async () => {
377
- this._generateTimeoutId = null;
378
- try {
379
- await this._doGenerate();
380
- } catch (e) {
381
- Logger.error("[MetaUI]", "Error in deferred generate: " + e, "GeneratorHost");
382
- }
383
- resolve();
384
- }, 50);
385
377
  });
386
378
  },
387
379
  /**