diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts index 52c45a507c..bcdec80014 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts @@ -138,6 +138,8 @@ export class UmbDocumentWorkspaceContext this.observe(this.contentTypeUnique, (unique) => this.structure.loadType(unique)); this.observe(this.varies, (varies) => (this.#varies = varies)); + this.loadLanguages(); + this.routes.setRoutes([ { path: 'create/parent/:entityType/:parentUnique/:documentTypeUnique', @@ -164,8 +166,6 @@ export class UmbDocumentWorkspaceContext }, }, ]); - - this.loadLanguages(); } resetState() { diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member/section-view/member-section-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/section-view/member-section-view.element.ts index fe46d2afba..1995d81f56 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member/section-view/member-section-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member/section-view/member-section-view.element.ts @@ -2,7 +2,7 @@ import { UMB_MEMBER_COLLECTION_ALIAS } from '../collection/manifests.js'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { css, html, customElement } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import type { UmbRoute } from '@umbraco-cms/backoffice/router'; +import type { PageComponent, UmbRoute } from '@umbraco-cms/backoffice/router'; @customElement('umb-member-section-view') export class UmbMemberSectionViewElement extends UmbLitElement { @@ -17,7 +17,10 @@ export class UmbMemberSectionViewElement extends UmbLitElement { }, { path: 'member', - component: () => import('../workspace/member-workspace.element.js'), + component: () => import('src/packages/core/workspace/workspace.element.js'), + setup(component: PageComponent) { + (component as any).entityType = 'member'; + }, }, { path: '', diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/index.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/index.ts index 27359aaa74..8854311d61 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/index.ts @@ -1 +1,2 @@ export { UMB_MEMBER_WORKSPACE_ALIAS } from './manifests.js'; +export { UMB_MEMBER_WORKSPACE_CONTEXT } from './member-workspace.context-token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/manifests.ts index 3b49fc177b..d5f2035cda 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/manifests.ts @@ -1,18 +1,19 @@ import { UMB_MEMBER_ENTITY_TYPE } from '../entity.js'; import { UmbSaveWorkspaceAction } from '@umbraco-cms/backoffice/workspace'; import type { - ManifestWorkspace, + ManifestWorkspaces, ManifestWorkspaceActions, ManifestWorkspaceView, } from '@umbraco-cms/backoffice/extension-registry'; export const UMB_MEMBER_WORKSPACE_ALIAS = 'Umb.Workspace.Member'; -const workspace: ManifestWorkspace = { +const workspace: ManifestWorkspaces = { type: 'workspace', + kind: 'routable', alias: UMB_MEMBER_WORKSPACE_ALIAS, name: 'Member Workspace', - js: () => import('./member-workspace.element.js'), + api: () => import('./member-workspace.context.js'), meta: { entityType: UMB_MEMBER_ENTITY_TYPE, }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace-editor.element.ts index f841e4d981..4272908deb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace-editor.element.ts @@ -1,5 +1,5 @@ import type { UmbMemberVariantOptionModel } from '../types.js'; -import { UMB_MEMBER_WORKSPACE_CONTEXT } from './member-workspace.context.js'; +import { UMB_MEMBER_WORKSPACE_CONTEXT } from './member-workspace.context-token.js'; import { UmbMemberWorkspaceSplitViewElement } from './member-workspace-split-view.element.js'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace-split-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace-split-view.element.ts index 9258447709..648ffa6a62 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace-split-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace-split-view.element.ts @@ -1,4 +1,4 @@ -import { UMB_MEMBER_WORKSPACE_CONTEXT } from './member-workspace.context.js'; +import { UMB_MEMBER_WORKSPACE_CONTEXT } from './member-workspace.context-token.js'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { css, html, nothing, customElement, state, repeat } from '@umbraco-cms/backoffice/external/lit'; import type { ActiveVariant } from '@umbraco-cms/backoffice/workspace'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace.context-token.ts new file mode 100644 index 0000000000..a70bdcd274 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace.context-token.ts @@ -0,0 +1,12 @@ +import type { UmbMemberWorkspaceContext } from './member-workspace.context.js'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; +import type { UmbSaveableWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; + +export const UMB_MEMBER_WORKSPACE_CONTEXT = new UmbContextToken< + UmbSaveableWorkspaceContextInterface, + UmbMemberWorkspaceContext +>( + 'UmbWorkspaceContext', + undefined, + (context): context is UmbMemberWorkspaceContext => context.getEntityType?.() === 'member', +); diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace.context.ts index 714156d9d0..5afc5fff60 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace.context.ts @@ -2,14 +2,20 @@ import { UmbMemberDetailRepository } from '../repository/index.js'; import type { UmbMemberDetailModel, UmbMemberVariantModel, UmbMemberVariantOptionModel } from '../types.js'; import { UmbMemberPropertyDataContext } from '../property-dataset-context/member-property-dataset-context.js'; import { UMB_MEMBER_WORKSPACE_ALIAS } from './manifests.js'; +import { UmbMemberWorkspaceEditorElement } from './member-workspace-editor.element.js'; import { UmbMemberTypeDetailRepository } from '@umbraco-cms/backoffice/member-type'; -import { UmbEditableWorkspaceContextBase, UmbWorkspaceSplitViewManager } from '@umbraco-cms/backoffice/workspace'; +import { + UmbEditableWorkspaceContextBase, + UmbWorkspaceIsNewRedirectController, + UmbWorkspaceRouteManager, + UmbWorkspaceSplitViewManager, +} from '@umbraco-cms/backoffice/workspace'; import type { + UmbRoutableWorkspaceContext, UmbVariantableWorkspaceContextInterface, - UmbSaveableWorkspaceContextInterface, + UmbWorkspaceContextInterface, } from '@umbraco-cms/backoffice/workspace'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UmbArrayState, UmbObjectState, @@ -20,17 +26,21 @@ import { UmbContentTypeStructureManager } from '@umbraco-cms/backoffice/content- import { UMB_INVARIANT_CULTURE, UmbVariantId } from '@umbraco-cms/backoffice/variant'; import type { UmbLanguageDetailModel } from '@umbraco-cms/backoffice/language'; import { UmbLanguageCollectionRepository } from '@umbraco-cms/backoffice/language'; +import type { UmbDataSourceResponse } from '@umbraco-cms/backoffice/repository'; type EntityType = UmbMemberDetailModel; export class UmbMemberWorkspaceContext extends UmbEditableWorkspaceContextBase - implements UmbVariantableWorkspaceContextInterface + implements + UmbVariantableWorkspaceContextInterface, + UmbRoutableWorkspaceContext, + UmbWorkspaceContextInterface { public readonly repository = new UmbMemberDetailRepository(this); #persistedData = new UmbObjectState(undefined); #currentData = new UmbObjectState(undefined); - #getDataPromise?: Promise; + #getDataPromise?: Promise>; // TODo: Optimize this so it uses either a App Language Context? [NL] #languageRepository = new UmbLanguageCollectionRepository(this); @@ -57,6 +67,7 @@ export class UmbMemberWorkspaceContext readonly unique = this.#currentData.asObservablePart((data) => data?.unique); + readonly routes = new UmbWorkspaceRouteManager(this); readonly splitView = new UmbWorkspaceSplitViewManager(); readonly variantOptions = mergeObservables( @@ -97,6 +108,31 @@ export class UmbMemberWorkspaceContext this.observe(this.varies, (varies) => (this.#varies = varies)); this.loadLanguages(); + + this.routes.setRoutes([ + { + path: 'create/:memberTypeUnique', + component: () => new UmbMemberWorkspaceEditorElement(), + setup: async (_component, info) => { + const memberTypeUnique = info.match.params.memberTypeUnique; + this.create(memberTypeUnique); + + new UmbWorkspaceIsNewRedirectController( + this, + this, + this.getHostElement().shadowRoot!.querySelector('umb-router-slot')!, + ); + }, + }, + { + path: 'edit/:unique', + component: () => new UmbMemberWorkspaceEditorElement(), + setup: (_component, info) => { + const unique = info.match.params.unique; + this.load(unique); + }, + }, + ]); } resetState() { @@ -397,11 +433,4 @@ export class UmbMemberWorkspaceContext } } -export const UMB_MEMBER_WORKSPACE_CONTEXT = new UmbContextToken< - UmbSaveableWorkspaceContextInterface, - UmbMemberWorkspaceContext ->( - 'UmbWorkspaceContext', - undefined, - (context): context is UmbMemberWorkspaceContext => context.getEntityType?.() === 'member', -); +export { UmbMemberWorkspaceContext as api }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace.element.ts deleted file mode 100644 index 135a317080..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace.element.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { UmbMemberWorkspaceContext } from './member-workspace.context.js'; -import { UmbMemberWorkspaceEditorElement } from './member-workspace-editor.element.js'; -import { html, customElement } from '@umbraco-cms/backoffice/external/lit'; -import type { UmbRoute } from '@umbraco-cms/backoffice/router'; -import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; - -import { UmbWorkspaceIsNewRedirectController } from '@umbraco-cms/backoffice/workspace'; - -@customElement('umb-member-workspace') -export class UmbMemberWorkspaceElement extends UmbLitElement { - #workspaceContext = new UmbMemberWorkspaceContext(this); - #createElement = () => new UmbMemberWorkspaceEditorElement(); - - private _routes: UmbRoute[] = [ - { - path: 'create/:memberTypeUnique', - component: this.#createElement, - setup: (_component, info) => { - const memberTypeUnique = info.match.params.memberTypeUnique; - this.#workspaceContext.create(memberTypeUnique); - - new UmbWorkspaceIsNewRedirectController( - this, - this.#workspaceContext, - this.shadowRoot!.querySelector('umb-router-slot')!, - ); - }, - }, - { - path: 'edit/:unique', - component: this.#createElement, - setup: (_component, info) => { - const unique = info.match.params.unique; - this.#workspaceContext.load(unique); - }, - }, - ]; - - render() { - return html``; - } -} - -export default UmbMemberWorkspaceElement; - -declare global { - interface HTMLElementTagNameMap { - 'umb-member-workspace': UmbMemberWorkspaceElement; - } -} diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace.stories.ts deleted file mode 100644 index d8b2119972..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace.stories.ts +++ /dev/null @@ -1,18 +0,0 @@ -import './member-workspace.element.js'; - -import type { Meta, Story } from '@storybook/web-components'; - -import type { UmbMemberWorkspaceElement } from './member-workspace.element.js'; -import { html } from '@umbraco-cms/backoffice/external/lit'; - -export default { - title: 'Workspaces/Member', - component: 'umb-member-workspace', - id: 'umb-member-workspace', -} as Meta; - -export const AAAOverview: Story = () => - html` `; -AAAOverview.storyName = 'Overview'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/views/content/member-workspace-view-content-properties.element.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/views/content/member-workspace-view-content-properties.element.ts index 496d2c5f0e..bf068bb511 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/views/content/member-workspace-view-content-properties.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/views/content/member-workspace-view-content-properties.element.ts @@ -1,4 +1,4 @@ -import { UMB_MEMBER_WORKSPACE_CONTEXT } from '../../member-workspace.context.js'; +import { UMB_MEMBER_WORKSPACE_CONTEXT } from '../../member-workspace.context-token.js'; import { css, html, customElement, property, state, repeat } from '@umbraco-cms/backoffice/external/lit'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import type { UmbPropertyTypeModel } from '@umbraco-cms/backoffice/content-type'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/views/content/member-workspace-view-content-tab.element.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/views/content/member-workspace-view-content-tab.element.ts index d6dc176671..59bcdc1441 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/views/content/member-workspace-view-content-tab.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/views/content/member-workspace-view-content-tab.element.ts @@ -1,4 +1,4 @@ -import { UMB_MEMBER_WORKSPACE_CONTEXT } from '../../member-workspace.context.js'; +import { UMB_MEMBER_WORKSPACE_CONTEXT } from '../../member-workspace.context-token.js'; import { css, html, customElement, property, state, repeat } from '@umbraco-cms/backoffice/external/lit'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UmbContentTypeContainerStructureHelper } from '@umbraco-cms/backoffice/content-type'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/views/content/member-workspace-view-content.element.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/views/content/member-workspace-view-content.element.ts index e6cfb6657c..bf23d60129 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/views/content/member-workspace-view-content.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/views/content/member-workspace-view-content.element.ts @@ -1,4 +1,4 @@ -import { UMB_MEMBER_WORKSPACE_CONTEXT } from '../../member-workspace.context.js'; +import { UMB_MEMBER_WORKSPACE_CONTEXT } from '../../member-workspace.context-token.js'; import type { UmbMemberWorkspaceViewContentTabElement } from './member-workspace-view-content-tab.element.js'; import { css, html, customElement, state, repeat, nothing } from '@umbraco-cms/backoffice/external/lit'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/views/member/member-workspace-view-member.element.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/views/member/member-workspace-view-member.element.ts index 2750add3d8..abcf82c4fd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/views/member/member-workspace-view-member.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/views/member/member-workspace-view-member.element.ts @@ -1,5 +1,4 @@ -// import { UMB_COMPOSITION_PICKER_MODAL, type UmbCompositionPickerModalData } from '../../../modals/index.js'; -import { UMB_MEMBER_WORKSPACE_CONTEXT } from '../../member-workspace.context.js'; +import { UMB_MEMBER_WORKSPACE_CONTEXT } from '../../member-workspace.context-token.js'; import type { UmbMemberDetailModel } from '../../../types.js'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { css, html, customElement, state, when } from '@umbraco-cms/backoffice/external/lit';