align content workspaces with new base entity data manager
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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({
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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');
|
||||
}
|
||||
|
||||
@@ -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];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user