From 528da0750ab4e13fd9c3fad26cf8e80a7a469369 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 9 Nov 2023 20:08:42 +0100 Subject: [PATCH] implementations and corrections --- .../controller/base-extension-controller.ts | 8 +-- .../base-extensions-controller.test.ts | 2 +- .../controller/base-extensions-controller.ts | 7 +-- .../controller/extension-api-controller.ts | 2 +- .../controller/extensions-api-controller.ts | 4 +- .../extensions-element-controller.ts | 2 +- .../extensions-manifest-controller.ts | 2 +- .../packages/core/action/repository-action.ts | 10 ++-- .../packages/core/extension-registry/index.ts | 1 - .../multi-extensions-api-initializer.ts | 49 ------------------- .../src/packages/core/index.ts | 14 +++--- .../src/packages/core/tree/tree.context.ts | 8 ++- 12 files changed, 33 insertions(+), 76 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/multi-extensions-api-initializer.ts diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/base-extension-controller.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/base-extension-controller.ts index cd570cad41..1956aad81c 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/base-extension-controller.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/base-extension-controller.ts @@ -19,7 +19,7 @@ export abstract class UmbBaseExtensionController< #overwrites: Array = []; #manifest?: ManifestType; #conditionControllers: Array = []; - #onPermissionChanged: (isPermitted: boolean, controller: SubClassType) => void; + #onPermissionChanged?: (isPermitted: boolean, controller: SubClassType) => void; protected _positive?: boolean; #isPermitted?: boolean; @@ -52,7 +52,7 @@ export abstract class UmbBaseExtensionController< host: UmbControllerHost, extensionRegistry: UmbExtensionRegistry, alias: string, - onPermissionChanged: (isPermitted: boolean, controller: SubClassType) => void + onPermissionChanged?: (isPermitted: boolean, controller: SubClassType) => void ) { super(host, alias); this.#extensionRegistry = extensionRegistry; @@ -202,7 +202,7 @@ export abstract class UmbBaseExtensionController< this.#promiseResolvers.forEach((x) => x()); this.#promiseResolvers = []; } - this.#onPermissionChanged(this.#isPermitted, this as any); + this.#onPermissionChanged?.(this.#isPermitted, this as any); } }; @@ -219,7 +219,7 @@ export abstract class UmbBaseExtensionController< if (this.#isPermitted === true) { this.#isPermitted = undefined; this._conditionsAreBad(); - this.#onPermissionChanged(false, this as any); + this.#onPermissionChanged?.(false, this as any); } super.destroy(); // Destroy the conditions controllers, are begin destroyed cause they are controllers. diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/base-extensions-controller.test.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/base-extensions-controller.test.ts index 4eeaad14b8..b5d7dec8de 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/base-extensions-controller.test.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/base-extensions-controller.test.ts @@ -54,7 +54,7 @@ class UmbTestExtensionsController< extensionRegistry: UmbExtensionRegistry, type: myTestManifestTypes, filter: null | ((manifest: ManifestWithDynamicConditions) => boolean), - onChange: (permittedManifests: Array, controller: MyPermittedControllerType) => void + onChange: (permittedManifests: Array) => void ) { super(host, extensionRegistry, type, filter, onChange); this.#host = host; diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/base-extensions-controller.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/base-extensions-controller.ts index 9c94b7a173..3a597d98ad 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/base-extensions-controller.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/base-extensions-controller.ts @@ -24,7 +24,7 @@ export abstract class UmbBaseExtensionsController< #extensionRegistry: UmbExtensionRegistry; #type: ManifestTypeName | Array; #filter: undefined | null | ((manifest: ManifestType) => boolean); - #onChange: (permittedManifests: Array, controller: MyPermittedControllerType) => void; + #onChange?: (permittedManifests: Array) => void; protected _extensions: Array = []; private _permittedExts: Array = []; @@ -33,7 +33,7 @@ export abstract class UmbBaseExtensionsController< extensionRegistry: UmbExtensionRegistry, type: ManifestTypeName | Array, filter: undefined | null | ((manifest: ManifestType) => boolean), - onChange: (permittedManifests: Array, controller: MyPermittedControllerType) => void + onChange?: (permittedManifests: Array) => void ) { super(host); this.#extensionRegistry = extensionRegistry; @@ -121,7 +121,7 @@ export abstract class UmbBaseExtensionsController< // Sorting: exposedPermittedExts.sort((a, b) => b.weight - a.weight); - this.#onChange(exposedPermittedExts, this as unknown as MyPermittedControllerType); + this.#onChange?.(exposedPermittedExts); } }; @@ -144,5 +144,6 @@ export abstract class UmbBaseExtensionsController< super.destroy(); this._extensions.length = 0; this._permittedExts.length = 0; + this.#onChange?.(this._permittedExts); } } diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extension-api-controller.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extension-api-controller.ts index 986f41411a..8ebfe34e43 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extension-api-controller.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extension-api-controller.ts @@ -67,7 +67,7 @@ export class UmbExtensionApiController< extensionRegistry: UmbExtensionRegistry, alias: string, constructorArguments: Array | undefined, - onPermissionChanged: (isPermitted: boolean, controller: ControllerType) => void + onPermissionChanged?: (isPermitted: boolean, controller: ControllerType) => void ) { super(host, extensionRegistry, alias, onPermissionChanged); this.#constructorArguments = constructorArguments; diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extensions-api-controller.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extensions-api-controller.ts index c44440b914..13329829b6 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extensions-api-controller.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extensions-api-controller.ts @@ -59,8 +59,8 @@ export class UmbExtensionsApiController< extensionRegistry: UmbExtensionRegistry, type: ManifestTypeName | Array, constructorArguments: Array | undefined, - filter: undefined | null | ((manifest: ManifestTypeAsApi) => boolean), - onChange: (permittedManifests: Array, controller: MyPermittedControllerType) => void + filter?: undefined | null | ((manifest: ManifestTypeAsApi) => boolean), + onChange?: (permittedManifests: Array) => void ) { super(host, extensionRegistry, type, filter, onChange); this.#extensionRegistry = extensionRegistry; diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extensions-element-controller.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extensions-element-controller.ts index 776d9470cc..20513cc895 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extensions-element-controller.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extensions-element-controller.ts @@ -43,7 +43,7 @@ export class UmbExtensionsElementController< extensionRegistry: UmbExtensionRegistry, type: ManifestTypeName | Array, filter: undefined | null | ((manifest: ManifestType) => boolean), - onChange: (permittedManifests: Array, controller: MyPermittedControllerType) => void, + onChange: (permittedManifests: Array) => void, defaultElement?: string ) { super(host, extensionRegistry, type, filter, onChange); diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extensions-manifest-controller.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extensions-manifest-controller.ts index c561e4098e..1b5e92dacb 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extensions-manifest-controller.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extensions-manifest-controller.ts @@ -31,7 +31,7 @@ export class UmbExtensionsManifestController< extensionRegistry: UmbExtensionRegistry, type: ManifestTypeName | Array, filter: null | ((manifest: ManifestType) => boolean), - onChange: (permittedManifests: Array, controller: MyPermittedControllerType) => void + onChange: (permittedManifests: Array) => void ) { super(host, extensionRegistry, type, filter, onChange); this.#extensionRegistry = extensionRegistry; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/action/repository-action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/action/repository-action.ts index 9707aeb65e..881cb06615 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/action/repository-action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/action/repository-action.ts @@ -1,5 +1,5 @@ import { UmbBaseController, UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; -import { type ExtensionApi, createExtensionApi } from '@umbraco-cms/backoffice/extension-api'; +import { type ExtensionApi, UmbExtensionApiController } from '@umbraco-cms/backoffice/extension-api'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; export class UmbActionBase extends UmbBaseController implements ExtensionApi { @@ -8,8 +8,10 @@ export class UmbActionBase extends UmbBaseController implements constructor(host: UmbControllerHostElement, repositoryAlias: string) { super(host); - // TODO: Could be replaced with ExtensionApiController? - this.observe( + new UmbExtensionApiController(this, umbExtensionsRegistry, repositoryAlias, [this._host], (permitted, ctrl) => { + this.repository = permitted ? ctrl.api as RepositoryType : undefined; + }); + /*this.observe( umbExtensionsRegistry.getByTypeAndAlias('repository', repositoryAlias), async (repositoryManifest) => { if (!repositoryManifest) return; @@ -21,6 +23,6 @@ export class UmbActionBase extends UmbBaseController implements throw new Error('Could not create repository with alias: ' + repositoryAlias + ''); } } - ); + );*/ } } 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 60ca478222..f5349ae3ed 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,5 +2,4 @@ export * from './conditions/index.js'; export * from './extension-api-initializer.js'; export * from './interfaces/index.js'; export * from './models/index.js'; -export * from './multi-extensions-api-initializer.js'; export * from './registry.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/multi-extensions-api-initializer.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/multi-extensions-api-initializer.ts deleted file mode 100644 index df59ac4f0b..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/multi-extensions-api-initializer.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { createExtensionApi } from '@umbraco-cms/backoffice/extension-api'; -import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; -import { UmbBaseController, UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; - -/** - * @deprecated - * Initializes multiple extensions APIs for a host element. - * Extension API 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. - * - */ -// TODO: Get rid of this, use Extension API Controller instead. -export class UmbMultiExtensionsApiInitializer extends UmbBaseController { - #extensionMap = new Map(); - - constructor(host: UmbControllerHostElement, extensionTypes: Array) { - super(host); - - this.observe(umbExtensionsRegistry.extensionsOfTypes(extensionTypes), (extensions) => { - if (!extensions) return; - - // Clean up removed extensions: - this.#extensionMap.forEach((value, key) => { - if (!extensions.find((incoming) => incoming.alias === key)) { - this.#extensionMap.delete(key); - value.destroy(); - } - }); - - extensions.forEach((extension) => { - if (this.#extensionMap.has(extension.alias)) return; - - // Notice, currently no way to re-initialize an extension class if it changes. But that does not seem necessary currently. (Otherwise look at implementing the UmbExtensionClassInitializer) - - // Instantiate and provide extension JS class. For Context API the classes provide them selfs when the class instantiates. - this.#extensionMap.set(extension.alias, createExtensionApi(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/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/index.ts index ce8473d639..21a174c65f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/index.ts @@ -14,12 +14,8 @@ import { manifests as cultureManifests } from './culture/manifests.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, - UmbMultiExtensionsApiInitializer, -} from '@umbraco-cms/backoffice/extension-registry'; +import { UmbExtensionsApiController, type UmbEntryPointOnInit } from '@umbraco-cms/backoffice/extension-api'; +import type { ManifestTypes, UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry'; export * from './localization/index.js'; export * from './action/index.js'; @@ -61,8 +57,10 @@ const manifests: Array = [ export const onInit: UmbEntryPointOnInit = (host, extensionRegistry) => { - // TODO: replace this with a Extension Controller: - new UmbMultiExtensionsApiInitializer(host, ['globalContext', 'store', 'treeStore', 'itemStore']); + new UmbExtensionsApiController(host, extensionRegistry, 'globalContext', [host]); + new UmbExtensionsApiController(host, extensionRegistry, 'store', [host]); + new UmbExtensionsApiController(host, extensionRegistry, 'treeStore', [host]); + new UmbExtensionsApiController(host, extensionRegistry, 'itemStore', [host]); extensionRegistry.registerMany(manifests); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.context.ts index 34fed585ff..df7a6104eb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.context.ts @@ -3,7 +3,7 @@ import { UmbPagedData, UmbTreeRepository } from '@umbraco-cms/backoffice/reposit import { ManifestTree, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; import { UmbBooleanState } from '@umbraco-cms/backoffice/observable-api'; import { UmbBaseController, UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; -import { createExtensionApi } from '@umbraco-cms/backoffice/extension-api'; +import { UmbExtensionApiController } from '@umbraco-cms/backoffice/extension-api'; import { ProblemDetails, TreeItemPresentationModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbSelectionManager } from '@umbraco-cms/backoffice/utils'; import { UmbSelectionChangeEvent } from '@umbraco-cms/backoffice/event'; @@ -153,6 +153,11 @@ export class UmbTreeContextBase const repositoryAlias = treeManifest.meta.repositoryAlias; if (!repositoryAlias) throw new Error('Tree must have a repository alias.'); + new UmbExtensionApiController(this, umbExtensionsRegistry, repositoryAlias, [this._host], (permitted, ctrl) => { + this.repository = permitted ? ctrl.api as UmbTreeRepository : undefined; + this.#checkIfInitialized(); + }); + /* this.observe( umbExtensionsRegistry.getByTypeAndAlias('repository', treeManifest.meta.repositoryAlias), async (repositoryManifest) => { @@ -168,5 +173,6 @@ export class UmbTreeContextBase }, '_observeRepository', ); + */ } }