@siliconst/metaui 1.4.7 → 1.4.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/BaseHardwareControl-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/BaseHardwareControl.d.ts +2 -2
- package/src/nz/co/siliconst/ui5/metaui/controls/BaseHardwareControl.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/BaseHardwareControl.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/BaseHardwareControl.ts +2 -2
- package/src/nz/co/siliconst/ui5/metaui/controls/BaseHardwareControlRenderer-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/BaseHardwareControlRenderer.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/BaseHardwareControlRenderer.ts +2 -2
- package/src/nz/co/siliconst/ui5/metaui/controls/CameraControl-dbg.js +3 -2
- package/src/nz/co/siliconst/ui5/metaui/controls/CameraControl-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/CameraControl.d.ts +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/CameraControl.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/CameraControl.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/CameraControl.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/CameraControl.ts +4 -3
- package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost-dbg.js +8 -5
- package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.d.ts +6 -6
- package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.ts +14 -10
- package/src/nz/co/siliconst/ui5/metaui/controls/RichTextControl-dbg.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/RichTextControl-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/RichTextControl.d.ts +2 -2
- package/src/nz/co/siliconst/ui5/metaui/controls/RichTextControl.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/RichTextControl.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/RichTextControl.ts +2 -2
- package/src/nz/co/siliconst/ui5/metaui/controls/SignatureControl-dbg.js +30 -8
- package/src/nz/co/siliconst/ui5/metaui/controls/SignatureControl-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/SignatureControl.d.ts +10 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/SignatureControl.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/SignatureControl.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/SignatureControl.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/SignatureControl.ts +39 -8
- package/src/nz/co/siliconst/ui5/metaui/controls/VoiceInputControl-dbg.js +9 -6
- package/src/nz/co/siliconst/ui5/metaui/controls/VoiceInputControl-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/VoiceInputControl.d.ts +31 -0
- package/src/nz/co/siliconst/ui5/metaui/controls/VoiceInputControl.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/VoiceInputControl.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/VoiceInputControl.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/VoiceInputControl.ts +47 -12
- package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost-dbg.js +6 -14
- package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.d.ts +1 -2
- package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.ts +12 -19
- package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate.d.ts +3 -3
- package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DataSyncDelegate.ts +4 -4
- package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DialogDelegate-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DialogDelegate.d.ts +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DialogDelegate.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DialogDelegate.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DialogDelegate.ts +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ODataDelegate-dbg.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ODataDelegate-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ODataDelegate.d.ts +4 -3
- package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ODataDelegate.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ODataDelegate.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ODataDelegate.ts +10 -9
- package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate-dbg.js +3 -3
- package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate.d.ts +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate.ts +7 -6
- package/src/nz/co/siliconst/ui5/metaui/core/ConditionEngine-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/ConditionEngine.d.ts +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/ConditionEngine.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/ConditionEngine.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/ConditionEngine.ts +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/DefaultLayoutGenerator-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/DefaultLayoutGenerator.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/DefaultLayoutGenerator.ts +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/Engine-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/Engine.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/Engine.ts +2 -2
- package/src/nz/co/siliconst/ui5/metaui/core/PipelineManager-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/PipelineManager.d.ts +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/PipelineManager.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/PipelineManager.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/PipelineManager.ts +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry-dbg.js +5 -1
- package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/PluginRegistry.ts +9 -5
- package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.d.ts +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.ts +7 -7
- package/src/nz/co/siliconst/ui5/metaui/core/SchemaValidator-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/SchemaValidator.d.ts +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/SchemaValidator.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/SchemaValidator.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/SchemaValidator.ts +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/StateManager-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/StateManager.d.ts +2 -2
- package/src/nz/co/siliconst/ui5/metaui/core/StateManager.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/StateManager.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/StateManager.ts +6 -6
- package/src/nz/co/siliconst/ui5/metaui/interfaces/IPipeline-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/interfaces/IPipeline.d.ts +1 -1
- package/src/nz/co/siliconst/ui5/metaui/interfaces/IPipeline.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/interfaces/IPipeline.ts +1 -1
- package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout.ts +1 -1
- package/src/nz/co/siliconst/ui5/metaui/layouts/WizardLayout-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/layouts/WizardLayout.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/layouts/WizardLayout.ts +1 -1
- package/src/nz/co/siliconst/ui5/metaui/library-dbg.js +3 -3
- package/src/nz/co/siliconst/ui5/metaui/library-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/library-preload.js +33 -32
- package/src/nz/co/siliconst/ui5/metaui/library-preload.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/library.d.ts +27 -1
- package/src/nz/co/siliconst/ui5/metaui/library.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/library.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/library.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/library.ts +34 -2
- package/src/nz/co/siliconst/ui5/metaui/manifest.json +2 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/actions/ClearFormActionPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/actions/ClearFormActionPlugin.d.ts +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/actions/ClearFormActionPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/actions/ClearFormActionPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/actions/ClearFormActionPlugin.ts +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/actions/SubmitFormActionPlugin-dbg.js +0 -2
- package/src/nz/co/siliconst/ui5/metaui/plugins/actions/SubmitFormActionPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/actions/SubmitFormActionPlugin.d.ts +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/actions/SubmitFormActionPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/actions/SubmitFormActionPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/actions/SubmitFormActionPlugin.ts +2 -4
- package/src/nz/co/siliconst/ui5/metaui/plugins/actions/UrlNavigationActionPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/actions/UrlNavigationActionPlugin.d.ts +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/actions/UrlNavigationActionPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/actions/UrlNavigationActionPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/actions/UrlNavigationActionPlugin.ts +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin-dbg.js +5 -3
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin.d.ts +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ArrayPlugin.ts +7 -6
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin-dbg.js +3 -9
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin.d.ts +2 -2
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BarcodeScannerPlugin.ts +9 -14
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin-dbg.js +14 -3
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.d.ts +2 -2
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.ts +19 -8
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin-dbg.js +1 -3
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin.d.ts +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BooleanPlugin.ts +3 -3
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin-dbg.js +2 -4
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin.d.ts +2 -2
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CameraPlugin.ts +7 -7
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin-dbg.js +2 -4
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin.d.ts +2 -2
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/CodeEditorPlugin.ts +15 -15
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin-dbg.js +2 -4
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin.d.ts +2 -2
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DatePlugin.ts +4 -4
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin-dbg.js +2 -4
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin.d.ts +2 -2
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DateTimePlugin.ts +4 -4
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin-dbg.js +2 -4
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin.d.ts +2 -2
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/DropdownPlugin.ts +4 -4
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin-dbg.js +2 -4
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin.d.ts +2 -2
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/FileUploaderPlugin.ts +4 -4
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin-dbg.js +2 -4
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin.d.ts +2 -2
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/GeolocationPlugin.ts +7 -7
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MessageStripPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MessageStripPlugin.d.ts +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MessageStripPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MessageStripPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MessageStripPlugin.ts +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin-dbg.js +2 -4
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin.d.ts +2 -2
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiSelectPlugin.ts +5 -5
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin-dbg.js +2 -4
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin.d.ts +2 -2
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/NumberPlugin.ts +4 -4
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin-dbg.js +5 -3
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin.d.ts +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/ObjectPlugin.ts +11 -9
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin-dbg.js +2 -4
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin.d.ts +2 -2
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RatingIndicatorPlugin.ts +4 -4
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin-dbg.js +1 -3
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/RichTextPlugin.ts +5 -5
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin-dbg.js +2 -4
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin.d.ts +2 -2
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SignaturePlugin.ts +9 -9
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin-dbg.js +2 -4
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin.d.ts +2 -2
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SliderPlugin.ts +6 -6
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin-dbg.js +2 -4
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin.d.ts +2 -2
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/StringPlugin.ts +6 -6
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin-dbg.js +2 -4
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin.d.ts +2 -2
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/SwitchPlugin.ts +6 -6
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin-dbg.js +2 -4
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin.d.ts +2 -2
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TextAreaPlugin.ts +6 -6
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin-dbg.js +2 -4
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin.d.ts +2 -2
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/TimePlugin.ts +6 -6
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin-dbg.js +2 -4
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin.d.ts +2 -2
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/VoiceInputPlugin.ts +8 -8
- package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/LiveSearchPlugin-dbg.js +9 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/LiveSearchPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/LiveSearchPlugin.d.ts +8 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/LiveSearchPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/LiveSearchPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/LiveSearchPlugin.ts +13 -6
- package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/ODataListBindingPlugin-dbg.js +9 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/ODataListBindingPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/ODataListBindingPlugin.d.ts +8 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/ODataListBindingPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/ODataListBindingPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/ODataListBindingPlugin.ts +10 -3
- package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteDropdownPlugin-dbg.js +19 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteDropdownPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteDropdownPlugin.d.ts +18 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteDropdownPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteDropdownPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteDropdownPlugin.ts +19 -2
- package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteValueHelpPlugin-dbg.js +23 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteValueHelpPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteValueHelpPlugin.d.ts +20 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteValueHelpPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteValueHelpPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/datasources/RemoteValueHelpPlugin.ts +25 -6
- package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/CurrencyFormatterPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/CurrencyFormatterPlugin.d.ts +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/CurrencyFormatterPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/CurrencyFormatterPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/CurrencyFormatterPlugin.ts +2 -2
- package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/DateFormatterPlugin-dbg.js +6 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/DateFormatterPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/DateFormatterPlugin.d.ts +6 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/DateFormatterPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/DateFormatterPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/DateFormatterPlugin.ts +7 -2
- package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/PhoneFormatterPlugin-dbg.js +5 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/PhoneFormatterPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/PhoneFormatterPlugin.d.ts +6 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/PhoneFormatterPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/PhoneFormatterPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/PhoneFormatterPlugin.ts +6 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/TextCaseFormatterPlugin-dbg.js +5 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/TextCaseFormatterPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/TextCaseFormatterPlugin.d.ts +6 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/TextCaseFormatterPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/TextCaseFormatterPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/formatters/TextCaseFormatterPlugin.ts +6 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/validators/EmailValidatorPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/validators/EmailValidatorPlugin.d.ts +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/validators/EmailValidatorPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/validators/EmailValidatorPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/validators/EmailValidatorPlugin.ts +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/validators/IbanValidatorPlugin-dbg.js +6 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/validators/IbanValidatorPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/validators/IbanValidatorPlugin.d.ts +7 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/validators/IbanValidatorPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/validators/IbanValidatorPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/validators/IbanValidatorPlugin.ts +7 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/validators/MinLengthValidatorPlugin-dbg.js +6 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/validators/MinLengthValidatorPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/validators/MinLengthValidatorPlugin.d.ts +7 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/validators/MinLengthValidatorPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/validators/MinLengthValidatorPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/validators/MinLengthValidatorPlugin.ts +7 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/validators/PatternValidatorPlugin-dbg.js +6 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/validators/PatternValidatorPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/validators/PatternValidatorPlugin.d.ts +7 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/validators/PatternValidatorPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/validators/PatternValidatorPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/validators/PatternValidatorPlugin.ts +7 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/validators/RangeValidatorPlugin-dbg.js +6 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/validators/RangeValidatorPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/validators/RangeValidatorPlugin.d.ts +7 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/validators/RangeValidatorPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/validators/RangeValidatorPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/validators/RangeValidatorPlugin.ts +7 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/validators/UrlValidatorPlugin-dbg.js +6 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/validators/UrlValidatorPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/validators/UrlValidatorPlugin.d.ts +7 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/validators/UrlValidatorPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/validators/UrlValidatorPlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/validators/UrlValidatorPlugin.ts +7 -1
- package/src/nz/co/siliconst/ui5/metaui/typings/ui5-custom.d.ts +20 -0
- package/src/nz/co/siliconst/ui5/metaui/utils/ExpressionBuilder-dbg.js +50 -0
- package/src/nz/co/siliconst/ui5/metaui/utils/ExpressionBuilder-dbg.js.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/utils/ExpressionBuilder.d.ts +19 -0
- package/src/nz/co/siliconst/ui5/metaui/utils/ExpressionBuilder.d.ts.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/utils/ExpressionBuilder.js +2 -0
- package/src/nz/co/siliconst/ui5/metaui/utils/ExpressionBuilder.js.map +1 -0
- package/src/nz/co/siliconst/ui5/metaui/utils/ExpressionBuilder.ts +43 -0
|
@@ -22,6 +22,12 @@ export default class SignatureControl extends BaseHardwareControl {
|
|
|
22
22
|
private canvasCtx: CanvasRenderingContext2D | null = null;
|
|
23
23
|
private canvasEl: HTMLCanvasElement | null = null;
|
|
24
24
|
|
|
25
|
+
private boundStartDrawing!: (e: MouseEvent) => void;
|
|
26
|
+
private boundDraw!: (e: MouseEvent) => void;
|
|
27
|
+
private boundStopDrawing!: (e: MouseEvent | TouchEvent) => void;
|
|
28
|
+
private boundStartDrawingTouch!: (e: TouchEvent) => void;
|
|
29
|
+
private boundDrawTouch!: (e: TouchEvent) => void;
|
|
30
|
+
|
|
25
31
|
/**
|
|
26
32
|
* Initializes the control and builds the canvas drawing surface.
|
|
27
33
|
*/
|
|
@@ -44,6 +50,12 @@ export default class SignatureControl extends BaseHardwareControl {
|
|
|
44
50
|
});
|
|
45
51
|
|
|
46
52
|
this.setAggregation("_content", this.vBox);
|
|
53
|
+
|
|
54
|
+
this.boundStartDrawing = this.startDrawing.bind(this);
|
|
55
|
+
this.boundDraw = this.draw.bind(this);
|
|
56
|
+
this.boundStopDrawing = this.stopDrawing.bind(this);
|
|
57
|
+
this.boundStartDrawingTouch = this.startDrawingTouch.bind(this);
|
|
58
|
+
this.boundDrawTouch = this.drawTouch.bind(this);
|
|
47
59
|
}
|
|
48
60
|
|
|
49
61
|
private onCanvasRendered(): void {
|
|
@@ -59,15 +71,15 @@ export default class SignatureControl extends BaseHardwareControl {
|
|
|
59
71
|
}
|
|
60
72
|
|
|
61
73
|
// Mouse events
|
|
62
|
-
this.canvasEl.addEventListener("mousedown", this.
|
|
63
|
-
this.canvasEl.addEventListener("mousemove", this.
|
|
64
|
-
this.canvasEl.addEventListener("mouseup", this.
|
|
65
|
-
this.canvasEl.addEventListener("mouseout", this.
|
|
74
|
+
this.canvasEl.addEventListener("mousedown", this.boundStartDrawing);
|
|
75
|
+
this.canvasEl.addEventListener("mousemove", this.boundDraw);
|
|
76
|
+
this.canvasEl.addEventListener("mouseup", this.boundStopDrawing);
|
|
77
|
+
this.canvasEl.addEventListener("mouseout", this.boundStopDrawing);
|
|
66
78
|
|
|
67
79
|
// Touch events
|
|
68
|
-
this.canvasEl.addEventListener("touchstart", this.
|
|
69
|
-
this.canvasEl.addEventListener("touchmove", this.
|
|
70
|
-
this.canvasEl.addEventListener("touchend", this.
|
|
80
|
+
this.canvasEl.addEventListener("touchstart", this.boundStartDrawingTouch, { passive: false });
|
|
81
|
+
this.canvasEl.addEventListener("touchmove", this.boundDrawTouch, { passive: false });
|
|
82
|
+
this.canvasEl.addEventListener("touchend", this.boundStopDrawing);
|
|
71
83
|
|
|
72
84
|
// Restore existing signature if any
|
|
73
85
|
const val = this.getValue();
|
|
@@ -164,7 +176,7 @@ export default class SignatureControl extends BaseHardwareControl {
|
|
|
164
176
|
* Sets the value of the control programmatically and re-draws the canvas.
|
|
165
177
|
* @param value The base64 data URL string representing the signature image.
|
|
166
178
|
*/
|
|
167
|
-
public setValue(value:
|
|
179
|
+
public setValue(value: unknown): this {
|
|
168
180
|
super.setValue(value);
|
|
169
181
|
if (value && typeof value === "string" && value.startsWith("data:image")) {
|
|
170
182
|
this.loadImageOntoCanvas(value);
|
|
@@ -173,4 +185,23 @@ export default class SignatureControl extends BaseHardwareControl {
|
|
|
173
185
|
}
|
|
174
186
|
return this;
|
|
175
187
|
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Cleans up event listeners to prevent memory leaks when the control is destroyed.
|
|
191
|
+
*/
|
|
192
|
+
public exit(): void {
|
|
193
|
+
if (this.canvasEl) {
|
|
194
|
+
this.canvasEl.removeEventListener("mousedown", this.boundStartDrawing as EventListener);
|
|
195
|
+
this.canvasEl.removeEventListener("mousemove", this.boundDraw as EventListener);
|
|
196
|
+
this.canvasEl.removeEventListener("mouseup", this.boundStopDrawing as EventListener);
|
|
197
|
+
this.canvasEl.removeEventListener("mouseout", this.boundStopDrawing as EventListener);
|
|
198
|
+
|
|
199
|
+
this.canvasEl.removeEventListener("touchstart", this.boundStartDrawingTouch as EventListener);
|
|
200
|
+
this.canvasEl.removeEventListener("touchmove", this.boundDrawTouch as EventListener);
|
|
201
|
+
this.canvasEl.removeEventListener("touchend", this.boundStopDrawing as EventListener);
|
|
202
|
+
}
|
|
203
|
+
this.canvasEl = null;
|
|
204
|
+
this.canvasCtx = null;
|
|
205
|
+
super.exit();
|
|
206
|
+
}
|
|
176
207
|
}
|
|
@@ -55,9 +55,9 @@ sap.ui.define(["./BaseHardwareControl", "sap/m/Button", "sap/m/VBox", "sap/m/Tex
|
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
57
|
initSpeechRecognition() {
|
|
58
|
-
const
|
|
59
|
-
if (
|
|
60
|
-
this.recognition = new
|
|
58
|
+
const SpeechRecognitionClass = window.SpeechRecognition || window.webkitSpeechRecognition;
|
|
59
|
+
if (SpeechRecognitionClass) {
|
|
60
|
+
this.recognition = new SpeechRecognitionClass();
|
|
61
61
|
this.recognition.continuous = true;
|
|
62
62
|
this.recognition.interimResults = true;
|
|
63
63
|
this.recognition.onresult = event => {
|
|
@@ -116,9 +116,10 @@ sap.ui.define(["./BaseHardwareControl", "sap/m/Button", "sap/m/VBox", "sap/m/Tex
|
|
|
116
116
|
this.startBtn.setText("Requesting mic...");
|
|
117
117
|
this.startBtn.setType("Reject");
|
|
118
118
|
} catch (err) {
|
|
119
|
-
|
|
119
|
+
const error = err;
|
|
120
|
+
Logger.error("Failed to start speech recognition", error.message || String(error), "VoiceInputControl");
|
|
120
121
|
sap.ui.require(["sap/m/MessageBox"], MessageBox => {
|
|
121
|
-
MessageBox.error("Failed to start dictation. Please ensure you have a working microphone and have granted browser permissions.\n\nDetails: " + (
|
|
122
|
+
MessageBox.error("Failed to start dictation. Please ensure you have a working microphone and have granted browser permissions.\n\nDetails: " + (error.message || String(error)));
|
|
122
123
|
});
|
|
123
124
|
this.stopDictation();
|
|
124
125
|
}
|
|
@@ -127,7 +128,9 @@ sap.ui.define(["./BaseHardwareControl", "sap/m/Button", "sap/m/VBox", "sap/m/Tex
|
|
|
127
128
|
if (!this.recognition) return;
|
|
128
129
|
try {
|
|
129
130
|
this.recognition.stop();
|
|
130
|
-
} catch (e) {
|
|
131
|
+
} catch (e) {
|
|
132
|
+
Logger.warn("Failed to gracefully stop speech recognition.", String(e), "VoiceInputControl");
|
|
133
|
+
}
|
|
131
134
|
this.isRecording = false;
|
|
132
135
|
this.startBtn.setIcon("sap-icon://microphone");
|
|
133
136
|
this.startBtn.setText("Start Dictation");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VoiceInputControl-dbg.js","names":["BaseHardwareControl","_interopRequireDefault","__BaseHardwareControl","Logger","___utils_Logger","VoiceInputControl","renderer","metadata","properties","events","recognition","isRecording","init","textArea","TextArea","rows","width","placeholder","liveChange","oEvent","setValueAndFire","getParameter","startBtn","Button","icon","text","type","press","toggleDictation","bind","hBox","HBox","items","addStyleClass","vBox","VBox","setAggregation","initSpeechRecognition","stopDictation","startDictation","SpeechRecognition","window","webkitSpeechRecognition","continuous","interimResults","onresult","event","finalTranscript","interimTranscript","i","resultIndex","results","length","isFinal","transcript","currentVal","getValue","newVal","setValue","onstart","setIcon","setText","setType","MessageToast","show","onerror","error","sap","ui","require","MessageBox","onend","warn","setEnabled","setTooltip","start","err","message","stop","e","onBeforeRendering","readOnly","getProperty","setEditable","undefined","exit"],"sources":["VoiceInputControl.ts"],"sourcesContent":["import BaseHardwareControl from \"./BaseHardwareControl\";\nimport Button from \"sap/m/Button\";\nimport VBox from \"sap/m/VBox\";\nimport TextArea from \"sap/m/TextArea\";\nimport MessageToast from \"sap/m/MessageToast\";\nimport HBox from \"sap/m/HBox\";\nimport { Logger } from \"../utils/Logger\";\n\n/**\n * VoiceInputControl\n * Provides a UI to dictate text using the browser's native Web Speech API.\n */\nexport default class VoiceInputControl extends BaseHardwareControl {\n static readonly renderer = \"nz.co.siliconst.ui5.metaui.controls.BaseHardwareControlRenderer\";\n static readonly metadata = {\n properties: {},\n events: {}\n };\n\n private vBox!: VBox;\n private textArea!: TextArea;\n private startBtn!: Button;\n private stopBtn!: Button;\n \n private recognition: any = null;\n private isRecording: boolean = false;\n\n /**\n * Initializes the dictation interface and requests Web Speech API setup.\n */\n public init(): void {\n super.init();\n\n this.textArea = new TextArea({\n rows: 3,\n width: \"100%\",\n placeholder: \"Dictated text will appear here...\",\n liveChange: (oEvent: sap.ui.base.Event) => {\n this.setValueAndFire(oEvent.getParameter(\"value\"));\n }\n });\n\n this.startBtn = new Button({\n icon: \"sap-icon://microphone\",\n text: \"Start Dictation\",\n type: \"Emphasized\",\n press: this.toggleDictation.bind(this)\n });\n\n const hBox = new HBox({\n items: [this.startBtn]\n }).addStyleClass(\"sapUiSmallMarginTop\");\n\n this.vBox = new VBox({\n items: [this.textArea, hBox]\n });\n\n this.setAggregation(\"_content\", this.vBox);\n this.initSpeechRecognition();\n }\n\n private toggleDictation(): void {\n if (this.isRecording) {\n this.stopDictation();\n } else {\n this.startDictation();\n }\n }\n\n private initSpeechRecognition(): void {\n const SpeechRecognition = (window as unknown).SpeechRecognition || (window as unknown).webkitSpeechRecognition;\n if (SpeechRecognition) {\n this.recognition = new SpeechRecognition();\n this.recognition.continuous = true;\n this.recognition.interimResults = true;\n\n this.recognition.onresult = (event: any) => {\n let finalTranscript = \"\";\n let interimTranscript = \"\";\n\n for (let i = event.resultIndex; i < event.results.length; ++i) {\n if (event.results[i].isFinal) {\n finalTranscript += event.results[i][0].transcript;\n } else {\n interimTranscript += event.results[i][0].transcript;\n }\n }\n\n // Append the new final transcript to whatever was already in the textarea\n const currentVal = this.getValue() || \"\";\n const newVal = currentVal ? currentVal + \" \" + finalTranscript : finalTranscript;\n \n if (finalTranscript) {\n this.textArea.setValue(newVal);\n this.setValueAndFire(newVal);\n } else if (interimTranscript) {\n // Just show interim temporarily in textarea without saving to model\n this.textArea.setValue(currentVal ? currentVal + \" \" + interimTranscript : interimTranscript);\n }\n };\n\n this.recognition.onstart = () => {\n this.isRecording = true;\n this.startBtn.setIcon(\"sap-icon://stop\");\n this.startBtn.setText(\"Stop Recording\");\n this.startBtn.setType(\"Reject\");\n MessageToast.show(\"Listening... Please speak now.\");\n };\n\n this.recognition.onerror = (event: any) => {\n Logger.error(\"Speech recognition error\", event.error, \"VoiceInputControl\");\n sap.ui.require([\"sap/m/MessageBox\"], (MessageBox: unknown) => {\n MessageBox.error(\"Microphone Error: \" + event.error + \"\\n\\nPlease ensure you have a working microphone attached and have not blocked access in your browser settings.\");\n });\n this.stopDictation();\n };\n \n this.recognition.onend = () => {\n // If it ends natively (e.g. timeout), update UI\n this.stopDictation();\n };\n } else {\n Logger.warn(\"Web Speech API not supported in this browser.\", \"\", \"VoiceInputControl\");\n this.startBtn.setEnabled(false);\n this.startBtn.setTooltip(\"Speech Recognition is not supported in this browser.\");\n }\n }\n\n private startDictation(): void {\n if (!this.recognition) return;\n \n try {\n this.recognition.start();\n MessageToast.show(\"Requesting microphone access...\");\n // Provide immediate UI feedback in case browser delays the onstart event\n this.startBtn.setIcon(\"sap-icon://stop\");\n this.startBtn.setText(\"Requesting mic...\");\n this.startBtn.setType(\"Reject\");\n } catch (err: any) {\n Logger.error(\"Failed to start speech recognition\", err.message || err, \"VoiceInputControl\");\n sap.ui.require([\"sap/m/MessageBox\"], (MessageBox: unknown) => {\n MessageBox.error(\"Failed to start dictation. Please ensure you have a working microphone and have granted browser permissions.\\n\\nDetails: \" + (err.message || err));\n });\n this.stopDictation();\n }\n }\n\n private stopDictation(): void {\n if (!this.recognition) return;\n \n try {\n this.recognition.stop();\n } catch(e) {}\n \n this.isRecording = false;\n this.startBtn.setIcon(\"sap-icon://microphone\");\n this.startBtn.setText(\"Start Dictation\");\n this.startBtn.setType(\"Emphasized\");\n }\n\n /**\n * Lifecycle hook called before the control is rendered to the DOM.\n * Handles browser support visual state.\n */\n public onBeforeRendering(): void {\n const readOnly = this.getProperty(\"readOnly\");\n this.textArea.setEditable(!readOnly);\n \n // Only enable if it's not readonly AND the browser supports speech recognition\n this.startBtn.setEnabled(!readOnly && !!this.recognition);\n\n const currentVal = this.getProperty(\"value\");\n if (currentVal !== undefined && currentVal !== null) {\n // Only update text area if we aren't currently dictating interim results\n if (!this.isRecording) {\n this.textArea.setValue(currentVal as string);\n }\n }\n }\n\n /**\n * Cleans up hardware event listeners when the control is destroyed.\n */\n public exit(): void {\n this.stopDictation();\n if (this.recognition) {\n this.recognition.onstart = null;\n this.recognition.onresult = null;\n this.recognition.onerror = null;\n this.recognition.onend = null;\n this.recognition = null;\n }\n super.exit();\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"VoiceInputControl-dbg.js","names":["BaseHardwareControl","_interopRequireDefault","__BaseHardwareControl","Logger","___utils_Logger","VoiceInputControl","renderer","metadata","properties","events","recognition","isRecording","init","textArea","TextArea","rows","width","placeholder","liveChange","oEvent","setValueAndFire","getParameter","startBtn","Button","icon","text","type","press","toggleDictation","bind","hBox","HBox","items","addStyleClass","vBox","VBox","setAggregation","initSpeechRecognition","stopDictation","startDictation","SpeechRecognitionClass","window","SpeechRecognition","webkitSpeechRecognition","continuous","interimResults","onresult","event","finalTranscript","interimTranscript","i","resultIndex","results","length","isFinal","transcript","currentVal","getValue","newVal","setValue","onstart","setIcon","setText","setType","MessageToast","show","onerror","error","sap","ui","require","MessageBox","onend","warn","setEnabled","setTooltip","start","err","message","String","stop","e","onBeforeRendering","readOnly","getProperty","setEditable","undefined","exit"],"sources":["VoiceInputControl.ts"],"sourcesContent":["import BaseHardwareControl from \"./BaseHardwareControl\";\nimport Button from \"sap/m/Button\";\nimport VBox from \"sap/m/VBox\";\nimport TextArea from \"sap/m/TextArea\";\nimport MessageToast from \"sap/m/MessageToast\";\nimport HBox from \"sap/m/HBox\";\nimport { Logger } from \"../utils/Logger\";\n\ndeclare global {\n interface Window {\n SpeechRecognition: new () => SpeechRecognition;\n webkitSpeechRecognition: new () => SpeechRecognition;\n }\n interface SpeechRecognition {\n continuous: boolean;\n interimResults: boolean;\n onresult: (event: SpeechRecognitionEvent) => void;\n onstart: () => void;\n onerror: (event: SpeechRecognitionErrorEvent) => void;\n onend: () => void;\n start(): void;\n stop(): void;\n }\n interface SpeechRecognitionEvent {\n resultIndex: number;\n results: {\n length: number;\n [index: number]: {\n isFinal: boolean;\n [index: number]: {\n transcript: string;\n };\n };\n };\n }\n interface SpeechRecognitionErrorEvent {\n error: string;\n }\n}\n\n/**\n * VoiceInputControl\n * Provides a UI to dictate text using the browser's native Web Speech API.\n */\nexport default class VoiceInputControl extends BaseHardwareControl {\n static readonly renderer = \"nz.co.siliconst.ui5.metaui.controls.BaseHardwareControlRenderer\";\n static readonly metadata = {\n properties: {},\n events: {}\n };\n\n private vBox!: VBox;\n private textArea!: TextArea;\n private startBtn!: Button;\n private stopBtn!: Button;\n \n private recognition: SpeechRecognition | null = null;\n private isRecording: boolean = false;\n\n /**\n * Initializes the dictation interface and requests Web Speech API setup.\n */\n public init(): void {\n super.init();\n\n this.textArea = new TextArea({\n rows: 3,\n width: \"100%\",\n placeholder: \"Dictated text will appear here...\",\n liveChange: (oEvent: sap.ui.base.Event) => {\n this.setValueAndFire(oEvent.getParameter(\"value\"));\n }\n });\n\n this.startBtn = new Button({\n icon: \"sap-icon://microphone\",\n text: \"Start Dictation\",\n type: \"Emphasized\",\n press: this.toggleDictation.bind(this)\n });\n\n const hBox = new HBox({\n items: [this.startBtn]\n }).addStyleClass(\"sapUiSmallMarginTop\");\n\n this.vBox = new VBox({\n items: [this.textArea, hBox]\n });\n\n this.setAggregation(\"_content\", this.vBox);\n this.initSpeechRecognition();\n }\n\n private toggleDictation(): void {\n if (this.isRecording) {\n this.stopDictation();\n } else {\n this.startDictation();\n }\n }\n\n private initSpeechRecognition(): void {\n const SpeechRecognitionClass = window.SpeechRecognition || window.webkitSpeechRecognition;\n if (SpeechRecognitionClass) {\n this.recognition = new SpeechRecognitionClass();\n this.recognition.continuous = true;\n this.recognition.interimResults = true;\n\n this.recognition.onresult = (event: SpeechRecognitionEvent) => {\n let finalTranscript = \"\";\n let interimTranscript = \"\";\n\n for (let i = event.resultIndex; i < event.results.length; ++i) {\n if (event.results[i].isFinal) {\n finalTranscript += event.results[i][0].transcript;\n } else {\n interimTranscript += event.results[i][0].transcript;\n }\n }\n\n // Append the new final transcript to whatever was already in the textarea\n const currentVal = this.getValue() || \"\";\n const newVal = currentVal ? currentVal + \" \" + finalTranscript : finalTranscript;\n \n if (finalTranscript) {\n this.textArea.setValue(newVal);\n this.setValueAndFire(newVal);\n } else if (interimTranscript) {\n // Just show interim temporarily in textarea without saving to model\n this.textArea.setValue(currentVal ? currentVal + \" \" + interimTranscript : interimTranscript);\n }\n };\n\n this.recognition.onstart = () => {\n this.isRecording = true;\n this.startBtn.setIcon(\"sap-icon://stop\");\n this.startBtn.setText(\"Stop Recording\");\n this.startBtn.setType(\"Reject\");\n MessageToast.show(\"Listening... Please speak now.\");\n };\n\n this.recognition.onerror = (event: SpeechRecognitionErrorEvent) => {\n Logger.error(\"Speech recognition error\", event.error, \"VoiceInputControl\");\n sap.ui.require([\"sap/m/MessageBox\"], (MessageBox: typeof import(\"sap/m/MessageBox\").default) => {\n MessageBox.error(\"Microphone Error: \" + event.error + \"\\n\\nPlease ensure you have a working microphone attached and have not blocked access in your browser settings.\");\n });\n this.stopDictation();\n };\n \n this.recognition.onend = () => {\n // If it ends natively (e.g. timeout), update UI\n this.stopDictation();\n };\n } else {\n Logger.warn(\"Web Speech API not supported in this browser.\", \"\", \"VoiceInputControl\");\n this.startBtn.setEnabled(false);\n this.startBtn.setTooltip(\"Speech Recognition is not supported in this browser.\");\n }\n }\n\n private startDictation(): void {\n if (!this.recognition) return;\n \n try {\n this.recognition.start();\n MessageToast.show(\"Requesting microphone access...\");\n // Provide immediate UI feedback in case browser delays the onstart event\n this.startBtn.setIcon(\"sap-icon://stop\");\n this.startBtn.setText(\"Requesting mic...\");\n this.startBtn.setType(\"Reject\");\n } catch (err) {\n const error = err as Error;\n Logger.error(\"Failed to start speech recognition\", error.message || String(error), \"VoiceInputControl\");\n sap.ui.require([\"sap/m/MessageBox\"], (MessageBox: typeof import(\"sap/m/MessageBox\").default) => {\n MessageBox.error(\"Failed to start dictation. Please ensure you have a working microphone and have granted browser permissions.\\n\\nDetails: \" + (error.message || String(error)));\n });\n this.stopDictation();\n }\n }\n\n private stopDictation(): void {\n if (!this.recognition) return;\n \n try {\n this.recognition.stop();\n } catch(e) {\n Logger.warn(\"Failed to gracefully stop speech recognition.\", String(e), \"VoiceInputControl\");\n }\n \n this.isRecording = false;\n this.startBtn.setIcon(\"sap-icon://microphone\");\n this.startBtn.setText(\"Start Dictation\");\n this.startBtn.setType(\"Emphasized\");\n }\n\n /**\n * Lifecycle hook called before the control is rendered to the DOM.\n * Handles browser support visual state.\n */\n public onBeforeRendering(): void {\n const readOnly = this.getProperty(\"readOnly\");\n this.textArea.setEditable(!readOnly);\n \n // Only enable if it's not readonly AND the browser supports speech recognition\n this.startBtn.setEnabled(!readOnly && !!this.recognition);\n\n const currentVal = this.getProperty(\"value\");\n if (currentVal !== undefined && currentVal !== null) {\n // Only update text area if we aren't currently dictating interim results\n if (!this.isRecording) {\n this.textArea.setValue(currentVal as string);\n }\n }\n }\n\n /**\n * Cleans up hardware event listeners when the control is destroyed.\n */\n public exit(): void {\n this.stopDictation();\n if (this.recognition) {\n this.recognition.onstart = null;\n this.recognition.onresult = null;\n this.recognition.onerror = null;\n this.recognition.onend = null;\n this.recognition = null;\n }\n super.exit();\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,5 +1,36 @@
|
|
|
1
1
|
declare module "nz/co/siliconst/ui5/metaui/controls/VoiceInputControl" {
|
|
2
2
|
import BaseHardwareControl from "nz/co/siliconst/ui5/metaui/controls/BaseHardwareControl";
|
|
3
|
+
global {
|
|
4
|
+
interface Window {
|
|
5
|
+
SpeechRecognition: new () => SpeechRecognition;
|
|
6
|
+
webkitSpeechRecognition: new () => SpeechRecognition;
|
|
7
|
+
}
|
|
8
|
+
interface SpeechRecognition {
|
|
9
|
+
continuous: boolean;
|
|
10
|
+
interimResults: boolean;
|
|
11
|
+
onresult: (event: SpeechRecognitionEvent) => void;
|
|
12
|
+
onstart: () => void;
|
|
13
|
+
onerror: (event: SpeechRecognitionErrorEvent) => void;
|
|
14
|
+
onend: () => void;
|
|
15
|
+
start(): void;
|
|
16
|
+
stop(): void;
|
|
17
|
+
}
|
|
18
|
+
interface SpeechRecognitionEvent {
|
|
19
|
+
resultIndex: number;
|
|
20
|
+
results: {
|
|
21
|
+
length: number;
|
|
22
|
+
[index: number]: {
|
|
23
|
+
isFinal: boolean;
|
|
24
|
+
[index: number]: {
|
|
25
|
+
transcript: string;
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
interface SpeechRecognitionErrorEvent {
|
|
31
|
+
error: string;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
3
34
|
/**
|
|
4
35
|
* VoiceInputControl
|
|
5
36
|
* Provides a UI to dictate text using the browser's native Web Speech API.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VoiceInputControl.d.ts","sourceRoot":"../../../../../../../..","sources":["src/nz/co/siliconst/ui5/metaui/controls/VoiceInputControl.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,uDAAuD,CAAC;IACvE,OAAO,mBAAmB,MAAM,yDAAyD,CAAC;
|
|
1
|
+
{"version":3,"file":"VoiceInputControl.d.ts","sourceRoot":"../../../../../../../..","sources":["src/nz/co/siliconst/ui5/metaui/controls/VoiceInputControl.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,uDAAuD,CAAC;IACvE,OAAO,mBAAmB,MAAM,yDAAyD,CAAC;IAQlF,MAAM,CAAC;QACX,UAAU,MAAM;YACZ,iBAAiB,EAAE,UAAU,iBAAiB,CAAC;YAC/C,uBAAuB,EAAE,UAAU,iBAAiB,CAAC;SACxD;QACD,UAAU,iBAAiB;YACvB,UAAU,EAAE,OAAO,CAAC;YACpB,cAAc,EAAE,OAAO,CAAC;YACxB,QAAQ,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,IAAI,CAAC;YAClD,OAAO,EAAE,MAAM,IAAI,CAAC;YACpB,OAAO,EAAE,CAAC,KAAK,EAAE,2BAA2B,KAAK,IAAI,CAAC;YACtD,KAAK,EAAE,MAAM,IAAI,CAAC;YAClB,KAAK,IAAI,IAAI,CAAC;YACd,IAAI,IAAI,IAAI,CAAC;SAChB;QACD,UAAU,sBAAsB;YAC5B,WAAW,EAAE,MAAM,CAAC;YACpB,OAAO,EAAE;gBACL,MAAM,EAAE,MAAM,CAAC;gBACf,CAAC,KAAK,EAAE,MAAM,GAAG;oBACb,OAAO,EAAE,OAAO,CAAC;oBACjB,CAAC,KAAK,EAAE,MAAM,GAAG;wBACb,UAAU,EAAE,MAAM,CAAC;qBACtB,CAAC;iBACL,CAAC;aACL,CAAC;SACL;QACD,UAAU,2BAA2B;YACjC,KAAK,EAAE,MAAM,CAAC;SACjB;KACJ;IAED;;;OAGG;IACH,MAAM,CAAC,OAAO,OAAO,iBAAkB,SAAQ,mBAAmB;QAC9D,MAAM,CAAC,QAAQ,CAAC,QAAQ,qEAAqE;QAC7F,MAAM,CAAC,QAAQ,CAAC,QAAQ;;;UAGtB;QAEF,OAAO,CAAC,IAAI,CAAQ;QACpB,OAAO,CAAC,QAAQ,CAAY;QAC5B,OAAO,CAAC,QAAQ,CAAU;QAC1B,OAAO,CAAC,OAAO,CAAU;QAEzB,OAAO,CAAC,WAAW,CAAkC;QACrD,OAAO,CAAC,WAAW,CAAkB;QAErC;;WAEG;QACI,IAAI,IAAI,IAAI;QA+BnB,OAAO,CAAC,eAAe;QAQvB,OAAO,CAAC,qBAAqB;QA2D7B,OAAO,CAAC,cAAc;QAoBtB,OAAO,CAAC,aAAa;QAerB;;;WAGG;QACI,iBAAiB,IAAI,IAAI;QAgBhC;;WAEG;QACI,IAAI,IAAI,IAAI;KAWtB;CAEA"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
sap.ui.define(["./BaseHardwareControl","sap/m/Button","sap/m/VBox","sap/m/TextArea","sap/m/MessageToast","sap/m/HBox","../utils/Logger"],function(t,e,i,s,n,o,r){"use strict";function a(t){return t&&t.__esModule&&typeof t.default!=="undefined"?t.default:t}const c=a(t);const h=r["Logger"];class l extends c{static renderer="nz.co.siliconst.ui5.metaui.controls.BaseHardwareControlRenderer";static metadata={properties:{},events:{}};recognition=null;isRecording=false;init(){super.init();this.textArea=new s({rows:3,width:"100%",placeholder:"Dictated text will appear here...",liveChange:t=>{this.setValueAndFire(t.getParameter("value"))}});this.startBtn=new e({icon:"sap-icon://microphone",text:"Start Dictation",type:"Emphasized",press:this.toggleDictation.bind(this)});const t=new o({items:[this.startBtn]}).addStyleClass("sapUiSmallMarginTop");this.vBox=new i({items:[this.textArea,t]});this.setAggregation("_content",this.vBox);this.initSpeechRecognition()}toggleDictation(){if(this.isRecording){this.stopDictation()}else{this.startDictation()}}initSpeechRecognition(){const t=window.SpeechRecognition||window.webkitSpeechRecognition;if(t){this.recognition=new t;this.recognition.continuous=true;this.recognition.interimResults=true;this.recognition.onresult=t=>{let e="";let i="";for(let s=t.resultIndex;s<t.results.length;++s){if(t.results[s].isFinal){e+=t.results[s][0].transcript}else{i+=t.results[s][0].transcript}}const s=this.getValue()||"";const n=s?s+" "+e:e;if(e){this.textArea.setValue(n);this.setValueAndFire(n)}else if(i){this.textArea.setValue(s?s+" "+i:i)}};this.recognition.onstart=()=>{this.isRecording=true;this.startBtn.setIcon("sap-icon://stop");this.startBtn.setText("Stop Recording");this.startBtn.setType("Reject");n.show("Listening... Please speak now.")};this.recognition.onerror=t=>{h.error("Speech recognition error",t.error,"VoiceInputControl");sap.ui.require(["sap/m/MessageBox"],e=>{e.error("Microphone Error: "+t.error+"\n\nPlease ensure you have a working microphone attached and have not blocked access in your browser settings.")});this.stopDictation()};this.recognition.onend=()=>{this.stopDictation()}}else{h.warn("Web Speech API not supported in this browser.","","VoiceInputControl");this.startBtn.setEnabled(false);this.startBtn.setTooltip("Speech Recognition is not supported in this browser.")}}startDictation(){if(!this.recognition)return;try{this.recognition.start();n.show("Requesting microphone access...");this.startBtn.setIcon("sap-icon://stop");this.startBtn.setText("Requesting mic...");this.startBtn.setType("Reject")}catch(t){h.error("Failed to start speech recognition",
|
|
1
|
+
sap.ui.define(["./BaseHardwareControl","sap/m/Button","sap/m/VBox","sap/m/TextArea","sap/m/MessageToast","sap/m/HBox","../utils/Logger"],function(t,e,i,s,n,o,r){"use strict";function a(t){return t&&t.__esModule&&typeof t.default!=="undefined"?t.default:t}const c=a(t);const h=r["Logger"];class l extends c{static renderer="nz.co.siliconst.ui5.metaui.controls.BaseHardwareControlRenderer";static metadata={properties:{},events:{}};recognition=null;isRecording=false;init(){super.init();this.textArea=new s({rows:3,width:"100%",placeholder:"Dictated text will appear here...",liveChange:t=>{this.setValueAndFire(t.getParameter("value"))}});this.startBtn=new e({icon:"sap-icon://microphone",text:"Start Dictation",type:"Emphasized",press:this.toggleDictation.bind(this)});const t=new o({items:[this.startBtn]}).addStyleClass("sapUiSmallMarginTop");this.vBox=new i({items:[this.textArea,t]});this.setAggregation("_content",this.vBox);this.initSpeechRecognition()}toggleDictation(){if(this.isRecording){this.stopDictation()}else{this.startDictation()}}initSpeechRecognition(){const t=window.SpeechRecognition||window.webkitSpeechRecognition;if(t){this.recognition=new t;this.recognition.continuous=true;this.recognition.interimResults=true;this.recognition.onresult=t=>{let e="";let i="";for(let s=t.resultIndex;s<t.results.length;++s){if(t.results[s].isFinal){e+=t.results[s][0].transcript}else{i+=t.results[s][0].transcript}}const s=this.getValue()||"";const n=s?s+" "+e:e;if(e){this.textArea.setValue(n);this.setValueAndFire(n)}else if(i){this.textArea.setValue(s?s+" "+i:i)}};this.recognition.onstart=()=>{this.isRecording=true;this.startBtn.setIcon("sap-icon://stop");this.startBtn.setText("Stop Recording");this.startBtn.setType("Reject");n.show("Listening... Please speak now.")};this.recognition.onerror=t=>{h.error("Speech recognition error",t.error,"VoiceInputControl");sap.ui.require(["sap/m/MessageBox"],e=>{e.error("Microphone Error: "+t.error+"\n\nPlease ensure you have a working microphone attached and have not blocked access in your browser settings.")});this.stopDictation()};this.recognition.onend=()=>{this.stopDictation()}}else{h.warn("Web Speech API not supported in this browser.","","VoiceInputControl");this.startBtn.setEnabled(false);this.startBtn.setTooltip("Speech Recognition is not supported in this browser.")}}startDictation(){if(!this.recognition)return;try{this.recognition.start();n.show("Requesting microphone access...");this.startBtn.setIcon("sap-icon://stop");this.startBtn.setText("Requesting mic...");this.startBtn.setType("Reject")}catch(t){const e=t;h.error("Failed to start speech recognition",e.message||String(e),"VoiceInputControl");sap.ui.require(["sap/m/MessageBox"],t=>{t.error("Failed to start dictation. Please ensure you have a working microphone and have granted browser permissions.\n\nDetails: "+(e.message||String(e)))});this.stopDictation()}}stopDictation(){if(!this.recognition)return;try{this.recognition.stop()}catch(t){h.warn("Failed to gracefully stop speech recognition.",String(t),"VoiceInputControl")}this.isRecording=false;this.startBtn.setIcon("sap-icon://microphone");this.startBtn.setText("Start Dictation");this.startBtn.setType("Emphasized")}onBeforeRendering(){const t=this.getProperty("readOnly");this.textArea.setEditable(!t);this.startBtn.setEnabled(!t&&!!this.recognition);const e=this.getProperty("value");if(e!==undefined&&e!==null){if(!this.isRecording){this.textArea.setValue(e)}}}exit(){this.stopDictation();if(this.recognition){this.recognition.onstart=null;this.recognition.onresult=null;this.recognition.onerror=null;this.recognition.onend=null;this.recognition=null}super.exit()}}return l});
|
|
2
2
|
//# sourceMappingURL=VoiceInputControl.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VoiceInputControl.js","names":["BaseHardwareControl","_interopRequireDefault","__BaseHardwareControl","Logger","___utils_Logger","VoiceInputControl","static","properties","events","recognition","isRecording","init","super","this","textArea","TextArea","rows","width","placeholder","liveChange","oEvent","setValueAndFire","getParameter","startBtn","Button","icon","text","type","press","toggleDictation","bind","hBox","HBox","items","addStyleClass","vBox","VBox","setAggregation","initSpeechRecognition","stopDictation","startDictation","SpeechRecognition","window","webkitSpeechRecognition","continuous","interimResults","onresult","event","finalTranscript","interimTranscript","i","resultIndex","results","length","isFinal","transcript","currentVal","getValue","newVal","setValue","onstart","setIcon","setText","setType","MessageToast","show","onerror","error","sap","ui","require","MessageBox","onend","warn","setEnabled","setTooltip","start","err","message","stop","e","onBeforeRendering","readOnly","getProperty","setEditable","undefined","exit"],"sources":["VoiceInputControl.ts"],"sourcesContent":["import BaseHardwareControl from \"./BaseHardwareControl\";\nimport Button from \"sap/m/Button\";\nimport VBox from \"sap/m/VBox\";\nimport TextArea from \"sap/m/TextArea\";\nimport MessageToast from \"sap/m/MessageToast\";\nimport HBox from \"sap/m/HBox\";\nimport { Logger } from \"../utils/Logger\";\n\n/**\n * VoiceInputControl\n * Provides a UI to dictate text using the browser's native Web Speech API.\n */\nexport default class VoiceInputControl extends BaseHardwareControl {\n static readonly renderer = \"nz.co.siliconst.ui5.metaui.controls.BaseHardwareControlRenderer\";\n static readonly metadata = {\n properties: {},\n events: {}\n };\n\n private vBox!: VBox;\n private textArea!: TextArea;\n private startBtn!: Button;\n private stopBtn!: Button;\n \n private recognition: any = null;\n private isRecording: boolean = false;\n\n /**\n * Initializes the dictation interface and requests Web Speech API setup.\n */\n public init(): void {\n super.init();\n\n this.textArea = new TextArea({\n rows: 3,\n width: \"100%\",\n placeholder: \"Dictated text will appear here...\",\n liveChange: (oEvent: sap.ui.base.Event) => {\n this.setValueAndFire(oEvent.getParameter(\"value\"));\n }\n });\n\n this.startBtn = new Button({\n icon: \"sap-icon://microphone\",\n text: \"Start Dictation\",\n type: \"Emphasized\",\n press: this.toggleDictation.bind(this)\n });\n\n const hBox = new HBox({\n items: [this.startBtn]\n }).addStyleClass(\"sapUiSmallMarginTop\");\n\n this.vBox = new VBox({\n items: [this.textArea, hBox]\n });\n\n this.setAggregation(\"_content\", this.vBox);\n this.initSpeechRecognition();\n }\n\n private toggleDictation(): void {\n if (this.isRecording) {\n this.stopDictation();\n } else {\n this.startDictation();\n }\n }\n\n private initSpeechRecognition(): void {\n const SpeechRecognition = (window as unknown).SpeechRecognition || (window as unknown).webkitSpeechRecognition;\n if (SpeechRecognition) {\n this.recognition = new SpeechRecognition();\n this.recognition.continuous = true;\n this.recognition.interimResults = true;\n\n this.recognition.onresult = (event: any) => {\n let finalTranscript = \"\";\n let interimTranscript = \"\";\n\n for (let i = event.resultIndex; i < event.results.length; ++i) {\n if (event.results[i].isFinal) {\n finalTranscript += event.results[i][0].transcript;\n } else {\n interimTranscript += event.results[i][0].transcript;\n }\n }\n\n // Append the new final transcript to whatever was already in the textarea\n const currentVal = this.getValue() || \"\";\n const newVal = currentVal ? currentVal + \" \" + finalTranscript : finalTranscript;\n \n if (finalTranscript) {\n this.textArea.setValue(newVal);\n this.setValueAndFire(newVal);\n } else if (interimTranscript) {\n // Just show interim temporarily in textarea without saving to model\n this.textArea.setValue(currentVal ? currentVal + \" \" + interimTranscript : interimTranscript);\n }\n };\n\n this.recognition.onstart = () => {\n this.isRecording = true;\n this.startBtn.setIcon(\"sap-icon://stop\");\n this.startBtn.setText(\"Stop Recording\");\n this.startBtn.setType(\"Reject\");\n MessageToast.show(\"Listening... Please speak now.\");\n };\n\n this.recognition.onerror = (event: any) => {\n Logger.error(\"Speech recognition error\", event.error, \"VoiceInputControl\");\n sap.ui.require([\"sap/m/MessageBox\"], (MessageBox: unknown) => {\n MessageBox.error(\"Microphone Error: \" + event.error + \"\\n\\nPlease ensure you have a working microphone attached and have not blocked access in your browser settings.\");\n });\n this.stopDictation();\n };\n \n this.recognition.onend = () => {\n // If it ends natively (e.g. timeout), update UI\n this.stopDictation();\n };\n } else {\n Logger.warn(\"Web Speech API not supported in this browser.\", \"\", \"VoiceInputControl\");\n this.startBtn.setEnabled(false);\n this.startBtn.setTooltip(\"Speech Recognition is not supported in this browser.\");\n }\n }\n\n private startDictation(): void {\n if (!this.recognition) return;\n \n try {\n this.recognition.start();\n MessageToast.show(\"Requesting microphone access...\");\n // Provide immediate UI feedback in case browser delays the onstart event\n this.startBtn.setIcon(\"sap-icon://stop\");\n this.startBtn.setText(\"Requesting mic...\");\n this.startBtn.setType(\"Reject\");\n } catch (err: any) {\n Logger.error(\"Failed to start speech recognition\", err.message || err, \"VoiceInputControl\");\n sap.ui.require([\"sap/m/MessageBox\"], (MessageBox: unknown) => {\n MessageBox.error(\"Failed to start dictation. Please ensure you have a working microphone and have granted browser permissions.\\n\\nDetails: \" + (err.message || err));\n });\n this.stopDictation();\n }\n }\n\n private stopDictation(): void {\n if (!this.recognition) return;\n \n try {\n this.recognition.stop();\n } catch(e) {}\n \n this.isRecording = false;\n this.startBtn.setIcon(\"sap-icon://microphone\");\n this.startBtn.setText(\"Start Dictation\");\n this.startBtn.setType(\"Emphasized\");\n }\n\n /**\n * Lifecycle hook called before the control is rendered to the DOM.\n * Handles browser support visual state.\n */\n public onBeforeRendering(): void {\n const readOnly = this.getProperty(\"readOnly\");\n this.textArea.setEditable(!readOnly);\n \n // Only enable if it's not readonly AND the browser supports speech recognition\n this.startBtn.setEnabled(!readOnly && !!this.recognition);\n\n const currentVal = this.getProperty(\"value\");\n if (currentVal !== undefined && currentVal !== null) {\n // Only update text area if we aren't currently dictating interim results\n if (!this.isRecording) {\n this.textArea.setValue(currentVal as string);\n }\n }\n }\n\n /**\n * Cleans up hardware event listeners when the control is destroyed.\n */\n public exit(): void {\n this.stopDictation();\n if (this.recognition) {\n this.recognition.onstart = null;\n this.recognition.onresult = null;\n this.recognition.onerror = null;\n this.recognition.onend = null;\n this.recognition = null;\n }\n super.exit();\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"VoiceInputControl.js","names":["BaseHardwareControl","_interopRequireDefault","__BaseHardwareControl","Logger","___utils_Logger","VoiceInputControl","static","properties","events","recognition","isRecording","init","super","this","textArea","TextArea","rows","width","placeholder","liveChange","oEvent","setValueAndFire","getParameter","startBtn","Button","icon","text","type","press","toggleDictation","bind","hBox","HBox","items","addStyleClass","vBox","VBox","setAggregation","initSpeechRecognition","stopDictation","startDictation","SpeechRecognitionClass","window","SpeechRecognition","webkitSpeechRecognition","continuous","interimResults","onresult","event","finalTranscript","interimTranscript","i","resultIndex","results","length","isFinal","transcript","currentVal","getValue","newVal","setValue","onstart","setIcon","setText","setType","MessageToast","show","onerror","error","sap","ui","require","MessageBox","onend","warn","setEnabled","setTooltip","start","err","message","String","stop","e","onBeforeRendering","readOnly","getProperty","setEditable","undefined","exit"],"sources":["VoiceInputControl.ts"],"sourcesContent":["import BaseHardwareControl from \"./BaseHardwareControl\";\nimport Button from \"sap/m/Button\";\nimport VBox from \"sap/m/VBox\";\nimport TextArea from \"sap/m/TextArea\";\nimport MessageToast from \"sap/m/MessageToast\";\nimport HBox from \"sap/m/HBox\";\nimport { Logger } from \"../utils/Logger\";\n\ndeclare global {\n interface Window {\n SpeechRecognition: new () => SpeechRecognition;\n webkitSpeechRecognition: new () => SpeechRecognition;\n }\n interface SpeechRecognition {\n continuous: boolean;\n interimResults: boolean;\n onresult: (event: SpeechRecognitionEvent) => void;\n onstart: () => void;\n onerror: (event: SpeechRecognitionErrorEvent) => void;\n onend: () => void;\n start(): void;\n stop(): void;\n }\n interface SpeechRecognitionEvent {\n resultIndex: number;\n results: {\n length: number;\n [index: number]: {\n isFinal: boolean;\n [index: number]: {\n transcript: string;\n };\n };\n };\n }\n interface SpeechRecognitionErrorEvent {\n error: string;\n }\n}\n\n/**\n * VoiceInputControl\n * Provides a UI to dictate text using the browser's native Web Speech API.\n */\nexport default class VoiceInputControl extends BaseHardwareControl {\n static readonly renderer = \"nz.co.siliconst.ui5.metaui.controls.BaseHardwareControlRenderer\";\n static readonly metadata = {\n properties: {},\n events: {}\n };\n\n private vBox!: VBox;\n private textArea!: TextArea;\n private startBtn!: Button;\n private stopBtn!: Button;\n \n private recognition: SpeechRecognition | null = null;\n private isRecording: boolean = false;\n\n /**\n * Initializes the dictation interface and requests Web Speech API setup.\n */\n public init(): void {\n super.init();\n\n this.textArea = new TextArea({\n rows: 3,\n width: \"100%\",\n placeholder: \"Dictated text will appear here...\",\n liveChange: (oEvent: sap.ui.base.Event) => {\n this.setValueAndFire(oEvent.getParameter(\"value\"));\n }\n });\n\n this.startBtn = new Button({\n icon: \"sap-icon://microphone\",\n text: \"Start Dictation\",\n type: \"Emphasized\",\n press: this.toggleDictation.bind(this)\n });\n\n const hBox = new HBox({\n items: [this.startBtn]\n }).addStyleClass(\"sapUiSmallMarginTop\");\n\n this.vBox = new VBox({\n items: [this.textArea, hBox]\n });\n\n this.setAggregation(\"_content\", this.vBox);\n this.initSpeechRecognition();\n }\n\n private toggleDictation(): void {\n if (this.isRecording) {\n this.stopDictation();\n } else {\n this.startDictation();\n }\n }\n\n private initSpeechRecognition(): void {\n const SpeechRecognitionClass = window.SpeechRecognition || window.webkitSpeechRecognition;\n if (SpeechRecognitionClass) {\n this.recognition = new SpeechRecognitionClass();\n this.recognition.continuous = true;\n this.recognition.interimResults = true;\n\n this.recognition.onresult = (event: SpeechRecognitionEvent) => {\n let finalTranscript = \"\";\n let interimTranscript = \"\";\n\n for (let i = event.resultIndex; i < event.results.length; ++i) {\n if (event.results[i].isFinal) {\n finalTranscript += event.results[i][0].transcript;\n } else {\n interimTranscript += event.results[i][0].transcript;\n }\n }\n\n // Append the new final transcript to whatever was already in the textarea\n const currentVal = this.getValue() || \"\";\n const newVal = currentVal ? currentVal + \" \" + finalTranscript : finalTranscript;\n \n if (finalTranscript) {\n this.textArea.setValue(newVal);\n this.setValueAndFire(newVal);\n } else if (interimTranscript) {\n // Just show interim temporarily in textarea without saving to model\n this.textArea.setValue(currentVal ? currentVal + \" \" + interimTranscript : interimTranscript);\n }\n };\n\n this.recognition.onstart = () => {\n this.isRecording = true;\n this.startBtn.setIcon(\"sap-icon://stop\");\n this.startBtn.setText(\"Stop Recording\");\n this.startBtn.setType(\"Reject\");\n MessageToast.show(\"Listening... Please speak now.\");\n };\n\n this.recognition.onerror = (event: SpeechRecognitionErrorEvent) => {\n Logger.error(\"Speech recognition error\", event.error, \"VoiceInputControl\");\n sap.ui.require([\"sap/m/MessageBox\"], (MessageBox: typeof import(\"sap/m/MessageBox\").default) => {\n MessageBox.error(\"Microphone Error: \" + event.error + \"\\n\\nPlease ensure you have a working microphone attached and have not blocked access in your browser settings.\");\n });\n this.stopDictation();\n };\n \n this.recognition.onend = () => {\n // If it ends natively (e.g. timeout), update UI\n this.stopDictation();\n };\n } else {\n Logger.warn(\"Web Speech API not supported in this browser.\", \"\", \"VoiceInputControl\");\n this.startBtn.setEnabled(false);\n this.startBtn.setTooltip(\"Speech Recognition is not supported in this browser.\");\n }\n }\n\n private startDictation(): void {\n if (!this.recognition) return;\n \n try {\n this.recognition.start();\n MessageToast.show(\"Requesting microphone access...\");\n // Provide immediate UI feedback in case browser delays the onstart event\n this.startBtn.setIcon(\"sap-icon://stop\");\n this.startBtn.setText(\"Requesting mic...\");\n this.startBtn.setType(\"Reject\");\n } catch (err) {\n const error = err as Error;\n Logger.error(\"Failed to start speech recognition\", error.message || String(error), \"VoiceInputControl\");\n sap.ui.require([\"sap/m/MessageBox\"], (MessageBox: typeof import(\"sap/m/MessageBox\").default) => {\n MessageBox.error(\"Failed to start dictation. Please ensure you have a working microphone and have granted browser permissions.\\n\\nDetails: \" + (error.message || String(error)));\n });\n this.stopDictation();\n }\n }\n\n private stopDictation(): void {\n if (!this.recognition) return;\n \n try {\n this.recognition.stop();\n } catch(e) {\n Logger.warn(\"Failed to gracefully stop speech recognition.\", String(e), \"VoiceInputControl\");\n }\n \n this.isRecording = false;\n this.startBtn.setIcon(\"sap-icon://microphone\");\n this.startBtn.setText(\"Start Dictation\");\n this.startBtn.setType(\"Emphasized\");\n }\n\n /**\n * Lifecycle hook called before the control is rendered to the DOM.\n * Handles browser support visual state.\n */\n public onBeforeRendering(): void {\n const readOnly = this.getProperty(\"readOnly\");\n this.textArea.setEditable(!readOnly);\n \n // Only enable if it's not readonly AND the browser supports speech recognition\n this.startBtn.setEnabled(!readOnly && !!this.recognition);\n\n const currentVal = this.getProperty(\"value\");\n if (currentVal !== undefined && currentVal !== null) {\n // Only update text area if we aren't currently dictating interim results\n if (!this.isRecording) {\n this.textArea.setValue(currentVal as string);\n }\n }\n }\n\n /**\n * Cleans up hardware event listeners when the control is destroyed.\n */\n public exit(): void {\n this.stopDictation();\n if (this.recognition) {\n this.recognition.onstart = null;\n this.recognition.onresult = null;\n this.recognition.onerror = null;\n this.recognition.onend = null;\n this.recognition = null;\n }\n super.exit();\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -6,6 +6,38 @@ import MessageToast from "sap/m/MessageToast";
|
|
|
6
6
|
import HBox from "sap/m/HBox";
|
|
7
7
|
import { Logger } from "../utils/Logger";
|
|
8
8
|
|
|
9
|
+
declare global {
|
|
10
|
+
interface Window {
|
|
11
|
+
SpeechRecognition: new () => SpeechRecognition;
|
|
12
|
+
webkitSpeechRecognition: new () => SpeechRecognition;
|
|
13
|
+
}
|
|
14
|
+
interface SpeechRecognition {
|
|
15
|
+
continuous: boolean;
|
|
16
|
+
interimResults: boolean;
|
|
17
|
+
onresult: (event: SpeechRecognitionEvent) => void;
|
|
18
|
+
onstart: () => void;
|
|
19
|
+
onerror: (event: SpeechRecognitionErrorEvent) => void;
|
|
20
|
+
onend: () => void;
|
|
21
|
+
start(): void;
|
|
22
|
+
stop(): void;
|
|
23
|
+
}
|
|
24
|
+
interface SpeechRecognitionEvent {
|
|
25
|
+
resultIndex: number;
|
|
26
|
+
results: {
|
|
27
|
+
length: number;
|
|
28
|
+
[index: number]: {
|
|
29
|
+
isFinal: boolean;
|
|
30
|
+
[index: number]: {
|
|
31
|
+
transcript: string;
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
interface SpeechRecognitionErrorEvent {
|
|
37
|
+
error: string;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
9
41
|
/**
|
|
10
42
|
* VoiceInputControl
|
|
11
43
|
* Provides a UI to dictate text using the browser's native Web Speech API.
|
|
@@ -22,7 +54,7 @@ export default class VoiceInputControl extends BaseHardwareControl {
|
|
|
22
54
|
private startBtn!: Button;
|
|
23
55
|
private stopBtn!: Button;
|
|
24
56
|
|
|
25
|
-
private recognition:
|
|
57
|
+
private recognition: SpeechRecognition | null = null;
|
|
26
58
|
private isRecording: boolean = false;
|
|
27
59
|
|
|
28
60
|
/**
|
|
@@ -68,13 +100,13 @@ export default class VoiceInputControl extends BaseHardwareControl {
|
|
|
68
100
|
}
|
|
69
101
|
|
|
70
102
|
private initSpeechRecognition(): void {
|
|
71
|
-
const
|
|
72
|
-
if (
|
|
73
|
-
this.recognition = new
|
|
103
|
+
const SpeechRecognitionClass = window.SpeechRecognition || window.webkitSpeechRecognition;
|
|
104
|
+
if (SpeechRecognitionClass) {
|
|
105
|
+
this.recognition = new SpeechRecognitionClass();
|
|
74
106
|
this.recognition.continuous = true;
|
|
75
107
|
this.recognition.interimResults = true;
|
|
76
108
|
|
|
77
|
-
this.recognition.onresult = (event:
|
|
109
|
+
this.recognition.onresult = (event: SpeechRecognitionEvent) => {
|
|
78
110
|
let finalTranscript = "";
|
|
79
111
|
let interimTranscript = "";
|
|
80
112
|
|
|
@@ -107,9 +139,9 @@ export default class VoiceInputControl extends BaseHardwareControl {
|
|
|
107
139
|
MessageToast.show("Listening... Please speak now.");
|
|
108
140
|
};
|
|
109
141
|
|
|
110
|
-
this.recognition.onerror = (event:
|
|
142
|
+
this.recognition.onerror = (event: SpeechRecognitionErrorEvent) => {
|
|
111
143
|
Logger.error("Speech recognition error", event.error, "VoiceInputControl");
|
|
112
|
-
sap.ui.require(["sap/m/MessageBox"], (MessageBox:
|
|
144
|
+
sap.ui.require(["sap/m/MessageBox"], (MessageBox: typeof import("sap/m/MessageBox").default) => {
|
|
113
145
|
MessageBox.error("Microphone Error: " + event.error + "\n\nPlease ensure you have a working microphone attached and have not blocked access in your browser settings.");
|
|
114
146
|
});
|
|
115
147
|
this.stopDictation();
|
|
@@ -136,10 +168,11 @@ export default class VoiceInputControl extends BaseHardwareControl {
|
|
|
136
168
|
this.startBtn.setIcon("sap-icon://stop");
|
|
137
169
|
this.startBtn.setText("Requesting mic...");
|
|
138
170
|
this.startBtn.setType("Reject");
|
|
139
|
-
} catch (err
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
171
|
+
} catch (err) {
|
|
172
|
+
const error = err as Error;
|
|
173
|
+
Logger.error("Failed to start speech recognition", error.message || String(error), "VoiceInputControl");
|
|
174
|
+
sap.ui.require(["sap/m/MessageBox"], (MessageBox: typeof import("sap/m/MessageBox").default) => {
|
|
175
|
+
MessageBox.error("Failed to start dictation. Please ensure you have a working microphone and have granted browser permissions.\n\nDetails: " + (error.message || String(error)));
|
|
143
176
|
});
|
|
144
177
|
this.stopDictation();
|
|
145
178
|
}
|
|
@@ -150,7 +183,9 @@ export default class VoiceInputControl extends BaseHardwareControl {
|
|
|
150
183
|
|
|
151
184
|
try {
|
|
152
185
|
this.recognition.stop();
|
|
153
|
-
} catch(e) {
|
|
186
|
+
} catch(e) {
|
|
187
|
+
Logger.warn("Failed to gracefully stop speech recognition.", String(e), "VoiceInputControl");
|
|
188
|
+
}
|
|
154
189
|
|
|
155
190
|
this.isRecording = false;
|
|
156
191
|
this.startBtn.setIcon("sap-icon://microphone");
|
|
@@ -364,24 +364,16 @@ sap.ui.define(["sap/ui/core/Control", "../../utils/Logger", "../../core/SchemaNo
|
|
|
364
364
|
},
|
|
365
365
|
/**
|
|
366
366
|
* The core rendering pipeline entry point.
|
|
367
|
-
*
|
|
368
|
-
* Delays execution by 50ms to allow all synchronous property bindings to settle before orchestrating the build.
|
|
367
|
+
* Uses Promise resolution to debounce concurrent or rapid consecutive calls natively without arbitrary timeouts.
|
|
369
368
|
* @returns Promise that resolves when the layout is successfully built and mounted.
|
|
370
369
|
*/
|
|
371
370
|
generate: async function _generate() {
|
|
372
|
-
return
|
|
373
|
-
|
|
374
|
-
|
|
371
|
+
return Promise.resolve().then(async () => {
|
|
372
|
+
try {
|
|
373
|
+
await this._doGenerate();
|
|
374
|
+
} catch (e) {
|
|
375
|
+
Logger.error("[MetaUI]", "Error in deferred generate: " + e, "GeneratorHost");
|
|
375
376
|
}
|
|
376
|
-
this._generateTimeoutId = window.setTimeout(async () => {
|
|
377
|
-
this._generateTimeoutId = null;
|
|
378
|
-
try {
|
|
379
|
-
await this._doGenerate();
|
|
380
|
-
} catch (e) {
|
|
381
|
-
Logger.error("[MetaUI]", "Error in deferred generate: " + e, "GeneratorHost");
|
|
382
|
-
}
|
|
383
|
-
resolve();
|
|
384
|
-
}, 50);
|
|
385
377
|
});
|
|
386
378
|
},
|
|
387
379
|
/**
|