@siliconst/metaui 1.4.21 → 1.4.34

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 (338) hide show
  1. package/package.json +1 -1
  2. package/src/nz/co/siliconst/ui5/metaui/constants/MetaUIConstants-dbg.js +51 -0
  3. package/src/nz/co/siliconst/ui5/metaui/constants/MetaUIConstants-dbg.js.map +1 -0
  4. package/src/nz/co/siliconst/ui5/metaui/constants/MetaUIConstants.d.ts +41 -0
  5. package/src/nz/co/siliconst/ui5/metaui/constants/MetaUIConstants.d.ts.map +1 -0
  6. package/src/nz/co/siliconst/ui5/metaui/constants/MetaUIConstants.js +2 -0
  7. package/src/nz/co/siliconst/ui5/metaui/constants/MetaUIConstants.js.map +1 -0
  8. package/src/nz/co/siliconst/ui5/metaui/constants/MetaUIConstants.ts +44 -0
  9. package/src/nz/co/siliconst/ui5/metaui/controls/BaseHardwareControl-dbg.js.map +1 -1
  10. package/src/nz/co/siliconst/ui5/metaui/controls/BaseHardwareControl.js.map +1 -1
  11. package/src/nz/co/siliconst/ui5/metaui/controls/BaseHardwareControl.ts +1 -1
  12. package/src/nz/co/siliconst/ui5/metaui/controls/BaseHardwareControlRenderer-dbg.js.map +1 -1
  13. package/src/nz/co/siliconst/ui5/metaui/controls/BaseHardwareControlRenderer.d.ts.map +1 -1
  14. package/src/nz/co/siliconst/ui5/metaui/controls/BaseHardwareControlRenderer.js.map +1 -1
  15. package/src/nz/co/siliconst/ui5/metaui/controls/BaseHardwareControlRenderer.ts +2 -1
  16. package/src/nz/co/siliconst/ui5/metaui/controls/CameraControl-dbg.js +2 -2
  17. package/src/nz/co/siliconst/ui5/metaui/controls/CameraControl-dbg.js.map +1 -1
  18. package/src/nz/co/siliconst/ui5/metaui/controls/CameraControl.js +1 -1
  19. package/src/nz/co/siliconst/ui5/metaui/controls/CameraControl.js.map +1 -1
  20. package/src/nz/co/siliconst/ui5/metaui/controls/CameraControl.ts +3 -3
  21. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost-dbg.js +5 -1
  22. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost-dbg.js.map +1 -1
  23. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.d.ts +6 -2
  24. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.d.ts.map +1 -1
  25. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.js +1 -1
  26. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.js.map +1 -1
  27. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.ts +10 -9
  28. package/src/nz/co/siliconst/ui5/metaui/controls/GeolocationControl-dbg.js +0 -9
  29. package/src/nz/co/siliconst/ui5/metaui/controls/GeolocationControl-dbg.js.map +1 -1
  30. package/src/nz/co/siliconst/ui5/metaui/controls/GeolocationControl.d.ts +0 -9
  31. package/src/nz/co/siliconst/ui5/metaui/controls/GeolocationControl.d.ts.map +1 -1
  32. package/src/nz/co/siliconst/ui5/metaui/controls/GeolocationControl.js +1 -1
  33. package/src/nz/co/siliconst/ui5/metaui/controls/GeolocationControl.js.map +1 -1
  34. package/src/nz/co/siliconst/ui5/metaui/controls/GeolocationControl.ts +3 -9
  35. package/src/nz/co/siliconst/ui5/metaui/controls/RichTextControl-dbg.js +0 -11
  36. package/src/nz/co/siliconst/ui5/metaui/controls/RichTextControl-dbg.js.map +1 -1
  37. package/src/nz/co/siliconst/ui5/metaui/controls/RichTextControl.d.ts +0 -11
  38. package/src/nz/co/siliconst/ui5/metaui/controls/RichTextControl.d.ts.map +1 -1
  39. package/src/nz/co/siliconst/ui5/metaui/controls/RichTextControl.js +1 -1
  40. package/src/nz/co/siliconst/ui5/metaui/controls/RichTextControl.js.map +1 -1
  41. package/src/nz/co/siliconst/ui5/metaui/controls/RichTextControl.ts +2 -9
  42. package/src/nz/co/siliconst/ui5/metaui/controls/SignatureControl-dbg.js +2 -7
  43. package/src/nz/co/siliconst/ui5/metaui/controls/SignatureControl-dbg.js.map +1 -1
  44. package/src/nz/co/siliconst/ui5/metaui/controls/SignatureControl.d.ts +0 -5
  45. package/src/nz/co/siliconst/ui5/metaui/controls/SignatureControl.d.ts.map +1 -1
  46. package/src/nz/co/siliconst/ui5/metaui/controls/SignatureControl.js +1 -1
  47. package/src/nz/co/siliconst/ui5/metaui/controls/SignatureControl.js.map +1 -1
  48. package/src/nz/co/siliconst/ui5/metaui/controls/SignatureControl.ts +3 -7
  49. package/src/nz/co/siliconst/ui5/metaui/controls/VoiceInputControl-dbg.js +1 -6
  50. package/src/nz/co/siliconst/ui5/metaui/controls/VoiceInputControl-dbg.js.map +1 -1
  51. package/src/nz/co/siliconst/ui5/metaui/controls/VoiceInputControl.d.ts +0 -5
  52. package/src/nz/co/siliconst/ui5/metaui/controls/VoiceInputControl.d.ts.map +1 -1
  53. package/src/nz/co/siliconst/ui5/metaui/controls/VoiceInputControl.js +1 -1
  54. package/src/nz/co/siliconst/ui5/metaui/controls/VoiceInputControl.js.map +1 -1
  55. package/src/nz/co/siliconst/ui5/metaui/controls/VoiceInputControl.ts +9 -12
  56. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost-dbg.js +51 -12
  57. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost-dbg.js.map +1 -1
  58. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.d.ts +13 -0
  59. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.d.ts.map +1 -1
  60. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.js +1 -1
  61. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.js.map +1 -1
  62. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.ts +53 -14
  63. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate-dbg.js +2 -2
  64. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate-dbg.js.map +1 -1
  65. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate.d.ts +1 -1
  66. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate.d.ts.map +1 -1
  67. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate.js +1 -1
  68. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate.js.map +1 -1
  69. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate.ts +3 -3
  70. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ODataDelegate-dbg.js.map +1 -1
  71. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ODataDelegate.d.ts +1 -1
  72. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ODataDelegate.d.ts.map +1 -1
  73. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ODataDelegate.js.map +1 -1
  74. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ODataDelegate.ts +8 -7
  75. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate-dbg.js.map +1 -1
  76. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate.d.ts +1 -1
  77. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate.d.ts.map +1 -1
  78. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate.js.map +1 -1
  79. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate.ts +3 -3
  80. package/src/nz/co/siliconst/ui5/metaui/core/ConditionEngine-dbg.js.map +1 -1
  81. package/src/nz/co/siliconst/ui5/metaui/core/ConditionEngine.js.map +1 -1
  82. package/src/nz/co/siliconst/ui5/metaui/core/ConditionEngine.ts +4 -4
  83. package/src/nz/co/siliconst/ui5/metaui/core/Engine-dbg.js +3 -4
  84. package/src/nz/co/siliconst/ui5/metaui/core/Engine-dbg.js.map +1 -1
  85. package/src/nz/co/siliconst/ui5/metaui/core/Engine.d.ts +1 -1
  86. package/src/nz/co/siliconst/ui5/metaui/core/Engine.d.ts.map +1 -1
  87. package/src/nz/co/siliconst/ui5/metaui/core/Engine.js +1 -1
  88. package/src/nz/co/siliconst/ui5/metaui/core/Engine.js.map +1 -1
  89. package/src/nz/co/siliconst/ui5/metaui/core/Engine.ts +6 -7
  90. package/src/nz/co/siliconst/ui5/metaui/core/LayoutMutator-dbg.js +84 -0
  91. package/src/nz/co/siliconst/ui5/metaui/core/LayoutMutator-dbg.js.map +1 -0
  92. package/src/nz/co/siliconst/ui5/metaui/core/LayoutMutator.d.ts +16 -0
  93. package/src/nz/co/siliconst/ui5/metaui/core/LayoutMutator.d.ts.map +1 -0
  94. package/src/nz/co/siliconst/ui5/metaui/core/LayoutMutator.js +2 -0
  95. package/src/nz/co/siliconst/ui5/metaui/core/LayoutMutator.js.map +1 -0
  96. package/src/nz/co/siliconst/ui5/metaui/core/LayoutMutator.ts +80 -0
  97. package/src/nz/co/siliconst/ui5/metaui/core/LayoutScorer-dbg.js +137 -0
  98. package/src/nz/co/siliconst/ui5/metaui/core/LayoutScorer-dbg.js.map +1 -0
  99. package/src/nz/co/siliconst/ui5/metaui/core/LayoutScorer.d.ts +24 -0
  100. package/src/nz/co/siliconst/ui5/metaui/core/LayoutScorer.d.ts.map +1 -0
  101. package/src/nz/co/siliconst/ui5/metaui/core/LayoutScorer.js +2 -0
  102. package/src/nz/co/siliconst/ui5/metaui/core/LayoutScorer.js.map +1 -0
  103. package/src/nz/co/siliconst/ui5/metaui/core/LayoutScorer.ts +141 -0
  104. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry-dbg.js +26 -0
  105. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry-dbg.js.map +1 -1
  106. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry.d.ts +2 -0
  107. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry.d.ts.map +1 -1
  108. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry.js +1 -1
  109. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry.js.map +1 -1
  110. package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry.ts +29 -1
  111. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer-dbg.js +1 -1
  112. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer-dbg.js.map +1 -1
  113. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.d.ts +4 -4
  114. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.d.ts.map +1 -1
  115. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.js +1 -1
  116. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.js.map +1 -1
  117. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.ts +11 -11
  118. package/src/nz/co/siliconst/ui5/metaui/core/StateManager-dbg.js.map +1 -1
  119. package/src/nz/co/siliconst/ui5/metaui/core/StateManager.js.map +1 -1
  120. package/src/nz/co/siliconst/ui5/metaui/core/StateManager.ts +1 -1
  121. package/src/nz/co/siliconst/ui5/metaui/interfaces/ISchema-dbg.js.map +1 -1
  122. package/src/nz/co/siliconst/ui5/metaui/interfaces/ISchema.d.ts +4 -1
  123. package/src/nz/co/siliconst/ui5/metaui/interfaces/ISchema.d.ts.map +1 -1
  124. package/src/nz/co/siliconst/ui5/metaui/interfaces/ISchema.ts +5 -1
  125. package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout-dbg.js +5 -5
  126. package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout-dbg.js.map +1 -1
  127. package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout.d.ts.map +1 -1
  128. package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout.js +1 -1
  129. package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout.js.map +1 -1
  130. package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout.ts +4 -4
  131. package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout-dbg.js +7 -5
  132. package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout-dbg.js.map +1 -1
  133. package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout.d.ts.map +1 -1
  134. package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout.js +1 -1
  135. package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout.js.map +1 -1
  136. package/src/nz/co/siliconst/ui5/metaui/layouts/TableLayout.ts +11 -7
  137. package/src/nz/co/siliconst/ui5/metaui/library-preload.js +40 -37
  138. package/src/nz/co/siliconst/ui5/metaui/library-preload.js.map +1 -1
  139. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiParserFactory-dbg.js.map +1 -1
  140. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiParserFactory.d.ts +1 -1
  141. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiParserFactory.d.ts.map +1 -1
  142. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiParserFactory.js.map +1 -1
  143. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiParserFactory.ts +1 -1
  144. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiRefResolver-dbg.js.map +1 -1
  145. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiRefResolver.d.ts +1 -1
  146. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiRefResolver.d.ts.map +1 -1
  147. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiRefResolver.js.map +1 -1
  148. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiRefResolver.ts +1 -1
  149. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiUIMapper-dbg.js.map +1 -1
  150. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiUIMapper.d.ts +1 -1
  151. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiUIMapper.d.ts.map +1 -1
  152. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiUIMapper.js.map +1 -1
  153. package/src/nz/co/siliconst/ui5/metaui/openapi/OpenApiUIMapper.ts +1 -1
  154. package/src/nz/co/siliconst/ui5/metaui/openapi/heuristics/OpenApiHeuristicEngine-dbg.js +2 -2
  155. package/src/nz/co/siliconst/ui5/metaui/openapi/heuristics/OpenApiHeuristicEngine-dbg.js.map +1 -1
  156. package/src/nz/co/siliconst/ui5/metaui/openapi/heuristics/OpenApiHeuristicEngine.js.map +1 -1
  157. package/src/nz/co/siliconst/ui5/metaui/openapi/heuristics/OpenApiHeuristicEngine.ts +2 -2
  158. package/src/nz/co/siliconst/ui5/metaui/openapi/heuristics/plugins/ProtobufVariantHeuristic-dbg.js.map +1 -1
  159. package/src/nz/co/siliconst/ui5/metaui/openapi/heuristics/plugins/ProtobufVariantHeuristic.d.ts +1 -1
  160. package/src/nz/co/siliconst/ui5/metaui/openapi/heuristics/plugins/ProtobufVariantHeuristic.d.ts.map +1 -1
  161. package/src/nz/co/siliconst/ui5/metaui/openapi/heuristics/plugins/ProtobufVariantHeuristic.js.map +1 -1
  162. package/src/nz/co/siliconst/ui5/metaui/openapi/heuristics/plugins/ProtobufVariantHeuristic.ts +3 -3
  163. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi2Parser-dbg.js.map +1 -1
  164. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi2Parser.d.ts +1 -1
  165. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi2Parser.d.ts.map +1 -1
  166. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi2Parser.js.map +1 -1
  167. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi2Parser.ts +1 -1
  168. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi3Parser-dbg.js.map +1 -1
  169. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi3Parser.d.ts +1 -1
  170. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi3Parser.d.ts.map +1 -1
  171. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi3Parser.js.map +1 -1
  172. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApi3Parser.ts +1 -1
  173. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApiPropertyMapper-dbg.js +1 -1
  174. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApiPropertyMapper-dbg.js.map +1 -1
  175. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApiPropertyMapper.d.ts +4 -4
  176. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApiPropertyMapper.d.ts.map +1 -1
  177. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApiPropertyMapper.js.map +1 -1
  178. package/src/nz/co/siliconst/ui5/metaui/openapi/parsers/OpenApiPropertyMapper.ts +19 -19
  179. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/ClearFormActionPlugin-dbg.js.map +1 -1
  180. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/ClearFormActionPlugin.d.ts.map +1 -1
  181. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/ClearFormActionPlugin.js.map +1 -1
  182. package/src/nz/co/siliconst/ui5/metaui/plugins/actions/ClearFormActionPlugin.ts +2 -1
  183. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin-dbg.js +18 -15
  184. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin-dbg.js.map +1 -1
  185. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin.d.ts.map +1 -1
  186. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin.js +1 -1
  187. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin.js.map +1 -1
  188. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin.ts +18 -18
  189. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin-dbg.js +1 -1
  190. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin-dbg.js.map +1 -1
  191. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin.js +1 -1
  192. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin.js.map +1 -1
  193. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin.ts +2 -2
  194. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin-dbg.js.map +1 -1
  195. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.d.ts +1 -6
  196. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.d.ts.map +1 -1
  197. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.js.map +1 -1
  198. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.ts +2 -2
  199. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin-dbg.js.map +1 -1
  200. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin.js.map +1 -1
  201. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin.ts +1 -1
  202. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin-dbg.js +2 -2
  203. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin-dbg.js.map +1 -1
  204. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin.js +1 -1
  205. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin.js.map +1 -1
  206. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin.ts +2 -2
  207. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin-dbg.js +4 -4
  208. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin-dbg.js.map +1 -1
  209. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin.js +1 -1
  210. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin.js.map +1 -1
  211. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin.ts +4 -4
  212. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin-dbg.js +1 -1
  213. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin-dbg.js.map +1 -1
  214. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin.js +1 -1
  215. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin.js.map +1 -1
  216. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin.ts +2 -2
  217. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin-dbg.js +1 -1
  218. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin-dbg.js.map +1 -1
  219. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin.js +1 -1
  220. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin.js.map +1 -1
  221. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin.ts +2 -2
  222. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin-dbg.js.map +1 -1
  223. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin.js.map +1 -1
  224. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin.ts +1 -1
  225. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/EmailPlugin-dbg.js +1 -1
  226. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/EmailPlugin-dbg.js.map +1 -1
  227. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/EmailPlugin.js +1 -1
  228. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/EmailPlugin.js.map +1 -1
  229. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/EmailPlugin.ts +1 -1
  230. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin-dbg.js +1 -1
  231. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin-dbg.js.map +1 -1
  232. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin.js +1 -1
  233. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin.js.map +1 -1
  234. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin.ts +2 -2
  235. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin-dbg.js +2 -2
  236. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin-dbg.js.map +1 -1
  237. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin.js +1 -1
  238. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin.js.map +1 -1
  239. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin.ts +2 -2
  240. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/LinkPlugin-dbg.js +1 -1
  241. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/LinkPlugin-dbg.js.map +1 -1
  242. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/LinkPlugin.js +1 -1
  243. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/LinkPlugin.js.map +1 -1
  244. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/LinkPlugin.ts +1 -1
  245. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiInputPlugin-dbg.js +1 -1
  246. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiInputPlugin-dbg.js.map +1 -1
  247. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiInputPlugin.js +1 -1
  248. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiInputPlugin.js.map +1 -1
  249. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiInputPlugin.ts +3 -3
  250. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin-dbg.js +3 -3
  251. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin-dbg.js.map +1 -1
  252. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin.js +1 -1
  253. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin.js.map +1 -1
  254. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin.ts +4 -4
  255. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin-dbg.js +5 -4
  256. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin-dbg.js.map +1 -1
  257. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin.d.ts.map +1 -1
  258. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin.js +1 -1
  259. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin.js.map +1 -1
  260. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin.ts +7 -6
  261. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/PasswordPlugin-dbg.js +1 -1
  262. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/PasswordPlugin-dbg.js.map +1 -1
  263. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/PasswordPlugin.js +1 -1
  264. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/PasswordPlugin.js.map +1 -1
  265. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/PasswordPlugin.ts +1 -1
  266. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin-dbg.js +1 -1
  267. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin-dbg.js.map +1 -1
  268. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin.js +1 -1
  269. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin.js.map +1 -1
  270. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin.ts +2 -2
  271. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ReferencePlugin-dbg.js +3 -2
  272. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ReferencePlugin-dbg.js.map +1 -1
  273. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ReferencePlugin.d.ts.map +1 -1
  274. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ReferencePlugin.js +1 -1
  275. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ReferencePlugin.js.map +1 -1
  276. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ReferencePlugin.ts +3 -2
  277. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin-dbg.js +2 -2
  278. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin-dbg.js.map +1 -1
  279. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin.js +1 -1
  280. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin.js.map +1 -1
  281. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin.ts +2 -2
  282. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin-dbg.js +2 -2
  283. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin-dbg.js.map +1 -1
  284. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin.js +1 -1
  285. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin.js.map +1 -1
  286. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin.ts +2 -2
  287. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin-dbg.js +1 -1
  288. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin-dbg.js.map +1 -1
  289. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin.js +1 -1
  290. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin.js.map +1 -1
  291. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin.ts +1 -1
  292. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StepInputPlugin-dbg.js +1 -1
  293. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StepInputPlugin-dbg.js.map +1 -1
  294. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StepInputPlugin.js +1 -1
  295. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StepInputPlugin.js.map +1 -1
  296. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StepInputPlugin.ts +2 -2
  297. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin-dbg.js +1 -1
  298. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin-dbg.js.map +1 -1
  299. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin.js +1 -1
  300. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin.js.map +1 -1
  301. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin.ts +1 -1
  302. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin-dbg.js +2 -2
  303. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin-dbg.js.map +1 -1
  304. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin.js +1 -1
  305. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin.js.map +1 -1
  306. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin.ts +2 -2
  307. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin-dbg.js +1 -1
  308. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin-dbg.js.map +1 -1
  309. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin.js +1 -1
  310. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin.js.map +1 -1
  311. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin.ts +1 -1
  312. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin-dbg.js +2 -2
  313. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin-dbg.js.map +1 -1
  314. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin.js +1 -1
  315. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin.js.map +1 -1
  316. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin.ts +2 -2
  317. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/LiveSearchPlugin-dbg.js.map +1 -1
  318. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/LiveSearchPlugin.d.ts.map +1 -1
  319. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/LiveSearchPlugin.js.map +1 -1
  320. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/LiveSearchPlugin.ts +109 -108
  321. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/ODataListBindingPlugin-dbg.js.map +1 -1
  322. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/ODataListBindingPlugin.d.ts.map +1 -1
  323. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/ODataListBindingPlugin.js.map +1 -1
  324. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/ODataListBindingPlugin.ts +64 -63
  325. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteDropdownPlugin-dbg.js +1 -1
  326. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteDropdownPlugin-dbg.js.map +1 -1
  327. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteDropdownPlugin.d.ts +1 -1
  328. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteDropdownPlugin.d.ts.map +1 -1
  329. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteDropdownPlugin.js.map +1 -1
  330. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteDropdownPlugin.ts +118 -117
  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.map +1 -1
  333. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteValueHelpPlugin.js.map +1 -1
  334. package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteValueHelpPlugin.ts +105 -104
  335. package/src/nz/co/siliconst/ui5/metaui/utils/Logger-dbg.js.map +1 -1
  336. package/src/nz/co/siliconst/ui5/metaui/utils/Logger.d.ts.map +1 -1
  337. package/src/nz/co/siliconst/ui5/metaui/utils/Logger.js.map +1 -1
  338. package/src/nz/co/siliconst/ui5/metaui/utils/Logger.ts +1 -1
@@ -15,15 +15,6 @@ declare module "nz/co/siliconst/ui5/metaui/controls/GeolocationControl" {
15
15
  apiVersion: number;
16
16
  render: (rm: RenderManager, control: BaseHardwareControl) => void;
17
17
  };
18
- static readonly metadata: {
19
- aggregations: {
20
- _content: {
21
- type: string;
22
- multiple: boolean;
23
- visibility: string;
24
- };
25
- };
26
- };
27
18
  /**
28
19
  * Initializes the control and builds the internal UI components.
29
20
  */
@@ -1 +1 @@
1
- {"version":3,"file":"GeolocationControl.d.ts","sourceRoot":"../../../../../../../..","sources":["src/nz/co/siliconst/ui5/metaui/controls/GeolocationControl.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,wDAAwD,CAAC;IACxE;;;;;OAKG;IACH,OAAO,mBAAmB,MAAM,yDAAyD,CAAC;IAE1F,OAAO,aAAa,MAAM,2BAA2B,CAAC;IAMtD,MAAM,CAAC,OAAO,OAAO,kBAAmB,SAAQ,mBAAmB;QAC/D,OAAO,CAAC,IAAI,CAAO;QACnB,OAAO,CAAC,WAAW,CAAS;QAC5B,OAAO,CAAC,WAAW,CAAQ;QAE3B,MAAM,CAAC,QAAQ,CAAC,QAAQ;;;UAA+B;QAEvD,MAAM,CAAC,QAAQ,CAAC,QAAQ;;;;;;;;UAItB;QAEF;;WAEG;QACI,IAAI,IAAI,IAAI;QAqBnB;;;WAGG;QACI,iBAAiB,IAAI,IAAI;QAgBhC,OAAO,CAAC,WAAW;KAwBtB;CAEA"}
1
+ {"version":3,"file":"GeolocationControl.d.ts","sourceRoot":"../../../../../../../..","sources":["src/nz/co/siliconst/ui5/metaui/controls/GeolocationControl.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,wDAAwD,CAAC;IACxE;;;;;OAKG;IACH,OAAO,mBAAmB,MAAM,yDAAyD,CAAC;IAE1F,OAAO,aAAa,MAAM,2BAA2B,CAAC;IAMtD,MAAM,CAAC,OAAO,OAAO,kBAAmB,SAAQ,mBAAmB;QAC/D,OAAO,CAAC,IAAI,CAAQ;QACpB,OAAO,CAAC,WAAW,CAAU;QAC7B,OAAO,CAAC,WAAW,CAAS;QAE5B,MAAM,CAAC,QAAQ,CAAC,QAAQ;;;UAA+B;QAEvD;;WAEG;QACI,IAAI,IAAI,IAAI;QAqBnB;;;WAGG;QACI,iBAAiB,IAAI,IAAI;QAgBhC,OAAO,CAAC,WAAW;KAwBtB;CAEA"}
@@ -1,2 +1,2 @@
1
- sap.ui.define(["./BaseHardwareControl","./BaseHardwareControlRenderer","sap/m/Button","sap/m/Input","sap/m/VBox","sap/m/MessageToast"],function(t,e,o,i,n,s){"use strict";function a(t){return t&&t.__esModule&&typeof t.default!=="undefined"?t.default:t}function r(t){return new Promise(function(e,o){sap.ui.require([t],function(o){if(!(o&&o.__esModule)){o=o===null||!(typeof o==="object"&&t.endsWith("/library"))?{default:o}:o;Object.defineProperty(o,"__esModule",{value:true})}e(o)},function(t){o(t)})})}const u=a(t);const l=a(e);class c extends u{static renderer=l;static metadata={aggregations:{_content:{type:"sap.m.VBox",multiple:false,visibility:"hidden"}}};init(){super.init();this.locationBtn=new o({icon:"sap-icon://map",text:"Get Location",press:this.getLocation.bind(this)});this.resultInput=new i({editable:false,visible:false});this.vBox=new n({items:[this.locationBtn,this.resultInput]});this.setAggregation("_content",this.vBox)}onBeforeRendering(){const t=this.getProperty("schemaMetadata");if(t&&t.ui&&t.ui.label){this.locationBtn.setText(t.ui.label)}const e=this.getProperty("readOnly");this.locationBtn.setEnabled(!e);const o=this.getProperty("value");if(o){this.resultInput.setValue(o);this.resultInput.setVisible(true)}}getLocation(){if(!navigator.geolocation){s.show("Geolocation is not supported by your browser");return}navigator.geolocation.getCurrentPosition(t=>{const e=`${t.coords.latitude}, ${t.coords.longitude}`;this.resultInput.setValue(e);this.resultInput.setVisible(true);this.setValueAndFire(e);s.show("Location acquired.")},t=>{r("../utils/Logger").then(({Logger:e})=>{e.error("[MetaUI] Geolocation failed or denied",t.message,"GeolocationControl")});s.show("Unable to retrieve your location")})}}return c});
1
+ sap.ui.define(["./BaseHardwareControl","./BaseHardwareControlRenderer","sap/m/Button","sap/m/Input","sap/m/VBox","sap/m/MessageToast"],function(t,e,o,i,n,s){"use strict";function r(t){return t&&t.__esModule&&typeof t.default!=="undefined"?t.default:t}function a(t){return new Promise(function(e,o){sap.ui.require([t],function(o){if(!(o&&o.__esModule)){o=o===null||!(typeof o==="object"&&t.endsWith("/library"))?{default:o}:o;Object.defineProperty(o,"__esModule",{value:true})}e(o)},function(t){o(t)})})}const u=r(t);const l=r(e);class c extends u{static renderer=l;init(){super.init();this.locationBtn=new o({icon:"sap-icon://map",text:"Get Location",press:this.getLocation.bind(this)});this.resultInput=new i({editable:false,visible:false});this.vBox=new n({items:[this.locationBtn,this.resultInput]});this.setAggregation("_content",this.vBox)}onBeforeRendering(){const t=this.getProperty("schemaMetadata");if(t&&t.ui&&t.ui.label){this.locationBtn.setText(t.ui.label)}const e=this.getProperty("readOnly");this.locationBtn.setEnabled(!e);const o=this.getProperty("value");if(o){this.resultInput.setValue(o);this.resultInput.setVisible(true)}}getLocation(){if(!navigator.geolocation){s.show("Geolocation is not supported by your browser");return}navigator.geolocation.getCurrentPosition(t=>{const e=`${t.coords.latitude}, ${t.coords.longitude}`;this.resultInput.setValue(e);this.resultInput.setVisible(true);this.setValueAndFire(e);s.show("Location acquired.")},t=>{a("../utils/Logger").then(({Logger:e})=>{e.error("[MetaUI] Geolocation failed or denied",t.message,"GeolocationControl")});s.show("Unable to retrieve your location")})}}return c});
2
2
  //# sourceMappingURL=GeolocationControl.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"GeolocationControl.js","names":["BaseHardwareControl","_interopRequireDefault","__BaseHardwareControl","BaseHardwareControlRenderer","__BaseHardwareControlRenderer","GeolocationControl","static","aggregations","_content","type","multiple","visibility","init","super","this","locationBtn","Button","icon","text","press","getLocation","bind","resultInput","Input","editable","visible","vBox","VBox","items","setAggregation","onBeforeRendering","metadata","getProperty","ui","label","setText","readOnly","setEnabled","currentVal","setValue","setVisible","navigator","geolocation","MessageToast","show","getCurrentPosition","position","locStr","coords","latitude","longitude","setValueAndFire","error","__ui5_require_async","then","Logger","message"],"sources":["GeolocationControl.ts"],"sourcesContent":["/**\n * @file GeolocationControl.ts\n * @description Native UI5 Control for GPS capture.\n * \n * @namespace nz.co.siliconst.ui5.metaui.controls\n */\nimport BaseHardwareControl from \"./BaseHardwareControl\";\nimport BaseHardwareControlRenderer from \"./BaseHardwareControlRenderer\";\nimport RenderManager from \"sap/ui/core/RenderManager\";\nimport Button from \"sap/m/Button\";\nimport Input from \"sap/m/Input\";\nimport VBox from \"sap/m/VBox\";\nimport MessageToast from \"sap/m/MessageToast\";\n\nexport default class GeolocationControl extends BaseHardwareControl {\n private vBox: VBox;\n private locationBtn: Button;\n private resultInput: Input;\n\n static readonly renderer = BaseHardwareControlRenderer;\n\n static readonly metadata = {\n aggregations: {\n _content: { type: \"sap.m.VBox\", multiple: false, visibility: \"hidden\" }\n }\n };\n\n /**\n * Initializes the control and builds the internal UI components.\n */\n public init(): void {\n super.init();\n\n this.locationBtn = new Button({\n icon: \"sap-icon://map\",\n text: \"Get Location\",\n press: this.getLocation.bind(this)\n });\n\n this.resultInput = new Input({\n editable: false,\n visible: false\n });\n\n this.vBox = new VBox({\n items: [this.locationBtn, this.resultInput]\n });\n\n this.setAggregation(\"_content\", this.vBox);\n }\n\n /**\n * Lifecycle hook called before the control is rendered to the DOM.\n * Updates button state and sets any existing values.\n */\n public onBeforeRendering(): void {\n const metadata = this.getProperty(\"schemaMetadata\");\n if (metadata && metadata.ui && metadata.ui.label) {\n this.locationBtn.setText(metadata.ui.label);\n }\n\n const readOnly = this.getProperty(\"readOnly\");\n this.locationBtn.setEnabled(!readOnly);\n\n const currentVal = this.getProperty(\"value\");\n if (currentVal) {\n this.resultInput.setValue(currentVal as string);\n this.resultInput.setVisible(true);\n }\n }\n\n private getLocation(): void {\n if (!navigator.geolocation) {\n MessageToast.show(\"Geolocation is not supported by your browser\");\n return;\n }\n\n navigator.geolocation.getCurrentPosition(\n (position) => {\n const locStr = `${position.coords.latitude}, ${position.coords.longitude}`;\n this.resultInput.setValue(locStr);\n this.resultInput.setVisible(true);\n this.setValueAndFire(locStr);\n MessageToast.show(\"Location acquired.\");\n },\n (error) => {\n import(\"../utils/Logger\").then(({ Logger }) => {\n Logger.error(\"[MetaUI] Geolocation failed or denied\", error.message, \"GeolocationControl\");\n });\n MessageToast.show(\"Unable to retrieve your location\");\n }\n );\n }\n\n\n}\n"],"mappings":"ufAAA,MAMOA,EAAmBC,EAAAC,GAAA,MACnBC,EAA2BF,EAAAG,GAOnB,MAAMC,UAA2BL,EAK5CM,gBAA2BH,EAE3BG,gBAA2B,CACvBC,aAAc,CACVC,SAAU,CAAEC,KAAM,aAAcC,SAAU,MAAOC,WAAY,YAO9DC,OACHC,MAAMD,OAENE,KAAKC,YAAc,IAAIC,EAAO,CAC1BC,KAAM,iBACNC,KAAM,eACNC,MAAOL,KAAKM,YAAYC,KAAKP,QAGjCA,KAAKQ,YAAc,IAAIC,EAAM,CACzBC,SAAU,MACVC,QAAS,QAGbX,KAAKY,KAAO,IAAIC,EAAK,CACjBC,MAAO,CAACd,KAAKC,YAAaD,KAAKQ,eAGnCR,KAAKe,eAAe,WAAYf,KAAKY,KACzC,CAMOI,oBACH,MAAMC,EAAWjB,KAAKkB,YAAY,kBAClC,GAAID,GAAYA,EAASE,IAAMF,EAASE,GAAGC,MAAO,CAC9CpB,KAAKC,YAAYoB,QAAQJ,EAASE,GAAGC,MACzC,CAEA,MAAME,EAAWtB,KAAKkB,YAAY,YAClClB,KAAKC,YAAYsB,YAAYD,GAE7B,MAAME,EAAaxB,KAAKkB,YAAY,SACpC,GAAIM,EAAY,CACZxB,KAAKQ,YAAYiB,SAASD,GAC1BxB,KAAKQ,YAAYkB,WAAW,KAChC,CACJ,CAEQpB,cACJ,IAAKqB,UAAUC,YAAa,CACxBC,EAAaC,KAAK,gDAClB,MACJ,CAEAH,UAAUC,YAAYG,mBACjBC,IACG,MAAMC,EAAS,GAAGD,EAASE,OAAOC,aAAaH,EAASE,OAAOE,YAC/DpC,KAAKQ,YAAYiB,SAASQ,GAC1BjC,KAAKQ,YAAYkB,WAAW,MAC5B1B,KAAKqC,gBAAgBJ,GACrBJ,EAAaC,KAAK,uBAErBQ,IACGC,EAAO,mBAAmBC,KAAK,EAAGC,aAC9BA,EAAOH,MAAM,wCAAyCA,EAAMI,QAAS,wBAEzEb,EAAaC,KAAK,qCAG9B,EAGH,OAAAvC,CAAA","ignoreList":[]}
1
+ {"version":3,"file":"GeolocationControl.js","names":["BaseHardwareControl","_interopRequireDefault","__BaseHardwareControl","BaseHardwareControlRenderer","__BaseHardwareControlRenderer","GeolocationControl","static","init","super","this","locationBtn","Button","icon","text","press","getLocation","bind","resultInput","Input","editable","visible","vBox","VBox","items","setAggregation","onBeforeRendering","metadata","getProperty","ui","label","setText","readOnly","setEnabled","currentVal","setValue","setVisible","navigator","geolocation","MessageToast","show","getCurrentPosition","position","locStr","coords","latitude","longitude","setValueAndFire","error","__ui5_require_async","then","Logger","message"],"sources":["GeolocationControl.ts"],"sourcesContent":["/**\n * @file GeolocationControl.ts\n * @description Native UI5 Control for GPS capture.\n * \n * @namespace nz.co.siliconst.ui5.metaui.controls\n */\nimport BaseHardwareControl from \"./BaseHardwareControl\";\nimport BaseHardwareControlRenderer from \"./BaseHardwareControlRenderer\";\nimport RenderManager from \"sap/ui/core/RenderManager\";\nimport Button from \"sap/m/Button\";\nimport Input from \"sap/m/Input\";\nimport VBox from \"sap/m/VBox\";\nimport MessageToast from \"sap/m/MessageToast\";\n\nexport default class GeolocationControl extends BaseHardwareControl {\n private vBox!: VBox;\n private locationBtn!: Button;\n private resultInput!: Input;\n\n static readonly renderer = BaseHardwareControlRenderer;\n\n /**\n * Initializes the control and builds the internal UI components.\n */\n public init(): void {\n super.init();\n\n this.locationBtn = new Button({\n icon: \"sap-icon://map\",\n text: \"Get Location\",\n press: this.getLocation.bind(this)\n });\n\n this.resultInput = new Input({\n editable: false,\n visible: false\n });\n\n this.vBox = new VBox({\n items: [this.locationBtn, this.resultInput]\n });\n\n this.setAggregation(\"_content\", this.vBox);\n }\n\n /**\n * Lifecycle hook called before the control is rendered to the DOM.\n * Updates button state and sets any existing values.\n */\n public onBeforeRendering(): void {\n const metadata = this.getProperty(\"schemaMetadata\");\n if (metadata && metadata.ui && metadata.ui.label) {\n this.locationBtn.setText(metadata.ui.label);\n }\n\n const readOnly = this.getProperty(\"readOnly\");\n this.locationBtn.setEnabled(!readOnly);\n\n const currentVal = this.getProperty(\"value\");\n if (currentVal) {\n this.resultInput.setValue(currentVal as string);\n this.resultInput.setVisible(true);\n }\n }\n\n private getLocation(): void {\n if (!navigator.geolocation) {\n MessageToast.show(\"Geolocation is not supported by your browser\");\n return;\n }\n\n navigator.geolocation.getCurrentPosition(\n (position) => {\n const locStr = `${position.coords.latitude}, ${position.coords.longitude}`;\n this.resultInput.setValue(locStr);\n this.resultInput.setVisible(true);\n this.setValueAndFire(locStr);\n MessageToast.show(\"Location acquired.\");\n },\n (error) => {\n import(\"../utils/Logger\").then(({ Logger }) => {\n Logger.error(\"[MetaUI] Geolocation failed or denied\", error.message, \"GeolocationControl\");\n });\n MessageToast.show(\"Unable to retrieve your location\");\n }\n );\n }\n\n\n}\n"],"mappings":"ufAAA,MAMOA,EAAmBC,EAAAC,GAAA,MACnBC,EAA2BF,EAAAG,GAOnB,MAAMC,UAA2BL,EAK5CM,gBAA2BH,EAKpBI,OACHC,MAAMD,OAENE,KAAKC,YAAc,IAAIC,EAAO,CAC1BC,KAAM,iBACNC,KAAM,eACNC,MAAOL,KAAKM,YAAYC,KAAKP,QAGjCA,KAAKQ,YAAc,IAAIC,EAAM,CACzBC,SAAU,MACVC,QAAS,QAGbX,KAAKY,KAAO,IAAIC,EAAK,CACjBC,MAAO,CAACd,KAAKC,YAAaD,KAAKQ,eAGnCR,KAAKe,eAAe,WAAYf,KAAKY,KACzC,CAMOI,oBACH,MAAMC,EAAWjB,KAAKkB,YAAY,kBAClC,GAAID,GAAYA,EAASE,IAAMF,EAASE,GAAGC,MAAO,CAC9CpB,KAAKC,YAAYoB,QAAQJ,EAASE,GAAGC,MACzC,CAEA,MAAME,EAAWtB,KAAKkB,YAAY,YAClClB,KAAKC,YAAYsB,YAAYD,GAE7B,MAAME,EAAaxB,KAAKkB,YAAY,SACpC,GAAIM,EAAY,CACZxB,KAAKQ,YAAYiB,SAASD,GAC1BxB,KAAKQ,YAAYkB,WAAW,KAChC,CACJ,CAEQpB,cACJ,IAAKqB,UAAUC,YAAa,CACxBC,EAAaC,KAAK,gDAClB,MACJ,CAEAH,UAAUC,YAAYG,mBACjBC,IACG,MAAMC,EAAS,GAAGD,EAASE,OAAOC,aAAaH,EAASE,OAAOE,YAC/DpC,KAAKQ,YAAYiB,SAASQ,GAC1BjC,KAAKQ,YAAYkB,WAAW,MAC5B1B,KAAKqC,gBAAgBJ,GACrBJ,EAAaC,KAAK,uBAErBQ,IACGC,EAAO,mBAAmBC,KAAK,EAAGC,aAC9BA,EAAOH,MAAM,wCAAyCA,EAAMI,QAAS,wBAEzEb,EAAaC,KAAK,qCAG9B,EAGH,OAAAlC,CAAA","ignoreList":[]}
@@ -13,18 +13,12 @@ import VBox from "sap/m/VBox";
13
13
  import MessageToast from "sap/m/MessageToast";
14
14
 
15
15
  export default class GeolocationControl extends BaseHardwareControl {
16
- private vBox: VBox;
17
- private locationBtn: Button;
18
- private resultInput: Input;
16
+ private vBox!: VBox;
17
+ private locationBtn!: Button;
18
+ private resultInput!: Input;
19
19
 
20
20
  static readonly renderer = BaseHardwareControlRenderer;
21
21
 
22
- static readonly metadata = {
23
- aggregations: {
24
- _content: { type: "sap.m.VBox", multiple: false, visibility: "hidden" }
25
- }
26
- };
27
-
28
22
  /**
29
23
  * Initializes the control and builds the internal UI components.
30
24
  */
@@ -13,17 +13,6 @@ sap.ui.define(["./BaseHardwareControl", "./BaseHardwareControlRenderer", "sap/m/
13
13
  * @namespace nz.co.siliconst.ui5.metaui.controls
14
14
  */
15
15
  const RichTextControl = BaseHardwareControl.extend("nz.co.siliconst.ui5.metaui.controls.RichTextControl", {
16
- metadata: {
17
- properties: {},
18
- events: {},
19
- aggregations: {
20
- _content: {
21
- type: "sap.m.VBox",
22
- multiple: false,
23
- visibility: "hidden"
24
- }
25
- }
26
- },
27
16
  renderer: BaseHardwareControlRenderer,
28
17
  init: function _init() {
29
18
  BaseHardwareControl.prototype.init.call(this);
@@ -1 +1 @@
1
- {"version":3,"file":"RichTextControl-dbg.js","names":["BaseHardwareControl","_interopRequireDefault","__BaseHardwareControl","BaseHardwareControlRenderer","__BaseHardwareControlRenderer","RichTextControl","extend","metadata","properties","events","aggregations","_content","type","multiple","visibility","renderer","init","_init","BaseHardwareControl.prototype.init.call","richTextEditor","RichTextEditor","width","height","showGroupFont","showGroupInsert","tooltip","change","oEvent","val","getParameter","setValueAndFire","vBox","VBox","items","setAggregation","onBeforeRendering","_onBeforeRendering","readOnly","getProperty","setEditable","currentVal","undefined","getValue","setValue","_setValue","setProperty"],"sources":["RichTextControl.ts"],"sourcesContent":["import BaseHardwareControl from \"./BaseHardwareControl\";\nimport BaseHardwareControlRenderer from \"./BaseHardwareControlRenderer\";\nimport RenderManager from \"sap/ui/core/RenderManager\";\nimport VBox from \"sap/m/VBox\";\nimport RichTextEditor from \"sap/ui/richtexteditor/RichTextEditor\";\n\n/**\n * @file RichTextControl.ts\n * @description Native UI5 Control for rich text input.\n * \n * @namespace nz.co.siliconst.ui5.metaui.controls\n */\nexport default class RichTextControl extends BaseHardwareControl {\n private vBox!: VBox;\n private richTextEditor!: RichTextEditor;\n\n static readonly renderer = BaseHardwareControlRenderer;\n\n static readonly metadata = {\n properties: {},\n events: {},\n aggregations: {\n _content: { type: \"sap.m.VBox\", multiple: false, visibility: \"hidden\" }\n }\n };\n\n public init(): void {\n super.init();\n\n this.richTextEditor = new RichTextEditor({\n width: \"100%\",\n height: \"300px\",\n showGroupFont: true,\n showGroupInsert: true,\n tooltip: \"Rich Text Editor\",\n change: (oEvent: sap.ui.base.Event) => {\n const val = oEvent.getParameter(\"newValue\");\n this.setValueAndFire(val);\n }\n });\n\n this.vBox = new VBox({\n items: [this.richTextEditor]\n });\n\n this.setAggregation(\"_content\", this.vBox);\n }\n\n public onBeforeRendering(): void {\n const readOnly = this.getProperty(\"readOnly\");\n this.richTextEditor.setEditable(!readOnly);\n\n const currentVal = this.getProperty(\"value\");\n if (currentVal !== undefined && currentVal !== null) {\n // Prevent recursive update if the value matches the editor's current value\n if (this.richTextEditor.getValue() !== currentVal) {\n this.richTextEditor.setValue(currentVal as string);\n }\n }\n }\n\n /**\n * Overrides the default property setter to prevent full DOM invalidation.\n * When dataJson pushes updates down to the UI5 models, UI5 typically destroys \n * and recreates the custom control if the property changes. \n * By suppressing re-rendering (true flag) and manually passing the value \n * to the inner RichTextEditor, we prevent TinyMCE from tearing down its iframe\n * and triggering expensive, redundant plugin boot sequences.\n *\n * @param {unknown} val The new string value to bind\n * @returns {this} The control instance for chaining\n */\n public setValue(val: unknown): this {\n this.setProperty(\"value\", val, true); // suppress re-rendering\n if (this.richTextEditor && val !== undefined && val !== null) {\n if (this.richTextEditor.getValue() !== val) {\n this.richTextEditor.setValue(val as string);\n }\n }\n return this;\n }\n}\n"],"mappings":";;;;;;QAAOA,mBAAmB,GAAAC,sBAAA,CAAAC,qBAAA;EAAA,MACnBC,2BAA2B,GAAAF,sBAAA,CAAAG,6BAAA;EAKlC;AACA;AACA;AACA;AACA;AACA;EALA,MAMqBC,eAAe,GAASL,mBAAmB,CAAAM,MAAA;IAM5CC,QAAQ,EAAG;MACvBC,UAAU,EAAE,CAAC,CAAC;MACdC,MAAM,EAAE,CAAC,CAAC;MACVC,YAAY,EAAE;QACVC,QAAQ,EAAE;UAAEC,IAAI,EAAE,YAAY;UAAEC,QAAQ,EAAE,KAAK;UAAEC,UAAU,EAAE;QAAS;MAC1E;IACJ,CAAC;IAReC,QAAQ,EAAGZ,2BAA2B;IAU/Ca,IAAI,WAAAC,MAAA,EAAS;MAChBC,uCAAA;MAEA,IAAI,CAACC,cAAc,GAAG,IAAIC,cAAc,CAAC;QACrCC,KAAK,EAAE,MAAM;QACbC,MAAM,EAAE,OAAO;QACfC,aAAa,EAAE,IAAI;QACnBC,eAAe,EAAE,IAAI;QACrBC,OAAO,EAAE,kBAAkB;QAC3BC,MAAM,EAAGC,MAAyB,IAAK;UACnC,MAAMC,GAAG,GAAGD,MAAM,CAACE,YAAY,CAAC,UAAU,CAAC;UAC3C,IAAI,CAACC,eAAe,CAACF,GAAG,CAAC;QAC7B;MACJ,CAAC,CAAC;MAEF,IAAI,CAACG,IAAI,GAAG,IAAIC,IAAI,CAAC;QACjBC,KAAK,EAAE,CAAC,IAAI,CAACd,cAAc;MAC/B,CAAC,CAAC;MAEF,IAAI,CAACe,cAAc,CAAC,UAAU,EAAE,IAAI,CAACH,IAAI,CAAC;IAC9C,CAAC;IAEMI,iBAAiB,WAAAC,mBAAA,EAAS;MAC7B,MAAMC,QAAQ,GAAG,IAAI,CAACC,WAAW,CAAC,UAAU,CAAC;MAC7C,IAAI,CAACnB,cAAc,CAACoB,WAAW,CAAC,CAACF,QAAQ,CAAC;MAE1C,MAAMG,UAAU,GAAG,IAAI,CAACF,WAAW,CAAC,OAAO,CAAC;MAC5C,IAAIE,UAAU,KAAKC,SAAS,IAAID,UAAU,KAAK,IAAI,EAAE;QACjD;QACA,IAAI,IAAI,CAACrB,cAAc,CAACuB,QAAQ,CAAC,CAAC,KAAKF,UAAU,EAAE;UAC/C,IAAI,CAACrB,cAAc,CAACwB,QAAQ,CAACH,UAAoB,CAAC;QACtD;MACJ;IACJ,CAAC;IAED;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACWG,QAAQ,WAAAC,UAAChB,GAAY,EAAQ;MAChC,IAAI,CAACiB,WAAW,CAAC,OAAO,EAAEjB,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;MACtC,IAAI,IAAI,CAACT,cAAc,IAAIS,GAAG,KAAKa,SAAS,IAAIb,GAAG,KAAK,IAAI,EAAE;QAC1D,IAAI,IAAI,CAACT,cAAc,CAACuB,QAAQ,CAAC,CAAC,KAAKd,GAAG,EAAE;UACxC,IAAI,CAACT,cAAc,CAACwB,QAAQ,CAACf,GAAa,CAAC;QAC/C;MACJ;MACA,OAAO,IAAI;IACf;EAAC;EAAA,OApEgBvB,eAAe;AAAA","ignoreList":[]}
1
+ {"version":3,"file":"RichTextControl-dbg.js","names":["BaseHardwareControl","_interopRequireDefault","__BaseHardwareControl","BaseHardwareControlRenderer","__BaseHardwareControlRenderer","RichTextControl","extend","renderer","init","_init","BaseHardwareControl.prototype.init.call","richTextEditor","RichTextEditor","width","height","showGroupFont","showGroupInsert","tooltip","change","oEvent","val","getParameter","setValueAndFire","vBox","VBox","items","setAggregation","onBeforeRendering","_onBeforeRendering","readOnly","getProperty","setEditable","currentVal","undefined","getValue","setValue","_setValue","setProperty"],"sources":["RichTextControl.ts"],"sourcesContent":["import BaseHardwareControl from \"./BaseHardwareControl\";\nimport BaseHardwareControlRenderer from \"./BaseHardwareControlRenderer\";\nimport RenderManager from \"sap/ui/core/RenderManager\";\nimport VBox from \"sap/m/VBox\";\nimport RichTextEditor from \"sap/ui/richtexteditor/RichTextEditor\";\n\nimport Event from \"sap/ui/base/Event\";\n/**\n * @file RichTextControl.ts\n * @description Native UI5 Control for rich text input.\n * \n * @namespace nz.co.siliconst.ui5.metaui.controls\n */\nexport default class RichTextControl extends BaseHardwareControl {\n private vBox!: VBox;\n private richTextEditor!: RichTextEditor;\n\n static readonly renderer = BaseHardwareControlRenderer;\n\n public init(): void {\n super.init();\n\n this.richTextEditor = new RichTextEditor({\n width: \"100%\",\n height: \"300px\",\n showGroupFont: true,\n showGroupInsert: true,\n tooltip: \"Rich Text Editor\",\n change: (oEvent: Event) => {\n const val = oEvent.getParameter(\"newValue\");\n this.setValueAndFire(val);\n }\n });\n\n this.vBox = new VBox({\n items: [this.richTextEditor]\n });\n\n this.setAggregation(\"_content\", this.vBox);\n }\n\n public onBeforeRendering(): void {\n const readOnly = this.getProperty(\"readOnly\");\n this.richTextEditor.setEditable(!readOnly);\n\n const currentVal = this.getProperty(\"value\");\n if (currentVal !== undefined && currentVal !== null) {\n // Prevent recursive update if the value matches the editor's current value\n if (this.richTextEditor.getValue() !== currentVal) {\n this.richTextEditor.setValue(currentVal as string);\n }\n }\n }\n\n /**\n * Overrides the default property setter to prevent full DOM invalidation.\n * When dataJson pushes updates down to the UI5 models, UI5 typically destroys \n * and recreates the custom control if the property changes. \n * By suppressing re-rendering (true flag) and manually passing the value \n * to the inner RichTextEditor, we prevent TinyMCE from tearing down its iframe\n * and triggering expensive, redundant plugin boot sequences.\n *\n * @param {unknown} val The new string value to bind\n * @returns {this} The control instance for chaining\n */\n public setValue(val: unknown): this {\n this.setProperty(\"value\", val, true); // suppress re-rendering\n if (this.richTextEditor && val !== undefined && val !== null) {\n if (this.richTextEditor.getValue() !== val) {\n this.richTextEditor.setValue(val as string);\n }\n }\n return this;\n }\n}\n"],"mappings":";;;;;;QAAOA,mBAAmB,GAAAC,sBAAA,CAAAC,qBAAA;EAAA,MACnBC,2BAA2B,GAAAF,sBAAA,CAAAG,6BAAA;EAMlC;AACA;AACA;AACA;AACA;AACA;EALA,MAMqBC,eAAe,GAASL,mBAAmB,CAAAM,MAAA;IAI5CC,QAAQ,EAAGJ,2BAA2B;IAE/CK,IAAI,WAAAC,MAAA,EAAS;MAChBC,uCAAA;MAEA,IAAI,CAACC,cAAc,GAAG,IAAIC,cAAc,CAAC;QACrCC,KAAK,EAAE,MAAM;QACbC,MAAM,EAAE,OAAO;QACfC,aAAa,EAAE,IAAI;QACnBC,eAAe,EAAE,IAAI;QACrBC,OAAO,EAAE,kBAAkB;QAC3BC,MAAM,EAAGC,MAAa,IAAK;UACvB,MAAMC,GAAG,GAAGD,MAAM,CAACE,YAAY,CAAC,UAAU,CAAC;UAC3C,IAAI,CAACC,eAAe,CAACF,GAAG,CAAC;QAC7B;MACJ,CAAC,CAAC;MAEF,IAAI,CAACG,IAAI,GAAG,IAAIC,IAAI,CAAC;QACjBC,KAAK,EAAE,CAAC,IAAI,CAACd,cAAc;MAC/B,CAAC,CAAC;MAEF,IAAI,CAACe,cAAc,CAAC,UAAU,EAAE,IAAI,CAACH,IAAI,CAAC;IAC9C,CAAC;IAEMI,iBAAiB,WAAAC,mBAAA,EAAS;MAC7B,MAAMC,QAAQ,GAAG,IAAI,CAACC,WAAW,CAAC,UAAU,CAAC;MAC7C,IAAI,CAACnB,cAAc,CAACoB,WAAW,CAAC,CAACF,QAAQ,CAAC;MAE1C,MAAMG,UAAU,GAAG,IAAI,CAACF,WAAW,CAAC,OAAO,CAAC;MAC5C,IAAIE,UAAU,KAAKC,SAAS,IAAID,UAAU,KAAK,IAAI,EAAE;QACjD;QACA,IAAI,IAAI,CAACrB,cAAc,CAACuB,QAAQ,CAAC,CAAC,KAAKF,UAAU,EAAE;UAC/C,IAAI,CAACrB,cAAc,CAACwB,QAAQ,CAACH,UAAoB,CAAC;QACtD;MACJ;IACJ,CAAC;IAED;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACWG,QAAQ,WAAAC,UAAChB,GAAY,EAAQ;MAChC,IAAI,CAACiB,WAAW,CAAC,OAAO,EAAEjB,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;MACtC,IAAI,IAAI,CAACT,cAAc,IAAIS,GAAG,KAAKa,SAAS,IAAIb,GAAG,KAAK,IAAI,EAAE;QAC1D,IAAI,IAAI,CAACT,cAAc,CAACuB,QAAQ,CAAC,CAAC,KAAKd,GAAG,EAAE;UACxC,IAAI,CAACT,cAAc,CAACwB,QAAQ,CAACf,GAAa,CAAC;QAC/C;MACJ;MACA,OAAO,IAAI;IACf;EAAC;EAAA,OA5DgBf,eAAe;AAAA","ignoreList":[]}
@@ -14,17 +14,6 @@ declare module "nz/co/siliconst/ui5/metaui/controls/RichTextControl" {
14
14
  apiVersion: number;
15
15
  render: (rm: RenderManager, control: BaseHardwareControl) => void;
16
16
  };
17
- static readonly metadata: {
18
- properties: {};
19
- events: {};
20
- aggregations: {
21
- _content: {
22
- type: string;
23
- multiple: boolean;
24
- visibility: string;
25
- };
26
- };
27
- };
28
17
  init(): void;
29
18
  onBeforeRendering(): void;
30
19
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"RichTextControl.d.ts","sourceRoot":"../../../../../../../..","sources":["src/nz/co/siliconst/ui5/metaui/controls/RichTextControl.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,qDAAqD,CAAC;IACrE,OAAO,mBAAmB,MAAM,yDAAyD,CAAC;IAE1F,OAAO,aAAa,MAAM,2BAA2B,CAAC;IAItD;;;;;OAKG;IACH,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,mBAAmB;QAC5D,OAAO,CAAC,IAAI,CAAQ;QACpB,OAAO,CAAC,cAAc,CAAkB;QAExC,MAAM,CAAC,QAAQ,CAAC,QAAQ;;;UAA+B;QAEvD,MAAM,CAAC,QAAQ,CAAC,QAAQ;;;;;;;;;;UAMtB;QAEK,IAAI,IAAI,IAAI;QAsBZ,iBAAiB,IAAI,IAAI;QAahC;;;;;;;;;;WAUG;QACI,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI;KAStC;CAEA"}
1
+ {"version":3,"file":"RichTextControl.d.ts","sourceRoot":"../../../../../../../..","sources":["src/nz/co/siliconst/ui5/metaui/controls/RichTextControl.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,qDAAqD,CAAC;IACrE,OAAO,mBAAmB,MAAM,yDAAyD,CAAC;IAE1F,OAAO,aAAa,MAAM,2BAA2B,CAAC;IAKtD;;;;;OAKG;IACH,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,mBAAmB;QAC5D,OAAO,CAAC,IAAI,CAAQ;QACpB,OAAO,CAAC,cAAc,CAAkB;QAExC,MAAM,CAAC,QAAQ,CAAC,QAAQ;;;UAA+B;QAEhD,IAAI,IAAI,IAAI;QAsBZ,iBAAiB,IAAI,IAAI;QAahC;;;;;;;;;;WAUG;QACI,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI;KAStC;CAEA"}
@@ -1,2 +1,2 @@
1
- sap.ui.define(["./BaseHardwareControl","./BaseHardwareControlRenderer","sap/m/VBox","sap/ui/richtexteditor/RichTextEditor"],function(t,e,i,r){"use strict";function n(t){return t&&t.__esModule&&typeof t.default!=="undefined"?t.default:t}const o=n(t);const s=n(e);const h=o.extend("nz.co.siliconst.ui5.metaui.controls.RichTextControl",{metadata:{properties:{},events:{},aggregations:{_content:{type:"sap.m.VBox",multiple:false,visibility:"hidden"}}},renderer:s,init:function t(){o.prototype.init.call(this);this.richTextEditor=new r({width:"100%",height:"300px",showGroupFont:true,showGroupInsert:true,tooltip:"Rich Text Editor",change:t=>{const e=t.getParameter("newValue");this.setValueAndFire(e)}});this.vBox=new i({items:[this.richTextEditor]});this.setAggregation("_content",this.vBox)},onBeforeRendering:function t(){const e=this.getProperty("readOnly");this.richTextEditor.setEditable(!e);const i=this.getProperty("value");if(i!==undefined&&i!==null){if(this.richTextEditor.getValue()!==i){this.richTextEditor.setValue(i)}}},setValue:function t(e){this.setProperty("value",e,true);if(this.richTextEditor&&e!==undefined&&e!==null){if(this.richTextEditor.getValue()!==e){this.richTextEditor.setValue(e)}}return this}});return h});
1
+ sap.ui.define(["./BaseHardwareControl","./BaseHardwareControlRenderer","sap/m/VBox","sap/ui/richtexteditor/RichTextEditor"],function(t,e,i,r){"use strict";function n(t){return t&&t.__esModule&&typeof t.default!=="undefined"?t.default:t}const o=n(t);const s=n(e);const h=o.extend("nz.co.siliconst.ui5.metaui.controls.RichTextControl",{renderer:s,init:function t(){o.prototype.init.call(this);this.richTextEditor=new r({width:"100%",height:"300px",showGroupFont:true,showGroupInsert:true,tooltip:"Rich Text Editor",change:t=>{const e=t.getParameter("newValue");this.setValueAndFire(e)}});this.vBox=new i({items:[this.richTextEditor]});this.setAggregation("_content",this.vBox)},onBeforeRendering:function t(){const e=this.getProperty("readOnly");this.richTextEditor.setEditable(!e);const i=this.getProperty("value");if(i!==undefined&&i!==null){if(this.richTextEditor.getValue()!==i){this.richTextEditor.setValue(i)}}},setValue:function t(e){this.setProperty("value",e,true);if(this.richTextEditor&&e!==undefined&&e!==null){if(this.richTextEditor.getValue()!==e){this.richTextEditor.setValue(e)}}return this}});return h});
2
2
  //# sourceMappingURL=RichTextControl.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RichTextControl.js","names":["BaseHardwareControl","_interopRequireDefault","__BaseHardwareControl","BaseHardwareControlRenderer","__BaseHardwareControlRenderer","RichTextControl","extend","metadata","properties","events","aggregations","_content","type","multiple","visibility","renderer","init","_init","BaseHardwareControl.prototype.init.call","this","richTextEditor","RichTextEditor","width","height","showGroupFont","showGroupInsert","tooltip","change","oEvent","val","getParameter","setValueAndFire","vBox","VBox","items","setAggregation","onBeforeRendering","_onBeforeRendering","readOnly","getProperty","setEditable","currentVal","undefined","getValue","setValue","_setValue","setProperty"],"sources":["RichTextControl.ts"],"sourcesContent":["import BaseHardwareControl from \"./BaseHardwareControl\";\nimport BaseHardwareControlRenderer from \"./BaseHardwareControlRenderer\";\nimport RenderManager from \"sap/ui/core/RenderManager\";\nimport VBox from \"sap/m/VBox\";\nimport RichTextEditor from \"sap/ui/richtexteditor/RichTextEditor\";\n\n/**\n * @file RichTextControl.ts\n * @description Native UI5 Control for rich text input.\n * \n * @namespace nz.co.siliconst.ui5.metaui.controls\n */\nexport default class RichTextControl extends BaseHardwareControl {\n private vBox!: VBox;\n private richTextEditor!: RichTextEditor;\n\n static readonly renderer = BaseHardwareControlRenderer;\n\n static readonly metadata = {\n properties: {},\n events: {},\n aggregations: {\n _content: { type: \"sap.m.VBox\", multiple: false, visibility: \"hidden\" }\n }\n };\n\n public init(): void {\n super.init();\n\n this.richTextEditor = new RichTextEditor({\n width: \"100%\",\n height: \"300px\",\n showGroupFont: true,\n showGroupInsert: true,\n tooltip: \"Rich Text Editor\",\n change: (oEvent: sap.ui.base.Event) => {\n const val = oEvent.getParameter(\"newValue\");\n this.setValueAndFire(val);\n }\n });\n\n this.vBox = new VBox({\n items: [this.richTextEditor]\n });\n\n this.setAggregation(\"_content\", this.vBox);\n }\n\n public onBeforeRendering(): void {\n const readOnly = this.getProperty(\"readOnly\");\n this.richTextEditor.setEditable(!readOnly);\n\n const currentVal = this.getProperty(\"value\");\n if (currentVal !== undefined && currentVal !== null) {\n // Prevent recursive update if the value matches the editor's current value\n if (this.richTextEditor.getValue() !== currentVal) {\n this.richTextEditor.setValue(currentVal as string);\n }\n }\n }\n\n /**\n * Overrides the default property setter to prevent full DOM invalidation.\n * When dataJson pushes updates down to the UI5 models, UI5 typically destroys \n * and recreates the custom control if the property changes. \n * By suppressing re-rendering (true flag) and manually passing the value \n * to the inner RichTextEditor, we prevent TinyMCE from tearing down its iframe\n * and triggering expensive, redundant plugin boot sequences.\n *\n * @param {unknown} val The new string value to bind\n * @returns {this} The control instance for chaining\n */\n public setValue(val: unknown): this {\n this.setProperty(\"value\", val, true); // suppress re-rendering\n if (this.richTextEditor && val !== undefined && val !== null) {\n if (this.richTextEditor.getValue() !== val) {\n this.richTextEditor.setValue(val as string);\n }\n }\n return this;\n }\n}\n"],"mappings":"kPAAOA,EAAmBC,EAAAC,GAAA,MACnBC,EAA2BF,EAAAG,GAKlC,MAMqBC,EAAwBL,EAAmBM,OAAA,uDAM5CC,SAAW,CACvBC,WAAY,CAAC,EACbC,OAAQ,CAAC,EACTC,aAAc,CACVC,SAAU,CAAEC,KAAM,aAAcC,SAAU,MAAOC,WAAY,YANrDC,SAAWZ,EAUpBa,KAAI,SAAAC,IACPC,sBAAAC,MAEAA,KAAKC,eAAiB,IAAIC,EAAe,CACrCC,MAAO,OACPC,OAAQ,QACRC,cAAe,KACfC,gBAAiB,KACjBC,QAAS,mBACTC,OAASC,IACL,MAAMC,EAAMD,EAAOE,aAAa,YAChCX,KAAKY,gBAAgBF,MAI7BV,KAAKa,KAAO,IAAIC,EAAK,CACjBC,MAAO,CAACf,KAAKC,kBAGjBD,KAAKgB,eAAe,WAAYhB,KAAKa,KACzC,EAEOI,kBAAiB,SAAAC,IACpB,MAAMC,EAAWnB,KAAKoB,YAAY,YAClCpB,KAAKC,eAAeoB,aAAaF,GAEjC,MAAMG,EAAatB,KAAKoB,YAAY,SACpC,GAAIE,IAAeC,WAAaD,IAAe,KAAM,CAEjD,GAAItB,KAAKC,eAAeuB,aAAeF,EAAY,CAC/CtB,KAAKC,eAAewB,SAASH,EACjC,CACJ,CACJ,EAaOG,SAAQ,SAAAC,EAAChB,GACZV,KAAK2B,YAAY,QAASjB,EAAK,MAC/B,GAAIV,KAAKC,gBAAkBS,IAAQa,WAAab,IAAQ,KAAM,CAC1D,GAAIV,KAAKC,eAAeuB,aAAed,EAAK,CACxCV,KAAKC,eAAewB,SAASf,EACjC,CACJ,CACA,OAAOV,IACX,IAAC,OApEgBd,CAAe","ignoreList":[]}
1
+ {"version":3,"file":"RichTextControl.js","names":["BaseHardwareControl","_interopRequireDefault","__BaseHardwareControl","BaseHardwareControlRenderer","__BaseHardwareControlRenderer","RichTextControl","extend","renderer","init","_init","BaseHardwareControl.prototype.init.call","this","richTextEditor","RichTextEditor","width","height","showGroupFont","showGroupInsert","tooltip","change","oEvent","val","getParameter","setValueAndFire","vBox","VBox","items","setAggregation","onBeforeRendering","_onBeforeRendering","readOnly","getProperty","setEditable","currentVal","undefined","getValue","setValue","_setValue","setProperty"],"sources":["RichTextControl.ts"],"sourcesContent":["import BaseHardwareControl from \"./BaseHardwareControl\";\nimport BaseHardwareControlRenderer from \"./BaseHardwareControlRenderer\";\nimport RenderManager from \"sap/ui/core/RenderManager\";\nimport VBox from \"sap/m/VBox\";\nimport RichTextEditor from \"sap/ui/richtexteditor/RichTextEditor\";\n\nimport Event from \"sap/ui/base/Event\";\n/**\n * @file RichTextControl.ts\n * @description Native UI5 Control for rich text input.\n * \n * @namespace nz.co.siliconst.ui5.metaui.controls\n */\nexport default class RichTextControl extends BaseHardwareControl {\n private vBox!: VBox;\n private richTextEditor!: RichTextEditor;\n\n static readonly renderer = BaseHardwareControlRenderer;\n\n public init(): void {\n super.init();\n\n this.richTextEditor = new RichTextEditor({\n width: \"100%\",\n height: \"300px\",\n showGroupFont: true,\n showGroupInsert: true,\n tooltip: \"Rich Text Editor\",\n change: (oEvent: Event) => {\n const val = oEvent.getParameter(\"newValue\");\n this.setValueAndFire(val);\n }\n });\n\n this.vBox = new VBox({\n items: [this.richTextEditor]\n });\n\n this.setAggregation(\"_content\", this.vBox);\n }\n\n public onBeforeRendering(): void {\n const readOnly = this.getProperty(\"readOnly\");\n this.richTextEditor.setEditable(!readOnly);\n\n const currentVal = this.getProperty(\"value\");\n if (currentVal !== undefined && currentVal !== null) {\n // Prevent recursive update if the value matches the editor's current value\n if (this.richTextEditor.getValue() !== currentVal) {\n this.richTextEditor.setValue(currentVal as string);\n }\n }\n }\n\n /**\n * Overrides the default property setter to prevent full DOM invalidation.\n * When dataJson pushes updates down to the UI5 models, UI5 typically destroys \n * and recreates the custom control if the property changes. \n * By suppressing re-rendering (true flag) and manually passing the value \n * to the inner RichTextEditor, we prevent TinyMCE from tearing down its iframe\n * and triggering expensive, redundant plugin boot sequences.\n *\n * @param {unknown} val The new string value to bind\n * @returns {this} The control instance for chaining\n */\n public setValue(val: unknown): this {\n this.setProperty(\"value\", val, true); // suppress re-rendering\n if (this.richTextEditor && val !== undefined && val !== null) {\n if (this.richTextEditor.getValue() !== val) {\n this.richTextEditor.setValue(val as string);\n }\n }\n return this;\n }\n}\n"],"mappings":"kPAAOA,EAAmBC,EAAAC,GAAA,MACnBC,EAA2BF,EAAAG,GAMlC,MAMqBC,EAAwBL,EAAmBM,OAAA,uDAI5CC,SAAWJ,EAEpBK,KAAI,SAAAC,IACPC,sBAAAC,MAEAA,KAAKC,eAAiB,IAAIC,EAAe,CACrCC,MAAO,OACPC,OAAQ,QACRC,cAAe,KACfC,gBAAiB,KACjBC,QAAS,mBACTC,OAASC,IACL,MAAMC,EAAMD,EAAOE,aAAa,YAChCX,KAAKY,gBAAgBF,MAI7BV,KAAKa,KAAO,IAAIC,EAAK,CACjBC,MAAO,CAACf,KAAKC,kBAGjBD,KAAKgB,eAAe,WAAYhB,KAAKa,KACzC,EAEOI,kBAAiB,SAAAC,IACpB,MAAMC,EAAWnB,KAAKoB,YAAY,YAClCpB,KAAKC,eAAeoB,aAAaF,GAEjC,MAAMG,EAAatB,KAAKoB,YAAY,SACpC,GAAIE,IAAeC,WAAaD,IAAe,KAAM,CAEjD,GAAItB,KAAKC,eAAeuB,aAAeF,EAAY,CAC/CtB,KAAKC,eAAewB,SAASH,EACjC,CACJ,CACJ,EAaOG,SAAQ,SAAAC,EAAChB,GACZV,KAAK2B,YAAY,QAASjB,EAAK,MAC/B,GAAIV,KAAKC,gBAAkBS,IAAQa,WAAab,IAAQ,KAAM,CAC1D,GAAIV,KAAKC,eAAeuB,aAAed,EAAK,CACxCV,KAAKC,eAAewB,SAASf,EACjC,CACJ,CACA,OAAOV,IACX,IAAC,OA5DgBN,CAAe","ignoreList":[]}
@@ -4,6 +4,7 @@ import RenderManager from "sap/ui/core/RenderManager";
4
4
  import VBox from "sap/m/VBox";
5
5
  import RichTextEditor from "sap/ui/richtexteditor/RichTextEditor";
6
6
 
7
+ import Event from "sap/ui/base/Event";
7
8
  /**
8
9
  * @file RichTextControl.ts
9
10
  * @description Native UI5 Control for rich text input.
@@ -16,14 +17,6 @@ export default class RichTextControl extends BaseHardwareControl {
16
17
 
17
18
  static readonly renderer = BaseHardwareControlRenderer;
18
19
 
19
- static readonly metadata = {
20
- properties: {},
21
- events: {},
22
- aggregations: {
23
- _content: { type: "sap.m.VBox", multiple: false, visibility: "hidden" }
24
- }
25
- };
26
-
27
20
  public init(): void {
28
21
  super.init();
29
22
 
@@ -33,7 +26,7 @@ export default class RichTextControl extends BaseHardwareControl {
33
26
  showGroupFont: true,
34
27
  showGroupInsert: true,
35
28
  tooltip: "Rich Text Editor",
36
- change: (oEvent: sap.ui.base.Event) => {
29
+ change: (oEvent: Event) => {
37
30
  const val = oEvent.getParameter("newValue");
38
31
  this.setValueAndFire(val);
39
32
  }
@@ -10,11 +10,6 @@ sap.ui.define(["./BaseHardwareControl", "sap/m/Button", "sap/m/VBox", "sap/ui/co
10
10
  * Provides an HTML5 Canvas for capturing signatures.
11
11
  */
12
12
  class SignatureControl extends BaseHardwareControl {
13
- static renderer = "nz.co.siliconst.ui5.metaui.controls.BaseHardwareControlRenderer";
14
- static metadata = {
15
- properties: {},
16
- events: {}
17
- };
18
13
  isDrawing = false;
19
14
  canvasCtx = null;
20
15
  canvasEl = null;
@@ -69,7 +64,7 @@ sap.ui.define(["./BaseHardwareControl", "sap/m/Button", "sap/m/VBox", "sap/ui/co
69
64
  this.canvasEl.addEventListener("touchend", this.boundStopDrawing);
70
65
 
71
66
  // Restore existing signature if any
72
- const val = this.getValue();
67
+ const val = this.getProperty("value");
73
68
  if (val && typeof val === "string" && val.startsWith("data:image")) {
74
69
  this.loadImageOntoCanvas(val);
75
70
  }
@@ -156,7 +151,7 @@ sap.ui.define(["./BaseHardwareControl", "sap/m/Button", "sap/m/VBox", "sap/ui/co
156
151
  * @param value The base64 data URL string representing the signature image.
157
152
  */
158
153
  setValue(value) {
159
- super.setValue(value);
154
+ super.setProperty("value", value);
160
155
  if (value && typeof value === "string" && value.startsWith("data:image")) {
161
156
  this.loadImageOntoCanvas(value);
162
157
  } else if (!value && this.canvasCtx && this.canvasEl) {
@@ -1 +1 @@
1
- {"version":3,"file":"SignatureControl-dbg.js","names":["BaseHardwareControl","_interopRequireDefault","__BaseHardwareControl","SignatureControl","renderer","metadata","properties","events","isDrawing","canvasCtx","canvasEl","init","canvasHtml","HTML","content","afterRendering","onCanvasRendered","bind","addStyleClass","clearBtn","Button","icon","text","press","clearSignature","vBox","VBox","items","setAggregation","boundStartDrawing","startDrawing","boundDraw","draw","boundStopDrawing","stopDrawing","boundStartDrawingTouch","startDrawingTouch","boundDrawTouch","drawTouch","domRef","getDomRef","getContext","lineWidth","lineCap","strokeStyle","addEventListener","passive","val","getValue","startsWith","loadImageOntoCanvas","dataUrl","img","window","Image","onload","clearRect","width","height","drawImage","src","getCoordinates","e","x","y","rect","getBoundingClientRect","clientX","clientY","type","touches","left","top","preventDefault","pos","lineTo","stroke","beginPath","moveTo","saveSignature","setValueAndFire","MessageToast","show","toDataURL","setValue","value","exit","removeEventListener"],"sources":["SignatureControl.ts"],"sourcesContent":["import BaseHardwareControl from \"./BaseHardwareControl\";\nimport Button from \"sap/m/Button\";\nimport VBox from \"sap/m/VBox\";\nimport HTML from \"sap/ui/core/HTML\";\nimport MessageToast from \"sap/m/MessageToast\";\n\n/**\n * SignatureControl\n * Provides an HTML5 Canvas for capturing signatures.\n */\nexport default class SignatureControl extends BaseHardwareControl {\n static readonly renderer = \"nz.co.siliconst.ui5.metaui.controls.BaseHardwareControlRenderer\";\n static readonly metadata = {\n properties: {},\n events: {}\n };\n\n private vBox!: VBox;\n private clearBtn!: Button;\n private canvasHtml!: HTML;\n private isDrawing = false;\n private canvasCtx: CanvasRenderingContext2D | null = null;\n private canvasEl: HTMLCanvasElement | null = null;\n\n private boundStartDrawing!: (e: MouseEvent) => void;\n private boundDraw!: (e: MouseEvent) => void;\n private boundStopDrawing!: (e: MouseEvent | TouchEvent) => void;\n private boundStartDrawingTouch!: (e: TouchEvent) => void;\n private boundDrawTouch!: (e: TouchEvent) => void;\n\n /**\n * Initializes the control and builds the canvas drawing surface.\n */\n public init(): void {\n super.init();\n\n this.canvasHtml = new HTML({\n content: \"<canvas width='400' height='200' style='border: 1px solid #ccc; background-color: #fff; touch-action: none; cursor: crosshair;'></canvas>\",\n afterRendering: this.onCanvasRendered.bind(this)\n }).addStyleClass(\"sapUiSmallMarginBottom\");\n\n this.clearBtn = new Button({\n icon: \"sap-icon://sys-cancel\",\n text: \"Clear Signature\",\n press: this.clearSignature.bind(this)\n });\n\n this.vBox = new VBox({\n items: [this.canvasHtml, this.clearBtn]\n });\n\n this.setAggregation(\"_content\", this.vBox);\n\n this.boundStartDrawing = this.startDrawing.bind(this);\n this.boundDraw = this.draw.bind(this);\n this.boundStopDrawing = this.stopDrawing.bind(this);\n this.boundStartDrawingTouch = this.startDrawingTouch.bind(this);\n this.boundDrawTouch = this.drawTouch.bind(this);\n }\n\n private onCanvasRendered(): void {\n const domRef = this.canvasHtml.getDomRef() as HTMLElement;\n if (!domRef) return;\n \n this.canvasEl = domRef as HTMLCanvasElement;\n this.canvasCtx = this.canvasEl.getContext(\"2d\");\n if (this.canvasCtx) {\n this.canvasCtx.lineWidth = 2;\n this.canvasCtx.lineCap = \"round\";\n this.canvasCtx.strokeStyle = \"#000\";\n }\n\n // Mouse events\n this.canvasEl.addEventListener(\"mousedown\", this.boundStartDrawing);\n this.canvasEl.addEventListener(\"mousemove\", this.boundDraw);\n this.canvasEl.addEventListener(\"mouseup\", this.boundStopDrawing);\n this.canvasEl.addEventListener(\"mouseout\", this.boundStopDrawing);\n \n // Touch events\n this.canvasEl.addEventListener(\"touchstart\", this.boundStartDrawingTouch, { passive: false });\n this.canvasEl.addEventListener(\"touchmove\", this.boundDrawTouch, { passive: false });\n this.canvasEl.addEventListener(\"touchend\", this.boundStopDrawing);\n\n // Restore existing signature if any\n const val = this.getValue();\n if (val && typeof val === \"string\" && val.startsWith(\"data:image\")) {\n this.loadImageOntoCanvas(val);\n }\n }\n\n private loadImageOntoCanvas(dataUrl: string): void {\n const img = new window.Image();\n img.onload = () => {\n if (this.canvasCtx && this.canvasEl) {\n this.canvasCtx.clearRect(0, 0, this.canvasEl.width, this.canvasEl.height);\n this.canvasCtx.drawImage(img, 0, 0, this.canvasEl.width, this.canvasEl.height);\n }\n };\n img.src = dataUrl;\n }\n\n private getCoordinates(e: MouseEvent | TouchEvent): { x: number, y: number } {\n if (!this.canvasEl) return { x: 0, y: 0 };\n const rect = this.canvasEl.getBoundingClientRect();\n \n let clientX, clientY;\n if (e.type.startsWith(\"touch\")) {\n clientX = (e as TouchEvent).touches[0].clientX;\n clientY = (e as TouchEvent).touches[0].clientY;\n } else {\n clientX = (e as MouseEvent).clientX;\n clientY = (e as MouseEvent).clientY;\n }\n \n return {\n x: clientX - rect.left,\n y: clientY - rect.top\n };\n }\n\n private startDrawing(e: MouseEvent): void {\n this.isDrawing = true;\n this.draw(e);\n }\n\n private startDrawingTouch(e: TouchEvent): void {\n e.preventDefault(); // Prevent scrolling\n this.isDrawing = true;\n this.drawTouch(e);\n }\n\n private draw(e: MouseEvent): void {\n if (!this.isDrawing || !this.canvasCtx) return;\n const pos = this.getCoordinates(e);\n this.canvasCtx.lineTo(pos.x, pos.y);\n this.canvasCtx.stroke();\n this.canvasCtx.beginPath();\n this.canvasCtx.moveTo(pos.x, pos.y);\n }\n\n private drawTouch(e: TouchEvent): void {\n if (!this.isDrawing || !this.canvasCtx) return;\n e.preventDefault(); // Prevent scrolling\n const pos = this.getCoordinates(e);\n this.canvasCtx.lineTo(pos.x, pos.y);\n this.canvasCtx.stroke();\n this.canvasCtx.beginPath();\n this.canvasCtx.moveTo(pos.x, pos.y);\n }\n\n private stopDrawing(): void {\n if (!this.isDrawing) return;\n this.isDrawing = false;\n if (this.canvasCtx) {\n this.canvasCtx.beginPath(); // Reset path\n this.saveSignature();\n }\n }\n\n private clearSignature(): void {\n if (this.canvasCtx && this.canvasEl) {\n this.canvasCtx.clearRect(0, 0, this.canvasEl.width, this.canvasEl.height);\n }\n this.setValueAndFire(null);\n MessageToast.show(\"Signature cleared.\");\n }\n\n private saveSignature(): void {\n if (this.canvasEl) {\n const dataUrl = this.canvasEl.toDataURL(\"image/png\");\n this.setValueAndFire(dataUrl);\n }\n }\n\n /**\n * Sets the value of the control programmatically and re-draws the canvas.\n * @param value The base64 data URL string representing the signature image.\n */\n public setValue(value: unknown): this {\n super.setValue(value);\n if (value && typeof value === \"string\" && value.startsWith(\"data:image\")) {\n this.loadImageOntoCanvas(value);\n } else if (!value && this.canvasCtx && this.canvasEl) {\n this.canvasCtx.clearRect(0, 0, this.canvasEl.width, this.canvasEl.height);\n }\n return this;\n }\n\n /**\n * Cleans up event listeners to prevent memory leaks when the control is destroyed.\n */\n public exit(): void {\n if (this.canvasEl) {\n this.canvasEl.removeEventListener(\"mousedown\", this.boundStartDrawing as EventListener);\n this.canvasEl.removeEventListener(\"mousemove\", this.boundDraw as EventListener);\n this.canvasEl.removeEventListener(\"mouseup\", this.boundStopDrawing as EventListener);\n this.canvasEl.removeEventListener(\"mouseout\", this.boundStopDrawing as EventListener);\n \n this.canvasEl.removeEventListener(\"touchstart\", this.boundStartDrawingTouch as EventListener);\n this.canvasEl.removeEventListener(\"touchmove\", this.boundDrawTouch as EventListener);\n this.canvasEl.removeEventListener(\"touchend\", this.boundStopDrawing as EventListener);\n }\n this.canvasEl = null;\n this.canvasCtx = null;\n super.exit();\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"SignatureControl-dbg.js","names":["BaseHardwareControl","_interopRequireDefault","__BaseHardwareControl","SignatureControl","isDrawing","canvasCtx","canvasEl","init","canvasHtml","HTML","content","afterRendering","onCanvasRendered","bind","addStyleClass","clearBtn","Button","icon","text","press","clearSignature","vBox","VBox","items","setAggregation","boundStartDrawing","startDrawing","boundDraw","draw","boundStopDrawing","stopDrawing","boundStartDrawingTouch","startDrawingTouch","boundDrawTouch","drawTouch","domRef","getDomRef","getContext","lineWidth","lineCap","strokeStyle","addEventListener","passive","val","getProperty","startsWith","loadImageOntoCanvas","dataUrl","img","window","Image","onload","clearRect","width","height","drawImage","src","getCoordinates","e","x","y","rect","getBoundingClientRect","clientX","clientY","type","touches","left","top","preventDefault","pos","lineTo","stroke","beginPath","moveTo","saveSignature","setValueAndFire","MessageToast","show","toDataURL","setValue","value","setProperty","exit","removeEventListener"],"sources":["SignatureControl.ts"],"sourcesContent":["import BaseHardwareControl from \"./BaseHardwareControl\";\nimport Button from \"sap/m/Button\";\nimport VBox from \"sap/m/VBox\";\nimport HTML from \"sap/ui/core/HTML\";\nimport MessageToast from \"sap/m/MessageToast\";\n\n/**\n * SignatureControl\n * Provides an HTML5 Canvas for capturing signatures.\n */\nexport default class SignatureControl extends BaseHardwareControl {\n\n\n private vBox!: VBox;\n private clearBtn!: Button;\n private canvasHtml!: HTML;\n private isDrawing = false;\n private canvasCtx: CanvasRenderingContext2D | null = null;\n private canvasEl: HTMLCanvasElement | null = null;\n\n private boundStartDrawing!: (e: MouseEvent) => void;\n private boundDraw!: (e: MouseEvent) => void;\n private boundStopDrawing!: (e: MouseEvent | TouchEvent) => void;\n private boundStartDrawingTouch!: (e: TouchEvent) => void;\n private boundDrawTouch!: (e: TouchEvent) => void;\n\n /**\n * Initializes the control and builds the canvas drawing surface.\n */\n public init(): void {\n super.init();\n\n this.canvasHtml = new HTML({\n content: \"<canvas width='400' height='200' style='border: 1px solid #ccc; background-color: #fff; touch-action: none; cursor: crosshair;'></canvas>\",\n afterRendering: this.onCanvasRendered.bind(this)\n }).addStyleClass(\"sapUiSmallMarginBottom\");\n\n this.clearBtn = new Button({\n icon: \"sap-icon://sys-cancel\",\n text: \"Clear Signature\",\n press: this.clearSignature.bind(this)\n });\n\n this.vBox = new VBox({\n items: [this.canvasHtml, this.clearBtn]\n });\n\n this.setAggregation(\"_content\", this.vBox);\n\n this.boundStartDrawing = this.startDrawing.bind(this);\n this.boundDraw = this.draw.bind(this);\n this.boundStopDrawing = this.stopDrawing.bind(this);\n this.boundStartDrawingTouch = this.startDrawingTouch.bind(this);\n this.boundDrawTouch = this.drawTouch.bind(this);\n }\n\n private onCanvasRendered(): void {\n const domRef = this.canvasHtml.getDomRef() as HTMLElement;\n if (!domRef) return;\n \n this.canvasEl = domRef as HTMLCanvasElement;\n this.canvasCtx = this.canvasEl.getContext(\"2d\");\n if (this.canvasCtx) {\n this.canvasCtx.lineWidth = 2;\n this.canvasCtx.lineCap = \"round\";\n this.canvasCtx.strokeStyle = \"#000\";\n }\n\n // Mouse events\n this.canvasEl.addEventListener(\"mousedown\", this.boundStartDrawing);\n this.canvasEl.addEventListener(\"mousemove\", this.boundDraw);\n this.canvasEl.addEventListener(\"mouseup\", this.boundStopDrawing);\n this.canvasEl.addEventListener(\"mouseout\", this.boundStopDrawing);\n \n // Touch events\n this.canvasEl.addEventListener(\"touchstart\", this.boundStartDrawingTouch, { passive: false });\n this.canvasEl.addEventListener(\"touchmove\", this.boundDrawTouch, { passive: false });\n this.canvasEl.addEventListener(\"touchend\", this.boundStopDrawing);\n\n // Restore existing signature if any\n const val = this.getProperty(\"value\");\n if (val && typeof val === \"string\" && val.startsWith(\"data:image\")) {\n this.loadImageOntoCanvas(val);\n }\n }\n\n private loadImageOntoCanvas(dataUrl: string): void {\n const img = new window.Image();\n img.onload = () => {\n if (this.canvasCtx && this.canvasEl) {\n this.canvasCtx.clearRect(0, 0, this.canvasEl.width, this.canvasEl.height);\n this.canvasCtx.drawImage(img, 0, 0, this.canvasEl.width, this.canvasEl.height);\n }\n };\n img.src = dataUrl;\n }\n\n private getCoordinates(e: MouseEvent | TouchEvent): { x: number, y: number } {\n if (!this.canvasEl) return { x: 0, y: 0 };\n const rect = this.canvasEl.getBoundingClientRect();\n \n let clientX, clientY;\n if (e.type.startsWith(\"touch\")) {\n clientX = (e as TouchEvent).touches[0].clientX;\n clientY = (e as TouchEvent).touches[0].clientY;\n } else {\n clientX = (e as MouseEvent).clientX;\n clientY = (e as MouseEvent).clientY;\n }\n \n return {\n x: clientX - rect.left,\n y: clientY - rect.top\n };\n }\n\n private startDrawing(e: MouseEvent): void {\n this.isDrawing = true;\n this.draw(e);\n }\n\n private startDrawingTouch(e: TouchEvent): void {\n e.preventDefault(); // Prevent scrolling\n this.isDrawing = true;\n this.drawTouch(e);\n }\n\n private draw(e: MouseEvent): void {\n if (!this.isDrawing || !this.canvasCtx) return;\n const pos = this.getCoordinates(e);\n this.canvasCtx.lineTo(pos.x, pos.y);\n this.canvasCtx.stroke();\n this.canvasCtx.beginPath();\n this.canvasCtx.moveTo(pos.x, pos.y);\n }\n\n private drawTouch(e: TouchEvent): void {\n if (!this.isDrawing || !this.canvasCtx) return;\n e.preventDefault(); // Prevent scrolling\n const pos = this.getCoordinates(e);\n this.canvasCtx.lineTo(pos.x, pos.y);\n this.canvasCtx.stroke();\n this.canvasCtx.beginPath();\n this.canvasCtx.moveTo(pos.x, pos.y);\n }\n\n private stopDrawing(): void {\n if (!this.isDrawing) return;\n this.isDrawing = false;\n if (this.canvasCtx) {\n this.canvasCtx.beginPath(); // Reset path\n this.saveSignature();\n }\n }\n\n private clearSignature(): void {\n if (this.canvasCtx && this.canvasEl) {\n this.canvasCtx.clearRect(0, 0, this.canvasEl.width, this.canvasEl.height);\n }\n this.setValueAndFire(null);\n MessageToast.show(\"Signature cleared.\");\n }\n\n private saveSignature(): void {\n if (this.canvasEl) {\n const dataUrl = this.canvasEl.toDataURL(\"image/png\");\n this.setValueAndFire(dataUrl);\n }\n }\n\n /**\n * Sets the value of the control programmatically and re-draws the canvas.\n * @param value The base64 data URL string representing the signature image.\n */\n public setValue(value: unknown): this {\n super.setProperty(\"value\", value);\n if (value && typeof value === \"string\" && value.startsWith(\"data:image\")) {\n this.loadImageOntoCanvas(value);\n } else if (!value && this.canvasCtx && this.canvasEl) {\n this.canvasCtx.clearRect(0, 0, this.canvasEl.width, this.canvasEl.height);\n }\n return this;\n }\n\n /**\n * Cleans up event listeners to prevent memory leaks when the control is destroyed.\n */\n public exit(): void {\n if (this.canvasEl) {\n this.canvasEl.removeEventListener(\"mousedown\", this.boundStartDrawing as EventListener);\n this.canvasEl.removeEventListener(\"mousemove\", this.boundDraw as EventListener);\n this.canvasEl.removeEventListener(\"mouseup\", this.boundStopDrawing as EventListener);\n this.canvasEl.removeEventListener(\"mouseout\", this.boundStopDrawing as EventListener);\n \n this.canvasEl.removeEventListener(\"touchstart\", this.boundStartDrawingTouch as EventListener);\n this.canvasEl.removeEventListener(\"touchmove\", this.boundDrawTouch as EventListener);\n this.canvasEl.removeEventListener(\"touchend\", this.boundStopDrawing as EventListener);\n }\n this.canvasEl = null;\n this.canvasCtx = null;\n super.exit();\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -5,11 +5,6 @@ declare module "nz/co/siliconst/ui5/metaui/controls/SignatureControl" {
5
5
  * Provides an HTML5 Canvas for capturing signatures.
6
6
  */
7
7
  export default class SignatureControl extends BaseHardwareControl {
8
- static readonly renderer = "nz.co.siliconst.ui5.metaui.controls.BaseHardwareControlRenderer";
9
- static readonly metadata: {
10
- properties: {};
11
- events: {};
12
- };
13
8
  private vBox;
14
9
  private clearBtn;
15
10
  private canvasHtml;
@@ -1 +1 @@
1
- {"version":3,"file":"SignatureControl.d.ts","sourceRoot":"../../../../../../../..","sources":["src/nz/co/siliconst/ui5/metaui/controls/SignatureControl.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,sDAAsD,CAAC;IACtE,OAAO,mBAAmB,MAAM,yDAAyD,CAAC;IAM1F;;;OAGG;IACH,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,mBAAmB;QAC7D,MAAM,CAAC,QAAQ,CAAC,QAAQ,qEAAqE;QAC7F,MAAM,CAAC,QAAQ,CAAC,QAAQ;;;UAGtB;QAEF,OAAO,CAAC,IAAI,CAAQ;QACpB,OAAO,CAAC,QAAQ,CAAU;QAC1B,OAAO,CAAC,UAAU,CAAQ;QAC1B,OAAO,CAAC,SAAS,CAAS;QAC1B,OAAO,CAAC,SAAS,CAAyC;QAC1D,OAAO,CAAC,QAAQ,CAAkC;QAElD,OAAO,CAAC,iBAAiB,CAA2B;QACpD,OAAO,CAAC,SAAS,CAA2B;QAC5C,OAAO,CAAC,gBAAgB,CAAwC;QAChE,OAAO,CAAC,sBAAsB,CAA2B;QACzD,OAAO,CAAC,cAAc,CAA2B;QAEjD;;WAEG;QACI,IAAI,IAAI,IAAI;QA2BnB,OAAO,CAAC,gBAAgB;QA8BxB,OAAO,CAAC,mBAAmB;QAW3B,OAAO,CAAC,cAAc;QAmBtB,OAAO,CAAC,YAAY;QAKpB,OAAO,CAAC,iBAAiB;QAMzB,OAAO,CAAC,IAAI;QASZ,OAAO,CAAC,SAAS;QAUjB,OAAO,CAAC,WAAW;QASnB,OAAO,CAAC,cAAc;QAQtB,OAAO,CAAC,aAAa;QAOrB;;;WAGG;QACI,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;QAUrC;;WAEG;QACI,IAAI,IAAI,IAAI;KAetB;CAEA"}
1
+ {"version":3,"file":"SignatureControl.d.ts","sourceRoot":"../../../../../../../..","sources":["src/nz/co/siliconst/ui5/metaui/controls/SignatureControl.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,sDAAsD,CAAC;IACtE,OAAO,mBAAmB,MAAM,yDAAyD,CAAC;IAM1F;;;OAGG;IACH,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,mBAAmB;QAG7D,OAAO,CAAC,IAAI,CAAQ;QACpB,OAAO,CAAC,QAAQ,CAAU;QAC1B,OAAO,CAAC,UAAU,CAAQ;QAC1B,OAAO,CAAC,SAAS,CAAS;QAC1B,OAAO,CAAC,SAAS,CAAyC;QAC1D,OAAO,CAAC,QAAQ,CAAkC;QAElD,OAAO,CAAC,iBAAiB,CAA2B;QACpD,OAAO,CAAC,SAAS,CAA2B;QAC5C,OAAO,CAAC,gBAAgB,CAAwC;QAChE,OAAO,CAAC,sBAAsB,CAA2B;QACzD,OAAO,CAAC,cAAc,CAA2B;QAEjD;;WAEG;QACI,IAAI,IAAI,IAAI;QA2BnB,OAAO,CAAC,gBAAgB;QA8BxB,OAAO,CAAC,mBAAmB;QAW3B,OAAO,CAAC,cAAc;QAmBtB,OAAO,CAAC,YAAY;QAKpB,OAAO,CAAC,iBAAiB;QAMzB,OAAO,CAAC,IAAI;QASZ,OAAO,CAAC,SAAS;QAUjB,OAAO,CAAC,WAAW;QASnB,OAAO,CAAC,cAAc;QAQtB,OAAO,CAAC,aAAa;QAOrB;;;WAGG;QACI,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;QAUrC;;WAEG;QACI,IAAI,IAAI,IAAI;KAetB;CAEA"}
@@ -1,2 +1,2 @@
1
- sap.ui.define(["./BaseHardwareControl","sap/m/Button","sap/m/VBox","sap/ui/core/HTML","sap/m/MessageToast"],function(t,s,a,i,n){"use strict";function e(t){return t&&t.__esModule&&typeof t.default!=="undefined"?t.default:t}const h=e(t);class r extends h{static renderer="nz.co.siliconst.ui5.metaui.controls.BaseHardwareControlRenderer";static metadata={properties:{},events:{}};isDrawing=false;canvasCtx=null;canvasEl=null;init(){super.init();this.canvasHtml=new i({content:"<canvas width='400' height='200' style='border: 1px solid #ccc; background-color: #fff; touch-action: none; cursor: crosshair;'></canvas>",afterRendering:this.onCanvasRendered.bind(this)}).addStyleClass("sapUiSmallMarginBottom");this.clearBtn=new s({icon:"sap-icon://sys-cancel",text:"Clear Signature",press:this.clearSignature.bind(this)});this.vBox=new a({items:[this.canvasHtml,this.clearBtn]});this.setAggregation("_content",this.vBox);this.boundStartDrawing=this.startDrawing.bind(this);this.boundDraw=this.draw.bind(this);this.boundStopDrawing=this.stopDrawing.bind(this);this.boundStartDrawingTouch=this.startDrawingTouch.bind(this);this.boundDrawTouch=this.drawTouch.bind(this)}onCanvasRendered(){const t=this.canvasHtml.getDomRef();if(!t)return;this.canvasEl=t;this.canvasCtx=this.canvasEl.getContext("2d");if(this.canvasCtx){this.canvasCtx.lineWidth=2;this.canvasCtx.lineCap="round";this.canvasCtx.strokeStyle="#000"}this.canvasEl.addEventListener("mousedown",this.boundStartDrawing);this.canvasEl.addEventListener("mousemove",this.boundDraw);this.canvasEl.addEventListener("mouseup",this.boundStopDrawing);this.canvasEl.addEventListener("mouseout",this.boundStopDrawing);this.canvasEl.addEventListener("touchstart",this.boundStartDrawingTouch,{passive:false});this.canvasEl.addEventListener("touchmove",this.boundDrawTouch,{passive:false});this.canvasEl.addEventListener("touchend",this.boundStopDrawing);const s=this.getValue();if(s&&typeof s==="string"&&s.startsWith("data:image")){this.loadImageOntoCanvas(s)}}loadImageOntoCanvas(t){const s=new window.Image;s.onload=()=>{if(this.canvasCtx&&this.canvasEl){this.canvasCtx.clearRect(0,0,this.canvasEl.width,this.canvasEl.height);this.canvasCtx.drawImage(s,0,0,this.canvasEl.width,this.canvasEl.height)}};s.src=t}getCoordinates(t){if(!this.canvasEl)return{x:0,y:0};const s=this.canvasEl.getBoundingClientRect();let a,i;if(t.type.startsWith("touch")){a=t.touches[0].clientX;i=t.touches[0].clientY}else{a=t.clientX;i=t.clientY}return{x:a-s.left,y:i-s.top}}startDrawing(t){this.isDrawing=true;this.draw(t)}startDrawingTouch(t){t.preventDefault();this.isDrawing=true;this.drawTouch(t)}draw(t){if(!this.isDrawing||!this.canvasCtx)return;const s=this.getCoordinates(t);this.canvasCtx.lineTo(s.x,s.y);this.canvasCtx.stroke();this.canvasCtx.beginPath();this.canvasCtx.moveTo(s.x,s.y)}drawTouch(t){if(!this.isDrawing||!this.canvasCtx)return;t.preventDefault();const s=this.getCoordinates(t);this.canvasCtx.lineTo(s.x,s.y);this.canvasCtx.stroke();this.canvasCtx.beginPath();this.canvasCtx.moveTo(s.x,s.y)}stopDrawing(){if(!this.isDrawing)return;this.isDrawing=false;if(this.canvasCtx){this.canvasCtx.beginPath();this.saveSignature()}}clearSignature(){if(this.canvasCtx&&this.canvasEl){this.canvasCtx.clearRect(0,0,this.canvasEl.width,this.canvasEl.height)}this.setValueAndFire(null);n.show("Signature cleared.")}saveSignature(){if(this.canvasEl){const t=this.canvasEl.toDataURL("image/png");this.setValueAndFire(t)}}setValue(t){super.setValue(t);if(t&&typeof t==="string"&&t.startsWith("data:image")){this.loadImageOntoCanvas(t)}else if(!t&&this.canvasCtx&&this.canvasEl){this.canvasCtx.clearRect(0,0,this.canvasEl.width,this.canvasEl.height)}return this}exit(){if(this.canvasEl){this.canvasEl.removeEventListener("mousedown",this.boundStartDrawing);this.canvasEl.removeEventListener("mousemove",this.boundDraw);this.canvasEl.removeEventListener("mouseup",this.boundStopDrawing);this.canvasEl.removeEventListener("mouseout",this.boundStopDrawing);this.canvasEl.removeEventListener("touchstart",this.boundStartDrawingTouch);this.canvasEl.removeEventListener("touchmove",this.boundDrawTouch);this.canvasEl.removeEventListener("touchend",this.boundStopDrawing)}this.canvasEl=null;this.canvasCtx=null;super.exit()}}return r});
1
+ sap.ui.define(["./BaseHardwareControl","sap/m/Button","sap/m/VBox","sap/ui/core/HTML","sap/m/MessageToast"],function(t,s,a,i,n){"use strict";function e(t){return t&&t.__esModule&&typeof t.default!=="undefined"?t.default:t}const h=e(t);class r extends h{isDrawing=false;canvasCtx=null;canvasEl=null;init(){super.init();this.canvasHtml=new i({content:"<canvas width='400' height='200' style='border: 1px solid #ccc; background-color: #fff; touch-action: none; cursor: crosshair;'></canvas>",afterRendering:this.onCanvasRendered.bind(this)}).addStyleClass("sapUiSmallMarginBottom");this.clearBtn=new s({icon:"sap-icon://sys-cancel",text:"Clear Signature",press:this.clearSignature.bind(this)});this.vBox=new a({items:[this.canvasHtml,this.clearBtn]});this.setAggregation("_content",this.vBox);this.boundStartDrawing=this.startDrawing.bind(this);this.boundDraw=this.draw.bind(this);this.boundStopDrawing=this.stopDrawing.bind(this);this.boundStartDrawingTouch=this.startDrawingTouch.bind(this);this.boundDrawTouch=this.drawTouch.bind(this)}onCanvasRendered(){const t=this.canvasHtml.getDomRef();if(!t)return;this.canvasEl=t;this.canvasCtx=this.canvasEl.getContext("2d");if(this.canvasCtx){this.canvasCtx.lineWidth=2;this.canvasCtx.lineCap="round";this.canvasCtx.strokeStyle="#000"}this.canvasEl.addEventListener("mousedown",this.boundStartDrawing);this.canvasEl.addEventListener("mousemove",this.boundDraw);this.canvasEl.addEventListener("mouseup",this.boundStopDrawing);this.canvasEl.addEventListener("mouseout",this.boundStopDrawing);this.canvasEl.addEventListener("touchstart",this.boundStartDrawingTouch,{passive:false});this.canvasEl.addEventListener("touchmove",this.boundDrawTouch,{passive:false});this.canvasEl.addEventListener("touchend",this.boundStopDrawing);const s=this.getProperty("value");if(s&&typeof s==="string"&&s.startsWith("data:image")){this.loadImageOntoCanvas(s)}}loadImageOntoCanvas(t){const s=new window.Image;s.onload=()=>{if(this.canvasCtx&&this.canvasEl){this.canvasCtx.clearRect(0,0,this.canvasEl.width,this.canvasEl.height);this.canvasCtx.drawImage(s,0,0,this.canvasEl.width,this.canvasEl.height)}};s.src=t}getCoordinates(t){if(!this.canvasEl)return{x:0,y:0};const s=this.canvasEl.getBoundingClientRect();let a,i;if(t.type.startsWith("touch")){a=t.touches[0].clientX;i=t.touches[0].clientY}else{a=t.clientX;i=t.clientY}return{x:a-s.left,y:i-s.top}}startDrawing(t){this.isDrawing=true;this.draw(t)}startDrawingTouch(t){t.preventDefault();this.isDrawing=true;this.drawTouch(t)}draw(t){if(!this.isDrawing||!this.canvasCtx)return;const s=this.getCoordinates(t);this.canvasCtx.lineTo(s.x,s.y);this.canvasCtx.stroke();this.canvasCtx.beginPath();this.canvasCtx.moveTo(s.x,s.y)}drawTouch(t){if(!this.isDrawing||!this.canvasCtx)return;t.preventDefault();const s=this.getCoordinates(t);this.canvasCtx.lineTo(s.x,s.y);this.canvasCtx.stroke();this.canvasCtx.beginPath();this.canvasCtx.moveTo(s.x,s.y)}stopDrawing(){if(!this.isDrawing)return;this.isDrawing=false;if(this.canvasCtx){this.canvasCtx.beginPath();this.saveSignature()}}clearSignature(){if(this.canvasCtx&&this.canvasEl){this.canvasCtx.clearRect(0,0,this.canvasEl.width,this.canvasEl.height)}this.setValueAndFire(null);n.show("Signature cleared.")}saveSignature(){if(this.canvasEl){const t=this.canvasEl.toDataURL("image/png");this.setValueAndFire(t)}}setValue(t){super.setProperty("value",t);if(t&&typeof t==="string"&&t.startsWith("data:image")){this.loadImageOntoCanvas(t)}else if(!t&&this.canvasCtx&&this.canvasEl){this.canvasCtx.clearRect(0,0,this.canvasEl.width,this.canvasEl.height)}return this}exit(){if(this.canvasEl){this.canvasEl.removeEventListener("mousedown",this.boundStartDrawing);this.canvasEl.removeEventListener("mousemove",this.boundDraw);this.canvasEl.removeEventListener("mouseup",this.boundStopDrawing);this.canvasEl.removeEventListener("mouseout",this.boundStopDrawing);this.canvasEl.removeEventListener("touchstart",this.boundStartDrawingTouch);this.canvasEl.removeEventListener("touchmove",this.boundDrawTouch);this.canvasEl.removeEventListener("touchend",this.boundStopDrawing)}this.canvasEl=null;this.canvasCtx=null;super.exit()}}return r});
2
2
  //# sourceMappingURL=SignatureControl.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SignatureControl.js","names":["BaseHardwareControl","_interopRequireDefault","__BaseHardwareControl","SignatureControl","static","properties","events","isDrawing","canvasCtx","canvasEl","init","super","this","canvasHtml","HTML","content","afterRendering","onCanvasRendered","bind","addStyleClass","clearBtn","Button","icon","text","press","clearSignature","vBox","VBox","items","setAggregation","boundStartDrawing","startDrawing","boundDraw","draw","boundStopDrawing","stopDrawing","boundStartDrawingTouch","startDrawingTouch","boundDrawTouch","drawTouch","domRef","getDomRef","getContext","lineWidth","lineCap","strokeStyle","addEventListener","passive","val","getValue","startsWith","loadImageOntoCanvas","dataUrl","img","window","Image","onload","clearRect","width","height","drawImage","src","getCoordinates","e","x","y","rect","getBoundingClientRect","clientX","clientY","type","touches","left","top","preventDefault","pos","lineTo","stroke","beginPath","moveTo","saveSignature","setValueAndFire","MessageToast","show","toDataURL","setValue","value","exit","removeEventListener"],"sources":["SignatureControl.ts"],"sourcesContent":["import BaseHardwareControl from \"./BaseHardwareControl\";\nimport Button from \"sap/m/Button\";\nimport VBox from \"sap/m/VBox\";\nimport HTML from \"sap/ui/core/HTML\";\nimport MessageToast from \"sap/m/MessageToast\";\n\n/**\n * SignatureControl\n * Provides an HTML5 Canvas for capturing signatures.\n */\nexport default class SignatureControl extends BaseHardwareControl {\n static readonly renderer = \"nz.co.siliconst.ui5.metaui.controls.BaseHardwareControlRenderer\";\n static readonly metadata = {\n properties: {},\n events: {}\n };\n\n private vBox!: VBox;\n private clearBtn!: Button;\n private canvasHtml!: HTML;\n private isDrawing = false;\n private canvasCtx: CanvasRenderingContext2D | null = null;\n private canvasEl: HTMLCanvasElement | null = null;\n\n private boundStartDrawing!: (e: MouseEvent) => void;\n private boundDraw!: (e: MouseEvent) => void;\n private boundStopDrawing!: (e: MouseEvent | TouchEvent) => void;\n private boundStartDrawingTouch!: (e: TouchEvent) => void;\n private boundDrawTouch!: (e: TouchEvent) => void;\n\n /**\n * Initializes the control and builds the canvas drawing surface.\n */\n public init(): void {\n super.init();\n\n this.canvasHtml = new HTML({\n content: \"<canvas width='400' height='200' style='border: 1px solid #ccc; background-color: #fff; touch-action: none; cursor: crosshair;'></canvas>\",\n afterRendering: this.onCanvasRendered.bind(this)\n }).addStyleClass(\"sapUiSmallMarginBottom\");\n\n this.clearBtn = new Button({\n icon: \"sap-icon://sys-cancel\",\n text: \"Clear Signature\",\n press: this.clearSignature.bind(this)\n });\n\n this.vBox = new VBox({\n items: [this.canvasHtml, this.clearBtn]\n });\n\n this.setAggregation(\"_content\", this.vBox);\n\n this.boundStartDrawing = this.startDrawing.bind(this);\n this.boundDraw = this.draw.bind(this);\n this.boundStopDrawing = this.stopDrawing.bind(this);\n this.boundStartDrawingTouch = this.startDrawingTouch.bind(this);\n this.boundDrawTouch = this.drawTouch.bind(this);\n }\n\n private onCanvasRendered(): void {\n const domRef = this.canvasHtml.getDomRef() as HTMLElement;\n if (!domRef) return;\n \n this.canvasEl = domRef as HTMLCanvasElement;\n this.canvasCtx = this.canvasEl.getContext(\"2d\");\n if (this.canvasCtx) {\n this.canvasCtx.lineWidth = 2;\n this.canvasCtx.lineCap = \"round\";\n this.canvasCtx.strokeStyle = \"#000\";\n }\n\n // Mouse events\n this.canvasEl.addEventListener(\"mousedown\", this.boundStartDrawing);\n this.canvasEl.addEventListener(\"mousemove\", this.boundDraw);\n this.canvasEl.addEventListener(\"mouseup\", this.boundStopDrawing);\n this.canvasEl.addEventListener(\"mouseout\", this.boundStopDrawing);\n \n // Touch events\n this.canvasEl.addEventListener(\"touchstart\", this.boundStartDrawingTouch, { passive: false });\n this.canvasEl.addEventListener(\"touchmove\", this.boundDrawTouch, { passive: false });\n this.canvasEl.addEventListener(\"touchend\", this.boundStopDrawing);\n\n // Restore existing signature if any\n const val = this.getValue();\n if (val && typeof val === \"string\" && val.startsWith(\"data:image\")) {\n this.loadImageOntoCanvas(val);\n }\n }\n\n private loadImageOntoCanvas(dataUrl: string): void {\n const img = new window.Image();\n img.onload = () => {\n if (this.canvasCtx && this.canvasEl) {\n this.canvasCtx.clearRect(0, 0, this.canvasEl.width, this.canvasEl.height);\n this.canvasCtx.drawImage(img, 0, 0, this.canvasEl.width, this.canvasEl.height);\n }\n };\n img.src = dataUrl;\n }\n\n private getCoordinates(e: MouseEvent | TouchEvent): { x: number, y: number } {\n if (!this.canvasEl) return { x: 0, y: 0 };\n const rect = this.canvasEl.getBoundingClientRect();\n \n let clientX, clientY;\n if (e.type.startsWith(\"touch\")) {\n clientX = (e as TouchEvent).touches[0].clientX;\n clientY = (e as TouchEvent).touches[0].clientY;\n } else {\n clientX = (e as MouseEvent).clientX;\n clientY = (e as MouseEvent).clientY;\n }\n \n return {\n x: clientX - rect.left,\n y: clientY - rect.top\n };\n }\n\n private startDrawing(e: MouseEvent): void {\n this.isDrawing = true;\n this.draw(e);\n }\n\n private startDrawingTouch(e: TouchEvent): void {\n e.preventDefault(); // Prevent scrolling\n this.isDrawing = true;\n this.drawTouch(e);\n }\n\n private draw(e: MouseEvent): void {\n if (!this.isDrawing || !this.canvasCtx) return;\n const pos = this.getCoordinates(e);\n this.canvasCtx.lineTo(pos.x, pos.y);\n this.canvasCtx.stroke();\n this.canvasCtx.beginPath();\n this.canvasCtx.moveTo(pos.x, pos.y);\n }\n\n private drawTouch(e: TouchEvent): void {\n if (!this.isDrawing || !this.canvasCtx) return;\n e.preventDefault(); // Prevent scrolling\n const pos = this.getCoordinates(e);\n this.canvasCtx.lineTo(pos.x, pos.y);\n this.canvasCtx.stroke();\n this.canvasCtx.beginPath();\n this.canvasCtx.moveTo(pos.x, pos.y);\n }\n\n private stopDrawing(): void {\n if (!this.isDrawing) return;\n this.isDrawing = false;\n if (this.canvasCtx) {\n this.canvasCtx.beginPath(); // Reset path\n this.saveSignature();\n }\n }\n\n private clearSignature(): void {\n if (this.canvasCtx && this.canvasEl) {\n this.canvasCtx.clearRect(0, 0, this.canvasEl.width, this.canvasEl.height);\n }\n this.setValueAndFire(null);\n MessageToast.show(\"Signature cleared.\");\n }\n\n private saveSignature(): void {\n if (this.canvasEl) {\n const dataUrl = this.canvasEl.toDataURL(\"image/png\");\n this.setValueAndFire(dataUrl);\n }\n }\n\n /**\n * Sets the value of the control programmatically and re-draws the canvas.\n * @param value The base64 data URL string representing the signature image.\n */\n public setValue(value: unknown): this {\n super.setValue(value);\n if (value && typeof value === \"string\" && value.startsWith(\"data:image\")) {\n this.loadImageOntoCanvas(value);\n } else if (!value && this.canvasCtx && this.canvasEl) {\n this.canvasCtx.clearRect(0, 0, this.canvasEl.width, this.canvasEl.height);\n }\n return this;\n }\n\n /**\n * Cleans up event listeners to prevent memory leaks when the control is destroyed.\n */\n public exit(): void {\n if (this.canvasEl) {\n this.canvasEl.removeEventListener(\"mousedown\", this.boundStartDrawing as EventListener);\n this.canvasEl.removeEventListener(\"mousemove\", this.boundDraw as EventListener);\n this.canvasEl.removeEventListener(\"mouseup\", this.boundStopDrawing as EventListener);\n this.canvasEl.removeEventListener(\"mouseout\", this.boundStopDrawing as EventListener);\n \n this.canvasEl.removeEventListener(\"touchstart\", this.boundStartDrawingTouch as EventListener);\n this.canvasEl.removeEventListener(\"touchmove\", this.boundDrawTouch as EventListener);\n this.canvasEl.removeEventListener(\"touchend\", this.boundStopDrawing as EventListener);\n }\n this.canvasEl = null;\n this.canvasCtx = null;\n super.exit();\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"SignatureControl.js","names":["BaseHardwareControl","_interopRequireDefault","__BaseHardwareControl","SignatureControl","isDrawing","canvasCtx","canvasEl","init","super","this","canvasHtml","HTML","content","afterRendering","onCanvasRendered","bind","addStyleClass","clearBtn","Button","icon","text","press","clearSignature","vBox","VBox","items","setAggregation","boundStartDrawing","startDrawing","boundDraw","draw","boundStopDrawing","stopDrawing","boundStartDrawingTouch","startDrawingTouch","boundDrawTouch","drawTouch","domRef","getDomRef","getContext","lineWidth","lineCap","strokeStyle","addEventListener","passive","val","getProperty","startsWith","loadImageOntoCanvas","dataUrl","img","window","Image","onload","clearRect","width","height","drawImage","src","getCoordinates","e","x","y","rect","getBoundingClientRect","clientX","clientY","type","touches","left","top","preventDefault","pos","lineTo","stroke","beginPath","moveTo","saveSignature","setValueAndFire","MessageToast","show","toDataURL","setValue","value","setProperty","exit","removeEventListener"],"sources":["SignatureControl.ts"],"sourcesContent":["import BaseHardwareControl from \"./BaseHardwareControl\";\nimport Button from \"sap/m/Button\";\nimport VBox from \"sap/m/VBox\";\nimport HTML from \"sap/ui/core/HTML\";\nimport MessageToast from \"sap/m/MessageToast\";\n\n/**\n * SignatureControl\n * Provides an HTML5 Canvas for capturing signatures.\n */\nexport default class SignatureControl extends BaseHardwareControl {\n\n\n private vBox!: VBox;\n private clearBtn!: Button;\n private canvasHtml!: HTML;\n private isDrawing = false;\n private canvasCtx: CanvasRenderingContext2D | null = null;\n private canvasEl: HTMLCanvasElement | null = null;\n\n private boundStartDrawing!: (e: MouseEvent) => void;\n private boundDraw!: (e: MouseEvent) => void;\n private boundStopDrawing!: (e: MouseEvent | TouchEvent) => void;\n private boundStartDrawingTouch!: (e: TouchEvent) => void;\n private boundDrawTouch!: (e: TouchEvent) => void;\n\n /**\n * Initializes the control and builds the canvas drawing surface.\n */\n public init(): void {\n super.init();\n\n this.canvasHtml = new HTML({\n content: \"<canvas width='400' height='200' style='border: 1px solid #ccc; background-color: #fff; touch-action: none; cursor: crosshair;'></canvas>\",\n afterRendering: this.onCanvasRendered.bind(this)\n }).addStyleClass(\"sapUiSmallMarginBottom\");\n\n this.clearBtn = new Button({\n icon: \"sap-icon://sys-cancel\",\n text: \"Clear Signature\",\n press: this.clearSignature.bind(this)\n });\n\n this.vBox = new VBox({\n items: [this.canvasHtml, this.clearBtn]\n });\n\n this.setAggregation(\"_content\", this.vBox);\n\n this.boundStartDrawing = this.startDrawing.bind(this);\n this.boundDraw = this.draw.bind(this);\n this.boundStopDrawing = this.stopDrawing.bind(this);\n this.boundStartDrawingTouch = this.startDrawingTouch.bind(this);\n this.boundDrawTouch = this.drawTouch.bind(this);\n }\n\n private onCanvasRendered(): void {\n const domRef = this.canvasHtml.getDomRef() as HTMLElement;\n if (!domRef) return;\n \n this.canvasEl = domRef as HTMLCanvasElement;\n this.canvasCtx = this.canvasEl.getContext(\"2d\");\n if (this.canvasCtx) {\n this.canvasCtx.lineWidth = 2;\n this.canvasCtx.lineCap = \"round\";\n this.canvasCtx.strokeStyle = \"#000\";\n }\n\n // Mouse events\n this.canvasEl.addEventListener(\"mousedown\", this.boundStartDrawing);\n this.canvasEl.addEventListener(\"mousemove\", this.boundDraw);\n this.canvasEl.addEventListener(\"mouseup\", this.boundStopDrawing);\n this.canvasEl.addEventListener(\"mouseout\", this.boundStopDrawing);\n \n // Touch events\n this.canvasEl.addEventListener(\"touchstart\", this.boundStartDrawingTouch, { passive: false });\n this.canvasEl.addEventListener(\"touchmove\", this.boundDrawTouch, { passive: false });\n this.canvasEl.addEventListener(\"touchend\", this.boundStopDrawing);\n\n // Restore existing signature if any\n const val = this.getProperty(\"value\");\n if (val && typeof val === \"string\" && val.startsWith(\"data:image\")) {\n this.loadImageOntoCanvas(val);\n }\n }\n\n private loadImageOntoCanvas(dataUrl: string): void {\n const img = new window.Image();\n img.onload = () => {\n if (this.canvasCtx && this.canvasEl) {\n this.canvasCtx.clearRect(0, 0, this.canvasEl.width, this.canvasEl.height);\n this.canvasCtx.drawImage(img, 0, 0, this.canvasEl.width, this.canvasEl.height);\n }\n };\n img.src = dataUrl;\n }\n\n private getCoordinates(e: MouseEvent | TouchEvent): { x: number, y: number } {\n if (!this.canvasEl) return { x: 0, y: 0 };\n const rect = this.canvasEl.getBoundingClientRect();\n \n let clientX, clientY;\n if (e.type.startsWith(\"touch\")) {\n clientX = (e as TouchEvent).touches[0].clientX;\n clientY = (e as TouchEvent).touches[0].clientY;\n } else {\n clientX = (e as MouseEvent).clientX;\n clientY = (e as MouseEvent).clientY;\n }\n \n return {\n x: clientX - rect.left,\n y: clientY - rect.top\n };\n }\n\n private startDrawing(e: MouseEvent): void {\n this.isDrawing = true;\n this.draw(e);\n }\n\n private startDrawingTouch(e: TouchEvent): void {\n e.preventDefault(); // Prevent scrolling\n this.isDrawing = true;\n this.drawTouch(e);\n }\n\n private draw(e: MouseEvent): void {\n if (!this.isDrawing || !this.canvasCtx) return;\n const pos = this.getCoordinates(e);\n this.canvasCtx.lineTo(pos.x, pos.y);\n this.canvasCtx.stroke();\n this.canvasCtx.beginPath();\n this.canvasCtx.moveTo(pos.x, pos.y);\n }\n\n private drawTouch(e: TouchEvent): void {\n if (!this.isDrawing || !this.canvasCtx) return;\n e.preventDefault(); // Prevent scrolling\n const pos = this.getCoordinates(e);\n this.canvasCtx.lineTo(pos.x, pos.y);\n this.canvasCtx.stroke();\n this.canvasCtx.beginPath();\n this.canvasCtx.moveTo(pos.x, pos.y);\n }\n\n private stopDrawing(): void {\n if (!this.isDrawing) return;\n this.isDrawing = false;\n if (this.canvasCtx) {\n this.canvasCtx.beginPath(); // Reset path\n this.saveSignature();\n }\n }\n\n private clearSignature(): void {\n if (this.canvasCtx && this.canvasEl) {\n this.canvasCtx.clearRect(0, 0, this.canvasEl.width, this.canvasEl.height);\n }\n this.setValueAndFire(null);\n MessageToast.show(\"Signature cleared.\");\n }\n\n private saveSignature(): void {\n if (this.canvasEl) {\n const dataUrl = this.canvasEl.toDataURL(\"image/png\");\n this.setValueAndFire(dataUrl);\n }\n }\n\n /**\n * Sets the value of the control programmatically and re-draws the canvas.\n * @param value The base64 data URL string representing the signature image.\n */\n public setValue(value: unknown): this {\n super.setProperty(\"value\", value);\n if (value && typeof value === \"string\" && value.startsWith(\"data:image\")) {\n this.loadImageOntoCanvas(value);\n } else if (!value && this.canvasCtx && this.canvasEl) {\n this.canvasCtx.clearRect(0, 0, this.canvasEl.width, this.canvasEl.height);\n }\n return this;\n }\n\n /**\n * Cleans up event listeners to prevent memory leaks when the control is destroyed.\n */\n public exit(): void {\n if (this.canvasEl) {\n this.canvasEl.removeEventListener(\"mousedown\", this.boundStartDrawing as EventListener);\n this.canvasEl.removeEventListener(\"mousemove\", this.boundDraw as EventListener);\n this.canvasEl.removeEventListener(\"mouseup\", this.boundStopDrawing as EventListener);\n this.canvasEl.removeEventListener(\"mouseout\", this.boundStopDrawing as EventListener);\n \n this.canvasEl.removeEventListener(\"touchstart\", this.boundStartDrawingTouch as EventListener);\n this.canvasEl.removeEventListener(\"touchmove\", this.boundDrawTouch as EventListener);\n this.canvasEl.removeEventListener(\"touchend\", this.boundStopDrawing as EventListener);\n }\n this.canvasEl = null;\n this.canvasCtx = null;\n super.exit();\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -9,11 +9,7 @@ import MessageToast from "sap/m/MessageToast";
9
9
  * Provides an HTML5 Canvas for capturing signatures.
10
10
  */
11
11
  export default class SignatureControl extends BaseHardwareControl {
12
- static readonly renderer = "nz.co.siliconst.ui5.metaui.controls.BaseHardwareControlRenderer";
13
- static readonly metadata = {
14
- properties: {},
15
- events: {}
16
- };
12
+
17
13
 
18
14
  private vBox!: VBox;
19
15
  private clearBtn!: Button;
@@ -82,7 +78,7 @@ export default class SignatureControl extends BaseHardwareControl {
82
78
  this.canvasEl.addEventListener("touchend", this.boundStopDrawing);
83
79
 
84
80
  // Restore existing signature if any
85
- const val = this.getValue();
81
+ const val = this.getProperty("value");
86
82
  if (val && typeof val === "string" && val.startsWith("data:image")) {
87
83
  this.loadImageOntoCanvas(val);
88
84
  }
@@ -177,7 +173,7 @@ export default class SignatureControl extends BaseHardwareControl {
177
173
  * @param value The base64 data URL string representing the signature image.
178
174
  */
179
175
  public setValue(value: unknown): this {
180
- super.setValue(value);
176
+ super.setProperty("value", value);
181
177
  if (value && typeof value === "string" && value.startsWith("data:image")) {
182
178
  this.loadImageOntoCanvas(value);
183
179
  } else if (!value && this.canvasCtx && this.canvasEl) {
@@ -11,11 +11,6 @@ sap.ui.define(["./BaseHardwareControl", "sap/m/Button", "sap/m/VBox", "sap/m/Tex
11
11
  * Provides a UI to dictate text using the browser's native Web Speech API.
12
12
  */
13
13
  class VoiceInputControl extends BaseHardwareControl {
14
- static renderer = "nz.co.siliconst.ui5.metaui.controls.BaseHardwareControlRenderer";
15
- static metadata = {
16
- properties: {},
17
- events: {}
18
- };
19
14
  recognition = null;
20
15
  isRecording = false;
21
16
 
@@ -72,7 +67,7 @@ sap.ui.define(["./BaseHardwareControl", "sap/m/Button", "sap/m/VBox", "sap/m/Tex
72
67
  }
73
68
 
74
69
  // Append the new final transcript to whatever was already in the textarea
75
- const currentVal = this.getValue() || "";
70
+ const currentVal = this.getProperty("value") || "";
76
71
  const newVal = currentVal ? currentVal + " " + finalTranscript : finalTranscript;
77
72
  if (finalTranscript) {
78
73
  this.textArea.setValue(newVal);
@@ -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","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
+ {"version":3,"file":"VoiceInputControl-dbg.js","names":["BaseHardwareControl","_interopRequireDefault","__BaseHardwareControl","Logger","___utils_Logger","VoiceInputControl","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","getProperty","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","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\nimport Event from \"sap/ui/base/Event\";\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\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: Event) => {\n this.setValueAndFire((oEvent.getParameter(\"value\") as any));\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.getProperty(\"value\") as string || \"\";\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 as any).onstart = null;\n (this.recognition as any).onresult = null;\n (this.recognition as any).onerror = null;\n (this.recognition as any).onend = null;\n this.recognition = null;\n }\n super.exit();\n }\n}\n"],"mappings":"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","ignoreList":[]}