@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DynamicHost.js","names":["GeneratorHost","_interopRequireDefault","__GeneratorHost","Logger","___utils_Logger","ODataDelegate","___host_delegates_ODataDelegate","DynamicHost","Control","extend","constructor","prototype","apply","this","arguments","_innerHost","odataDelegate","_initializedInner","renderer","apiVersion","render","rm","control","openStart","style","openEnd","content","getAggregation","renderControl","close","metadata","properties","schemaDefinition","type","defaultValue","data","bindable","dataJson","liveUpdate","isValid","useMessageManager","modelName","debugMode","editable","aggregations","_content","multiple","visibility","events","beforeSubmit","parameters","payload","addError","preventDefault","submit","payloadJson","cancel","fieldChange","fieldPath","value","validationStateChanged","validationError","message","validationSuccess","initODataDelegate","_initODataDelegate","oContext","getBindingContext","debug","getPath","requestObject","getObject","syncToEngine","Object","keys","setBindingContext","_setBindingContext","sModelName","Control.prototype.setBindingContext.call","bindElement","_bindElement","vPath","mParameters","Control.prototype.bindElement.call","model","undefined","oBinding","getElementBinding","attachChange","onBeforeRendering","_onBeforeRendering","schema","getProperty","hasSchema","hasData","props","getMetadata","getProperties","propName","val","Control.prototype.getProperty.call","setProperty","setAggregation","getEvents","eventName","attachEvent","oEvent","params","getParameters","Control.prototype.setProperty.call","str","JSON","stringify","handleFieldChange","fireEvent","_setProperty","propertyName","suppressInvalidate","openInDialog","_openInDialog","title","submitButtonText","cancelButtonText","triggerSubmit","_triggerSubmit","_getProperty"],"sources":["DynamicHost.ts"],"sourcesContent":["import Control from \"sap/ui/core/Control\";\nimport RenderManager from \"sap/ui/core/RenderManager\";\nimport GeneratorHost from \"./host/GeneratorHost\";\nimport { Logger } from \"../utils/Logger\";\nimport { ODataDelegate } from \"./host/delegates/ODataDelegate\";\n\n/**\n * A transparent wrapper control (Facade) that automatically chooses between Explicit Schema Mode \n * and Inference Mode based on the presence of a 'schemaDefinition'.\n * \n * This maintains total architectural separation of the modes without forcing developers to \n * use different XML tags.\n * \n * @namespace nz.co.siliconst.ui5.metaui.controls\n */\nexport default class DynamicHost extends Control {\n private _innerHost: GeneratorHost | null = null;\n private odataDelegate: ODataDelegate | null = null;\n private _initializedInner: boolean = false;\n\n static readonly metadata = {\n properties: {\n schemaDefinition: { type: \"any\", defaultValue: null },\n data: { type: \"object\", defaultValue: null, bindable: \"bindable\" },\n dataJson: { type: \"string\", defaultValue: null, bindable: \"bindable\" },\n liveUpdate: { type: \"boolean\", defaultValue: false },\n isValid: { type: \"boolean\", defaultValue: true },\n useMessageManager: { type: \"boolean\", defaultValue: false },\n modelName: { type: \"string\", defaultValue: \"meta\" },\n debugMode: { type: \"boolean\", defaultValue: false },\n editable: { type: \"boolean\", defaultValue: true }\n },\n aggregations: {\n _content: { type: \"sap.ui.core.Control\", multiple: false, visibility: \"hidden\" }\n },\n events: {\n beforeSubmit: {\n parameters: {\n payload: { type: \"object\" },\n addError: { type: \"function\" },\n preventDefault: { type: \"function\" }\n }\n },\n submit: {\n parameters: {\n payload: { type: \"object\" },\n payloadJson: { type: \"string\" }\n }\n },\n cancel: {},\n fieldChange: {\n parameters: {\n fieldPath: { type: \"string\" },\n value: { type: \"any\" },\n payload: { type: \"object\" },\n isValid: { type: \"boolean\" }\n }\n },\n validationStateChanged: { parameters: { isValid: { type: \"boolean\" } } },\n validationError: { parameters: { fieldPath: { type: \"string\" }, message: { type: \"string\" } } },\n validationSuccess: { parameters: { fieldPath: { type: \"string\" } } }\n }\n };\n\n static renderer = {\n apiVersion: 2,\n render(rm: RenderManager, control: DynamicHost) {\n rm.openStart(\"div\", control);\n rm.style(\"width\", \"100%\");\n rm.style(\"height\", \"100%\");\n rm.openEnd();\n\n const content = control.getAggregation(\"_content\") as Control;\n if (content) {\n rm.renderControl(content);\n }\n\n rm.close(\"div\");\n }\n };\n\n /**\n * Internal reference to the generated inner host instance.\n * @private\n */\n private _innerHost: GeneratorHost | null = null;\n \n /**\n * Flag indicating if the inner host has been initialized.\n * @private\n */\n private _initializedInner: boolean = false;\n\n /**\n * Initializes the OData Delegate if an OData context is detected.\n * This allows DynamicHost to seamlessly synchronize metadata and properties from an OData model.\n * @private\n */\n private initODataDelegate(): void {\n if (!this.odataDelegate) {\n const oContext = this.getBindingContext(\"odata\") || this.getBindingContext();\n if (oContext) {\n Logger.debug(\"[MetaUI DynamicHost]\", `Context found for delegate initialization: ${oContext.getPath()}`, \"DynamicHost\");\n if (typeof (oContext as any).requestObject === \"function\" || typeof (oContext as any).getObject === \"function\") {\n Logger.debug(\"[MetaUI DynamicHost]\", `Context supports requestObject/getObject. Instantiating ODataDelegate.`, \"DynamicHost\");\n this.odataDelegate = new ODataDelegate(this, oContext as any);\n this.odataDelegate.syncToEngine();\n } else {\n Logger.debug(\"[MetaUI DynamicHost]\", `Context does NOT support requestObject/getObject! Keys: ${Object.keys(oContext)}`, \"DynamicHost\");\n }\n }\n }\n }\n\n /**\n * Standard UI5 method override.\n * Sets the binding context for the control and attempts to initialize the OData delegate\n * if the context points to an OData model.\n * \n * @param {sap.ui.model.Context | null | undefined} oContext The binding context object\n * @param {string} [sModelName] Optional model name\n * @returns {this} The control instance for chaining\n */\n public setBindingContext(oContext: sap.ui.model.Context | null | undefined, sModelName?: string): this {\n super.setBindingContext(oContext, sModelName);\n this.initODataDelegate();\n return this;\n }\n\n /**\n * Standard UI5 method override.\n * Binds the element to the given path and attaches a change listener to re-evaluate\n * the OData delegate when the element binding resolves.\n * \n * @param {string | any} vPath The binding path or configuration object\n * @param {object} [mParameters] Optional binding parameters\n * @returns {this} The control instance for chaining\n */\n public bindElement(vPath: string | any, mParameters?: object): this {\n super.bindElement(vPath, mParameters);\n const sModelName = typeof vPath === \"object\" ? vPath.model : undefined;\n const oBinding = this.getElementBinding(sModelName);\n if (oBinding) {\n oBinding.attachChange(() => {\n this.initODataDelegate();\n });\n }\n return this;\n }\n\n /**\n * Standard UI5 Lifecycle Hook.\n * Evaluates the initial properties and spawns the GeneratorHost.\n * It handles the complex lifecycle task of copying all bindings, raw properties, and event listeners \n * down to the inner host perfectly transparently.\n */\n public onBeforeRendering(): void {\n Logger.debug(\"[MetaUI DynamicHost]\", `onBeforeRendering called. _initializedInner: ${this._initializedInner}`, \"DynamicHost\");\n\n this.initODataDelegate();\n\n if (!this._initializedInner) {\n const schema = this.getProperty(\"schemaDefinition\");\n const dataJson = this.getProperty(\"dataJson\");\n const data = this.getProperty(\"data\");\n\n const hasSchema = !!schema;\n const hasData = !!dataJson || !!data;\n\n Logger.debug(\"[MetaUI DynamicHost]\", `Evaluating boot. hasSchema: ${hasSchema}, hasData: ${hasData}`, \"DynamicHost\");\n\n // Only boot if we have either a schema or some data to infer from\n if (hasSchema || hasData) {\n if (this.getProperty(\"debugMode\")) {\n Logger.debug(\"[MetaUI DynamicHost]\", `Booting inner host. hasSchema: ${hasSchema}, hasData: ${hasData}`, \"DynamicHost\");\n }\n // The architectural Facade router logic:\n // We've simplified this! We no longer use HostFactory or separate subclasses.\n // GeneratorHost is fully capable of inferring the schema if none is provided.\n this._innerHost = new GeneratorHost();\n\n // 1. Forward all static values to the spawned host BEFORE mounting.\n // Since we no longer use bindProperty, it's perfectly safe to set raw properties before mounting.\n const props = this.getMetadata().getProperties();\n for (const propName in props) {\n const val = super.getProperty(propName);\n if (val !== null && val !== undefined) {\n this._innerHost.setProperty(propName, val);\n }\n }\n\n // 2. Mount so it inherits models and triggers lifecycle.\n this.setAggregation(\"_content\", this._innerHost);\n\n // 3. Forward all event subscriptions.\n // By proxying the events upwards, the developer can subscribe to `<meta:DynamicHost submit=\"...\">` \n // and perfectly receive the inner host's submission event.\n const events = this.getMetadata().getEvents();\n for (const eventName in events) {\n this._innerHost.attachEvent(eventName, (oEvent: any) => {\n // Natively push updated payload out to any bound Fiori Element properties.\n // Using super.setProperty prevents an infinite loop back down to _innerHost.\n if (eventName === \"submit\" || eventName === \"fieldChange\") {\n const params = oEvent.getParameters();\n if (params.payload) {\n super.setProperty(\"data\", params.payload, true);\n\n const str = params.payloadJson || JSON.stringify(params.payload, null, 2);\n super.setProperty(\"dataJson\", str, true);\n }\n if (eventName === \"fieldChange\" && this.odataDelegate) {\n this.odataDelegate.handleFieldChange(params.fieldPath, params.value);\n }\n }\n this.fireEvent(eventName, oEvent.getParameters());\n });\n }\n\n this._initializedInner = true;\n }\n }\n }\n\n /**\n * Overrides standard UI5 setProperty to act as a transparent proxy.\n * When a property is updated on the wrapper (either programmatically or via a binding update),\n * it instantly mirrors that value down to the inner instantiated host.\n */\n public setProperty(propertyName: string, value: unknown, suppressInvalidate?: boolean): this {\n if (propertyName === \"data\" || propertyName === \"dataJson\" || propertyName === \"schemaDefinition\") {\n if (this.getProperty(\"debugMode\")) {\n Logger.debug(\"[MetaUI DynamicHost]\", `Wrapper received setProperty: ${propertyName}`, \"DynamicHost\");\n }\n }\n super.setProperty(propertyName, value, suppressInvalidate);\n if (this._innerHost) {\n this._innerHost.setProperty(propertyName, value, suppressInvalidate);\n } else if (propertyName === \"data\" || propertyName === \"dataJson\" || propertyName === \"schemaDefinition\") {\n if (this.getProperty(\"debugMode\")) {\n Logger.debug(\"[MetaUI DynamicHost]\", `_innerHost not yet initialized when ${propertyName} was set. Booting will happen on next render.`, \"DynamicHost\");\n }\n }\n return this;\n }\n\n\n\n\n\n /**\n * Programmatic API support. Routes dialog commands down to the spawned inner host.\n * If the inner host has not booted yet, it forces initialization immediately.\n * \n * @param {string} [title=\"Form\"] The title of the dialog\n * @param {string} [submitButtonText=\"OK\"] The text for the primary action button\n * @param {string} [cancelButtonText=\"Cancel\"] The text for the cancel button\n */\n public openInDialog(title?: string, submitButtonText?: string, cancelButtonText?: string): void {\n if (!this._innerHost) {\n this.onBeforeRendering(); // Force init if they bypassed UI5 rendering\n }\n this._innerHost?.openInDialog(title, submitButtonText, cancelButtonText);\n }\n\n /**\n * Proxies submission triggering down to the instantiated generator host.\n * Evaluates the internal Engine validation suite and returns true if structurally sound.\n * \n * @returns {boolean} True if the internal payload passes schema validation, false otherwise.\n */\n public triggerSubmit(): boolean {\n if (!this._innerHost) {\n return false;\n }\n return (this._innerHost as any).triggerSubmit();\n }\n\n /**\n * Overrides standard UI5 getProperty to transparently pull extracted data from the inner host.\n * Ensures that querying the DynamicHost facade for `data` always yields the freshest payload.\n * \n * @param {string} propertyName The name of the property to retrieve\n * @returns {any} The property value\n */\n public getProperty(propertyName: string): any {\n if (this._innerHost && (propertyName === \"data\" || propertyName === \"dataJson\")) {\n return this._innerHost.getProperty(propertyName);\n }\n return super.getProperty(propertyName);\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"DynamicHost.js","names":["GeneratorHost","_interopRequireDefault","__GeneratorHost","Logger","___utils_Logger","ODataDelegate","___host_delegates_ODataDelegate","DynamicHost","Control","extend","constructor","prototype","apply","this","arguments","_innerHost","odataDelegate","_initializedInner","renderer","apiVersion","render","rm","control","openStart","style","openEnd","content","getAggregation","renderControl","close","metadata","properties","schemaDefinition","type","defaultValue","data","bindable","dataJson","liveUpdate","isValid","useMessageManager","modelName","debugMode","editable","aggregations","_content","multiple","visibility","events","beforeSubmit","parameters","payload","addError","preventDefault","submit","payloadJson","cancel","fieldChange","fieldPath","value","validationStateChanged","validationError","message","validationSuccess","initODataDelegate","_initODataDelegate","oContext","getBindingContext","debug","getPath","requestObject","syncToEngine","Object","keys","setBindingContext","_setBindingContext","sModelName","Control.prototype.setBindingContext.call","bindElement","_bindElement","vPath","mParameters","Control.prototype.bindElement.call","model","undefined","oBinding","getElementBinding","attachChange","onBeforeRendering","_onBeforeRendering","schema","getProperty","hasSchema","hasData","props","getMetadata","getProperties","propName","val","Control.prototype.getProperty.call","setProperty","setAggregation","getEvents","eventName","attachEvent","oEvent","params","getParameters","Control.prototype.setProperty.call","str","JSON","stringify","handleFieldChange","fireEvent","_setProperty","propertyName","suppressInvalidate","openInDialog","_openInDialog","title","submitButtonText","cancelButtonText","triggerSubmit","_triggerSubmit","_getProperty"],"sources":["DynamicHost.ts"],"sourcesContent":["import Control from \"sap/ui/core/Control\";\nimport RenderManager from \"sap/ui/core/RenderManager\";\nimport GeneratorHost from \"./host/GeneratorHost\";\nimport { Logger } from \"../utils/Logger\";\nimport { ODataDelegate } from \"./host/delegates/ODataDelegate\";\nimport ODataV4Context from \"sap/ui/model/odata/v4/Context\";\n\n/**\n * A transparent wrapper control (Facade) that automatically chooses between Explicit Schema Mode \n * and Inference Mode based on the presence of a 'schemaDefinition'.\n * \n * This maintains total architectural separation of the modes without forcing developers to \n * use different XML tags.\n * \n * @namespace nz.co.siliconst.ui5.metaui.controls\n */\nexport default class DynamicHost extends Control {\n private _innerHost: GeneratorHost | null = null;\n private odataDelegate: ODataDelegate | null = null;\n private _initializedInner: boolean = false;\n\n static readonly metadata = {\n properties: {\n schemaDefinition: { type: \"any\", defaultValue: null },\n data: { type: \"object\", defaultValue: null, bindable: \"bindable\" },\n dataJson: { type: \"string\", defaultValue: null, bindable: \"bindable\" },\n liveUpdate: { type: \"boolean\", defaultValue: false },\n isValid: { type: \"boolean\", defaultValue: true },\n useMessageManager: { type: \"boolean\", defaultValue: false },\n modelName: { type: \"string\", defaultValue: \"meta\" },\n debugMode: { type: \"boolean\", defaultValue: false },\n editable: { type: \"boolean\", defaultValue: true }\n },\n aggregations: {\n _content: { type: \"sap.ui.core.Control\", multiple: false, visibility: \"hidden\" }\n },\n events: {\n beforeSubmit: {\n parameters: {\n payload: { type: \"object\" },\n addError: { type: \"function\" },\n preventDefault: { type: \"function\" }\n }\n },\n submit: {\n parameters: {\n payload: { type: \"object\" },\n payloadJson: { type: \"string\" }\n }\n },\n cancel: {},\n fieldChange: {\n parameters: {\n fieldPath: { type: \"string\" },\n value: { type: \"any\" },\n payload: { type: \"object\" },\n isValid: { type: \"boolean\" }\n }\n },\n validationStateChanged: { parameters: { isValid: { type: \"boolean\" } } },\n validationError: { parameters: { fieldPath: { type: \"string\" }, message: { type: \"string\" } } },\n validationSuccess: { parameters: { fieldPath: { type: \"string\" } } }\n }\n };\n\n static renderer = {\n apiVersion: 2,\n render(rm: RenderManager, control: DynamicHost) {\n rm.openStart(\"div\", control);\n rm.style(\"width\", \"100%\");\n rm.style(\"height\", \"100%\");\n rm.openEnd();\n\n const content = control.getAggregation(\"_content\") as Control;\n if (content) {\n rm.renderControl(content);\n }\n\n rm.close(\"div\");\n }\n };\n\n /**\n * Internal reference to the generated inner host instance.\n * @private\n */\n private _innerHost: GeneratorHost | null = null;\n \n /**\n * Flag indicating if the inner host has been initialized.\n * @private\n */\n private _initializedInner: boolean = false;\n\n /**\n * Initializes the OData Delegate if an OData context is detected.\n * This allows DynamicHost to seamlessly synchronize metadata and properties from an OData model.\n * @private\n */\n private initODataDelegate(): void {\n if (!this.odataDelegate) {\n const oContext = this.getBindingContext(\"odata\") || this.getBindingContext();\n if (oContext) {\n Logger.debug(\"[MetaUI DynamicHost]\", `Context found for delegate initialization: ${oContext.getPath()}`, \"DynamicHost\");\n if (oContext && (oContext as ODataV4Context).requestObject && typeof (oContext as ODataV4Context).requestObject === \"function\") {\n Logger.debug(\"[MetaUI DynamicHost]\", `Context supports requestObject/getObject. Instantiating ODataDelegate.`, \"DynamicHost\");\n this.odataDelegate = new ODataDelegate(this, oContext as ODataV4Context);\n this.odataDelegate.syncToEngine();\n } else {\n Logger.debug(\"[MetaUI DynamicHost]\", `Context does NOT support requestObject/getObject! Keys: ${Object.keys(oContext)}`, \"DynamicHost\");\n }\n }\n }\n }\n\n /**\n * Standard UI5 method override.\n * Sets the binding context for the control and attempts to initialize the OData delegate\n * if the context points to an OData model.\n * \n * @param {sap.ui.model.Context | null | undefined} oContext The binding context object\n * @param {string} [sModelName] Optional model name\n * @returns {this} The control instance for chaining\n */\n public setBindingContext(oContext: sap.ui.model.Context | null | undefined, sModelName?: string): this {\n super.setBindingContext(oContext, sModelName);\n this.initODataDelegate();\n return this;\n }\n\n /**\n * Standard UI5 method override.\n * Binds the element to the given path and attaches a change listener to re-evaluate\n * the OData delegate when the element binding resolves.\n * \n * @param {string | Record<string, unknown>} vPath The binding path or configuration object\n * @param {object} [mParameters] Optional mapping parameters\n * @returns {this} Reference to this instance for chaining\n */\n public bindElement(vPath: string | Record<string, unknown>, mParameters?: object): this {\n super.bindElement(vPath, mParameters);\n const sModelName = typeof vPath === \"object\" ? vPath.model : undefined;\n const oBinding = this.getElementBinding(sModelName);\n if (oBinding) {\n oBinding.attachChange(() => {\n this.initODataDelegate();\n });\n }\n return this;\n }\n\n /**\n * Standard UI5 Lifecycle Hook.\n * Evaluates the initial properties and spawns the GeneratorHost.\n * It handles the complex lifecycle task of copying all bindings, raw properties, and event listeners \n * down to the inner host perfectly transparently.\n */\n public onBeforeRendering(): void {\n Logger.debug(\"[MetaUI DynamicHost]\", `onBeforeRendering called. _initializedInner: ${this._initializedInner}`, \"DynamicHost\");\n\n this.initODataDelegate();\n\n if (!this._initializedInner) {\n const schema = this.getProperty(\"schemaDefinition\");\n const dataJson = this.getProperty(\"dataJson\");\n const data = this.getProperty(\"data\");\n\n const hasSchema = !!schema;\n const hasData = !!dataJson || !!data;\n\n Logger.debug(\"[MetaUI DynamicHost]\", `Evaluating boot. hasSchema: ${hasSchema}, hasData: ${hasData}`, \"DynamicHost\");\n\n // Only boot if we have either a schema or some data to infer from\n if (hasSchema || hasData) {\n if (this.getProperty(\"debugMode\")) {\n Logger.debug(\"[MetaUI DynamicHost]\", `Booting inner host. hasSchema: ${hasSchema}, hasData: ${hasData}`, \"DynamicHost\");\n }\n // The architectural Facade router logic:\n // We've simplified this! We no longer use HostFactory or separate subclasses.\n // GeneratorHost is fully capable of inferring the schema if none is provided.\n this._innerHost = new GeneratorHost();\n\n // 1. Forward all static values to the spawned host BEFORE mounting.\n // Since we no longer use bindProperty, it's perfectly safe to set raw properties before mounting.\n const props = this.getMetadata().getProperties();\n for (const propName in props) {\n const val = super.getProperty(propName);\n if (val !== null && val !== undefined) {\n this._innerHost.setProperty(propName, val);\n }\n }\n\n // 2. Mount so it inherits models and triggers lifecycle.\n this.setAggregation(\"_content\", this._innerHost);\n\n // 3. Forward all event subscriptions.\n // By proxying the events upwards, the developer can subscribe to `<meta:DynamicHost submit=\"...\">` \n // and perfectly receive the inner host's submission event.\n const events = this.getMetadata().getEvents();\n for (const eventName in events) {\n this._innerHost.attachEvent(eventName, (oEvent: sap.ui.base.Event) => {\n // Natively push updated payload out to any bound Fiori Element properties.\n // Using super.setProperty prevents an infinite loop back down to _innerHost.\n if (eventName === \"submit\" || eventName === \"fieldChange\") {\n const params = oEvent.getParameters();\n if (params.payload) {\n super.setProperty(\"data\", params.payload, true);\n\n const str = params.payloadJson || JSON.stringify(params.payload, null, 2);\n super.setProperty(\"dataJson\", str, true);\n }\n if (eventName === \"fieldChange\" && this.odataDelegate) {\n this.odataDelegate.handleFieldChange(params.fieldPath, params.value);\n }\n }\n this.fireEvent(eventName, oEvent.getParameters());\n });\n }\n\n this._initializedInner = true;\n }\n }\n }\n\n /**\n * Overrides standard UI5 setProperty to act as a transparent proxy.\n * When a property is updated on the wrapper (either programmatically or via a binding update),\n * it instantly mirrors that value down to the inner instantiated host.\n */\n public setProperty(propertyName: string, value: unknown, suppressInvalidate?: boolean): this {\n if (propertyName === \"data\" || propertyName === \"dataJson\" || propertyName === \"schemaDefinition\") {\n if (this.getProperty(\"debugMode\")) {\n Logger.debug(\"[MetaUI DynamicHost]\", `Wrapper received setProperty: ${propertyName}`, \"DynamicHost\");\n }\n }\n super.setProperty(propertyName, value, suppressInvalidate);\n if (this._innerHost) {\n this._innerHost.setProperty(propertyName, value, suppressInvalidate);\n } else if (propertyName === \"data\" || propertyName === \"dataJson\" || propertyName === \"schemaDefinition\") {\n if (this.getProperty(\"debugMode\")) {\n Logger.debug(\"[MetaUI DynamicHost]\", `_innerHost not yet initialized when ${propertyName} was set. Booting will happen on next render.`, \"DynamicHost\");\n }\n }\n return this;\n }\n\n\n\n\n\n /**\n * Programmatic API support. Routes dialog commands down to the spawned inner host.\n * If the inner host has not booted yet, it forces initialization immediately.\n * \n * @param {string} [title=\"Form\"] The title of the dialog\n * @param {string} [submitButtonText=\"OK\"] The text for the primary action button\n * @param {string} [cancelButtonText=\"Cancel\"] The text for the cancel button\n */\n public openInDialog(title?: string, submitButtonText?: string, cancelButtonText?: string): void {\n if (!this._innerHost) {\n this.onBeforeRendering(); // Force init if they bypassed UI5 rendering\n }\n this._innerHost?.openInDialog(title, submitButtonText, cancelButtonText);\n }\n\n /**\n * Proxies submission triggering down to the instantiated generator host.\n * Evaluates the internal Engine validation suite and returns true if structurally sound.\n * \n * @returns {boolean} True if the internal payload passes schema validation, false otherwise.\n */\n public triggerSubmit(): boolean {\n if (!this._innerHost) {\n return false;\n }\n return this._innerHost.triggerSubmit();\n }\n\n /**\n * Overrides standard UI5 getProperty to transparently pull extracted data from the inner host.\n * Ensures that querying the DynamicHost facade for `data` always yields the freshest payload.\n * \n * @param {string} propertyName The name of the property to retrieve\n * @returns {unknown} The property value\n */\n public getProperty(propertyName: string): unknown {\n if (propertyName === \"outputData\") {\n propertyName = \"data\"; // Forward deprecated outputData to data\n }\n if (this._innerHost && (propertyName === \"data\" || propertyName === \"dataJson\")) {\n return this._innerHost.getProperty(propertyName);\n }\n return super.getProperty(propertyName);\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -3,6 +3,7 @@ import RenderManager from "sap/ui/core/RenderManager";
|
|
|
3
3
|
import GeneratorHost from "./host/GeneratorHost";
|
|
4
4
|
import { Logger } from "../utils/Logger";
|
|
5
5
|
import { ODataDelegate } from "./host/delegates/ODataDelegate";
|
|
6
|
+
import ODataV4Context from "sap/ui/model/odata/v4/Context";
|
|
6
7
|
|
|
7
8
|
/**
|
|
8
9
|
* A transparent wrapper control (Facade) that automatically chooses between Explicit Schema Mode
|
|
@@ -101,9 +102,9 @@ export default class DynamicHost extends Control {
|
|
|
101
102
|
const oContext = this.getBindingContext("odata") || this.getBindingContext();
|
|
102
103
|
if (oContext) {
|
|
103
104
|
Logger.debug("[MetaUI DynamicHost]", `Context found for delegate initialization: ${oContext.getPath()}`, "DynamicHost");
|
|
104
|
-
if (
|
|
105
|
+
if (oContext && (oContext as ODataV4Context).requestObject && typeof (oContext as ODataV4Context).requestObject === "function") {
|
|
105
106
|
Logger.debug("[MetaUI DynamicHost]", `Context supports requestObject/getObject. Instantiating ODataDelegate.`, "DynamicHost");
|
|
106
|
-
this.odataDelegate = new ODataDelegate(this, oContext as
|
|
107
|
+
this.odataDelegate = new ODataDelegate(this, oContext as ODataV4Context);
|
|
107
108
|
this.odataDelegate.syncToEngine();
|
|
108
109
|
} else {
|
|
109
110
|
Logger.debug("[MetaUI DynamicHost]", `Context does NOT support requestObject/getObject! Keys: ${Object.keys(oContext)}`, "DynamicHost");
|
|
@@ -132,11 +133,11 @@ export default class DynamicHost extends Control {
|
|
|
132
133
|
* Binds the element to the given path and attaches a change listener to re-evaluate
|
|
133
134
|
* the OData delegate when the element binding resolves.
|
|
134
135
|
*
|
|
135
|
-
* @param {string |
|
|
136
|
-
* @param {object} [mParameters] Optional
|
|
137
|
-
* @returns {this}
|
|
136
|
+
* @param {string | Record<string, unknown>} vPath The binding path or configuration object
|
|
137
|
+
* @param {object} [mParameters] Optional mapping parameters
|
|
138
|
+
* @returns {this} Reference to this instance for chaining
|
|
138
139
|
*/
|
|
139
|
-
public bindElement(vPath: string |
|
|
140
|
+
public bindElement(vPath: string | Record<string, unknown>, mParameters?: object): this {
|
|
140
141
|
super.bindElement(vPath, mParameters);
|
|
141
142
|
const sModelName = typeof vPath === "object" ? vPath.model : undefined;
|
|
142
143
|
const oBinding = this.getElementBinding(sModelName);
|
|
@@ -197,7 +198,7 @@ export default class DynamicHost extends Control {
|
|
|
197
198
|
// and perfectly receive the inner host's submission event.
|
|
198
199
|
const events = this.getMetadata().getEvents();
|
|
199
200
|
for (const eventName in events) {
|
|
200
|
-
this._innerHost.attachEvent(eventName, (oEvent:
|
|
201
|
+
this._innerHost.attachEvent(eventName, (oEvent: sap.ui.base.Event) => {
|
|
201
202
|
// Natively push updated payload out to any bound Fiori Element properties.
|
|
202
203
|
// Using super.setProperty prevents an infinite loop back down to _innerHost.
|
|
203
204
|
if (eventName === "submit" || eventName === "fieldChange") {
|
|
@@ -272,7 +273,7 @@ export default class DynamicHost extends Control {
|
|
|
272
273
|
if (!this._innerHost) {
|
|
273
274
|
return false;
|
|
274
275
|
}
|
|
275
|
-
return
|
|
276
|
+
return this._innerHost.triggerSubmit();
|
|
276
277
|
}
|
|
277
278
|
|
|
278
279
|
/**
|
|
@@ -280,9 +281,12 @@ export default class DynamicHost extends Control {
|
|
|
280
281
|
* Ensures that querying the DynamicHost facade for `data` always yields the freshest payload.
|
|
281
282
|
*
|
|
282
283
|
* @param {string} propertyName The name of the property to retrieve
|
|
283
|
-
* @returns {
|
|
284
|
+
* @returns {unknown} The property value
|
|
284
285
|
*/
|
|
285
|
-
public getProperty(propertyName: string):
|
|
286
|
+
public getProperty(propertyName: string): unknown {
|
|
287
|
+
if (propertyName === "outputData") {
|
|
288
|
+
propertyName = "data"; // Forward deprecated outputData to data
|
|
289
|
+
}
|
|
286
290
|
if (this._innerHost && (propertyName === "data" || propertyName === "dataJson")) {
|
|
287
291
|
return this._innerHost.getProperty(propertyName);
|
|
288
292
|
}
|
|
@@ -62,7 +62,7 @@ sap.ui.define(["./BaseHardwareControl", "./BaseHardwareControlRenderer", "sap/m/
|
|
|
62
62
|
* to the inner RichTextEditor, we prevent TinyMCE from tearing down its iframe
|
|
63
63
|
* and triggering expensive, redundant plugin boot sequences.
|
|
64
64
|
*
|
|
65
|
-
* @param {
|
|
65
|
+
* @param {unknown} val The new string value to bind
|
|
66
66
|
* @returns {this} The control instance for chaining
|
|
67
67
|
*/
|
|
68
68
|
setValue: function _setValue(val) {
|
|
@@ -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 {
|
|
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":[]}
|
|
@@ -35,10 +35,10 @@ declare module "nz/co/siliconst/ui5/metaui/controls/RichTextControl" {
|
|
|
35
35
|
* to the inner RichTextEditor, we prevent TinyMCE from tearing down its iframe
|
|
36
36
|
* and triggering expensive, redundant plugin boot sequences.
|
|
37
37
|
*
|
|
38
|
-
* @param {
|
|
38
|
+
* @param {unknown} val The new string value to bind
|
|
39
39
|
* @returns {this} The control instance for chaining
|
|
40
40
|
*/
|
|
41
|
-
setValue(val:
|
|
41
|
+
setValue(val: unknown): this;
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
44
|
//# sourceMappingURL=RichTextControl.d.ts.map
|
|
@@ -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,
|
|
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 +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 {
|
|
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":[]}
|
|
@@ -67,10 +67,10 @@ export default class RichTextControl extends BaseHardwareControl {
|
|
|
67
67
|
* to the inner RichTextEditor, we prevent TinyMCE from tearing down its iframe
|
|
68
68
|
* and triggering expensive, redundant plugin boot sequences.
|
|
69
69
|
*
|
|
70
|
-
* @param {
|
|
70
|
+
* @param {unknown} val The new string value to bind
|
|
71
71
|
* @returns {this} The control instance for chaining
|
|
72
72
|
*/
|
|
73
|
-
public setValue(val:
|
|
73
|
+
public setValue(val: unknown): this {
|
|
74
74
|
this.setProperty("value", val, true); // suppress re-rendering
|
|
75
75
|
if (this.richTextEditor && val !== undefined && val !== null) {
|
|
76
76
|
if (this.richTextEditor.getValue() !== val) {
|
|
@@ -18,7 +18,6 @@ sap.ui.define(["./BaseHardwareControl", "sap/m/Button", "sap/m/VBox", "sap/ui/co
|
|
|
18
18
|
isDrawing = false;
|
|
19
19
|
canvasCtx = null;
|
|
20
20
|
canvasEl = null;
|
|
21
|
-
|
|
22
21
|
/**
|
|
23
22
|
* Initializes the control and builds the canvas drawing surface.
|
|
24
23
|
*/
|
|
@@ -37,6 +36,11 @@ sap.ui.define(["./BaseHardwareControl", "sap/m/Button", "sap/m/VBox", "sap/ui/co
|
|
|
37
36
|
items: [this.canvasHtml, this.clearBtn]
|
|
38
37
|
});
|
|
39
38
|
this.setAggregation("_content", this.vBox);
|
|
39
|
+
this.boundStartDrawing = this.startDrawing.bind(this);
|
|
40
|
+
this.boundDraw = this.draw.bind(this);
|
|
41
|
+
this.boundStopDrawing = this.stopDrawing.bind(this);
|
|
42
|
+
this.boundStartDrawingTouch = this.startDrawingTouch.bind(this);
|
|
43
|
+
this.boundDrawTouch = this.drawTouch.bind(this);
|
|
40
44
|
}
|
|
41
45
|
onCanvasRendered() {
|
|
42
46
|
const domRef = this.canvasHtml.getDomRef();
|
|
@@ -50,19 +54,19 @@ sap.ui.define(["./BaseHardwareControl", "sap/m/Button", "sap/m/VBox", "sap/ui/co
|
|
|
50
54
|
}
|
|
51
55
|
|
|
52
56
|
// Mouse events
|
|
53
|
-
this.canvasEl.addEventListener("mousedown", this.
|
|
54
|
-
this.canvasEl.addEventListener("mousemove", this.
|
|
55
|
-
this.canvasEl.addEventListener("mouseup", this.
|
|
56
|
-
this.canvasEl.addEventListener("mouseout", this.
|
|
57
|
+
this.canvasEl.addEventListener("mousedown", this.boundStartDrawing);
|
|
58
|
+
this.canvasEl.addEventListener("mousemove", this.boundDraw);
|
|
59
|
+
this.canvasEl.addEventListener("mouseup", this.boundStopDrawing);
|
|
60
|
+
this.canvasEl.addEventListener("mouseout", this.boundStopDrawing);
|
|
57
61
|
|
|
58
62
|
// Touch events
|
|
59
|
-
this.canvasEl.addEventListener("touchstart", this.
|
|
63
|
+
this.canvasEl.addEventListener("touchstart", this.boundStartDrawingTouch, {
|
|
60
64
|
passive: false
|
|
61
65
|
});
|
|
62
|
-
this.canvasEl.addEventListener("touchmove", this.
|
|
66
|
+
this.canvasEl.addEventListener("touchmove", this.boundDrawTouch, {
|
|
63
67
|
passive: false
|
|
64
68
|
});
|
|
65
|
-
this.canvasEl.addEventListener("touchend", this.
|
|
69
|
+
this.canvasEl.addEventListener("touchend", this.boundStopDrawing);
|
|
66
70
|
|
|
67
71
|
// Restore existing signature if any
|
|
68
72
|
const val = this.getValue();
|
|
@@ -160,6 +164,24 @@ sap.ui.define(["./BaseHardwareControl", "sap/m/Button", "sap/m/VBox", "sap/ui/co
|
|
|
160
164
|
}
|
|
161
165
|
return this;
|
|
162
166
|
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Cleans up event listeners to prevent memory leaks when the control is destroyed.
|
|
170
|
+
*/
|
|
171
|
+
exit() {
|
|
172
|
+
if (this.canvasEl) {
|
|
173
|
+
this.canvasEl.removeEventListener("mousedown", this.boundStartDrawing);
|
|
174
|
+
this.canvasEl.removeEventListener("mousemove", this.boundDraw);
|
|
175
|
+
this.canvasEl.removeEventListener("mouseup", this.boundStopDrawing);
|
|
176
|
+
this.canvasEl.removeEventListener("mouseout", this.boundStopDrawing);
|
|
177
|
+
this.canvasEl.removeEventListener("touchstart", this.boundStartDrawingTouch);
|
|
178
|
+
this.canvasEl.removeEventListener("touchmove", this.boundDrawTouch);
|
|
179
|
+
this.canvasEl.removeEventListener("touchend", this.boundStopDrawing);
|
|
180
|
+
}
|
|
181
|
+
this.canvasEl = null;
|
|
182
|
+
this.canvasCtx = null;
|
|
183
|
+
super.exit();
|
|
184
|
+
}
|
|
163
185
|
}
|
|
164
186
|
return SignatureControl;
|
|
165
187
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SignatureControl-dbg.js","names":["BaseHardwareControl","_interopRequireDefault","__BaseHardwareControl","SignatureControl","renderer","metadata","properties","events","isDrawing","canvasCtx","canvasEl","init","canvasHtml","HTML","content","afterRendering","onCanvasRendered","bind","addStyleClass","clearBtn","Button","icon","text","press","clearSignature","vBox","VBox","items","setAggregation","domRef","getDomRef","getContext","lineWidth","lineCap","strokeStyle","addEventListener","startDrawing","draw","stopDrawing","startDrawingTouch","passive","drawTouch","val","getValue","startsWith","loadImageOntoCanvas","dataUrl","img","window","Image","onload","clearRect","width","height","drawImage","src","getCoordinates","e","x","y","rect","getBoundingClientRect","clientX","clientY","type","touches","left","top","preventDefault","pos","lineTo","stroke","beginPath","moveTo","saveSignature","setValueAndFire","MessageToast","show","toDataURL","setValue","value"],"sources":["SignatureControl.ts"],"sourcesContent":["import BaseHardwareControl from \"./BaseHardwareControl\";\nimport Button from \"sap/m/Button\";\nimport VBox from \"sap/m/VBox\";\nimport HTML from \"sap/ui/core/HTML\";\nimport MessageToast from \"sap/m/MessageToast\";\n\n/**\n * SignatureControl\n * Provides an HTML5 Canvas for capturing signatures.\n */\nexport default class SignatureControl extends BaseHardwareControl {\n static readonly renderer = \"nz.co.siliconst.ui5.metaui.controls.BaseHardwareControlRenderer\";\n static readonly metadata = {\n properties: {},\n events: {}\n };\n\n private vBox!: VBox;\n private clearBtn!: Button;\n private canvasHtml!: HTML;\n private isDrawing = false;\n private canvasCtx: CanvasRenderingContext2D | null = null;\n private canvasEl: HTMLCanvasElement | null = null;\n\n /**\n * Initializes the control and builds the canvas drawing surface.\n */\n public init(): void {\n super.init();\n\n this.canvasHtml = new HTML({\n content: \"<canvas width='400' height='200' style='border: 1px solid #ccc; background-color: #fff; touch-action: none; cursor: crosshair;'></canvas>\",\n afterRendering: this.onCanvasRendered.bind(this)\n }).addStyleClass(\"sapUiSmallMarginBottom\");\n\n this.clearBtn = new Button({\n icon: \"sap-icon://sys-cancel\",\n text: \"Clear Signature\",\n press: this.clearSignature.bind(this)\n });\n\n this.vBox = new VBox({\n items: [this.canvasHtml, this.clearBtn]\n });\n\n this.setAggregation(\"_content\", this.vBox);\n }\n\n private onCanvasRendered(): void {\n const domRef = this.canvasHtml.getDomRef() as HTMLElement;\n if (!domRef) return;\n \n this.canvasEl = domRef as HTMLCanvasElement;\n this.canvasCtx = this.canvasEl.getContext(\"2d\");\n if (this.canvasCtx) {\n this.canvasCtx.lineWidth = 2;\n this.canvasCtx.lineCap = \"round\";\n this.canvasCtx.strokeStyle = \"#000\";\n }\n\n // Mouse events\n this.canvasEl.addEventListener(\"mousedown\", this.startDrawing.bind(this));\n this.canvasEl.addEventListener(\"mousemove\", this.draw.bind(this));\n this.canvasEl.addEventListener(\"mouseup\", this.stopDrawing.bind(this));\n this.canvasEl.addEventListener(\"mouseout\", this.stopDrawing.bind(this));\n \n // Touch events\n this.canvasEl.addEventListener(\"touchstart\", this.startDrawingTouch.bind(this), { passive: false });\n this.canvasEl.addEventListener(\"touchmove\", this.drawTouch.bind(this), { passive: false });\n this.canvasEl.addEventListener(\"touchend\", this.stopDrawing.bind(this));\n\n // Restore existing signature if any\n const val = this.getValue();\n if (val && typeof val === \"string\" && val.startsWith(\"data:image\")) {\n this.loadImageOntoCanvas(val);\n }\n }\n\n private loadImageOntoCanvas(dataUrl: string): void {\n const img = new window.Image();\n img.onload = () => {\n if (this.canvasCtx && this.canvasEl) {\n this.canvasCtx.clearRect(0, 0, this.canvasEl.width, this.canvasEl.height);\n this.canvasCtx.drawImage(img, 0, 0, this.canvasEl.width, this.canvasEl.height);\n }\n };\n img.src = dataUrl;\n }\n\n private getCoordinates(e: MouseEvent | TouchEvent): { x: number, y: number } {\n if (!this.canvasEl) return { x: 0, y: 0 };\n const rect = this.canvasEl.getBoundingClientRect();\n \n let clientX, clientY;\n if (e.type.startsWith(\"touch\")) {\n clientX = (e as TouchEvent).touches[0].clientX;\n clientY = (e as TouchEvent).touches[0].clientY;\n } else {\n clientX = (e as MouseEvent).clientX;\n clientY = (e as MouseEvent).clientY;\n }\n \n return {\n x: clientX - rect.left,\n y: clientY - rect.top\n };\n }\n\n private startDrawing(e: MouseEvent): void {\n this.isDrawing = true;\n this.draw(e);\n }\n\n private startDrawingTouch(e: TouchEvent): void {\n e.preventDefault(); // Prevent scrolling\n this.isDrawing = true;\n this.drawTouch(e);\n }\n\n private draw(e: MouseEvent): void {\n if (!this.isDrawing || !this.canvasCtx) return;\n const pos = this.getCoordinates(e);\n this.canvasCtx.lineTo(pos.x, pos.y);\n this.canvasCtx.stroke();\n this.canvasCtx.beginPath();\n this.canvasCtx.moveTo(pos.x, pos.y);\n }\n\n private drawTouch(e: TouchEvent): void {\n if (!this.isDrawing || !this.canvasCtx) return;\n e.preventDefault(); // Prevent scrolling\n const pos = this.getCoordinates(e);\n this.canvasCtx.lineTo(pos.x, pos.y);\n this.canvasCtx.stroke();\n this.canvasCtx.beginPath();\n this.canvasCtx.moveTo(pos.x, pos.y);\n }\n\n private stopDrawing(): void {\n if (!this.isDrawing) return;\n this.isDrawing = false;\n if (this.canvasCtx) {\n this.canvasCtx.beginPath(); // Reset path\n this.saveSignature();\n }\n }\n\n private clearSignature(): void {\n if (this.canvasCtx && this.canvasEl) {\n this.canvasCtx.clearRect(0, 0, this.canvasEl.width, this.canvasEl.height);\n }\n this.setValueAndFire(null);\n MessageToast.show(\"Signature cleared.\");\n }\n\n private saveSignature(): void {\n if (this.canvasEl) {\n const dataUrl = this.canvasEl.toDataURL(\"image/png\");\n this.setValueAndFire(dataUrl);\n }\n }\n\n /**\n * Sets the value of the control programmatically and re-draws the canvas.\n * @param value The base64 data URL string representing the signature image.\n */\n public setValue(value: any): this {\n super.setValue(value);\n if (value && typeof value === \"string\" && value.startsWith(\"data:image\")) {\n this.loadImageOntoCanvas(value);\n } else if (!value && this.canvasCtx && this.canvasEl) {\n this.canvasCtx.clearRect(0, 0, this.canvasEl.width, this.canvasEl.height);\n }\n return this;\n }\n}\n"],"mappings":";;;;;;QAAOA,mBAAmB,GAAAC,sBAAA,CAAAC,qBAAA;EAM1B;AACA;AACA;AACA;EACe,MAAMC,gBAAgB,SAASH,mBAAmB,CAAC;IAC9D,OAAgBI,QAAQ,GAAG,iEAAiE;IAC5F,OAAgBC,QAAQ,GAAG;MACvBC,UAAU,EAAE,CAAC,CAAC;MACdC,MAAM,EAAE,CAAC;IACb,CAAC;IAKOC,SAAS,GAAG,KAAK;IACjBC,SAAS,GAAoC,IAAI;IACjDC,QAAQ,GAA6B,IAAI;;IAEjD;AACJ;AACA;IACWC,IAAIA,CAAA,EAAS;MAChB,KAAK,CAACA,IAAI,CAAC,CAAC;MAEZ,IAAI,CAACC,UAAU,GAAG,IAAIC,IAAI,CAAC;QACvBC,OAAO,EAAE,2IAA2I;QACpJC,cAAc,EAAE,IAAI,CAACC,gBAAgB,CAACC,IAAI,CAAC,IAAI;MACnD,CAAC,CAAC,CAACC,aAAa,CAAC,wBAAwB,CAAC;MAE1C,IAAI,CAACC,QAAQ,GAAG,IAAIC,MAAM,CAAC;QACvBC,IAAI,EAAE,uBAAuB;QAC7BC,IAAI,EAAE,iBAAiB;QACvBC,KAAK,EAAE,IAAI,CAACC,cAAc,CAACP,IAAI,CAAC,IAAI;MACxC,CAAC,CAAC;MAEF,IAAI,CAACQ,IAAI,GAAG,IAAIC,IAAI,CAAC;QACjBC,KAAK,EAAE,CAAC,IAAI,CAACf,UAAU,EAAE,IAAI,CAACO,QAAQ;MAC1C,CAAC,CAAC;MAEF,IAAI,CAACS,cAAc,CAAC,UAAU,EAAE,IAAI,CAACH,IAAI,CAAC;IAC9C;IAEQT,gBAAgBA,CAAA,EAAS;MAC7B,MAAMa,MAAM,GAAG,IAAI,CAACjB,UAAU,CAACkB,SAAS,CAAC,CAAgB;MACzD,IAAI,CAACD,MAAM,EAAE;MAEb,IAAI,CAACnB,QAAQ,GAAGmB,MAA2B;MAC3C,IAAI,CAACpB,SAAS,GAAG,IAAI,CAACC,QAAQ,CAACqB,UAAU,CAAC,IAAI,CAAC;MAC/C,IAAI,IAAI,CAACtB,SAAS,EAAE;QAChB,IAAI,CAACA,SAAS,CAACuB,SAAS,GAAG,CAAC;QAC5B,IAAI,CAACvB,SAAS,CAACwB,OAAO,GAAG,OAAO;QAChC,IAAI,CAACxB,SAAS,CAACyB,WAAW,GAAG,MAAM;MACvC;;MAEA;MACA,IAAI,CAACxB,QAAQ,CAACyB,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAACC,YAAY,CAACnB,IAAI,CAAC,IAAI,CAAC,CAAC;MACzE,IAAI,CAACP,QAAQ,CAACyB,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAACE,IAAI,CAACpB,IAAI,CAAC,IAAI,CAAC,CAAC;MACjE,IAAI,CAACP,QAAQ,CAACyB,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAACG,WAAW,CAACrB,IAAI,CAAC,IAAI,CAAC,CAAC;MACtE,IAAI,CAACP,QAAQ,CAACyB,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAACG,WAAW,CAACrB,IAAI,CAAC,IAAI,CAAC,CAAC;;MAEvE;MACA,IAAI,CAACP,QAAQ,CAACyB,gBAAgB,CAAC,YAAY,EAAE,IAAI,CAACI,iBAAiB,CAACtB,IAAI,CAAC,IAAI,CAAC,EAAE;QAAEuB,OAAO,EAAE;MAAM,CAAC,CAAC;MACnG,IAAI,CAAC9B,QAAQ,CAACyB,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAACM,SAAS,CAACxB,IAAI,CAAC,IAAI,CAAC,EAAE;QAAEuB,OAAO,EAAE;MAAM,CAAC,CAAC;MAC1F,IAAI,CAAC9B,QAAQ,CAACyB,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAACG,WAAW,CAACrB,IAAI,CAAC,IAAI,CAAC,CAAC;;MAEvE;MACA,MAAMyB,GAAG,GAAG,IAAI,CAACC,QAAQ,CAAC,CAAC;MAC3B,IAAID,GAAG,IAAI,OAAOA,GAAG,KAAK,QAAQ,IAAIA,GAAG,CAACE,UAAU,CAAC,YAAY,CAAC,EAAE;QAChE,IAAI,CAACC,mBAAmB,CAACH,GAAG,CAAC;MACjC;IACJ;IAEQG,mBAAmBA,CAACC,OAAe,EAAQ;MAC/C,MAAMC,GAAG,GAAG,IAAIC,MAAM,CAACC,KAAK,CAAC,CAAC;MAC9BF,GAAG,CAACG,MAAM,GAAG,MAAM;QACf,IAAI,IAAI,CAACzC,SAAS,IAAI,IAAI,CAACC,QAAQ,EAAE;UACjC,IAAI,CAACD,SAAS,CAAC0C,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAACzC,QAAQ,CAAC0C,KAAK,EAAE,IAAI,CAAC1C,QAAQ,CAAC2C,MAAM,CAAC;UACzE,IAAI,CAAC5C,SAAS,CAAC6C,SAAS,CAACP,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAACrC,QAAQ,CAAC0C,KAAK,EAAE,IAAI,CAAC1C,QAAQ,CAAC2C,MAAM,CAAC;QAClF;MACJ,CAAC;MACDN,GAAG,CAACQ,GAAG,GAAGT,OAAO;IACrB;IAEQU,cAAcA,CAACC,CAA0B,EAA4B;MACzE,IAAI,CAAC,IAAI,CAAC/C,QAAQ,EAAE,OAAO;QAAEgD,CAAC,EAAE,CAAC;QAAEC,CAAC,EAAE;MAAE,CAAC;MACzC,MAAMC,IAAI,GAAG,IAAI,CAAClD,QAAQ,CAACmD,qBAAqB,CAAC,CAAC;MAElD,IAAIC,OAAO,EAAEC,OAAO;MACpB,IAAIN,CAAC,CAACO,IAAI,CAACpB,UAAU,CAAC,OAAO,CAAC,EAAE;QAC5BkB,OAAO,GAAIL,CAAC,CAAgBQ,OAAO,CAAC,CAAC,CAAC,CAACH,OAAO;QAC9CC,OAAO,GAAIN,CAAC,CAAgBQ,OAAO,CAAC,CAAC,CAAC,CAACF,OAAO;MAClD,CAAC,MAAM;QACHD,OAAO,GAAIL,CAAC,CAAgBK,OAAO;QACnCC,OAAO,GAAIN,CAAC,CAAgBM,OAAO;MACvC;MAEA,OAAO;QACHL,CAAC,EAAEI,OAAO,GAAGF,IAAI,CAACM,IAAI;QACtBP,CAAC,EAAEI,OAAO,GAAGH,IAAI,CAACO;MACtB,CAAC;IACL;IAEQ/B,YAAYA,CAACqB,CAAa,EAAQ;MACtC,IAAI,CAACjD,SAAS,GAAG,IAAI;MACrB,IAAI,CAAC6B,IAAI,CAACoB,CAAC,CAAC;IAChB;IAEQlB,iBAAiBA,CAACkB,CAAa,EAAQ;MAC3CA,CAAC,CAACW,cAAc,CAAC,CAAC,CAAC,CAAC;MACpB,IAAI,CAAC5D,SAAS,GAAG,IAAI;MACrB,IAAI,CAACiC,SAAS,CAACgB,CAAC,CAAC;IACrB;IAEQpB,IAAIA,CAACoB,CAAa,EAAQ;MAC9B,IAAI,CAAC,IAAI,CAACjD,SAAS,IAAI,CAAC,IAAI,CAACC,SAAS,EAAE;MACxC,MAAM4D,GAAG,GAAG,IAAI,CAACb,cAAc,CAACC,CAAC,CAAC;MAClC,IAAI,CAAChD,SAAS,CAAC6D,MAAM,CAACD,GAAG,CAACX,CAAC,EAAEW,GAAG,CAACV,CAAC,CAAC;MACnC,IAAI,CAAClD,SAAS,CAAC8D,MAAM,CAAC,CAAC;MACvB,IAAI,CAAC9D,SAAS,CAAC+D,SAAS,CAAC,CAAC;MAC1B,IAAI,CAAC/D,SAAS,CAACgE,MAAM,CAACJ,GAAG,CAACX,CAAC,EAAEW,GAAG,CAACV,CAAC,CAAC;IACvC;IAEQlB,SAASA,CAACgB,CAAa,EAAQ;MACnC,IAAI,CAAC,IAAI,CAACjD,SAAS,IAAI,CAAC,IAAI,CAACC,SAAS,EAAE;MACxCgD,CAAC,CAACW,cAAc,CAAC,CAAC,CAAC,CAAC;MACpB,MAAMC,GAAG,GAAG,IAAI,CAACb,cAAc,CAACC,CAAC,CAAC;MAClC,IAAI,CAAChD,SAAS,CAAC6D,MAAM,CAACD,GAAG,CAACX,CAAC,EAAEW,GAAG,CAACV,CAAC,CAAC;MACnC,IAAI,CAAClD,SAAS,CAAC8D,MAAM,CAAC,CAAC;MACvB,IAAI,CAAC9D,SAAS,CAAC+D,SAAS,CAAC,CAAC;MAC1B,IAAI,CAAC/D,SAAS,CAACgE,MAAM,CAACJ,GAAG,CAACX,CAAC,EAAEW,GAAG,CAACV,CAAC,CAAC;IACvC;IAEQrB,WAAWA,CAAA,EAAS;MACxB,IAAI,CAAC,IAAI,CAAC9B,SAAS,EAAE;MACrB,IAAI,CAACA,SAAS,GAAG,KAAK;MACtB,IAAI,IAAI,CAACC,SAAS,EAAE;QAChB,IAAI,CAACA,SAAS,CAAC+D,SAAS,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,CAACE,aAAa,CAAC,CAAC;MACxB;IACJ;IAEQlD,cAAcA,CAAA,EAAS;MAC3B,IAAI,IAAI,CAACf,SAAS,IAAI,IAAI,CAACC,QAAQ,EAAE;QACjC,IAAI,CAACD,SAAS,CAAC0C,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAACzC,QAAQ,CAAC0C,KAAK,EAAE,IAAI,CAAC1C,QAAQ,CAAC2C,MAAM,CAAC;MAC7E;MACA,IAAI,CAACsB,eAAe,CAAC,IAAI,CAAC;MAC1BC,YAAY,CAACC,IAAI,CAAC,oBAAoB,CAAC;IAC3C;IAEQH,aAAaA,CAAA,EAAS;MAC1B,IAAI,IAAI,CAAChE,QAAQ,EAAE;QACf,MAAMoC,OAAO,GAAG,IAAI,CAACpC,QAAQ,CAACoE,SAAS,CAAC,WAAW,CAAC;QACpD,IAAI,CAACH,eAAe,CAAC7B,OAAO,CAAC;MACjC;IACJ;;IAEA;AACJ;AACA;AACA;IACWiC,QAAQA,CAACC,KAAU,EAAQ;MAC9B,KAAK,CAACD,QAAQ,CAACC,KAAK,CAAC;MACrB,IAAIA,KAAK,IAAI,OAAOA,KAAK,KAAK,QAAQ,IAAIA,KAAK,CAACpC,UAAU,CAAC,YAAY,CAAC,EAAE;QACtE,IAAI,CAACC,mBAAmB,CAACmC,KAAK,CAAC;MACnC,CAAC,MAAM,IAAI,CAACA,KAAK,IAAI,IAAI,CAACvE,SAAS,IAAI,IAAI,CAACC,QAAQ,EAAE;QAClD,IAAI,CAACD,SAAS,CAAC0C,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAACzC,QAAQ,CAAC0C,KAAK,EAAE,IAAI,CAAC1C,QAAQ,CAAC2C,MAAM,CAAC;MAC7E;MACA,OAAO,IAAI;IACf;EACJ;EAAC,OAAAlD,gBAAA;AAAA","ignoreList":[]}
|
|
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":[]}
|
|
@@ -16,6 +16,11 @@ declare module "nz/co/siliconst/ui5/metaui/controls/SignatureControl" {
|
|
|
16
16
|
private isDrawing;
|
|
17
17
|
private canvasCtx;
|
|
18
18
|
private canvasEl;
|
|
19
|
+
private boundStartDrawing;
|
|
20
|
+
private boundDraw;
|
|
21
|
+
private boundStopDrawing;
|
|
22
|
+
private boundStartDrawingTouch;
|
|
23
|
+
private boundDrawTouch;
|
|
19
24
|
/**
|
|
20
25
|
* Initializes the control and builds the canvas drawing surface.
|
|
21
26
|
*/
|
|
@@ -34,7 +39,11 @@ declare module "nz/co/siliconst/ui5/metaui/controls/SignatureControl" {
|
|
|
34
39
|
* Sets the value of the control programmatically and re-draws the canvas.
|
|
35
40
|
* @param value The base64 data URL string representing the signature image.
|
|
36
41
|
*/
|
|
37
|
-
setValue(value:
|
|
42
|
+
setValue(value: unknown): this;
|
|
43
|
+
/**
|
|
44
|
+
* Cleans up event listeners to prevent memory leaks when the control is destroyed.
|
|
45
|
+
*/
|
|
46
|
+
exit(): void;
|
|
38
47
|
}
|
|
39
48
|
}
|
|
40
49
|
//# sourceMappingURL=SignatureControl.d.ts.map
|
|
@@ -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;;WAEG;QACI,IAAI,IAAI,IAAI;
|
|
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,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)}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.
|
|
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});
|
|
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","domRef","getDomRef","getContext","lineWidth","lineCap","strokeStyle","addEventListener","startDrawing","draw","stopDrawing","startDrawingTouch","passive","drawTouch","val","getValue","startsWith","loadImageOntoCanvas","dataUrl","img","window","Image","onload","clearRect","width","height","drawImage","src","getCoordinates","e","x","y","rect","getBoundingClientRect","clientX","clientY","type","touches","left","top","preventDefault","pos","lineTo","stroke","beginPath","moveTo","saveSignature","setValueAndFire","MessageToast","show","toDataURL","setValue","value"],"sources":["SignatureControl.ts"],"sourcesContent":["import BaseHardwareControl from \"./BaseHardwareControl\";\nimport Button from \"sap/m/Button\";\nimport VBox from \"sap/m/VBox\";\nimport HTML from \"sap/ui/core/HTML\";\nimport MessageToast from \"sap/m/MessageToast\";\n\n/**\n * SignatureControl\n * Provides an HTML5 Canvas for capturing signatures.\n */\nexport default class SignatureControl extends BaseHardwareControl {\n static readonly renderer = \"nz.co.siliconst.ui5.metaui.controls.BaseHardwareControlRenderer\";\n static readonly metadata = {\n properties: {},\n events: {}\n };\n\n private vBox!: VBox;\n private clearBtn!: Button;\n private canvasHtml!: HTML;\n private isDrawing = false;\n private canvasCtx: CanvasRenderingContext2D | null = null;\n private canvasEl: HTMLCanvasElement | null = null;\n\n /**\n * Initializes the control and builds the canvas drawing surface.\n */\n public init(): void {\n super.init();\n\n this.canvasHtml = new HTML({\n content: \"<canvas width='400' height='200' style='border: 1px solid #ccc; background-color: #fff; touch-action: none; cursor: crosshair;'></canvas>\",\n afterRendering: this.onCanvasRendered.bind(this)\n }).addStyleClass(\"sapUiSmallMarginBottom\");\n\n this.clearBtn = new Button({\n icon: \"sap-icon://sys-cancel\",\n text: \"Clear Signature\",\n press: this.clearSignature.bind(this)\n });\n\n this.vBox = new VBox({\n items: [this.canvasHtml, this.clearBtn]\n });\n\n this.setAggregation(\"_content\", this.vBox);\n }\n\n private onCanvasRendered(): void {\n const domRef = this.canvasHtml.getDomRef() as HTMLElement;\n if (!domRef) return;\n \n this.canvasEl = domRef as HTMLCanvasElement;\n this.canvasCtx = this.canvasEl.getContext(\"2d\");\n if (this.canvasCtx) {\n this.canvasCtx.lineWidth = 2;\n this.canvasCtx.lineCap = \"round\";\n this.canvasCtx.strokeStyle = \"#000\";\n }\n\n // Mouse events\n this.canvasEl.addEventListener(\"mousedown\", this.startDrawing.bind(this));\n this.canvasEl.addEventListener(\"mousemove\", this.draw.bind(this));\n this.canvasEl.addEventListener(\"mouseup\", this.stopDrawing.bind(this));\n this.canvasEl.addEventListener(\"mouseout\", this.stopDrawing.bind(this));\n \n // Touch events\n this.canvasEl.addEventListener(\"touchstart\", this.startDrawingTouch.bind(this), { passive: false });\n this.canvasEl.addEventListener(\"touchmove\", this.drawTouch.bind(this), { passive: false });\n this.canvasEl.addEventListener(\"touchend\", this.stopDrawing.bind(this));\n\n // Restore existing signature if any\n const val = this.getValue();\n if (val && typeof val === \"string\" && val.startsWith(\"data:image\")) {\n this.loadImageOntoCanvas(val);\n }\n }\n\n private loadImageOntoCanvas(dataUrl: string): void {\n const img = new window.Image();\n img.onload = () => {\n if (this.canvasCtx && this.canvasEl) {\n this.canvasCtx.clearRect(0, 0, this.canvasEl.width, this.canvasEl.height);\n this.canvasCtx.drawImage(img, 0, 0, this.canvasEl.width, this.canvasEl.height);\n }\n };\n img.src = dataUrl;\n }\n\n private getCoordinates(e: MouseEvent | TouchEvent): { x: number, y: number } {\n if (!this.canvasEl) return { x: 0, y: 0 };\n const rect = this.canvasEl.getBoundingClientRect();\n \n let clientX, clientY;\n if (e.type.startsWith(\"touch\")) {\n clientX = (e as TouchEvent).touches[0].clientX;\n clientY = (e as TouchEvent).touches[0].clientY;\n } else {\n clientX = (e as MouseEvent).clientX;\n clientY = (e as MouseEvent).clientY;\n }\n \n return {\n x: clientX - rect.left,\n y: clientY - rect.top\n };\n }\n\n private startDrawing(e: MouseEvent): void {\n this.isDrawing = true;\n this.draw(e);\n }\n\n private startDrawingTouch(e: TouchEvent): void {\n e.preventDefault(); // Prevent scrolling\n this.isDrawing = true;\n this.drawTouch(e);\n }\n\n private draw(e: MouseEvent): void {\n if (!this.isDrawing || !this.canvasCtx) return;\n const pos = this.getCoordinates(e);\n this.canvasCtx.lineTo(pos.x, pos.y);\n this.canvasCtx.stroke();\n this.canvasCtx.beginPath();\n this.canvasCtx.moveTo(pos.x, pos.y);\n }\n\n private drawTouch(e: TouchEvent): void {\n if (!this.isDrawing || !this.canvasCtx) return;\n e.preventDefault(); // Prevent scrolling\n const pos = this.getCoordinates(e);\n this.canvasCtx.lineTo(pos.x, pos.y);\n this.canvasCtx.stroke();\n this.canvasCtx.beginPath();\n this.canvasCtx.moveTo(pos.x, pos.y);\n }\n\n private stopDrawing(): void {\n if (!this.isDrawing) return;\n this.isDrawing = false;\n if (this.canvasCtx) {\n this.canvasCtx.beginPath(); // Reset path\n this.saveSignature();\n }\n }\n\n private clearSignature(): void {\n if (this.canvasCtx && this.canvasEl) {\n this.canvasCtx.clearRect(0, 0, this.canvasEl.width, this.canvasEl.height);\n }\n this.setValueAndFire(null);\n MessageToast.show(\"Signature cleared.\");\n }\n\n private saveSignature(): void {\n if (this.canvasEl) {\n const dataUrl = this.canvasEl.toDataURL(\"image/png\");\n this.setValueAndFire(dataUrl);\n }\n }\n\n /**\n * Sets the value of the control programmatically and re-draws the canvas.\n * @param value The base64 data URL string representing the signature image.\n */\n public setValue(value: any): this {\n super.setValue(value);\n if (value && typeof value === \"string\" && value.startsWith(\"data:image\")) {\n this.loadImageOntoCanvas(value);\n } else if (!value && this.canvasCtx && this.canvasEl) {\n this.canvasCtx.clearRect(0, 0, this.canvasEl.width, this.canvasEl.height);\n }\n return this;\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"SignatureControl.js","names":["BaseHardwareControl","_interopRequireDefault","__BaseHardwareControl","SignatureControl","static","properties","events","isDrawing","canvasCtx","canvasEl","init","super","this","canvasHtml","HTML","content","afterRendering","onCanvasRendered","bind","addStyleClass","clearBtn","Button","icon","text","press","clearSignature","vBox","VBox","items","setAggregation","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":[]}
|