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 d950cb2173..f4d24ccf25 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 @@ -125,6 +125,41 @@ describe('UmbBaseExtensionsController', () => { } ); }); + + it('consumed multiple types', (done) => { + const manifestExtra = { + type: 'extension-type-extra', + name: 'test-extension-extra', + alias: 'Umb.Test.Extension.Extra', + }; + testExtensionRegistry.register(manifestExtra); + let count = 0; + const extensionController = new UmbTestExtensionsController( + hostElement, + testExtensionRegistry, + ['extension-type', 'extension-type-extra'], + null, + (permitted) => { + count++; + if (count === 1) { + // First callback gives just one. We need to make a feature to gather changes to only reply after a computation cycle if we like to avoid this. + expect(permitted.length).to.eq(1); + } + if (count === 2) { + expect(permitted.length).to.eq(2); + } + if (count === 3) { + expect(permitted.length).to.eq(3); + expect(permitted[0].alias).to.eq('Umb.Test.Extension.A'); + expect(permitted[1].alias).to.eq('Umb.Test.Extension.B'); + expect(permitted[2].alias).to.eq('Umb.Test.Extension.Extra'); + + done(); + extensionController.destroy(); + } + } + ); + }); }); describe('Manifests without conditions overwrites another', () => { 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 5bba5fb679..0c40de910a 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 @@ -22,7 +22,7 @@ export abstract class UmbBaseExtensionsController< MyPermittedControllerType extends ControllerType = PermittedControllerType > extends UmbBaseController { #extensionRegistry: UmbExtensionRegistry; - #type: ManifestTypeName; + #type: ManifestTypeName | Array; #filter: undefined | null | ((manifest: ManifestType) => boolean); #onChange: (permittedManifests: Array, controller: MyPermittedControllerType) => void; protected _extensions: Array = []; @@ -31,7 +31,7 @@ export abstract class UmbBaseExtensionsController< constructor( host: UmbControllerHost, extensionRegistry: UmbExtensionRegistry, - type: ManifestTypeName, + type: ManifestTypeName | Array, filter: undefined | null | ((manifest: ManifestType) => boolean), onChange: (permittedManifests: Array, controller: MyPermittedControllerType) => void ) { @@ -42,7 +42,9 @@ export abstract class UmbBaseExtensionsController< this.#onChange = onChange; } protected _init() { - let source = this.#extensionRegistry.extensionsOfType(this.#type); + let source = Array.isArray(this.#type) + ? this.#extensionRegistry.extensionsOfTypes(this.#type as string[]) + : this.#extensionRegistry.extensionsOfType(this.#type as ManifestTypeName); if (this.#filter) { source = source.pipe(map((extensions: Array) => extensions.filter(this.#filter!))); } diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extension-element-controller.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extension-element-controller.ts index 443be01191..2e30f45e26 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extension-element-controller.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extension-element-controller.ts @@ -27,7 +27,7 @@ export class UmbExtensionElementController< * @memberof UmbElementExtensionController * @example * ```ts - * const controller = new UmbElementExtensionController(host, alias, onPermissionChanged); + * const controller = new UmbElementExtensionController(host, extensionRegistry, alias, onPermissionChanged); * controller.props = { foo: 'bar' }; * ``` * Is equivalent to: 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 f5cf612a5d..776d9470cc 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 @@ -41,7 +41,7 @@ export class UmbExtensionsElementController< constructor( host: UmbControllerHost, extensionRegistry: UmbExtensionRegistry, - type: ManifestTypeName, + type: ManifestTypeName | Array, filter: undefined | null | ((manifest: ManifestType) => boolean), onChange: (permittedManifests: Array, controller: MyPermittedControllerType) => void, defaultElement?: string 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 03c05468d0..c561e4098e 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 @@ -29,7 +29,7 @@ export class UmbExtensionsManifestController< constructor( host: UmbControllerHost, extensionRegistry: UmbExtensionRegistry, - type: ManifestTypeName, + type: ManifestTypeName | Array, filter: null | ((manifest: ManifestType) => boolean), onChange: (permittedManifests: Array, controller: MyPermittedControllerType) => void ) { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-editor/workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-editor/workspace-editor.element.ts index 4eb78d777e..344a933400 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-editor/workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-editor/workspace-editor.element.ts @@ -1,18 +1,12 @@ import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; import { css, html, nothing, customElement, property, state, repeat } from '@umbraco-cms/backoffice/external/lit'; -import { map } from '@umbraco-cms/backoffice/external/rxjs'; -import type { - PageComponent, - UmbRoute, - UmbRouterSlotInitEvent, - UmbRouterSlotChangeEvent, -} from '@umbraco-cms/backoffice/router'; +import type { UmbRoute, UmbRouterSlotInitEvent, UmbRouterSlotChangeEvent } from '@umbraco-cms/backoffice/router'; import { ManifestWorkspaceEditorView, ManifestWorkspaceViewCollection, umbExtensionsRegistry, } from '@umbraco-cms/backoffice/extension-registry'; -import { createExtensionElement } from '@umbraco-cms/backoffice/extension-api'; +import { UmbExtensionsElementController, createExtensionElement } from '@umbraco-cms/backoffice/extension-api'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { componentHasManifestProperty } from '@umbraco-cms/backoffice/utils'; @@ -75,6 +69,20 @@ export class UmbWorkspaceEditorElement extends UmbLitElement { @state() private _activePath?: string; + constructor() { + super(); + new UmbExtensionsElementController( + this, + umbExtensionsRegistry, + ['workspaceEditorView', 'workspaceViewCollection'], + null, + (workspaceViews) => { + this._workspaceViews = workspaceViews; + this._createRoutes(); + } + ); + } + private _observeWorkspaceViews() { this.observe( umbExtensionsRegistry.extensionsOfTypes([