diff --git a/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.context.ts b/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.context.ts index 2446428a46..e4cdd92229 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.context.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.context.ts @@ -2,7 +2,7 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UmbBasicState, UmbStringState } from '@umbraco-cms/backoffice/observable-api'; import { UmbExtensionManifestController, UmbExtensionsManifestController } from '@umbraco-cms/backoffice/extension-api'; import { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import { ManifestSection } from '@umbraco-cms/backoffice/extension-registry'; +import { ManifestSection, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; export class UmbBackofficeContext { #activeSectionAlias = new UmbStringState(undefined); @@ -13,7 +13,7 @@ export class UmbBackofficeContext { public readonly allowedSections = this.#allowedSections.asObservable(); constructor(host: UmbControllerHost) { - new UmbExtensionsManifestController(host, 'section', null, (sections) => { + new UmbExtensionsManifestController(host, umbExtensionsRegistry, 'section', null, (sections) => { this.#allowedSections.next([...sections]); }); } 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 5c153b7a6f..e40943e7db 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 @@ -24,13 +24,15 @@ class UmbTestExtensionController extends UmbBaseExtensionController { } } -const testExtensionRegistry = new UmbExtensionRegistry(); +type myTestManifests = ManifestWithDynamicConditions | ManifestCondition; +const testExtensionRegistry = new UmbExtensionRegistry(); type PermittedControllerType = UmbTestExtensionController & { manifest: Required>; }; class UmbTestExtensionsController extends UmbBaseExtensionsController< + myTestManifests, 'extension-type', ManifestWithDynamicConditions, UmbTestExtensionController, 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 224142fff0..5bba5fb679 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 @@ -1,12 +1,11 @@ import { map } from '@umbraco-cms/backoffice/external/rxjs'; -import { +import type { ManifestBase, ManifestTypeMap, SpecificManifestTypeOrManifestBase, UmbBaseExtensionController, UmbExtensionRegistry, } from '@umbraco-cms/backoffice/extension-api'; -import { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; import { UmbBaseController, UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; export type PermittedControllerType = ControllerType & { @@ -16,6 +15,7 @@ export type PermittedControllerType = /** */ export abstract class UmbBaseExtensionsController< + ManifestTypes extends ManifestBase, ManifestTypeName extends keyof ManifestTypeMap | string, ManifestType extends ManifestBase = SpecificManifestTypeOrManifestBase, ControllerType extends UmbBaseExtensionController = UmbBaseExtensionController, 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 ce7c73de21..f5cf612a5d 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 @@ -4,19 +4,27 @@ import { type ManifestTypeMap, type SpecificManifestTypeOrManifestBase, UmbExtensionElementController, + type UmbExtensionRegistry, } from '@umbraco-cms/backoffice/extension-api'; -import { type ManifestTypes, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; /** */ export class UmbExtensionsElementController< + ManifestTypes extends ManifestBase, ManifestTypeName extends keyof ManifestTypeMap | string = string, ManifestType extends ManifestBase = SpecificManifestTypeOrManifestBase, ControllerType extends UmbExtensionElementController = UmbExtensionElementController, MyPermittedControllerType extends ControllerType = PermittedControllerType -> extends UmbBaseExtensionsController { +> extends UmbBaseExtensionsController< + ManifestTypes, + ManifestTypeName, + ManifestType, + ControllerType, + MyPermittedControllerType +> { // + #extensionRegistry; private _defaultElement?: string; #props?: Record; @@ -32,12 +40,14 @@ export class UmbExtensionsElementController< constructor( host: UmbControllerHost, + extensionRegistry: UmbExtensionRegistry, type: ManifestTypeName, filter: undefined | null | ((manifest: ManifestType) => boolean), onChange: (permittedManifests: Array, controller: MyPermittedControllerType) => void, defaultElement?: string ) { - super(host, umbExtensionsRegistry, type, filter, onChange); + super(host, extensionRegistry, type, filter, onChange); + this.#extensionRegistry = extensionRegistry; this._defaultElement = defaultElement; this._init(); } @@ -45,7 +55,7 @@ export class UmbExtensionsElementController< protected _createController(manifest: ManifestType) { const extController = new UmbExtensionElementController( this, - umbExtensionsRegistry, + this.#extensionRegistry, manifest.alias, this._extensionChanged, this._defaultElement 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 d8ef617397..03c05468d0 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 @@ -4,32 +4,44 @@ import { ManifestBase, ManifestTypeMap, SpecificManifestTypeOrManifestBase, + UmbExtensionRegistry, } from '@umbraco-cms/backoffice/extension-api'; -import { ManifestTypes, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; import { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; /** */ export class UmbExtensionsManifestController< + ManifestTypes extends ManifestBase, ManifestTypeName extends keyof ManifestTypeMap | string, ManifestType extends ManifestBase = SpecificManifestTypeOrManifestBase, ControllerType extends UmbExtensionManifestController = UmbExtensionManifestController, MyPermittedControllerType extends ControllerType = PermittedControllerType -> extends UmbBaseExtensionsController { +> extends UmbBaseExtensionsController< + ManifestTypes, + ManifestTypeName, + ManifestType, + ControllerType, + MyPermittedControllerType +> { + // + #extensionRegistry: UmbExtensionRegistry; + constructor( host: UmbControllerHost, + extensionRegistry: UmbExtensionRegistry, type: ManifestTypeName, filter: null | ((manifest: ManifestType) => boolean), onChange: (permittedManifests: Array, controller: MyPermittedControllerType) => void ) { - super(host, umbExtensionsRegistry, type, filter, onChange); + super(host, extensionRegistry, type, filter, onChange); + this.#extensionRegistry = extensionRegistry; this._init(); } protected _createController(manifest: ManifestType) { return new UmbExtensionManifestController( this, - umbExtensionsRegistry, + this.#extensionRegistry, manifest.alias, this._extensionChanged ) as ControllerType; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/extension-slot/extension-slot.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/extension-slot/extension-slot.element.ts index 7e625574a5..915a870b05 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/extension-slot/extension-slot.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/extension-slot/extension-slot.element.ts @@ -1,5 +1,9 @@ +import { type ManifestTypes, umbExtensionsRegistry } from '../../extension-registry/index.js'; import { css, repeat, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; -import { UmbExtensionElementController, UmbExtensionsElementController } from '@umbraco-cms/backoffice/extension-api'; +import { + type UmbExtensionElementController, + UmbExtensionsElementController, +} from '@umbraco-cms/backoffice/extension-api'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; export type InitializedExtension = { alias: string; weight: number; component: HTMLElement | null }; @@ -17,7 +21,7 @@ export type InitializedExtension = { alias: string; weight: number; component: H // TODO: Make property that reveals the amount of displayed/permitted extensions. @customElement('umb-extension-slot') export class UmbExtensionSlotElement extends UmbLitElement { - #extensionsController?: UmbExtensionsElementController; + #extensionsController?: UmbExtensionsElementController; @state() private _permittedExts: Array = []; @@ -51,17 +55,12 @@ export class UmbExtensionSlotElement extends UmbLitElement { private _observeExtensions() { this.#extensionsController?.destroy(); - if (this.type === 'treeItem') { - console.log('observe', this.type, this.defaultElement); - } this.#extensionsController = new UmbExtensionsElementController( this, + umbExtensionsRegistry, this.type, this.filter, (extensionControllers) => { - if (extensionControllers[0].manifest?.type === 'treeItem') { - console.log('extensionControllers', extensionControllers); - } this._permittedExts = extensionControllers; }, this.defaultElement diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/section/section-default.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/section/section-default.element.ts index c64477eaf2..07e0c56039 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/section/section-default.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/section/section-default.element.ts @@ -7,6 +7,7 @@ import { ManifestSectionSidebarApp, ManifestSectionSidebarAppMenuKind, UmbSectionExtensionElement, + umbExtensionsRegistry, } from '@umbraco-cms/backoffice/extension-registry'; import type { UmbRoute } from '@umbraco-cms/backoffice/router'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @@ -44,7 +45,7 @@ export class UmbSectionDefaultElement extends UmbLitElement implements UmbSectio constructor() { super(); - new UmbExtensionsElementController(this, 'sectionSidebarApp', null, (sidebarApps) => { + new UmbExtensionsElementController(this, umbExtensionsRegistry, 'sectionSidebarApp', null, (sidebarApps) => { const oldValue = this._sidebarApps; this._sidebarApps = sidebarApps; this.requestUpdate('_sidebarApps', oldValue); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/section/section-main-views/section-main-views.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/section/section-main-views/section-main-views.element.ts index 4c01a94fde..0279cbe2ab 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/section/section-main-views/section-main-views.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/section/section-main-views/section-main-views.element.ts @@ -6,6 +6,7 @@ import { ManifestSectionView, UmbDashboardExtensionElement, UmbSectionViewExtensionElement, + umbExtensionsRegistry, } from '@umbraco-cms/backoffice/extension-registry'; import { UmbExtensionsManifestController, createExtensionElement } from '@umbraco-cms/backoffice/extension-api'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @@ -35,12 +36,12 @@ export class UmbSectionMainViewElement extends UmbLitElement { constructor() { super(); - new UmbExtensionsManifestController(this, 'dashboard', null, (dashboards) => { + new UmbExtensionsManifestController(this, umbExtensionsRegistry, 'dashboard', null, (dashboards) => { this._dashboards = dashboards.map((dashboard) => dashboard.manifest); this.#createRoutes(); }); - new UmbExtensionsManifestController(this, 'sectionView', null, (views) => { + new UmbExtensionsManifestController(this, umbExtensionsRegistry, 'sectionView', null, (views) => { this._views = views.map((view) => view.manifest); this.#createRoutes(); });