implementations and corrections

This commit is contained in:
Niels Lyngsø
2023-11-09 20:08:42 +01:00
parent feb65d1516
commit 528da0750a
12 changed files with 33 additions and 76 deletions

View File

@@ -19,7 +19,7 @@ export abstract class UmbBaseExtensionController<
#overwrites: Array<string> = [];
#manifest?: ManifestType;
#conditionControllers: Array<UmbExtensionCondition> = [];
#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<ManifestCondition>,
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.

View File

@@ -54,7 +54,7 @@ class UmbTestExtensionsController<
extensionRegistry: UmbExtensionRegistry<ManifestWithDynamicConditions>,
type: myTestManifestTypes,
filter: null | ((manifest: ManifestWithDynamicConditions) => boolean),
onChange: (permittedManifests: Array<MyPermittedControllerType>, controller: MyPermittedControllerType) => void
onChange: (permittedManifests: Array<MyPermittedControllerType>) => void
) {
super(host, extensionRegistry, type, filter, onChange);
this.#host = host;

View File

@@ -24,7 +24,7 @@ export abstract class UmbBaseExtensionsController<
#extensionRegistry: UmbExtensionRegistry<ManifestType>;
#type: ManifestTypeName | Array<ManifestTypeName>;
#filter: undefined | null | ((manifest: ManifestType) => boolean);
#onChange: (permittedManifests: Array<MyPermittedControllerType>, controller: MyPermittedControllerType) => void;
#onChange?: (permittedManifests: Array<MyPermittedControllerType>) => void;
protected _extensions: Array<ControllerType> = [];
private _permittedExts: Array<MyPermittedControllerType> = [];
@@ -33,7 +33,7 @@ export abstract class UmbBaseExtensionsController<
extensionRegistry: UmbExtensionRegistry<ManifestType>,
type: ManifestTypeName | Array<ManifestTypeName>,
filter: undefined | null | ((manifest: ManifestType) => boolean),
onChange: (permittedManifests: Array<MyPermittedControllerType>, controller: MyPermittedControllerType) => void
onChange?: (permittedManifests: Array<MyPermittedControllerType>) => 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);
}
}

View File

@@ -67,7 +67,7 @@ export class UmbExtensionApiController<
extensionRegistry: UmbExtensionRegistry<ManifestCondition>,
alias: string,
constructorArguments: Array<unknown> | undefined,
onPermissionChanged: (isPermitted: boolean, controller: ControllerType) => void
onPermissionChanged?: (isPermitted: boolean, controller: ControllerType) => void
) {
super(host, extensionRegistry, alias, onPermissionChanged);
this.#constructorArguments = constructorArguments;

View File

@@ -59,8 +59,8 @@ export class UmbExtensionsApiController<
extensionRegistry: UmbExtensionRegistry<ManifestTypes>,
type: ManifestTypeName | Array<ManifestTypeName>,
constructorArguments: Array<unknown> | undefined,
filter: undefined | null | ((manifest: ManifestTypeAsApi) => boolean),
onChange: (permittedManifests: Array<MyPermittedControllerType>, controller: MyPermittedControllerType) => void
filter?: undefined | null | ((manifest: ManifestTypeAsApi) => boolean),
onChange?: (permittedManifests: Array<MyPermittedControllerType>) => void
) {
super(host, extensionRegistry, type, filter, onChange);
this.#extensionRegistry = extensionRegistry;

View File

@@ -43,7 +43,7 @@ export class UmbExtensionsElementController<
extensionRegistry: UmbExtensionRegistry<ManifestTypes>,
type: ManifestTypeName | Array<ManifestTypeName>,
filter: undefined | null | ((manifest: ManifestType) => boolean),
onChange: (permittedManifests: Array<MyPermittedControllerType>, controller: MyPermittedControllerType) => void,
onChange: (permittedManifests: Array<MyPermittedControllerType>) => void,
defaultElement?: string
) {
super(host, extensionRegistry, type, filter, onChange);

View File

@@ -31,7 +31,7 @@ export class UmbExtensionsManifestController<
extensionRegistry: UmbExtensionRegistry<ManifestTypes>,
type: ManifestTypeName | Array<ManifestTypeName>,
filter: null | ((manifest: ManifestType) => boolean),
onChange: (permittedManifests: Array<MyPermittedControllerType>, controller: MyPermittedControllerType) => void
onChange: (permittedManifests: Array<MyPermittedControllerType>) => void
) {
super(host, extensionRegistry, type, filter, onChange);
this.#extensionRegistry = extensionRegistry;

View File

@@ -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<RepositoryType> extends UmbBaseController implements ExtensionApi {
@@ -8,8 +8,10 @@ export class UmbActionBase<RepositoryType> 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<RepositoryType> extends UmbBaseController implements
throw new Error('Could not create repository with alias: ' + repositoryAlias + '');
}
}
);
);*/
}
}

View File

@@ -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';

View File

@@ -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<string>) {
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();
}
}

View File

@@ -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<ManifestTypes | UmbBackofficeManifestKind> = [
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);

View File

@@ -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<TreeItemType extends TreeItemPresentationModel>
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<TreeItemType> : undefined;
this.#checkIfInitialized();
});
/*
this.observe(
umbExtensionsRegistry.getByTypeAndAlias('repository', treeManifest.meta.repositoryAlias),
async (repositoryManifest) => {
@@ -168,5 +173,6 @@ export class UmbTreeContextBase<TreeItemType extends TreeItemPresentationModel>
},
'_observeRepository',
);
*/
}
}