align content workspaces with new base entity data manager

This commit is contained in:
Niels Lyngsø
2024-09-26 15:51:33 +02:00
parent 80023b170b
commit 4319e39e53
7 changed files with 138 additions and 230 deletions

View File

@@ -1,10 +1,9 @@
import { UmbMergeContentVariantDataController } from '../controller/merge-content-variant-data.controller.js';
import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api';
import type { UmbContentDetailModel } from '@umbraco-cms/backoffice/content';
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
import { UmbObjectState, appendToFrozenArray, jsonStringComparison } from '@umbraco-cms/backoffice/observable-api';
import { UmbVariantId, type UmbEntityVariantModel } from '@umbraco-cms/backoffice/variant';
import type { UmbWorkspaceDataManager } from '@umbraco-cms/backoffice/workspace';
import { UmbEntityWorkspaceDataManager, type UmbWorkspaceDataManager } from '@umbraco-cms/backoffice/workspace';
export class UmbContentWorkspaceDataManager<
ModelType extends UmbContentDetailModel,
@@ -12,7 +11,7 @@ export class UmbContentWorkspaceDataManager<
? ModelType['variants'][0]
: never,
>
extends UmbControllerBase
extends UmbEntityWorkspaceDataManager<ModelType>
implements UmbWorkspaceDataManager<ModelType>
{
//
@@ -20,7 +19,7 @@ export class UmbContentWorkspaceDataManager<
#variantScaffold?: ModelVariantType;
#persisted = new UmbObjectState<ModelType | undefined>(undefined);
readonly current = new UmbObjectState<ModelType | undefined>(undefined);
#current = new UmbObjectState<ModelType | undefined>(undefined);
#varies?: boolean;
//#variesByCulture?: boolean;
@@ -31,6 +30,25 @@ export class UmbContentWorkspaceDataManager<
this.#variantScaffold = variantScaffold;
}
#updateLock = 0;
initiatePropertyValueChange() {
this.#updateLock++;
this.#current.mute();
// TODO: When ready enable this code will enable handling a finish automatically by this implementation 'using myState.initiatePropertyValueChange()' (Relies on TS support of Using) [NL]
/*return {
[Symbol.dispose]: this.finishPropertyValueChange,
};*/
}
finishPropertyValueChange = () => {
this.#updateLock--;
this.#triggerPropertyValueChanges();
};
#triggerPropertyValueChanges() {
if (this.#updateLock === 0) {
this.#current.unmute();
}
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
setVariesByCulture(vary: boolean | undefined) {
//this.#variesByCulture = vary;
@@ -43,27 +61,12 @@ export class UmbContentWorkspaceDataManager<
this.#varies = vary;
}
setPersisted(data: ModelType | undefined) {
this.#persisted.setValue(data);
}
setCurrent(data: ModelType | undefined) {
this.current.setValue(data);
}
getPersisted() {
return this.#persisted.getValue();
}
getCurrent() {
return this.current.getValue();
}
ensureVariantData(variantId: UmbVariantId) {
this.updateVariantData(variantId);
}
updateVariantData(variantId: UmbVariantId, update?: Partial<ModelVariantType>) {
const currentData = this.current.getValue();
const currentData = this.#current.getValue();
if (!currentData) throw new Error('Data is missing');
if (!this.#variantScaffold) throw new Error('Variant scaffold data is missing');
if (this.#varies === true) {
@@ -81,7 +84,7 @@ export class UmbContentWorkspaceDataManager<
(x) => variantId.compare(x),
) as Array<ModelVariantType>;
// TODO: I have some trouble with TypeScript here, I does not look like me, but i had to give up. [NL]
this.current.update({ variants: newVariants } as any);
this.#current.update({ variants: newVariants } as any);
} else if (this.#varies === false) {
// TODO: Beware about segments, in this case we need to also consider segments, if its allowed to vary by segments.
const invariantVariantId = UmbVariantId.CreateInvariant();
@@ -96,7 +99,7 @@ export class UmbContentWorkspaceDataManager<
} as ModelVariantType,
];
// TODO: I have some trouble with TypeScript here, I does not look like me, but i had to give up. [NL]
this.current.update({ variants: newVariants } as any);
this.#current.update({ variants: newVariants } as any);
} else {
throw new Error('Varies by culture is missing');
}
@@ -114,7 +117,7 @@ export class UmbContentWorkspaceDataManager<
variantsToStore = [...selectedVariants, invariantVariantId];
}
const data = this.current.getValue();
const data = this.#current.getValue();
if (!data) throw new Error('Current data is missing');
if (!data.unique) throw new Error('Unique of current data is missing');
@@ -130,7 +133,7 @@ export class UmbContentWorkspaceDataManager<
getChangedVariants() {
const persisted = this.#persisted.getValue();
const current = this.current.getValue();
const current = this.#current.getValue();
if (!current) throw new Error('Current data is missing');
const changedVariants = current?.variants.map((variant) => {
@@ -159,10 +162,4 @@ export class UmbContentWorkspaceDataManager<
.map((x) => new UmbVariantId(x.culture, x.segment)) ?? []
);
}
public override destroy(): void {
this.#persisted.destroy();
this.current.destroy();
super.destroy();
}
}

View File

@@ -1,7 +1,7 @@
import type { UmbPropertyValueResolver } from './types.js';
import type { ManifestApi } from '@umbraco-cms/backoffice/extension-api';
export interface ManifestPropertyValueResolver extends ManifestApi<UmbPropertyValueResolver<any, any>> {
export interface ManifestPropertyValueResolver extends ManifestApi<UmbPropertyValueResolver<any, any, any>> {
type: 'propertyValueResolver';
meta: MetaPropertyValueResolver;
}

View File

@@ -1,9 +1,37 @@
import type { UmbController } from '@umbraco-cms/backoffice/controller-api';
import type { UmbEntityModel } from '@umbraco-cms/backoffice/entity';
import type { MappingFunction, Observable } from '@umbraco-cms/backoffice/observable-api';
export interface UmbWorkspaceDataManager<ModelType extends UmbEntityModel> extends UmbController {
getPersisted(): ModelType | undefined;
getCurrent(): ModelType | undefined;
setPersisted(data: ModelType | undefined): void;
setCurrent(data: ModelType | undefined): void;
updatePersisted(partialData: Partial<ModelType>): void;
updateCurrent(partialData: Partial<ModelType>): void;
createObservablePartOfPersisted<ReturnType>(
mappingFunction: MappingFunction<ModelType | undefined, ReturnType>,
): Observable<ReturnType>;
createObservablePartOfCurrent<ReturnType>(
mappingFunction: MappingFunction<ModelType | undefined, ReturnType>,
): Observable<ReturnType>;
/**
* Checks if there are unpersisted changes
* @returns {*}
*/
getHasUnpersistedChanges(): boolean;
/**
* Resets the current data to the persisted data
*/
resetCurrent(): void;
/**
* Clears the data
*/
clear(): void;
}

View File

@@ -66,12 +66,12 @@ export class UmbDocumentBlueprintWorkspaceContext
return this.#getDataPromise;
}
readonly unique = this.#data.current.asObservablePart((data) => data?.unique);
readonly entityType = this.#data.current.asObservablePart((data) => data?.entityType);
readonly unique = this.#data.createObservablePartOfCurrent((data) => data?.unique);
readonly entityType = this.#data.createObservablePartOfCurrent((data) => data?.entityType);
readonly contentTypeUnique = this.#data.current.asObservablePart((data) => data?.documentType.unique);
readonly contentTypeUnique = this.#data.createObservablePartOfCurrent((data) => data?.documentType.unique);
readonly variants = this.#data.current.asObservablePart((data) => data?.variants || []);
readonly variants = this.#data.createObservablePartOfCurrent((data) => data?.variants || []);
//readonly urls = this.#data.current.asObservablePart((data) => data?.urls || []);
@@ -231,7 +231,7 @@ export class UmbDocumentBlueprintWorkspaceContext
}
getData() {
return this.#data.current.getValue();
return this.#data.getCurrent();
}
getUnique() {
@@ -257,15 +257,15 @@ export class UmbDocumentBlueprintWorkspaceContext
}
variantById(variantId: UmbVariantId) {
return this.#data.current.asObservablePart((data) => data?.variants?.find((x) => variantId.compare(x)));
return this.#data.createObservablePartOfCurrent((data) => data?.variants?.find((x) => variantId.compare(x)));
}
getVariant(variantId: UmbVariantId) {
return this.#data.current.getValue()?.variants?.find((x) => variantId.compare(x));
return this.#data.getCurrent()?.variants?.find((x) => variantId.compare(x));
}
getName(variantId?: UmbVariantId) {
const variants = this.#data.current.getValue()?.variants;
const variants = this.#data.getCurrent()?.variants;
if (!variants) return;
if (variantId) {
return variants.find((x) => variantId.compare(x))?.name;
@@ -275,11 +275,11 @@ export class UmbDocumentBlueprintWorkspaceContext
}
setName(name: string, variantId?: UmbVariantId) {
this.#updateVariantData(variantId ?? UmbVariantId.CreateInvariant(), { name });
this.#data.updateVariantData(variantId ?? UmbVariantId.CreateInvariant(), { name });
}
name(variantId?: UmbVariantId) {
return this.#data.current.asObservablePart(
return this.#data.createObservablePartOfCurrent(
(data) => data?.variants?.find((x) => variantId?.compare(x))?.name ?? '',
);
}
@@ -295,7 +295,7 @@ export class UmbDocumentBlueprintWorkspaceContext
* @description Get an Observable for the value of this property.
*/
async propertyValueByAlias<PropertyValueType = unknown>(propertyAlias: string, variantId?: UmbVariantId) {
return this.#data.current.asObservablePart(
return this.#data.createObservablePartOfCurrent(
(data) =>
data?.values?.find((x) => x?.alias === propertyAlias && (variantId ? variantId.compare(x as any) : true))
?.value as PropertyValueType,
@@ -309,7 +309,7 @@ export class UmbDocumentBlueprintWorkspaceContext
* @returns The value or undefined if not set or found.
*/
getPropertyValue<ReturnType = unknown>(alias: string, variantId?: UmbVariantId) {
const currentData = this.#data.current.value;
const currentData = this.#data.getCurrent();
if (currentData) {
const newDataSet = currentData.values?.find(
(x) => x.alias === alias && (variantId ? variantId.compare(x as any) : true),
@@ -341,7 +341,7 @@ export class UmbDocumentBlueprintWorkspaceContext
entry,
(x) => x.alias === alias && variantId!.compare(x),
);
this.#data.current.update({ values });
this.#data.updateCurrent({ values });
// TODO: We should move this type of logic to the act of saving [NL]
this.#data.ensureVariantData(variantId);
@@ -349,107 +349,22 @@ export class UmbDocumentBlueprintWorkspaceContext
this.finishPropertyValueChange();
}
#updateLock = 0;
initiatePropertyValueChange() {
this.#updateLock++;
this.#data.current.mute();
// TODO: When ready enable this code will enable handling a finish automatically by this implementation 'using myState.initiatePropertyValueChange()' (Relies on TS support of Using) [NL]
/*return {
[Symbol.dispose]: this.finishPropertyValueChange,
};*/
this.#data.initiatePropertyValueChange();
}
finishPropertyValueChange = () => {
this.#updateLock--;
this.#triggerPropertyValueChanges();
this.#data.finishPropertyValueChange();
};
#triggerPropertyValueChanges() {
if (this.#updateLock === 0) {
this.#data.current.unmute();
}
}
/* #calculateChangedVariants() {
const persisted = this.#persistedData.getValue();
const current = this.#data.current.getValue();
if (!current) throw new Error('Current data is missing');
const changedVariants = current?.variants.map((variant) => {
const persistedVariant = persisted?.variants.find((x) => UmbVariantId.Create(variant).compare(x));
return {
culture: variant.culture,
segment: variant.segment,
equal: persistedVariant ? jsonStringComparison(variant, persistedVariant) : false,
};
});
const changedProperties = current?.values.map((value) => {
const persistedValues = persisted?.values.find((x) => UmbVariantId.Create(value).compare(x));
return {
culture: value.culture,
segment: value.segment,
equal: persistedValues ? jsonStringComparison(value, persistedValues) : false,
};
});
// calculate the variantIds of those who either have a change in properties or in variants:
return (
changedVariants
?.concat(changedProperties ?? [])
.filter((x) => x.equal === false)
.map((x) => new UmbVariantId(x.culture, x.segment)) ?? []
);
} */
#updateVariantData(variantId: UmbVariantId, update?: Partial<UmbDocumentBlueprintVariantModel>) {
const currentData = this.getData();
if (!currentData) throw new Error('Data is missing');
if (this.#varies === true) {
// If variant Id is invariant, we don't to have the variant appended to our data.
if (variantId.isInvariant()) return;
const variant = currentData.variants.find((x) => variantId.compare(x));
const newVariants = appendToFrozenArray(
currentData.variants,
{
name: '',
createDate: null,
updateDate: null,
...variantId.toObject(),
...variant,
...update,
},
(x) => variantId.compare(x),
);
this.#data.current.update({ variants: newVariants });
} else if (this.#varies === false) {
// TODO: Beware about segments, in this case we need to also consider segments, if its allowed to vary by segments.
const invariantVariantId = UmbVariantId.CreateInvariant();
const variant = currentData.variants.find((x) => invariantVariantId.compare(x));
// Cause we are invariant, we will just overwrite all variants with this one:
const newVariants = [
{
name: '',
createDate: null,
updateDate: null,
...invariantVariantId.toObject(),
...variant,
...update,
},
];
this.#data.current.update({ variants: newVariants });
} else {
throw new Error('Varies by culture is missing');
}
}
async #createOrSave() {
if (!this.#data.current.value?.unique) throw new Error('Unique is missing');
const current = this.#data.getCurrent();
if (!current?.unique) throw new Error('Unique is missing');
if (this.getIsNew()) {
const parent = this.#parent.getValue();
if (!parent) throw new Error('Parent is not set');
const value = this.#data.current.value;
if ((await this.repository.create(value, parent.unique)).data !== undefined) {
if ((await this.repository.create(current, parent.unique)).data !== undefined) {
this.setIsNew(false);
// TODO: this might not be the right place to alert the tree, but it works for now
@@ -461,7 +376,7 @@ export class UmbDocumentBlueprintWorkspaceContext
eventContext.dispatchEvent(event);
}
} else {
await this.repository.save(this.#data.current.value);
await this.repository.save(current);
const actionEventContext = await this.getContext(UMB_ACTION_EVENT_CONTEXT);
const event = new UmbRequestReloadStructureForEntityEvent({

View File

@@ -109,17 +109,20 @@ export class UmbDocumentWorkspaceContext
return this.#getDataPromise;
}
readonly unique = this.#data.current.asObservablePart((data) => data?.unique);
readonly entityType = this.#data.current.asObservablePart((data) => data?.entityType);
readonly isTrashed = this.#data.current.asObservablePart((data) => data?.isTrashed);
readonly data = this.#data.current;
readonly unique = this.#data.createObservablePartOfCurrent((data) => data?.unique);
readonly entityType = this.#data.createObservablePartOfCurrent((data) => data?.entityType);
readonly isTrashed = this.#data.createObservablePartOfCurrent((data) => data?.isTrashed);
readonly contentTypeUnique = this.#data.current.asObservablePart((data) => data?.documentType.unique);
readonly contentTypeHasCollection = this.#data.current.asObservablePart((data) => !!data?.documentType.collection);
readonly contentTypeUnique = this.#data.createObservablePartOfCurrent((data) => data?.documentType.unique);
readonly contentTypeHasCollection = this.#data.createObservablePartOfCurrent(
(data) => !!data?.documentType.collection,
);
readonly variants = this.#data.current.asObservablePart((data) => data?.variants ?? []);
readonly variants = this.#data.createObservablePartOfCurrent((data) => data?.variants ?? []);
readonly urls = this.#data.current.asObservablePart((data) => data?.urls || []);
readonly templateId = this.#data.current.asObservablePart((data) => data?.template?.unique || null);
readonly urls = this.#data.createObservablePartOfCurrent((data) => data?.urls || []);
readonly templateId = this.#data.createObservablePartOfCurrent((data) => data?.template?.unique || null);
readonly structure = new UmbContentTypeStructureManager(this, new UmbDocumentTypeDetailRepository(this));
readonly variesByCulture = this.structure.ownerContentTypePart((x) => x?.variesByCulture);
@@ -363,15 +366,15 @@ export class UmbDocumentWorkspaceContext
}
variantById(variantId: UmbVariantId) {
return this.#data.current.asObservablePart((data) => data?.variants?.find((x) => variantId.compare(x)));
return this.#data.createObservablePartOfCurrent((data) => data?.variants?.find((x) => variantId.compare(x)));
}
getVariant(variantId: UmbVariantId) {
return this.#data.current.getValue()?.variants?.find((x) => variantId.compare(x));
return this.#data.getCurrent()?.variants?.find((x) => variantId.compare(x));
}
getName(variantId?: UmbVariantId) {
const variants = this.#data.current.getValue()?.variants;
const variants = this.#data.getCurrent()?.variants;
if (!variants) return;
if (variantId) {
return variants.find((x) => variantId.compare(x))?.name;
@@ -386,13 +389,13 @@ export class UmbDocumentWorkspaceContext
}
name(variantId?: UmbVariantId) {
return this.#data.current.asObservablePart(
return this.#data.createObservablePartOfCurrent(
(data) => data?.variants?.find((x) => variantId?.compare(x))?.name ?? '',
);
}
setTemplate(templateUnique: string) {
this.#data.current.update({ template: { unique: templateUnique } });
this.#data.updateCurrent({ template: { unique: templateUnique } });
}
async propertyStructureById(propertyId: string) {
@@ -410,7 +413,7 @@ export class UmbDocumentWorkspaceContext
propertyAlias: string,
variantId?: UmbVariantId,
): Promise<Observable<PropertyValueType | undefined> | undefined> {
return this.#data.current.asObservablePart(
return this.#data.createObservablePartOfCurrent(
(data) =>
data?.values?.find((x) => x?.alias === propertyAlias && (variantId ? variantId.compare(x) : true))
?.value as PropertyValueType,
@@ -467,7 +470,7 @@ export class UmbDocumentWorkspaceContext
entry,
(x) => x.alias === alias && variantId!.compare(x),
);
this.#data.current.update({ values });
this.#data.updateCurrent({ values });
// TODO: We should move this type of logic to the act of saving [NL]
this.#data.ensureVariantData(variantId);
@@ -475,24 +478,12 @@ export class UmbDocumentWorkspaceContext
this.finishPropertyValueChange();
}
#updateLock = 0;
initiatePropertyValueChange() {
this.#updateLock++;
this.#data.current.mute();
// TODO: When ready enable this code will enable handling a finish automatically by this implementation 'using myState.initiatePropertyValueChange()' (Relies on TS support of Using) [NL]
/*return {
[Symbol.dispose]: this.finishPropertyValueChange,
};*/
this.#data.initiatePropertyValueChange();
}
finishPropertyValueChange = () => {
this.#updateLock--;
this.#triggerPropertyValueChanges();
this.#data.finishPropertyValueChange();
};
#triggerPropertyValueChanges() {
if (this.#updateLock === 0) {
this.#data.current.unmute();
}
}
async #determineVariantOptions() {
const activeVariants = this.splitView.getActiveVariants();

View File

@@ -70,14 +70,14 @@ export class UmbMediaWorkspaceContext
return this.#getDataPromise;
}
readonly unique = this.#data.current.asObservablePart((data) => data?.unique);
readonly entityType = this.#data.current.asObservablePart((data) => data?.entityType);
readonly contentTypeUnique = this.#data.current.asObservablePart((data) => data?.mediaType.unique);
readonly contentTypeHasCollection = this.#data.current.asObservablePart((data) => !!data?.mediaType.collection);
readonly unique = this.#data.createObservablePartOfCurrent((data) => data?.unique);
readonly entityType = this.#data.createObservablePartOfCurrent((data) => data?.entityType);
readonly contentTypeUnique = this.#data.createObservablePartOfCurrent((data) => data?.mediaType.unique);
readonly contentTypeHasCollection = this.#data.createObservablePartOfCurrent((data) => !!data?.mediaType.collection);
readonly variants = this.#data.current.asObservablePart((data) => data?.variants || []);
readonly variants = this.#data.createObservablePartOfCurrent((data) => data?.variants || []);
readonly urls = this.#data.current.asObservablePart((data) => data?.urls || []);
readonly urls = this.#data.createObservablePartOfCurrent((data) => data?.urls || []);
readonly structure = new UmbContentTypeStructureManager(this, new UmbMediaTypeDetailRepository(this));
readonly variesByCulture = this.structure.ownerContentTypePart((x) => x?.variesByCulture);
@@ -244,7 +244,7 @@ export class UmbMediaWorkspaceContext
}
getData() {
return this.#data.current.getValue();
return this.#data.getCurrent();
}
getUnique() {
@@ -270,15 +270,15 @@ export class UmbMediaWorkspaceContext
}
variantById(variantId: UmbVariantId) {
return this.#data.current.asObservablePart((data) => data?.variants?.find((x) => variantId.compare(x)));
return this.#data.createObservablePartOfCurrent((data) => data?.variants?.find((x) => variantId.compare(x)));
}
getVariant(variantId: UmbVariantId) {
return this.#data.current.getValue()?.variants?.find((x) => variantId.compare(x));
return this.#data.getCurrent()?.variants?.find((x) => variantId.compare(x));
}
getName(variantId?: UmbVariantId) {
const variants = this.#data.current.getValue()?.variants;
const variants = this.#data.getCurrent()?.variants;
if (!variants) return;
if (variantId) {
return variants.find((x) => variantId.compare(x))?.name;
@@ -292,7 +292,7 @@ export class UmbMediaWorkspaceContext
}
name(variantId?: UmbVariantId) {
return this.#data.current.asObservablePart(
return this.#data.createObservablePartOfCurrent(
(data) => data?.variants?.find((x) => variantId?.compare(x))?.name ?? '',
);
}
@@ -308,7 +308,7 @@ export class UmbMediaWorkspaceContext
* @description Get an Observable for the value of this property.
*/
async propertyValueByAlias<PropertyValueType = unknown>(propertyAlias: string, variantId?: UmbVariantId) {
return this.#data.current.asObservablePart(
return this.#data.createObservablePartOfCurrent(
(data) =>
data?.values?.find((x) => x?.alias === propertyAlias && (variantId ? variantId.compare(x as any) : true))
?.value as PropertyValueType,
@@ -322,7 +322,7 @@ export class UmbMediaWorkspaceContext
* @returns The value or undefined if not set or found.
*/
getPropertyValue<ReturnType = unknown>(alias: string, variantId?: UmbVariantId) {
const currentData = this.#data.current.value;
const currentData = this.#data.getCurrent();
if (currentData) {
const newDataSet = currentData.values?.find(
(x) => x.alias === alias && (variantId ? variantId.compare(x as any) : true),
@@ -355,7 +355,7 @@ export class UmbMediaWorkspaceContext
entry,
(x) => x.alias === alias && variantId!.compare(x),
);
this.#data.current.update({ values });
this.#data.updateCurrent({ values });
// TODO: We should move this type of logic to the act of saving [NL]
this.#data.ensureVariantData(variantId);
@@ -363,24 +363,12 @@ export class UmbMediaWorkspaceContext
this.finishPropertyValueChange();
}
#updateLock = 0;
initiatePropertyValueChange() {
this.#updateLock++;
this.#data.current.mute();
// TODO: When ready enable this code will enable handling a finish automatically by this implementation 'using myState.initiatePropertyValueChange()' (Relies on TS support of Using) [NL]
/*return {
[Symbol.dispose]: this.finishPropertyValueChange,
};*/
this.#data.initiatePropertyValueChange();
}
finishPropertyValueChange = () => {
this.#updateLock--;
this.#triggerPropertyValueChanges();
this.#data.finishPropertyValueChange();
};
#triggerPropertyValueChanges() {
if (this.#updateLock === 0) {
this.#data.current.unmute();
}
}
/* #calculateChangedVariants() {
const persisted = this.#persistedData.getValue();
@@ -433,7 +421,7 @@ export class UmbMediaWorkspaceContext
},
(x) => variantId.compare(x),
);
this.#data.current.update({ variants: newVariants });
this.#data.updateCurrent({ variants: newVariants });
} else if (this.#varies === false) {
// TODO: Beware about segments, in this case we need to also consider segments, if its allowed to vary by segments.
const invariantVariantId = UmbVariantId.CreateInvariant();
@@ -449,7 +437,7 @@ export class UmbMediaWorkspaceContext
...update,
},
];
this.#data.current.update({ variants: newVariants });
this.#data.updateCurrent({ variants: newVariants });
} else {
throw new Error('Varies by culture is missing');
}

View File

@@ -49,12 +49,12 @@ export class UmbMemberWorkspaceContext
return this.#getDataPromise;
}
readonly data = this.#data.current.asObservable();
readonly unique = this.#data.current.asObservablePart((data) => data?.unique);
readonly createDate = this.#data.current.asObservablePart((data) => data?.variants[0].createDate);
readonly updateDate = this.#data.current.asObservablePart((data) => data?.variants[0].updateDate);
readonly contentTypeUnique = this.#data.current.asObservablePart((data) => data?.memberType.unique);
readonly kind = this.#data.current.asObservablePart((data) => data?.kind);
readonly data = this.#data.current;
readonly unique = this.#data.createObservablePartOfCurrent((data) => data?.unique);
readonly createDate = this.#data.createObservablePartOfCurrent((data) => data?.variants[0].createDate);
readonly updateDate = this.#data.createObservablePartOfCurrent((data) => data?.variants[0].updateDate);
readonly contentTypeUnique = this.#data.createObservablePartOfCurrent((data) => data?.memberType.unique);
readonly kind = this.#data.createObservablePartOfCurrent((data) => data?.kind);
readonly structure = new UmbContentTypeStructureManager(this, new UmbMemberTypeDetailRepository(this));
readonly variesByCulture = this.structure.ownerContentTypePart((x) => x?.variesByCulture);
@@ -66,7 +66,7 @@ export class UmbMemberWorkspaceContext
#variesByCulture?: boolean;
#variesBySegment?: boolean;
readonly variants = this.#data.current.asObservablePart((data) => data?.variants ?? []);
readonly variants = this.#data.createObservablePartOfCurrent((data) => data?.variants ?? []);
readonly #dataTypeItemManager = new UmbDataTypeItemRepositoryManager(this);
#dataTypeSchemaAliasMap = new Map<string, string>();
@@ -210,7 +210,7 @@ export class UmbMemberWorkspaceContext
}
getData() {
return this.#data.current.getValue();
return this.#data.getCurrent();
}
getUnique() {
@@ -236,15 +236,15 @@ export class UmbMemberWorkspaceContext
}
variantById(variantId: UmbVariantId) {
return this.#data.current.asObservablePart((data) => data?.variants?.find((x) => variantId.compare(x)));
return this.#data.createObservablePartOfCurrent((data) => data?.variants?.find((x) => variantId.compare(x)));
}
getVariant(variantId: UmbVariantId) {
return this.#data.current.getValue()?.variants?.find((x) => variantId.compare(x));
return this.#data.getCurrent()?.variants?.find((x) => variantId.compare(x));
}
getName(variantId?: UmbVariantId) {
const variants = this.#data.current.getValue()?.variants;
const variants = this.#data.getCurrent()?.variants;
if (!variants) return;
if (variantId) {
return variants.find((x) => variantId.compare(x))?.name;
@@ -258,7 +258,7 @@ export class UmbMemberWorkspaceContext
}
name(variantId?: UmbVariantId) {
return this.#data.current.asObservablePart(
return this.#data.createObservablePartOfCurrent(
(data) => data?.variants?.find((x) => variantId?.compare(x))?.name ?? '',
);
}
@@ -275,7 +275,7 @@ export class UmbMemberWorkspaceContext
* @description Get an Observable for the value of this property.
*/
async propertyValueByAlias<PropertyValueType = unknown>(propertyAlias: string, variantId?: UmbVariantId) {
return this.#data.current.asObservablePart(
return this.#data.createObservablePartOfCurrent(
(data) =>
data?.values?.find((x) => x?.alias === propertyAlias && (variantId ? variantId.compare(x) : true))
?.value as PropertyValueType,
@@ -321,7 +321,7 @@ export class UmbMemberWorkspaceContext
entry,
(x) => x.alias === alias && variantId!.compare(x),
);
this.#data.current.update({ values });
this.#data.updateCurrent({ values });
// TODO: We should move this type of logic to the act of saving [NL]
this.#data.ensureVariantData(variantId);
@@ -329,40 +329,29 @@ export class UmbMemberWorkspaceContext
this.finishPropertyValueChange();
}
#updateLock = 0;
initiatePropertyValueChange() {
this.#updateLock++;
this.#data.current.mute();
// TODO: When ready enable this code will enable handling a finish automatically by this implementation 'using myState.initiatePropertyValueChange()' (Relies on TS support of Using) [NL]
/*return {
[Symbol.dispose]: this.finishPropertyValueChange,
};*/
this.#data.initiatePropertyValueChange();
}
finishPropertyValueChange = () => {
this.#updateLock--;
this.#triggerPropertyValueChanges();
this.#data.finishPropertyValueChange();
};
#triggerPropertyValueChanges() {
if (this.#updateLock === 0) {
this.#data.current.unmute();
}
}
async submit() {
if (!this.#data.current.value) throw new Error('Data is missing');
if (!this.#data.current.value.unique) throw new Error('Unique is missing');
const current = this.#data.getCurrent();
if (!current) throw new Error('Data is missing');
if (!current.unique) throw new Error('Unique is missing');
let newData = undefined;
if (this.getIsNew()) {
const { data } = await this.repository.create(this.#data.current.value);
const { data } = await this.repository.create(current);
if (!data) {
throw new Error('Could not create member.');
}
newData = data;
this.setIsNew(false);
} else {
const { data } = await this.repository.save(this.#data.current.value);
const { data } = await this.repository.save(current);
if (!data) {
throw new Error('Could not create member.');
}
@@ -399,14 +388,14 @@ export class UmbMemberWorkspaceContext
propertyName: PropertyName,
value: UmbMemberDetailModel[PropertyName],
) {
this.#data.current.update({ [propertyName]: value });
this.#data.updateCurrent({ [propertyName]: value });
}
// Only for CRUD demonstration purposes
updateData(data: Partial<EntityModel>) {
const currentData = this.#data.current.getValue();
const currentData = this.#data.getCurrent();
if (!currentData) throw new Error('No data to update');
this.#data.current.setValue({ ...currentData, ...data });
this.#data.setCurrent({ ...currentData, ...data });
}
get email(): string {
@@ -450,7 +439,7 @@ export class UmbMemberWorkspaceContext
}
#get<PropertyName extends keyof UmbMemberDetailModel>(propertyName: PropertyName) {
return this.#data.current.getValue()?.[propertyName];
return this.#data.getCurrent()?.[propertyName];
}
}