diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/data-type/workspace/data-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/data-type/workspace/data-type-workspace.context.ts index 43ade5cca3..36ed65fe3f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/data-type/workspace/data-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/data-type/workspace/data-type-workspace.context.ts @@ -5,6 +5,7 @@ import { UmbInvariantableWorkspaceContextInterface, UmbEditableWorkspaceContextBase, UmbWorkspaceContextInterface, + UmbBasicVariantContext, } from '@umbraco-cms/backoffice/workspace'; import { appendToFrozenArray, @@ -148,8 +149,26 @@ export class UmbDataTypeWorkspaceContext return this._configDefaultData?.find((x) => x.alias === alias)?.value; } - createVariantContext(host: UmbControllerHost): UmbDataTypeVariantContext { - return new UmbDataTypeVariantContext(host, this); + createVariantContext(host: UmbControllerHost) { + const context = new UmbBasicVariantContext(host); + this.observe( + this.properties, + (properties) => { + if (properties) { + properties.forEach(async (property) => { + this.observe( + await this.propertyValueByAlias(property.alias), + (value) => { + context.setPropertyValue(property.alias, value); + }, + 'observePropertyOf_' + property.alias, + ); + }); + } + }, + 'observePropertyValues', + ); + return context; } async load(unique: string) { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/variant-context/basic-variant-context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/variant-context/basic-variant-context.ts new file mode 100644 index 0000000000..97f2ff4923 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/variant-context/basic-variant-context.ts @@ -0,0 +1,58 @@ +import type { UmbPropertyValueData } from '../types/property-value-data.type.js'; +import { type UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { UmbContextBase } from '@umbraco-cms/backoffice/class-api'; +import { UMB_VARIANT_CONTEXT, UmbVariantContext } from '@umbraco-cms/backoffice/workspace'; +import { UmbArrayState, UmbStringState } from '@umbraco-cms/backoffice/observable-api'; +import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; + +export class UmbBasicVariantContext + extends UmbContextBase + implements UmbVariantContext +{ + #name = new UmbStringState(''); + name = this.#name.asObservable(); + + #values = new UmbArrayState>([], (x) => x.alias); + private _entityType!: string; + private _unique!: string; + + getType() { + return this._entityType; + } + getUnique() { + return this._unique; + } + getName() { + return this.#name.getValue(); + } + setName(name: string) { + this.#name.next(name); + } + getVariantId() { + return UmbVariantId.CreateInvariant(); + } + + constructor(host: UmbControllerHost) { + // The controller alias, is a very generic name cause we want only one of these for this controller host. + super(host, UMB_VARIANT_CONTEXT); + } + + /** + * 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. + */ + propertyValueByAlias(propertyAlias: string) { + return this.#values.asObservablePart((values) => { + const valueObj = values.find((x) => x.alias === propertyAlias); + return valueObj ? (valueObj.value as ReturnType) : 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. + */ + setPropertyValue(alias: string, value: unknown) { + this.#values.appendOne({ alias, value }); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/variant-context/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/variant-context/index.ts index 8c2af922ab..f95b8913a4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/variant-context/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/variant-context/index.ts @@ -1,3 +1,4 @@ +export * from './basic-variant-context.js'; export * from './variant-context.interface.js'; export * from './variant-context.token.js'; export * from './nameable-variant-context.interface.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/variant-context/invariant-workspace-variant-context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/variant-context/invariant-workspace-variant-context.ts index 4831680795..bac3c46984 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/variant-context/invariant-workspace-variant-context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/variant-context/invariant-workspace-variant-context.ts @@ -1,7 +1,5 @@ -import { DocumentVariantResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { type UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbBaseController } from '@umbraco-cms/backoffice/class-api'; -import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; import { UMB_VARIANT_CONTEXT, @@ -17,12 +15,7 @@ export class UmbInvariantWorkspaceVariantContext< { protected _workspace: WorkspaceType; - #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); + name; // default data: @@ -47,6 +40,8 @@ export class UmbInvariantWorkspaceVariantContext< super(host, 'variantContext'); this._workspace = workspace; + this.name = this._workspace.name; + this.provideContext(UMB_VARIANT_CONTEXT, this); }