From f5067717fc89c44b06ebe6d9ea007ef952ddae60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Tue, 27 Jun 2023 12:14:20 +0200 Subject: [PATCH] globalContext manifest type --- .../class-extensions-initializer.ts | 37 +++++++++++++++++++ .../packages/core/extension-registry/index.ts | 1 + .../models/globalcontext.model.ts | 5 +++ .../src/packages/core/index.ts | 11 ++++-- .../src/packages/core/store/index.ts | 1 - .../core/store/store-extension-initializer.ts | 28 -------------- 6 files changed, 50 insertions(+), 33 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/class-extensions-initializer.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/globalcontext.model.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/store/store-extension-initializer.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/class-extensions-initializer.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/class-extensions-initializer.ts new file mode 100644 index 0000000000..203f150aa5 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/class-extensions-initializer.ts @@ -0,0 +1,37 @@ +import { createExtensionClass } from '@umbraco-cms/backoffice/extension-api'; +import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; +import { UmbController, UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; + +/** + * Initializes extension classes for a host element. + * Extension class will be given one argument, the host element. + * + * @param host The host element to initialize extension classes for. + * @param extensionTypes The extension types(strings) to initialize. + * + */ +export class UmbClassExtensionsInitializer extends UmbController { + #extensionMap = new Map(); + + constructor(host: UmbControllerHostElement, extensionTypes: Array) { + super(host); + + this.observe(umbExtensionsRegistry.extensionsOfTypes(extensionTypes), (extensions) => { + if (!extensions) return; + + extensions.forEach((extension) => { + if (this.#extensionMap.has(extension.alias)) return; + + // Instantiate and provide extension JS class. For Context API the classes provide them selfs when the class instantiates. + this.#extensionMap.set(extension.alias, createExtensionClass(extension, [this._host])); + }); + }); + } + + public destroy(): void { + this.#extensionMap.forEach((extension) => { + extension.destroy(); + }); + this.#extensionMap.clear(); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/index.ts index d2e414594e..c3251ec168 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/index.ts @@ -2,3 +2,4 @@ export * from './interfaces/index.js'; export * from './models/index.js'; export * from './registry.js'; export * from './extension-class-initializer.js'; +export * from './class-extensions-initializer.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/globalcontext.model.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/globalcontext.model.ts new file mode 100644 index 0000000000..cc6f8f234d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/globalcontext.model.ts @@ -0,0 +1,5 @@ +import type { ManifestClass } from '@umbraco-cms/backoffice/extension-api'; + +export interface ManifestGlobalContext extends ManifestClass { + type: 'globalContext'; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/index.ts index 8e276d67ee..0e47b0ca23 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/index.ts @@ -2,16 +2,19 @@ import { UmbBackofficeNotificationContainerElement, UmbBackofficeModalContainerE import { manifests as debugManifests } from './debug/manifests.js'; import { manifests as propertyActionManifests } from './property-actions/manifests.js'; import { manifests as propertyEditorManifests } from './property-editors/manifests.js'; -import { manifests as tinyMcePluginManifests } from './property-editors/uis/tiny-mce/plugins/manifests.js'; +import { manifests as tinyMcePluginManifests } from './property-editors/uis/tiny-mce/plugins/manifests.js'; import { manifests as workspaceManifests } from './workspace/manifests.js'; import { manifests as modalManifests } from './modal/common/manifests.js'; -import { UmbStoreExtensionInitializer } from './store/index.js'; import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; import { UmbModalManagerContext, UMB_MODAL_MANAGER_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; import { UmbContextProviderController } from '@umbraco-cms/backoffice/context-api'; import type { UmbEntryPointOnInit } from '@umbraco-cms/backoffice/extension-api'; -import { ManifestTypes, UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry'; +import { + ManifestTypes, + UmbBackofficeManifestKind, + UmbClassExtensionsInitializer, +} from '@umbraco-cms/backoffice/extension-registry'; export * from './action/index.js'; export * from './collection/index.js'; @@ -46,7 +49,7 @@ const manifests: Array = [ ]; export const onInit: UmbEntryPointOnInit = (host, extensionRegistry) => { - new UmbStoreExtensionInitializer(host); + new UmbClassExtensionsInitializer(host, ['globalContext', 'store', 'treeStore', 'itemStore']); extensionRegistry.registerMany(manifests); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/store/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/store/index.ts index 843f8f5513..0ab513ac78 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/store/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/store/index.ts @@ -2,7 +2,6 @@ export * from './entity-tree-store.js'; export * from './file-system-tree.store.js'; export * from './item-store.interface.js'; export * from './store-base.js'; -export * from './store-extension-initializer.js'; export * from './store.interface.js'; export * from './store.js'; export * from './tree-store.interface.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/store/store-extension-initializer.ts b/src/Umbraco.Web.UI.Client/src/packages/core/store/store-extension-initializer.ts deleted file mode 100644 index 36c907a54c..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/store/store-extension-initializer.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { createExtensionClass } from '@umbraco-cms/backoffice/extension-api'; -import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; -import { UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; - -export class UmbStoreExtensionInitializer { - public host: UmbControllerHostElement; - #storeMap = new Map(); - - constructor(host: UmbControllerHostElement) { - this.host = host; - - new UmbObserverController( - this.host, - umbExtensionsRegistry.extensionsOfTypes(['store', 'treeStore', 'itemStore']), - (stores) => { - if (!stores) return; - - stores.forEach((store) => { - if (this.#storeMap.has(store.alias)) return; - - // Instantiate and provide stores. Stores are self providing when the class is instantiated. - this.#storeMap.set(store.alias, createExtensionClass(store, [this.host])); - }); - } - ); - } -}