diff options
Diffstat (limited to 'apps/workflowengine/src/helpers/window.js')
-rw-r--r-- | apps/workflowengine/src/helpers/window.js | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/apps/workflowengine/src/helpers/window.js b/apps/workflowengine/src/helpers/window.js new file mode 100644 index 00000000000..9538c4706d0 --- /dev/null +++ b/apps/workflowengine/src/helpers/window.js @@ -0,0 +1,30 @@ +/** + * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +import wrap from '@vue/web-component-wrapper' +import Vue from 'vue' + +/** + * + * @param VueComponent {Object} The Vue component to turn into a Web Components custom element. + * @param customElementId {string} The element name, it must be unique. Recommended pattern oca-$appid-(checks|operations)-$use_case, example: oca-my_app-checks-request_user_agent + */ +function registerCustomElement(VueComponent, customElementId) { + const WrappedComponent = wrap(Vue, VueComponent) + if (window.customElements.get(customElementId)) { + console.error('Custom element with ID ' + customElementId + ' is already defined!') + throw new Error('Custom element with ID ' + customElementId + ' is already defined!') + } + window.customElements.define(customElementId, WrappedComponent) + + // In Vue 2, wrap doesn't support disabling shadow :( + // Disable with a hack + Object.defineProperty(WrappedComponent.prototype, 'attachShadow', { value() { return this } }) + Object.defineProperty(WrappedComponent.prototype, 'shadowRoot', { get() { return this } }) + + return customElementId +} + +export { registerCustomElement } |