From 727db04b2ef7308320098939c484613aff8b5b8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 25 Aug 2023 21:57:38 +0200 Subject: [PATCH] Mega refactor v.1 --- .../variant-selector.element.ts | 64 ++++----- .../content-type-structure-manager.class.ts | 38 +++++ .../property-editor-ui-block-grid.element.ts | 2 - .../src/packages/core/repositories/index.ts | 1 + .../core/repositories/repository.interface.ts | 12 ++ .../dataset-context.interface.ts | 31 +++++ .../dataset-context/dataset-context.token.ts | 4 + .../core/workspace/dataset-context/index.ts | 4 + .../variant-dataset-context.interface.ts | 10 ++ .../variant-dataset-context.token.ts | 7 + .../src/packages/core/workspace/index.ts | 3 +- .../core/workspace/workspace-context/index.ts | 6 +- ...y-structure-workspace-context.interface.ts | 8 ++ ...publishable-workspace-context.interface.ts | 7 + .../saveable-workspace-context.interface.ts | 7 + .../workspace-context.interface.ts | 24 ++-- .../workspace-context/workspace-context.ts | 6 +- .../workspace-entity-context.interface.ts | 8 -- ...ce-invariable-entity-context.interface.ts} | 8 +- ...space-variable-entity-context.interface.ts | 16 ++- .../workspace-property.context.ts | 12 +- .../core/workspace/workspace-variant/index.ts | 4 +- .../variantable-property.element.ts | 7 +- .../workspace-split-view.context.ts | 119 ++++++++++++++++ ...ent.ts => workspace-split-view.element.ts} | 21 ++- .../workspace-variant.context.ts | 131 ------------------ .../workspace/dictionary-workspace.context.ts | 6 +- .../document-type-workspace.context.ts | 6 +- .../document-dataset-context.ts | 99 +++++++++++++ .../document-workspace-editor.element.ts | 2 + .../document-workspace-split-view.element.ts | 8 +- .../workspace/document-workspace.context.ts | 93 +++++++------ .../workspace/media-type-workspace.context.ts | 6 +- .../workspace/media-workspace.context.ts | 6 +- .../member-group-workspace.context.ts | 6 +- .../member-type-workspace.context.ts | 6 +- .../workspace/member-workspace.context.ts | 6 +- .../workspace/data-type-workspace.context.ts | 6 +- .../language/language-workspace.context.ts | 6 +- .../relation-type-workspace.context.ts | 6 +- .../partial-view-workspace.context.ts | 6 +- .../workspace/stylesheet-workspace.context.ts | 6 +- .../workspace/template-workspace.context.ts | 6 +- .../workspace/user-group-workspace.context.ts | 6 +- .../users/workspace/user-workspace.context.ts | 6 +- 45 files changed, 537 insertions(+), 315 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/repositories/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/repositories/repository.interface.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/dataset-context.interface.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/dataset-context.token.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/variant-dataset-context.interface.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/variant-dataset-context.token.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/property-structure-workspace-context.interface.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/publishable-workspace-context.interface.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/saveable-workspace-context.interface.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-entity-context.interface.ts rename src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/{workspace-invariantable-entity-context.interface.ts => workspace-invariable-entity-context.interface.ts} (54%) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/workspace-split-view.context.ts rename src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/{workspace-variant.element.ts => workspace-split-view.element.ts} (67%) delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/workspace-variant.context.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/dataset-context/document-dataset-context.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/variant-selector/variant-selector.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/variant-selector/variant-selector.element.ts index 2afeed82b8..673dbcab97 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/variant-selector/variant-selector.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/variant-selector/variant-selector.element.ts @@ -1,8 +1,10 @@ +import { UmbVariantId } from '../../variant/variant-id.class.js'; import { UUITextStyles, UUIInputElement, UUIInputEvent } from '@umbraco-cms/backoffice/external/uui'; import { css, html, nothing, customElement, property, state, ifDefined } from '@umbraco-cms/backoffice/external/lit'; import { - UmbWorkspaceVariantContext, - UMB_WORKSPACE_VARIANT_CONTEXT_TOKEN, + UmbWorkspaceSplitViewContext, + UMB_WORKSPACE_SPLIT_VIEW_CONTEXT, + UMB_VARIANT_DATASET_CONTEXT, ActiveVariant, } from '@umbraco-cms/backoffice/workspace'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @@ -23,7 +25,8 @@ export class UmbVariantSelectorElement extends UmbLitElement { return this._activeVariants.map((el) => el.culture ?? '') ?? []; } - private _variantContext?: UmbWorkspaceVariantContext; + #splitViewContext?: UmbWorkspaceSplitViewContext; + #datasetContext?: typeof UMB_VARIANT_DATASET_CONTEXT.TYPE; @state() private _name?: string; @@ -43,18 +46,21 @@ export class UmbVariantSelectorElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_WORKSPACE_VARIANT_CONTEXT_TOKEN, (instance) => { - this._variantContext = instance; + this.consumeContext(UMB_WORKSPACE_SPLIT_VIEW_CONTEXT, (instance) => { + this.#splitViewContext = instance; this._observeVariants(); this._observeActiveVariants(); - this._observeVariantContext(); + }); + this.consumeContext(UMB_VARIANT_DATASET_CONTEXT, (instance) => { + this.#datasetContext = instance; + this._observeDatasetContext(); }); } private async _observeVariants() { - if (!this._variantContext) return; + if (!this.#splitViewContext) return; - const workspaceContext = this._variantContext.getWorkspaceContext(); + const workspaceContext = this.#splitViewContext.getWorkspaceContext(); if (workspaceContext) { this.observe( workspaceContext.variants, @@ -69,9 +75,9 @@ export class UmbVariantSelectorElement extends UmbLitElement { } private async _observeActiveVariants() { - if (!this._variantContext) return; + if (!this.#splitViewContext) return; - const workspaceContext = this._variantContext.getWorkspaceContext(); + const workspaceContext = this.#splitViewContext.getWorkspaceContext(); if (workspaceContext) { this.observe( workspaceContext.splitView.activeVariantsInfo, @@ -85,32 +91,21 @@ export class UmbVariantSelectorElement extends UmbLitElement { } } - private async _observeVariantContext() { - if (!this._variantContext) return; + private async _observeDatasetContext() { + if (!this.#datasetContext) return; + + const variantId = this.#datasetContext.getVariantId(); + this._culture = variantId.culture; + this._segment = variantId.segment; + this.updateVariantDisplayName(); this.observe( - this._variantContext.name, + this.#datasetContext.name, (name) => { this._name = name; }, '_name' ); - this.observe( - this._variantContext.culture, - (culture) => { - this._culture = culture; - this.updateVariantDisplayName(); - }, - '_culture' - ); - this.observe( - this._variantContext.segment, - (segment) => { - this._segment = segment; - this.updateVariantDisplayName(); - }, - '_segment' - ); } private updateVariantDisplayName() { @@ -128,8 +123,9 @@ export class UmbVariantSelectorElement extends UmbLitElement { const target = event.composedPath()[0] as UUIInputElement; if (typeof target?.value === 'string') { - // TODO: create a setName method on EntityWorkspace: - this._variantContext?.setName(target.value); + // TODO: Refactor: find a good way to mix these features... maybe we should request the context multiple times? or find a way to mix the discriminators? or a way to investigate the context for features? + alert("cannot set name currently.") + //this.#datasetContext?.setName(target.value); } } } @@ -146,17 +142,17 @@ export class UmbVariantSelectorElement extends UmbLitElement { } private _switchVariant(variant: DocumentVariantResponseModel) { - this._variantContext?.switchVariant(variant); + this.#splitViewContext?.switchVariant(UmbVariantId.Create(variant)); this._close(); } private _openSplitView(variant: DocumentVariantResponseModel) { - this._variantContext?.openSplitView(variant); + this.#splitViewContext?.openSplitView(UmbVariantId.Create(variant)); this._close(); } private _closeSplitView() { - this._variantContext?.closeSplitView(); + this.#splitViewContext?.closeSplitView(); } private _isVariantActive(culture: string) { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/content-type-structure-manager.class.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/content-type-structure-manager.class.ts index 815f59cd12..5256114c33 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/content-type-structure-manager.class.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/content-type-structure-manager.class.ts @@ -307,6 +307,44 @@ export class UmbContentTypePropertyStructureManager { + for (const docType of docTypes) { + const foundProp = docType.properties?.find((property) => property.id === propertyId); + if(foundProp) { + return foundProp; + } + } + return undefined; + }); + } + + async getPropertyStructureById(propertyId: string) { + await this.#init; + for (const docType of this.#documentTypes.getValue()) { + const foundProp = docType.properties?.find((property) => property.id === propertyId); + if(foundProp) { + return foundProp; + } + } + return undefined; + } + async getPropertyStructureByAlias(propertyAlias: string) { + await this.#init; + for (const docType of this.#documentTypes.getValue()) { + const foundProp = docType.properties?.find((property) => property.alias === propertyAlias); + if(foundProp) { + return foundProp; + } + } + return undefined; + } + + /* rootDocumentTypeName() { return this.#documentTypes.asObservablePart((docTypes) => { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/block-grid/property-editor-ui-block-grid.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/block-grid/property-editor-ui-block-grid.element.ts index 5f96bcb745..8a5c467731 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/block-grid/property-editor-ui-block-grid.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/block-grid/property-editor-ui-block-grid.element.ts @@ -1,4 +1,3 @@ -import { UMB_WORKSPACE_VARIANT_CONTEXT_TOKEN } from '../../../workspace/workspace-variant/workspace-variant.context.js'; import { UMB_WORKSPACE_PROPERTY_CONTEXT_TOKEN } from '../../../workspace/workspace-property/workspace-property.context.js'; import { html, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; @@ -13,7 +12,6 @@ import type { UmbDataTypeConfigCollection } from '@umbraco-cms/backoffice/compon */ @customElement('umb-property-editor-ui-block-grid') export class UmbPropertyEditorUIBlockGridElement extends UmbLitElement implements UmbPropertyEditorExtensionElement { - private _variantContext?: typeof UMB_WORKSPACE_VARIANT_CONTEXT_TOKEN.TYPE; @property() value = ''; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repositories/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repositories/index.ts new file mode 100644 index 0000000000..a7d3719d54 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repositories/index.ts @@ -0,0 +1 @@ +export * from './repository.interface.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repositories/repository.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repositories/repository.interface.ts new file mode 100644 index 0000000000..1ea5957a38 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repositories/repository.interface.ts @@ -0,0 +1,12 @@ +export interface UmbRepository { + + /** + * Get the type of the entity + * + * @public + * @type {EntityType} + * @returns undefined + */ + readonly ENTITY_TYPE: EntityType; + +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/dataset-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/dataset-context.interface.ts new file mode 100644 index 0000000000..d1aeb705e7 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/dataset-context.interface.ts @@ -0,0 +1,31 @@ +import { type Observable } from "@umbraco-cms/backoffice/external/rxjs"; + +/** + * Represents a set of properties. + * This can take form as many, so to list a few: + * - A specific variant of content + * - Content that does not vary + * - A block. + * - A DataType configuration. + * + * The base type of this holds a Name and some Properties. + * Some might be enriches with Variant Info, like culture and segment. + * Others might have saved publishing status. + * Also setting the name is an additional feature. + */ +export interface UmbDatasetContext { + + getType(): string; + getUnique(): string | undefined; + //getUniqueName(): string; + + getName(): string | undefined; + readonly name: Observable; + + destroy(): void; + + // Property methods: + propertyValueByAlias(propertyAlias: string): Promise | undefined>; + setPropertyValue(propertyAlias: string, value: unknown): Promise; + +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/dataset-context.token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/dataset-context.token.ts new file mode 100644 index 0000000000..50fca8b86b --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/dataset-context.token.ts @@ -0,0 +1,4 @@ +import { type UmbDatasetContext } from "./dataset-context.interface.js"; +import { UmbContextToken } from "@umbraco-cms/backoffice/context-api"; + +export const UMB_DATASET_CONTEXT = new UmbContextToken("UmbEntityContext"); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/index.ts new file mode 100644 index 0000000000..a173e9c8ba --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/index.ts @@ -0,0 +1,4 @@ +export * from './dataset-context.interface.js'; +export * from './dataset-context.token.js'; +export * from './variant-dataset-context.interface.js'; +export * from './variant-dataset-context.token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/variant-dataset-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/variant-dataset-context.interface.ts new file mode 100644 index 0000000000..7dcbc04497 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/variant-dataset-context.interface.ts @@ -0,0 +1,10 @@ +import { type UmbVariantId } from "../../variant/variant-id.class.js"; +import { UmbDatasetContext } from "./dataset-context.interface.js"; +import { type Observable } from "@umbraco-cms/backoffice/external/rxjs"; + + +export interface UmbVariantDatasetContext extends UmbDatasetContext { + + getVariantId(): UmbVariantId; + +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/variant-dataset-context.token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/variant-dataset-context.token.ts new file mode 100644 index 0000000000..d863de0aff --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/dataset-context/variant-dataset-context.token.ts @@ -0,0 +1,7 @@ +import { type UmbDatasetContext } from "./dataset-context.interface.js"; +import { UmbVariantDatasetContext } from "./variant-dataset-context.interface.js"; +import { UmbContextToken } from "@umbraco-cms/backoffice/context-api"; + +export const UMB_VARIANT_DATASET_CONTEXT = new UmbContextToken( + "UmbEntityContext", +(context): context is UmbVariantDatasetContext => 'getVariantId' in context); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/index.ts index 22cd49d585..d25134ee36 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/index.ts @@ -1,5 +1,7 @@ +export * from './dataset-context/index.js'; export * from './workspace-action-menu/index.js'; export * from './workspace-action/index.js'; +export * from './workspace-alias.condition.js'; export * from './workspace-context/index.js'; export * from './workspace-editor/index.js'; export * from './workspace-footer/index.js'; @@ -9,4 +11,3 @@ export * from './workspace-property-layout/workspace-property-layout.element.js' export * from './workspace-property/index.js'; export * from './workspace-split-view-manager.class.js'; export * from './workspace-variant/index.js'; -export * from './workspace-alias.condition.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/index.ts index 39790ef18e..b20e7ca65a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/index.ts @@ -1,7 +1,9 @@ export * from './entity-manager-controller.js'; export * from './workspace-context.js'; export * from './workspace-context.interface.js'; -export * from './workspace-entity-context.interface.js'; -export * from './workspace-invariantable-entity-context.interface.js'; +export * from './saveable-workspace-context.interface.js'; +export * from './publishable-workspace-context.interface.js'; +export * from './property-structure-workspace-context.interface.js'; +export * from './workspace-invariable-entity-context.interface.js'; export * from './workspace-variable-entity-context.interface.js'; export * from './workspace-context.token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/property-structure-workspace-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/property-structure-workspace-context.interface.ts new file mode 100644 index 0000000000..64fa491da9 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/property-structure-workspace-context.interface.ts @@ -0,0 +1,8 @@ +import type { UmbWorkspaceContextInterface } from './workspace-context.interface.js'; + +export interface UmbPropertyStructureWorkspaceContextInterface + extends UmbWorkspaceContextInterface { + + + +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/publishable-workspace-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/publishable-workspace-context.interface.ts new file mode 100644 index 0000000000..2c562b628d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/publishable-workspace-context.interface.ts @@ -0,0 +1,7 @@ +import type { UmbSaveableWorkspaceContextInterface } from './saveable-workspace-context.interface.js'; + +export interface UmbPublishableWorkspaceContextInterface + extends UmbSaveableWorkspaceContextInterface { + //getData(): EntityType | undefined; + publish(): Promise; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/saveable-workspace-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/saveable-workspace-context.interface.ts new file mode 100644 index 0000000000..289e233fa5 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/saveable-workspace-context.interface.ts @@ -0,0 +1,7 @@ +import type { UmbWorkspaceContextInterface } from './workspace-context.interface.js'; + +export interface UmbSaveableWorkspaceContextInterface + extends UmbWorkspaceContextInterface { + //getData(): EntityType | undefined; + save(): Promise; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-context.interface.ts index 2eaf8c53ac..d5aaceae55 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-context.interface.ts @@ -1,17 +1,25 @@ import { Observable } from '@umbraco-cms/backoffice/external/rxjs'; export interface UmbWorkspaceContextInterface { + destroy(): void; workspaceAlias: string; - repository: any; // TODO: add type + + save(): Promise; + // TODO: temp solution to bubble validation errors to the UI + setValidationErrors?(errorMap: any): void; + + getEntityId(): string | undefined; // Consider if this should go away now that we have getUnique() + // TODO: should we consider another name than entity type. File system files are not entities but still have this type. + getEntityType(): string; + isNew: Observable; getIsNew(): boolean | undefined; setIsNew(value: boolean): void; - getEntityId(): string | undefined; // COnsider if this should go away now that we have getUnique() - // TODO: should we consider another name than entity type. File system files are not entities but still have this type. - getEntityType(): string; + + /* + // TODO: Refactor: This could maybe go away: + repository: any; // TODO: add type getData(): DataType | undefined; - save(): Promise; - destroy(): void; - // TODO: temp solution to bubble validation errors to the UI - setValidationErrors?(errorMap: any): void; + */ + } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-context.ts index 9a332bf0e2..d96a6fd155 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-context.ts @@ -1,4 +1,4 @@ -import { UmbEntityWorkspaceContextInterface } from './workspace-entity-context.interface.js'; +import { UmbSaveableWorkspaceContextInterface } from './saveable-workspace-context.interface.js'; import { UmbBaseController, UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbBooleanState } from '@umbraco-cms/backoffice/observable-api'; import type { UmbEntityBase } from '@umbraco-cms/backoffice/models'; @@ -12,13 +12,13 @@ If so we need to align on a interface that all of these implements. otherwise co */ export abstract class UmbWorkspaceContext extends UmbBaseController - implements UmbEntityWorkspaceContextInterface + implements UmbSaveableWorkspaceContextInterface { public readonly host: UmbControllerHostElement; public readonly workspaceAlias: string; public readonly repository: RepositoryType; - // TODO: We could make a base type for workspace modal data, and use this here: As well as a base for the result, to make sure we always include the unique. + // TODO: We could make a base type for workspace modal data, and use this here: As well as a base for the result, to make sure we always include the unique (instead of the object type) public readonly modalContext?: UmbModalContext<{ preset: object }>; #isNew = new UmbBooleanState(undefined); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-entity-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-entity-context.interface.ts deleted file mode 100644 index 28c083c53c..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-entity-context.interface.ts +++ /dev/null @@ -1,8 +0,0 @@ -import type { UmbWorkspaceContextInterface } from './workspace-context.interface.js'; - -export interface UmbEntityWorkspaceContextInterface - extends UmbWorkspaceContextInterface { - getEntityType(): string; // TODO: consider of this should be on the repository because a repo is responsible for one entity type - //getData(): EntityType | undefined; - save(): Promise; -} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-invariantable-entity-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-invariable-entity-context.interface.ts similarity index 54% rename from src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-invariantable-entity-context.interface.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-invariable-entity-context.interface.ts index d36117b3ee..8ce5b98c49 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-invariantable-entity-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-invariable-entity-context.interface.ts @@ -1,13 +1,13 @@ -import type { UmbEntityWorkspaceContextInterface } from './workspace-entity-context.interface.js'; +import type { UmbSaveableWorkspaceContextInterface } from './saveable-workspace-context.interface.js'; import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; import type { ValueModelBaseModel } from '@umbraco-cms/backoffice/backend-api'; -export interface UmbWorkspaceInvariantableEntityContextInterface - extends UmbEntityWorkspaceContextInterface { +export interface UmbInvariableWorkspaceContextInterface + extends UmbSaveableWorkspaceContextInterface { getName(): void; setName(name: string): void; - propertyDataByAlias(alias: string): Observable; + propertyDataById(id: string): Observable; propertyValueByAlias(alias: string): Observable; getPropertyValue(alias: string): void; setPropertyValue(alias: string, value: unknown): void; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-variable-entity-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-variable-entity-context.interface.ts index a7f2da15ac..212e79229c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-variable-entity-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-context/workspace-variable-entity-context.interface.ts @@ -1,10 +1,12 @@ import type { UmbWorkspaceSplitViewManager } from '../workspace-split-view-manager.class.js'; -import type { UmbEntityWorkspaceContextInterface } from './workspace-entity-context.interface.js'; +import type { UmbDatasetContext } from '../dataset-context/dataset-context.interface.js'; +import type { UmbSaveableWorkspaceContextInterface } from './saveable-workspace-context.interface.js'; import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; -import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; +import type { UmbVariantId } from '@umbraco-cms/backoffice/variant'; import type { ValueModelBaseModel, VariantResponseModelBaseModel } from '@umbraco-cms/backoffice/backend-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -export interface UmbWorkspaceVariableEntityContextInterface extends UmbEntityWorkspaceContextInterface { +export interface UmbVariableWorkspaceContextInterface extends UmbSaveableWorkspaceContextInterface { variants: Observable>; splitView: UmbWorkspaceSplitViewManager; @@ -14,8 +16,14 @@ export interface UmbWorkspaceVariableEntityContextInterface extends getVariant(variantId: UmbVariantId): VariantResponseModelBaseModel | undefined; - propertyDataByAlias(alias: string, variantId?: UmbVariantId): Observable; + //propertyDataByAlias(alias: string, variantId?: UmbVariantId): Observable; + + // This one is async cause it needs to structure to provide this data: + propertyDataById(id: string): Promise>; propertyValueByAlias(alias: string, variantId?: UmbVariantId): Observable; getPropertyValue(alias: string, variantId?: UmbVariantId): void; setPropertyValue(alias: string, value: unknown, variantId?: UmbVariantId): void; + + // Dataset methods: + createVariableDatasetContext(host: UmbControllerHost, variantId: UmbVariantId): UmbDatasetContext; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-property/workspace-property.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-property/workspace-property.context.ts index ec25e1c418..4efd6c8128 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-property/workspace-property.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-property/workspace-property.context.ts @@ -1,7 +1,7 @@ -import { UmbWorkspaceVariableEntityContextInterface } from '../workspace-context/workspace-variable-entity-context.interface.js'; +import { UmbVariableWorkspaceContextInterface } from '../workspace-context/workspace-variable-entity-context.interface.js'; import { UmbPropertyEditorExtensionElement } from '../../extension-registry/interfaces/property-editor-ui-extension-element.interface.js'; import { type WorkspacePropertyData } from '../types/workspace-property-data.type.js'; -import { UMB_WORKSPACE_VARIANT_CONTEXT_TOKEN, UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; +import { UMB_WORKSPACE_SPLIT_VIEW_CONTEXT, UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { @@ -51,13 +51,13 @@ export class UmbWorkspacePropertyContext { private _variantDifference = new UmbStringState(undefined); public readonly variantDifference = this._variantDifference.asObservable(); - private _workspaceContext?: UmbWorkspaceVariableEntityContextInterface; - private _workspaceVariantConsumer?: UmbContextConsumerController; + private _workspaceContext?: UmbVariableWorkspaceContextInterface; + private _workspaceVariantConsumer?: UmbContextConsumerController; constructor(host: UmbControllerHostElement) { this.#host = host; new UmbContextConsumerController(host, UMB_WORKSPACE_CONTEXT, (workspaceContext) => { - this._workspaceContext = workspaceContext as UmbWorkspaceVariableEntityContextInterface; + this._workspaceContext = workspaceContext as UmbVariableWorkspaceContextInterface; }); this._providerController = new UmbContextProviderController(host, UMB_WORKSPACE_PROPERTY_CONTEXT_TOKEN, this); @@ -71,7 +71,7 @@ export class UmbWorkspacePropertyContext { if (!this._workspaceVariantConsumer) { this._workspaceVariantConsumer = new UmbContextConsumerController( this.#host, - UMB_WORKSPACE_VARIANT_CONTEXT_TOKEN, + UMB_WORKSPACE_SPLIT_VIEW_CONTEXT, (workspaceVariantContext) => { new UmbObserverController(this.#host, workspaceVariantContext.variantId, (workspaceVariantId) => { this.#workspaceVariantId = workspaceVariantId; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/index.ts index 3bc643d7aa..afbed12d8a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/index.ts @@ -1,3 +1,3 @@ export * from './variantable-property/variantable-property.element.js'; -export * from './workspace-variant.context.js'; -export * from './workspace-variant.element.js'; +export * from './workspace-split-view.context.js'; +export * from './workspace-split-view.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/variantable-property/variantable-property.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/variantable-property/variantable-property.element.ts index 8b93b55615..d8c622df56 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/variantable-property/variantable-property.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/variantable-property/variantable-property.element.ts @@ -1,4 +1,4 @@ -import { UMB_WORKSPACE_VARIANT_CONTEXT_TOKEN } from '../workspace-variant.context.js'; +import { UMB_WORKSPACE_SPLIT_VIEW_CONTEXT } from '../workspace-split-view.context.js'; import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; import { css, html, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; @@ -17,7 +17,7 @@ export class UmbVariantablePropertyElement extends UmbLitElement { this._updatePropertyVariantId(); } - private _variantContext?: typeof UMB_WORKSPACE_VARIANT_CONTEXT_TOKEN.TYPE; + private _variantContext?: typeof UMB_WORKSPACE_SPLIT_VIEW_CONTEXT.TYPE; @state() private _workspaceVariantId?: UmbVariantId; @@ -27,7 +27,8 @@ export class UmbVariantablePropertyElement extends UmbLitElement { constructor() { super(); - this.consumeContext(UMB_WORKSPACE_VARIANT_CONTEXT_TOKEN, (workspaceContext) => { + // TODO: Refactor: this could use the new DataSetContext: + this.consumeContext(UMB_WORKSPACE_SPLIT_VIEW_CONTEXT, (workspaceContext) => { this._variantContext = workspaceContext; this._observeVariantContext(); }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/workspace-split-view.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/workspace-split-view.context.ts new file mode 100644 index 0000000000..f080fb5916 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/workspace-split-view.context.ts @@ -0,0 +1,119 @@ +import { UmbVariableWorkspaceContextInterface } from '../workspace-context/workspace-variable-entity-context.interface.js'; +import { UMB_WORKSPACE_CONTEXT } from '../workspace-context/workspace-context.token.js'; +import { UmbDatasetContext } from '../dataset-context/index.js'; +import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; +import { + UmbContextToken, +} from '@umbraco-cms/backoffice/context-api'; +import { UmbBaseController, UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { + UmbClassState, + UmbNumberState, +} from '@umbraco-cms/backoffice/observable-api'; + + +export class UmbWorkspaceSplitViewContext extends UmbBaseController { + + #workspaceContext?: UmbVariableWorkspaceContextInterface; + public getWorkspaceContext() { + return this.#workspaceContext; + } + + // TODO: Refactor: use a variable data set context interface here. + #dataSetContext?: UmbDatasetContext; + + #index = new UmbNumberState(undefined); + index = this.#index.asObservable(); + + #variantId = new UmbClassState(undefined); + variantId = this.#variantId.asObservable(); + + constructor(host: UmbControllerHost) { + super(host); + + // TODO: Make a UMB_VARIANT_WORKSPACE_CONTEXT_TOKEN, and interface for such. + this.consumeContext(UMB_WORKSPACE_CONTEXT, (context) => { + this.#workspaceContext = context as UmbVariableWorkspaceContextInterface; + this._observeVariant(); + }); + + this.observe(this.#index, () => { + this._observeVariant(); + }); + + + this.provideContext(UMB_WORKSPACE_SPLIT_VIEW_CONTEXT, this); + } + + private _observeVariant() { + if (!this.#workspaceContext) return; + + const index = this.#index.getValue(); + if (index === undefined) return; + + // TODO: Should splitView be put into its own context?... a split view manager context? one which might have a reference to the workspace context, so we still can ask that about how to create the dataset context. + this.observe( + this.#workspaceContext.splitView.activeVariantByIndex(index), + async (activeVariantInfo) => { + if (!activeVariantInfo) return; + + // TODO: Ask workspace context to create the specific dataset. + + this.#dataSetContext?.destroy(); + const variantId = this.#variantId.getValue(); + if(variantId) { + this.#dataSetContext = this.#workspaceContext?.createVariableDatasetContext(this, UmbVariantId.Create(activeVariantInfo)); + } + }, + '_observeActiveVariant' + ); + } + + + public switchVariant(variant: UmbVariantId) { + const index = this.#index.value; + if (index === undefined) return; + this.#workspaceContext?.splitView.switchVariant(index, variant); + } + + public closeSplitView() { + const index = this.#index.value; + if (index === undefined) return; + this.#workspaceContext?.splitView.closeSplitView(index); + } + + public openSplitView(variant: UmbVariantId) { + this.#workspaceContext?.splitView.openSplitView(variant); + } + + public changeVariant(culture: string | null, segment: string | null) { + const index = this.#index.getValue(); + if (index === undefined) return; + this.#workspaceContext?.splitView.setActiveVariant(index, culture, segment); + } + + public getSplitViewIndex() { + return this.#index.getValue(); + } + public setSplitViewIndex(index: number) { + this.#index.next(index); + } + + + + + /** + * + * concept this class could have methods to set and get the culture and segment of the active variant? just by using the index. + */ + + /* + public destroy(): void { + + } + */ +} + +export const UMB_WORKSPACE_SPLIT_VIEW_CONTEXT = new UmbContextToken( + 'umbWorkspaceSplitViewContext' +); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/workspace-variant.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/workspace-split-view.element.ts similarity index 67% rename from src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/workspace-variant.element.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/workspace-split-view.element.ts index e73ccd6551..444274f81e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/workspace-variant.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/workspace-split-view.element.ts @@ -1,6 +1,6 @@ -import { UmbWorkspaceVariantContext } from './workspace-variant.context.js'; +import { UmbWorkspaceSplitViewContext } from './workspace-split-view.context.js'; import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; -import { css, html, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; +import { css, html, customElement, property } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; /** @@ -9,8 +9,8 @@ import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; * As well breadcrumbs etc. * */ -@customElement('umb-workspace-variant') -export class UmbWorkspaceVariantContentElement extends UmbLitElement { +@customElement('umb-workspace-split-view') +export class UmbWorkspaceSplitViewElement extends UmbLitElement { // TODO: stop prop drilling this alias. Instead use the workspace context. @property() alias!: string; @@ -20,19 +20,14 @@ export class UmbWorkspaceVariantContentElement extends UmbLitElement { @property({ type: Number }) public set splitViewIndex(index: number) { - this._splitViewIndex = index; - this.variantContext.setSplitViewIndex(index); + this.splitViewContext.setSplitViewIndex(index); } - @state() - private _splitViewIndex = 0; - - variantContext = new UmbWorkspaceVariantContext(this); + splitViewContext = new UmbWorkspaceSplitViewContext(this); render() { return html` @@ -67,10 +62,10 @@ export class UmbWorkspaceVariantContentElement extends UmbLitElement { ]; } -export default UmbWorkspaceVariantContentElement; +export default UmbWorkspaceSplitViewElement; declare global { interface HTMLElementTagNameMap { - 'umb-workspace-variant': UmbWorkspaceVariantContentElement; + 'umb-workspace-split-view': UmbWorkspaceSplitViewElement; } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/workspace-variant.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/workspace-variant.context.ts deleted file mode 100644 index 723ef79d03..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/workspace-variant/workspace-variant.context.ts +++ /dev/null @@ -1,131 +0,0 @@ -import { UmbWorkspaceVariableEntityContextInterface } from '../workspace-context/workspace-variable-entity-context.interface.js'; -import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; -import { - UmbContextConsumerController, - UmbContextProviderController, - UmbContextToken, -} from '@umbraco-cms/backoffice/context-api'; -import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; -import { - UmbClassState, - UmbNumberState, - UmbObjectState, - UmbObserverController, -} from '@umbraco-cms/backoffice/observable-api'; -import { DocumentVariantResponseModel } from '@umbraco-cms/backoffice/backend-api'; - -//type EntityType = DocumentModel; - -export class UmbWorkspaceVariantContext { - #host: UmbControllerHostElement; - - #workspaceContext?: UmbWorkspaceVariableEntityContextInterface; - public getWorkspaceContext() { - return this.#workspaceContext; - } - - #index = new UmbNumberState(undefined); - index = this.#index.asObservable(); - - #currentVariant = new UmbObjectState(undefined); - currentVariant = this.#currentVariant.asObservable(); - - name = this.#currentVariant.asObservablePart((x) => x?.name); - culture = this.#currentVariant.asObservablePart((x) => x?.culture); - segment = this.#currentVariant.asObservablePart((x) => x?.segment); - - #variantId = new UmbClassState(undefined); - variantId = this.#variantId.asObservable(); - - constructor(host: UmbControllerHostElement) { - this.#host = host; - - new UmbContextProviderController(host, UMB_WORKSPACE_VARIANT_CONTEXT_TOKEN.toString(), this); - - // How do we ensure this connects to a document workspace context? and not just any other context? (We could start providing workspace contexts twice, under the general name and under a specific name) - // TODO: Figure out if this is the best way to consume the context or if it can be strongly typed with an UmbContextToken - new UmbContextConsumerController(host, UMB_WORKSPACE_CONTEXT, (context) => { - this.#workspaceContext = context as UmbWorkspaceVariableEntityContextInterface; - this._observeVariant(); - }); - - new UmbObserverController(host, this.#index, () => { - this._observeVariant(); - }); - } - - public switchVariant(variant: DocumentVariantResponseModel) { - const index = this.#index.value; - if (index === undefined) return; - this.#workspaceContext?.splitView.switchVariant(index, new UmbVariantId(variant)); - } - - public closeSplitView() { - const index = this.#index.value; - if (index === undefined) return; - this.#workspaceContext?.splitView.closeSplitView(index); - } - - public openSplitView(variant: DocumentVariantResponseModel) { - this.#workspaceContext?.splitView.openSplitView(new UmbVariantId(variant)); - } - - private _setVariantId(variantId: UmbVariantId) { - this.#variantId.next(variantId); - return variantId; - } - - private _observeVariant() { - if (!this.#workspaceContext) return; - - const index = this.#index.getValue(); - if (index === undefined) return; - - new UmbObserverController( - this.#host, - this.#workspaceContext.splitView.activeVariantByIndex(index), - async (activeVariantInfo) => { - if (!activeVariantInfo) return; - const variantId = this._setVariantId(UmbVariantId.Create(activeVariantInfo)); - const currentVariant = await this.#workspaceContext?.getVariant(variantId); - this.#currentVariant.next(currentVariant); - }, - '_observeActiveVariant' - ); - } - - public changeVariant(culture: string | null, segment: string | null) { - const index = this.#index.getValue(); - if (index === undefined) return; - this.#workspaceContext?.splitView.setActiveVariant(index, culture, segment); - } - - public getSplitViewIndex() { - return this.#index.getValue(); - } - public setSplitViewIndex(index: number) { - this.#index.next(index); - } - - public setName(newName: string) { - const variantId = this.#variantId.getValue(); - if (!this.#workspaceContext || !variantId) return; - this.#workspaceContext.setName(newName, variantId); - } - - /** - * - * concept this class could have methods to set and get the culture and segment of the active variant? just by using the index. - */ - - /* - public destroy(): void { - - } - */ -} - -export const UMB_WORKSPACE_VARIANT_CONTEXT_TOKEN = new UmbContextToken( - 'umbWorkspaceVariantContext' -); diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/workspace/dictionary-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/workspace/dictionary-workspace.context.ts index 65a134993d..2990d526eb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/workspace/dictionary-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/dictionary/workspace/dictionary-workspace.context.ts @@ -1,5 +1,5 @@ import { UmbDictionaryRepository } from '../repository/dictionary.repository.js'; -import { UmbEntityWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; +import { UmbSaveableWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; import { DictionaryItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; @@ -7,7 +7,7 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; export class UmbDictionaryWorkspaceContext extends UmbWorkspaceContext - implements UmbEntityWorkspaceContextInterface + implements UmbSaveableWorkspaceContextInterface { #data = new UmbObjectState(undefined); data = this.#data.asObservable(); @@ -86,7 +86,7 @@ export class UmbDictionaryWorkspaceContext } -export const UMB_DICTIONARY_WORKSPACE_CONTEXT = new UmbContextToken( +export const UMB_DICTIONARY_WORKSPACE_CONTEXT = new UmbContextToken( 'UmbWorkspaceContext', (context): context is UmbDictionaryWorkspaceContext => context.getEntityType?.() === 'dictionary-item' ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type-workspace.context.ts index 28582fa254..4cc9b70c01 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type-workspace.context.ts @@ -1,6 +1,6 @@ import { UmbDocumentTypeRepository } from '../repository/document-type.repository.js'; import { UmbContentTypePropertyStructureManager } from '@umbraco-cms/backoffice/content-type'; -import { UmbWorkspaceContext, UmbEntityWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; +import { UmbWorkspaceContext, UmbSaveableWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; import type { ContentTypeCompositionModel, ContentTypeSortModel, @@ -12,7 +12,7 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; type EntityType = DocumentTypeResponseModel; export class UmbDocumentTypeWorkspaceContext extends UmbWorkspaceContext - implements UmbEntityWorkspaceContextInterface + implements UmbSaveableWorkspaceContextInterface { // Draft is located in structure manager @@ -157,7 +157,7 @@ export class UmbDocumentTypeWorkspaceContext } -export const UMB_DOCUMENT_TYPE_WORKSPACE_CONTEXT = new UmbContextToken( +export const UMB_DOCUMENT_TYPE_WORKSPACE_CONTEXT = new UmbContextToken( 'UmbWorkspaceContext', (context): context is UmbDocumentTypeWorkspaceContext => context.getEntityType?.() === 'document-type' ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/dataset-context/document-dataset-context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/dataset-context/document-dataset-context.ts new file mode 100644 index 0000000000..a6870731af --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/dataset-context/document-dataset-context.ts @@ -0,0 +1,99 @@ +import { UmbDocumentWorkspaceContext } from "../workspace/index.js"; +import { DocumentVariantResponseModel, PropertyTypeModelBaseModel } from "@umbraco-cms/backoffice/backend-api"; +import { UmbBaseController, UmbControllerHost } from "@umbraco-cms/backoffice/controller-api"; +import { UmbObjectState } from "@umbraco-cms/backoffice/observable-api"; +import { UmbVariantId } from "@umbraco-cms/backoffice/variant"; +import { UMB_DATASET_CONTEXT, UmbVariantDatasetContext } from "@umbraco-cms/backoffice/workspace"; + +export class UmbDocumentDatasetContext extends UmbBaseController implements UmbVariantDatasetContext { + + #workspace: UmbDocumentWorkspaceContext; + #variantId: UmbVariantId; + public getVariantId() { + return this.#variantId; + } + + #currentVariant = new UmbObjectState(undefined); + currentVariant = this.#currentVariant.asObservable(); + + name = this.#currentVariant.asObservablePart((x) => x?.name); + culture = this.#currentVariant.asObservablePart((x) => x?.culture); + segment = this.#currentVariant.asObservablePart((x) => x?.segment); + + + getType(): string { + return this.#workspace.getEntityType(); + } + getUnique(): string | undefined { + return this.#workspace.getEntityId(); + } + getName(): string | undefined { + return this.#workspace.getName(this.#variantId); + } + setName(name: string) { + this.#workspace.setName(name, this.#variantId); + } + getVariantInfo() { + return this.#workspace.getVariant(this.#variantId); + } + + + + constructor(host: UmbControllerHost, workspace: UmbDocumentWorkspaceContext, variantId: UmbVariantId) { + // The controller alias, is a very generic name cause we want only one of these for this controller host. + super(host, 'dataSetContext'); + this.#workspace = workspace; + this.#variantId = variantId; + + this.observe( + this.#workspace.variantById(this.#variantId), + async (variantInfo) => { + if (!variantInfo) return; + this.#currentVariant.next(variantInfo); + }, + '_observeActiveVariant' + ); + + // TODO: Refactor: use the document dataset context token. + this.provideContext(UMB_DATASET_CONTEXT, this); + } + + + #createPropertyVariantId(property:PropertyTypeModelBaseModel) { + return UmbVariantId.Create({ + culture: property.variesByCulture ? this.#variantId.culture : null, + segment: property.variesBySegment ? this.#variantId.segment : null, + }); + } + + /** + * TODO: Write proper JSDocs here. + * Ideally do not use these methods, its better to communicate directly with the workspace, but if you do not know the property variant id, then this will figure it out for you. So good for externals to set or get values of a property. + */ + async propertyValueByAlias(propertyAlias: string) { + // This is not reacting to if the property variant settings changes while running. + const property = await this.#workspace.structure.getPropertyStructureByAlias(propertyAlias); + if(property) { + const variantId = this.#createPropertyVariantId(property); + if(property.alias) { + return this.#workspace.propertyValueByAlias(property.alias, variantId); + } + } + return undefined; + } + + /** + * TODO: Write proper JSDocs here. + * Ideally do not use these methods, its better to communicate directly with the workspace, but if you do not know the property variant id, then this will figure it out for you. So good for externals to set or get values of a property. + */ + async setPropertyValue(propertyAlias: string, value: unknown) { + // This is not reacting to if the property variant settings changes while running. + const property = await this.#workspace.structure.getPropertyStructureByAlias(propertyAlias); + if(property) { + const variantId = this.#createPropertyVariantId(property); + + // This is not reacting to if the property variant settings changes while running. + this.#workspace.setPropertyValue(propertyAlias, value, variantId); + } + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-editor.element.ts index 03a0a78f2c..2caf004dae 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-editor.element.ts @@ -10,6 +10,8 @@ import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-document-workspace-editor') export class UmbDocumentWorkspaceEditorElement extends UmbLitElement { //private _defaultVariant?: VariantViewModelBaseModel; + + // TODO: Refactor: when having a split view/variants context token, we can rename the split view/variants component to a generic and make this component generic as well. private splitViewElement = new UmbDocumentWorkspaceSplitViewElement(); @state() diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-split-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-split-view.element.ts index 3b53f112e6..4b9f8e91dd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-split-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-split-view.element.ts @@ -5,11 +5,9 @@ import { ActiveVariant } from '@umbraco-cms/backoffice/workspace'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-document-workspace-split-view') export class UmbDocumentWorkspaceSplitViewElement extends UmbLitElement { + // TOOD: Refactor: use the split view context token: private _workspaceContext?: typeof UMB_DOCUMENT_WORKSPACE_CONTEXT.TYPE; - @state() - _unique?: string; - @state() _variants?: Array; @@ -41,10 +39,10 @@ export class UmbDocumentWorkspaceSplitViewElement extends UmbLitElement { (view) => view.index + '_' + (view.culture ?? '') + '_' + (view.segment ?? '') + '_' + this._variants!.length, (view) => html` - + .displayNavigation=${view.index === this._variants!.length - 1}> ` )} 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 f893bbc8e9..a01aadcab0 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 @@ -1,12 +1,14 @@ import { UmbDocumentRepository } from '../repository/document.repository.js'; import { UmbDocumentTypeRepository } from '../../document-types/repository/document-type.repository.js'; -import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; +import { UmbDocumentDatasetContext } from '../dataset-context/document-dataset-context.js'; +import { type UmbVariantId } from '@umbraco-cms/backoffice/variant'; import { UmbContentTypePropertyStructureManager } from '@umbraco-cms/backoffice/content-type'; import { - UmbEntityWorkspaceContextInterface, + UmbSaveableWorkspaceContextInterface, UmbWorkspaceContext, UmbWorkspaceSplitViewManager, - UmbWorkspaceVariableEntityContextInterface, + UmbVariableWorkspaceContextInterface, + type UmbDatasetContext, } from '@umbraco-cms/backoffice/workspace'; import type { CreateDocumentRequestModel, DocumentResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { @@ -15,8 +17,9 @@ import { UmbObjectState, UmbObserverController, } from '@umbraco-cms/backoffice/observable-api'; -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import { UmbControllerHost, UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; +import { Observable } from '@umbraco-cms/backoffice/external/rxjs'; // 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? @@ -24,25 +27,25 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; type EntityType = DocumentResponseModel; export class UmbDocumentWorkspaceContext extends UmbWorkspaceContext - implements UmbWorkspaceVariableEntityContextInterface + implements UmbVariableWorkspaceContextInterface { /** * The document is the current stored version of the document. * For now lets not share this publicly as it can become confusing. - * TODO: Use this to compare, for variants with changes. + * TODO: This concept is to be able to compare if there is changes since the saved one. */ - #document = new UmbObjectState(undefined); + //#persistedData = new UmbObjectState(undefined); /** * The document is the current state/draft version of the document. */ - #draft = new UmbObjectState(undefined); - readonly unique = this.#draft.asObservablePart((data) => data?.id); - readonly documentTypeKey = this.#draft.asObservablePart((data) => data?.contentTypeId); + #currentData = new UmbObjectState(undefined); + readonly unique = this.#currentData.asObservablePart((data) => data?.id); + readonly documentTypeKey = this.#currentData.asObservablePart((data) => data?.contentTypeId); - readonly variants = this.#draft.asObservablePart((data) => data?.variants || []); - readonly urls = this.#draft.asObservablePart((data) => data?.urls || []); - readonly templateId = this.#draft.asObservablePart((data) => data?.templateId || null); + readonly variants = this.#currentData.asObservablePart((data) => data?.variants || []); + readonly urls = this.#currentData.asObservablePart((data) => data?.urls || []); + readonly templateId = this.#currentData.asObservablePart((data) => data?.templateId || null); readonly structure; readonly splitView; @@ -65,8 +68,8 @@ export class UmbDocumentWorkspaceContext if (!data) return undefined; this.setIsNew(false); - this.#document.next(data); - this.#draft.next(data); + //this.#persisted.next(data); + this.#currentData.next(data); return data || undefined; } @@ -75,13 +78,12 @@ export class UmbDocumentWorkspaceContext if (!data) return undefined; this.setIsNew(true); - this.#document.next(data); - this.#draft.next(data); + this.#currentData.next(data); return data || undefined; } getData() { - return this.#draft.getValue() || {}; + return this.#currentData.getValue() || {}; } /* @@ -102,12 +104,16 @@ export class UmbDocumentWorkspaceContext return this.getData().contentTypeId; } + variantById(variantId: UmbVariantId) { + return this.#currentData.asObservablePart((data) => data?.variants?.find((x) => variantId.compare(x))); + } + getVariant(variantId: UmbVariantId) { - return this.#draft.getValue()?.variants?.find((x) => variantId.compare(x)); + return this.#currentData.getValue()?.variants?.find((x) => variantId.compare(x)); } getName(variantId?: UmbVariantId) { - const variants = this.#draft.getValue()?.variants; + const variants = this.#currentData.getValue()?.variants; if (!variants) return; if (variantId) { return variants.find((x) => variantId.compare(x))?.name; @@ -117,67 +123,61 @@ export class UmbDocumentWorkspaceContext } setName(name: string, variantId?: UmbVariantId) { - const oldVariants = this.#draft.getValue()?.variants || []; + const oldVariants = this.#currentData.getValue()?.variants || []; const variants = partialUpdateFrozenArray( oldVariants, { name }, variantId ? (x) => variantId.compare(x) : () => true ); - this.#draft.update({ variants }); + this.#currentData.update({ variants }); } - propertyValuesOf(variantId?: UmbVariantId) { - return this.#draft.asObservablePart((data) => - variantId ? data?.values?.filter((x) => variantId.compare(x)) : data?.values - ); + propertyDataById(propertyId: string) { + return this.structure.propertyStructureById(propertyId); } - propertyDataByAlias(propertyAlias: string, variantId?: UmbVariantId) { - return this.#draft.asObservablePart((data) => - data?.values?.find((x) => x?.alias === propertyAlias && (variantId ? variantId.compare(x) : true)) - ); - } - propertyValueByAlias(propertyAlias: string, variantId?: UmbVariantId) { - return this.#draft.asObservablePart( + propertyValueByAlias(propertyAlias: string, variantId?: UmbVariantId): Observable { + return this.#currentData.asObservablePart( (data) => data?.values?.find((x) => x?.alias === propertyAlias && (variantId ? variantId.compare(x) : true))?.value ); } - getPropertyValue(alias: string, variantId?: UmbVariantId): void { - const currentData = this.#draft.value; + getPropertyValue(alias: string, variantId?: UmbVariantId): PropertyValueType | undefined { + const currentData = this.#currentData.value; if (currentData) { const newDataSet = currentData.values?.find( (x) => x.alias === alias && (variantId ? variantId.compare(x) : true) ); return newDataSet?.value; } + return undefined; } - setPropertyValue(alias: string, value: unknown, variantId?: UmbVariantId) { + setPropertyValue(alias: string, value: PropertyValueType, variantId?: UmbVariantId) { const entry = { ...variantId?.toObject(), alias, value }; - const currentData = this.#draft.value; + const currentData = this.#currentData.value; if (currentData) { const values = appendToFrozenArray( currentData.values || [], entry, (x) => x.alias === alias && (variantId ? variantId.compare(x) : true) ); - this.#draft.update({ values }); + this.#currentData.update({ values }); } } async save() { - if (!this.#draft.value) return; - if (!this.#draft.value.id) return; + if (!this.#currentData.value) return; + if (!this.#currentData.value.id) return; if (this.getIsNew()) { // TODO: typescript hack until we get the create type - const value = this.#draft.value as CreateDocumentRequestModel & { id: string }; + const value = this.#currentData.value as CreateDocumentRequestModel & { id: string }; if ((await this.repository.create(value)).data !== undefined) { this.setIsNew(false); } } else { - await this.repository.save(this.#draft.value.id, this.#draft.value); + await this.repository.save(this.#currentData.value.id, this.#currentData.value); } this.saveComplete(this.getData()); @@ -199,8 +199,12 @@ export class UmbDocumentWorkspaceContext } */ + public createVariableDatasetContext(host: UmbControllerHost, variantId: UmbVariantId): UmbDatasetContext { + return new UmbDocumentDatasetContext(host, this, variantId); + } + public destroy(): void { - this.#draft.complete(); + this.#currentData.complete(); this.structure.destroy(); super.destroy(); } @@ -209,7 +213,8 @@ export class UmbDocumentWorkspaceContext export default UmbDocumentWorkspaceContext; -export const UMB_DOCUMENT_WORKSPACE_CONTEXT = new UmbContextToken( +export const UMB_DOCUMENT_WORKSPACE_CONTEXT = new UmbContextToken( 'UmbWorkspaceContext', + // TODO: Refactor: make a better generic way to identify workspaces, maybe workspaceType or workspaceAlias?. (context): context is UmbDocumentWorkspaceContext => context.getEntityType?.() === 'document' ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/media-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/media-type-workspace.context.ts index af3dc52196..89d0e4568a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/media-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/media-type-workspace.context.ts @@ -1,6 +1,6 @@ import { UmbMediaTypeRepository } from '../repository/media-type.repository.js'; import type { MediaTypeDetails } from '../types.js'; -import { UmbEntityWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; +import { UmbSaveableWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; @@ -8,7 +8,7 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; type EntityType = MediaTypeDetails; export class UmbMediaTypeWorkspaceContext extends UmbWorkspaceContext - implements UmbEntityWorkspaceContextInterface + implements UmbSaveableWorkspaceContextInterface { #data = new UmbObjectState(undefined); data = this.#data.asObservable(); @@ -64,7 +64,7 @@ export class UmbMediaTypeWorkspaceContext } -export const UMB_MEDIA_TYPE_WORKSPACE_CONTEXT = new UmbContextToken( +export const UMB_MEDIA_TYPE_WORKSPACE_CONTEXT = new UmbContextToken( 'UmbWorkspaceContext', (context): context is UmbMediaTypeWorkspaceContext => context.getEntityType?.() === 'media-type' ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/media-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/media-workspace.context.ts index be6dc2a30c..8d5148c25b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/media-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/media-workspace.context.ts @@ -1,6 +1,6 @@ import { UmbMediaRepository } from '../repository/media.repository.js'; import type { MediaDetails } from '../index.js'; -import { UmbEntityWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; +import { UmbSaveableWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import { appendToFrozenArray, UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; @@ -8,7 +8,7 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; type EntityType = MediaDetails; export class UmbMediaWorkspaceContext extends UmbWorkspaceContext - implements UmbEntityWorkspaceContextInterface + implements UmbSaveableWorkspaceContextInterface { #data = new UmbObjectState(undefined); data = this.#data.asObservable(); @@ -83,7 +83,7 @@ export class UmbMediaWorkspaceContext } } -export const UMB_MEDIA_WORKSPACE_CONTEXT = new UmbContextToken( +export const UMB_MEDIA_WORKSPACE_CONTEXT = new UmbContextToken( 'UmbWorkspaceContext', (context): context is UmbMediaWorkspaceContext => context.getEntityType?.() === 'media' ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/workspace/member-group-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/workspace/member-group-workspace.context.ts index 3de2301159..73ae447b63 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/workspace/member-group-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-groups/workspace/member-group-workspace.context.ts @@ -1,6 +1,6 @@ import { UmbMemberGroupRepository } from '../repository/member-group.repository.js'; import type { MemberGroupDetails } from '../types.js'; -import { UmbEntityWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; +import { UmbSaveableWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; @@ -8,7 +8,7 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; type EntityType = MemberGroupDetails; export class UmbMemberGroupWorkspaceContext extends UmbWorkspaceContext - implements UmbEntityWorkspaceContextInterface + implements UmbSaveableWorkspaceContextInterface { #data = new UmbObjectState(undefined); data = this.#data.asObservable(); @@ -67,7 +67,7 @@ export class UmbMemberGroupWorkspaceContext -export const UMB_MEMBER_GROUP_WORKSPACE_CONTEXT = new UmbContextToken( +export const UMB_MEMBER_GROUP_WORKSPACE_CONTEXT = new UmbContextToken( 'UmbWorkspaceContext', (context): context is UmbMemberGroupWorkspaceContext => context.getEntityType?.() === 'member-group' ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-types/workspace/member-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-types/workspace/member-type-workspace.context.ts index 89d557f61c..49994e0df6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-types/workspace/member-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-types/workspace/member-type-workspace.context.ts @@ -1,5 +1,5 @@ import { UmbMemberTypeRepository } from '../repository/member-type.repository.js'; -import { UmbEntityWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; +import { UmbSaveableWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; @@ -9,7 +9,7 @@ type EntityType = any; export class UmbMemberTypeWorkspaceContext extends UmbWorkspaceContext - implements UmbEntityWorkspaceContextInterface + implements UmbSaveableWorkspaceContextInterface { #data = new UmbObjectState(undefined); name = this.#data.asObservablePart((data) => data?.name); @@ -75,7 +75,7 @@ export class UmbMemberTypeWorkspaceContext } } -export const UMB_MEMBER_TYPE_WORKSPACE_CONTEXT = new UmbContextToken( +export const UMB_MEMBER_TYPE_WORKSPACE_CONTEXT = new UmbContextToken( 'UmbWorkspaceContext', (context): context is UmbMemberTypeWorkspaceContext => context.getEntityType?.() === 'member-type' ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/members/workspace/member-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/members/members/workspace/member-workspace.context.ts index 20aecf8e28..17804d541f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/members/workspace/member-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/members/workspace/member-workspace.context.ts @@ -1,12 +1,12 @@ import { UmbMemberRepository } from '../repository/member.repository.js'; import type { MemberDetails } from '../types.js'; -import { UmbEntityWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; +import { UmbSaveableWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; export class UmbMemberWorkspaceContext extends UmbWorkspaceContext - implements UmbEntityWorkspaceContextInterface + implements UmbSaveableWorkspaceContextInterface { constructor(host: UmbControllerHostElement) { super(host, 'Umb.Workspace.Member', new UmbMemberRepository(host)); @@ -37,7 +37,7 @@ export class UmbMemberWorkspaceContext } } -export const UMB_MEMBER_WORKSPACE_CONTEXT = new UmbContextToken( +export const UMB_MEMBER_WORKSPACE_CONTEXT = new UmbContextToken( 'UmbWorkspaceContext', (context): context is UmbMemberWorkspaceContext => context.getEntityType?.() === 'member' ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.context.ts index 4019f99469..ed2733d10c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/data-types/workspace/data-type-workspace.context.ts @@ -1,5 +1,5 @@ import { UmbDataTypeRepository } from '../repository/data-type.repository.js'; -import { UmbEntityWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; +import { UmbSaveableWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import type { DataTypeResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { appendToFrozenArray, UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; @@ -7,7 +7,7 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; export class UmbDataTypeWorkspaceContext extends UmbWorkspaceContext - implements UmbEntityWorkspaceContextInterface + implements UmbSaveableWorkspaceContextInterface { // TODO: revisit. temp solution because the create and response models are different. #data = new UmbObjectState(undefined); @@ -97,7 +97,7 @@ export class UmbDataTypeWorkspaceContext } } -export const UMB_DATA_TYPE_WORKSPACE_CONTEXT = new UmbContextToken( +export const UMB_DATA_TYPE_WORKSPACE_CONTEXT = new UmbContextToken( 'UmbWorkspaceContext', (context): context is UmbDataTypeWorkspaceContext => context.getEntityType?.() === 'data-type' ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/languages/workspace/language/language-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/languages/workspace/language/language-workspace.context.ts index 1b8609c9b1..b749c5f662 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/languages/workspace/language/language-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/languages/workspace/language/language-workspace.context.ts @@ -1,5 +1,5 @@ import { UmbLanguageRepository } from '../../repository/language.repository.js'; -import { UmbEntityWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; +import { UmbSaveableWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import { ApiError, LanguageResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; @@ -7,7 +7,7 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; export class UmbLanguageWorkspaceContext extends UmbWorkspaceContext - implements UmbEntityWorkspaceContextInterface + implements UmbSaveableWorkspaceContextInterface { #data = new UmbObjectState(undefined); data = this.#data.asObservable(); @@ -103,7 +103,7 @@ export class UmbLanguageWorkspaceContext } -export const UMB_LANGUAGE_WORKSPACE_CONTEXT = new UmbContextToken( +export const UMB_LANGUAGE_WORKSPACE_CONTEXT = new UmbContextToken( 'UmbWorkspaceContext', (context): context is UmbLanguageWorkspaceContext => context.getEntityType?.() === 'language' ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/relation-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/relation-type-workspace.context.ts index d8e9eb97d4..b871b61208 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/relation-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/relation-type-workspace.context.ts @@ -1,5 +1,5 @@ import { UmbRelationTypeRepository } from '../repository/relation-type.repository.js'; -import { UmbEntityWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; +import { UmbSaveableWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import type { RelationTypeBaseModel, RelationTypeResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; @@ -7,7 +7,7 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; export class UmbRelationTypeWorkspaceContext extends UmbWorkspaceContext - implements UmbEntityWorkspaceContextInterface + implements UmbSaveableWorkspaceContextInterface { #data = new UmbObjectState(undefined); data = this.#data.asObservable(); @@ -79,7 +79,7 @@ export class UmbRelationTypeWorkspaceContext -export const UMB_RELATION_TYPE_WORKSPACE_CONTEXT = new UmbContextToken( +export const UMB_RELATION_TYPE_WORKSPACE_CONTEXT = new UmbContextToken( 'UmbWorkspaceContext', (context): context is UmbRelationTypeWorkspaceContext => context.getEntityType?.() === 'relation-type' ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-view-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-view-workspace.context.ts index dca98153e4..19b5fcc98a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-view-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-view-workspace.context.ts @@ -2,7 +2,7 @@ import { UmbPartialViewsRepository } from '../repository/partial-views.repositor import { PartialViewDetails } from '../config.js'; import { createObservablePart, UmbBooleanState, UmbDeepState } from '@umbraco-cms/backoffice/observable-api'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; -import { UmbEntityWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; +import { UmbSaveableWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import { loadCodeEditor } from '@umbraco-cms/backoffice/code-editor'; import { UpdatePartialViewRequestModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; @@ -10,7 +10,7 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; export class UmbPartialViewWorkspaceContext extends UmbWorkspaceContext< UmbPartialViewsRepository, PartialViewDetails -> implements UmbEntityWorkspaceContextInterface { +> implements UmbSaveableWorkspaceContextInterface { getEntityId(): string | undefined { return this.getData()?.path; } @@ -101,7 +101,7 @@ export class UmbPartialViewWorkspaceContext extends UmbWorkspaceContext< -export const UMB_PARTIAL_VIEW_WORKSPACE_CONTEXT = new UmbContextToken( +export const UMB_PARTIAL_VIEW_WORKSPACE_CONTEXT = new UmbContextToken( 'UmbWorkspaceContext', (context): context is UmbPartialViewWorkspaceContext => context.getEntityType?.() === 'partial-view' ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.context.ts index fd1ba1098a..395a720cd1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.context.ts @@ -1,11 +1,11 @@ import { UmbStylesheetRepository } from '../repository/stylesheet.repository.js'; import { StylesheetDetails } from '../index.js'; -import { UmbEntityWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; +import { UmbSaveableWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -export class UmbStylesheetWorkspaceContext extends UmbWorkspaceContext implements UmbEntityWorkspaceContextInterface { +export class UmbStylesheetWorkspaceContext extends UmbWorkspaceContext implements UmbSaveableWorkspaceContextInterface { #data = new UmbObjectState(undefined); data = this.#data.asObservable(); @@ -42,7 +42,7 @@ export class UmbStylesheetWorkspaceContext extends UmbWorkspaceContext( +export const UMB_STYLESHEET_WORKSPACE_CONTEXT = new UmbContextToken( 'UmbWorkspaceContext', (context): context is UmbStylesheetWorkspaceContext => context.getEntityType?.() === 'stylesheet' ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/workspace/template-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/workspace/template-workspace.context.ts index eb16956d22..3513ae3800 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/workspace/template-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/workspace/template-workspace.context.ts @@ -1,6 +1,6 @@ import { UmbTemplateRepository } from '../repository/template.repository.js'; import { loadCodeEditor } from '@umbraco-cms/backoffice/code-editor'; -import { UmbEntityWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; +import { UmbSaveableWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import { createObservablePart, UmbBooleanState, @@ -11,7 +11,7 @@ import type { TemplateItemResponseModel, TemplateResponseModel } from '@umbraco- import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -export class UmbTemplateWorkspaceContext extends UmbWorkspaceContext implements UmbEntityWorkspaceContextInterface { +export class UmbTemplateWorkspaceContext extends UmbWorkspaceContext implements UmbSaveableWorkspaceContextInterface { #data = new UmbDeepState(undefined); data = this.#data.asObservable(); #masterTemplate = new UmbObjectState(null); @@ -170,7 +170,7 @@ ${currentContent}`; -export const UMB_TEMPLATE_WORKSPACE_CONTEXT = new UmbContextToken( +export const UMB_TEMPLATE_WORKSPACE_CONTEXT = new UmbContextToken( 'UmbWorkspaceContext', (context): context is UmbTemplateWorkspaceContext => context.getEntityType?.() === 'template' ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/users/user-groups/workspace/user-group-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/users/user-groups/workspace/user-group-workspace.context.ts index b9ce1e2fe3..28021f1f2f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/users/user-groups/workspace/user-group-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/users/user-groups/workspace/user-group-workspace.context.ts @@ -1,6 +1,6 @@ import { UmbUserGroupRepository } from '../repository/user-group.repository.js'; import { UmbUserRepository } from '../../users/repository/user.repository.js'; -import { UmbEntityWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; +import { UmbSaveableWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import type { UserGroupResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbArrayState, UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; @@ -8,7 +8,7 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; export class UmbUserGroupWorkspaceContext extends UmbWorkspaceContext - implements UmbEntityWorkspaceContextInterface + implements UmbSaveableWorkspaceContextInterface { #data = new UmbObjectState(undefined); data = this.#data.asObservable(); @@ -105,7 +105,7 @@ export class UmbUserGroupWorkspaceContext } -export const UMB_USER_GROUP_WORKSPACE_CONTEXT = new UmbContextToken( +export const UMB_USER_GROUP_WORKSPACE_CONTEXT = new UmbContextToken( 'UmbWorkspaceContext', (context): context is UmbUserGroupWorkspaceContext => context.getEntityType?.() === 'user-group' ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/users/users/workspace/user-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/users/users/workspace/user-workspace.context.ts index b9c4567217..9ac4fc84a3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/users/users/workspace/user-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/users/users/workspace/user-workspace.context.ts @@ -1,6 +1,6 @@ import { UmbUserRepository } from '../repository/user.repository.js'; import { type UmbUserDetail } from '../index.js'; -import { UmbEntityWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; +import { UmbSaveableWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import type { UpdateUserRequestModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; @@ -10,7 +10,7 @@ import { firstValueFrom } from '@umbraco-cms/backoffice/external/rxjs'; export class UmbUserWorkspaceContext extends UmbWorkspaceContext - implements UmbEntityWorkspaceContextInterface + implements UmbSaveableWorkspaceContextInterface { #authContext?: typeof UMB_AUTH.TYPE; @@ -82,7 +82,7 @@ export class UmbUserWorkspaceContext } } -export const UMB_USER_WORKSPACE_CONTEXT = new UmbContextToken( +export const UMB_USER_WORKSPACE_CONTEXT = new UmbContextToken( 'UmbWorkspaceContext', (context): context is UmbUserWorkspaceContext => context.getEntityType?.() === 'user' );