member workspace

This commit is contained in:
Niels Lyngsø
2024-03-20 11:06:57 +01:00
parent 3f125a4b82
commit 27e36a4bb1
14 changed files with 72 additions and 95 deletions

View File

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

View File

@@ -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: '',

View File

@@ -1 +1,2 @@
export { UMB_MEMBER_WORKSPACE_ALIAS } from './manifests.js';
export { UMB_MEMBER_WORKSPACE_CONTEXT } from './member-workspace.context-token.js';

View File

@@ -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,
},

View File

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

View File

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

View File

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

View File

@@ -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<EntityType>
implements UmbVariantableWorkspaceContextInterface<UmbMemberVariantModel>
implements
UmbVariantableWorkspaceContextInterface<UmbMemberVariantModel>,
UmbRoutableWorkspaceContext,
UmbWorkspaceContextInterface
{
public readonly repository = new UmbMemberDetailRepository(this);
#persistedData = new UmbObjectState<EntityType | undefined>(undefined);
#currentData = new UmbObjectState<EntityType | undefined>(undefined);
#getDataPromise?: Promise<any>;
#getDataPromise?: Promise<UmbDataSourceResponse<UmbMemberDetailModel>>;
// 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 };

View File

@@ -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`<umb-router-slot .routes=${this._routes}></umb-router-slot>`;
}
}
export default UmbMemberWorkspaceElement;
declare global {
interface HTMLElementTagNameMap {
'umb-member-workspace': UmbMemberWorkspaceElement;
}
}

View File

@@ -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<UmbMemberWorkspaceElement> = () =>
html` <!--
<umb-member-workspace"></umb-member-workspace>
-->`;
AAAOverview.storyName = 'Overview';

View File

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

View File

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

View File

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

View File

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