diff --git a/src/Umbraco.Web.UI.Client/.eslintrc.json b/src/Umbraco.Web.UI.Client/.eslintrc.json index 7725f81d2c..62976c7e21 100644 --- a/src/Umbraco.Web.UI.Client/.eslintrc.json +++ b/src/Umbraco.Web.UI.Client/.eslintrc.json @@ -35,6 +35,8 @@ "local-rules/bad-type-import": "error", "local-rules/no-direct-api-import": "warn", "local-rules/prefer-import-aliases": "error", + "local-rules/enforce-element-suffix-on-element-class-name": "error", + "local-rules/prefer-umbraco-cms-imports": "error", "@typescript-eslint/no-non-null-assertion": "off" }, "settings": { diff --git a/src/Umbraco.Web.UI.Client/apps/auth/src/auth-layout.element.ts b/src/Umbraco.Web.UI.Client/apps/auth/src/auth-layout.element.ts index 28a5120e7f..8ad4209637 100644 --- a/src/Umbraco.Web.UI.Client/apps/auth/src/auth-layout.element.ts +++ b/src/Umbraco.Web.UI.Client/apps/auth/src/auth-layout.element.ts @@ -4,7 +4,7 @@ import logoImg from '/umbraco_logomark_white.svg'; import loginImg from '/login.jpeg'; @customElement('umb-auth-layout') -export class UmbAuthLayout extends LitElement { +export class UmbAuthLayoutElement extends LitElement { static styles: CSSResultGroup = [ css` #background { @@ -69,6 +69,6 @@ export class UmbAuthLayout extends LitElement { declare global { interface HTMLElementTagNameMap { - 'umb-auth-layout': UmbAuthLayout; + 'umb-auth-layout': UmbAuthLayoutElement; } } diff --git a/src/Umbraco.Web.UI.Client/apps/auth/src/login.element.ts b/src/Umbraco.Web.UI.Client/apps/auth/src/login.element.ts index d63b68f72d..018d87b14d 100644 --- a/src/Umbraco.Web.UI.Client/apps/auth/src/login.element.ts +++ b/src/Umbraco.Web.UI.Client/apps/auth/src/login.element.ts @@ -6,7 +6,7 @@ import { ifDefined } from 'lit/directives/if-defined.js'; import './auth-layout.element'; @customElement('umb-login') -export default class UmbLogin extends LitElement { +export default class UmbLoginElement extends LitElement { static styles: CSSResultGroup = [ UUITextStyles, css` @@ -113,6 +113,6 @@ export default class UmbLogin extends LitElement { declare global { interface HTMLElementTagNameMap { - 'umb-login': UmbLogin; + 'umb-login': UmbLoginElement; } } diff --git a/src/Umbraco.Web.UI.Client/apps/auth/src/login.test.ts b/src/Umbraco.Web.UI.Client/apps/auth/src/login.test.ts index d633c813aa..2b2d0a2ded 100644 --- a/src/Umbraco.Web.UI.Client/apps/auth/src/login.test.ts +++ b/src/Umbraco.Web.UI.Client/apps/auth/src/login.test.ts @@ -1,16 +1,16 @@ import { expect, fixture, html } from '@open-wc/testing'; import { defaultA11yConfig } from '@umbraco-cms/internal/test-utils'; -import UmbLogin from './login.element'; +import UmbLoginElement from './login.element'; describe('UmbLogin', () => { - let element: UmbLogin; + let element: UmbLoginElement; beforeEach(async () => { element = await fixture(html``); }); it('is defined with its own instance', () => { - expect(element).to.be.instanceOf(UmbLogin); + expect(element).to.be.instanceOf(UmbLoginElement); }); it('passes the a11y audit', async () => { diff --git a/src/Umbraco.Web.UI.Client/eslint-local-rules.cjs b/src/Umbraco.Web.UI.Client/eslint-local-rules.cjs index 1ec3bed82c..eb0fb35f03 100644 --- a/src/Umbraco.Web.UI.Client/eslint-local-rules.cjs +++ b/src/Umbraco.Web.UI.Client/eslint-local-rules.cjs @@ -20,18 +20,21 @@ module.exports = { create: function (context) { return { ImportDeclaration: function (node) { - if (node.source.parent.importKind !== 'type' && (node.source.value.endsWith('/models') || node.source.value === 'router-slot/model')) { + if ( + node.source.parent.importKind !== 'type' && + (node.source.value.endsWith('/models') || node.source.value === 'router-slot/model') + ) { const sourceCode = context.getSourceCode(); const nodeSource = sourceCode.getText(node); context.report({ node, message: 'Use `import type` instead of `import`.', - fix: fixer => fixer.replaceText(node, nodeSource.replace('import', 'import type')), + fix: (fixer) => fixer.replaceText(node, nodeSource.replace('import', 'import type')), }); } }, }; - } + }, }, /** @type {import('eslint').Rule.RuleModule} */ @@ -39,9 +42,10 @@ module.exports = { meta: { type: 'suggestion', docs: { - description: 'Ensures that any API resources from the `@umbraco-cms/backend-api` module are not used directly. Instead you should use the `tryExecuteAndNotify` function from the `@umbraco-cms/resources` module.', + description: + 'Ensures that any API resources from the `@umbraco-cms/backend-api` module are not used directly. Instead you should use the `tryExecuteAndNotify` function from the `@umbraco-cms/resources` module.', category: 'Best Practices', - recommended: true + recommended: true, }, fixable: 'code', schema: [], @@ -50,19 +54,30 @@ module.exports = { return { // If methods called on *Resource classes are not already wrapped with `await tryExecuteAndNotify()`, then we should suggest to wrap them. CallExpression: function (node) { - if (node.callee.type === 'MemberExpression' && node.callee.object.type === 'Identifier' && node.callee.object.name.endsWith('Resource') && node.callee.property.type === 'Identifier' && node.callee.property.name !== 'constructor') { - const hasTryExecuteAndNotify = node.parent && node.parent.callee && (node.parent.callee.name === 'tryExecute' || node.parent.callee.name === 'tryExecuteAndNotify'); + if ( + node.callee.type === 'MemberExpression' && + node.callee.object.type === 'Identifier' && + node.callee.object.name.endsWith('Resource') && + node.callee.property.type === 'Identifier' && + node.callee.property.name !== 'constructor' + ) { + const hasTryExecuteAndNotify = + node.parent && + node.parent.callee && + (node.parent.callee.name === 'tryExecute' || node.parent.callee.name === 'tryExecuteAndNotify'); if (!hasTryExecuteAndNotify) { context.report({ node, message: 'Wrap this call with `tryExecuteAndNotify()`. Make sure to `await` the result.', - fix: fixer => [fixer.insertTextBefore(node, 'tryExecuteAndNotify(this, '), fixer.insertTextAfter(node, ')')], + fix: (fixer) => [ + fixer.insertTextBefore(node, 'tryExecuteAndNotify(this, '), + fixer.insertTextAfter(node, ')'), + ], }); } } - } + }, }; - }, }, @@ -71,9 +86,10 @@ module.exports = { meta: { type: 'suggestion', docs: { - description: 'Ensures that the application does not rely on file system paths for imports. Instead, use import aliases or relative imports. This also solves a problem where GitHub fails on the test runner step.', + description: + 'Ensures that the application does not rely on file system paths for imports. Instead, use import aliases or relative imports. This also solves a problem where GitHub fails on the test runner step.', category: 'Best Practices', - recommended: true + recommended: true, }, schema: [], }, @@ -83,11 +99,76 @@ module.exports = { if (node.source.value.startsWith('src/')) { context.report({ node, - message: 'Prefer using import aliases or relative imports instead of absolute imports. Example: `import { MyComponent } from "src/components/MyComponent";` should be `import { MyComponent } from "@components/MyComponent";`' + message: + 'Prefer using import aliases or relative imports instead of absolute imports. Example: `import { MyComponent } from "src/components/MyComponent";` should be `import { MyComponent } from "@components/MyComponent";`', }); } }, }; - } + }, + }, + /** @type {import('eslint').Rule.RuleModule} */ + 'enforce-element-suffix-on-element-class-name': { + meta: { + type: 'suggestion', + docs: { + description: 'Enforce Element class name to end with "Element".', + category: 'Naming', + recommended: true, + }, + }, + create: function (context) { + return { + ClassDeclaration(node) { + // check if the class extends HTMLElement, LitElement, or UmbLitElement + const isExtendingElement = + node.superClass && ['HTMLElement', 'LitElement', 'UmbLitElement'].includes(node.superClass.name); + // check if the class name ends with 'Element' + const isClassNameValid = node.id.name.endsWith('Element'); + + if (isExtendingElement && !isClassNameValid) { + context.report({ + node, + message: "Element class name should end with 'Element'.", + // There us no fixer on purpose because it's not safe to rename the class. We want to do that trough the refactoring tool. + }); + } + }, + }; + }, + }, + // TODO: Its not bullet proof, but it will catch most/some cases. + /** @type {import('eslint').Rule.RuleModule} */ + 'prefer-umbraco-cms-imports': { + meta: { + type: 'suggestion', + docs: { + description: 'Replace relative imports to libs/... with @umbraco-cms/backoffice/...', + category: 'Best Practices', + recommended: true, + }, + fixable: 'code', + schema: [], + }, + create: function (context) { + const libsRegex = /(\.\.\/)*libs\/(.*)/; + return { + ImportDeclaration: function (node) { + const sourceValue = node.source.value; + if (sourceValue.startsWith('libs/') || libsRegex.test(sourceValue)) { + const importPath = sourceValue.replace(libsRegex, (match, p1, p2) => { + return `@umbraco-cms/backoffice/${p2}`; + }); + context.report({ + node, + message: `Use import alias @umbraco-cms/backoffice instead of relative path "${sourceValue}".`, + fix: function (fixer) { + return fixer.replaceTextRange(node.source.range, `'${importPath}'`); + }, + }); + } + }, + }; + }, }, }; diff --git a/src/Umbraco.Web.UI.Client/libs/context-api/consume/context-consumer.controller.ts b/src/Umbraco.Web.UI.Client/libs/context-api/consume/context-consumer.controller.ts index f9b72588b2..ed5bd3eeb2 100644 --- a/src/Umbraco.Web.UI.Client/libs/context-api/consume/context-consumer.controller.ts +++ b/src/Umbraco.Web.UI.Client/libs/context-api/consume/context-consumer.controller.ts @@ -1,10 +1,10 @@ import { UmbContextToken } from '../token/context-token'; import { UmbContextConsumer } from './context-consumer'; import { UmbContextCallback } from './context-request.event'; -import type { UmbControllerHostInterface, UmbControllerInterface } from '@umbraco-cms/backoffice/controller'; +import type { UmbControllerHostElement, UmbControllerInterface } from '@umbraco-cms/backoffice/controller'; export class UmbContextConsumerController - extends UmbContextConsumer + extends UmbContextConsumer implements UmbControllerInterface { public get unique() { @@ -12,7 +12,7 @@ export class UmbContextConsumerController } constructor( - host: UmbControllerHostInterface, + host: UmbControllerHostElement, contextAlias: string | UmbContextToken, callback: UmbContextCallback ) { diff --git a/src/Umbraco.Web.UI.Client/libs/context-api/consume/context-consumer.ts b/src/Umbraco.Web.UI.Client/libs/context-api/consume/context-consumer.ts index 5432b1dc0d..32bc1781a8 100644 --- a/src/Umbraco.Web.UI.Client/libs/context-api/consume/context-consumer.ts +++ b/src/Umbraco.Web.UI.Client/libs/context-api/consume/context-consumer.ts @@ -36,6 +36,10 @@ export class UmbContextConsumer { + // TODO: check that this check is not giving us any problems: + if (this._instance === instance) { + return; + } this._instance = instance; this._callback?.(instance); this._promiseResolver?.(instance); diff --git a/src/Umbraco.Web.UI.Client/libs/context-api/provide/context-provider.controller.ts b/src/Umbraco.Web.UI.Client/libs/context-api/provide/context-provider.controller.ts index 7412ae6a0c..46d4c9c1b5 100644 --- a/src/Umbraco.Web.UI.Client/libs/context-api/provide/context-provider.controller.ts +++ b/src/Umbraco.Web.UI.Client/libs/context-api/provide/context-provider.controller.ts @@ -1,16 +1,16 @@ import { UmbContextToken } from '../token/context-token'; import { UmbContextProvider } from './context-provider'; -import type { UmbControllerHostInterface, UmbControllerInterface } from '@umbraco-cms/backoffice/controller'; +import type { UmbControllerHostElement, UmbControllerInterface } from '@umbraco-cms/backoffice/controller'; export class UmbContextProviderController - extends UmbContextProvider + extends UmbContextProvider implements UmbControllerInterface { public get unique() { return this._contextAlias.toString(); } - constructor(host: UmbControllerHostInterface, contextAlias: string | UmbContextToken, instance: T) { + constructor(host: UmbControllerHostElement, contextAlias: string | UmbContextToken, instance: T) { super(host, contextAlias, instance); // If this API is already provided with this alias? Then we do not want to register this controller: diff --git a/src/Umbraco.Web.UI.Client/libs/controller/controller-host.mixin.ts b/src/Umbraco.Web.UI.Client/libs/controller/controller-host.mixin.ts index 7c7b2a7913..221da8d54b 100644 --- a/src/Umbraco.Web.UI.Client/libs/controller/controller-host.mixin.ts +++ b/src/Umbraco.Web.UI.Client/libs/controller/controller-host.mixin.ts @@ -1,9 +1,7 @@ import { UmbControllerInterface } from './controller.interface'; import type { HTMLElementConstructor } from '@umbraco-cms/backoffice/models'; -export declare class UmbControllerHostInterface extends HTMLElement { - //#controllers:UmbController[]; - //#attached:boolean; +export declare class UmbControllerHostElement extends HTMLElement { hasController(controller: UmbControllerInterface): boolean; getControllers(filterMethod: (ctrl: UmbControllerInterface) => boolean): UmbControllerInterface[]; addController(controller: UmbControllerInterface): void; @@ -101,7 +99,7 @@ export const UmbControllerHostMixin = (superCl } } - return UmbContextConsumerClass as unknown as HTMLElementConstructor & T; + return UmbContextConsumerClass as unknown as HTMLElementConstructor & T; }; declare global { diff --git a/src/Umbraco.Web.UI.Client/libs/controller/controller.class.ts b/src/Umbraco.Web.UI.Client/libs/controller/controller.class.ts index c34be538a7..f461faf6fc 100644 --- a/src/Umbraco.Web.UI.Client/libs/controller/controller.class.ts +++ b/src/Umbraco.Web.UI.Client/libs/controller/controller.class.ts @@ -1,15 +1,15 @@ -import { UmbControllerHostInterface } from './controller-host.mixin'; +import { UmbControllerHostElement } from './controller-host.mixin'; import { UmbControllerInterface } from './controller.interface'; export abstract class UmbController implements UmbControllerInterface { - protected host?: UmbControllerHostInterface; + protected host?: UmbControllerHostElement; private _alias?: string; public get unique() { return this._alias; } - constructor(host: UmbControllerHostInterface, alias?: string) { + constructor(host: UmbControllerHostElement, alias?: string) { this.host = host; this._alias = alias; this.host.addController(this); diff --git a/src/Umbraco.Web.UI.Client/libs/controller/controller.test.ts b/src/Umbraco.Web.UI.Client/libs/controller/controller.test.ts index 445af3b6d3..993bc546ca 100644 --- a/src/Umbraco.Web.UI.Client/libs/controller/controller.test.ts +++ b/src/Umbraco.Web.UI.Client/libs/controller/controller.test.ts @@ -1,6 +1,6 @@ import { expect } from '@open-wc/testing'; import { customElement } from 'lit/decorators.js'; -import { UmbControllerHostInterface, UmbControllerHostMixin } from './controller-host.mixin'; +import { UmbControllerHostElement, UmbControllerHostMixin } from './controller-host.mixin'; import { UmbContextProviderController } from '@umbraco-cms/backoffice/context-api'; class MyClass { @@ -11,13 +11,13 @@ class MyClass { export class MyHostElement extends UmbControllerHostMixin(HTMLElement) {} describe('UmbContextProvider', () => { - type NewType = UmbControllerHostInterface; + type NewType = UmbControllerHostElement; let hostElement: NewType; const contextInstance = new MyClass(); beforeEach(() => { - hostElement = document.createElement('test-my-controller-host') as UmbControllerHostInterface; + hostElement = document.createElement('test-my-controller-host') as UmbControllerHostElement; }); describe('Destroyed controllers is gone from host', () => { diff --git a/src/Umbraco.Web.UI.Client/libs/element/element.mixin.ts b/src/Umbraco.Web.UI.Client/libs/element/element.mixin.ts index aa81248a25..a53c101822 100644 --- a/src/Umbraco.Web.UI.Client/libs/element/element.mixin.ts +++ b/src/Umbraco.Web.UI.Client/libs/element/element.mixin.ts @@ -2,7 +2,7 @@ import { Observable } from 'rxjs'; import type { HTMLElementConstructor } from '@umbraco-cms/backoffice/models'; -import { UmbControllerHostInterface, UmbControllerHostMixin } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement, UmbControllerHostMixin } from '@umbraco-cms/backoffice/controller'; import { UmbContextToken, UmbContextCallback, @@ -16,7 +16,7 @@ interface ResolvedContexts { [key: string]: any; } -export declare class UmbElementMixinInterface extends UmbControllerHostInterface { +export declare class UmbElementMixinInterface extends UmbControllerHostElement { observe(source: Observable, callback: (_value: T) => void, unique?: string): UmbObserverController; provideContext(alias: string | UmbContextToken, instance: R): UmbContextProviderController; consumeContext( diff --git a/src/Umbraco.Web.UI.Client/libs/entity-action/action.ts b/src/Umbraco.Web.UI.Client/libs/entity-action/action.ts index 939ba6712a..536c4df85d 100644 --- a/src/Umbraco.Web.UI.Client/libs/entity-action/action.ts +++ b/src/Umbraco.Web.UI.Client/libs/entity-action/action.ts @@ -1,18 +1,18 @@ -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { umbExtensionsRegistry, createExtensionClass } from '@umbraco-cms/backoffice/extensions-api'; import { UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; export interface UmbAction { - host: UmbControllerHostInterface; + host: UmbControllerHostElement; repository: RepositoryType; execute(): Promise; } export class UmbActionBase { - host: UmbControllerHostInterface; + host: UmbControllerHostElement; repository?: RepositoryType; - constructor(host: UmbControllerHostInterface, repositoryAlias: string) { + constructor(host: UmbControllerHostElement, repositoryAlias: string) { this.host = host; // TODO: unsure a method can't be called before everything is initialized diff --git a/src/Umbraco.Web.UI.Client/libs/entity-action/actions/copy/copy.action.ts b/src/Umbraco.Web.UI.Client/libs/entity-action/actions/copy/copy.action.ts index bb2ff47436..f647d7f092 100644 --- a/src/Umbraco.Web.UI.Client/libs/entity-action/actions/copy/copy.action.ts +++ b/src/Umbraco.Web.UI.Client/libs/entity-action/actions/copy/copy.action.ts @@ -1,8 +1,8 @@ import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; export class UmbCopyEntityAction }> extends UmbEntityActionBase { - constructor(host: UmbControllerHostInterface, repositoryAlias: string, unique: string) { + constructor(host: UmbControllerHostElement, repositoryAlias: string, unique: string) { super(host, repositoryAlias, unique); } diff --git a/src/Umbraco.Web.UI.Client/libs/entity-action/actions/delete/delete.action.ts b/src/Umbraco.Web.UI.Client/libs/entity-action/actions/delete/delete.action.ts index 91b855ca74..0dfc13f22d 100644 --- a/src/Umbraco.Web.UI.Client/libs/entity-action/actions/delete/delete.action.ts +++ b/src/Umbraco.Web.UI.Client/libs/entity-action/actions/delete/delete.action.ts @@ -1,15 +1,14 @@ -import { UMB_CONFIRM_MODAL_TOKEN } from '../../../../src/backoffice/shared/modals/confirm'; import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; -import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; +import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN, UMB_CONFIRM_MODAL } from '@umbraco-cms/backoffice/modal'; export class UmbDeleteEntityAction< T extends { delete(unique: string): Promise; requestItems(uniques: Array): any } > extends UmbEntityActionBase { #modalContext?: UmbModalContext; - constructor(host: UmbControllerHostInterface, repositoryAlias: string, unique: string) { + constructor(host: UmbControllerHostElement, repositoryAlias: string, unique: string) { super(host, repositoryAlias, unique); new UmbContextConsumerController(this.host, UMB_MODAL_CONTEXT_TOKEN, (instance) => { @@ -25,7 +24,7 @@ export class UmbDeleteEntityAction< if (data) { const item = data[0]; - const modalHandler = this.#modalContext.open(UMB_CONFIRM_MODAL_TOKEN, { + const modalHandler = this.#modalContext.open(UMB_CONFIRM_MODAL, { headline: `Delete ${item.name}`, content: 'Are you sure you want to delete this item?', color: 'danger', diff --git a/src/Umbraco.Web.UI.Client/libs/entity-action/actions/move/move.action.ts b/src/Umbraco.Web.UI.Client/libs/entity-action/actions/move/move.action.ts index 284e33aba4..2744029e82 100644 --- a/src/Umbraco.Web.UI.Client/libs/entity-action/actions/move/move.action.ts +++ b/src/Umbraco.Web.UI.Client/libs/entity-action/actions/move/move.action.ts @@ -1,8 +1,8 @@ import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; export class UmbMoveEntityAction }> extends UmbEntityActionBase { - constructor(host: UmbControllerHostInterface, repositoryAlias: string, unique: string) { + constructor(host: UmbControllerHostElement, repositoryAlias: string, unique: string) { super(host, repositoryAlias, unique); } diff --git a/src/Umbraco.Web.UI.Client/libs/entity-action/actions/sort-children-of/sort-children-of.action.ts b/src/Umbraco.Web.UI.Client/libs/entity-action/actions/sort-children-of/sort-children-of.action.ts index ec055860c2..4816e9d1ff 100644 --- a/src/Umbraco.Web.UI.Client/libs/entity-action/actions/sort-children-of/sort-children-of.action.ts +++ b/src/Umbraco.Web.UI.Client/libs/entity-action/actions/sort-children-of/sort-children-of.action.ts @@ -1,10 +1,10 @@ import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; export class UmbSortChildrenOfEntityAction< T extends { sortChildrenOf(): Promise } > extends UmbEntityActionBase { - constructor(host: UmbControllerHostInterface, repositoryAlias: string, unique: string) { + constructor(host: UmbControllerHostElement, repositoryAlias: string, unique: string) { super(host, repositoryAlias, unique); } diff --git a/src/Umbraco.Web.UI.Client/libs/entity-action/actions/trash/trash.action.ts b/src/Umbraco.Web.UI.Client/libs/entity-action/actions/trash/trash.action.ts index 95888d0ec9..2b86b4d56c 100644 --- a/src/Umbraco.Web.UI.Client/libs/entity-action/actions/trash/trash.action.ts +++ b/src/Umbraco.Web.UI.Client/libs/entity-action/actions/trash/trash.action.ts @@ -1,15 +1,14 @@ -import { UMB_CONFIRM_MODAL_TOKEN } from '../../../../src/backoffice/shared/modals/confirm'; import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; -import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; +import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN, UMB_CONFIRM_MODAL } from '@umbraco-cms/backoffice/modal'; export class UmbTrashEntityAction< T extends { trash(unique: Array): Promise; requestTreeItems(uniques: Array): any } > extends UmbEntityActionBase { #modalContext?: UmbModalContext; - constructor(host: UmbControllerHostInterface, repositoryAlias: string, unique: string) { + constructor(host: UmbControllerHostElement, repositoryAlias: string, unique: string) { super(host, repositoryAlias, unique); new UmbContextConsumerController(this.host, UMB_MODAL_CONTEXT_TOKEN, (instance) => { @@ -25,7 +24,7 @@ export class UmbTrashEntityAction< if (data) { const item = data[0]; - const modalHandler = this.#modalContext?.open(UMB_CONFIRM_MODAL_TOKEN, { + const modalHandler = this.#modalContext?.open(UMB_CONFIRM_MODAL, { headline: `Trash ${item.name}`, content: 'Are you sure you want to move this item to the recycle bin?', color: 'danger', diff --git a/src/Umbraco.Web.UI.Client/libs/entity-action/entity-action.ts b/src/Umbraco.Web.UI.Client/libs/entity-action/entity-action.ts index 2e050d0eaf..c0235ae958 100644 --- a/src/Umbraco.Web.UI.Client/libs/entity-action/entity-action.ts +++ b/src/Umbraco.Web.UI.Client/libs/entity-action/entity-action.ts @@ -1,5 +1,5 @@ import { UmbAction, UmbActionBase } from './action'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; export interface UmbEntityAction extends UmbAction { unique: string; @@ -8,7 +8,7 @@ export interface UmbEntityAction extends UmbAction extends UmbActionBase { unique: string; - constructor(host: UmbControllerHostInterface, repositoryAlias: string, unique: string) { + constructor(host: UmbControllerHostElement, repositoryAlias: string, unique: string) { super(host, repositoryAlias); this.unique = unique; } diff --git a/src/Umbraco.Web.UI.Client/libs/entity-action/entity-bulk-action.ts b/src/Umbraco.Web.UI.Client/libs/entity-action/entity-bulk-action.ts index 16e084927b..22f7d58dbe 100644 --- a/src/Umbraco.Web.UI.Client/libs/entity-action/entity-bulk-action.ts +++ b/src/Umbraco.Web.UI.Client/libs/entity-action/entity-bulk-action.ts @@ -1,5 +1,5 @@ import { UmbAction, UmbActionBase } from './action'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; export interface UmbEntityBulkAction extends UmbAction { selection: Array; @@ -9,7 +9,7 @@ export interface UmbEntityBulkAction extends UmbAction export class UmbEntityBulkActionBase extends UmbActionBase { selection: Array; - constructor(host: UmbControllerHostInterface, repositoryAlias: string, selection: Array) { + constructor(host: UmbControllerHostElement, repositoryAlias: string, selection: Array) { super(host, repositoryAlias); this.selection = selection; } diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-api/umb-lifecycle.interface.ts b/src/Umbraco.Web.UI.Client/libs/extensions-api/umb-lifecycle.interface.ts index a676b15c1b..e2ec64bcc5 100644 --- a/src/Umbraco.Web.UI.Client/libs/extensions-api/umb-lifecycle.interface.ts +++ b/src/Umbraco.Web.UI.Client/libs/extensions-api/umb-lifecycle.interface.ts @@ -1,7 +1,7 @@ import type { UmbExtensionRegistry } from './registry/extension.registry'; -import type { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; -export type UmbEntrypointOnInit = (host: UmbControllerHostInterface, extensionRegistry: UmbExtensionRegistry) => void; +export type UmbEntrypointOnInit = (host: UmbControllerHostElement, extensionRegistry: UmbExtensionRegistry) => void; /** * Interface containing supported life-cycle functions for ESModule entrypoints diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/entry-point-extension-initializer.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/entry-point-extension-initializer.ts index e1e051f5f8..1ab0d19abe 100644 --- a/src/Umbraco.Web.UI.Client/libs/extensions-registry/entry-point-extension-initializer.ts +++ b/src/Umbraco.Web.UI.Client/libs/extensions-registry/entry-point-extension-initializer.ts @@ -1,12 +1,12 @@ import type { ManifestEntrypoint } from './models'; import { hasInitExport, loadExtension, UmbExtensionRegistry } from '@umbraco-cms/backoffice/extensions-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; export class UmbEntryPointExtensionInitializer { #rootHost; #extensionRegistry; - constructor(rootHost: UmbControllerHostInterface, extensionRegistry: UmbExtensionRegistry) { + constructor(rootHost: UmbControllerHostElement, extensionRegistry: UmbExtensionRegistry) { this.#rootHost = rootHost; this.#extensionRegistry = extensionRegistry; // TODO: change entrypoint extension to be entryPoint: diff --git a/src/Umbraco.Web.UI.Client/libs/modal/index.ts b/src/Umbraco.Web.UI.Client/libs/modal/index.ts index 3c252e27f2..3e2caa5f16 100644 --- a/src/Umbraco.Web.UI.Client/libs/modal/index.ts +++ b/src/Umbraco.Web.UI.Client/libs/modal/index.ts @@ -1,4 +1,6 @@ export * from './modal.context'; export * from './modal-handler'; -export * from './token/modal-token'; +export * from './modal-route-registration'; +export * from './modal-route-registration.controller'; +export * from './token'; export * from './modal.interfaces'; diff --git a/src/Umbraco.Web.UI.Client/libs/modal/modal-handler.ts b/src/Umbraco.Web.UI.Client/libs/modal/modal-handler.ts index 9d70723a1d..43f10f9e14 100644 --- a/src/Umbraco.Web.UI.Client/libs/modal/modal-handler.ts +++ b/src/Umbraco.Web.UI.Client/libs/modal/modal-handler.ts @@ -10,13 +10,13 @@ import { UmbModalConfig, UmbModalType } from './modal.context'; import { UmbModalToken } from './token/modal-token'; import { createExtensionElement, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extensions-api'; import { UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; -import type { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import type { ManifestModal } from '@umbraco-cms/backoffice/extensions-registry'; /** * Type which omits the real submit method, and replaces it with a submit method which accepts an optional argument depending on the generic type. */ -export type UmbModalHandler = Omit< +export type UmbModalHandler = Omit< UmbModalHandlerClass, 'submit' > & @@ -38,15 +38,15 @@ type OptionalSubmitArgumentIfUndefined = T extends undefined }; //TODO consider splitting this into two separate handlers -export class UmbModalHandlerClass { +export class UmbModalHandlerClass { private _submitPromise: Promise; private _submitResolver?: (value: ModalResult) => void; private _submitRejecter?: () => void; - #host: UmbControllerHostInterface; + #host: UmbControllerHostElement; public modalElement: UUIModalDialogElement | UUIModalSidebarElement; - #innerElement = new BehaviorSubject(undefined); + #innerElement = new BehaviorSubject(undefined); public readonly innerElement = this.#innerElement.asObservable(); #modalElement?: UUIModalSidebarElement | UUIDialogElement; @@ -56,7 +56,7 @@ export class UmbModalHandlerClass { public size: UUIModalSidebarSize = 'small'; constructor( - host: UmbControllerHostInterface, + host: UmbControllerHostElement, modalAlias: string | UmbModalToken, data?: ModalData, config?: UmbModalConfig @@ -106,7 +106,7 @@ export class UmbModalHandlerClass { const innerElement = (await createExtensionElement(manifest)) as any; if (innerElement) { - innerElement.data = data; // + innerElement.data = data; //innerElement.observable = this.#dataObservable; innerElement.modalHandler = this; } @@ -114,7 +114,7 @@ export class UmbModalHandlerClass { return innerElement; } - // note, this methods argument is not defined correctly here, but requires to be fix by appending the OptionalSubmitArgumentIfUndefined type when newing up this class. + // note, this methods is private argument is not defined correctly here, but requires to be fix by appending the OptionalSubmitArgumentIfUndefined type when newing up this class. private submit(result?: ModalResult) { this._submitResolver?.(result as ModalResult); this.modalElement.close(); @@ -140,22 +140,25 @@ export class UmbModalHandlerClass { async (manifest) => { if (manifest) { const innerElement = await this.#createInnerElement(manifest, data); - this.#appendInnerElement(innerElement); - } else { - this.#removeInnerElement(); + if (innerElement) { + this.#appendInnerElement(innerElement); + return; + } } + this.#removeInnerElement(); } ); } - #appendInnerElement(element: any) { + #appendInnerElement(element: HTMLElement) { this.#modalElement?.appendChild(element); this.#innerElement.next(element); } #removeInnerElement() { - if (this.#innerElement.getValue()) { - this.#modalElement?.removeChild(this.#innerElement.getValue()); + const innerElement = this.#innerElement.getValue(); + if (innerElement) { + this.#modalElement?.removeChild(innerElement); this.#innerElement.next(undefined); } } diff --git a/src/Umbraco.Web.UI.Client/libs/modal/modal-route-registration.controller.ts b/src/Umbraco.Web.UI.Client/libs/modal/modal-route-registration.controller.ts new file mode 100644 index 0000000000..213debd539 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/modal/modal-route-registration.controller.ts @@ -0,0 +1,88 @@ +// TODO: Be aware here we import a class from src! +import { UMB_ROUTE_CONTEXT_TOKEN } from '../router/route.context'; +import { UmbModalRouteRegistration } from './modal-route-registration'; +import type { UmbControllerHostElement, UmbControllerInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; +import { UmbModalConfig, UmbModalToken } from '@umbraco-cms/backoffice/modal'; + +export class UmbModalRouteRegistrationController + extends UmbModalRouteRegistration + implements UmbControllerInterface +{ + //#host: UmbControllerHostInterface; + + #configuredPath: string; + #uniqueParts: Map; + + #routeContext?: typeof UMB_ROUTE_CONTEXT_TOKEN.TYPE; + #modalRegistration?: UmbModalRouteRegistration; + + public get unique() { + return undefined; + } + + constructor( + host: UmbControllerHostElement, + alias: UmbModalToken | string, + path: string, + uniqueParts?: Map | null, + modalConfig?: UmbModalConfig + ) { + super(alias, path, modalConfig); + //this.#host = host; + this.#configuredPath = path; + this.#uniqueParts = uniqueParts || new Map(); + + new UmbContextConsumerController(host, UMB_ROUTE_CONTEXT_TOKEN, (_routeContext) => { + this.#routeContext = _routeContext; + this._registererModal(); + }); + } + + setUniqueIdentifier(identifier: string, value: string | undefined) { + if (!this.#uniqueParts.has(identifier)) { + throw new Error( + `Identifier ${identifier} was not registered at the construction of the modal registration controller, it has to be.` + ); + } + this.#uniqueParts.set(identifier, value); + this._registererModal(); + } + + private _registererModal() { + if (!this.#routeContext) return; + if (this.#modalRegistration) { + this.#routeContext.unregisterModal(this.#modalRegistration); + this.#modalRegistration = undefined; + } + + const pathParts = Array.from(this.#uniqueParts.values()); + + // Check if there is any undefined values of unique map: + if (pathParts.some((value) => value === undefined)) return; + + // Add the configured part of the path: + pathParts.push(this.#configuredPath); + + // Make this the path of the modal registration: + this._setPath(pathParts.join('/')); + + this.#modalRegistration = this.#routeContext.registerModal(this); + } + + hostConnected() { + if (!this.#modalRegistration) { + this._registererModal(); + } + } + hostDisconnected(): void { + if (this.#modalRegistration) { + this.#routeContext?.unregisterModal(this.#modalRegistration); + this.#modalRegistration = undefined; + } + } + + public destroy(): void { + this.hostDisconnected(); + } +} diff --git a/src/Umbraco.Web.UI.Client/libs/modal/modal-route-registration.ts b/src/Umbraco.Web.UI.Client/libs/modal/modal-route-registration.ts new file mode 100644 index 0000000000..095da5f546 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/modal/modal-route-registration.ts @@ -0,0 +1,115 @@ +import type { Params } from 'router-slot'; +import { v4 as uuidv4 } from 'uuid'; +import { UmbModalHandler } from './modal-handler'; +import { UmbModalConfig, UmbModalContext } from './modal.context'; +import { UmbModalToken } from './token/modal-token'; + +export type UmbModalRouteBuilder = (params: { [key: string]: string | number }) => string; + +export class UmbModalRouteRegistration { + #key: string; + #path: string; + #modalAlias: UmbModalToken | string; + #modalConfig?: UmbModalConfig; + + #onSetupCallback?: (routingInfo: Params) => UmbModalTokenData | false; + #onSubmitCallback?: (data: UmbModalTokenResult) => void; + #onRejectCallback?: () => void; + + #modalHandler: UmbModalHandler | undefined; + #routeBuilder?: UmbModalRouteBuilder; + #urlBuilderCallback: ((urlBuilder: UmbModalRouteBuilder) => void) | undefined; + + // Notice i removed the key in the transferring to this class. + constructor( + modalAlias: UmbModalToken | string, + path: string, + modalConfig?: UmbModalConfig + ) { + this.#key = modalConfig?.key || uuidv4(); + this.#modalAlias = modalAlias; + this.#path = path; + this.#modalConfig = { ...modalConfig, key: this.#key }; + } + + public get key() { + return this.#key; + } + + public get alias() { + return this.#modalAlias; + } + + public get path() { + return this.#path; + } + + protected _setPath(path: string) { + this.#path = path; + } + + public get modalConfig() { + return this.#modalConfig; + } + + /** + * Returns true if the modal is currently active. + */ + public get active() { + return !!this.#modalHandler; + } + + public open(params: { [key: string]: string | number }) { + if (this.active) return; + + window.history.pushState({}, '', this.#routeBuilder?.(params)); + } + + /** + * Returns the modal handler if the modal is currently active. Otherwise its undefined. + */ + public get modalHandler() { + return this.#modalHandler; + } + + public observeRouteBuilder(callback: (urlBuilder: UmbModalRouteBuilder) => void) { + this.#urlBuilderCallback = callback; + return this; + } + public _internal_setRouteBuilder(urlBuilder: UmbModalRouteBuilder) { + this.#routeBuilder = urlBuilder; + this.#urlBuilderCallback?.(urlBuilder); + } + + public onSetup(callback: (routingInfo: Params) => UmbModalTokenData | false) { + this.#onSetupCallback = callback; + return this; + } + public onSubmit(callback: (data: UmbModalTokenResult) => void) { + this.#onSubmitCallback = callback; + return this; + } + public onReject(callback: () => void) { + this.#onRejectCallback = callback; + return this; + } + + #onSubmit = (data: UmbModalTokenResult) => { + this.#onSubmitCallback?.(data); + this.#modalHandler = undefined; + }; + #onReject = () => { + this.#onRejectCallback?.(); + this.#modalHandler = undefined; + }; + + routeSetup(modalContext: UmbModalContext, params: Params) { + const modalData = this.#onSetupCallback ? this.#onSetupCallback(params) : undefined; + if (modalData !== false) { + this.#modalHandler = modalContext.open(this.#modalAlias, modalData, this.modalConfig); + this.#modalHandler.onSubmit().then(this.#onSubmit, this.#onReject); + return this.#modalHandler; + } + return null; + } +} diff --git a/src/Umbraco.Web.UI.Client/libs/modal/modal.context.ts b/src/Umbraco.Web.UI.Client/libs/modal/modal.context.ts index 3bce518c35..1d58c827df 100644 --- a/src/Umbraco.Web.UI.Client/libs/modal/modal.context.ts +++ b/src/Umbraco.Web.UI.Client/libs/modal/modal.context.ts @@ -6,7 +6,7 @@ import { BehaviorSubject } from 'rxjs'; import { UmbModalHandler, UmbModalHandlerClass } from './modal-handler'; import type { UmbModalToken } from './token/modal-token'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; export type UmbModalType = 'dialog' | 'sidebar'; @@ -19,12 +19,12 @@ export interface UmbModalConfig { // TODO: we should find a way to easily open a modal without adding custom methods to this context. It would result in a better separation of concerns. // TODO: move all layouts into their correct "silo" folders. User picker should live with users etc. export class UmbModalContext { - host: UmbControllerHostInterface; + host: UmbControllerHostElement; // TODO: Investigate if we can get rid of HTML elements in our store, so we can use one of our states. - #modals = new BehaviorSubject(>>[]); + #modals = new BehaviorSubject(>[]); public readonly modals = this.#modals.asObservable(); - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { this.host = host; } @@ -75,7 +75,7 @@ export class UmbModalContext { * @return {*} {UmbModalHandler} * @memberof UmbModalContext */ - public open( + public open( modalAlias: string | UmbModalToken, data?: ModalData, config?: UmbModalConfig diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/modals/allowed-document-types/index.ts b/src/Umbraco.Web.UI.Client/libs/modal/token/allowed-document-types-modal.token.ts similarity index 83% rename from src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/modals/allowed-document-types/index.ts rename to src/Umbraco.Web.UI.Client/libs/modal/token/allowed-document-types-modal.token.ts index f4c5820dd4..74e37ca564 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/modals/allowed-document-types/index.ts +++ b/src/Umbraco.Web.UI.Client/libs/modal/token/allowed-document-types-modal.token.ts @@ -8,7 +8,7 @@ export interface UmbAllowedDocumentTypesModalResult { documentTypeKey: string; } -export const UMB_ALLOWED_DOCUMENT_TYPES_MODAL_TOKEN = new UmbModalToken< +export const UMB_ALLOWED_DOCUMENT_TYPES_MODAL = new UmbModalToken< UmbAllowedDocumentTypesModalData, UmbAllowedDocumentTypesModalResult >('Umb.Modal.AllowedDocumentTypes', { diff --git a/src/Umbraco.Web.UI.Client/libs/modal/token/change-password-modal.token.ts b/src/Umbraco.Web.UI.Client/libs/modal/token/change-password-modal.token.ts new file mode 100644 index 0000000000..b2db240cd6 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/modal/token/change-password-modal.token.ts @@ -0,0 +1,9 @@ +import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; + +export interface UmbChangePasswordModalData { + requireOldPassword: boolean; +} + +export const UMB_CHANGE_PASSWORD_MODAL = new UmbModalToken('Umb.Modal.ChangePassword', { + type: 'dialog', +}); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/confirm/index.ts b/src/Umbraco.Web.UI.Client/libs/modal/token/confirm-modal.token.ts similarity index 67% rename from src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/confirm/index.ts rename to src/Umbraco.Web.UI.Client/libs/modal/token/confirm-modal.token.ts index 17a03869d0..612881bc26 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/confirm/index.ts +++ b/src/Umbraco.Web.UI.Client/libs/modal/token/confirm-modal.token.ts @@ -10,9 +10,6 @@ export interface UmbConfirmModalData { export type UmbConfirmModalResult = undefined; -export const UMB_CONFIRM_MODAL_TOKEN = new UmbModalToken( - 'Umb.Modal.Confirm', - { - type: 'dialog', - } -); +export const UMB_CONFIRM_MODAL = new UmbModalToken('Umb.Modal.Confirm', { + type: 'dialog', +}); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/create/index.ts b/src/Umbraco.Web.UI.Client/libs/modal/token/create-dictionary-modal.token.ts similarity index 87% rename from src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/create/index.ts rename to src/Umbraco.Web.UI.Client/libs/modal/token/create-dictionary-modal.token.ts index 16ab4fd003..3e635f2cc4 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/create/index.ts +++ b/src/Umbraco.Web.UI.Client/libs/modal/token/create-dictionary-modal.token.ts @@ -12,7 +12,7 @@ export interface UmbCreateDictionaryModalResult { name?: string; } -export const UMB_CREATE_DICTIONARY_MODAL_TOKEN = new UmbModalToken< +export const UMB_CREATE_DICTIONARY_MODAL = new UmbModalToken< UmbCreateDictionaryModalData, UmbCreateDictionaryModalResult >('Umb.Modal.CreateDictionary', { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/modals/invite-user/index.ts b/src/Umbraco.Web.UI.Client/libs/modal/token/create-user-modal.token.ts similarity index 53% rename from src/Umbraco.Web.UI.Client/src/backoffice/users/users/modals/invite-user/index.ts rename to src/Umbraco.Web.UI.Client/libs/modal/token/create-user-modal.token.ts index 713bb7ae62..5ac7a0a780 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/modals/invite-user/index.ts +++ b/src/Umbraco.Web.UI.Client/libs/modal/token/create-user-modal.token.ts @@ -1,6 +1,6 @@ import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; -export const UMB_INVITE_USER_MODAL_TOKEN = new UmbModalToken('Umb.Modal.InviteUser', { +export const UMB_CREATE_USER_MODAL = new UmbModalToken('Umb.Modal.CreateUser', { type: 'dialog', size: 'small', }); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/modals/current-user/index.ts b/src/Umbraco.Web.UI.Client/libs/modal/token/current-user-modal.token.ts similarity index 53% rename from src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/modals/current-user/index.ts rename to src/Umbraco.Web.UI.Client/libs/modal/token/current-user-modal.token.ts index 382b450ae7..5a78080a7a 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/modals/current-user/index.ts +++ b/src/Umbraco.Web.UI.Client/libs/modal/token/current-user-modal.token.ts @@ -1,6 +1,6 @@ import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; -export const UMB_CURRENT_USER_MODAL_TOKEN = new UmbModalToken('Umb.Modal.CurrentUser', { +export const UMB_CURRENT_USER_MODAL = new UmbModalToken('Umb.Modal.CurrentUser', { type: 'sidebar', size: 'small', }); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/modals/debug/index.ts b/src/Umbraco.Web.UI.Client/libs/modal/token/debug-modal.token.ts similarity index 52% rename from src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/modals/debug/index.ts rename to src/Umbraco.Web.UI.Client/libs/modal/token/debug-modal.token.ts index 760efebb80..7e3f797a38 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/modals/debug/index.ts +++ b/src/Umbraco.Web.UI.Client/libs/modal/token/debug-modal.token.ts @@ -5,10 +5,7 @@ export interface UmbContextDebuggerModalData { content: TemplateResult | string; } -export const UMB_CONTEXT_DEBUGGER_MODAL_TOKEN = new UmbModalToken( - 'Umb.Modal.ContextDebugger', - { - type: 'sidebar', - size: 'small', - } -); +export const UMB_CONTEXT_DEBUGGER_MODAL = new UmbModalToken('Umb.Modal.ContextDebugger', { + type: 'sidebar', + size: 'small', +}); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/modals/document-picker/index.ts b/src/Umbraco.Web.UI.Client/libs/modal/token/document-picker-modal.token.ts similarity index 55% rename from src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/modals/document-picker/index.ts rename to src/Umbraco.Web.UI.Client/libs/modal/token/document-picker-modal.token.ts index 4452cf228d..133318c692 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/modals/document-picker/index.ts +++ b/src/Umbraco.Web.UI.Client/libs/modal/token/document-picker-modal.token.ts @@ -9,10 +9,10 @@ export interface UmbDocumentPickerModalResult { selection: Array; } -export const UMB_DOCUMENT_PICKER_MODAL_TOKEN = new UmbModalToken< - UmbDocumentPickerModalData, - UmbDocumentPickerModalResult ->('Umb.Modal.DocumentPicker', { - type: 'sidebar', - size: 'small', -}); +export const UMB_DOCUMENT_PICKER_MODAL = new UmbModalToken( + 'Umb.Modal.DocumentPicker', + { + type: 'sidebar', + size: 'small', + } +); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/embedded-media/index.ts b/src/Umbraco.Web.UI.Client/libs/modal/token/embedded-media-modal.token.ts similarity index 85% rename from src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/embedded-media/index.ts rename to src/Umbraco.Web.UI.Client/libs/modal/token/embedded-media-modal.token.ts index 9d88041456..f62fa29907 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/embedded-media/index.ts +++ b/src/Umbraco.Web.UI.Client/libs/modal/token/embedded-media-modal.token.ts @@ -28,7 +28,7 @@ export interface UmbEmbeddedMediaModalResult extends UmbEmbeddedMediaModalData { originalHeight: number; }; -export const UMB_EMBEDDED_MEDIA_MODAL_TOKEN = new UmbModalToken( +export const UMB_EMBEDDED_MEDIA_MODAL = new UmbModalToken( 'Umb.Modal.EmbeddedMedia', { type: 'sidebar', diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/examine-management/views/modal-views/index.ts b/src/Umbraco.Web.UI.Client/libs/modal/token/examine-fields-settings-modal.token.ts similarity index 84% rename from src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/examine-management/views/modal-views/index.ts rename to src/Umbraco.Web.UI.Client/libs/modal/token/examine-fields-settings-modal.token.ts index 1e1e727379..d6f6aec2d7 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/examine-management/views/modal-views/index.ts +++ b/src/Umbraco.Web.UI.Client/libs/modal/token/examine-fields-settings-modal.token.ts @@ -9,7 +9,7 @@ export interface UmbCreateDocumentModalResultData { fields?: UmbExamineFieldsSettingsModalData; } -export const UMB_EXAMINE_FIELDS_SETTINGS_MODAL_TOKEN = new UmbModalToken< +export const UMB_EXAMINE_FIELDS_SETTINGS_MODAL = new UmbModalToken< UmbExamineFieldsSettingsModalData, UmbCreateDocumentModalResultData >('Umb.Modal.ExamineFieldsSettings', { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/export/index.ts b/src/Umbraco.Web.UI.Client/libs/modal/token/export-dictionary-modal.token.ts similarity index 83% rename from src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/export/index.ts rename to src/Umbraco.Web.UI.Client/libs/modal/token/export-dictionary-modal.token.ts index 003aae1dfc..4ae285e25f 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/export/index.ts +++ b/src/Umbraco.Web.UI.Client/libs/modal/token/export-dictionary-modal.token.ts @@ -8,7 +8,7 @@ export interface UmbExportDictionaryModalResult { includeChildren?: boolean; } -export const UMB_EXPORT_DICTIONARY_MODAL_TOKEN = new UmbModalToken< +export const UMB_EXPORT_DICTIONARY_MODAL = new UmbModalToken< UmbExportDictionaryModalData, UmbExportDictionaryModalResult >('Umb.Modal.ExportDictionary', { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/icon-picker/index.ts b/src/Umbraco.Web.UI.Client/libs/modal/token/icon-picker-modal.token.ts similarity index 74% rename from src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/icon-picker/index.ts rename to src/Umbraco.Web.UI.Client/libs/modal/token/icon-picker-modal.token.ts index 50badac9ec..0ae41a9fbb 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/icon-picker/index.ts +++ b/src/Umbraco.Web.UI.Client/libs/modal/token/icon-picker-modal.token.ts @@ -10,7 +10,7 @@ export interface UmbIconPickerModalResult { icon: string | undefined; } -export const UMB_ICON_PICKER_MODAL_TOKEN = new UmbModalToken( +export const UMB_ICON_PICKER_MODAL = new UmbModalToken( 'Umb.Modal.IconPicker', { type: 'sidebar', diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/import/index.ts b/src/Umbraco.Web.UI.Client/libs/modal/token/import-dictionary-modal.token.ts similarity index 86% rename from src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/import/index.ts rename to src/Umbraco.Web.UI.Client/libs/modal/token/import-dictionary-modal.token.ts index 6172aaf811..745279c619 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/import/index.ts +++ b/src/Umbraco.Web.UI.Client/libs/modal/token/import-dictionary-modal.token.ts @@ -11,7 +11,7 @@ export interface UmbImportDictionaryModalResult { parentKey?: string; } -export const UMB_IMPORT_DICTIONARY_MODAL_TOKEN = new UmbModalToken< +export const UMB_IMPORT_DICTIONARY_MODAL = new UmbModalToken< UmbImportDictionaryModalData, UmbImportDictionaryModalResult >('Umb.Modal.ImportDictionary', { diff --git a/src/Umbraco.Web.UI.Client/libs/modal/token/index.ts b/src/Umbraco.Web.UI.Client/libs/modal/token/index.ts new file mode 100644 index 0000000000..5840ca1bee --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/modal/token/index.ts @@ -0,0 +1,24 @@ +export * from './modal-token'; +export * from './allowed-document-types-modal.token'; +export * from './change-password-modal.token'; +export * from './confirm-modal.token'; +export * from './create-dictionary-modal.token'; +export * from './create-user-modal.token'; +export * from './current-user-modal.token'; +export * from './debug-modal.token'; +export * from './document-picker-modal.token'; +export * from './embedded-media-modal.token'; +export * from './examine-fields-settings-modal.token'; +export * from './export-dictionary-modal.token'; +export * from './icon-picker-modal.token'; +export * from './import-dictionary-modal.token'; +export * from './invite-user-modal.token'; +export * from './language-picker-modal.token'; +export * from './link-picker-modal.token'; +export * from './media-picker-modal.token'; +export * from './property-editor-ui-picker-modal.token'; +export * from './property-settings-modal.token'; +export * from './search-modal.token'; +export * from './section-picker-modal.token'; +export * from './user-group-picker-modal.token'; +export * from './user-picker-modal.token'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/modals/create-user/index.ts b/src/Umbraco.Web.UI.Client/libs/modal/token/invite-user-modal.token.ts similarity index 53% rename from src/Umbraco.Web.UI.Client/src/backoffice/users/users/modals/create-user/index.ts rename to src/Umbraco.Web.UI.Client/libs/modal/token/invite-user-modal.token.ts index 8a5868f272..20bb006c54 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/modals/create-user/index.ts +++ b/src/Umbraco.Web.UI.Client/libs/modal/token/invite-user-modal.token.ts @@ -1,6 +1,6 @@ import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; -export const UMB_CREATE_USER_MODAL_TOKEN = new UmbModalToken('Umb.Modal.CreateUser', { +export const UMB_INVITE_USER_MODAL = new UmbModalToken('Umb.Modal.InviteUser', { type: 'dialog', size: 'small', }); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/modals/language-picker/index.ts b/src/Umbraco.Web.UI.Client/libs/modal/token/language-picker-modal.token.ts similarity index 65% rename from src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/modals/language-picker/index.ts rename to src/Umbraco.Web.UI.Client/libs/modal/token/language-picker-modal.token.ts index 477754bc5d..fb47287bd9 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/modals/language-picker/index.ts +++ b/src/Umbraco.Web.UI.Client/libs/modal/token/language-picker-modal.token.ts @@ -11,10 +11,10 @@ export interface UmbLanguagePickerModalResult { selection: Array; } -export const UMB_LANGUAGE_PICKER_MODAL_TOKEN = new UmbModalToken< - UmbLanguagePickerModalData, - UmbLanguagePickerModalResult ->('Umb.Modal.LanguagePicker', { - type: 'sidebar', - size: 'small', -}); +export const UMB_LANGUAGE_PICKER_MODAL = new UmbModalToken( + 'Umb.Modal.LanguagePicker', + { + type: 'sidebar', + size: 'small', + } +); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/link-picker/index.ts b/src/Umbraco.Web.UI.Client/libs/modal/token/link-picker-modal.token.ts similarity index 78% rename from src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/link-picker/index.ts rename to src/Umbraco.Web.UI.Client/libs/modal/token/link-picker-modal.token.ts index f83d03dc4c..025b5582cb 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/link-picker/index.ts +++ b/src/Umbraco.Web.UI.Client/libs/modal/token/link-picker-modal.token.ts @@ -2,11 +2,12 @@ import type { UUIModalSidebarSize } from '@umbraco-ui/uui'; import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; export interface UmbLinkPickerModalData { + index: number | null; link: UmbLinkPickerLink; config: UmbLinkPickerConfig; } -export type UmbLinkPickerModalResult = UmbLinkPickerLink; +export type UmbLinkPickerModalResult = { index: number | null; link: UmbLinkPickerLink }; export interface UmbLinkPickerLink { icon?: string | null; @@ -26,7 +27,7 @@ export interface UmbLinkPickerConfig { overlaySize?: UUIModalSidebarSize; } -export const UMB_LINK_PICKER_MODAL_TOKEN = new UmbModalToken( +export const UMB_LINK_PICKER_MODAL = new UmbModalToken( 'Umb.Modal.LinkPicker', { type: 'sidebar', diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/modals/media-picker/index.ts b/src/Umbraco.Web.UI.Client/libs/modal/token/media-picker-modal.token.ts similarity index 72% rename from src/Umbraco.Web.UI.Client/src/backoffice/media/media/modals/media-picker/index.ts rename to src/Umbraco.Web.UI.Client/libs/modal/token/media-picker-modal.token.ts index 4cb0657504..94607575c4 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/modals/media-picker/index.ts +++ b/src/Umbraco.Web.UI.Client/libs/modal/token/media-picker-modal.token.ts @@ -9,7 +9,7 @@ export interface UmbMediaPickerModalResult { selection: Array; } -export const UMB_MEDIA_PICKER_MODAL_TOKEN = new UmbModalToken( +export const UMB_MEDIA_PICKER_MODAL = new UmbModalToken( 'Umb.Modal.MediaPicker', { type: 'sidebar', diff --git a/src/Umbraco.Web.UI.Client/libs/modal/token/modal-token.ts b/src/Umbraco.Web.UI.Client/libs/modal/token/modal-token.ts index ab466d34d7..99510c47a8 100644 --- a/src/Umbraco.Web.UI.Client/libs/modal/token/modal-token.ts +++ b/src/Umbraco.Web.UI.Client/libs/modal/token/modal-token.ts @@ -1,6 +1,6 @@ import { UmbModalConfig } from '../modal.context'; -export class UmbModalToken { +export class UmbModalToken { /** * Get the data type of the token's data. * diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/modals/property-editor-ui-picker/index.ts b/src/Umbraco.Web.UI.Client/libs/modal/token/property-editor-ui-picker-modal.token.ts similarity index 84% rename from src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/modals/property-editor-ui-picker/index.ts rename to src/Umbraco.Web.UI.Client/libs/modal/token/property-editor-ui-picker-modal.token.ts index 4c3f86509f..9bff24f2fe 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/modals/property-editor-ui-picker/index.ts +++ b/src/Umbraco.Web.UI.Client/libs/modal/token/property-editor-ui-picker-modal.token.ts @@ -9,7 +9,7 @@ export type UmbPropertyEditorUIPickerModalResult = { selection: Array; }; -export const UMB_PROPERTY_EDITOR_UI_PICKER_MODAL_TOKEN = new UmbModalToken< +export const UMB_PROPERTY_EDITOR_UI_PICKER_MODAL = new UmbModalToken< UmbPropertyEditorUIPickerModalData, UmbPropertyEditorUIPickerModalResult >('Umb.Modal.PropertyEditorUIPicker', { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/property-settings/index.ts b/src/Umbraco.Web.UI.Client/libs/modal/token/property-settings-modal.token.ts similarity index 81% rename from src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/property-settings/index.ts rename to src/Umbraco.Web.UI.Client/libs/modal/token/property-settings-modal.token.ts index be4f7659f5..80d28d4578 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/property-settings/index.ts +++ b/src/Umbraco.Web.UI.Client/libs/modal/token/property-settings-modal.token.ts @@ -17,7 +17,7 @@ export interface UmbPropertySettingsModalResult { }; } -export const UMB_PROPERTY_SETTINGS_MODAL_TOKEN = new UmbModalToken( +export const UMB_PROPERTY_SETTINGS_MODAL = new UmbModalToken( 'Umb.Modal.PropertySettings', { type: 'sidebar', diff --git a/src/Umbraco.Web.UI.Client/libs/modal/token/search-modal.token.ts b/src/Umbraco.Web.UI.Client/libs/modal/token/search-modal.token.ts new file mode 100644 index 0000000000..e3a99aab38 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/modal/token/search-modal.token.ts @@ -0,0 +1,3 @@ +import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; + +export const UMB_SEARCH_MODAL = new UmbModalToken('Umb.Modal.Search'); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/section-picker/index.ts b/src/Umbraco.Web.UI.Client/libs/modal/token/section-picker-modal.token.ts similarity index 61% rename from src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/section-picker/index.ts rename to src/Umbraco.Web.UI.Client/libs/modal/token/section-picker-modal.token.ts index 95edf154c6..c74346cc70 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/section-picker/index.ts +++ b/src/Umbraco.Web.UI.Client/libs/modal/token/section-picker-modal.token.ts @@ -5,7 +5,7 @@ export interface UmbSectionPickerModalData { selection: string[]; } -export const UMB_SECTION_PICKER_MODAL_TOKEN = new UmbModalToken('Umb.Modal.SectionPicker', { +export const UMB_SECTION_PICKER_MODAL = new UmbModalToken('Umb.Modal.SectionPicker', { type: 'sidebar', size: 'small', }); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/modals/user-group-picker/index.ts b/src/Umbraco.Web.UI.Client/libs/modal/token/user-group-picker-modal.token.ts similarity index 69% rename from src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/modals/user-group-picker/index.ts rename to src/Umbraco.Web.UI.Client/libs/modal/token/user-group-picker-modal.token.ts index 5c67576638..4264345e24 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/modals/user-group-picker/index.ts +++ b/src/Umbraco.Web.UI.Client/libs/modal/token/user-group-picker-modal.token.ts @@ -1,7 +1,7 @@ import type { UserDetails } from '@umbraco-cms/backoffice/models'; import { UmbModalToken, UmbPickerModalData } from '@umbraco-cms/backoffice/modal'; -export const UMB_USER_GROUP_PICKER_MODAL_TOKEN = new UmbModalToken>( +export const UMB_USER_GROUP_PICKER_MODAL = new UmbModalToken>( 'Umb.Modal.UserGroupPicker', { type: 'sidebar', diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/modals/user-picker/index.ts b/src/Umbraco.Web.UI.Client/libs/modal/token/user-picker-modal.token.ts similarity index 61% rename from src/Umbraco.Web.UI.Client/src/backoffice/users/users/modals/user-picker/index.ts rename to src/Umbraco.Web.UI.Client/libs/modal/token/user-picker-modal.token.ts index 4e247bef86..c1bf2c975a 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/modals/user-picker/index.ts +++ b/src/Umbraco.Web.UI.Client/libs/modal/token/user-picker-modal.token.ts @@ -1,7 +1,7 @@ import type { UserDetails } from '@umbraco-cms/backoffice/models'; import { UmbModalToken, UmbPickerModalData } from '@umbraco-cms/backoffice/modal'; -export const UMB_USER_PICKER_MODAL_TOKEN = new UmbModalToken>('Umb.Modal.UserPicker', { +export const UMB_USER_PICKER_MODAL = new UmbModalToken>('Umb.Modal.UserPicker', { type: 'sidebar', size: 'small', }); diff --git a/src/Umbraco.Web.UI.Client/libs/observable-api/index.ts b/src/Umbraco.Web.UI.Client/libs/observable-api/index.ts index dbfa7cf4b5..424099e1ec 100644 --- a/src/Umbraco.Web.UI.Client/libs/observable-api/index.ts +++ b/src/Umbraco.Web.UI.Client/libs/observable-api/index.ts @@ -1,5 +1,6 @@ export * from './observer.controller'; export * from './observer'; +export * from './basic-state'; export * from './boolean-state'; export * from './number-state'; export * from './string-state'; diff --git a/src/Umbraco.Web.UI.Client/libs/observable-api/observer.controller.ts b/src/Umbraco.Web.UI.Client/libs/observable-api/observer.controller.ts index 2975d41555..f4d1f9bf49 100644 --- a/src/Umbraco.Web.UI.Client/libs/observable-api/observer.controller.ts +++ b/src/Umbraco.Web.UI.Client/libs/observable-api/observer.controller.ts @@ -1,6 +1,6 @@ import { Observable } from 'rxjs'; import { UmbObserver } from './observer'; -import { UmbControllerInterface, UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerInterface, UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; export class UmbObserverController extends UmbObserver implements UmbControllerInterface { _alias?: string; @@ -8,7 +8,7 @@ export class UmbObserverController extends UmbObserver implement return this._alias; } - constructor(host: UmbControllerHostInterface, source: Observable, callback: (_value: T) => void, alias?: string) { + constructor(host: UmbControllerHostElement, source: Observable, callback: (_value: T) => void, alias?: string) { super(source, callback); this._alias = alias; diff --git a/src/Umbraco.Web.UI.Client/libs/observable-api/observer.ts b/src/Umbraco.Web.UI.Client/libs/observable-api/observer.ts index 0ce9ce6fef..20eb7a0a34 100644 --- a/src/Umbraco.Web.UI.Client/libs/observable-api/observer.ts +++ b/src/Umbraco.Web.UI.Client/libs/observable-api/observer.ts @@ -17,7 +17,8 @@ export class UmbObserver { } hostDisconnected() { - this.#subscription.unsubscribe(); + // No cause then it cant re-connect, if the same element just was moved in DOM. + //this.#subscription.unsubscribe(); } destroy(): void { diff --git a/src/Umbraco.Web.UI.Client/libs/resources/resource.controller.ts b/src/Umbraco.Web.UI.Client/libs/resources/resource.controller.ts index aa12fa3adc..c323c76d2a 100644 --- a/src/Umbraco.Web.UI.Client/libs/resources/resource.controller.ts +++ b/src/Umbraco.Web.UI.Client/libs/resources/resource.controller.ts @@ -5,7 +5,7 @@ import { UMB_NOTIFICATION_CONTEXT_TOKEN, } from '@umbraco-cms/backoffice/notification'; import { ApiError, CancelablePromise, ProblemDetailsModel } from '@umbraco-cms/backoffice/backend-api'; -import { UmbController, UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbController, UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; import type { DataSourceResponse } from '@umbraco-cms/backoffice/repository'; @@ -14,7 +14,7 @@ export class UmbResourceController extends UmbController { #notificationContext?: UmbNotificationContext; - constructor(host: UmbControllerHostInterface, promise: Promise, alias?: string) { + constructor(host: UmbControllerHostElement, promise: Promise, alias?: string) { super(host, alias); this.#promise = promise; diff --git a/src/Umbraco.Web.UI.Client/libs/resources/tryExecuteAndNotify.function.ts b/src/Umbraco.Web.UI.Client/libs/resources/tryExecuteAndNotify.function.ts index b9b4222d59..d34b90fb02 100644 --- a/src/Umbraco.Web.UI.Client/libs/resources/tryExecuteAndNotify.function.ts +++ b/src/Umbraco.Web.UI.Client/libs/resources/tryExecuteAndNotify.function.ts @@ -1,10 +1,10 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import { UmbResourceController } from './resource.controller'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import type { UmbNotificationOptions } from '@umbraco-cms/backoffice/notification'; export function tryExecuteAndNotify( - host: UmbControllerHostInterface, + host: UmbControllerHostElement, resource: Promise, options?: UmbNotificationOptions ) { diff --git a/src/Umbraco.Web.UI.Client/libs/router/index.ts b/src/Umbraco.Web.UI.Client/libs/router/index.ts new file mode 100644 index 0000000000..5a49b1769d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/router/index.ts @@ -0,0 +1,3 @@ +export * from './route-location.interface'; +export * from './route.context'; +export * from './route.interface'; diff --git a/src/Umbraco.Web.UI.Client/src/core/router/route-location.interface.ts b/src/Umbraco.Web.UI.Client/libs/router/route-location.interface.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/core/router/route-location.interface.ts rename to src/Umbraco.Web.UI.Client/libs/router/route-location.interface.ts diff --git a/src/Umbraco.Web.UI.Client/libs/router/route.context.ts b/src/Umbraco.Web.UI.Client/libs/router/route.context.ts new file mode 100644 index 0000000000..da5364d1df --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/router/route.context.ts @@ -0,0 +1,143 @@ +import type { IRoutingInfo, ISlashOptions } from 'router-slot'; +import { UmbRoute } from './route.interface'; +import { + UmbContextConsumerController, + UmbContextProviderController, + UmbContextToken, +} from '@umbraco-cms/backoffice/context-api'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; +import { UMB_MODAL_CONTEXT_TOKEN, UmbModalRouteRegistration } from '@umbraco-cms/backoffice/modal'; + +const EmptyDiv = document.createElement('div'); + +const PARAM_IDENTIFIER = /:([^\\/]+)/g; + +function stripSlash(path: string): string { + return slashify(path, { start: false, end: false }); +} + +function slashify(path: string, { start = true, end = true }: Partial = {}): string { + path = start && !path.startsWith('/') ? `/${path}` : !start && path.startsWith('/') ? path.slice(1) : path; + return end && !path.endsWith('/') ? `${path}/` : !end && path.endsWith('/') ? path.slice(0, path.length - 1) : path; +} + +export class UmbRouteContext { + #modalRegistrations: UmbModalRouteRegistration[] = []; + #modalContext?: typeof UMB_MODAL_CONTEXT_TOKEN.TYPE; + #contextRoutes: UmbRoute[] = []; + #routerBasePath?: string; + #activeModalPath?: string; + + constructor(host: UmbControllerHostElement, private _onGotModals: (contextRoutes: any) => void) { + new UmbContextProviderController(host, UMB_ROUTE_CONTEXT_TOKEN, this); + new UmbContextConsumerController(host, UMB_MODAL_CONTEXT_TOKEN, (context) => { + this.#modalContext = context; + this.#generateContextRoutes(); + }); + } + + public registerModal(registration: UmbModalRouteRegistration) { + this.#modalRegistrations.push(registration); + this.#generateNewUrlBuilder(registration); + this.#generateContextRoutes(); + return registration; + } + + public unregisterModal(registrationToken: ReturnType) { + const index = this.#modalRegistrations.indexOf(registrationToken); + if (index === -1) return; + this.#modalRegistrations.splice(index, 1); + this.#generateContextRoutes(); + } + + #getModalRoutePath(modalRegistration: UmbModalRouteRegistration) { + return `/modal/${modalRegistration.alias.toString()}/${modalRegistration.path}`; + } + + #generateRoute(modalRegistration: UmbModalRouteRegistration): UmbRoute { + return { + path: this.#getModalRoutePath(modalRegistration), + component: EmptyDiv, + setup: (component: HTMLElement, info: IRoutingInfo) => { + if (!this.#modalContext) return; + const modalHandler = modalRegistration.routeSetup(this.#modalContext, info.match.params); + if (modalHandler) { + modalHandler.onSubmit().then( + () => { + this.#removeModalPath(info); + }, + () => { + this.#removeModalPath(info); + } + ); + } + }, + }; + } + + #removeModalPath(info: IRoutingInfo) { + if (window.location.href.includes(info.match.fragments.consumed)) { + window.history.pushState({}, '', window.location.href.split(info.match.fragments.consumed)[0]); + } + } + + #generateContextRoutes() { + this.#contextRoutes = this.#modalRegistrations.map((modalRegistration) => { + return this.#generateRoute(modalRegistration); + }); + + // Add an empty route, so there is a route for the router to react on when no modals are open. + this.#contextRoutes.push({ + path: '', + component: EmptyDiv, + }); + + // TODO: Should we await one frame, to ensure we don't call back too much?. + this._onGotModals(this.#contextRoutes); + } + + public _internal_routerGotBasePath(routerBasePath: string) { + if (this.#routerBasePath === routerBasePath) return; + this.#routerBasePath = routerBasePath; + this.#generateNewUrlBuilders(); + } + + // Also notice each registration should now hold its handler when its active. + public _internal_modalRouterChanged(activeModalPath: string | undefined) { + if (this.#activeModalPath === activeModalPath) return; + if (this.#activeModalPath) { + // If if there is a modal using the old path. + const activeModal = this.#modalRegistrations.find( + (registration) => this.#getModalRoutePath(registration) === this.#activeModalPath + ); + if (activeModal) { + this.#modalContext?.close(activeModal.key); + } + } + this.#activeModalPath = activeModalPath; + } + + #generateNewUrlBuilders() { + this.#modalRegistrations.forEach(this.#generateNewUrlBuilder); + } + + #generateNewUrlBuilder = (modalRegistration: UmbModalRouteRegistration) => { + if (!this.#routerBasePath) return; + + const routeBasePath = this.#routerBasePath.endsWith('/') ? this.#routerBasePath : this.#routerBasePath + '/'; + const localPath = `modal/${modalRegistration.alias.toString()}/${modalRegistration.path}`; + + const urlBuilder = (params: { [key: string]: string | number }) => { + const localRoutePath = stripSlash( + localPath.replace(PARAM_IDENTIFIER, (substring: string, ...args: string[]) => { + return params[args[0]].toString(); + }) + ); + return routeBasePath + localRoutePath; + }; + + modalRegistration._internal_setRouteBuilder(urlBuilder); + }; +} + +export const UMB_ROUTE_CONTEXT_TOKEN = new UmbContextToken('UmbRouterContext'); diff --git a/src/Umbraco.Web.UI.Client/libs/router/route.interface.ts b/src/Umbraco.Web.UI.Client/libs/router/route.interface.ts new file mode 100644 index 0000000000..b76705bd13 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/router/route.interface.ts @@ -0,0 +1,3 @@ +import type { IRoute } from 'router-slot/model'; + +export type UmbRoute = IRoute; diff --git a/src/Umbraco.Web.UI.Client/libs/store/store-base.ts b/src/Umbraco.Web.UI.Client/libs/store/store-base.ts index b377a59391..a934ab6871 100644 --- a/src/Umbraco.Web.UI.Client/libs/store/store-base.ts +++ b/src/Umbraco.Web.UI.Client/libs/store/store-base.ts @@ -1,8 +1,8 @@ import { UmbContextProviderController } from '@umbraco-cms/backoffice/context-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; export class UmbStoreBase { - constructor(protected _host: UmbControllerHostInterface, public readonly storeAlias: string) { + constructor(protected _host: UmbControllerHostElement, public readonly storeAlias: string) { new UmbContextProviderController(_host, storeAlias, this); } } diff --git a/src/Umbraco.Web.UI.Client/libs/workspace/actions/save/save.action.ts b/src/Umbraco.Web.UI.Client/libs/workspace/actions/save/save.action.ts index dde528e171..b2f986912f 100644 --- a/src/Umbraco.Web.UI.Client/libs/workspace/actions/save/save.action.ts +++ b/src/Umbraco.Web.UI.Client/libs/workspace/actions/save/save.action.ts @@ -1,10 +1,10 @@ import { UmbWorkspaceContextInterface } from '../../context/workspace-context.interface'; import { UmbWorkspaceActionBase } from '../workspace-action-base'; -import type { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; // TODO: add interface for repo/partial repo/save-repo export class UmbSaveWorkspaceAction extends UmbWorkspaceActionBase { - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { super(host); } diff --git a/src/Umbraco.Web.UI.Client/libs/workspace/actions/workspace-action-base.ts b/src/Umbraco.Web.UI.Client/libs/workspace/actions/workspace-action-base.ts index cf7e2f97b0..0037d8ca5b 100644 --- a/src/Umbraco.Web.UI.Client/libs/workspace/actions/workspace-action-base.ts +++ b/src/Umbraco.Web.UI.Client/libs/workspace/actions/workspace-action-base.ts @@ -1,16 +1,16 @@ -import type { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; export interface UmbWorkspaceAction { - host: UmbControllerHostInterface; + host: UmbControllerHostElement; workspaceContext?: T; execute(): Promise; } export class UmbWorkspaceActionBase { - host: UmbControllerHostInterface; + host: UmbControllerHostElement; workspaceContext?: WorkspaceType; - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { this.host = host; new UmbContextConsumerController(this.host, 'umbWorkspaceContext', (instance: WorkspaceType) => { diff --git a/src/Umbraco.Web.UI.Client/libs/workspace/context/workspace-context.interface.ts b/src/Umbraco.Web.UI.Client/libs/workspace/context/workspace-context.interface.ts index d5ef7d313b..b90df89de2 100644 --- a/src/Umbraco.Web.UI.Client/libs/workspace/context/workspace-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/libs/workspace/context/workspace-context.interface.ts @@ -1,8 +1,8 @@ import { Observable } from 'rxjs'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; export interface UmbWorkspaceContextInterface { - host: UmbControllerHostInterface; + host: UmbControllerHostElement; repository: any; // TODO: add type isNew: Observable; getIsNew(): boolean; diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json index d596e8958d..a0b1ce33a2 100644 --- a/src/Umbraco.Web.UI.Client/package.json +++ b/src/Umbraco.Web.UI.Client/package.json @@ -30,8 +30,8 @@ "build": "tsc && vite build --mode staging", "build:libs": "npm run wc-analyze && npm run wc-analyze:vscode && rollup -c rollup-libs.config.js && node utils/move-libs.js", "build:for:static": "tsc && vite build", - "build:for:cms": "tsc && vite build -c vite.cms.config.ts && npm run build:libs", - "build:for:cms:watch": "vite build -c vite.cms.config.ts --watch", + "build:for:cms": "tsc && npm run build:libs && vite build -c vite.cms.config.ts", + "build:for:cms:watch": "tsc && npm run build:libs && vite build -c vite.cms.config.ts --watch", "preview": "vite preview --open", "test": "web-test-runner --coverage", "test:watch": "web-test-runner --watch", diff --git a/src/Umbraco.Web.UI.Client/src/app.ts b/src/Umbraco.Web.UI.Client/src/app.ts index c6176bd363..3f6a096e15 100644 --- a/src/Umbraco.Web.UI.Client/src/app.ts +++ b/src/Umbraco.Web.UI.Client/src/app.ts @@ -4,6 +4,7 @@ import './core/css/custom-properties.css'; import 'element-internals-polyfill'; import './core/router/router-slot.element'; +import './core/router/variant-router-slot.element'; import './core/notification/layouts/default'; import './core/modal/modal-element.element'; @@ -12,7 +13,6 @@ import { css, html } from 'lit'; import { customElement, property, state } from 'lit/decorators.js'; import { UmbIconStore } from './core/stores/icon/icon.store'; - import type { Guard, IRoute } from '@umbraco-cms/internal/router'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -20,7 +20,7 @@ import { OpenAPI, RuntimeLevelModel, ServerResource } from '@umbraco-cms/backoff import { umbDebugContextEventType } from '@umbraco-cms/backoffice/context-api'; @customElement('umb-app') -export class UmbApp extends UmbLitElement { +export class UmbAppElement extends UmbLitElement { static styles = css` :host { overflow: hidden; @@ -156,6 +156,6 @@ export class UmbApp extends UmbLitElement { declare global { interface HTMLElementTagNameMap { - 'umb-app': UmbApp; + 'umb-app': UmbAppElement; } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/dashboards/redirect-management/dashboard-redirect-management.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/dashboards/redirect-management/dashboard-redirect-management.element.ts index 174905edee..42fa9ae950 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/dashboards/redirect-management/dashboard-redirect-management.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/dashboards/redirect-management/dashboard-redirect-management.element.ts @@ -2,8 +2,7 @@ import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { css, html, nothing } from 'lit'; import { customElement, state, query, property } from 'lit/decorators.js'; import { UUIButtonState, UUIPaginationElement, UUIPaginationEvent } from '@umbraco-ui/uui'; -import { UMB_CONFIRM_MODAL_TOKEN } from '../../../shared/modals/confirm'; -import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; +import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN, UMB_CONFIRM_MODAL } from '@umbraco-cms/backoffice/modal'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { RedirectManagementResource, @@ -21,7 +20,7 @@ export class UmbDashboardRedirectManagementElement extends UmbLitElement { display: block; margin: var(--uui-size-layout-1); } - + .actions { display: flex; gap: var(--uui-size-space-1); @@ -136,7 +135,7 @@ export class UmbDashboardRedirectManagementElement extends UmbLitElement { } private _removeRedirectHandler(data: RedirectUrlResponseModel) { - const modalHandler = this._modalContext?.open(UMB_CONFIRM_MODAL_TOKEN, { + const modalHandler = this._modalContext?.open(UMB_CONFIRM_MODAL, { headline: 'Delete', content: html`
@@ -167,7 +166,7 @@ export class UmbDashboardRedirectManagementElement extends UmbLitElement { } private _disableRedirectHandler() { - const modalHandler = this._modalContext?.open(UMB_CONFIRM_MODAL_TOKEN, { + const modalHandler = this._modalContext?.open(UMB_CONFIRM_MODAL, { headline: 'Disable URL tracker', content: html`Are you sure you want to disable the URL tracker?`, color: 'danger', diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-blueprints/document-blueprint.detail.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-blueprints/document-blueprint.detail.store.ts index febb564943..f0efc47b4b 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-blueprints/document-blueprint.detail.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-blueprints/document-blueprint.detail.store.ts @@ -2,7 +2,7 @@ import type { DocumentBlueprintDetails } from '@umbraco-cms/backoffice/models'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { ArrayState } from '@umbraco-cms/backoffice/observable-api'; import { UmbStoreBase } from '@umbraco-cms/backoffice/store'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; /** * @export @@ -14,7 +14,7 @@ export class UmbDocumentBlueprintStore extends UmbStoreBase { // TODO: use the right type: #data = new ArrayState([], (x) => x.key); - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { super(host, UMB_DOCUMENT_BLUEPRINT_STORE_CONTEXT_TOKEN.toString()); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-blueprints/document-blueprint.tree.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-blueprints/document-blueprint.tree.store.ts index cbb0c01bbb..5b56f8bea8 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-blueprints/document-blueprint.tree.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-blueprints/document-blueprint.tree.store.ts @@ -1,6 +1,6 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/store'; -import type { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; export const UMB_DOCUMENT_BLUEPRINT_TREE_STORE_CONTEXT_TOKEN = new UmbContextToken( 'UmbDocumentBlueprintTreeStore' @@ -13,7 +13,7 @@ export const UMB_DOCUMENT_BLUEPRINT_TREE_STORE_CONTEXT_TOKEN = new UmbContextTok * @description - Tree Data Store for Document Blueprints */ export class UmbDocumentBlueprintTreeStore extends UmbEntityTreeStore { - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { super(host, UMB_DOCUMENT_BLUEPRINT_TREE_STORE_CONTEXT_TOKEN.toString()); } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/modals/allowed-document-types/allowed-document-types-modal.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/modals/allowed-document-types/allowed-document-types-modal.element.ts index 85a14bb33c..ff55e6dfc3 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/modals/allowed-document-types/allowed-document-types-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/modals/allowed-document-types/allowed-document-types-modal.element.ts @@ -3,7 +3,7 @@ import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { customElement, state } from 'lit/decorators.js'; import { ifDefined } from 'lit/directives/if-defined.js'; import { UmbDocumentTypeRepository } from '../../repository/document-type.repository'; -import { UmbAllowedDocumentTypesModalData, UmbAllowedDocumentTypesModalResult } from '.'; +import { UmbAllowedDocumentTypesModalData, UmbAllowedDocumentTypesModalResult } from '@umbraco-cms/backoffice/modal'; import { UmbModalBaseElement } from '@umbraco-cms/internal/modal'; import { DocumentTypeTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/document-type.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/document-type.repository.ts index aae1b52131..24eeb55d75 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/document-type.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/document-type.repository.ts @@ -3,7 +3,7 @@ import { UmbDocumentTypeServerDataSource } from './sources/document-type.server. import { UmbDocumentTypeTreeStore, UMB_DOCUMENT_TYPE_TREE_STORE_CONTEXT_TOKEN } from './document-type.tree.store'; import { UmbDocumentTypeStore, UMB_DOCUMENT_TYPE_STORE_CONTEXT_TOKEN } from './document-type.store'; import type { UmbTreeDataSource, UmbTreeRepository, UmbDetailRepository } from '@umbraco-cms/backoffice/repository'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; import { ProblemDetailsModel, DocumentTypeResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; @@ -13,7 +13,7 @@ type ItemType = DocumentTypeResponseModel; export class UmbDocumentTypeRepository implements UmbTreeRepository, UmbDetailRepository { #init!: Promise; - #host: UmbControllerHostInterface; + #host: UmbControllerHostElement; #treeSource: UmbTreeDataSource; #treeStore?: UmbDocumentTypeTreeStore; @@ -23,7 +23,7 @@ export class UmbDocumentTypeRepository implements UmbTreeRepository, U #notificationContext?: UmbNotificationContext; - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { this.#host = host; // TODO: figure out how spin up get the correct data source diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/document-type.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/document-type.store.ts index 80d83734c4..f8b258866d 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/document-type.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/document-type.store.ts @@ -2,7 +2,7 @@ import { DocumentTypeResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { ArrayState } from '@umbraco-cms/backoffice/observable-api'; import { UmbStoreBase } from '@umbraco-cms/backoffice/store'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; /** * @export @@ -15,10 +15,10 @@ export class UmbDocumentTypeStore extends UmbStoreBase { /** * Creates an instance of UmbDocumentTypeStore. - * @param {UmbControllerHostInterface} host + * @param {UmbControllerHostElement} host * @memberof UmbDocumentTypeStore */ - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { super(host, UMB_DOCUMENT_TYPE_STORE_CONTEXT_TOKEN.toString()); } @@ -50,6 +50,4 @@ export class UmbDocumentTypeStore extends UmbStoreBase { } } -export const UMB_DOCUMENT_TYPE_STORE_CONTEXT_TOKEN = new UmbContextToken( - 'UmbDocumentTypeStore' -); +export const UMB_DOCUMENT_TYPE_STORE_CONTEXT_TOKEN = new UmbContextToken('UmbDocumentTypeStore'); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/document-type.tree.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/document-type.tree.store.ts index 4052a3ff76..83bcc484e2 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/document-type.tree.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/document-type.tree.store.ts @@ -1,6 +1,6 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/store'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; /** * @export @@ -12,10 +12,10 @@ import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; export class UmbDocumentTypeTreeStore extends UmbEntityTreeStore { /** * Creates an instance of UmbDocumentTypeTreeStore. - * @param {UmbControllerHostInterface} host + * @param {UmbControllerHostElement} host * @memberof UmbDocumentTypeTreeStore */ - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { super(host, UMB_DOCUMENT_TYPE_TREE_STORE_CONTEXT_TOKEN.toString()); } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/sources/document-type.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/sources/document-type.server.data.ts index f5819640ff..5f96641f64 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/sources/document-type.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/sources/document-type.server.data.ts @@ -4,7 +4,7 @@ import { ProblemDetailsModel, DocumentTypeResponseModel, } from '@umbraco-cms/backoffice/backend-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; /** @@ -14,14 +14,14 @@ import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; * @implements {RepositoryDetailDataSource} */ export class UmbDocumentTypeServerDataSource implements UmbDataSource { - #host: UmbControllerHostInterface; + #host: UmbControllerHostElement; /** * Creates an instance of UmbDocumentServerDataSource. - * @param {UmbControllerHostInterface} host + * @param {UmbControllerHostElement} host * @memberof UmbDocumentServerDataSource */ - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { this.#host = host; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/sources/document-type.tree.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/sources/document-type.tree.server.data.ts index 6d5f8877f4..67830a5e43 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/sources/document-type.tree.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/sources/document-type.tree.server.data.ts @@ -1,6 +1,6 @@ import type { UmbTreeDataSource } from '@umbraco-cms/backoffice/repository'; import { ProblemDetailsModel, DocumentTypeResource } from '@umbraco-cms/backoffice/backend-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; /** @@ -10,7 +10,7 @@ import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; * @implements {DocumentTreeDataSource} */ export class DocumentTypeTreeServerDataSource implements UmbTreeDataSource { - #host: UmbControllerHostInterface; + #host: UmbControllerHostElement; // TODO: how do we handle trashed items? async trashItems(keys: Array) { @@ -43,10 +43,10 @@ export class DocumentTypeTreeServerDataSource implements UmbTreeDataSource { /** * Creates an instance of DocumentTreeServerDataSource. - * @param {UmbControllerHostInterface} host + * @param {UmbControllerHostElement} host * @memberof DocumentTreeServerDataSource */ - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { this.#host = host; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/document-type-workspace-edit.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/document-type-workspace-edit.element.ts index 099a206e97..cf68341d44 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/document-type-workspace-edit.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/document-type-workspace-edit.element.ts @@ -2,11 +2,10 @@ import { UUIInputElement, UUIInputEvent } from '@umbraco-ui/uui'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { css, html } from 'lit'; import { customElement, state } from 'lit/decorators.js'; -import { UMB_ICON_PICKER_MODAL_TOKEN } from '../../../shared/modals/icon-picker'; import { UmbWorkspaceDocumentTypeContext } from './document-type-workspace.context'; import type { DocumentTypeResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; +import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN, UMB_ICON_PICKER_MODAL } from '@umbraco-cms/backoffice/modal'; @customElement('umb-document-type-workspace-edit') export class UmbDocumentTypeWorkspaceEditElement extends UmbLitElement { @@ -83,7 +82,7 @@ export class UmbDocumentTypeWorkspaceEditElement extends UmbLitElement { } private async _handleIconClick() { - const modalHandler = this._modalContext?.open(UMB_ICON_PICKER_MODAL_TOKEN); + const modalHandler = this._modalContext?.open(UMB_ICON_PICKER_MODAL); modalHandler?.onSubmit().then((saved) => { if (saved.icon) this.#workspaceContext?.setIcon(saved.icon); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/document-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/document-type-workspace.context.ts index 30c185de69..ef3f97574b 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/document-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/document-type-workspace.context.ts @@ -2,7 +2,7 @@ import { UmbWorkspaceContext } from '../../../shared/components/workspace/worksp import { UmbEntityWorkspaceContextInterface } from '../../../shared/components/workspace/workspace-context/workspace-entity-context.interface'; import { UmbDocumentTypeRepository } from '../repository/document-type.repository'; import type { DocumentTypeResponseModel } from '@umbraco-cms/backoffice/backend-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { ObjectState } from '@umbraco-cms/backoffice/observable-api'; type EntityType = DocumentTypeResponseModel; @@ -14,7 +14,7 @@ export class UmbWorkspaceDocumentTypeContext data = this.#data.asObservable(); name = this.#data.getObservablePart((data) => data?.name); - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { super(host, new UmbDocumentTypeRepository(host)); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/entity-actions/create-blueprint.action.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/entity-actions/create-blueprint.action.ts index f81918a27c..d0d1ebd48c 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/entity-actions/create-blueprint.action.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/entity-actions/create-blueprint.action.ts @@ -1,9 +1,9 @@ import { UmbDocumentRepository } from '../repository/document.repository'; import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; export class UmbCreateDocumentBlueprintEntityAction extends UmbEntityActionBase { - constructor(host: UmbControllerHostInterface, repositoryAlias: string, unique: string) { + constructor(host: UmbControllerHostElement, repositoryAlias: string, unique: string) { super(host, repositoryAlias, unique); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/entity-actions/create/create.action.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/entity-actions/create/create.action.ts index 2c0bdfbcc1..6994ebcabe 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/entity-actions/create/create.action.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/entity-actions/create/create.action.ts @@ -1,14 +1,17 @@ -import { UMB_ALLOWED_DOCUMENT_TYPES_MODAL_TOKEN } from '../../../document-types/modals/allowed-document-types'; import type { UmbDocumentRepository } from '../../repository/document.repository'; import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; -import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; +import { + UmbModalContext, + UMB_MODAL_CONTEXT_TOKEN, + UMB_ALLOWED_DOCUMENT_TYPES_MODAL, +} from '@umbraco-cms/backoffice/modal'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; export class UmbCreateDocumentEntityAction extends UmbEntityActionBase { #modalContext?: UmbModalContext; - constructor(host: UmbControllerHostInterface, repositoryAlias: string, unique: string) { + constructor(host: UmbControllerHostElement, repositoryAlias: string, unique: string) { super(host, repositoryAlias, unique); new UmbContextConsumerController(this.host, UMB_MODAL_CONTEXT_TOKEN, (instance) => { @@ -24,7 +27,7 @@ export class UmbCreateDocumentEntityAction extends UmbEntityActionBase { - constructor(host: UmbControllerHostInterface, repositoryAlias: string, unique: string) { + constructor(host: UmbControllerHostElement, repositoryAlias: string, unique: string) { super(host, repositoryAlias, unique); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/entity-actions/permissions.action.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/entity-actions/permissions.action.ts index e1e9b98d10..48493532b9 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/entity-actions/permissions.action.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/entity-actions/permissions.action.ts @@ -1,9 +1,9 @@ import { UmbDocumentRepository } from '../repository/document.repository'; import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; export class UmbDocumentPermissionsEntityAction extends UmbEntityActionBase { - constructor(host: UmbControllerHostInterface, repositoryAlias: string, unique: string) { + constructor(host: UmbControllerHostElement, repositoryAlias: string, unique: string) { super(host, repositoryAlias, unique); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/entity-actions/public-access.action.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/entity-actions/public-access.action.ts index 18498d3aa9..ca8863faff 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/entity-actions/public-access.action.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/entity-actions/public-access.action.ts @@ -1,9 +1,9 @@ import { UmbDocumentRepository } from '../repository/document.repository'; import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; export class UmbDocumentPublicAccessEntityAction extends UmbEntityActionBase { - constructor(host: UmbControllerHostInterface, repositoryAlias: string, unique: string) { + constructor(host: UmbControllerHostElement, repositoryAlias: string, unique: string) { super(host, repositoryAlias, unique); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/entity-actions/publish.action.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/entity-actions/publish.action.ts index 53ca56ea8c..dcb17adc6b 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/entity-actions/publish.action.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/entity-actions/publish.action.ts @@ -1,9 +1,9 @@ import { UmbDocumentRepository } from '../repository/document.repository'; import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; export class UmbPublishDocumentEntityAction extends UmbEntityActionBase { - constructor(host: UmbControllerHostInterface, repositoryAlias: string, unique: string) { + constructor(host: UmbControllerHostElement, repositoryAlias: string, unique: string) { super(host, repositoryAlias, unique); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/entity-actions/rollback.action.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/entity-actions/rollback.action.ts index ae0f80225b..86200e5ed4 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/entity-actions/rollback.action.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/entity-actions/rollback.action.ts @@ -1,9 +1,9 @@ import { UmbDocumentRepository } from '../repository/document.repository'; import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; export class UmbRollbackDocumentEntityAction extends UmbEntityActionBase { - constructor(host: UmbControllerHostInterface, repositoryAlias: string, unique: string) { + constructor(host: UmbControllerHostElement, repositoryAlias: string, unique: string) { super(host, repositoryAlias, unique); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/entity-actions/unpublish.action.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/entity-actions/unpublish.action.ts index e7025457a8..69c27352f4 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/entity-actions/unpublish.action.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/entity-actions/unpublish.action.ts @@ -1,9 +1,9 @@ import { UmbDocumentRepository } from '../repository/document.repository'; import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; export class UmbUnpublishDocumentEntityAction extends UmbEntityActionBase { - constructor(host: UmbControllerHostInterface, repositoryAlias: string, unique: string) { + constructor(host: UmbControllerHostElement, repositoryAlias: string, unique: string) { super(host, repositoryAlias, unique); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/entity-bulk-actions/copy/copy.action.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/entity-bulk-actions/copy/copy.action.ts index 42b95a1253..521845aceb 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/entity-bulk-actions/copy/copy.action.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/entity-bulk-actions/copy/copy.action.ts @@ -1,9 +1,9 @@ import { UmbDocumentRepository } from '../../repository/document.repository'; import { UmbEntityBulkActionBase } from '@umbraco-cms/backoffice/entity-action'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; export class UmbDocumentCopyEntityBulkAction extends UmbEntityBulkActionBase { - constructor(host: UmbControllerHostInterface, repositoryAlias: string, selection: Array) { + constructor(host: UmbControllerHostElement, repositoryAlias: string, selection: Array) { super(host, repositoryAlias, selection); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/entity-bulk-actions/move/move.action.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/entity-bulk-actions/move/move.action.ts index bbc16b3a4f..436994c193 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/entity-bulk-actions/move/move.action.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/entity-bulk-actions/move/move.action.ts @@ -1,9 +1,9 @@ import { UmbDocumentRepository } from '../../repository/document.repository'; import { UmbEntityBulkActionBase } from '@umbraco-cms/backoffice/entity-action'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; export class UmbDocumentMoveEntityBulkAction extends UmbEntityBulkActionBase { - constructor(host: UmbControllerHostInterface, repositoryAlias: string, selection: Array) { + constructor(host: UmbControllerHostElement, repositoryAlias: string, selection: Array) { super(host, repositoryAlias, selection); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/modals/document-picker/document-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/modals/document-picker/document-picker-modal.element.ts index 1fc81dbb4a..88429ab1a7 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/modals/document-picker/document-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/modals/document-picker/document-picker-modal.element.ts @@ -2,7 +2,7 @@ import { css, html } from 'lit'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { customElement, state } from 'lit/decorators.js'; import type { UmbTreeElement } from '../../../../shared/components/tree/tree.element'; -import { UmbDocumentPickerModalData, UmbDocumentPickerModalResult } from '.'; +import { UmbDocumentPickerModalData, UmbDocumentPickerModalResult } from '@umbraco-cms/backoffice/modal'; import { UmbModalBaseElement } from '@umbraco-cms/internal/modal'; // TODO: make use of UmbPickerLayoutBase diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/modals/document-picker/document-picker-modal.stories.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/modals/document-picker/document-picker-modal.stories.ts index 8c61ae22cf..ec43ba460e 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/modals/document-picker/document-picker-modal.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/modals/document-picker/document-picker-modal.stories.ts @@ -5,7 +5,7 @@ import { Meta, Story } from '@storybook/web-components'; import { html } from 'lit'; import type { UmbDocumentPickerModalElement } from './document-picker-modal.element'; -import type { UmbDocumentPickerModalData } from './index'; +import type { UmbDocumentPickerModalData } from '@umbraco-cms/backoffice/modal'; export default { title: 'API/Modals/Layouts/Content Picker', diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/document.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/document.repository.ts index 5e80ce51f9..f1b76e815c 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/document.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/document.repository.ts @@ -3,7 +3,7 @@ import { UmbDocumentStore, UMB_DOCUMENT_STORE_CONTEXT_TOKEN } from './document.s import { UmbDocumentTreeStore, UMB_DOCUMENT_TREE_STORE_CONTEXT_TOKEN } from './document.tree.store'; import { DocumentTreeServerDataSource } from './sources/document.tree.server.data'; import type { UmbTreeDataSource, UmbTreeRepository, UmbDetailRepository } from '@umbraco-cms/backoffice/repository'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; import { ProblemDetailsModel, DocumentResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; @@ -13,7 +13,7 @@ type ItemType = DocumentResponseModel; export class UmbDocumentRepository implements UmbTreeRepository, UmbDetailRepository { #init!: Promise; - #host: UmbControllerHostInterface; + #host: UmbControllerHostElement; #treeSource: UmbTreeDataSource; #treeStore?: UmbDocumentTreeStore; @@ -23,7 +23,7 @@ export class UmbDocumentRepository implements UmbTreeRepository, UmbDe #notificationContext?: UmbNotificationContext; - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { this.#host = host; // TODO: figure out how spin up get the correct data source diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/document.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/document.store.ts index 8454ce8ef3..f1f3ce7aaf 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/document.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/document.store.ts @@ -2,7 +2,7 @@ import { DocumentResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { ArrayState } from '@umbraco-cms/backoffice/observable-api'; import { UmbStoreBase } from '@umbraco-cms/backoffice/store'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; /** * @export @@ -15,10 +15,10 @@ export class UmbDocumentStore extends UmbStoreBase { /** * Creates an instance of UmbDocumentDetailStore. - * @param {UmbControllerHostInterface} host + * @param {UmbControllerHostElement} host * @memberof UmbDocumentDetailStore */ - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { super(host, UMB_DOCUMENT_STORE_CONTEXT_TOKEN.toString()); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/document.tree.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/document.tree.store.ts index 4cab5a9ac3..a53d41e17a 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/document.tree.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/document.tree.store.ts @@ -1,6 +1,6 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/store'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; /** * @export @@ -11,10 +11,10 @@ import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; export class UmbDocumentTreeStore extends UmbEntityTreeStore { /** * Creates an instance of UmbDocumentTreeStore. - * @param {UmbControllerHostInterface} host + * @param {UmbControllerHostElement} host * @memberof UmbDocumentTreeStore */ - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { super(host, UMB_DOCUMENT_TREE_STORE_CONTEXT_TOKEN.toString()); } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/manifests.ts index 6276b2c00b..b53c170e43 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/manifests.ts @@ -1,8 +1,7 @@ import { UmbDocumentRepository } from '../repository/document.repository'; import { UmbDocumentStore } from './document.store'; import { UmbDocumentTreeStore } from './document.tree.store'; -import { ManifestRepository } from 'libs/extensions-registry/repository.models'; -import { ManifestStore, ManifestTreeStore } from '@umbraco-cms/backoffice/extensions-registry'; +import type { ManifestRepository, ManifestStore, ManifestTreeStore } from '@umbraco-cms/backoffice/extensions-registry'; export const DOCUMENT_REPOSITORY_ALIAS = 'Umb.Repository.Document'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/sources/document.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/sources/document.server.data.ts index c68b6a8eb1..20de768ab9 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/sources/document.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/sources/document.server.data.ts @@ -6,7 +6,7 @@ import { DocumentResponseModel, ContentStateModel, } from '@umbraco-cms/backoffice/backend-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; /** @@ -16,14 +16,14 @@ import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; * @implements {RepositoryDetailDataSource} */ export class UmbDocumentServerDataSource implements UmbDataSource { - #host: UmbControllerHostInterface; + #host: UmbControllerHostElement; /** * Creates an instance of UmbDocumentServerDataSource. - * @param {UmbControllerHostInterface} host + * @param {UmbControllerHostElement} host * @memberof UmbDocumentServerDataSource */ - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { this.#host = host; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/sources/document.tree.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/sources/document.tree.server.data.ts index 3dd6b3d6ff..4bb080ab00 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/sources/document.tree.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/sources/document.tree.server.data.ts @@ -1,6 +1,6 @@ import type { UmbTreeDataSource } from '@umbraco-cms/backoffice/repository'; import { ProblemDetailsModel, DocumentResource } from '@umbraco-cms/backoffice/backend-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; /** @@ -10,7 +10,7 @@ import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; * @implements {DocumentTreeDataSource} */ export class DocumentTreeServerDataSource implements UmbTreeDataSource { - #host: UmbControllerHostInterface; + #host: UmbControllerHostElement; // TODO: how do we handle trashed items? async trashItems(keys: Array) { @@ -43,10 +43,10 @@ export class DocumentTreeServerDataSource implements UmbTreeDataSource { /** * Creates an instance of DocumentTreeServerDataSource. - * @param {UmbControllerHostInterface} host + * @param {UmbControllerHostElement} host * @memberof DocumentTreeServerDataSource */ - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { this.#host = host; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/tree/tree-item/document-tree-item.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/tree/tree-item/document-tree-item.context.ts index 19cfaf1ccd..a9812355db 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/tree/tree-item/document-tree-item.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/tree/tree-item/document-tree-item.context.ts @@ -1,10 +1,10 @@ import { UmbTreeItemContextBase } from '../../../../shared/components/tree/tree-item-base/tree-item-base.context'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { DocumentTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; // TODO get unique method from an document repository static method export class UmbDocumentTreeItemContext extends UmbTreeItemContextBase { - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { super(host, (x: DocumentTreeItemResponseModel) => x.key); } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/actions/save-and-preview.action.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/actions/save-and-preview.action.ts index 6a54050580..8879e08aa5 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/actions/save-and-preview.action.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/actions/save-and-preview.action.ts @@ -1,9 +1,9 @@ import { UmbDocumentWorkspaceContext } from '../document-workspace.context'; import { UmbWorkspaceActionBase } from '@umbraco-cms/backoffice/workspace'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; export class UmbDocumentSaveAndPreviewWorkspaceAction extends UmbWorkspaceActionBase { - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { super(host); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/actions/save-and-publish.action.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/actions/save-and-publish.action.ts index eb0fc8c24c..2ca1793f3c 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/actions/save-and-publish.action.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/actions/save-and-publish.action.ts @@ -1,9 +1,9 @@ import { UmbDocumentWorkspaceContext } from '../document-workspace.context'; import { UmbWorkspaceActionBase } from '@umbraco-cms/backoffice/workspace'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; export class UmbDocumentSaveAndPublishWorkspaceAction extends UmbWorkspaceActionBase { - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { super(host); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/actions/save-and-schedule.action.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/actions/save-and-schedule.action.ts index 8b25669b5a..8097100a33 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/actions/save-and-schedule.action.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/actions/save-and-schedule.action.ts @@ -1,9 +1,9 @@ import { UmbDocumentWorkspaceContext } from '../document-workspace.context'; import { UmbWorkspaceActionBase } from '@umbraco-cms/backoffice/workspace'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; export class UmbSaveAndScheduleDocumentWorkspaceAction extends UmbWorkspaceActionBase { - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { super(host); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/document-workspace-edit.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/document-workspace-edit.element.ts index 9097b679e7..55c30acea2 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/document-workspace-edit.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/document-workspace-edit.element.ts @@ -84,7 +84,6 @@ export class UmbDocumentWorkspaceEditElement extends UmbLitElement { this._availableVariants.forEach((variantB) => { routes.push({ path: new UmbVariantId(variantA).toString() + '_&_' + new UmbVariantId(variantB).toString(), - //component: () => import('./document-workspace-split-view.element'), component: this.splitViewElement, setup: (component: HTMLElement | Promise, info: IRoutingInfo) => { // Set split view/active info.. @@ -101,7 +100,6 @@ export class UmbDocumentWorkspaceEditElement extends UmbLitElement { this._availableVariants.forEach((variant) => { routes.push({ path: new UmbVariantId(variant).toString(), - //component: () => import('./document-workspace-split-view.element'), component: this.splitViewElement, setup: (component: HTMLElement | Promise, info: IRoutingInfo) => { // cause we might come from a split-view, we need to reset index 1. diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/document-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/document-workspace.context.ts index b3c9df0e28..eb74412d29 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/document-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/document-workspace.context.ts @@ -7,7 +7,7 @@ import { UmbWorkspacePropertyStructureManager } from '../../../shared/components import { UmbWorkspaceSplitViewManager } from '../../../shared/components/workspace/workspace-context/workspace-split-view-manager.class'; import type { DocumentResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { partialUpdateFrozenArray, ObjectState, UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; // TODO: should this context be called DocumentDraft instead of workspace? or should the draft be part of this? // TODO: Should we have a DocumentStructureContext and maybe even a DocumentDraftContext? @@ -38,13 +38,25 @@ export class UmbDocumentWorkspaceContext readonly structure; readonly splitView; - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { super(host, new UmbDocumentRepository(host)); this.structure = new UmbWorkspacePropertyStructureManager(this.host, new UmbDocumentTypeRepository(this.host)); this.splitView = new UmbWorkspaceSplitViewManager(this.host); new UmbObserverController(this.host, this.documentTypeKey, (key) => this.structure.loadType(key)); + + /* + TODO: Concept for ensure variant values: + new UmbObserverController(this.host, this.variants, (variants) => { + if (!variants) return; + const draft = this.#draft.getValue(); + if (!draft) return; + + // Gather all properties from all document types. + // Loop through all properties for each variant and insert missing value objects. + } + */ } async load(entityKey: string) { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/views/edit/document-workspace-view-edit.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/views/edit/document-workspace-view-edit.element.ts index 1b117564bf..21301a1396 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/views/edit/document-workspace-view-edit.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/views/edit/document-workspace-view-edit.element.ts @@ -68,7 +68,6 @@ export class UmbDocumentWorkspaceViewEditElement extends UmbLitElement { this.observe( this._workspaceContext.rootPropertyStructures(), (rootPropertyStructure) => { - console.log('rootPropertyStructure', rootPropertyStructure); this._hasRootProperties = rootPropertyStructure.length > 0; this._createRoutes(); }, diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/entity-actions/create.action.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/entity-actions/create.action.ts index b00705305e..5f77849dea 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/entity-actions/create.action.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/entity-actions/create.action.ts @@ -1,9 +1,9 @@ import { UmbMediaTypeRepository } from '../repository/media-type.repository'; import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; export class UmbCreateMediaTypeEntityAction extends UmbEntityActionBase { - constructor(host: UmbControllerHostInterface, repositoryAlias: string, unique: string) { + constructor(host: UmbControllerHostElement, repositoryAlias: string, unique: string) { super(host, repositoryAlias, unique); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/entity-actions/reload.action.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/entity-actions/reload.action.ts index 01d31ebd07..17e28e6d4c 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/entity-actions/reload.action.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/entity-actions/reload.action.ts @@ -1,12 +1,12 @@ import { UUITextStyles } from '@umbraco-ui/uui-css'; import { UmbMediaTypeRepository } from '../repository/media-type.repository'; import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; export default class UmbReloadMediaTypeEntityAction extends UmbEntityActionBase { static styles = [UUITextStyles]; - constructor(host: UmbControllerHostInterface, repositoryAlias: string, unique: string) { + constructor(host: UmbControllerHostElement, repositoryAlias: string, unique: string) { super(host, repositoryAlias, unique); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/manifests.ts index 23906ac74e..57dd021694 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/manifests.ts @@ -1,8 +1,7 @@ import { UmbMediaTypeRepository } from './media-type.repository'; import { UmbMediaTypeStore } from './media-type.detail.store'; import { UmbMediaTypeTreeStore } from './media-type.tree.store'; -import { ManifestRepository } from 'libs/extensions-registry/repository.models'; -import { ManifestStore, ManifestTreeStore } from '@umbraco-cms/backoffice/extensions-registry'; +import type { ManifestStore, ManifestTreeStore, ManifestRepository } from '@umbraco-cms/backoffice/extensions-registry'; export const MEDIA_TYPE_REPOSITORY_ALIAS = 'Umb.Repository.MediaType'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/media-type.detail.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/media-type.detail.store.ts index 601807dfd6..884fabf62f 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/media-type.detail.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/media-type.detail.store.ts @@ -1,6 +1,6 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UmbStoreBase } from '@umbraco-cms/backoffice/store'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { ArrayState } from '@umbraco-cms/backoffice/observable-api'; import type { MediaTypeDetails } from '@umbraco-cms/backoffice/models'; @@ -13,7 +13,7 @@ import type { MediaTypeDetails } from '@umbraco-cms/backoffice/models'; export class UmbMediaTypeStore extends UmbStoreBase { #data = new ArrayState([], (x) => x.key); - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { super(host, UMB_MEDIA_TYPE_STORE_CONTEXT_TOKEN.toString()); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/media-type.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/media-type.repository.ts index 011e67a7e1..769559b402 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/media-type.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/media-type.repository.ts @@ -4,7 +4,7 @@ import { UmbMediaTypeStore, UMB_MEDIA_TYPE_STORE_CONTEXT_TOKEN } from './media-t import { MediaTypeTreeServerDataSource } from './sources/media-type.tree.server.data'; import { ProblemDetailsModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import type { MediaTypeDetails } from '@umbraco-cms/backoffice/models'; import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; import { UmbTreeRepository, UmbTreeDataSource } from '@umbraco-cms/backoffice/repository'; @@ -12,7 +12,7 @@ import { UmbTreeRepository, UmbTreeDataSource } from '@umbraco-cms/backoffice/re export class UmbMediaTypeRepository implements UmbTreeRepository { #init!: Promise; - #host: UmbControllerHostInterface; + #host: UmbControllerHostElement; #treeSource: UmbTreeDataSource; #treeStore?: UmbMediaTypeTreeStore; @@ -22,7 +22,7 @@ export class UmbMediaTypeRepository implements UmbTreeRepository { #notificationContext?: UmbNotificationContext; - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { this.#host = host; // TODO: figure out how spin up get the correct data source diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/media-type.tree.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/media-type.tree.store.ts index 3392acb8d1..14d86a3344 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/media-type.tree.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/media-type.tree.store.ts @@ -1,6 +1,6 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/store'; -import type { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; /** * @export @@ -11,10 +11,10 @@ import type { UmbControllerHostInterface } from '@umbraco-cms/backoffice/control export class UmbMediaTypeTreeStore extends UmbEntityTreeStore { /** * Creates an instance of UmbMediaTypeTreeStore. - * @param {UmbControllerHostInterface} host + * @param {UmbControllerHostElement} host * @memberof UmbMediaTypeTreeStore */ - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { super(host, UMB_MEDIA_TYPE_TREE_STORE_CONTEXT_TOKEN.toString()); } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/sources/media-type.detail.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/sources/media-type.detail.server.data.ts index 9a96c2c7e2..fa2481dd0f 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/sources/media-type.detail.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/sources/media-type.detail.server.data.ts @@ -1,6 +1,6 @@ import { MediaTypeDetailDataSource } from './media-type.details.server.data.interface'; import { ProblemDetailsModel } from '@umbraco-cms/backoffice/backend-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import type { MediaTypeDetails } from '@umbraco-cms/backoffice/models'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -11,9 +11,9 @@ import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; * @implements {MediaTypeDetailDataSource} */ export class UmbMediaTypeDetailServerDataSource implements MediaTypeDetailDataSource { - #host: UmbControllerHostInterface; + #host: UmbControllerHostElement; - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { this.#host = host; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/sources/media-type.tree.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/sources/media-type.tree.server.data.ts index 3c2f57bf07..4fa209600d 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/sources/media-type.tree.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/sources/media-type.tree.server.data.ts @@ -1,5 +1,5 @@ import { MediaTypeResource, ProblemDetailsModel } from '@umbraco-cms/backoffice/backend-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbTreeDataSource } from '@umbraco-cms/backoffice/repository'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -10,14 +10,14 @@ import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; * @implements {MediaTypeTreeDataSource} */ export class MediaTypeTreeServerDataSource implements UmbTreeDataSource { - #host: UmbControllerHostInterface; + #host: UmbControllerHostElement; /** * Creates an instance of MediaTypeTreeDataSource. - * @param {UmbControllerHostInterface} host + * @param {UmbControllerHostElement} host * @memberof MediaTypeTreeDataSource */ - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { this.#host = host; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/workspace/media-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/workspace/media-type-workspace.context.ts index 5bbbb01e3b..25bd603aa1 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/workspace/media-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/workspace/media-type-workspace.context.ts @@ -1,7 +1,7 @@ import { UmbWorkspaceContext } from '../../../shared/components/workspace/workspace-context/workspace-context'; import { UmbEntityWorkspaceContextInterface } from '../../../shared/components/workspace/workspace-context/workspace-entity-context.interface'; import { UmbMediaTypeRepository } from '../repository/media-type.repository'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { ObjectState } from '@umbraco-cms/backoffice/observable-api'; import type { MediaTypeDetails } from '@umbraco-cms/backoffice/models'; @@ -14,7 +14,7 @@ export class UmbWorkspaceMediaTypeContext data = this.#data.asObservable(); name = this.#data.getObservablePart((data) => data?.name); - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { super(host, new UmbMediaTypeRepository(host)); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/entity-actions/manifests.ts index eb7b4c6ce0..c8b4e44629 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/entity-actions/manifests.ts @@ -1,6 +1,6 @@ import { MEDIA_REPOSITORY_ALIAS } from '../repository/manifests'; +import type { ManifestEntityAction } from '@umbraco-cms/backoffice/extensions-registry'; import { UmbTrashEntityAction } from '@umbraco-cms/backoffice/entity-action'; -import { ManifestEntityAction } from 'libs/extensions-registry/entity-action.models'; const entityActions: Array = [ { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/entity-bulk-actions/copy/copy.action.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/entity-bulk-actions/copy/copy.action.ts index 7a6a36cd51..72b49b7426 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/entity-bulk-actions/copy/copy.action.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/entity-bulk-actions/copy/copy.action.ts @@ -1,9 +1,9 @@ import type { UmbMediaRepository } from '../../repository/media.repository'; import { UmbEntityBulkActionBase } from '@umbraco-cms/backoffice/entity-action'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; export class UmbMediaCopyEntityBulkAction extends UmbEntityBulkActionBase { - constructor(host: UmbControllerHostInterface, repositoryAlias: string, selection: Array) { + constructor(host: UmbControllerHostElement, repositoryAlias: string, selection: Array) { super(host, repositoryAlias, selection); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/entity-bulk-actions/move/move.action.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/entity-bulk-actions/move/move.action.ts index 2e2496632c..6f34b483ca 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/entity-bulk-actions/move/move.action.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/entity-bulk-actions/move/move.action.ts @@ -1,14 +1,13 @@ import type { UmbMediaRepository } from '../../repository/media.repository'; -import { UMB_MEDIA_PICKER_MODAL_TOKEN } from '../../modals/media-picker'; import { UmbEntityBulkActionBase } from '@umbraco-cms/backoffice/entity-action'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; -import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; +import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN, UMB_MEDIA_PICKER_MODAL } from '@umbraco-cms/backoffice/modal'; export class UmbMediaMoveEntityBulkAction extends UmbEntityBulkActionBase { #modalContext?: UmbModalContext; - constructor(host: UmbControllerHostInterface, repositoryAlias: string, selection: Array) { + constructor(host: UmbControllerHostElement, repositoryAlias: string, selection: Array) { super(host, repositoryAlias, selection); new UmbContextConsumerController(host, UMB_MODAL_CONTEXT_TOKEN, (instance) => { @@ -18,7 +17,7 @@ export class UmbMediaMoveEntityBulkAction extends UmbEntityBulkActionBase { #modalContext?: UmbModalContext; - constructor(host: UmbControllerHostInterface, repositoryAlias: string, selection: Array) { + constructor(host: UmbControllerHostElement, repositoryAlias: string, selection: Array) { super(host, repositoryAlias, selection); new UmbContextConsumerController(host, UMB_MODAL_CONTEXT_TOKEN, (instance) => { @@ -26,7 +25,7 @@ export class UmbMediaTrashEntityBulkAction extends UmbEntityBulkActionBase { - #init!: Promise; - - #host: UmbControllerHostInterface; + #host: UmbControllerHostElement; #treeSource: UmbTreeDataSource; #treeStore?: UmbMediaTreeStore; @@ -26,26 +23,42 @@ export class UmbMediaRepository implements UmbTreeRepository, UmbDetailRepositor #notificationContext?: UmbNotificationContext; - constructor(host: UmbControllerHostInterface) { + #initResolver?: () => void; + #initialized = false; + + constructor(host: UmbControllerHostElement) { this.#host = host; // TODO: figure out how spin up get the correct data source this.#treeSource = new MediaTreeServerDataSource(this.#host); this.#detailDataSource = new UmbMediaDetailServerDataSource(this.#host); - this.#init = Promise.all([ - new UmbContextConsumerController(this.#host, UMB_MEDIA_TREE_STORE_CONTEXT_TOKEN, (instance) => { - this.#treeStore = instance; - }), + new UmbContextConsumerController(this.#host, UMB_MEDIA_TREE_STORE_CONTEXT_TOKEN, (instance) => { + this.#treeStore = instance; + this.#checkIfInitialized(); + }); - new UmbContextConsumerController(this.#host, UMB_MEDIA_STORE_CONTEXT_TOKEN, (instance) => { - this.#store = instance; - }), + new UmbContextConsumerController(this.#host, UMB_MEDIA_STORE_CONTEXT_TOKEN, (instance) => { + this.#store = instance; + this.#checkIfInitialized(); + }); - new UmbContextConsumerController(this.#host, UMB_NOTIFICATION_CONTEXT_TOKEN, (instance) => { - this.#notificationContext = instance; - }), - ]); + new UmbContextConsumerController(this.#host, UMB_NOTIFICATION_CONTEXT_TOKEN, (instance) => { + this.#notificationContext = instance; + this.#checkIfInitialized(); + }); + } + + // TODO: make a generic way to wait for initialization + #init = new Promise((resolve) => { + this.#initialized ? resolve() : (this.#initResolver = resolve); + }); + + #checkIfInitialized() { + if (this.#treeStore && this.#store && this.#notificationContext) { + this.#initialized = true; + this.#initResolver?.(); + } } async requestRootTreeItems() { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/media.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/media.store.ts index 2d5dfc4c4c..647992a1af 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/media.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/media.store.ts @@ -2,7 +2,7 @@ import type { MediaDetails } from '../'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { ArrayState } from '@umbraco-cms/backoffice/observable-api'; import { UmbStoreBase } from '@umbraco-cms/backoffice/store'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; /** * @export @@ -15,10 +15,10 @@ export class UmbMediaStore extends UmbStoreBase { /** * Creates an instance of UmbMediaStore. - * @param {UmbControllerHostInterface} host + * @param {UmbControllerHostElement} host * @memberof UmbMediaStore */ - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { super(host, UMB_MEDIA_STORE_CONTEXT_TOKEN.toString()); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/media.tree.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/media.tree.store.ts index 4214a9d7f2..adc6a920e0 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/media.tree.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/media.tree.store.ts @@ -2,7 +2,7 @@ import { EntityTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { ArrayState } from '@umbraco-cms/backoffice/observable-api'; import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/store'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; export const UMB_MEDIA_TREE_STORE_CONTEXT_TOKEN = new UmbContextToken('UmbMediaTreeStore'); @@ -17,10 +17,10 @@ export class UmbMediaTreeStore extends UmbEntityTreeStore { /** * Creates an instance of UmbMediaTreeStore. - * @param {UmbControllerHostInterface} host + * @param {UmbControllerHostElement} host * @memberof UmbMediaTreeStore */ - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { super(host, UMB_MEDIA_TREE_STORE_CONTEXT_TOKEN.toString()); } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/sources/media.detail.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/sources/media.detail.server.data.ts index 120cb495e8..416090e87e 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/sources/media.detail.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/sources/media.detail.server.data.ts @@ -1,7 +1,7 @@ import type { MediaDetails } from '../../'; import { UmbDataSource } from '@umbraco-cms/backoffice/repository'; import { ProblemDetailsModel } from '@umbraco-cms/backoffice/backend-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; /** @@ -11,14 +11,14 @@ import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; * @implements {TemplateDetailDataSource} */ export class UmbMediaDetailServerDataSource implements UmbDataSource { - #host: UmbControllerHostInterface; + #host: UmbControllerHostElement; /** * Creates an instance of UmbMediaDetailServerDataSource. - * @param {UmbControllerHostInterface} host + * @param {UmbControllerHostElement} host * @memberof UmbMediaDetailServerDataSource */ - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { this.#host = host; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/sources/media.tree.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/sources/media.tree.server.data.ts index 75c88bf7b4..c29c2b2a9a 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/sources/media.tree.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/sources/media.tree.server.data.ts @@ -1,6 +1,6 @@ import type { UmbTreeDataSource } from '@umbraco-cms/backoffice/repository'; import { ProblemDetailsModel, MediaResource } from '@umbraco-cms/backoffice/backend-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; /** @@ -10,7 +10,7 @@ import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; * @implements {MediaTreeDataSource} */ export class MediaTreeServerDataSource implements UmbTreeDataSource { - #host: UmbControllerHostInterface; + #host: UmbControllerHostElement; // TODO: how do we handle trashed items? async trashItems(keys: Array) { @@ -43,10 +43,10 @@ export class MediaTreeServerDataSource implements UmbTreeDataSource { /** * Creates an instance of MediaTreeServerDataSource. - * @param {UmbControllerHostInterface} host + * @param {UmbControllerHostElement} host * @memberof MediaTreeServerDataSource */ - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { this.#host = host; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/workspace/media-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/workspace/media-workspace.context.ts index 399b057a61..fb147d0fc3 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/workspace/media-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/workspace/media-workspace.context.ts @@ -3,7 +3,7 @@ import { UmbMediaRepository } from '../repository/media.repository'; import type { UmbEntityWorkspaceContextInterface } from '../../../shared/components/workspace/workspace-context/workspace-entity-context.interface'; import type { MediaDetails } from '../'; import { appendToFrozenArray, ObjectState } from '@umbraco-cms/backoffice/observable-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; type EntityType = MediaDetails; export class UmbMediaWorkspaceContext @@ -14,7 +14,7 @@ export class UmbMediaWorkspaceContext data = this.#data.asObservable(); name = this.#data.getObservablePart((data) => data?.name); - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { super(host, new UmbMediaRepository(host)); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/entity-actions/manifests.ts index 174945b696..90bd62d4f2 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/entity-actions/manifests.ts @@ -1,6 +1,6 @@ import { MEMBER_GROUP_REPOSITORY_ALIAS } from '../repository/manifests'; +import type { ManifestEntityAction } from '@umbraco-cms/backoffice/extensions-registry'; import { UmbDeleteEntityAction } from '@umbraco-cms/backoffice/entity-action'; -import { ManifestEntityAction } from 'libs/extensions-registry/entity-action.models'; const entityActions: Array = [ { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/manifests.ts index c9efa0f4be..038a11fe8e 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/manifests.ts @@ -1,8 +1,7 @@ import { UmbMemberGroupRepository } from './member-group.repository'; import { UmbMemberGroupStore } from './member-group.store'; import { UmbMemberGroupTreeStore } from './member-group.tree.store'; -import { ManifestRepository } from 'libs/extensions-registry/repository.models'; -import { ManifestStore, ManifestTreeStore } from '@umbraco-cms/backoffice/extensions-registry'; +import type { ManifestStore, ManifestTreeStore, ManifestRepository } from '@umbraco-cms/backoffice/extensions-registry'; export const MEMBER_GROUP_REPOSITORY_ALIAS = 'Umb.Repository.MemberGroup'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/member-group.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/member-group.repository.ts index 5ca8bcbac1..04d282470d 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/member-group.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/member-group.repository.ts @@ -2,7 +2,7 @@ import { UmbMemberGroupTreeStore, UMB_MEMBER_GROUP_TREE_STORE_CONTEXT_TOKEN } fr import { UmbMemberGroupDetailServerDataSource } from './sources/member-group.detail.server.data'; import { UmbMemberGroupStore, UMB_MEMBER_GROUP_STORE_CONTEXT_TOKEN } from './member-group.store'; import { MemberGroupTreeServerDataSource } from './sources/member-group.tree.server.data'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; import type { MemberGroupDetails } from '@umbraco-cms/backoffice/models'; @@ -13,7 +13,7 @@ import type { UmbTreeDataSource, UmbDetailRepository, UmbTreeRepository } from ' export class UmbMemberGroupRepository implements UmbTreeRepository, UmbDetailRepository { #init!: Promise; - #host: UmbControllerHostInterface; + #host: UmbControllerHostElement; #treeSource: UmbTreeDataSource; #treeStore?: UmbMemberGroupTreeStore; @@ -23,7 +23,7 @@ export class UmbMemberGroupRepository implements UmbTreeRepository, UmbDetailRep #notificationContext?: UmbNotificationContext; - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { this.#host = host; // TODO: figure out how spin up get the correct data source this.#treeSource = new MemberGroupTreeServerDataSource(this.#host); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/member-group.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/member-group.store.ts index b58cd314c0..5e24666945 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/member-group.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/member-group.store.ts @@ -1,7 +1,7 @@ import type { MemberGroupDetails } from '@umbraco-cms/backoffice/models'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { ArrayState } from '@umbraco-cms/backoffice/observable-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbStoreBase } from '@umbraco-cms/backoffice/store'; /** @@ -13,7 +13,7 @@ import { UmbStoreBase } from '@umbraco-cms/backoffice/store'; export class UmbMemberGroupStore extends UmbStoreBase { #data = new ArrayState([], (x) => x.key); - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { super(host, UMB_MEMBER_GROUP_STORE_CONTEXT_TOKEN.toString()); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/member-group.tree.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/member-group.tree.store.ts index 6e20bb0447..5247506b6c 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/member-group.tree.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/member-group.tree.store.ts @@ -1,6 +1,6 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/store'; -import type { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; /** * @export @@ -11,10 +11,10 @@ import type { UmbControllerHostInterface } from '@umbraco-cms/backoffice/control export class UmbMemberGroupTreeStore extends UmbEntityTreeStore { /** * Creates an instance of UmbMemberGroupTreeStore. - * @param {UmbControllerHostInterface} host + * @param {UmbControllerHostElement} host * @memberof UmbMemberGroupTreeStore */ - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { super(host, UMB_MEMBER_GROUP_TREE_STORE_CONTEXT_TOKEN.toString()); } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/sources/member-group.detail.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/sources/member-group.detail.server.data.ts index 544de51bc6..2ac2a49d2d 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/sources/member-group.detail.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/sources/member-group.detail.server.data.ts @@ -1,4 +1,4 @@ -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; import { ProblemDetailsModel } from '@umbraco-cms/backoffice/backend-api'; import type { MemberGroupDetails } from '@umbraco-cms/backoffice/models'; @@ -12,9 +12,9 @@ import { UmbDataSource } from '@umbraco-cms/backoffice/repository'; */ // TODO => Provide type when it is available export class UmbMemberGroupDetailServerDataSource implements UmbDataSource { - #host: UmbControllerHostInterface; + #host: UmbControllerHostElement; - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { this.#host = host; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/sources/member-group.tree.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/sources/member-group.tree.server.data.ts index 5388958abd..ee9a1aa0bc 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/sources/member-group.tree.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/sources/member-group.tree.server.data.ts @@ -1,5 +1,5 @@ import { MemberGroupResource, ProblemDetailsModel } from '@umbraco-cms/backoffice/backend-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbTreeDataSource } from '@umbraco-cms/backoffice/repository'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -10,14 +10,14 @@ import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; * @implements {MemberGroupTreeDataSource} */ export class MemberGroupTreeServerDataSource implements UmbTreeDataSource { - #host: UmbControllerHostInterface; + #host: UmbControllerHostElement; /** * Creates an instance of MemberGroupTreeServerDataSource. - * @param {UmbControllerHostInterface} host + * @param {UmbControllerHostElement} host * @memberof MemberGroupTreeServerDataSource */ - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { this.#host = host; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/workspace/member-group-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/workspace/member-group-workspace.context.ts index ea030f00fb..c7565323ab 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/workspace/member-group-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/workspace/member-group-workspace.context.ts @@ -2,7 +2,7 @@ import { UmbEntityWorkspaceContextInterface } from '../../../../backoffice/share import { UmbWorkspaceContext } from '../../../../backoffice/shared/components/workspace/workspace-context/workspace-context'; import { UmbMemberGroupRepository } from '../repository/member-group.repository'; import type { MemberGroupDetails } from '@umbraco-cms/backoffice/models'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { ObjectState } from '@umbraco-cms/backoffice/observable-api'; type EntityType = MemberGroupDetails; @@ -14,7 +14,7 @@ export class UmbWorkspaceMemberGroupContext data = this.#data.asObservable(); name = this.#data.getObservablePart((data) => data?.name); - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { super(host, new UmbMemberGroupRepository(host)); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/member-type.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/member-type.repository.ts index ffa47cbd04..81eaa12de2 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/member-type.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/member-type.repository.ts @@ -2,7 +2,7 @@ import { MemberTypeTreeServerDataSource } from './sources/member-type.tree.serve import { UmbMemberTypeTreeStore, UMB_MEMBER_TYPE_TREE_STORE_CONTEXT_TOKEN } from './member-type.tree.store'; import { UmbMemberTypeStore, UMB_MEMBER_TYPE_STORE_CONTEXT_TOKEN } from './member-type.store'; import { UmbMemberTypeDetailServerDataSource } from './sources/member-type.detail.server.data'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; import { UmbTreeDataSource, UmbDetailRepository, UmbTreeRepository } from '@umbraco-cms/backoffice/repository'; import { ProblemDetailsModel } from '@umbraco-cms/backoffice/backend-api'; @@ -16,7 +16,7 @@ type TreeItemType = any; export class UmbMemberTypeRepository implements UmbTreeRepository, UmbDetailRepository { #init!: Promise; - #host: UmbControllerHostInterface; + #host: UmbControllerHostElement; #treeSource: UmbTreeDataSource; #treeStore?: UmbMemberTypeTreeStore; @@ -26,7 +26,7 @@ export class UmbMemberTypeRepository implements UmbTreeRepository, #notificationContext?: UmbNotificationContext; - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { this.#host = host; // TODO: figure out how spin up get the correct data source diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/member-type.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/member-type.store.ts index 9920319c4c..7624273435 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/member-type.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/member-type.store.ts @@ -1,6 +1,6 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UmbStoreBase } from '@umbraco-cms/backoffice/store'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { ArrayState } from '@umbraco-cms/backoffice/observable-api'; import type { MemberTypeDetails } from '@umbraco-cms/backoffice/models'; @@ -13,7 +13,7 @@ import type { MemberTypeDetails } from '@umbraco-cms/backoffice/models'; export class UmbMemberTypeStore extends UmbStoreBase { #data = new ArrayState([], (x) => x.key); - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { super(host, UMB_MEMBER_TYPE_STORE_CONTEXT_TOKEN.toString()); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/member-type.tree.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/member-type.tree.store.ts index 8fb32d6bea..be451afb24 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/member-type.tree.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/member-type.tree.store.ts @@ -1,6 +1,6 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/store'; -import type { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; /** * @export @@ -9,7 +9,7 @@ import type { UmbControllerHostInterface } from '@umbraco-cms/backoffice/control * @description - Tree Data Store for Member Types */ export class UmbMemberTypeTreeStore extends UmbEntityTreeStore { - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { super(host, UMB_MEMBER_TYPE_TREE_STORE_CONTEXT_TOKEN.toString()); } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/sources/member-type.detail.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/sources/member-type.detail.server.data.ts index 91ed934ef9..b0e33984ed 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/sources/member-type.detail.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/sources/member-type.detail.server.data.ts @@ -1,4 +1,4 @@ -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; import { ProblemDetailsModel } from '@umbraco-cms/backoffice/backend-api'; import type { MemberTypeDetails } from '@umbraco-cms/backoffice/models'; @@ -11,9 +11,9 @@ import { UmbDetailRepository } from '@umbraco-cms/backoffice/repository'; * @implements {MemberTypeDetailDataSource} */ export class UmbMemberTypeDetailServerDataSource implements UmbDetailRepository { - #host: UmbControllerHostInterface; + #host: UmbControllerHostElement; - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { this.#host = host; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/sources/member-type.tree.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/sources/member-type.tree.server.data.ts index 4f450b5bde..6202393162 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/sources/member-type.tree.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/sources/member-type.tree.server.data.ts @@ -1,5 +1,5 @@ import { MemberTypeResource, ProblemDetailsModel } from '@umbraco-cms/backoffice/backend-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbTreeDataSource } from '@umbraco-cms/backoffice/repository'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -10,14 +10,14 @@ import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; * @implements {MemberTypeTreeDataSource} */ export class MemberTypeTreeServerDataSource implements UmbTreeDataSource { - #host: UmbControllerHostInterface; + #host: UmbControllerHostElement; /** * Creates an instance of MemberTypeTreeDataSource. - * @param {UmbControllerHostInterface} host + * @param {UmbControllerHostElement} host * @memberof MemberTypeTreeDataSource */ - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { this.#host = host; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/workspace/member-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/workspace/member-type-workspace.context.ts index 9c8fb39b76..e2df9052de 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/workspace/member-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/workspace/member-type-workspace.context.ts @@ -2,7 +2,7 @@ import { UmbWorkspaceContext } from '../../../shared/components/workspace/worksp import { UmbEntityWorkspaceContextInterface as UmbEntityWorkspaceContextInterface } from '../../../shared/components/workspace/workspace-context/workspace-entity-context.interface'; import { UmbMemberTypeRepository } from '../repository/member-type.repository'; import { ObjectState } from '@umbraco-cms/backoffice/observable-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; // TODO => use correct tpye type EntityType = any; @@ -14,7 +14,7 @@ export class UmbMemberTypeWorkspaceContext #data = new ObjectState(undefined); name = this.#data.getObservablePart((data) => data?.name); - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { super(host, new UmbMemberTypeRepository(host)); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/entity-actions/manifests.ts index b9a055bbd6..9f2f9a28b2 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/entity-actions/manifests.ts @@ -1,6 +1,6 @@ import { MEMBER_REPOSITORY_ALIAS } from '../repository/manifests'; +import type { ManifestEntityAction } from '@umbraco-cms/backoffice/extensions-registry'; import { UmbDeleteEntityAction } from '@umbraco-cms/backoffice/entity-action'; -import { ManifestEntityAction } from 'libs/extensions-registry/entity-action.models'; const entityActions: Array = [ { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/member.detail.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/member.detail.store.ts index a57a23e317..b110fcfbe8 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/member.detail.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/member.detail.store.ts @@ -3,7 +3,7 @@ import { umbMemberData } from '../../../core/mocks/data/member.data'; import type { MemberDetails, MemberGroupDetails } from '@umbraco-cms/backoffice/models'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { ArrayState, createObservablePart } from '@umbraco-cms/backoffice/observable-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbEntityDetailStore, UmbStoreBase } from '@umbraco-cms/backoffice/store'; /** @@ -16,7 +16,7 @@ export class UmbMemberStore extends UmbStoreBase implements UmbEntityDetailStore #data = new ArrayState([], (x) => x.key); public groups = this.#data.asObservable(); - constructor(private host: UmbControllerHostInterface) { + constructor(private host: UmbControllerHostElement) { super(host, UMB_MEMBER_STORE_CONTEXT_TOKEN.toString()); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/manifests.ts index e5cd53441d..15c055c885 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/manifests.ts @@ -1,8 +1,7 @@ import { UmbMemberRepository } from './member.repository'; import { UmbMemberStore } from './member.store'; import { UmbMemberTreeStore } from './member.tree.store'; -import { ManifestRepository } from 'libs/extensions-registry/repository.models'; -import { ManifestStore, ManifestTreeStore } from '@umbraco-cms/backoffice/extensions-registry'; +import type { ManifestStore, ManifestTreeStore, ManifestRepository } from '@umbraco-cms/backoffice/extensions-registry'; export const MEMBER_REPOSITORY_ALIAS = 'Umb.Repository.Member'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/member.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/member.repository.ts index 06d8dd2c48..b0e6c529c6 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/member.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/member.repository.ts @@ -1,20 +1,20 @@ import { UmbMemberTreeStore, UMB_MEMBER_TREE_STORE_CONTEXT_TOKEN } from './member.tree.store'; import { MemberTreeServerDataSource } from './sources/member.tree.server.data'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; import { UmbTreeRepository } from '@umbraco-cms/backoffice/repository'; import { ProblemDetailsModel } from '@umbraco-cms/backoffice/backend-api'; export class UmbMemberRepository implements UmbTreeRepository { - #host: UmbControllerHostInterface; + #host: UmbControllerHostElement; #dataSource: MemberTreeServerDataSource; #treeStore?: UmbMemberTreeStore; #notificationContext?: UmbNotificationContext; #initResolver?: () => void; #initialized = false; - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { this.#host = host; // TODO: figure out how spin up get the correct data source this.#dataSource = new MemberTreeServerDataSource(this.#host); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/member.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/member.store.ts index 4db3ae37b9..518d0b5c47 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/member.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/member.store.ts @@ -1,6 +1,6 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UmbStoreBase } from '@umbraco-cms/backoffice/store'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { ArrayState } from '@umbraco-cms/backoffice/observable-api'; import type { MemberDetails } from '@umbraco-cms/backoffice/models'; @@ -13,7 +13,7 @@ import type { MemberDetails } from '@umbraco-cms/backoffice/models'; export class UmbMemberStore extends UmbStoreBase { #data = new ArrayState([], (x) => x.key); - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { super(host, UMB_MEMBER_STORE_CONTEXT_TOKEN.toString()); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/member.tree.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/member.tree.store.ts index a5c832358e..49568a0fff 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/member.tree.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/member.tree.store.ts @@ -1,6 +1,6 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/store'; -import type { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; export const UMB_MEMBER_TREE_STORE_CONTEXT_TOKEN = new UmbContextToken('UmbMemberTreeStore'); @@ -13,10 +13,10 @@ export const UMB_MEMBER_TREE_STORE_CONTEXT_TOKEN = new UmbContextToken implements UmbEntityWorkspaceContextInterface { - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { super(host, new UmbMemberRepository(host)); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/created/packages-created-overview.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/created/packages-created-overview.element.ts index c51f1dbb9a..11cd97a2fc 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/created/packages-created-overview.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/created/packages-created-overview.element.ts @@ -3,11 +3,10 @@ import { ifDefined } from 'lit/directives/if-defined.js'; import { customElement, state } from 'lit/decorators.js'; import { repeat } from 'lit/directives/repeat.js'; import { UUIPaginationEvent } from '@umbraco-ui/uui'; -import { UMB_CONFIRM_MODAL_TOKEN } from '../../../../shared/modals/confirm'; import { PackageDefinitionResponseModel, PackageResource } from '@umbraco-cms/backoffice/backend-api'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; -import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; +import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN, UMB_CONFIRM_MODAL } from '@umbraco-cms/backoffice/modal'; @customElement('umb-packages-created-overview') export class UmbPackagesCreatedOverviewElement extends UmbLitElement { @@ -135,7 +134,7 @@ export class UmbPackagesCreatedOverviewElement extends UmbLitElement { async #deletePackage(p: PackageDefinitionResponseModel) { if (!p.key) return; - const modalHandler = this._modalContext?.open(UMB_CONFIRM_MODAL_TOKEN, { + const modalHandler = this._modalContext?.open(UMB_CONFIRM_MODAL, { color: 'danger', headline: `Remove ${p.name}?`, content: 'Are you sure you want to delete this package', diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/installed/installed-packages-section-view-item.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/installed/installed-packages-section-view-item.element.ts index bce3d35726..d3f537e95e 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/installed/installed-packages-section-view-item.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/installed/installed-packages-section-view-item.element.ts @@ -3,9 +3,7 @@ import { ifDefined } from 'lit/directives/if-defined.js'; import { customElement, property, state } from 'lit/decorators.js'; import { firstValueFrom, map } from 'rxjs'; import { UUIButtonState } from '@umbraco-ui/uui'; - -import { UMB_CONFIRM_MODAL_TOKEN } from '../../../../shared/modals/confirm'; -import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; +import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN, UMB_CONFIRM_MODAL } from '@umbraco-cms/backoffice/modal'; import { createExtensionElement, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extensions-api'; import type { ManifestPackageView } from '@umbraco-cms/backoffice/extensions-registry'; @@ -15,7 +13,7 @@ import { PackageResource } from '@umbraco-cms/backoffice/backend-api'; import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; @customElement('umb-installed-packages-section-view-item') -export class UmbInstalledPackagesSectionViewItem extends UmbLitElement { +export class UmbInstalledPackagesSectionViewItemElement extends UmbLitElement { static styles = css` :host { display: flex; @@ -82,7 +80,7 @@ export class UmbInstalledPackagesSectionViewItem extends UmbLitElement { async _onMigration() { if (!this.name) return; - const modalHandler = this._modalContext?.open(UMB_CONFIRM_MODAL_TOKEN, { + const modalHandler = this._modalContext?.open(UMB_CONFIRM_MODAL, { color: 'positive', headline: `Run migrations for ${this.name}?`, content: `Do you want to start run migrations for ${this.name}`, @@ -153,6 +151,6 @@ export class UmbInstalledPackagesSectionViewItem extends UmbLitElement { declare global { interface HTMLElementTagNameMap { - 'umb-installed-packages-section-view-item': UmbInstalledPackagesSectionViewItem; + 'umb-installed-packages-section-view-item': UmbInstalledPackagesSectionViewItemElement; } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/installed/installed-packages-section-view.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/installed/installed-packages-section-view.element.ts index de77a3a9a2..578403d9dd 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/installed/installed-packages-section-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/installed/installed-packages-section-view.element.ts @@ -10,7 +10,7 @@ import type { UmbPackageWithMigrationStatus } from '@umbraco-cms/backoffice/mode import './installed-packages-section-view-item.element'; @customElement('umb-installed-packages-section-view') -export class UmbInstalledPackagesSectionView extends UmbLitElement { +export class UmbInstalledPackagesSectionViewElement extends UmbLitElement { static styles = [ UUITextStyles, css` @@ -138,10 +138,10 @@ export class UmbInstalledPackagesSectionView extends UmbLitElement { } } -export default UmbInstalledPackagesSectionView; +export default UmbInstalledPackagesSectionViewElement; declare global { interface HTMLElementTagNameMap { - 'umb-installed-packages-section-view': UmbInstalledPackagesSectionView; + 'umb-installed-packages-section-view': UmbInstalledPackagesSectionViewElement; } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/packages/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/packages/repository/manifests.ts index f59cbfc4c5..b2a0069d5b 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/packages/repository/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/packages/repository/manifests.ts @@ -1,7 +1,6 @@ import { UmbPackageRepository } from './package.repository'; import { UmbPackageStore } from './package.store'; -import { ManifestRepository } from 'libs/extensions-registry/repository.models'; -import { ManifestStore } from '@umbraco-cms/backoffice/extensions-registry'; +import type { ManifestStore, ManifestRepository } from '@umbraco-cms/backoffice/extensions-registry'; export const PACKAGE_REPOSITORY_ALIAS = 'Umb.Repository.Package'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/packages/repository/package.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/packages/repository/package.repository.ts index d22e510625..abe8c7deda 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/packages/repository/package.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/packages/repository/package.repository.ts @@ -1,6 +1,6 @@ import { UmbPackageStore, UMB_PACKAGE_STORE_TOKEN } from './package.store'; import { UmbPackageServerDataSource } from './sources/package.server.data'; -import type { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; import type { ManifestBase } from '@umbraco-cms/backoffice/extensions-registry'; import { isManifestJSType } from '@umbraco-cms/backoffice/extensions-api'; @@ -18,7 +18,7 @@ export class UmbPackageRepository { #packageSource: UmbPackageServerDataSource; #apiBaseUrl = OpenAPI.BASE; - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { this.#packageSource = new UmbPackageServerDataSource(host); this.#init = new Promise((res) => { new UmbContextConsumerController(host, UMB_PACKAGE_STORE_TOKEN, (instance) => { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/packages/repository/package.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/packages/repository/package.store.ts index 560e9eed24..8ed4792471 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/packages/repository/package.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/packages/repository/package.store.ts @@ -1,6 +1,6 @@ import { ReplaySubject } from 'rxjs'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbStoreBase } from '@umbraco-cms/backoffice/store'; import type { UmbPackage } from '@umbraco-cms/backoffice/models'; import type { PackageMigrationStatusResponseModel } from '@umbraco-cms/backoffice/backend-api'; @@ -38,10 +38,10 @@ export class UmbPackageStore extends UmbStoreBase { /** * Creates an instance of PackageStore. - * @param {UmbControllerHostInterface} host + * @param {UmbControllerHostElement} host * @memberof PackageStore */ - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { super(host, UMB_PACKAGE_STORE_TOKEN.toString()); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/packages/repository/server-extension.controller.ts b/src/Umbraco.Web.UI.Client/src/backoffice/packages/repository/server-extension.controller.ts index 2f07556f6a..c3f33ced28 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/packages/repository/server-extension.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/packages/repository/server-extension.controller.ts @@ -1,14 +1,14 @@ import { Subject, takeUntil } from 'rxjs'; import { UmbPackageRepository } from './package.repository'; -import { UmbController, UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbController, UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbExtensionRegistry } from '@umbraco-cms/backoffice/extensions-api'; export class UmbServerExtensionController extends UmbController { - #host: UmbControllerHostInterface; + #host: UmbControllerHostElement; #unobserve = new Subject(); #repository: UmbPackageRepository; - constructor(host: UmbControllerHostInterface, private readonly extensionRegistry: UmbExtensionRegistry) { + constructor(host: UmbControllerHostElement, private readonly extensionRegistry: UmbExtensionRegistry) { super(host, UmbServerExtensionController.name); this.#host = host; this.#repository = new UmbPackageRepository(host); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/packages/repository/sources/package.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/packages/repository/sources/package.server.data.ts index fdac0c0809..5e25807032 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/packages/repository/sources/package.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/packages/repository/sources/package.server.data.ts @@ -1,5 +1,5 @@ import { PackageResource } from '@umbraco-cms/backoffice/backend-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; /** @@ -7,17 +7,14 @@ import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; * @export */ export class UmbPackageServerDataSource { - constructor(private readonly host: UmbControllerHostInterface) {} + constructor(private readonly host: UmbControllerHostElement) {} /** * Get the root items from the server * @memberof UmbPackageServerDataSource */ getRootItems() { - return tryExecuteAndNotify( - this.host, - PackageResource.getPackageManifest() - ); + return tryExecuteAndNotify(this.host, PackageResource.getPackageManifest()); } /** diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/search/modals/search/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/search/modals/search/index.ts deleted file mode 100644 index 8044cac830..0000000000 --- a/src/Umbraco.Web.UI.Client/src/backoffice/search/modals/search/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; - -export const UMB_SEARCH_MODAL_TOKEN = new UmbModalToken('Umb.Modal.Search'); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/search/umb-search-header-app.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/search/umb-search-header-app.element.ts index 90227bbd00..9335c24119 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/search/umb-search-header-app.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/search/umb-search-header-app.element.ts @@ -5,7 +5,7 @@ import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN } from '@umbraco-cms/backoffic import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-search-header-app') -export class UmbSearchHeaderApp extends UmbLitElement { +export class UmbSearchHeaderAppElement extends UmbLitElement { static styles: CSSResultGroup = [ UUITextStyles, css` @@ -39,10 +39,10 @@ export class UmbSearchHeaderApp extends UmbLitElement { } } -export default UmbSearchHeaderApp; +export default UmbSearchHeaderAppElement; declare global { interface HTMLElementTagNameMap { - 'umb-search-header-app': UmbSearchHeaderApp; + 'umb-search-header-app': UmbSearchHeaderAppElement; } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/cultures/repository/culture.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/cultures/repository/culture.repository.ts index d75993f9b1..38caacad96 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/cultures/repository/culture.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/cultures/repository/culture.repository.ts @@ -1,17 +1,17 @@ import { UmbCultureServerDataSource } from './sources/culture.server.data'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; export class UmbCultureRepository { #init!: Promise; - #host: UmbControllerHostInterface; + #host: UmbControllerHostElement; #dataSource: UmbCultureServerDataSource; #notificationContext?: UmbNotificationContext; - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { this.#host = host; this.#dataSource = new UmbCultureServerDataSource(this.#host); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/cultures/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/cultures/repository/manifests.ts index 7502a562d3..0496f4acff 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/cultures/repository/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/cultures/repository/manifests.ts @@ -1,5 +1,5 @@ import { UmbCultureRepository } from '../repository/culture.repository'; -import { ManifestRepository } from 'libs/extensions-registry/repository.models'; +import { ManifestRepository } from '@umbraco-cms/backoffice/extensions-registry'; export const CULTURE_REPOSITORY_ALIAS = 'Umb.Repository.Culture'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/cultures/repository/sources/culture.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/cultures/repository/sources/culture.server.data.ts index 2728d5c78b..b9525c1906 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/cultures/repository/sources/culture.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/cultures/repository/sources/culture.server.data.ts @@ -1,6 +1,6 @@ import { UmbCultureDataSource } from '.'; import { CultureResource } from '@umbraco-cms/backoffice/backend-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; /** @@ -10,14 +10,14 @@ import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; * @implements {RepositoryDetailDataSource} */ export class UmbCultureServerDataSource implements UmbCultureDataSource { - #host: UmbControllerHostInterface; + #host: UmbControllerHostElement; /** * Creates an instance of UmbLanguageServerDataSource. - * @param {UmbControllerHostInterface} host + * @param {UmbControllerHostElement} host * @memberof UmbLanguageServerDataSource */ - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { this.#host = host; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/examine-management/views/modal-views/fields-settings.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/examine-management/views/modal-views/fields-settings.element.ts index 60a1acfb8e..337623cfcc 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/examine-management/views/modal-views/fields-settings.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/examine-management/views/modal-views/fields-settings.element.ts @@ -1,7 +1,7 @@ import { html, css } from 'lit'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { customElement, state } from 'lit/decorators.js'; -import { UmbCreateDocumentModalResultData, UmbExamineFieldsSettingsModalData } from '.'; +import { UmbCreateDocumentModalResultData, UmbExamineFieldsSettingsModalData } from '@umbraco-cms/backoffice/modal'; import { UmbModalBaseElement } from '@umbraco-cms/internal/modal'; @customElement('umb-examine-fields-settings-modal') diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/examine-management/views/section-view-examine-indexers.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/examine-management/views/section-view-examine-indexers.ts index 6920abc579..9dcfc67150 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/examine-management/views/section-view-examine-indexers.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/examine-management/views/section-view-examine-indexers.ts @@ -2,8 +2,7 @@ import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { css, html, nothing } from 'lit'; import { customElement, property, state } from 'lit/decorators.js'; import { UUIButtonState } from '@umbraco-ui/uui-button'; -import { UMB_CONFIRM_MODAL_TOKEN } from '../../../../shared/modals/confirm'; -import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; +import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN, UMB_CONFIRM_MODAL } from '@umbraco-cms/backoffice/modal'; import { HealthStatusModel, IndexResponseModel, IndexerResource } from '@umbraco-cms/backoffice/backend-api'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -118,7 +117,7 @@ export class UmbDashboardExamineIndexElement extends UmbLitElement { } private async _onRebuildHandler() { - const modalHandler = this._modalContext?.open(UMB_CONFIRM_MODAL_TOKEN, { + const modalHandler = this._modalContext?.open(UMB_CONFIRM_MODAL, { headline: `Rebuild ${this.indexName}`, content: html` This will cause the index to be rebuilt.
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/examine-management/views/section-view-examine-searchers.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/examine-management/views/section-view-examine-searchers.ts index 10439bad30..18cad41a37 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/examine-management/views/section-view-examine-searchers.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/examine-management/views/section-view-examine-searchers.ts @@ -1,14 +1,21 @@ import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { css, html, nothing } from 'lit'; import { customElement, state, query, property } from 'lit/decorators.js'; -import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; -import { SearchResultResponseModel, SearcherResource, FieldPresentationModel } from '@umbraco-cms/backoffice/backend-api'; +import { + UmbModalContext, + UMB_MODAL_CONTEXT_TOKEN, + UMB_EXAMINE_FIELDS_SETTINGS_MODAL, +} from '@umbraco-cms/backoffice/modal'; +import { + SearchResultResponseModel, + SearcherResource, + FieldPresentationModel, +} from '@umbraco-cms/backoffice/backend-api'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; import './modal-views/fields-viewer.element'; import './modal-views/fields-settings.element'; -import { UMB_EXAMINE_FIELDS_SETTINGS_MODAL_TOKEN } from './modal-views'; interface ExposedSearchResultField { name?: string | null; @@ -174,7 +181,7 @@ export class UmbDashboardExamineSearcherElement extends UmbLitElement { } private _onFieldFilterClick() { - const modalHandler = this._modalContext?.open(UMB_EXAMINE_FIELDS_SETTINGS_MODAL_TOKEN, { + const modalHandler = this._modalContext?.open(UMB_EXAMINE_FIELDS_SETTINGS_MODAL, { ...this._exposedFields, }); modalHandler?.onSubmit().then(({ fields } = {}) => { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/health-check/health-check.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/health-check/health-check.context.ts index 96ea04fb9d..5aead9d1aa 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/health-check/health-check.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/health-check/health-check.context.ts @@ -5,7 +5,7 @@ import { HealthCheckResource, } from '@umbraco-cms/backoffice/backend-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; export class UmbHealthCheckContext { @@ -15,9 +15,9 @@ export class UmbHealthCheckContext { private _results = new BehaviorSubject(undefined); public readonly results = this._results.asObservable(); - public host: UmbControllerHostInterface; + public host: UmbControllerHostElement; - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { this.host = host; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/published-status/dashboard-published-status.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/published-status/dashboard-published-status.element.ts index 650a285706..1601dfd6b6 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/published-status/dashboard-published-status.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/published-status/dashboard-published-status.element.ts @@ -2,8 +2,7 @@ import { UUIButtonState } from '@umbraco-ui/uui'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { css, html } from 'lit'; import { customElement, state } from 'lit/decorators.js'; -import { UMB_CONFIRM_MODAL_TOKEN } from '../../../shared/modals/confirm'; -import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; +import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN, UMB_CONFIRM_MODAL } from '@umbraco-cms/backoffice/modal'; import { PublishedCacheResource } from '@umbraco-cms/backoffice/backend-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @@ -14,10 +13,10 @@ export class UmbDashboardPublishedStatusElement extends UmbLitElement { UUITextStyles, css` :host { - display:block; - margin:var(--uui-size-layout-1); + display: block; + margin: var(--uui-size-layout-1); } - + uui-box + uui-box { margin-top: var(--uui-size-space-5); } @@ -86,7 +85,7 @@ export class UmbDashboardPublishedStatusElement extends UmbLitElement { } } private async _onReloadCacheHandler() { - const modalHandler = this._modalContext?.open(UMB_CONFIRM_MODAL_TOKEN, { + const modalHandler = this._modalContext?.open(UMB_CONFIRM_MODAL, { headline: 'Reload', content: html` Trigger a in-memory and local file cache reload on all servers. `, color: 'danger', @@ -109,7 +108,7 @@ export class UmbDashboardPublishedStatusElement extends UmbLitElement { } private async _onRebuildCacheHandler() { - const modalHandler = this._modalContext?.open(UMB_CONFIRM_MODAL_TOKEN, { + const modalHandler = this._modalContext?.open(UMB_CONFIRM_MODAL, { headline: 'Rebuild', content: html` Rebuild content in cmsContentNu database table. Expensive.`, color: 'danger', diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/data-type.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/data-type.repository.ts index 3922a1a665..c49f8e180c 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/data-type.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/data-type.repository.ts @@ -3,7 +3,7 @@ import { UmbDataTypeServerDataSource } from './sources/data-type.server.data'; import { UmbDataTypeStore, UMB_DATA_TYPE_STORE_CONTEXT_TOKEN } from './data-type.store'; import { DataTypeTreeServerDataSource } from './sources/data-type.tree.server.data'; import type { UmbTreeDataSource, UmbTreeRepository, UmbDetailRepository } from '@umbraco-cms/backoffice/repository'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; import { ProblemDetailsModel, DataTypeResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; @@ -18,7 +18,7 @@ type TreeItemType = any; export class UmbDataTypeRepository implements UmbTreeRepository, UmbDetailRepository { #init!: Promise; - #host: UmbControllerHostInterface; + #host: UmbControllerHostElement; #treeSource: UmbTreeDataSource; #treeStore?: UmbDataTypeTreeStore; @@ -28,7 +28,7 @@ export class UmbDataTypeRepository implements UmbTreeRepository, U #notificationContext?: UmbNotificationContext; - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { this.#host = host; // TODO: figure out how spin up get the correct data source diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/data-type.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/data-type.store.ts index 14b0a96478..c50fc3644c 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/data-type.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/data-type.store.ts @@ -2,7 +2,7 @@ import type { DataTypeResponseModel } from '@umbraco-cms/backoffice/backend-api' import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { ArrayState } from '@umbraco-cms/backoffice/observable-api'; import { UmbStoreBase } from '@umbraco-cms/backoffice/store'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; export const UMB_DATA_TYPE_STORE_CONTEXT_TOKEN = new UmbContextToken('UmbDataTypeStore'); @@ -17,10 +17,10 @@ export class UmbDataTypeStore extends UmbStoreBase { /** * Creates an instance of UmbDataTypeStore. - * @param {UmbControllerHostInterface} host + * @param {UmbControllerHostElement} host * @memberof UmbDataTypeStore */ - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { super(host, UMB_DATA_TYPE_STORE_CONTEXT_TOKEN.toString()); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/data-type.tree.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/data-type.tree.store.ts index 455bf769f5..560c70160d 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/data-type.tree.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/data-type.tree.store.ts @@ -1,5 +1,5 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/store'; /** @@ -12,10 +12,10 @@ import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/store'; export class UmbDataTypeTreeStore extends UmbEntityTreeStore { /** * Creates an instance of UmbDataTypeTreeStore. - * @param {UmbControllerHostInterface} host + * @param {UmbControllerHostElement} host * @memberof UmbDataTypeTreeStore */ - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { super(host, UMB_DATA_TYPE_TREE_STORE_CONTEXT_TOKEN.toString()); } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/manifests.ts index 8e68419718..0217359bf7 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/manifests.ts @@ -1,8 +1,7 @@ import { UmbDataTypeRepository } from '../repository/data-type.repository'; import { UmbDataTypeStore } from './data-type.store'; import { UmbDataTypeTreeStore } from './data-type.tree.store'; -import { ManifestRepository } from 'libs/extensions-registry/repository.models'; -import { ManifestStore, ManifestTreeStore } from '@umbraco-cms/backoffice/extensions-registry'; +import type { ManifestStore, ManifestTreeStore, ManifestRepository } from '@umbraco-cms/backoffice/extensions-registry'; export const DATA_TYPE_REPOSITORY_ALIAS = 'Umb.Repository.DataType'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/sources/data-type.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/sources/data-type.server.data.ts index 86585ea6f1..126a1bd5ec 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/sources/data-type.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/sources/data-type.server.data.ts @@ -6,7 +6,7 @@ import { DataTypeResponseModel, DataTypeModelBaseModel, } from '@umbraco-cms/backoffice/backend-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; /** @@ -16,14 +16,14 @@ import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; * @implements {RepositoryDetailDataSource} */ export class UmbDataTypeServerDataSource implements UmbDataSource { - #host: UmbControllerHostInterface; + #host: UmbControllerHostElement; /** * Creates an instance of UmbDataTypeServerDataSource. - * @param {UmbControllerHostInterface} host + * @param {UmbControllerHostElement} host * @memberof UmbDataTypeServerDataSource */ - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { this.#host = host; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/sources/data-type.tree.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/sources/data-type.tree.server.data.ts index 933a057a7b..8613494a9d 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/sources/data-type.tree.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/sources/data-type.tree.server.data.ts @@ -1,6 +1,6 @@ import type { UmbTreeDataSource } from '@umbraco-cms/backoffice/repository'; import { ProblemDetailsModel, DataTypeResource } from '@umbraco-cms/backoffice/backend-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; /** @@ -10,7 +10,7 @@ import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; * @implements {DocumentTreeDataSource} */ export class DataTypeTreeServerDataSource implements UmbTreeDataSource { - #host: UmbControllerHostInterface; + #host: UmbControllerHostElement; // TODO: how do we handle trashed items? async trashItems(keys: Array) { @@ -47,10 +47,10 @@ export class DataTypeTreeServerDataSource implements UmbTreeDataSource { /** * Creates an instance of DocumentTreeServerDataSource. - * @param {UmbControllerHostInterface} host + * @param {UmbControllerHostElement} host * @memberof DocumentTreeServerDataSource */ - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { this.#host = host; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/data-type-workspace-edit.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/data-type-workspace-edit.element.ts index 26dfe86ba8..0edb193b9f 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/data-type-workspace-edit.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/data-type-workspace-edit.element.ts @@ -3,7 +3,7 @@ import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { css, html } from 'lit'; import { customElement, property, state } from 'lit/decorators.js'; import { UmbDataTypeWorkspaceContext } from './data-type-workspace.context'; -import { UmbRouteLocation } from '@umbraco-cms/internal/router'; +import { UmbRouteLocation } from '@umbraco-cms/backoffice/router'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { ManifestWorkspace } from '@umbraco-cms/backoffice/extensions-registry'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/data-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/data-type-workspace.context.ts index 2db15a8016..e8eb661629 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/data-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/data-type-workspace.context.ts @@ -3,7 +3,7 @@ import { UmbEntityWorkspaceContextInterface } from '../../../shared/components/w import { UmbDataTypeRepository } from '../repository/data-type.repository'; import type { DataTypeResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { appendToFrozenArray, ObjectState } from '@umbraco-cms/backoffice/observable-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; export class UmbDataTypeWorkspaceContext extends UmbWorkspaceContext @@ -14,7 +14,7 @@ export class UmbDataTypeWorkspaceContext name = this.#data.getObservablePart((data) => data?.name); key = this.#data.getObservablePart((data) => data?.key); - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { super(host, new UmbDataTypeRepository(host)); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/views/details/data-type-details-workspace-view.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/views/details/data-type-details-workspace-view.element.ts index b5c5da1ce6..11a5ef4aa4 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/views/details/data-type-details-workspace-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/views/details/data-type-details-workspace-view.element.ts @@ -2,8 +2,11 @@ import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { css, html, nothing } from 'lit'; import { customElement, state } from 'lit/decorators.js'; import { UmbDataTypeWorkspaceContext } from '../../data-type-workspace.context'; -import { UMB_PROPERTY_EDITOR_UI_PICKER_MODAL_TOKEN } from '../../../../../shared/property-editors/modals/property-editor-ui-picker'; -import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; +import { + UmbModalContext, + UMB_MODAL_CONTEXT_TOKEN, + UMB_PROPERTY_EDITOR_UI_PICKER_MODAL, +} from '@umbraco-cms/backoffice/modal'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import type { DataTypeResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extensions-api'; @@ -101,7 +104,7 @@ export class UmbDataTypeDetailsWorkspaceViewEditElement extends UmbLitElement { private _openPropertyEditorUIPicker() { if (!this._dataType) return; - const modalHandler = this._modalContext?.open(UMB_PROPERTY_EDITOR_UI_PICKER_MODAL_TOKEN, { + const modalHandler = this._modalContext?.open(UMB_PROPERTY_EDITOR_UI_PICKER_MODAL, { selection: this._propertyEditorUiAlias ? [this._propertyEditorUiAlias] : [], }); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/extensions/workspace/extension-root-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/extensions/workspace/extension-root-workspace.element.ts index 0d9292a280..5831501295 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/extensions/workspace/extension-root-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/extensions/workspace/extension-root-workspace.element.ts @@ -1,19 +1,20 @@ import { css, html } from 'lit'; import { customElement, state } from 'lit/decorators.js'; import { map } from 'rxjs'; -import { UMB_CONFIRM_MODAL_TOKEN } from '../../../shared/modals/confirm'; import { isManifestElementNameType, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extensions-api'; import type { ManifestTypes } from '@umbraco-cms/backoffice/extensions-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; +import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN, UMB_CONFIRM_MODAL } from '@umbraco-cms/backoffice/modal'; @customElement('umb-extension-root-workspace') export class UmbExtensionRootWorkspaceElement extends UmbLitElement { - static styles = [css` - uui-box { - margin: var(--uui-size-layout-1); - } - `] + static styles = [ + css` + uui-box { + margin: var(--uui-size-layout-1); + } + `, + ]; @state() private _extensions?: Array = undefined; @@ -50,7 +51,7 @@ export class UmbExtensionRootWorkspaceElement extends UmbLitElement { } async #removeExtension(extension: ManifestTypes) { - const modalHandler = this._modalContext?.open(UMB_CONFIRM_MODAL_TOKEN, { + const modalHandler = this._modalContext?.open(UMB_CONFIRM_MODAL, { headline: 'Unload extension', confirmLabel: 'Unload', content: html`

Are you sure you want to unload the extension ${extension.alias}?

`, diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/app-language-select/app-language.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/app-language-select/app-language.context.ts index 93fe69b4cd..6f85f5c271 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/app-language-select/app-language.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/app-language-select/app-language.context.ts @@ -1,11 +1,11 @@ import { UmbLanguageRepository } from '../repository/language.repository'; import { ObjectState, UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { LanguageResponseModel } from '@umbraco-cms/backoffice/backend-api'; export class UmbAppLanguageContext { - #host: UmbControllerHostInterface; + #host: UmbControllerHostElement; #languageRepository: UmbLanguageRepository; #languages: Array = []; @@ -13,7 +13,7 @@ export class UmbAppLanguageContext { #appLanguage = new ObjectState(undefined); appLanguage = this.#appLanguage.asObservable(); - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { this.#host = host; this.#languageRepository = new UmbLanguageRepository(this.#host); this.#observeLanguages(); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/language.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/language.repository.ts index b25b113edd..768c114d96 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/language.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/language.repository.ts @@ -1,6 +1,6 @@ import { UmbLanguageServerDataSource } from './sources/language.server.data'; import { UmbLanguageStore, UMB_LANGUAGE_STORE_CONTEXT_TOKEN } from './language.store'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; import { LanguageResponseModel, ProblemDetailsModel } from '@umbraco-cms/backoffice/backend-api'; @@ -8,14 +8,14 @@ import { LanguageResponseModel, ProblemDetailsModel } from '@umbraco-cms/backoff export class UmbLanguageRepository { #init!: Promise; - #host: UmbControllerHostInterface; + #host: UmbControllerHostElement; #dataSource: UmbLanguageServerDataSource; #languageStore?: UmbLanguageStore; #notificationContext?: UmbNotificationContext; - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { this.#host = host; this.#dataSource = new UmbLanguageServerDataSource(this.#host); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/language.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/language.store.ts index d4dc740843..820b66fc50 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/language.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/language.store.ts @@ -1,6 +1,6 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UmbStoreBase } from '@umbraco-cms/backoffice/store'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { ArrayState } from '@umbraco-cms/backoffice/observable-api'; import { LanguageResponseModel } from '@umbraco-cms/backoffice/backend-api'; @@ -16,7 +16,7 @@ export class UmbLanguageStore extends UmbStoreBase { #data = new ArrayState([], (x) => x.isoCode); data = this.#data.asObservable(); - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { super(host, UMB_LANGUAGE_STORE_CONTEXT_TOKEN.toString()); } @@ -33,4 +33,3 @@ export class UmbLanguageStore extends UmbStoreBase { return this.#data.getObservablePart((items) => items.filter((item) => isoCodes.includes(item.isoCode ?? ''))); } } - diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/manifests.ts index a068bc239f..75dcb127c4 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/manifests.ts @@ -1,7 +1,6 @@ import { UmbLanguageRepository } from '../repository/language.repository'; import { UmbLanguageStore } from './language.store'; -import { ManifestRepository } from 'libs/extensions-registry/repository.models'; -import { ManifestStore } from '@umbraco-cms/backoffice/extensions-registry'; +import type { ManifestStore, ManifestRepository } from '@umbraco-cms/backoffice/extensions-registry'; export const LANGUAGE_REPOSITORY_ALIAS = 'Umb.Repository.Language'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/sources/language.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/sources/language.server.data.ts index 35b7dc8bfb..a7b8096dc5 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/sources/language.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/sources/language.server.data.ts @@ -1,5 +1,5 @@ import { ProblemDetailsModel, LanguageResource, LanguageResponseModel } from '@umbraco-cms/backoffice/backend-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; /** @@ -9,14 +9,14 @@ import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; * @implements {RepositoryDetailDataSource} */ export class UmbLanguageServerDataSource implements UmbLanguageServerDataSource { - #host: UmbControllerHostInterface; + #host: UmbControllerHostElement; /** * Creates an instance of UmbLanguageServerDataSource. - * @param {UmbControllerHostInterface} host + * @param {UmbControllerHostElement} host * @memberof UmbLanguageServerDataSource */ - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { this.#host = host; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/language-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/language-workspace.context.ts index 0619b4a4d8..02b121607e 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/language-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/language-workspace.context.ts @@ -2,7 +2,7 @@ import { UmbLanguageRepository } from '../../repository/language.repository'; import { UmbWorkspaceContext } from '../../../../shared/components/workspace/workspace-context/workspace-context'; import type { LanguageResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { ObjectState } from '@umbraco-cms/backoffice/observable-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; export class UmbLanguageWorkspaceContext extends UmbWorkspaceContext { #data = new ObjectState(undefined); @@ -12,7 +12,7 @@ export class UmbLanguageWorkspaceContext extends UmbWorkspaceContext(undefined); validationErrors = this.#validationErrors.asObservable(); - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { super(host, new UmbLanguageRepository(host)); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/repository/log-viewer.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/repository/log-viewer.repository.ts index f7e3f1ab57..15ad25e1b0 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/repository/log-viewer.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/repository/log-viewer.repository.ts @@ -1,6 +1,6 @@ import { UmbLogMessagesServerDataSource, UmbLogSearchesServerDataSource } from './sources/log-viewer.server.data'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; import { DirectionModel, LogLevelModel } from '@umbraco-cms/backoffice/backend-api'; @@ -9,14 +9,14 @@ import { DirectionModel, LogLevelModel } from '@umbraco-cms/backoffice/backend-a // element -> context -> repository -> (store) -> data source // All methods should be async and return a promise. Some methods might return an observable as part of the promise response. export class UmbLogViewerRepository { - #host: UmbControllerHostInterface; + #host: UmbControllerHostElement; #searchDataSource: UmbLogSearchesServerDataSource; #messagesDataSource: UmbLogMessagesServerDataSource; #notificationService?: UmbNotificationContext; #initResolver?: () => void; #initialized = false; - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { this.#host = host; this.#searchDataSource = new UmbLogSearchesServerDataSource(this.#host); this.#messagesDataSource = new UmbLogMessagesServerDataSource(this.#host); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/repository/sources/log-viewer.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/repository/sources/log-viewer.server.data.ts index 459585e07b..660ab50056 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/repository/sources/log-viewer.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/repository/sources/log-viewer.server.data.ts @@ -1,6 +1,11 @@ import { LogMessagesDataSource, LogSearchDataSource } from '.'; -import { DirectionModel, LogLevelModel, LogViewerResource, SavedLogSearchResponseModel } from '@umbraco-cms/backoffice/backend-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { + DirectionModel, + LogLevelModel, + LogViewerResource, + SavedLogSearchResponseModel, +} from '@umbraco-cms/backoffice/backend-api'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; /** @@ -10,14 +15,14 @@ import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; * @implements {TemplateDetailDataSource} */ export class UmbLogSearchesServerDataSource implements LogSearchDataSource { - #host: UmbControllerHostInterface; + #host: UmbControllerHostElement; /** * Creates an instance of UmbLogSearchesServerDataSource. - * @param {UmbControllerHostInterface} host + * @param {UmbControllerHostElement} host * @memberof UmbLogSearchesServerDataSource */ - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { this.#host = host; } @@ -63,151 +68,151 @@ export class UmbLogSearchesServerDataSource implements LogSearchDataSource { return await tryExecuteAndNotify(this.#host, LogViewerResource.deleteLogViewerSavedSearchByName({ name })); } } +/** + * A data source for the log messages and levels + * + * @export + * @class UmbLogMessagesServerDataSource + * @implements {LogMessagesDataSource} + */ +export class UmbLogMessagesServerDataSource implements LogMessagesDataSource { + #host: UmbControllerHostElement; + /** - * A data source for the log messages and levels - * - * @export - * @class UmbLogMessagesServerDataSource - * @implements {LogMessagesDataSource} + * Creates an instance of UmbLogMessagesServerDataSource. + * @param {UmbControllerHostElement} host + * @memberof UmbLogMessagesServerDataSource */ - export class UmbLogMessagesServerDataSource implements LogMessagesDataSource { - #host: UmbControllerHostInterface; - - /** - * Creates an instance of UmbLogMessagesServerDataSource. - * @param {UmbControllerHostInterface} host - * @memberof UmbLogMessagesServerDataSource - */ - constructor(host: UmbControllerHostInterface) { - this.#host = host; - } - - /** - * Grabs all the loggers from the server - * - * @param {{ skip?: number; take?: number }} { skip = 0, take = 100 } - * @return {*} - * @memberof UmbLogMessagesServerDataSource - */ - async getLogViewerLevel({ skip = 0, take = 100 }: { skip?: number; take?: number }) { - return await tryExecuteAndNotify(this.#host, LogViewerResource.getLogViewerLevel({ skip, take })); - } - - /** - * Grabs all the number of different log messages from the server - * - * @param {{ skip?: number; take?: number }} { skip = 0, take = 100 } - * @return {*} - * @memberof UmbLogMessagesServerDataSource - */ - async getLogViewerLevelCount({ startDate, endDate }: { startDate?: string; endDate?: string }) { - return await tryExecuteAndNotify( - this.#host, - LogViewerResource.getLogViewerLevelCount({ - startDate, - endDate, - }) - ); - } - /** - * Grabs all the log messages from the server - * - * @param {{ - * skip?: number; - * take?: number; - * orderDirection?: DirectionModel; - * filterExpression?: string; - * logLevel?: Array; - * startDate?: string; - * endDate?: string; - * }} { - * skip = 0, - * take = 100, - * orderDirection, - * filterExpression, - * logLevel, - * startDate, - * endDate, - * } - * @return {*} - * @memberof UmbLogMessagesServerDataSource - */ - async getLogViewerLogs({ - skip = 0, - take = 100, - orderDirection, - filterExpression, - logLevel, - startDate, - endDate, - }: { - skip?: number; - take?: number; - orderDirection?: DirectionModel; - filterExpression?: string; - logLevel?: Array; - startDate?: string; - endDate?: string; - }) { - return await tryExecuteAndNotify( - this.#host, - LogViewerResource.getLogViewerLog({ - skip, - take, - orderDirection, - filterExpression, - logLevel, - startDate, - endDate, - }) - ); - } - /** - * Grabs all the log message templates from the server - * - * @param {{ - * skip?: number; - * take?: number; - * startDate?: string; - * endDate?: string; - * }} { - * skip, - * take = 100, - * startDate, - * endDate, - * } - * @return {*} - * @memberof UmbLogMessagesServerDataSource - */ - async getLogViewerMessageTemplate({ - skip, - take = 100, - startDate, - endDate, - }: { - skip?: number; - take?: number; - startDate?: string; - endDate?: string; - }) { - return await tryExecuteAndNotify( - this.#host, - LogViewerResource.getLogViewerMessageTemplate({ - skip, - take, - startDate, - endDate, - }) - ); - } - - async getLogViewerValidateLogsSize({ startDate, endDate }: { startDate?: string; endDate?: string }) { - return await tryExecuteAndNotify( - this.#host, - LogViewerResource.getLogViewerValidateLogsSize({ - startDate, - endDate, - }) - ); - } + constructor(host: UmbControllerHostElement) { + this.#host = host; } + + /** + * Grabs all the loggers from the server + * + * @param {{ skip?: number; take?: number }} { skip = 0, take = 100 } + * @return {*} + * @memberof UmbLogMessagesServerDataSource + */ + async getLogViewerLevel({ skip = 0, take = 100 }: { skip?: number; take?: number }) { + return await tryExecuteAndNotify(this.#host, LogViewerResource.getLogViewerLevel({ skip, take })); + } + + /** + * Grabs all the number of different log messages from the server + * + * @param {{ skip?: number; take?: number }} { skip = 0, take = 100 } + * @return {*} + * @memberof UmbLogMessagesServerDataSource + */ + async getLogViewerLevelCount({ startDate, endDate }: { startDate?: string; endDate?: string }) { + return await tryExecuteAndNotify( + this.#host, + LogViewerResource.getLogViewerLevelCount({ + startDate, + endDate, + }) + ); + } + /** + * Grabs all the log messages from the server + * + * @param {{ + * skip?: number; + * take?: number; + * orderDirection?: DirectionModel; + * filterExpression?: string; + * logLevel?: Array; + * startDate?: string; + * endDate?: string; + * }} { + * skip = 0, + * take = 100, + * orderDirection, + * filterExpression, + * logLevel, + * startDate, + * endDate, + * } + * @return {*} + * @memberof UmbLogMessagesServerDataSource + */ + async getLogViewerLogs({ + skip = 0, + take = 100, + orderDirection, + filterExpression, + logLevel, + startDate, + endDate, + }: { + skip?: number; + take?: number; + orderDirection?: DirectionModel; + filterExpression?: string; + logLevel?: Array; + startDate?: string; + endDate?: string; + }) { + return await tryExecuteAndNotify( + this.#host, + LogViewerResource.getLogViewerLog({ + skip, + take, + orderDirection, + filterExpression, + logLevel, + startDate, + endDate, + }) + ); + } + /** + * Grabs all the log message templates from the server + * + * @param {{ + * skip?: number; + * take?: number; + * startDate?: string; + * endDate?: string; + * }} { + * skip, + * take = 100, + * startDate, + * endDate, + * } + * @return {*} + * @memberof UmbLogMessagesServerDataSource + */ + async getLogViewerMessageTemplate({ + skip, + take = 100, + startDate, + endDate, + }: { + skip?: number; + take?: number; + startDate?: string; + endDate?: string; + }) { + return await tryExecuteAndNotify( + this.#host, + LogViewerResource.getLogViewerMessageTemplate({ + skip, + take, + startDate, + endDate, + }) + ); + } + + async getLogViewerValidateLogsSize({ startDate, endDate }: { startDate?: string; endDate?: string }) { + return await tryExecuteAndNotify( + this.#host, + LogViewerResource.getLogViewerValidateLogsSize({ + startDate, + endDate, + }) + ); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts index c03196a421..22a4eeaeeb 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts @@ -1,5 +1,12 @@ import { UmbLogViewerRepository } from '../repository/log-viewer.repository'; -import { ArrayState, createObservablePart, DeepState, ObjectState, StringState } from '@umbraco-cms/backoffice/observable-api'; +import { + BasicState, + ArrayState, + createObservablePart, + DeepState, + ObjectState, + StringState, +} from '@umbraco-cms/backoffice/observable-api'; import { DirectionModel, LogLevelCountsReponseModel, @@ -9,9 +16,8 @@ import { PagedLogTemplateResponseModel, PagedSavedLogSearchResponseModel, } from '@umbraco-cms/backoffice/backend-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import { BasicState } from 'libs/observable-api/basic-state'; export type PoolingInterval = 0 | 2000 | 5000 | 10000 | 20000 | 30000; export interface PoolingCOnfig { @@ -24,7 +30,7 @@ export interface LogViewerDateRange { } export class UmbLogViewerWorkspaceContext { - #host: UmbControllerHostInterface; + #host: UmbControllerHostElement; #repository: UmbLogViewerRepository; get today() { @@ -88,7 +94,7 @@ export class UmbLogViewerWorkspaceContext { currentPage = 1; - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { this.#host = host; this.#repository = new UmbLogViewerRepository(this.#host); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/manifests.ts index fbbf4e87bb..7859009b6f 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/manifests.ts @@ -1,8 +1,7 @@ import { UmbRelationTypeRepository } from '../repository/relation-type.repository'; import { UmbRelationTypeStore } from './relation-type.store'; import { UmbRelationTypeTreeStore } from './relation-type.tree.store'; -import { ManifestRepository } from 'libs/extensions-registry/repository.models'; -import { ManifestStore, ManifestTreeStore } from '@umbraco-cms/backoffice/extensions-registry'; +import { ManifestStore, ManifestTreeStore, ManifestRepository } from '@umbraco-cms/backoffice/extensions-registry'; export const RELATION_TYPE_REPOSITORY_ALIAS = 'Umb.Repository.RelationType'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/relation-type.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/relation-type.repository.ts index 2c277ac890..f56abe82ee 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/relation-type.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/relation-type.repository.ts @@ -3,11 +3,10 @@ import { UmbRelationTypeServerDataSource } from './sources/relation-type.server. import { UmbRelationTypeStore, UMB_RELATION_TYPE_STORE_CONTEXT_TOKEN } from './relation-type.store'; import { RelationTypeTreeServerDataSource } from './sources/relation-type.tree.server.data'; import { RelationTypeTreeDataSource } from './sources'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; import { ProblemDetailsModel, RelationTypeResponseModel } from '@umbraco-cms/backoffice/backend-api'; -import type { UmbTreeRepository } from 'libs/repository/tree-repository.interface'; -import { UmbDetailRepository } from '@umbraco-cms/backoffice/repository'; +import { UmbDetailRepository, UmbTreeRepository } from '@umbraco-cms/backoffice/repository'; import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; type ItemType = RelationTypeResponseModel; @@ -20,7 +19,7 @@ type TreeItemType = any; export class UmbRelationTypeRepository implements UmbTreeRepository, UmbDetailRepository { #init!: Promise; - #host: UmbControllerHostInterface; + #host: UmbControllerHostElement; #treeSource: RelationTypeTreeDataSource; #treeStore?: UmbRelationTypeTreeStore; @@ -30,7 +29,7 @@ export class UmbRelationTypeRepository implements UmbTreeRepository('UmbRelationTypeStore'); @@ -17,10 +17,10 @@ export class UmbRelationTypeStore extends UmbStoreBase { /** * Creates an instance of UmbRelationTypeStore. - * @param {UmbControllerHostInterface} host + * @param {UmbControllerHostElement} host * @memberof UmbRelationTypeStore */ - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { super(host, UMB_RELATION_TYPE_STORE_CONTEXT_TOKEN.toString()); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/relation-type.tree.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/relation-type.tree.store.ts index b66af29604..a8d057765a 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/relation-type.tree.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/relation-type.tree.store.ts @@ -1,5 +1,5 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/store'; /** @@ -12,10 +12,10 @@ import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/store'; export class UmbRelationTypeTreeStore extends UmbEntityTreeStore { /** * Creates an instance of UmbRelationTypeTreeStore. - * @param {UmbControllerHostInterface} host + * @param {UmbControllerHostElement} host * @memberof UmbRelationTypeTreeStore */ - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { super(host, UMB_RELATION_TYPE_TREE_STORE_CONTEXT_TOKEN.toString()); } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/sources/relation-type.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/sources/relation-type.server.data.ts index b16a93ebc8..0316506c4c 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/sources/relation-type.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/sources/relation-type.server.data.ts @@ -6,7 +6,7 @@ import { CreateRelationTypeRequestModel, UpdateRelationTypeRequestModel, } from '@umbraco-cms/backoffice/backend-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; /** @@ -16,14 +16,14 @@ import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; * @implements {RepositoryDetailDataSource} */ export class UmbRelationTypeServerDataSource implements UmbDataSource { - #host: UmbControllerHostInterface; + #host: UmbControllerHostElement; /** * Creates an instance of UmbRelationTypeServerDataSource. - * @param {UmbControllerHostInterface} host + * @param {UmbControllerHostElement} host * @memberof UmbRelationTypeServerDataSource */ - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { this.#host = host; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/sources/relation-type.tree.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/sources/relation-type.tree.server.data.ts index beb081494b..75a1243816 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/sources/relation-type.tree.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/sources/relation-type.tree.server.data.ts @@ -1,6 +1,6 @@ import { RelationTypeTreeDataSource } from '.'; import { ProblemDetailsModel, RelationTypeResource } from '@umbraco-cms/backoffice/backend-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -11,7 +11,7 @@ import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; * @implements {RelationTypeTreeDataSource} */ export class RelationTypeTreeServerDataSource implements RelationTypeTreeDataSource { - #host: UmbControllerHostInterface; + #host: UmbControllerHostElement; // TODO: how do we handle trashed items? async trashItems(keys: Array) { @@ -48,10 +48,10 @@ export class RelationTypeTreeServerDataSource implements RelationTypeTreeDataSou /** * Creates an instance of RelationTypeTreeServerDataSource. - * @param {UmbControllerHostInterface} host + * @param {UmbControllerHostElement} host * @memberof RelationTypeTreeServerDataSource */ - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { this.#host = host; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/workspace/relation-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/workspace/relation-type-workspace.context.ts index 2ec2e3383c..f4bbb86c8f 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/workspace/relation-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/workspace/relation-type-workspace.context.ts @@ -4,7 +4,7 @@ import { UmbEntityWorkspaceContextInterface } from '../../../shared/components/w import type { RelationTypeBaseModel, RelationTypeResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { ObjectState } from '@umbraco-cms/backoffice/observable-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; export class UmbRelationTypeWorkspaceContext extends UmbWorkspaceContext @@ -15,7 +15,7 @@ export class UmbRelationTypeWorkspaceContext name = this.#data.getObservablePart((data) => data?.name); key = this.#data.getObservablePart((data) => data?.key); - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { super(host, new UmbRelationTypeRepository(host)); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/collection/collection.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/collection/collection.context.ts index 3979c74ad9..c5f0c4baf5 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/collection/collection.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/collection/collection.context.ts @@ -1,15 +1,14 @@ import { Observable } from 'rxjs'; import type { EntityTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; -import type { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbContextToken, UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; import { ArrayState, UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; -import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extensions-api'; -import { createExtensionClass } from 'libs/extensions-api/create-extension-class.function'; +import { umbExtensionsRegistry, createExtensionClass } from '@umbraco-cms/backoffice/extensions-api'; import { UmbTreeRepository } from '@umbraco-cms/backoffice/repository'; // TODO: Clean up the need for store as Media has switched to use Repositories(repository). export class UmbCollectionContext { - private _host: UmbControllerHostInterface; + private _host: UmbControllerHostElement; private _entityType: string | null; private _entityKey: string | null; @@ -31,7 +30,7 @@ export class UmbCollectionContext = { +const meta: Meta = { title: 'Components/Workspace Layout', component: 'umb-body-layout', }; export default meta; -type Story = StoryObj; +type Story = StoryObj; export const Overview: Story = { render: () => html` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/code-block/code-block.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/code-block/code-block.element.ts index 074fa1a193..99833cbcce 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/code-block/code-block.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/code-block/code-block.element.ts @@ -8,7 +8,7 @@ import { customElement } from 'lit/decorators.js'; * */ @customElement('uui-code-block') -export class UUICodeBlock extends LitElement { +export class UUICodeBlockElement extends LitElement { static styles = [ UUITextStyles, css` @@ -54,6 +54,6 @@ export class UUICodeBlock extends LitElement { declare global { interface HTMLElementTagNameMap { - 'uui-code-block': UUICodeBlock; + 'uui-code-block': UUICodeBlockElement; } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/code-block/code-block.stories.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/code-block/code-block.stories.ts index 4955d7cc10..f3f2d6ca24 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/code-block/code-block.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/code-block/code-block.stories.ts @@ -1,15 +1,15 @@ import { Meta, StoryObj } from '@storybook/web-components'; import { html } from 'lit'; import './code-block.element'; -import type { UUICodeBlock } from './code-block.element'; +import type { UUICodeBlockElement } from './code-block.element'; -const meta: Meta = { +const meta: Meta = { title: 'Components/Code Block', component: 'uui-code-block', }; export default meta; -type Story = StoryObj; +type Story = StoryObj; export const Overview: Story = { args: {}, diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/code-editor/code-editor.stories.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/code-editor/code-editor.stories.ts index bfa042e01b..7a5acdfa3f 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/code-editor/code-editor.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/code-editor/code-editor.stories.ts @@ -113,7 +113,7 @@ const codeSnippets: Record = { import { UmbWorkspaceContext } from '../../../shared/components/workspace/workspace-context/workspace-context'; import { createObservablePart, DeepState } from '@umbraco-cms/observable-api'; import { TemplateModel } from '@umbraco-cms/backend-api'; - import { UmbControllerHostInterface } from '@umbraco-cms/controller'; + import { UmbControllerHostElement } from '@umbraco-cms/controller'; export class UmbTemplateWorkspaceContext extends UmbWorkspaceContext { #data = new DeepState(undefined); @@ -121,7 +121,7 @@ const codeSnippets: Record = { name = createObservablePart(this.#data, (data) => data?.name); content = createObservablePart(this.#data, (data) => data?.content); - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { super(host, new UmbTemplateRepository(host)); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.element.ts index 128dbb33bb..ecf3493b52 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.element.ts @@ -1,13 +1,13 @@ import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { css, html, nothing, TemplateResult } from 'lit'; import { customElement, property, state } from 'lit/decorators.js'; -import { UMB_CONTEXT_DEBUGGER_MODAL_TOKEN } from './modals/debug'; + import { UmbContextDebugRequest } from '@umbraco-cms/backoffice/context-api'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; +import { UmbModalContext, UMB_CONTEXT_DEBUGGER_MODAL, UMB_MODAL_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; @customElement('umb-debug') -export class UmbDebug extends UmbLitElement { +export class UmbDebugElement extends UmbLitElement { static styles = [ UUITextStyles, css` @@ -107,7 +107,7 @@ export class UmbDebug extends UmbLitElement { } private _openDialog() { - this._modalContext?.open(UMB_CONTEXT_DEBUGGER_MODAL_TOKEN, { + this._modalContext?.open(UMB_CONTEXT_DEBUGGER_MODAL, { content: html`${this._renderContextAliases()}`, }); } @@ -226,6 +226,6 @@ export class UmbDebug extends UmbLitElement { declare global { interface HTMLElementTagNameMap { - 'umb-debug': UmbDebug; + 'umb-debug': UmbDebugElement; } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/modals/debug/debug-modal.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/modals/debug/debug-modal.element.ts index ba14f65b7a..74e5ade59c 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/modals/debug/debug-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/modals/debug/debug-modal.element.ts @@ -1,7 +1,7 @@ import { css, html } from 'lit'; import { customElement } from 'lit/decorators.js'; import { UUITextStyles } from '@umbraco-ui/uui-css'; -import { UmbContextDebuggerModalData } from '.'; +import { UmbContextDebuggerModalData } from '@umbraco-cms/backoffice/modal'; import { UmbModalBaseElement } from '@umbraco-cms/internal/modal'; @customElement('umb-context-debugger-modal') diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/entity-action/entity-action-list.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/entity-action/entity-action-list.element.ts index a3edc8b9f8..3ea2640821 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/entity-action/entity-action-list.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/entity-action/entity-action-list.element.ts @@ -1,9 +1,9 @@ import { html } from 'lit'; import { customElement, property, state } from 'lit/decorators.js'; import { map } from 'rxjs'; +import { ManifestEntityAction } from '@umbraco-cms/backoffice/extensions-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extensions-api'; -import { ManifestEntityAction } from 'libs/extensions-registry/entity-action.models'; @customElement('umb-entity-action-list') class UmbEntityActionListElement extends UmbLitElement { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/footer-layout/footer-layout.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/footer-layout/footer-layout.element.ts index 565142fdeb..fc7cadf0f8 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/footer-layout/footer-layout.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/footer-layout/footer-layout.element.ts @@ -12,7 +12,7 @@ import { customElement, state } from 'lit/decorators.js'; * @extends {UmbLitElement} */ @customElement('umb-footer-layout') -export class UmbFooterLayout extends LitElement { +export class UmbFooterLayoutElement extends LitElement { static styles = [ UUITextStyles, css` @@ -46,6 +46,6 @@ export class UmbFooterLayout extends LitElement { declare global { interface HTMLElementTagNameMap { - 'umb-footer-layout': UmbFooterLayout; + 'umb-footer-layout': UmbFooterLayoutElement; } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/footer-layout/footer-layout.stories.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/footer-layout/footer-layout.stories.ts index bf10d72e8b..c09a6d7fca 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/footer-layout/footer-layout.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/footer-layout/footer-layout.stories.ts @@ -3,7 +3,7 @@ import './footer-layout.element'; import { Meta, Story } from '@storybook/web-components'; import { html } from 'lit'; -import type { UmbFooterLayout } from './footer-layout.element'; +import type { UmbFooterLayoutElement } from './footer-layout.element'; export default { title: 'Workspaces/Shared/Footer Layout', @@ -11,7 +11,7 @@ export default { id: 'umb-footer-layout', } as Meta; -export const AAAOverview: Story = () => html` +export const AAAOverview: Story = () => html`
Footer slotActions slot diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/header-app/header-app-button.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/header-app/header-app-button.element.ts index 36dc14343d..536bbb0424 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/header-app/header-app-button.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/header-app/header-app-button.element.ts @@ -19,7 +19,7 @@ const manifest: ManifestKind = { umbExtensionsRegistry.register(manifest); @customElement('umb-header-app-button') -export class UmbHeaderAppButton extends LitElement { +export class UmbHeaderAppButtonElement extends LitElement { static styles: CSSResultGroup = [ UUITextStyles, css` @@ -45,10 +45,10 @@ export class UmbHeaderAppButton extends LitElement { } } -export default UmbHeaderAppButton; +export default UmbHeaderAppButtonElement; declare global { interface HTMLElementTagNameMap { - 'umb-header-app-button': UmbHeaderAppButton; + 'umb-header-app-button': UmbHeaderAppButtonElement; } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/header-app/header-app.stories.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/header-app/header-app.stories.ts index 105cdddf02..d9a4cab61c 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/header-app/header-app.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/header-app/header-app.stories.ts @@ -1,14 +1,14 @@ import { Meta, StoryObj } from '@storybook/web-components'; import './header-app-button.element'; -import type { UmbHeaderAppButton } from './header-app-button.element'; +import type { UmbHeaderAppButtonElement } from './header-app-button.element'; -const meta: Meta = { +const meta: Meta = { title: 'Components/Header App Button', component: 'umb-header-app-button', }; export default meta; -type Story = StoryObj; +type Story = StoryObj; export const Overview: Story = { args: { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-document-picker/input-document-picker.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-document-picker/input-document-picker.element.ts index 7b3d2bdea9..cf5bd39230 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-document-picker/input-document-picker.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-document-picker/input-document-picker.element.ts @@ -5,9 +5,12 @@ import { ifDefined } from 'lit/directives/if-defined.js'; import { FormControlMixin } from '@umbraco-ui/uui-base/lib/mixins'; import { UMB_DOCUMENT_TREE_STORE_CONTEXT_TOKEN } from '../../../documents/documents/repository/document.tree.store'; import type { UmbDocumentTreeStore } from '../../../documents/documents/repository/document.tree.store'; -import { UMB_CONFIRM_MODAL_TOKEN } from '../../modals/confirm'; -import { UMB_DOCUMENT_PICKER_MODAL_TOKEN } from '../../../documents/documents/modals/document-picker'; -import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; +import { + UmbModalContext, + UMB_MODAL_CONTEXT_TOKEN, + UMB_CONFIRM_MODAL, + UMB_DOCUMENT_PICKER_MODAL, +} from '@umbraco-cms/backoffice/modal'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import type { DocumentTreeItemResponseModel, EntityTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; import type { UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; @@ -123,7 +126,7 @@ export class UmbInputDocumentPickerElement extends FormControlMixin(UmbLitElemen private _openPicker() { // We send a shallow copy(good enough as its just an array of keys) of our this._selectedKeys, as we don't want the modal to manipulate our data: - const modalHandler = this._modalContext?.open(UMB_DOCUMENT_PICKER_MODAL_TOKEN, { + const modalHandler = this._modalContext?.open(UMB_DOCUMENT_PICKER_MODAL, { multiple: this.max === 1 ? false : true, selection: [...this._selectedKeys], }); @@ -134,7 +137,7 @@ export class UmbInputDocumentPickerElement extends FormControlMixin(UmbLitElemen } private async _removeItem(item: EntityTreeItemResponseModel) { - const modalHandler = this._modalContext?.open(UMB_CONFIRM_MODAL_TOKEN, { + const modalHandler = this._modalContext?.open(UMB_CONFIRM_MODAL, { color: 'danger', headline: `Remove ${item.name}?`, content: 'Are you sure you want to remove this item', diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-document-type-picker/input-document-type-picker.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-document-type-picker/input-document-type-picker.element.ts index b30071bad0..413a9f9e49 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-document-type-picker/input-document-type-picker.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-document-type-picker/input-document-type-picker.element.ts @@ -7,11 +7,10 @@ import { UmbDocumentTypeTreeStore, UMB_DOCUMENT_TYPE_TREE_STORE_CONTEXT_TOKEN, } from '../../../documents/document-types/repository/document-type.tree.store'; -import { UMB_CONFIRM_MODAL_TOKEN } from '../../modals/confirm'; import { UMB_DOCUMENT_TYPE_PICKER_MODAL_TOKEN } from '../../../documents/documents/modals/document-type-picker'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { DocumentTypeResponseModel, EntityTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; -import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; +import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN, UMB_CONFIRM_MODAL } from '@umbraco-cms/backoffice/modal'; import { UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; @customElement('umb-input-document-type-picker') @@ -100,7 +99,7 @@ export class UmbInputDocumentTypePickerElement extends FormControlMixin(UmbLitEl } private async _removeItem(item: DocumentTypeResponseModel) { - const modalHandler = this._modalContext?.open(UMB_CONFIRM_MODAL_TOKEN, { + const modalHandler = this._modalContext?.open(UMB_CONFIRM_MODAL, { color: 'danger', headline: `Remove ${item.name}?`, content: 'Are you sure you want to remove this item', diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-language-picker/input-language-picker.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-language-picker/input-language-picker.element.ts index cd21264afa..263d9c76f0 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-language-picker/input-language-picker.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-language-picker/input-language-picker.element.ts @@ -4,9 +4,12 @@ import { customElement, property, state } from 'lit/decorators.js'; import { ifDefined } from 'lit/directives/if-defined.js'; import { FormControlMixin } from '@umbraco-ui/uui-base/lib/mixins'; import { UmbLanguageRepository } from '../../../settings/languages/repository/language.repository'; -import { UMB_CONFIRM_MODAL_TOKEN } from '../../modals/confirm'; -import { UMB_LANGUAGE_PICKER_MODAL_TOKEN } from '../../../settings/languages/modals/language-picker'; -import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; +import { + UmbModalContext, + UMB_MODAL_CONTEXT_TOKEN, + UMB_CONFIRM_MODAL, + UMB_LANGUAGE_PICKER_MODAL, +} from '@umbraco-cms/backoffice/modal'; import { UmbChangeEvent } from '@umbraco-cms/backoffice/events'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import type { LanguageResponseModel } from '@umbraco-cms/backoffice/backend-api'; @@ -121,7 +124,7 @@ export class UmbInputLanguagePickerElement extends FormControlMixin(UmbLitElemen } private _openPicker() { - const modalHandler = this._modalContext?.open(UMB_LANGUAGE_PICKER_MODAL_TOKEN, { + const modalHandler = this._modalContext?.open(UMB_LANGUAGE_PICKER_MODAL, { multiple: this.max === 1 ? false : true, selection: [...this._selectedIsoCodes], filter: this.filter, @@ -133,7 +136,7 @@ export class UmbInputLanguagePickerElement extends FormControlMixin(UmbLitElemen } private _removeItem(item: LanguageResponseModel) { - const modalHandler = this._modalContext?.open(UMB_CONFIRM_MODAL_TOKEN, { + const modalHandler = this._modalContext?.open(UMB_CONFIRM_MODAL, { color: 'danger', headline: `Remove ${item.name}?`, content: 'Are you sure you want to remove this item', diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-list-base/input-list-base.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-list-base/input-list-base.ts index f6a2e05cb1..37e134229b 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-list-base/input-list-base.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-list-base/input-list-base.ts @@ -11,7 +11,7 @@ import { import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; /** TODO: Make use of UUI FORM Mixin, to make it easily take part of a form. */ -export class UmbInputListBase extends UmbLitElement { +export class UmbInputListBaseElement extends UmbLitElement { @property({ type: Array }) public value: Array = []; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-media-picker/input-media-picker.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-media-picker/input-media-picker.element.ts index d497dda6df..626bfd9def 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-media-picker/input-media-picker.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-media-picker/input-media-picker.element.ts @@ -4,9 +4,12 @@ import { customElement, property, state } from 'lit/decorators.js'; import { ifDefined } from 'lit/directives/if-defined.js'; import { FormControlMixin } from '@umbraco-ui/uui-base/lib/mixins'; import { UmbMediaRepository } from '../../../media/media/repository/media.repository'; -import { UMB_CONFIRM_MODAL_TOKEN } from '../../modals/confirm'; -import { UMB_MEDIA_PICKER_MODAL_TOKEN } from '../../../media/media/modals/media-picker'; -import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; +import { + UmbModalContext, + UMB_MODAL_CONTEXT_TOKEN, + UMB_CONFIRM_MODAL, + UMB_MEDIA_PICKER_MODAL, +} from '@umbraco-cms/backoffice/modal'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import type { EntityTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; import type { UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; @@ -137,7 +140,7 @@ export class UmbInputMediaPickerElement extends FormControlMixin(UmbLitElement) private _openPicker() { // We send a shallow copy(good enough as its just an array of keys) of our this._selectedKeys, as we don't want the modal to manipulate our data: - const modalHandler = this._modalContext?.open(UMB_MEDIA_PICKER_MODAL_TOKEN, { + const modalHandler = this._modalContext?.open(UMB_MEDIA_PICKER_MODAL, { multiple: this.max === 1 ? false : true, selection: [...this._selectedKeys], }); @@ -148,7 +151,7 @@ export class UmbInputMediaPickerElement extends FormControlMixin(UmbLitElement) } private _removeItem(item: EntityTreeItemResponseModel) { - const modalHandler = this._modalContext?.open(UMB_CONFIRM_MODAL_TOKEN, { + const modalHandler = this._modalContext?.open(UMB_CONFIRM_MODAL, { color: 'danger', headline: `Remove ${item.name}?`, content: 'Are you sure you want to remove this item', diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-multi-url-picker/input-multi-url-picker.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-multi-url-picker/input-multi-url-picker.element.ts index 83882a79e2..514effc3f9 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-multi-url-picker/input-multi-url-picker.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-multi-url-picker/input-multi-url-picker.element.ts @@ -1,11 +1,16 @@ import { css, html } from 'lit'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; -import { customElement, property } from 'lit/decorators.js'; +import { customElement, property, state } from 'lit/decorators.js'; import { FormControlMixin } from '@umbraco-ui/uui-base/lib/mixins'; import type { UUIModalSidebarSize } from '@umbraco-ui/uui'; -import { UmbLinkPickerLink, UMB_LINK_PICKER_MODAL_TOKEN } from '../../modals/link-picker'; +import type { UmbVariantId } from '../../variants/variant-id.class'; +import { + UmbLinkPickerLink, + UMB_LINK_PICKER_MODAL, + UmbModalRouteRegistrationController, +} from '@umbraco-cms/backoffice/modal'; +import type { UmbModalRouteBuilder } from '@umbraco-cms/backoffice/modal'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; /** * @element umb-input-multi-url-picker @@ -27,6 +32,17 @@ export class UmbInputMultiUrlPickerElement extends FormControlMixin(UmbLitElemen protected getFormElement() { return undefined; } + + @property() + public set alias(value: string | undefined) { + this.myModalRegistration.setUniqueIdentifier('propertyAlias', value); + } + + @property() + public set variantId(value: string | UmbVariantId | undefined) { + this.myModalRegistration.setUniqueIdentifier('variantId', value?.toString()); + } + /** * This is a minimum amount of selected items in this input. * @type {number} @@ -87,7 +103,7 @@ export class UmbInputMultiUrlPickerElement extends FormControlMixin(UmbLitElemen @property({ attribute: false }) set urls(data: Array) { if (!data) return; - this._urls = data; + this._urls = [...data]; // Unfreeze data coming from State, so we can manipulate it. super.value = this._urls.map((x) => x.url).join(','); } @@ -96,7 +112,11 @@ export class UmbInputMultiUrlPickerElement extends FormControlMixin(UmbLitElemen } private _urls: Array = []; - private _modalContext?: UmbModalContext; + + @state() + private _modalRoute?: UmbModalRouteBuilder; + + private myModalRegistration; constructor() { super(); @@ -111,9 +131,56 @@ export class UmbInputMultiUrlPickerElement extends FormControlMixin(UmbLitElemen () => !!this.max && this.urls.length > this.max ); - this.consumeContext(UMB_MODAL_CONTEXT_TOKEN, (instance) => { - this._modalContext = instance; - }); + this.myModalRegistration = new UmbModalRouteRegistrationController( + this, + UMB_LINK_PICKER_MODAL, + `:index`, + new Map([ + ['propertyAlias', undefined], + ['variantId', undefined], + ]) + ) + .onSetup((params) => { + // Get index: + const indexParam = params.index; + if (!indexParam) return false; + let index: number | null = parseInt(params.index); + if (Number.isNaN(index)) return false; + + // Use the index to find data: + let data: UmbLinkPickerLink | null = null; + if (index >= 0 && index < this.urls.length) { + data = this._getItemByIndex(index); + } else { + // If not then make a new pick: + index = null; + } + + return { + index: index, + link: { + name: data?.name, + published: data?.published, + queryString: data?.queryString, + target: data?.target, + trashed: data?.trashed, + udi: data?.udi, + url: data?.url, + }, + config: { + hideAnchor: this.hideAnchor, + ignoreUserStartNodes: this.ignoreUserStartNodes, + overlaySize: this.overlaySize || 'small', + }, + }; + }) + .onSubmit((submitData) => { + if (!submitData) return; + this._setSelection(submitData.link, submitData.index); + }) + .observeRouteBuilder((routeBuilder) => { + this._modalRoute = routeBuilder; + }); } private _removeItem(index: number) { @@ -121,9 +188,16 @@ export class UmbInputMultiUrlPickerElement extends FormControlMixin(UmbLitElemen this._dispatchChangeEvent(); } - private _setSelection(selection: UmbLinkPickerLink, index?: number) { - if (index !== undefined && index >= 0) this.urls[index] = selection; - else this.urls.push(selection); + private _getItemByIndex(index: number) { + return this.urls[index]; + } + + private _setSelection(selection: UmbLinkPickerLink, index: number | null) { + if (index !== null && index >= 0) { + this.urls[index] = selection; + } else { + this.urls.push(selection); + } this._dispatchChangeEvent(); } @@ -133,43 +207,24 @@ export class UmbInputMultiUrlPickerElement extends FormControlMixin(UmbLitElemen this.dispatchEvent(new CustomEvent('change', { composed: true, bubbles: true })); } - private _openPicker(data?: UmbLinkPickerLink, index?: number) { - const modalHandler = this._modalContext?.open(UMB_LINK_PICKER_MODAL_TOKEN, { - link: { - name: data?.name, - published: data?.published, - queryString: data?.queryString, - target: data?.target, - trashed: data?.trashed, - udi: data?.udi, - url: data?.url, - }, - config: { - hideAnchor: this.hideAnchor, - ignoreUserStartNodes: this.ignoreUserStartNodes, - overlaySize: this.overlaySize || 'small', - }, - }); - modalHandler?.onSubmit().then((newUrl: UmbLinkPickerLink) => { - if (!newUrl) return; - - this._setSelection(newUrl, index); - }); + // TODO: We should get a href property on uui-ref-node, and not use this method: + private _temporary_onClick_editItem(index: number) { + this.myModalRegistration.open({ index }); } render() { return html`${this.urls?.map((link, index) => this._renderItem(link, index))} - Add`; + Add`; } private _renderItem(link: UmbLinkPickerLink, index: number) { return html` + @open="${() => this._temporary_onClick_editItem(index)}"> - Edit + Edit Remove `; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-section/input-section.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-section/input-section.element.ts index 34799eeeff..0a81f98e77 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-section/input-section.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-section/input-section.element.ts @@ -1,13 +1,13 @@ import { UUITextStyles } from '@umbraco-ui/uui-css'; import { css, html, nothing } from 'lit'; import { customElement, state } from 'lit/decorators.js'; -import { UmbInputListBase } from '../input-list-base/input-list-base'; -import { UMB_SECTION_PICKER_MODAL_TOKEN } from '../../modals/section-picker'; +import { UmbInputListBaseElement } from '../input-list-base/input-list-base'; +import { UMB_SECTION_PICKER_MODAL } from '@umbraco-cms/backoffice/modal'; import type { ManifestSection } from '@umbraco-cms/backoffice/extensions-registry'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extensions-api'; @customElement('umb-input-section') -export class UmbInputPickerSectionElement extends UmbInputListBase { +export class UmbInputPickerSectionElement extends UmbInputListBaseElement { static styles = [ UUITextStyles, css` @@ -42,7 +42,7 @@ export class UmbInputPickerSectionElement extends UmbInputListBase { connectedCallback(): void { super.connectedCallback(); - this.pickerToken = UMB_SECTION_PICKER_MODAL_TOKEN; + this.pickerToken = UMB_SECTION_PICKER_MODAL; this._observeSections(); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-user-group/input-user-group.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-user-group/input-user-group.element.ts index d27245d136..ad3a644846 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-user-group/input-user-group.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-user-group/input-user-group.element.ts @@ -1,17 +1,17 @@ import { UUITextStyles } from '@umbraco-ui/uui-css'; import { css, html, nothing } from 'lit'; import { customElement, state } from 'lit/decorators.js'; -import { UmbInputListBase } from '../input-list-base/input-list-base'; +import { UmbInputListBaseElement } from '../input-list-base/input-list-base'; import { UmbUserGroupStore, UMB_USER_GROUP_STORE_CONTEXT_TOKEN, } from '../../../users/user-groups/repository/user-group.store'; -import { UMB_USER_GROUP_PICKER_MODAL_TOKEN } from '../../../users/user-groups/modals/user-group-picker'; +import { UMB_USER_GROUP_PICKER_MODAL } from '@umbraco-cms/backoffice/modal'; import type { UserGroupEntity } from '@umbraco-cms/backoffice/models'; @customElement('umb-input-user-group') -export class UmbInputPickerUserGroupElement extends UmbInputListBase { +export class UmbInputPickerUserGroupElement extends UmbInputListBaseElement { static styles = [ UUITextStyles, css` @@ -48,7 +48,7 @@ export class UmbInputPickerUserGroupElement extends UmbInputListBase { connectedCallback(): void { super.connectedCallback(); - this.pickerToken = UMB_USER_GROUP_PICKER_MODAL_TOKEN; + this.pickerToken = UMB_USER_GROUP_PICKER_MODAL; this.consumeContext(UMB_USER_GROUP_STORE_CONTEXT_TOKEN, (usersContext) => { this._userGroupStore = usersContext; this._observeUserGroups(); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-user/input-user.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-user/input-user.element.ts index 87fd8c3b19..636696bfed 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-user/input-user.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-user/input-user.element.ts @@ -1,13 +1,13 @@ import { UUITextStyles } from '@umbraco-ui/uui-css'; import { css, html, nothing, PropertyValueMap } from 'lit'; import { customElement, state } from 'lit/decorators.js'; -import { UmbInputListBase } from '../input-list-base/input-list-base'; +import { UmbInputListBaseElement } from '../input-list-base/input-list-base'; import { UmbUserStore, UMB_USER_STORE_CONTEXT_TOKEN } from '../../../users/users/repository/user.store'; -import { UMB_USER_PICKER_MODAL_TOKEN } from '../../../users/users/modals/user-picker'; +import { UMB_USER_PICKER_MODAL } from '@umbraco-cms/backoffice/modal'; import type { UserEntity } from '@umbraco-cms/backoffice/models'; @customElement('umb-input-user') -export class UmbPickerUserElement extends UmbInputListBase { +export class UmbPickerUserElement extends UmbInputListBaseElement { static styles = [ UUITextStyles, css` @@ -39,7 +39,7 @@ export class UmbPickerUserElement extends UmbInputListBase { connectedCallback(): void { super.connectedCallback(); - this.pickerToken = UMB_USER_PICKER_MODAL_TOKEN; + this.pickerToken = UMB_USER_PICKER_MODAL; this.consumeContext(UMB_USER_STORE_CONTEXT_TOKEN, (userStore) => { this._userStore = userStore; this._observeUser(); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/menu-item/menu-item.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/menu-item/menu-item.element.ts index 73203fe3f8..caf7c4d39b 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/menu-item/menu-item.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/menu-item/menu-item.element.ts @@ -7,7 +7,7 @@ import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import type { ManifestMenuItem } from '@umbraco-cms/backoffice/extensions-registry'; @customElement('umb-menu-item') -export class UmbMenuItem extends UmbLitElement { +export class UmbMenuItemElement extends UmbLitElement { static styles = [UUITextStyles, css``]; @property({ type: Object, attribute: false }) @@ -50,6 +50,6 @@ export class UmbMenuItem extends UmbLitElement { declare global { interface HTMLElementTagNameMap { - 'umb-menu-item': UmbMenuItem; + 'umb-menu-item': UmbMenuItemElement; } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/section/section-sidebar-context-menu/section-sidebar-context-menu.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/section/section-sidebar-context-menu/section-sidebar-context-menu.element.ts index bae231e7cc..0da6e7825a 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/section/section-sidebar-context-menu/section-sidebar-context-menu.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/section/section-sidebar-context-menu/section-sidebar-context-menu.element.ts @@ -9,7 +9,7 @@ import { import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-section-sidebar-context-menu') -export class UmbSectionSidebarContextMenu extends UmbLitElement { +export class UmbSectionSidebarContextMenuElement extends UmbLitElement { static styles = [ UUITextStyles, css` @@ -120,6 +120,6 @@ export class UmbSectionSidebarContextMenu extends UmbLitElement { declare global { interface HTMLElementTagNameMap { - 'umb-section-sidebar-context-menu': UmbSectionSidebarContextMenu; + 'umb-section-sidebar-context-menu': UmbSectionSidebarContextMenuElement; } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/section/section-sidebar/section-sidebar.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/section/section-sidebar/section-sidebar.context.ts index 4ef7539100..ccede9a33e 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/section/section-sidebar/section-sidebar.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/section/section-sidebar/section-sidebar.context.ts @@ -1,11 +1,10 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; -import { StringState } from '@umbraco-cms/backoffice/observable-api'; -import { BasicState } from 'libs/observable-api/basic-state'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; +import { StringState, BooleanState } from '@umbraco-cms/backoffice/observable-api'; export class UmbSectionSidebarContext { - #host: UmbControllerHostInterface; - #contextMenuIsOpen = new BasicState(false); + #host: UmbControllerHostElement; + #contextMenuIsOpen = new BooleanState(false); contextMenuIsOpen = this.#contextMenuIsOpen.asObservable(); #entityType = new StringState(undefined); @@ -17,7 +16,7 @@ export class UmbSectionSidebarContext { #headline = new StringState(undefined); headline = this.#headline.asObservable(); - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { this.#host = host; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/context-menu/tree-context-menu-page.service.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/context-menu/tree-context-menu-page.service.ts index 2be951ebe5..d82eb782bf 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/context-menu/tree-context-menu-page.service.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/context-menu/tree-context-menu-page.service.ts @@ -7,7 +7,7 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; // TODO: Refactor this, its not a service and the data should be handled by a context api. @customElement('umb-tree-context-menu-page-service') -export class UmbTreeContextMenuPageService extends UmbLitElement { +export class UmbTreeContextMenuPageServiceElement extends UmbLitElement { static styles = [UUITextStyles, css``]; @property({ type: Object }) @@ -64,12 +64,11 @@ export class UmbTreeContextMenuPageService extends UmbLitElement { } } -export const UMB_TREE_CONTEXT_MENU_PAGE_SERVICE_CONTEXT_TOKEN = new UmbContextToken( - 'UmbTreeContextMenuService' -); +export const UMB_TREE_CONTEXT_MENU_PAGE_SERVICE_CONTEXT_TOKEN = + new UmbContextToken('UmbTreeContextMenuService'); declare global { interface HTMLElementTagNameMap { - 'umb-tree-context-menu-page-service': UmbTreeContextMenuPageService; + 'umb-tree-context-menu-page-service': UmbTreeContextMenuPageServiceElement; } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/context-menu/tree-context-menu.service.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/context-menu/tree-context-menu.service.ts index 2be00be4f1..557c848b9e 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/context-menu/tree-context-menu.service.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/context-menu/tree-context-menu.service.ts @@ -5,7 +5,7 @@ import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; @customElement('umb-tree-context-menu-service') -export class UmbTreeContextMenuService extends UmbLitElement { +export class UmbTreeContextMenuServiceElement extends UmbLitElement { static styles = [ UUITextStyles, css` @@ -92,12 +92,12 @@ export class UmbTreeContextMenuService extends UmbLitElement { } } -export const UMB_TREE_CONTEXT_MENU_SERVICE_CONTEXT_TOKEN = new UmbContextToken( +export const UMB_TREE_CONTEXT_MENU_SERVICE_CONTEXT_TOKEN = new UmbContextToken( 'UmbTreeContextMenuService' ); declare global { interface HTMLElementTagNameMap { - 'umb-tree-context-menu-service': UmbTreeContextMenuService; + 'umb-tree-context-menu-service': UmbTreeContextMenuServiceElement; } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/entity-tree-item/entity-tree-item.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/entity-tree-item/entity-tree-item.context.ts index 2b014d81c1..6472a47207 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/entity-tree-item/entity-tree-item.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/entity-tree-item/entity-tree-item.context.ts @@ -1,10 +1,10 @@ import { UmbTreeItemContextBase } from '../tree-item-base/tree-item-base.context'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { EntityTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; // TODO get unique method from an entity repository static method export class UmbEntityTreeItemContext extends UmbTreeItemContextBase { - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { super(host, (x: EntityTreeItemResponseModel) => x.key); } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/tree-item-base/tree-item-base.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/tree-item-base/tree-item-base.context.ts index 25c3a500cb..0465630182 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/tree-item-base/tree-item-base.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/tree-item-base/tree-item-base.context.ts @@ -6,8 +6,9 @@ import { import { UmbSectionContext, UMB_SECTION_CONTEXT_TOKEN } from '../../section/section.context'; import { UmbTreeContextBase } from '../tree.context'; import { UmbTreeItemContext } from '../tree-item.context.interface'; +import { ManifestEntityAction } from '@umbraco-cms/backoffice/extensions-registry'; import { BooleanState, DeepState, StringState, UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbContextConsumerController, UmbContextProviderController, @@ -22,7 +23,7 @@ export type UmbTreeItemUniqueFunction = (x: export class UmbTreeItemContextBase implements UmbTreeItemContext { - public host: UmbControllerHostInterface; + public host: UmbControllerHostElement; public unique?: string; public type?: string; @@ -54,11 +55,11 @@ export class UmbTreeItemContextBase; + #actionObserver?: UmbObserverController; - constructor(host: UmbControllerHostInterface, getUniqueFunction: UmbTreeItemUniqueFunction) { + constructor(host: UmbControllerHostElement, getUniqueFunction: UmbTreeItemUniqueFunction) { this.host = host; this.#getUniqueFunction = getUniqueFunction; - this.#observeTreeItemActions(); this.#consumeContexts(); new UmbContextProviderController(host, UMB_TREE_ITEM_CONTEXT_TOKEN, this); } @@ -77,6 +78,7 @@ export class UmbTreeItemContextBase { @@ -9,7 +9,7 @@ interface PagedResponse { } export interface UmbTreeItemContext { - host: UmbControllerHostInterface; + host: UmbControllerHostElement; unique?: string; type?: string; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/tree-item/tree-item.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/tree-item/tree-item.element.ts index 9cecba3412..8e7efdbcd5 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/tree-item/tree-item.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/tree-item/tree-item.element.ts @@ -1,9 +1,9 @@ import { css, html, nothing } from 'lit'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { customElement, property } from 'lit/decorators.js'; +import { TreeItemPresentationModel } from '@umbraco-cms/backoffice/backend-api'; +import { ManifestTreeItem } from '@umbraco-cms/backoffice/extensions-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { TreeItemPresentationModel } from 'libs/backend-api/src'; -import { ManifestTreeItem } from 'libs/extensions-registry/tree-item.models'; @customElement('umb-tree-item') export class UmbTreeItemElement extends UmbLitElement { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/tree.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/tree.context.ts index 954cdb58ab..8f22454e4e 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/tree.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/tree.context.ts @@ -2,7 +2,7 @@ import type { Observable } from 'rxjs'; import { UmbTreeRepository } from '@umbraco-cms/backoffice/repository'; import type { ManifestTree } from '@umbraco-cms/backoffice/extensions-registry'; import { DeepState, UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; import { createExtensionClass, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extensions-api'; @@ -16,7 +16,7 @@ export interface UmbTreeContext { } export class UmbTreeContextBase implements UmbTreeContext { - host: UmbControllerHostInterface; + host: UmbControllerHostElement; public tree: ManifestTree; #selectable = new DeepState(false); @@ -34,7 +34,7 @@ export class UmbTreeContextBase implements UmbTreeContext { this.#initialized ? resolve() : (this.#initResolver = resolve); }); - constructor(host: UmbControllerHostInterface, tree: ManifestTree) { + constructor(host: UmbControllerHostElement, tree: ManifestTree) { this.host = host; this.tree = tree; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace-property/workspace-property.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace-property/workspace-property.context.ts index be4146df44..8ea9571f0e 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace-property/workspace-property.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace-property/workspace-property.context.ts @@ -2,9 +2,13 @@ import { UmbVariantId } from '../../variants/variant-id.class'; import { UmbWorkspaceVariableEntityContextInterface } from '../workspace/workspace-context/workspace-variable-entity-context.interface'; import { UMB_WORKSPACE_VARIANT_CONTEXT_TOKEN } from '../workspace/workspace-variant/workspace-variant.context'; import type { DataTypeResponseModel } from '@umbraco-cms/backoffice/backend-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; -import { ObjectState, StringState, UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; -import { UmbContextConsumerController, UmbContextProviderController } from '@umbraco-cms/backoffice/context-api'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; +import { ClassState, ObjectState, StringState, UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; +import { + UmbContextConsumerController, + UmbContextProviderController, + UmbContextToken, +} from '@umbraco-cms/backoffice/context-api'; // If we get this from the server then we can consider using TypeScripts Partial<> around the model from the Management-API. export type WorkspacePropertyData = { @@ -15,8 +19,8 @@ export type WorkspacePropertyData = { config?: DataTypeResponseModel['values']; // This could potentially then come from hardcoded JS object and not the DataType store. }; -export class UmbWorkspacePropertyContext { - #host: UmbControllerHostInterface; +export class UmbWorkspacePropertyContext { + #host: UmbControllerHostElement; private _providerController: UmbContextProviderController; @@ -28,14 +32,18 @@ export class UmbWorkspacePropertyContext { public readonly value = this._data.getObservablePart((data) => data.value); public readonly config = this._data.getObservablePart((data) => data.config); - private _variantId?: UmbVariantId; + #workspaceVariantId?: UmbVariantId; + + #variantId = new ClassState(undefined); + public readonly variantId = this.#variantId.asObservable(); private _variantDifference = new StringState(undefined); public readonly variantDifference = this._variantDifference.asObservable(); private _workspaceContext?: UmbWorkspaceVariableEntityContextInterface; + private _workspaceVariantConsumer?: UmbContextConsumerController; - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { this.#host = host; // TODO: Figure out how to get the magic string in a better way. new UmbContextConsumerController( @@ -46,7 +54,32 @@ export class UmbWorkspacePropertyContext { } ); - this._providerController = new UmbContextProviderController(host, 'umbPropertyContext', this); + this._providerController = new UmbContextProviderController(host, UMB_WORKSPACE_PROPERTY_CONTEXT_TOKEN, this); + + this.variantId.subscribe((propertyVariantId) => { + if (propertyVariantId) { + if (!this._workspaceVariantConsumer) { + this._workspaceVariantConsumer = new UmbContextConsumerController( + this.#host, + UMB_WORKSPACE_VARIANT_CONTEXT_TOKEN, + (workspaceVariantContext) => { + new UmbObserverController(this.#host, workspaceVariantContext.variantId, (workspaceVariantId) => { + this.#workspaceVariantId = workspaceVariantId; + this._generateVariantDifferenceString(); + }); + } + ); + } else { + this._generateVariantDifferenceString(); + } + } + }); + } + + private _generateVariantDifferenceString() { + this._variantDifference.next( + this.#workspaceVariantId ? this.#variantId.getValue()?.toDifferencesString(this.#workspaceVariantId) : '' + ); } public setAlias(alias: WorkspacePropertyData['alias']) { @@ -67,22 +100,17 @@ export class UmbWorkspacePropertyContext { const alias = this._data.getValue().alias; if (alias) { - this._workspaceContext?.setPropertyValue(alias, value, this._variantId); + this._workspaceContext?.setPropertyValue(alias, value, this.#variantId.getValue()); } } public setConfig(config: WorkspacePropertyData['config']) { this._data.update({ config }); } public setVariantId(variantId: UmbVariantId | undefined) { - this._variantId = variantId; - new UmbContextConsumerController(this.#host, UMB_WORKSPACE_VARIANT_CONTEXT_TOKEN, (variantContext) => { - new UmbObserverController(this.#host, variantContext.variantId, (variantId) => { - this._variantDifference.next(variantId ? this._variantId?.toDifferencesString(variantId) : ''); - }); - }); + this.#variantId.next(variantId); } public getVariantId() { - return this._variantId; + return this.#variantId.getValue(); } public resetValue() { @@ -94,3 +122,7 @@ export class UmbWorkspacePropertyContext { this._providerController.destroy(); // This would also be handled by the controller host, but if someone wanted to replace/remove this context without the host being destroyed. Then we have clean up out selfs here. } } + +export const UMB_WORKSPACE_PROPERTY_CONTEXT_TOKEN = new UmbContextToken( + 'UmbWorkspacePropertyContext' +); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace-property/workspace-property.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace-property/workspace-property.element.ts index 2f270c7fef..b7965d8fe5 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace-property/workspace-property.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace-property/workspace-property.element.ts @@ -211,17 +211,25 @@ export class UmbWorkspacePropertyElement extends UmbLitElement { if (this._element) { this._element.addEventListener('property-value-change', this._onPropertyEditorChange as any as EventListener); - this._valueObserver = this.observe(this._propertyContext.value, (value) => { - this._value = value; - if (this._element) { - this._element.value = value; - } - }); - this._configObserver = this.observe(this._propertyContext.config, (config) => { - if (this._element && config) { - this._element.config = config; - } - }); + this._valueObserver = this.observe( + this._propertyContext.value, + (value) => { + this._value = value; + if (this._element) { + this._element.value = value; + } + }, + '_observePropertyValue' + ); + this._configObserver = this.observe( + this._propertyContext.config, + (config) => { + if (this._element && config) { + this._element.config = config; + } + }, + '_observePropertyConfig' + ); } this.requestUpdate('element', oldValue); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-context/entity-manager-controller.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-context/entity-manager-controller.ts index b7137b1e1c..c1ee25b071 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-context/entity-manager-controller.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-context/entity-manager-controller.ts @@ -1,6 +1,6 @@ import { v4 as uuidv4 } from 'uuid'; import { UmbContextConsumerController, UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbNotificationDefaultData, UmbNotificationContext, @@ -31,7 +31,7 @@ export class UmbEntityWorkspaceManager< private _createAtParentKey?: string | null; - constructor(host: UmbControllerHostInterface, entityType: string, storeToken: UmbContextToken) { + constructor(host: UmbControllerHostElement, entityType: string, storeToken: UmbContextToken) { this._host = host; this._entityType = entityType; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-context/workspace-context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-context/workspace-context.ts index dd2a7e0618..abf5f6e856 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-context/workspace-context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-context/workspace-context.ts @@ -1,5 +1,5 @@ import { UmbContextProviderController } from '@umbraco-cms/backoffice/context-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { DeepState } from '@umbraco-cms/backoffice/observable-api'; /* @@ -8,13 +8,13 @@ TODO: We need to figure out if we like to keep using same alias for all workspac If so we need to align on a interface that all of these implements. otherwise consumers cant trust the workspace-context. */ export abstract class UmbWorkspaceContext { - public host: UmbControllerHostInterface; + public host: UmbControllerHostElement; public repository: T; #isNew = new DeepState(false); isNew = this.#isNew.asObservable(); - constructor(host: UmbControllerHostInterface, repository: T) { + constructor(host: UmbControllerHostElement, repository: T) { this.host = host; this.repository = repository; new UmbContextProviderController(host, 'umbWorkspaceContext', this); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-context/workspace-property-structure-manager.class.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-context/workspace-property-structure-manager.class.ts index bf46f4dc6b..5e759b967d 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-context/workspace-property-structure-manager.class.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-context/workspace-property-structure-manager.class.ts @@ -4,7 +4,7 @@ import { DocumentTypePropertyTypeResponseModel, PropertyTypeContainerResponseModelBaseModel, } from '@umbraco-cms/backoffice/backend-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { ArrayState, UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; export type PropertyContainerTypes = 'Group' | 'Tab'; @@ -14,7 +14,7 @@ type T = DocumentTypeResponseModel; // TODO: make general interface for NodeTypeRepository, to replace UmbDocumentTypeRepository: export class UmbWorkspacePropertyStructureManager { - #host: UmbControllerHostInterface; + #host: UmbControllerHostElement; #documentTypeRepository: R; @@ -22,7 +22,7 @@ export class UmbWorkspacePropertyStructureManager([], (x) => x.key); - constructor(host: UmbControllerHostInterface, typeRepository: R) { + constructor(host: UmbControllerHostElement, typeRepository: R) { this.#host = host; this.#documentTypeRepository = typeRepository; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-context/workspace-split-view-manager.class.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-context/workspace-split-view-manager.class.ts index f507add3f2..3c238c96b0 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-context/workspace-split-view-manager.class.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-context/workspace-split-view-manager.class.ts @@ -1,5 +1,5 @@ import { UmbVariantId } from '../../../variants/variant-id.class'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { ArrayState } from '@umbraco-cms/backoffice/observable-api'; export type ActiveVariant = { @@ -14,12 +14,12 @@ export type ActiveVariant = { * @description - Class managing the split view state for a workspace context. */ export class UmbWorkspaceSplitViewManager { - #host: UmbControllerHostInterface; + #host: UmbControllerHostElement; #activeVariantsInfo = new ArrayState([], (x) => x.index); public readonly activeVariantsInfo = this.#activeVariantsInfo.asObservable(); - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { this.#host = host; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-footer-layout/workspace-footer-layout.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-footer-layout/workspace-footer-layout.element.ts index 66dcef9011..525a5ede25 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-footer-layout/workspace-footer-layout.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-footer-layout/workspace-footer-layout.element.ts @@ -16,7 +16,7 @@ import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; */ // TODO: stop naming this something with layout. as its not just an layout. it hooks up with extensions. @customElement('umb-workspace-footer-layout') -export class UmbWorkspaceFooterLayout extends UmbLitElement { +export class UmbWorkspaceFooterLayoutElement extends UmbLitElement { static styles = [ UUITextStyles, css` @@ -71,6 +71,6 @@ export class UmbWorkspaceFooterLayout extends UmbLitElement { declare global { interface HTMLElementTagNameMap { - 'umb-workspace-footer-layout': UmbWorkspaceFooterLayout; + 'umb-workspace-footer-layout': UmbWorkspaceFooterLayoutElement; } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-footer-layout/workspace-footer-layout.stories.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-footer-layout/workspace-footer-layout.stories.ts index ac7c825d27..a37b61a21b 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-footer-layout/workspace-footer-layout.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-footer-layout/workspace-footer-layout.stories.ts @@ -4,7 +4,7 @@ import './workspace-footer-layout.element'; import { Meta, Story } from '@storybook/web-components'; import { html } from 'lit'; -import type { UmbWorkspaceFooterLayout } from './workspace-footer-layout.element'; +import type { UmbWorkspaceFooterLayoutElement } from './workspace-footer-layout.element'; export default { title: 'Workspaces/Shared/Footer Layout', @@ -12,7 +12,7 @@ export default { id: 'umb-workspace-footer-layout', } as Meta; -export const AAAOverview: Story = () => html` +export const AAAOverview: Story = () => html`
Footer slot
Actions slot
`; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-layout/workspace-layout.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-layout/workspace-layout.element.ts index f1fe4b7ff2..b41fd563ea 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-layout/workspace-layout.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-layout/workspace-layout.element.ts @@ -29,7 +29,7 @@ import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; */ // TODO: stop naming this something with layout. as its not just an layout. it hooks up with extensions. @customElement('umb-workspace-layout') -export class UmbWorkspaceLayout extends UmbLitElement { +export class UmbWorkspaceLayoutElement extends UmbLitElement { static styles = [ UUITextStyles, css` @@ -220,6 +220,6 @@ export class UmbWorkspaceLayout extends UmbLitElement { declare global { interface HTMLElementTagNameMap { - 'umb-workspace-layout': UmbWorkspaceLayout; + 'umb-workspace-layout': UmbWorkspaceLayoutElement; } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-layout/workspace-layout.stories.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-layout/workspace-layout.stories.ts index aa83696013..ba84a2855e 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-layout/workspace-layout.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-layout/workspace-layout.stories.ts @@ -3,7 +3,7 @@ import './workspace-layout.element'; import { Meta, Story } from '@storybook/web-components'; import { html } from 'lit'; -import type { UmbWorkspaceLayout } from './workspace-layout.element'; +import type { UmbWorkspaceLayoutElement } from './workspace-layout.element'; export default { title: 'Workspaces/Shared/Editor Entity Layout', @@ -11,7 +11,7 @@ export default { id: 'umb-workspace-layout', } as Meta; -export const AAAOverview: Story = () => html` +export const AAAOverview: Story = () => html`
Icon slot
Name slot
Footer slot
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-variant/workspace-variant.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-variant/workspace-variant.context.ts index 7b828461d9..598a6d40b9 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-variant/workspace-variant.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-variant/workspace-variant.context.ts @@ -2,15 +2,19 @@ import { UmbDocumentWorkspaceContext } from '../../../../documents/documents/wor import { UmbVariantId } from '../../../variants/variant-id.class'; import { UmbWorkspaceVariableEntityContextInterface } from '../workspace-context/workspace-variable-entity-context.interface'; import { ActiveVariant } from '../workspace-context/workspace-split-view-manager.class'; -import { UmbContextConsumerController, UmbContextProviderController, UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { + UmbContextConsumerController, + UmbContextProviderController, + UmbContextToken, +} from '@umbraco-cms/backoffice/context-api'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { ClassState, NumberState, ObjectState, UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; import { DocumentVariantResponseModel } from '@umbraco-cms/backoffice/backend-api'; //type EntityType = DocumentModel; export class UmbWorkspaceVariantContext { - #host: UmbControllerHostInterface; + #host: UmbControllerHostElement; #workspaceContext?: UmbWorkspaceVariableEntityContextInterface; public getWorkspaceContext() { @@ -32,7 +36,7 @@ export class UmbWorkspaceVariantContext { private _currentVariantObserver?: UmbObserverController; - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { this.#host = host; new UmbContextProviderController(host, UMB_WORKSPACE_VARIANT_CONTEXT_TOKEN.toString(), this); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/confirm/confirm-modal.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/confirm/confirm-modal.element.ts index 6f1735ad30..f710783f81 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/confirm/confirm-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/confirm/confirm-modal.element.ts @@ -1,9 +1,8 @@ import { html } from 'lit'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { customElement, property } from 'lit/decorators.js'; -import { UmbConfirmModalData, UmbConfirmModalResult } from '.'; +import { UmbConfirmModalData, UmbConfirmModalResult, UmbModalHandler } from '@umbraco-cms/backoffice/modal'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { UmbModalHandler } from '@umbraco-cms/backoffice/modal'; @customElement('umb-confirm-modal') export class UmbConfirmModalElement extends UmbLitElement { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/confirm/confirm-modal.stories.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/confirm/confirm-modal.stories.ts index 8a33def986..790bc96c46 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/confirm/confirm-modal.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/confirm/confirm-modal.stories.ts @@ -4,7 +4,7 @@ import { Meta, Story } from '@storybook/web-components'; import { html } from 'lit'; import type { UmbConfirmModalElement } from './confirm-modal.element'; -import type { UmbConfirmModalData } from './'; +import type { UmbConfirmModalData } from '@umbraco-cms/backoffice/modal'; export default { title: 'API/Modals/Layouts/Confirm', diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/embedded-media/embedded-media-modal.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/embedded-media/embedded-media-modal.element.ts index 5faf9e7d91..6f9574d919 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/embedded-media/embedded-media-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/embedded-media/embedded-media-modal.element.ts @@ -3,10 +3,15 @@ import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { customElement, property, state } from 'lit/decorators.js'; import { when } from 'lit-html/directives/when.js'; import { unsafeHTML } from 'lit-html/directives/unsafe-html.js'; -import { OEmbedResult, OEmbedStatus, UmbEmbeddedMediaModalData, UmbEmbeddedMediaModalResult } from '.'; +import { + OEmbedResult, + OEmbedStatus, + UmbEmbeddedMediaModalData, + UmbEmbeddedMediaModalResult, + UmbModalHandler, +} from '@umbraco-cms/backoffice/modal'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { UmbModalHandler } from '@umbraco-cms/backoffice/modal'; @customElement('umb-embedded-media-modal') export class UmbEmbeddedMediaModalElement extends UmbLitElement { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/embedded-media/embedded-media-modal.stories.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/embedded-media/embedded-media-modal.stories.ts index 5eb102c153..2638f0142c 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/embedded-media/embedded-media-modal.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/embedded-media/embedded-media-modal.stories.ts @@ -3,7 +3,7 @@ import './embedded-media-modal.element'; import { Meta } from '@storybook/web-components'; import { html } from 'lit'; -import { UmbEmbeddedMediaModalData } from '.'; +import { UmbEmbeddedMediaModalData } from '@umbraco-cms/backoffice/modal'; export default { title: 'API/Modals/Layouts/Embedded Media', diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/icon-picker/icon-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/icon-picker/icon-picker-modal.element.ts index 758696c00d..ff0cab31b1 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/icon-picker/icon-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/icon-picker/icon-picker-modal.element.ts @@ -6,7 +6,7 @@ import { customElement, property, state } from 'lit/decorators.js'; import { styleMap } from 'lit/directives/style-map.js'; import icons from '../../../../../public-assets/icons/icons.json'; -import { UmbIconPickerModalData, UmbIconPickerModalResult } from '.'; +import { UmbIconPickerModalData, UmbIconPickerModalResult } from '@umbraco-cms/backoffice/modal'; import { UmbModalBaseElement } from '@umbraco-cms/internal/modal'; // TODO: Make use of UmbPickerLayoutBase diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/icon-picker/icon-picker-modal.stories.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/icon-picker/icon-picker-modal.stories.ts index 2facbfb42a..53ee8a5bdb 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/icon-picker/icon-picker-modal.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/icon-picker/icon-picker-modal.stories.ts @@ -5,7 +5,7 @@ import { Meta, Story } from '@storybook/web-components'; import { html } from 'lit'; import type { UmbIconPickerModalElement } from './icon-picker-modal.element'; -import { UmbIconPickerModalData } from '.'; +import { UmbIconPickerModalData } from '@umbraco-cms/backoffice/modal'; export default { title: 'API/Modals/Layouts/Icon Picker', diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/link-picker/link-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/link-picker/link-picker-modal.element.ts index d1f290d0ff..7325caf339 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/link-picker/link-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/link-picker/link-picker-modal.element.ts @@ -3,7 +3,12 @@ import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { customElement, query, state } from 'lit/decorators.js'; import { UUIBooleanInputEvent, UUIInputElement } from '@umbraco-ui/uui'; import { UmbTreeElement } from '../../components/tree/tree.element'; -import { UmbLinkPickerConfig, UmbLinkPickerLink, UmbLinkPickerModalData, UmbLinkPickerModalResult } from '.'; +import { + UmbLinkPickerConfig, + UmbLinkPickerLink, + UmbLinkPickerModalData, + UmbLinkPickerModalResult, +} from '@umbraco-cms/backoffice/modal'; import { UmbModalBaseElement } from '@umbraco-cms/internal/modal'; import { buildUdi, getKeyFromUdi } from '@umbraco-cms/backoffice/utils'; @@ -46,6 +51,9 @@ export class UmbLinkPickerModalElement extends UmbModalBaseElement { +export class UmbPropertySettingsModalElement extends UmbModalBaseElement { static styles = [ UUITextStyles, css` @@ -261,7 +264,7 @@ export class UmbPropertySettingsModalElement extends UmbModalBaseElement { + this.consumeContext(UMB_WORKSPACE_PROPERTY_CONTEXT_TOKEN, (propertyContext: UmbWorkspacePropertyContext) => { this._propertyContext = propertyContext; }); } @@ -40,7 +41,7 @@ export class UmbPropertyActionClearElement extends UmbLitElement implements UmbP //this.value = '';// This is though bad as it assumes we are dealing with a string. So wouldn't work as a generalized element. //this.dispatchEvent(new CustomEvent('property-value-change')); // Or you can do this: - this._propertyContext?.resetValue();// This resets value to what the property wants. + this._propertyContext?.resetValue(); // This resets value to what the property wants. } render() { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-actions/shared/property-action-menu/property-action-menu.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-actions/shared/property-action-menu/property-action-menu.context.ts index ad2218b381..3a8205847f 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-actions/shared/property-action-menu/property-action-menu.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-actions/shared/property-action-menu/property-action-menu.context.ts @@ -1,12 +1,12 @@ import { UmbContextProviderController } from '@umbraco-cms/backoffice/context-api'; -import type { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { DeepState } from '@umbraco-cms/backoffice/observable-api'; export class UmbPropertyActionMenuContext { #isOpen = new DeepState(false); public readonly isOpen = this.#isOpen.asObservable(); - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { new UmbContextProviderController(host, 'umbPropertyActionMenu', this); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-creator/property-creator.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-creator/property-creator.element.ts index 9959e13c7d..a925a8299a 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-creator/property-creator.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-creator/property-creator.element.ts @@ -1,8 +1,7 @@ import { UUITextStyles } from '@umbraco-ui/uui-css'; import { css, html } from 'lit'; import { customElement } from 'lit/decorators.js'; -import { UMB_PROPERTY_SETTINGS_MODAL_TOKEN } from '../modals/property-settings'; -import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; +import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN, UMB_PROPERTY_SETTINGS_MODAL } from '@umbraco-cms/backoffice/modal'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-property-creator') @@ -18,7 +17,7 @@ export class UmbPropertyCreatorElement extends UmbLitElement { } #onAddProperty() { - const modalHandler = this.#modalContext?.open(UMB_PROPERTY_SETTINGS_MODAL_TOKEN); + const modalHandler = this.#modalContext?.open(UMB_PROPERTY_SETTINGS_MODAL); modalHandler?.onSubmit().then((result) => { console.log('result', result); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/modals/property-editor-ui-picker/property-editor-ui-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/modals/property-editor-ui-picker/property-editor-ui-picker-modal.element.ts index 0c41abf92c..62dfc7906e 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/modals/property-editor-ui-picker/property-editor-ui-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/modals/property-editor-ui-picker/property-editor-ui-picker-modal.element.ts @@ -4,7 +4,10 @@ import { customElement, property, state } from 'lit/decorators.js'; import { repeat } from 'lit/directives/repeat.js'; import { groupBy } from 'lodash-es'; import type { UUIInputEvent } from '@umbraco-ui/uui'; -import { UmbPropertyEditorUIPickerModalData, UmbPropertyEditorUIPickerModalResult } from '.'; +import { + UmbPropertyEditorUIPickerModalData, + UmbPropertyEditorUIPickerModalResult, +} from '@umbraco-cms/backoffice/modal'; import type { UmbModalHandler } from '@umbraco-cms/backoffice/modal'; import type { ManifestPropertyEditorUI } from '@umbraco-cms/backoffice/extensions-registry'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extensions-api'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/modals/property-editor-ui-picker/property-editor-ui-picker-modal.stories.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/modals/property-editor-ui-picker/property-editor-ui-picker-modal.stories.ts index 16d9f48b9d..fd6291ef18 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/modals/property-editor-ui-picker/property-editor-ui-picker-modal.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/modals/property-editor-ui-picker/property-editor-ui-picker-modal.stories.ts @@ -1,7 +1,7 @@ import { Meta, Story } from '@storybook/web-components'; import { html } from 'lit'; import type { UmbPropertyEditorUIPickerModalElement } from './property-editor-ui-picker-modal.element'; -import type { UmbPropertyEditorUIPickerModalData } from './'; +import type { UmbPropertyEditorUIPickerModalData } from '@umbraco-cms/backoffice/modal'; import './property-editor-ui-picker-modal.element'; import '../../../components/body-layout/body-layout.element'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/block-grid/property-editor-ui-block-grid.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/block-grid/property-editor-ui-block-grid.element.ts index 9e3a965a29..8939911174 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/block-grid/property-editor-ui-block-grid.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/block-grid/property-editor-ui-block-grid.element.ts @@ -2,8 +2,9 @@ import { html } from 'lit'; import { customElement, property, state } from 'lit/decorators.js'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { IRoute, IRoutingInfo } from 'router-slot'; -import { UMB_WORKSPACE_VARIANT_CONTEXT_TOKEN } from '../../../../shared/components/workspace/workspace-variant/workspace-variant.context'; import { UmbVariantId } from '../../../../shared/variants/variant-id.class'; +import { UMB_WORKSPACE_VARIANT_CONTEXT_TOKEN } from '../../../../shared/components/workspace/workspace-variant/workspace-variant.context'; +import { UMB_WORKSPACE_PROPERTY_CONTEXT_TOKEN } from '../../../../shared/components/workspace-property/workspace-property.context'; import { UmbRouterSlotChangeEvent, UmbRouterSlotInitEvent } from '@umbraco-cms/internal/router'; import { UmbPropertyEditorElement } from '@umbraco-cms/backoffice/property-editor'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @@ -38,10 +39,9 @@ export class UmbPropertyEditorUIBlockGridElement extends UmbLitElement implement constructor() { super(); - this.consumeContext(UMB_WORKSPACE_VARIANT_CONTEXT_TOKEN, (context) => { - this._variantContext = context; - this.observe(this._variantContext?.variantId, (variantId) => { - this._variantId = variantId; + this.consumeContext(UMB_WORKSPACE_PROPERTY_CONTEXT_TOKEN, (context) => { + this.observe(context?.variantId, (propertyVariantId) => { + this._variantId = propertyVariantId; this.setupRoutes(); }); }); @@ -52,7 +52,7 @@ export class UmbPropertyEditorUIBlockGridElement extends UmbLitElement implement if (this._variantId !== undefined) { this._routes = [ { - path: this._variantId.toString() + '/modal-1', + path: 'modal-1', component: () => { return import('./property-editor-ui-block-grid-inner-test.element'); }, @@ -64,7 +64,7 @@ export class UmbPropertyEditorUIBlockGridElement extends UmbLitElement implement }, }, { - path: this._variantId.toString() + '/modal-2', + path: 'modal-2', //pathMatch: 'full', component: () => { return import('./property-editor-ui-block-grid-inner-test.element'); @@ -88,17 +88,16 @@ export class UmbPropertyEditorUIBlockGridElement extends UmbLitElement implement + href="${this._routerPath + '/'}modal-1" + .active=${this._routerPath + '/' + 'modal-1' === this._activePath}> + href="${this._routerPath + '/'}modal-2" + .active=${this._routerPath + '/' + 'modal-2' === this._activePath}> - { @@ -107,7 +106,7 @@ export class UmbPropertyEditorUIBlockGridElement extends UmbLitElement implement @change=${(event: UmbRouterSlotChangeEvent) => { this._activePath = event.target.localActiveViewPath; }}> - +
` : 'loading...'; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/icon-picker/property-editor-ui-icon-picker.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/icon-picker/property-editor-ui-icon-picker.element.ts index 6448b70d4b..aebdeeb989 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/icon-picker/property-editor-ui-icon-picker.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/icon-picker/property-editor-ui-icon-picker.element.ts @@ -1,9 +1,8 @@ import { html } from 'lit'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { customElement, property } from 'lit/decorators.js'; -import { UMB_ICON_PICKER_MODAL_TOKEN } from '../../../modals/icon-picker'; import { UmbPropertyEditorElement } from '@umbraco-cms/backoffice/property-editor'; -import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; +import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN, UMB_ICON_PICKER_MODAL } from '@umbraco-cms/backoffice/modal'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; /** @@ -29,7 +28,7 @@ export class UmbPropertyEditorUIIconPickerElement extends UmbLitElement implemen } private _openModal() { - this._modalContext?.open(UMB_ICON_PICKER_MODAL_TOKEN); + this._modalContext?.open(UMB_ICON_PICKER_MODAL); } render() { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/multi-url-picker/property-editor-ui-multi-url-picker.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/multi-url-picker/property-editor-ui-multi-url-picker.element.ts index 60ae567bad..e4111187c0 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/multi-url-picker/property-editor-ui-multi-url-picker.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/multi-url-picker/property-editor-ui-multi-url-picker.element.ts @@ -3,15 +3,15 @@ import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { customElement, property, state } from 'lit/decorators.js'; import type { UUIModalSidebarSize } from '@umbraco-ui/uui'; import { UmbInputMultiUrlPickerElement } from '../../../../shared/components/input-multi-url-picker/input-multi-url-picker.element'; -import { UmbLinkPickerLink } from '../../../../shared/modals/link-picker'; +import { UMB_WORKSPACE_PROPERTY_CONTEXT_TOKEN } from '../../../../shared/components/workspace-property/workspace-property.context'; +import { UmbLinkPickerLink } from '@umbraco-cms/backoffice/modal'; import { UmbPropertyEditorElement } from '@umbraco-cms/backoffice/property-editor'; -import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { DataTypePropertyPresentationModel } from '@umbraco-cms/backoffice/backend-api'; +import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; /** * @element umb-property-editor-ui-multi-url-picker */ - @customElement('umb-property-editor-ui-multi-url-picker') export class UmbPropertyEditorUIMultiUrlPickerElement extends UmbLitElement implements UmbPropertyEditorElement { static styles = [UUITextStyles]; @@ -51,6 +51,25 @@ export class UmbPropertyEditorUIMultiUrlPickerElement extends UmbLitElement impl @state() private _minNumber?: number; + @state() + private _alias?: string; + + @state() + private _propertyVariantId?: string; + + constructor() { + super(); + + this.consumeContext(UMB_WORKSPACE_PROPERTY_CONTEXT_TOKEN, (context) => { + this.observe(context.alias, (alias) => { + this._alias = alias; + }); + this.observe(context.variantId, (variantId) => { + this._propertyVariantId = variantId?.toString() || 'invariant'; + }); + }); + } + private _onChange(event: CustomEvent) { this.value = (event.target as UmbInputMultiUrlPickerElement).urls; this.dispatchEvent(new CustomEvent('property-value-change')); @@ -58,6 +77,8 @@ export class UmbPropertyEditorUIMultiUrlPickerElement extends UmbLitElement impl render() { return html`) => { + this.consumeContext(UMB_WORKSPACE_PROPERTY_CONTEXT_TOKEN, (instance: UmbWorkspacePropertyContext) => { this.propertyContext = instance; }); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/components/file-system-tree-item/file-system-tree-item.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/components/file-system-tree-item/file-system-tree-item.context.ts index 92d1f20549..670d5d6be4 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/templating/components/file-system-tree-item/file-system-tree-item.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/templating/components/file-system-tree-item/file-system-tree-item.context.ts @@ -1,11 +1,11 @@ import { UmbTreeItemContextBase } from '../../../shared/components/tree/tree-item-base/tree-item-base.context'; import { urlFriendlyPathFromServerFilePath } from '../../utils'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { FileSystemTreeItemPresentationModel } from '@umbraco-cms/backoffice/backend-api'; // TODO get unique method from an entity repository static method export class UmbFileSystemTreeItemContext extends UmbTreeItemContextBase { - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { super(host, (x: FileSystemTreeItemPresentationModel) => x.path); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/repository/manifests.ts index 34225d54b8..7d999bb788 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/repository/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/repository/manifests.ts @@ -1,7 +1,6 @@ import { UmbStylesheetRepository } from './stylesheet.repository'; import { UmbStylesheetTreeStore } from './stylesheet.tree.store'; -import { ManifestRepository } from 'libs/extensions-registry/repository.models'; -import { ManifestTreeStore } from '@umbraco-cms/backoffice/extensions-registry'; +import { ManifestTreeStore, ManifestRepository } from '@umbraco-cms/backoffice/extensions-registry'; export const STYLESHEET_REPOSITORY_ALIAS = 'Umb.Repository.Stylesheet'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/repository/sources/stylesheet.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/repository/sources/stylesheet.server.data.ts index bc82863011..65fcd64e91 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/repository/sources/stylesheet.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/repository/sources/stylesheet.server.data.ts @@ -1,6 +1,6 @@ import { StylesheetDetails } from '../..'; import { DataSourceResponse, UmbDataSource } from '@umbraco-cms/backoffice/repository'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; /** * A data source for the Stylesheet that fetches data from the server @@ -9,14 +9,14 @@ import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; * @implements {UmbStylesheetServerDataSource} */ export class UmbStylesheetServerDataSource implements UmbDataSource { - #host: UmbControllerHostInterface; + #host: UmbControllerHostElement; /** * Creates an instance of UmbStylesheetServerDataSource. - * @param {UmbControllerHostInterface} host + * @param {UmbControllerHostElement} host * @memberof UmbStylesheetServerDataSource */ - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { this.#host = host; } createScaffold(parentKey: string | null): Promise> { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/repository/sources/stylesheet.tree.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/repository/sources/stylesheet.tree.server.data.ts index 7165e29c2e..1618d1ee59 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/repository/sources/stylesheet.tree.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/repository/sources/stylesheet.tree.server.data.ts @@ -3,7 +3,7 @@ import { PagedFileSystemTreeItemPresentationModel, StylesheetResource, } from '@umbraco-cms/backoffice/backend-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; import { UmbTreeDataSource } from '@umbraco-cms/backoffice/repository'; @@ -16,14 +16,14 @@ import { UmbTreeDataSource } from '@umbraco-cms/backoffice/repository'; export class UmbStylesheetTreeServerDataSource implements UmbTreeDataSource { - #host: UmbControllerHostInterface; + #host: UmbControllerHostElement; /** * Creates an instance of UmbStylesheetTreeServerDataSource. - * @param {UmbControllerHostInterface} host + * @param {UmbControllerHostElement} host * @memberof UmbStylesheetTreeServerDataSource */ - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { this.#host = host; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/repository/stylesheet.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/repository/stylesheet.repository.ts index a045817b57..fd73a0cda1 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/repository/stylesheet.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/repository/stylesheet.repository.ts @@ -1,7 +1,7 @@ import { UmbStylesheetTreeStore, UMB_STYLESHEET_TREE_STORE_CONTEXT_TOKEN } from './stylesheet.tree.store'; import { UmbStylesheetTreeServerDataSource } from './sources/stylesheet.tree.server.data'; import { UmbStylesheetServerDataSource } from './sources/stylesheet.server.data'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; import { UmbTreeRepository } from '@umbraco-cms/backoffice/repository'; @@ -21,7 +21,7 @@ export class UmbStylesheetRepository #initResolver?: () => void; #initialized = false; - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { this.#host = host; // TODO: figure out how spin up get the correct data source diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/repository/stylesheet.tree.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/repository/stylesheet.tree.store.ts index bf7a427c5c..317f94c2b4 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/repository/stylesheet.tree.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/repository/stylesheet.tree.store.ts @@ -1,6 +1,6 @@ import { UmbFileSystemTreeStore } from '@umbraco-cms/backoffice/store'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import type { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; /** * @export @@ -11,10 +11,10 @@ import type { UmbControllerHostInterface } from '@umbraco-cms/backoffice/control export class UmbStylesheetTreeStore extends UmbFileSystemTreeStore { /** * Creates an instance of UmbStylesheetTreeStore. - * @param {UmbControllerHostInterface} host + * @param {UmbControllerHostElement} host * @memberof UmbStylesheetTreeStore */ - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { super(host, UMB_STYLESHEET_TREE_STORE_CONTEXT_TOKEN.toString()); } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/workspace/stylesheet-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/workspace/stylesheet-workspace.context.ts index e3be06cf52..3ad3bb16b7 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/workspace/stylesheet-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/workspace/stylesheet-workspace.context.ts @@ -1,7 +1,7 @@ import { UmbWorkspaceContext } from '../../../shared/components/workspace/workspace-context/workspace-context'; import { UmbStylesheetRepository } from '../repository/stylesheet.repository'; import { StylesheetDetails } from '..'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; import { ObjectState } from '@umbraco-cms/backoffice/observable-api'; @@ -12,7 +12,7 @@ export class UmbStylesheetWorkspaceContext #data = new ObjectState(undefined); data = this.#data.asObservable(); - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { super(host, new UmbStylesheetRepository(host)); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/entity-actions/create/create.action.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/entity-actions/create/create.action.ts index 11ba8f3d3b..97067b0fc3 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/entity-actions/create/create.action.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/entity-actions/create/create.action.ts @@ -1,8 +1,8 @@ import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; export class UmbCreateEntityAction }> extends UmbEntityActionBase { - constructor(host: UmbControllerHostInterface, repositoryAlias: string, unique: string) { + constructor(host: UmbControllerHostElement, repositoryAlias: string, unique: string) { super(host, repositoryAlias, unique); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/entity-actions/manifests.ts index 81e96d6281..a85363c686 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/entity-actions/manifests.ts @@ -1,7 +1,7 @@ import { TEMPLATE_REPOSITORY_ALIAS } from '../repository/manifests'; import { UmbCreateEntityAction } from './create/create.action'; +import { ManifestEntityAction } from '@umbraco-cms/backoffice/extensions-registry'; import { UmbDeleteEntityAction } from '@umbraco-cms/backoffice/entity-action'; -import { ManifestEntityAction } from 'libs/extensions-registry/entity-action.models'; const entityActions: Array = [ { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/manifests.ts index 031c27f56a..2ff152e430 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/manifests.ts @@ -1,8 +1,7 @@ import { UmbTemplateRepository } from '../repository/template.repository'; import { UmbTemplateTreeStore } from './template.tree.store'; import { UmbTemplateStore } from './template.store'; -import { ManifestRepository } from 'libs/extensions-registry/repository.models'; -import { ManifestStore, ManifestTreeStore } from '@umbraco-cms/backoffice/extensions-registry'; +import { ManifestStore, ManifestTreeStore, ManifestRepository } from '@umbraco-cms/backoffice/extensions-registry'; export const TEMPLATE_REPOSITORY_ALIAS = 'Umb.Repository.Template'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/sources/template.detail.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/sources/template.detail.server.data.ts index c2b90a69a1..7705f1ac6d 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/sources/template.detail.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/sources/template.detail.server.data.ts @@ -1,6 +1,6 @@ import { v4 as uuid } from 'uuid'; import { ProblemDetailsModel, TemplateResponseModel, TemplateResource } from '@umbraco-cms/backoffice/backend-api'; -import type { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; import type { DataSourceResponse } from '@umbraco-cms/backoffice/repository'; @@ -19,14 +19,14 @@ export interface TemplateDetailDataSource { * @implements {TemplateDetailDataSource} */ export class UmbTemplateDetailServerDataSource implements TemplateDetailDataSource { - #host: UmbControllerHostInterface; + #host: UmbControllerHostElement; /** * Creates an instance of UmbTemplateDetailServerDataSource. - * @param {UmbControllerHostInterface} host + * @param {UmbControllerHostElement} host * @memberof UmbTemplateDetailServerDataSource */ - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { this.#host = host; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/sources/template.tree.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/sources/template.tree.server.data.ts index c7393da101..219e8cc807 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/sources/template.tree.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/sources/template.tree.server.data.ts @@ -1,6 +1,6 @@ import { TemplateTreeDataSource } from '.'; import { ProblemDetailsModel, TemplateResource } from '@umbraco-cms/backoffice/backend-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; /** @@ -10,14 +10,14 @@ import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; * @implements {TemplateTreeDataSource} */ export class TemplateTreeServerDataSource implements TemplateTreeDataSource { - #host: UmbControllerHostInterface; + #host: UmbControllerHostElement; /** * Creates an instance of TemplateTreeServerDataSource. - * @param {UmbControllerHostInterface} host + * @param {UmbControllerHostElement} host * @memberof TemplateTreeServerDataSource */ - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { this.#host = host; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/template.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/template.repository.ts index b8f1044c21..5567f76759 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/template.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/template.repository.ts @@ -2,16 +2,15 @@ import { UmbTemplateDetailServerDataSource } from './sources/template.detail.ser import { TemplateTreeServerDataSource } from './sources/template.tree.server.data'; import { UmbTemplateStore, UMB_TEMPLATE_STORE_CONTEXT_TOKEN } from './template.store'; import { UmbTemplateTreeStore, UMB_TEMPLATE_TREE_STORE_CONTEXT_TOKEN } from './template.tree.store'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import type { UmbDetailRepository, UmbTreeRepository } from '@umbraco-cms/backoffice/repository'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; import { ProblemDetailsModel, TemplateResponseModel } from '@umbraco-cms/backoffice/backend-api'; -import { UmbDetailRepository } from 'libs/repository/detail-repository.interface'; -import { UmbTreeRepository } from 'libs/repository/tree-repository.interface'; export class UmbTemplateRepository implements UmbTreeRepository, UmbDetailRepository { #init; - #host: UmbControllerHostInterface; + #host: UmbControllerHostElement; #treeDataSource: TemplateTreeServerDataSource; #detailDataSource: UmbTemplateDetailServerDataSource; @@ -21,7 +20,7 @@ export class UmbTemplateRepository implements UmbTreeRepository, UmbDetailR #notificationContext?: UmbNotificationContext; - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { this.#host = host; // TODO: figure out how spin up get the correct data source diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/template.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/template.store.ts index 87cc54b329..bda7548eb7 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/template.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/template.store.ts @@ -2,7 +2,7 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { ArrayState } from '@umbraco-cms/backoffice/observable-api'; import { UmbStoreBase } from '@umbraco-cms/backoffice/store'; import type { TemplateResponseModel } from '@umbraco-cms/backoffice/backend-api'; -import type { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; /** * @export @@ -15,10 +15,10 @@ export class UmbTemplateStore extends UmbStoreBase { /** * Creates an instance of UmbTemplateStore. - * @param {UmbControllerHostInterface} host + * @param {UmbControllerHostElement} host * @memberof UmbTemplateStore */ - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { super(host, UMB_TEMPLATE_STORE_CONTEXT_TOKEN.toString()); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/template.tree.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/template.tree.store.ts index b606566c98..d243c300f9 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/template.tree.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/template.tree.store.ts @@ -1,6 +1,6 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/store'; -import type { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; export const UMB_TEMPLATE_TREE_STORE_CONTEXT_TOKEN = new UmbContextToken('UmbTemplateTreeStore'); @@ -13,10 +13,10 @@ export const UMB_TEMPLATE_TREE_STORE_CONTEXT_TOKEN = new UmbContextToken { #data = new DeepState(undefined); @@ -10,7 +10,7 @@ export class UmbTemplateWorkspaceContext extends UmbWorkspaceContext data?.name); content = createObservablePart(this.#data, (data) => data?.content); - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { super(host, new UmbTemplateRepository(host)); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/themes/theme.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/themes/theme.context.ts index 4e18d51859..959c8f19ef 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/themes/theme.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/themes/theme.context.ts @@ -3,13 +3,13 @@ import { manifests } from './manifests'; import { UmbContextProviderController, UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { StringState, UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extensions-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { ManifestTheme } from '@umbraco-cms/backoffice/extensions-registry'; const LOCAL_STORAGE_KEY = 'umb-theme-alias'; export class UmbThemeContext { - private _host: UmbControllerHostInterface; + private _host: UmbControllerHostElement; #theme = new StringState('umb-light-theme'); public readonly theme = this.#theme.asObservable(); @@ -18,7 +18,7 @@ export class UmbThemeContext { #styleElement: HTMLLinkElement | HTMLStyleElement | null = null; - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { this._host = host; new UmbContextProviderController(host, UMB_THEME_CONTEXT_TOKEN, this); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dashboards/dictionary/dashboard-translation-dictionary.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dashboards/dictionary/dashboard-translation-dictionary.element.ts index 8107a3c8f4..d324fb3b32 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dashboards/dictionary/dashboard-translation-dictionary.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dashboards/dictionary/dashboard-translation-dictionary.element.ts @@ -4,10 +4,9 @@ import { customElement, state } from 'lit/decorators.js'; import { when } from 'lit/directives/when.js'; import { UmbTableConfig, UmbTableColumn, UmbTableItem } from '../../../../backoffice/shared/components/table'; import { UmbDictionaryRepository } from '../../dictionary/repository/dictionary.repository'; -import { UMB_CREATE_DICTIONARY_MODAL_TOKEN } from '../../dictionary/entity-actions/create/'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { DictionaryOverviewResponseModel, LanguageResponseModel } from '@umbraco-cms/backoffice/backend-api'; -import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; +import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN, UMB_CREATE_DICTIONARY_MODAL } from '@umbraco-cms/backoffice/modal'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; @customElement('umb-dashboard-translation-dictionary') @@ -157,7 +156,7 @@ export class UmbDashboardTranslationDictionaryElement extends UmbLitElement { // TODO: what to do if modal service is not available? if (!this.#modalContext) return; - const modalHandler = this.#modalContext?.open(UMB_CREATE_DICTIONARY_MODAL_TOKEN, { unique: null }); + const modalHandler = this.#modalContext?.open(UMB_CREATE_DICTIONARY_MODAL, { unique: null }); // TODO: get type from modal result const { name } = await modalHandler.onSubmit(); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/create/create-dictionary-modal-layout.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/create/create-dictionary-modal-layout.element.ts index 984a59dacf..6756740c65 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/create/create-dictionary-modal-layout.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/create/create-dictionary-modal-layout.element.ts @@ -2,11 +2,11 @@ import { html } from 'lit'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { customElement, query } from 'lit/decorators.js'; import { when } from 'lit/directives/when.js'; -import { UmbCreateDictionaryModalData, UmbCreateDictionaryModalResult } from '.'; +import { UmbCreateDictionaryModalData, UmbCreateDictionaryModalResult } from '@umbraco-cms/backoffice/modal'; import { UmbModalBaseElement } from '@umbraco-cms/internal/modal'; @customElement('umb-create-dictionary-modal') -export class UmbCreateDictionaryModalLayoutElement extends UmbModalBaseElement< +export class UmbCreateDictionaryModalElement extends UmbModalBaseElement< UmbCreateDictionaryModalData, UmbCreateDictionaryModalResult > { @@ -71,10 +71,10 @@ export class UmbCreateDictionaryModalLayoutElement extends UmbModalBaseElement< } } -export default UmbCreateDictionaryModalLayoutElement; +export default UmbCreateDictionaryModalElement; declare global { interface HTMLElementTagNameMap { - 'umb-create-dictionary-modal': UmbCreateDictionaryModalLayoutElement; + 'umb-create-dictionary-modal': UmbCreateDictionaryModalElement; } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/create/create.action.ts b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/create/create.action.ts index 0f9020988f..8f7f3eae7e 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/create/create.action.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/create/create.action.ts @@ -4,11 +4,10 @@ import { UmbSectionSidebarContext, UMB_SECTION_SIDEBAR_CONTEXT_TOKEN, } from '../../../../../backoffice/shared/components/section/section-sidebar/section-sidebar.context'; -import { UMB_CREATE_DICTIONARY_MODAL_TOKEN } from '.'; import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; -import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; +import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN, UMB_CREATE_DICTIONARY_MODAL } from '@umbraco-cms/backoffice/modal'; // TODO: temp import import './create-dictionary-modal-layout.element'; @@ -20,7 +19,7 @@ export default class UmbCreateDictionaryEntityAction extends UmbEntityActionBase #sectionSidebarContext!: UmbSectionSidebarContext; - constructor(host: UmbControllerHostInterface, repositoryAlias: string, unique: string) { + constructor(host: UmbControllerHostElement, repositoryAlias: string, unique: string) { super(host, repositoryAlias, unique); new UmbContextConsumerController(this.host, UMB_MODAL_CONTEXT_TOKEN, (instance) => { @@ -38,7 +37,7 @@ export default class UmbCreateDictionaryEntityAction extends UmbEntityActionBase // TODO: how can we get the current entity detail in the modal? Passing the observable // feels a bit hacky. Works, but hacky. - const modalHandler = this.#modalContext?.open(UMB_CREATE_DICTIONARY_MODAL_TOKEN, { + const modalHandler = this.#modalContext?.open(UMB_CREATE_DICTIONARY_MODAL, { unique: this.unique, parentName: this.#sectionSidebarContext.headline, }); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/export/export-dictionary-modal-layout.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/export/export-dictionary-modal.element.ts similarity index 84% rename from src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/export/export-dictionary-modal-layout.element.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/export/export-dictionary-modal.element.ts index 75355409cb..9f746ae2e1 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/export/export-dictionary-modal-layout.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/export/export-dictionary-modal.element.ts @@ -1,11 +1,11 @@ import { html } from 'lit'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { customElement, query } from 'lit/decorators.js'; -import { UmbExportDictionaryModalData, UmbExportDictionaryModalResult } from '.'; +import { UmbExportDictionaryModalData, UmbExportDictionaryModalResult } from '@umbraco-cms/backoffice/modal'; import { UmbModalBaseElement } from '@umbraco-cms/internal/modal'; -@customElement('umb-export-dictionary-modal-layout') -export class UmbExportDictionaryModalLayoutElement extends UmbModalBaseElement< +@customElement('umb-export-dictionary-modal') +export class UmbExportDictionaryModalElement extends UmbModalBaseElement< UmbExportDictionaryModalData, UmbExportDictionaryModalResult > { @@ -49,10 +49,10 @@ export class UmbExportDictionaryModalLayoutElement extends UmbModalBaseElement< } } -export default UmbExportDictionaryModalLayoutElement; +export default UmbExportDictionaryModalElement; declare global { interface HTMLElementTagNameMap { - 'umb-export-dictionary-modal-layout': UmbExportDictionaryModalLayoutElement; + 'umb-export-dictionary-modal': UmbExportDictionaryModalElement; } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/export/export.action.ts b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/export/export.action.ts index 4ed076c561..5505ad4ced 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/export/export.action.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/export/export.action.ts @@ -1,19 +1,18 @@ import { UUITextStyles } from '@umbraco-ui/uui-css'; import { UmbDictionaryRepository } from '../../repository/dictionary.repository'; -import { UMB_EXPORT_DICTIONARY_MODAL_TOKEN } from '.'; import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; -import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; +import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN, UMB_EXPORT_DICTIONARY_MODAL } from '@umbraco-cms/backoffice/modal'; -import './export-dictionary-modal-layout.element'; +import './export-dictionary-modal.element'; export default class UmbExportDictionaryEntityAction extends UmbEntityActionBase { static styles = [UUITextStyles]; #modalContext?: UmbModalContext; - constructor(host: UmbControllerHostInterface, repositoryAlias: string, unique: string) { + constructor(host: UmbControllerHostElement, repositoryAlias: string, unique: string) { super(host, repositoryAlias, unique); new UmbContextConsumerController(this.host, UMB_MODAL_CONTEXT_TOKEN, (instance) => { @@ -25,7 +24,7 @@ export default class UmbExportDictionaryEntityAction extends UmbEntityActionBase // TODO: what to do if modal service is not available? if (!this.#modalContext) return; - const modalHandler = this.#modalContext?.open(UMB_EXPORT_DICTIONARY_MODAL_TOKEN, { unique: this.unique }); + const modalHandler = this.#modalContext?.open(UMB_EXPORT_DICTIONARY_MODAL, { unique: this.unique }); // TODO: get type from modal result const { includeChildren } = await modalHandler.onSubmit(); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/import/import-dictionary-modal-layout.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/import/import-dictionary-modal.element.ts similarity index 93% rename from src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/import/import-dictionary-modal-layout.element.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/import/import-dictionary-modal.element.ts index 3dc06e07e5..92e2e6f507 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/import/import-dictionary-modal-layout.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/import/import-dictionary-modal.element.ts @@ -5,12 +5,12 @@ import { when } from 'lit/directives/when.js'; import { repeat } from 'lit/directives/repeat.js'; import { UmbTreeElement } from '../../../../shared/components/tree/tree.element'; import { UmbDictionaryRepository } from '../../repository/dictionary.repository'; -import { UmbImportDictionaryModalData, UmbImportDictionaryModalResult } from '.'; +import { UmbImportDictionaryModalData, UmbImportDictionaryModalResult } from '@umbraco-cms/backoffice/modal'; import { UploadDictionaryResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbModalBaseElement } from '@umbraco-cms/internal/modal'; -@customElement('umb-import-dictionary-modal-layout') -export class UmbImportDictionaryModalLayoutElement extends UmbModalBaseElement< +@customElement('umb-import-dictionary-modal') +export class UmbImportDictionaryModalLayout extends UmbModalBaseElement< UmbImportDictionaryModalData, UmbImportDictionaryModalResult > { @@ -156,10 +156,10 @@ export class UmbImportDictionaryModalLayoutElement extends UmbModalBaseElement< } } -export default UmbImportDictionaryModalLayoutElement; +export default UmbImportDictionaryModalLayout; declare global { interface HTMLElementTagNameMap { - 'umb-import-dictionary-modal-layout': UmbImportDictionaryModalLayoutElement; + 'umb-import-dictionary-modal': UmbImportDictionaryModalLayout; } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/import/import.action.ts b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/import/import.action.ts index 562d8618dd..0ba63c6352 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/import/import.action.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/import/import.action.ts @@ -1,19 +1,18 @@ import { UUITextStyles } from '@umbraco-ui/uui-css'; import { UmbDictionaryRepository } from '../../repository/dictionary.repository'; -import { UMB_IMPORT_DICTIONARY_MODAL_TOKEN } from '.'; import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; -import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; +import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN, UMB_IMPORT_DICTIONARY_MODAL } from '@umbraco-cms/backoffice/modal'; -import './import-dictionary-modal-layout.element'; +import './import-dictionary-modal.element'; export default class UmbImportDictionaryEntityAction extends UmbEntityActionBase { static styles = [UUITextStyles]; #modalContext?: UmbModalContext; - constructor(host: UmbControllerHostInterface, repositoryAlias: string, unique: string) { + constructor(host: UmbControllerHostElement, repositoryAlias: string, unique: string) { super(host, repositoryAlias, unique); new UmbContextConsumerController(this.host, UMB_MODAL_CONTEXT_TOKEN, (instance) => { @@ -25,7 +24,7 @@ export default class UmbImportDictionaryEntityAction extends UmbEntityActionBase // TODO: what to do if modal service is not available? if (!this.#modalContext) return; - const modalHandler = this.#modalContext?.open(UMB_IMPORT_DICTIONARY_MODAL_TOKEN, { unique: this.unique }); + const modalHandler = this.#modalContext?.open(UMB_IMPORT_DICTIONARY_MODAL, { unique: this.unique }); // TODO: get type from modal result const { fileName, parentKey } = await modalHandler.onSubmit(); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/manifests.ts index 181aedb3fc..fc79433c06 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/manifests.ts @@ -113,13 +113,13 @@ const modals: Array = [ type: 'modal', alias: 'Umb.Modal.ExportDictionary', name: 'Export Dictionary Modal', - loader: () => import('./export/export-dictionary-modal-layout.element'), + loader: () => import('./export/export-dictionary-modal.element'), }, { type: 'modal', alias: 'Umb.Modal.ImportDictionary', name: 'Import Dictionary Modal', - loader: () => import('./import/import-dictionary-modal-layout.element'), + loader: () => import('./import/import-dictionary-modal.element'), }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/reload.action.ts b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/reload.action.ts index 0cb3ca20c0..ac91ad2bfe 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/reload.action.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/reload.action.ts @@ -1,12 +1,12 @@ import { UUITextStyles } from '@umbraco-ui/uui-css'; import { UmbDictionaryRepository } from '../repository/dictionary.repository'; import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; export default class UmbReloadDictionaryEntityAction extends UmbEntityActionBase { static styles = [UUITextStyles]; - constructor(host: UmbControllerHostInterface, repositoryAlias: string, unique: string) { + constructor(host: UmbControllerHostElement, repositoryAlias: string, unique: string) { super(host, repositoryAlias, unique); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/dictionary.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/dictionary.repository.ts index ac680847b3..925f993f48 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/dictionary.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/dictionary.repository.ts @@ -3,7 +3,7 @@ import { UmbDictionaryStore, UMB_DICTIONARY_STORE_CONTEXT_TOKEN } from './dictio import { UmbDictionaryDetailServerDataSource } from './sources/dictionary.detail.server.data'; import { UmbDictionaryTreeStore, UMB_DICTIONARY_TREE_STORE_CONTEXT_TOKEN } from './dictionary.tree.store'; import { DictionaryTreeServerDataSource } from './sources/dictionary.tree.server.data'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; import { UmbTreeDataSource, UmbDetailRepository, UmbTreeRepository } from '@umbraco-cms/backoffice/repository'; import { ProblemDetailsModel } from '@umbraco-cms/backoffice/backend-api'; @@ -12,7 +12,7 @@ import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco export class UmbDictionaryRepository implements UmbTreeRepository, UmbDetailRepository { #init!: Promise; - #host: UmbControllerHostInterface; + #host: UmbControllerHostElement; #treeSource: UmbTreeDataSource; #treeStore?: UmbDictionaryTreeStore; @@ -22,7 +22,7 @@ export class UmbDictionaryRepository implements UmbTreeRepository, UmbDetailRepo #notificationContext?: UmbNotificationContext; - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { this.#host = host; // TODO: figure out how spin up get the correct data source diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/dictionary.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/dictionary.store.ts index 210f98c8dc..45ec7a5f5f 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/dictionary.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/dictionary.store.ts @@ -1,7 +1,7 @@ import type { DictionaryDetails } from '../'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UmbStoreBase } from '@umbraco-cms/backoffice/store'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { ArrayState } from '@umbraco-cms/backoffice/observable-api'; /** @@ -13,7 +13,7 @@ import { ArrayState } from '@umbraco-cms/backoffice/observable-api'; export class UmbDictionaryStore extends UmbStoreBase { #data = new ArrayState([], (x) => x.key); - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { super(host, UMB_DICTIONARY_STORE_CONTEXT_TOKEN.toString()); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/dictionary.tree.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/dictionary.tree.store.ts index cfcbb6ea48..3c60cabe70 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/dictionary.tree.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/dictionary.tree.store.ts @@ -1,6 +1,6 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UmbEntityTreeStore } from '@umbraco-cms/backoffice/store'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; /** * @export @@ -11,10 +11,10 @@ import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; export class UmbDictionaryTreeStore extends UmbEntityTreeStore { /** * Creates an instance of UmbDictionaryTreeStore. - * @param {UmbControllerHostInterface} host + * @param {UmbControllerHostElement} host * @memberof UmbDictionaryTreeStore */ - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { super(host, UMB_DICTIONARY_TREE_STORE_CONTEXT_TOKEN.toString()); } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/manifests.ts index 688a4769a7..012668b989 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/manifests.ts @@ -1,8 +1,7 @@ import { UmbDictionaryRepository } from '../repository/dictionary.repository'; import { UmbDictionaryTreeStore } from './dictionary.tree.store'; import { UmbDictionaryStore } from './dictionary.store'; -import { ManifestRepository } from 'libs/extensions-registry/repository.models'; -import { ManifestStore, ManifestTreeStore } from '@umbraco-cms/backoffice/extensions-registry'; +import { ManifestStore, ManifestTreeStore, ManifestRepository } from '@umbraco-cms/backoffice/extensions-registry'; export const DICTIONARY_REPOSITORY_ALIAS = 'Umb.Repository.Dictionary'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/sources/dictionary.detail.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/sources/dictionary.detail.server.data.ts index 8a972cc326..109d5a3924 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/sources/dictionary.detail.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/sources/dictionary.detail.server.data.ts @@ -1,6 +1,6 @@ import type { DictionaryDetails } from '../../'; import { DictionaryDetailDataSource } from './dictionary.details.server.data.interface'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; import { CreateDictionaryItemRequestModel, @@ -16,9 +16,9 @@ import { * @implements {DictionaryDetailDataSource} */ export class UmbDictionaryDetailServerDataSource implements DictionaryDetailDataSource { - #host: UmbControllerHostInterface; + #host: UmbControllerHostElement; - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { this.#host = host; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/sources/dictionary.tree.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/sources/dictionary.tree.server.data.ts index a96b16666d..fa073716ed 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/sources/dictionary.tree.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/sources/dictionary.tree.server.data.ts @@ -1,5 +1,5 @@ import { DictionaryResource, ProblemDetailsModel } from '@umbraco-cms/backoffice/backend-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbTreeDataSource } from '@umbraco-cms/backoffice/repository'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -10,14 +10,14 @@ import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; * @implements {DictionaryTreeDataSource} */ export class DictionaryTreeServerDataSource implements UmbTreeDataSource { - #host: UmbControllerHostInterface; + #host: UmbControllerHostElement; /** * Creates an instance of DictionaryTreeDataSource. - * @param {UmbControllerHostInterface} host + * @param {UmbControllerHostElement} host * @memberof DictionaryTreeDataSource */ - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { this.#host = host; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/workspace/dictionary-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/workspace/dictionary-workspace.context.ts index 0692a4ffe9..bab38b2abd 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/workspace/dictionary-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/workspace/dictionary-workspace.context.ts @@ -2,7 +2,7 @@ import { UmbDictionaryRepository } from '../repository/dictionary.repository'; import { UmbWorkspaceContext } from '../../../../backoffice/shared/components/workspace/workspace-context/workspace-context'; import { UmbEntityWorkspaceContextInterface } from '../../../../backoffice/shared/components/workspace/workspace-context/workspace-entity-context.interface'; import type { DictionaryDetails } from '../'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { ObjectState } from '@umbraco-cms/backoffice/observable-api'; type EntityType = DictionaryDetails; @@ -16,7 +16,7 @@ export class UmbDictionaryWorkspaceContext name = this.#data.getObservablePart((data) => data?.name); dictionary = this.#data.getObservablePart((data) => data); - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { super(host, new UmbDictionaryRepository(host)); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/current-user-header-app.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/current-user-header-app.element.ts index 209cf80101..7cf07e767f 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/current-user-header-app.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/current-user-header-app.element.ts @@ -2,13 +2,12 @@ import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { css, CSSResultGroup, html } from 'lit'; import { customElement, state } from 'lit/decorators.js'; import { UmbCurrentUserStore, UMB_CURRENT_USER_STORE_CONTEXT_TOKEN } from './current-user.store'; -import { UMB_CURRENT_USER_MODAL_TOKEN } from './modals/current-user'; import type { UserDetails } from '@umbraco-cms/backoffice/models'; -import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; +import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN, UMB_CURRENT_USER_MODAL } from '@umbraco-cms/backoffice/modal'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-current-user-header-app') -export class UmbCurrentUserHeaderApp extends UmbLitElement { +export class UmbCurrentUserHeaderAppElement extends UmbLitElement { static styles: CSSResultGroup = [ UUITextStyles, css` @@ -47,7 +46,7 @@ export class UmbCurrentUserHeaderApp extends UmbLitElement { } private _handleUserClick() { - this._modalContext?.open(UMB_CURRENT_USER_MODAL_TOKEN); + this._modalContext?.open(UMB_CURRENT_USER_MODAL); } render() { @@ -59,10 +58,10 @@ export class UmbCurrentUserHeaderApp extends UmbLitElement { } } -export default UmbCurrentUserHeaderApp; +export default UmbCurrentUserHeaderAppElement; declare global { interface HTMLElementTagNameMap { - 'umb-current-user-header-app': UmbCurrentUserHeaderApp; + 'umb-current-user-header-app': UmbCurrentUserHeaderAppElement; } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/modals/change-password/change-password-modal.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/modals/change-password/change-password-modal.element.ts index eb8830b5a0..f5fc28ad43 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/modals/change-password/change-password-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/modals/change-password/change-password-modal.element.ts @@ -1,8 +1,7 @@ import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { css, CSSResultGroup, html, nothing } from 'lit'; import { customElement, property } from 'lit/decorators.js'; -import { UmbChangePasswordModalData } from '.'; -import { UmbModalHandler } from '@umbraco-cms/backoffice/modal'; +import { UmbModalHandler, UmbChangePasswordModalData } from '@umbraco-cms/backoffice/modal'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-change-password-modal') diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/modals/change-password/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/modals/change-password/index.ts deleted file mode 100644 index 686021241b..0000000000 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/modals/change-password/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; - -export interface UmbChangePasswordModalData { - requireOldPassword: boolean; -} - -export const UMB_CHANGE_PASSWORD_MODAL_TOKEN = new UmbModalToken( - 'Umb.Modal.ChangePassword', - { - type: 'dialog', - } -); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/modals/current-user/current-user-modal.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/modals/current-user/current-user-modal.element.ts index 959687fd9c..3b60bc0f36 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/modals/current-user/current-user-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/modals/current-user/current-user-modal.element.ts @@ -7,8 +7,12 @@ import { UMB_CURRENT_USER_HISTORY_STORE_CONTEXT_TOKEN, } from '../../current-user-history.store'; import { UmbCurrentUserStore, UMB_CURRENT_USER_STORE_CONTEXT_TOKEN } from '../../current-user.store'; -import { UMB_CHANGE_PASSWORD_MODAL_TOKEN } from '../change-password'; -import { UmbModalHandler, UmbModalContext, UMB_MODAL_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; +import { + UmbModalHandler, + UmbModalContext, + UMB_MODAL_CONTEXT_TOKEN, + UMB_CHANGE_PASSWORD_MODAL, +} from '@umbraco-cms/backoffice/modal'; import type { UserDetails } from '@umbraco-cms/backoffice/models'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @@ -139,7 +143,7 @@ export class UmbCurrentUserModalElement extends UmbLitElement { private _changePassword() { if (!this._modalContext) return; - this._modalContext.open(UMB_CHANGE_PASSWORD_MODAL_TOKEN, { + this._modalContext.open(UMB_CHANGE_PASSWORD_MODAL, { requireOldPassword: this._currentUserStore?.isAdmin || false, }); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/repository/user-group.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/repository/user-group.repository.ts index 7c5b190ec4..7e4eac48ec 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/repository/user-group.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/repository/user-group.repository.ts @@ -1,10 +1,10 @@ -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; // TODO: implement export class UmbUserGroupRepository { - #host: UmbControllerHostInterface; + #host: UmbControllerHostElement; - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { this.#host = host; console.log(this.#host); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/repository/user-group.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/repository/user-group.store.ts index 1eeaf6e970..2b4fd90559 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/repository/user-group.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/repository/user-group.store.ts @@ -1,6 +1,6 @@ import type { UserGroupDetails } from '@umbraco-cms/backoffice/models'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { ArrayState } from '@umbraco-cms/backoffice/observable-api'; import { UmbEntityDetailStore, UmbStoreBase } from '@umbraco-cms/backoffice/store'; @@ -19,7 +19,7 @@ export class UmbUserGroupStore extends UmbStoreBase implements UmbEntityDetailSt #groups = new ArrayState([], (x) => x.key); public groups = this.#groups.asObservable(); - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { super(host, UMB_USER_GROUP_STORE_CONTEXT_TOKEN.toString()); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/user-group-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/user-group-workspace.context.ts index fe0c7f5075..5de56a4725 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/user-group-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/user-group-workspace.context.ts @@ -4,7 +4,7 @@ import { UmbEntityWorkspaceContextInterface } from '../../../shared/components/w import { UMB_USER_GROUP_STORE_CONTEXT_TOKEN } from '../repository/user-group.store'; import { UmbUserGroupRepository } from '../repository/user-group.repository'; import type { UserGroupDetails } from '@umbraco-cms/backoffice/models'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; export class UmbUserGroupWorkspaceContext extends UmbWorkspaceContext @@ -19,7 +19,7 @@ export class UmbUserGroupWorkspaceContext public readonly data = this.#manager.state.asObservable(); public readonly name = this.#manager.state.getObservablePart((state) => state?.name); - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { super(host, new UmbUserGroupRepository(host)); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/workspace-view-users-overview.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/workspace-view-users-overview.element.ts index b0e9bb188b..5aa001acf5 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/workspace-view-users-overview.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/workspace-view-users-overview.element.ts @@ -2,10 +2,13 @@ import { css, html, nothing } from 'lit'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { customElement, state } from 'lit/decorators.js'; import { UUIPopoverElement } from '@umbraco-ui/uui'; -import { UMB_INVITE_USER_MODAL_TOKEN } from '../../../../users/users/modals/invite-user'; -import { UMB_CREATE_USER_MODAL_TOKEN } from '../../../../users/users/modals/create-user'; import type { UmbSectionViewUsersElement } from './section-view-users.element'; -import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; +import { + UmbModalContext, + UMB_MODAL_CONTEXT_TOKEN, + UMB_INVITE_USER_MODAL, + UMB_CREATE_USER_MODAL, +} from '@umbraco-cms/backoffice/modal'; import type { IRoute } from '@umbraco-cms/internal/router'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @@ -160,9 +163,9 @@ export class UmbWorkspaceViewUsersOverviewElement extends UmbLitElement { let token = undefined; // TODO: we need to find a better way to determine if we should create or invite if (this.isCloud) { - token = UMB_INVITE_USER_MODAL_TOKEN; + token = UMB_INVITE_USER_MODAL; } else { - token = UMB_CREATE_USER_MODAL_TOKEN; + token = UMB_CREATE_USER_MODAL; } this._modalContext?.open(token); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/repository/user.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/repository/user.repository.ts index 8aa9fca2b5..a9f65bc59d 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/repository/user.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/repository/user.repository.ts @@ -1,10 +1,10 @@ -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; // TODO: implement export class UmbUserRepository { - #host: UmbControllerHostInterface; + #host: UmbControllerHostElement; - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { this.#host = host; console.log(this.#host); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/repository/user.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/repository/user.store.ts index c089151eef..4c6791de91 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/repository/user.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/repository/user.store.ts @@ -2,7 +2,7 @@ import type { UserDetails } from '@umbraco-cms/backoffice/models'; import { ArrayState, NumberState } from '@umbraco-cms/backoffice/observable-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UmbEntityDetailStore, UmbStoreBase } from '@umbraco-cms/backoffice/store'; -import type { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; export type UmbUserStoreItemType = UserDetails; @@ -21,7 +21,7 @@ export class UmbUserStore extends UmbStoreBase implements UmbEntityDetailStore @@ -22,7 +22,7 @@ export class UmbUserWorkspaceContext // TODO: remove this magic connection, instead create the necessary methods to update parts. update = this.#manager.state.update; - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { super(host, new UmbUserRepository(host)); } diff --git a/src/Umbraco.Web.UI.Client/src/core/context-provider/context-provider.element.ts b/src/Umbraco.Web.UI.Client/src/core/context-provider/context-provider.element.ts index 6cb0a7de8e..d5e28380e9 100644 --- a/src/Umbraco.Web.UI.Client/src/core/context-provider/context-provider.element.ts +++ b/src/Umbraco.Web.UI.Client/src/core/context-provider/context-provider.element.ts @@ -1,7 +1,7 @@ import { html } from 'lit'; import { customElement, property } from 'lit/decorators.js'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import type { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; @customElement('umb-context-provider') export class UmbContextProviderElement extends UmbLitElement { @@ -10,7 +10,7 @@ export class UmbContextProviderElement extends UmbLitElement { * @required */ @property({ type: Object, attribute: false }) - create?: (host: UmbControllerHostInterface) => unknown; + create?: (host: UmbControllerHostElement) => unknown; /** * The value to provide to the context. diff --git a/src/Umbraco.Web.UI.Client/src/core/controller-host/controller-host-test.element.ts b/src/Umbraco.Web.UI.Client/src/core/controller-host/controller-host-test.element.ts index 5ab064e243..14d703ffe7 100644 --- a/src/Umbraco.Web.UI.Client/src/core/controller-host/controller-host-test.element.ts +++ b/src/Umbraco.Web.UI.Client/src/core/controller-host/controller-host-test.element.ts @@ -1,6 +1,6 @@ import { html } from 'lit'; import { customElement, property } from 'lit/decorators.js'; -import { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-controller-host-test') @@ -10,7 +10,7 @@ export class UmbControllerHostTestElement extends UmbLitElement { * @required */ @property({ type: Object, attribute: false }) - create?: (host: UmbControllerHostInterface) => void; + create?: (host: UmbControllerHostElement) => void; connectedCallback() { super.connectedCallback(); diff --git a/src/Umbraco.Web.UI.Client/src/core/controller-host/controller-host-test.test.ts b/src/Umbraco.Web.UI.Client/src/core/controller-host/controller-host-test.test.ts index 4f3c781625..df0e1f3c42 100644 --- a/src/Umbraco.Web.UI.Client/src/core/controller-host/controller-host-test.test.ts +++ b/src/Umbraco.Web.UI.Client/src/core/controller-host/controller-host-test.test.ts @@ -3,7 +3,7 @@ import { customElement } from 'lit/decorators.js'; import { UmbControllerHostTestElement } from './controller-host-test.element'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { UmbContextProviderController } from '@umbraco-cms/backoffice/context-api'; -import type { UmbControllerHostInterface } from '@umbraco-cms/backoffice/controller'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; @customElement('umb-controller-host-test-consumer') export class ControllerHostTestConsumerElement extends UmbLitElement { @@ -24,7 +24,7 @@ describe('UmbControllerHostTestElement', () => { beforeEach(async () => { element = await fixture( html` + .create=${(host: UmbControllerHostElement) => new UmbContextProviderController(host, 'my-test-context-alias', contextValue)}> ` diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/data/document-type.data.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/data/document-type.data.ts index 17aa703d40..bb58ef407c 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/data/document-type.data.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/data/document-type.data.ts @@ -102,7 +102,7 @@ export const data: Array = [ name: 'Multi URL Picker', description: '', dataTypeKey: 'dt-multiUrlPicker', - variesByCulture: false, + variesByCulture: true, variesBySegment: false, validation: { mandatory: true, diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/data/document.data.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/data/document.data.ts index be766e795b..7dd20c7450 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/data/document.data.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/data/document.data.ts @@ -57,7 +57,24 @@ export const data: Array = [ { $type: '', alias: 'multiUrlPicker', - culture: null, + culture: 'en-us', + segment: null, + value: [ + { + name: undefined, + published: undefined, + queryString: undefined, + target: undefined, + trashed: undefined, + udi: 'umb://document/c05da24d7740447b9cdcbd8ce2172e38', + url: 'umb://document/c05da24d7740447b9cdcbd8ce2172e38', + }, + ], + }, + { + $type: '', + alias: 'multiUrlPicker', + culture: 'da-dk', segment: null, value: null, }, @@ -276,6 +293,16 @@ export const data: Array = [ createDate: '2023-02-06T15:31:46.876902', updateDate: '2023-02-06T15:31:51.354764', }, + { + $type: '', + state: ContentStateModel.PUBLISHED, + publishDate: '2023-02-06T15:31:51.354764', + culture: 'da-dk', + segment: null, + name: 'Alle redigeringsfelter', + createDate: '2023-02-06T15:31:46.876902', + updateDate: '2023-02-06T15:31:51.354764', + }, ], }, { diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/rte-embed.handlers.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/rte-embed.handlers.ts index 115e08d13c..0608017f15 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/rte-embed.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/rte-embed.handlers.ts @@ -1,7 +1,7 @@ -import { rest } from "msw"; -import { OEmbedResult, OEmbedStatus } from "../../../backoffice/shared/modals/embedded-media"; -import { UmbEmbeddedMediaModalElement as ModalElement } from "../../../../src/backoffice/shared/modals/embedded-media/embedded-media-modal.element"; -import { umbracoPath } from "@umbraco-cms/backoffice/utils"; +import { rest } from 'msw'; +import { UmbEmbeddedMediaModalElement as ModalElement } from '../../../backoffice/shared/modals/embedded-media/embedded-media-modal.element'; +import { OEmbedResult, OEmbedStatus } from '@umbraco-cms/backoffice/modal'; +import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const handlers = [ rest.get(umbracoPath('/rteembed'), (req, res, ctx) => { @@ -26,4 +26,4 @@ export const handlers = [ return res(ctx.status(200), ctx.json(response)); }), -]; \ No newline at end of file +]; diff --git a/src/Umbraco.Web.UI.Client/src/core/modal/modal-element.element.ts b/src/Umbraco.Web.UI.Client/src/core/modal/modal-element.element.ts index 4463c9c8fa..005bf6baac 100644 --- a/src/Umbraco.Web.UI.Client/src/core/modal/modal-element.element.ts +++ b/src/Umbraco.Web.UI.Client/src/core/modal/modal-element.element.ts @@ -3,7 +3,7 @@ import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { UmbModalHandler } from '@umbraco-cms/backoffice/modal'; @customElement('umb-modal-element') -export class UmbModalBaseElement extends UmbLitElement { +export class UmbModalBaseElement extends UmbLitElement { @property({ attribute: false }) modalHandler?: UmbModalHandler; @@ -13,6 +13,6 @@ export class UmbModalBaseElement ext declare global { interface HTMLElementTagNameMap { - 'umb-modal-element': UmbModalBaseElement; + 'umb-modal-element': UmbModalBaseElement; } } diff --git a/src/Umbraco.Web.UI.Client/src/core/modal/stories/modal.mdx b/src/Umbraco.Web.UI.Client/src/core/modal/stories/modal.mdx index 9cb19bc473..e04cdacc9e 100644 --- a/src/Umbraco.Web.UI.Client/src/core/modal/stories/modal.mdx +++ b/src/Umbraco.Web.UI.Client/src/core/modal/stories/modal.mdx @@ -42,7 +42,138 @@ class MyElement extends UmbElementMixin(LitElement) { ### Open a modal -A modal is opened by calling the open method on the UmbModalContext. The methods will accept a modal token (or extension alias), an optional dataset, and optional modal options .It returns an instance of UmbModalHandler. +A modal can be opned in two ways. Either you registrer the modal with a route or at runtime open the modal. Notice the first one will enable users to deep link to the modal, this might be preferable in some cases if not go for the last. + +#### Simple Modal Route Registration + +A modal can be registred via the UmbModalRouteRegistrationController. The registration will accept a modal token (or extension alias). + +Notice we are using a Controller here, this means your element has to be a Controller Host (TODO: Insert link to story about Controller Host also available through the UmbElementMixin) + +```ts +this.myModalRegistration = new UmbModalRouteRegistrationController(this, UMB_LINK_PICKER_MODAL) + .onSubmit((submitData) => { + console.log('Modal submitted with data'.submitData); + }) + .observeRouteBuilder((routeBuilder) => { + this._modalRouteBuilder = routeBuilder; + }); +``` + +The registration holds an instance of its UmbModalHandler when the modal it active. +The modal registration accepts 4 different callbacks: + +- onSetup - called when the modal is opened +- onSubmit - called when the modal is submitted +- onReject - called when the modal is rejected +- observeRouteBuilder - called when the modal route changes, use the given route builder to build a route to open the modal. + +#### TODOS: + +descripe the addional features of the route Registration: + +##### Hints: + +- Add unique parts to the path. (How is this cone properly as part of a Property Editor) +- A modal registred in a dashboard can be relatively simple. +- A modal registred in a property editor, needs to become specific for the property and the variant of that property. + +- Build some data for the setup. +- Reject a modal by returning false in setup. +- Use a param as part of setup to determin the data going to the modal. + +#### Modal registration for UI as part of a Property Editor + +```ts + + + @property() + public set alias(value: string | undefined) { + this.myModalRegistration.setUniqueIdentifier('propertyAlias', value); + } + + @property() + public set variantId(value: string | UmbVariantId | undefined) { + this.myModalRegistration.setUniqueIdentifier('variantId', value?.toString()); + } + + private _items = [ + { name: 'Item 1' }, + { name: 'Item 2' }, + { name: 'Item 3' }, + ] + + + constructor() { + super(); + + this.myModalRegistration = new UmbModalRouteRegistrationController( + this, + MY_MODAL_TOKEN, + `:index`, + new Map([ + ['propertyAlias', undefined], + ['variantId', undefined], + ]) + ) + .onSetup((params) => { + // Get item index: + const indexParam = params.index; + if (!indexParam) return false; + let index: number | null = parseInt(params.index); + if (Number.isNaN(index)) return false; + + // Use the index to find data: + let data = null; + if (index >= 0 && index < this._items.length) { + data = this._items[index]; + } else { + // If not then make a new pick: + index = null; + } + + return { + index: index, + itemData: { + name: data?.name + }, + }; + }) + .onSubmit((submitData) => { + if (!submitData) return; + this._items[submitData.index] = submitData.itemData; + }) + .observeRouteBuilder((routeBuilder) => { + this._modalRouteBuilder = routeBuilder; + }); + } + + render() { + return html` + ${this._items?.map((item, index) => + html`Add` + )} + `; + } +``` + +#### Generate the URL to a Modal Route Registration + +The Modal registration has an option to retrive a URL Builder, this is a function that can be used to generate a URL to a modal. + +```ts +const modalLink = _myUrlBuilder?.({ alias: 'my-input-alias' }); +``` + +The modalLink from above could look like: /umbraco/backoffice/my/location/modal/Our.Modal.SomethingPicker/my-input-alias + +Notice the Property Editor registration will add the property alias and variant id to the URL, so it becomes: + +/umbraco/backoffice/my/location/modal/Our.Modal.SomethingPicker/my-property-alias/en-us/my-input-alias + +#### Open A Modal at own initiative + +A modal can be opened by calling the open method on the UmbModalContext. The methods will accept a modal token (or extension alias), an optional dataset, and optional modal options. It returns an instance of UmbModalHandler. ```ts import { html, LitElement } from 'lit'; @@ -53,7 +184,7 @@ class MyElement extends UmbElementMixin(LitElement) { constructor() { super(); - this.consumeContext(UMB_MODAL_CONTEXT_ALIAS, (instance) => { + this.consumeContext(UMB_MODAL_CONTEXT_TOKEN, (instance) => { this.#modalContext = instance; // modalContext is now ready to be used }); @@ -62,7 +193,7 @@ class MyElement extends UmbElementMixin(LitElement) { #onClick() { const data = {'data goes here'}; const options {'options go here'}; - const modalHandler = this.#modalContext?.open(SOME_MODAL_TOKEN), data, options); + const modalHandler = this.#modalContext?.open(MY_MODAL_TOKEN), data, options); modalHandler?.onSubmit().then((data) => { // if modal submitted, then data is supplied here. diff --git a/src/Umbraco.Web.UI.Client/src/core/router/index.ts b/src/Umbraco.Web.UI.Client/src/core/router/index.ts index e05a188067..d3c5361842 100644 --- a/src/Umbraco.Web.UI.Client/src/core/router/index.ts +++ b/src/Umbraco.Web.UI.Client/src/core/router/index.ts @@ -2,4 +2,4 @@ export * from 'router-slot'; export * from './router-slot.element'; export * from './router-slot-change.event'; export * from './router-slot-init.event'; -export * from './route-location.interface'; +export * from './variant-router-slot.element'; diff --git a/src/Umbraco.Web.UI.Client/src/core/router/router-slot.element.ts b/src/Umbraco.Web.UI.Client/src/core/router/router-slot.element.ts index 4f33902f87..1dc354dc29 100644 --- a/src/Umbraco.Web.UI.Client/src/core/router/router-slot.element.ts +++ b/src/Umbraco.Web.UI.Client/src/core/router/router-slot.element.ts @@ -1,40 +1,45 @@ import type { IRoute } from 'router-slot/model'; import { RouterSlot } from 'router-slot'; -import { css, LitElement, PropertyValueMap } from 'lit'; +import { css, html, PropertyValueMap } from 'lit'; import { customElement, property } from 'lit/decorators.js'; +import { UmbLitElement } from '../lit-element'; import { UmbRouterSlotInitEvent } from './router-slot-init.event'; import { UmbRouterSlotChangeEvent } from './router-slot-change.event'; +import { UmbRouteContext, UmbRoute } from '@umbraco-cms/backoffice/router'; /** * @element umb-router-slot * @description - Component for wrapping Router Slot element, providing some local events for implementation. - * @extends UmbRouterSlotElement + * @extends UmbLitElement * @fires {UmbRouterSlotInitEvent} init - fires when the router is connected * @fires {UmbRouterSlotChangeEvent} change - fires when a path of this router is changed */ @customElement('umb-router-slot') -export class UmbRouterSlotElement extends LitElement { - static styles = [css` - :host { - display:flex; - flex-direction:column; - height:100%; - } +export class UmbRouterSlotElement extends UmbLitElement { + static styles = [ + css` + :host { + display: flex; + flex-direction: column; + height: 100%; + } - router-slot { - height:100%; - } - `] + router-slot { + height: 100%; + } + `, + ]; #router: RouterSlot = new RouterSlot(); + #modalRouter: RouterSlot = new RouterSlot(); #listening = false; @property() - public get routes(): IRoute[] | undefined { + public get routes(): UmbRoute[] | undefined { return (this.#router as any).routes; } - public set routes(value: IRoute[] | undefined) { - (this.#router as any).routes = value; + public set routes(value: UmbRoute[] | undefined) { + this.#router.routes = (value as IRoute[]) || []; } private _routerPath?: string; @@ -51,14 +56,29 @@ export class UmbRouterSlotElement extends LitElement { return this._routerPath + '/' + this._activeLocalPath; } + #routeContext = new UmbRouteContext(this, (contextRoutes) => { + (this.#modalRouter as any).routes = contextRoutes; + // Force a render? + this.#modalRouter.render(); + }); + constructor() { super(); - this.#router.addEventListener('changestate', this._onChangeState); + this.#modalRouter.parent = this.#router; + this.#router.addEventListener('changestate', this._updateRouterPath.bind(this)); + //this.#router.appendChild(this.#modalRouter); this.#router.appendChild(document.createElement('slot')); } + protected _constructAbsoluteRouterPath() { + return this.#router.constructAbsolutePath('') || ''; + } + connectedCallback() { super.connectedCallback(); + // Currently we have to set this every time as RouteSlot looks for its parent every-time it is connected. Aka it has not way to explicitly set the parent. + // And we cannot insert the modal router as a slotted-child of the router, as it flushes its children on every route change. + this.#modalRouter.parent = this.#router; if (this.#listening === false) { window.addEventListener('navigationsuccess', this._onNavigationChanged); this.#listening = true; @@ -73,14 +93,16 @@ export class UmbRouterSlotElement extends LitElement { protected firstUpdated(_changedProperties: PropertyValueMap | Map): void { super.firstUpdated(_changedProperties); - this._routerPath = this.#router.constructAbsolutePath('') || ''; + this._routerPath = this._constructAbsoluteRouterPath(); + this.#routeContext._internal_routerGotBasePath(this._routerPath); this.dispatchEvent(new UmbRouterSlotInitEvent()); } - private _onChangeState = () => { - const newAbsolutePath = this.#router.constructAbsolutePath('') || ''; + protected _updateRouterPath() { + const newAbsolutePath = this._constructAbsoluteRouterPath(); if (this._routerPath !== newAbsolutePath) { this._routerPath = newAbsolutePath; + this.#routeContext._internal_routerGotBasePath(this._routerPath); this.dispatchEvent(new UmbRouterSlotInitEvent()); const newActiveLocalPath = this.#router.match?.route.path; @@ -89,17 +111,20 @@ export class UmbRouterSlotElement extends LitElement { this.dispatchEvent(new UmbRouterSlotChangeEvent()); } } - }; + } private _onNavigationChanged = (event?: any) => { if (event.detail.slot === this.#router) { this._activeLocalPath = event.detail.match.route.path; this.dispatchEvent(new UmbRouterSlotChangeEvent()); + } else if (event.detail.slot === this.#modalRouter) { + const newActiveModalLocalPath = event.detail.match.route.path; + this.#routeContext._internal_modalRouterChanged(newActiveModalLocalPath); } }; render() { - return this.#router; + return html`${this.#router}${this.#modalRouter}`; } } diff --git a/src/Umbraco.Web.UI.Client/src/core/router/variant-router-slot.element.ts b/src/Umbraco.Web.UI.Client/src/core/router/variant-router-slot.element.ts new file mode 100644 index 0000000000..c5e125fee7 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/core/router/variant-router-slot.element.ts @@ -0,0 +1,79 @@ +import { customElement, property } from 'lit/decorators.js'; +import { UmbVariantId } from '../../backoffice/shared/variants/variant-id.class'; +import { UmbRouterSlotElement } from './router-slot.element'; +import { UmbRoute } from '@umbraco-cms/backoffice/router'; + +function variantIdsToString(variantIds: UmbVariantId[]): string { + return variantIds.map((id) => id.toString()).join('_&_'); +} + +/** + * @element umb-variant-router-slot-element + * @description - Component for wrapping Router Slot element, providing + * @extends UmbRouterSlotElement + * @fires {UmbRouterSlotInitEvent} init - fires when the router is connected + * @fires {UmbRouterSlotChangeEvent} change - fires when a path of this router is changed + */ +@customElement('umb-variant-router-slot') +export class UmbVariantRouterSlotElement extends UmbRouterSlotElement { + #variantIds: UmbVariantId[] = []; + + #getPathPrefix() { + return variantIdsToString(this.#variantIds); + } + + #currentPathPrefix = ''; + private _routes?: UmbRoute[]; + public get routes(): UmbRoute[] | undefined { + return this._routes; + } + public set routes(value: UmbRoute[] | undefined) { + this._routes = value; + if (this.#variantIds.length > 0) { + this._updateRoutes(); + } + } + + private _updateRoutes() { + const newPrefix = this.#getPathPrefix(); + if (newPrefix !== this.#currentPathPrefix) { + this.#currentPathPrefix = newPrefix; + const prepend = newPrefix === '' ? '' : newPrefix + '/'; + const mappedRoutes = this._routes?.map((route) => { + return { + ...route, + path: prepend + route.path, + }; + }); + super.routes = mappedRoutes; + this._updateRouterPath(); + } + } + + @property() + public get variantId(): UmbVariantId[] { + return this.#variantIds; + } + public set variantId(value: UmbVariantId[] | UmbVariantId) { + if (Array.isArray(value)) { + this.#variantIds = [...(value as UmbVariantId[])]; + } else if (value) { + this.#variantIds = [value]; + } else { + this.#variantIds = []; + } + if (this._routes) { + this._updateRoutes(); + } + } + + protected _constructAbsoluteRouterPath() { + return super._constructAbsoluteRouterPath() + (this.#currentPathPrefix !== '' ? '/' + this.#currentPathPrefix : ''); + } +} + +declare global { + interface HTMLElementTagNameMap { + 'umb-variant-router-slot': UmbVariantRouterSlotElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/stories/extending/entity-actions.mdx b/src/Umbraco.Web.UI.Client/src/stories/extending/entity-actions.mdx index 3298aabe03..eb9fe3121d 100644 --- a/src/Umbraco.Web.UI.Client/src/stories/extending/entity-actions.mdx +++ b/src/Umbraco.Web.UI.Client/src/stories/extending/entity-actions.mdx @@ -90,11 +90,11 @@ As part of the Extension Manifest you can attach a class that will be instanciat ```ts import { UmbEntityActionBase } from '@umbraco-cms/entity-action'; -import { UmbControllerHostInterface } from '@umbraco-cms/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/controller'; import type { MyRepository } from './my-repository'; export class MyEntityAction extends UmbEntityActionBase { - constructor(host: UmbControllerHostInterface, repositoryAlias: string, unique: string) { + constructor(host: UmbControllerHostElement, repositoryAlias: string, unique: string) { super(host, repositoryAlias, unique); } @@ -113,7 +113,7 @@ import { UMB_MODAL_SERVICE_CONTEXT_TOKEN } from '@umbraco-cms/modal'; import { MyRepository } from './my-repository'; export class MyEntityAction extends UmbEntityActionBase { - constructor(host: UmbControllerHostInterface, repositoryAlias: string, unique: string) { + constructor(host: UmbControllerHostElement, repositoryAlias: string, unique: string) { super(host, repositoryAlias, unique); new UmbContextConsumerController(this.host, UMB_MODAL_SERVICE_CONTEXT_TOKEN, (instance) => { @@ -176,11 +176,11 @@ As part of the Extension Manifest you can attach a class that will be instanciat ```ts import { UmbEntityBulkActionBase } from '@umbraco-cms/entity-action'; -import { UmbControllerHostInterface } from '@umbraco-cms/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/controller'; import { MyRepository } from './my-repository'; export class MyEntityBulkAction extends UmbEntityBulkActionBase { - constructor(host: UmbControllerHostInterface, repositoryAlias: string, selection: Array) { + constructor(host: UmbControllerHostElement, repositoryAlias: string, selection: Array) { super(host, repositoryAlias, selection); } diff --git a/src/Umbraco.Web.UI.Client/src/stories/extending/modals/intro.mdx b/src/Umbraco.Web.UI.Client/src/stories/extending/modals/intro.mdx new file mode 100644 index 0000000000..cde473b6b8 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/stories/extending/modals/intro.mdx @@ -0,0 +1,57 @@ +import { Meta } from '@storybook/addon-docs'; + + + +# Modals + +// TODO: add description about what modals is + +- Sidebar +- Infinite Editors +- Dialogs + +## Define a Manifest for a Modal Type + +### Manifest + +```json +{ + "type": "modal", + "alias": "Our.Modal.SomethingPicker", + "name": "My Something Picker Modal", + "loader": "./my-something-picker-modal-element.js", +}, +``` + +## Implement a Modal + +### Modal Token + +For type safety we recommend that you make a Modal Token, Its posible to go without. +The Modal Token binds the Modal Type to the Modal Data Type and Modal Result Type. + +`` + +```ts +import { ModalToken } from '@umbraco-cms/element'; + +export type OurSomethingPickerModalData = { + key: string | null; +}; + +export type OurSomethingPickerModalResult = { + key: string; +}; + +export const MY_SOMETHING_PICKER_MODAL = new UmbModalToken( + 'Our.Modal.SomethingPicker', + { + type: 'sidebar', + size: 'small', + } +); +``` + +### Make a modal registration + +# TODO Link to modal documentation here. diff --git a/src/Umbraco.Web.UI.Client/src/stories/extending/tree.mdx b/src/Umbraco.Web.UI.Client/src/stories/extending/tree.mdx index 98b44058f9..2f750ce0fe 100644 --- a/src/Umbraco.Web.UI.Client/src/stories/extending/tree.mdx +++ b/src/Umbraco.Web.UI.Client/src/stories/extending/tree.mdx @@ -94,7 +94,7 @@ export default MyTreeItemElement; ```typescript // TODO: auto generate this from the interface export interface UmbTreeItemContext { - host: UmbControllerHostInterface; + host: UmbControllerHostElement; unique?: string; type?: string; @@ -127,7 +127,7 @@ We provide a base class for the tree item context. This class provides some defa ```typescript export class UmbMyTreeItemContext extends UmbTreeItemContextBase { - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { super(host, (x: MyTreeItemDataModel) => x.unique); } diff --git a/src/Umbraco.Web.UI.Client/src/stories/extending/workspaces/actions.mdx b/src/Umbraco.Web.UI.Client/src/stories/extending/workspaces/actions.mdx index ffb2564407..d9ff5db436 100644 --- a/src/Umbraco.Web.UI.Client/src/stories/extending/workspaces/actions.mdx +++ b/src/Umbraco.Web.UI.Client/src/stories/extending/workspaces/actions.mdx @@ -43,11 +43,11 @@ As part of the Extension Manifest you can attach a class that will be instanciat ```ts import { UmbEntityBulkActionBase } from '@umbraco-cms/entity-action'; -import { UmbControllerHostInterface } from '@umbraco-cms/controller'; +import { UmbControllerHostElement } from '@umbraco-cms/controller'; import { MyRepository } from './my-repository'; export class MyWorkspaceAction extends UmbWorkspaceActionBase { - constructor(host: UmbControllerHostInterface) { + constructor(host: UmbControllerHostElement) { super(host); } diff --git a/src/Umbraco.Web.UI.Client/src/stories/store.mdx b/src/Umbraco.Web.UI.Client/src/stories/store.mdx index 3a95ffbc11..667afd9124 100644 --- a/src/Umbraco.Web.UI.Client/src/stories/store.mdx +++ b/src/Umbraco.Web.UI.Client/src/stories/store.mdx @@ -15,8 +15,8 @@ class MyProductStore { public readonly products = this.#products.asObservable(); - protected host: UmbControllerHostInterface; - constructor(host: UmbControllerHostInterface) { + protected host: UmbControllerHostElement; + constructor(host: UmbControllerHostElement) { this.host = host; // The Store provides it self as a Context-API. diff --git a/src/Umbraco.Web.UI.Client/src/upgrader/upgrader-view.element.ts b/src/Umbraco.Web.UI.Client/src/upgrader/upgrader-view.element.ts index af13aa4b59..d66130096b 100644 --- a/src/Umbraco.Web.UI.Client/src/upgrader/upgrader-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/upgrader/upgrader-view.element.ts @@ -8,7 +8,7 @@ import { UpgradeSettingsResponseModel } from '@umbraco-cms/backoffice/backend-ap * @fires {CustomEvent} onAuthorizeUpgrade - fires when the user clicks the continue button */ @customElement('umb-upgrader-view') -export class UmbUpgraderView extends LitElement { +export class UmbUpgraderViewElement extends LitElement { static styles: CSSResultGroup = [ css` .center { @@ -100,10 +100,10 @@ export class UmbUpgraderView extends LitElement { }; } -export default UmbUpgraderView; +export default UmbUpgraderViewElement; declare global { interface HTMLElementTagNameMap { - 'umb-upgrader-view': UmbUpgraderView; + 'umb-upgrader-view': UmbUpgraderViewElement; } } diff --git a/src/Umbraco.Web.UI.Client/src/upgrader/upgrader-view.test.ts b/src/Umbraco.Web.UI.Client/src/upgrader/upgrader-view.test.ts index a8fbd46756..6d5f6dec83 100644 --- a/src/Umbraco.Web.UI.Client/src/upgrader/upgrader-view.test.ts +++ b/src/Umbraco.Web.UI.Client/src/upgrader/upgrader-view.test.ts @@ -1,17 +1,17 @@ import { expect, fixture, html } from '@open-wc/testing'; -import { UmbUpgraderView } from './upgrader-view.element'; +import { UmbUpgraderViewElement } from './upgrader-view.element'; import { defaultA11yConfig } from '@umbraco-cms/internal/test-utils'; describe('UmbUpgraderView', () => { - let element: UmbUpgraderView; + let element: UmbUpgraderViewElement; beforeEach(async () => { element = await fixture(html``); }); it('is defined with its own instance', () => { - expect(element).to.be.instanceOf(UmbUpgraderView); + expect(element).to.be.instanceOf(UmbUpgraderViewElement); }); it('passes the a11y audit', async () => { diff --git a/src/Umbraco.Web.UI.Client/src/upgrader/upgrader.element.ts b/src/Umbraco.Web.UI.Client/src/upgrader/upgrader.element.ts index 665104ebdd..2ff39b81f7 100644 --- a/src/Umbraco.Web.UI.Client/src/upgrader/upgrader.element.ts +++ b/src/Umbraco.Web.UI.Client/src/upgrader/upgrader.element.ts @@ -11,7 +11,7 @@ import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; * @element umb-upgrader */ @customElement('umb-upgrader') -export class UmbUpgrader extends UmbLitElement { +export class UmbUpgraderElement extends UmbLitElement { @state() private upgradeSettings?: UpgradeSettingsResponseModel; @@ -71,10 +71,10 @@ export class UmbUpgrader extends UmbLitElement { }; } -export default UmbUpgrader; +export default UmbUpgraderElement; declare global { interface HTMLElementTagNameMap { - 'umb-upgrader': UmbUpgrader; + 'umb-upgrader': UmbUpgraderElement; } } diff --git a/src/Umbraco.Web.UI.Client/src/upgrader/upgrader.stories.ts b/src/Umbraco.Web.UI.Client/src/upgrader/upgrader.stories.ts index 77d63cefb8..5363224718 100644 --- a/src/Umbraco.Web.UI.Client/src/upgrader/upgrader.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/upgrader/upgrader.stories.ts @@ -3,7 +3,7 @@ import './upgrader-view.element'; import type { Meta, StoryObj } from '@storybook/web-components'; import { html } from 'lit'; -import type { UmbUpgraderView } from './upgrader-view.element'; +import type { UmbUpgraderViewElement } from './upgrader-view.element'; export default { title: 'Apps/Upgrader/States', @@ -32,9 +32,9 @@ export default { ${story()}
`, ], -} satisfies Meta; +} satisfies Meta; -type Story = StoryObj; +type Story = StoryObj; export const Overview: Story = {}; diff --git a/src/Umbraco.Web.UI.Client/src/upgrader/upgrader.test.ts b/src/Umbraco.Web.UI.Client/src/upgrader/upgrader.test.ts index 152dacda45..24561b45ac 100644 --- a/src/Umbraco.Web.UI.Client/src/upgrader/upgrader.test.ts +++ b/src/Umbraco.Web.UI.Client/src/upgrader/upgrader.test.ts @@ -1,15 +1,15 @@ import { expect, fixture, html } from '@open-wc/testing'; -import { UmbUpgrader } from './upgrader.element'; +import { UmbUpgraderElement } from './upgrader.element'; describe('UmbUpgrader', () => { - let element: UmbUpgrader; + let element: UmbUpgraderElement; beforeEach(async () => { element = await fixture(html``); }); it('is defined with its own instance', () => { - expect(element).to.be.instanceOf(UmbUpgrader); + expect(element).to.be.instanceOf(UmbUpgraderElement); }); }); diff --git a/src/Umbraco.Web.UI.Client/tsconfig.json b/src/Umbraco.Web.UI.Client/tsconfig.json index 691efe96f9..b9ed9f3fce 100644 --- a/src/Umbraco.Web.UI.Client/tsconfig.json +++ b/src/Umbraco.Web.UI.Client/tsconfig.json @@ -36,6 +36,7 @@ "@umbraco-cms/backoffice/property-editor": ["libs/property-editor"], "@umbraco-cms/backoffice/repository": ["libs/repository"], "@umbraco-cms/backoffice/resources": ["libs/resources"], + "@umbraco-cms/backoffice/router": ["libs/router"], "@umbraco-cms/backoffice/store": ["libs/store"], "@umbraco-cms/backoffice/utils": ["libs/utils"], "@umbraco-cms/backoffice/workspace": ["libs/workspace"], diff --git a/src/Umbraco.Web.UI.Client/vite.cms.config.ts b/src/Umbraco.Web.UI.Client/vite.cms.config.ts index b174cd7f82..2d0006a27b 100644 --- a/src/Umbraco.Web.UI.Client/vite.cms.config.ts +++ b/src/Umbraco.Web.UI.Client/vite.cms.config.ts @@ -14,7 +14,7 @@ export default defineConfig({ external: [/^@umbraco-cms\/backoffice\//] }, outDir: '../Umbraco.Cms.StaticAssets/wwwroot/umbraco/backoffice', - emptyOutDir: true, + emptyOutDir: false, sourcemap: true, }, base: '/umbraco/backoffice/',