handle segmented data when saving

This commit is contained in:
Mads Rasmussen
2025-03-28 08:02:53 +01:00
parent 746ad55a0b
commit e1e69aeec4
2 changed files with 69 additions and 39 deletions

View File

@@ -54,41 +54,71 @@ export class UmbContentWorkspaceDataManager<
}
updateVariantData(variantId: UmbVariantId, update?: Partial<ModelVariantType>) {
if (!this.#variantScaffold) throw new Error('Variant scaffold data is missing');
if (this._variesByCulture === true) {
// If variant Id is invariant, we don't to have the variant appended to our data.
if (variantId.isInvariant()) {
return;
}
this.#updateVariantData(variantId, update);
return;
}
if (this._variesBySegment === true) {
// When varying by segment we need to handle the "unsegmented" variant as invariant.
// The rest of the segmented variants will be handled as normal variant data.
if (variantId.isInvariant()) {
this.#updateInvariantData(update);
} else {
this.#updateVariantData(variantId, update);
}
return;
}
if (this._varies === false) {
this.#updateInvariantData(update);
return;
}
throw new Error('Varies by culture is missing');
}
#updateVariantData(variantId: UmbVariantId, update?: Partial<ModelVariantType>) {
const currentData = this.getCurrent();
if (!currentData) throw new Error('Data is missing');
if (!this.#variantScaffold) throw new Error('Variant scaffold 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,
{
...this.#variantScaffold,
...variantId.toObject(),
...variant,
...update,
} as ModelVariantType,
(x) => variantId.compare(x),
) as Array<ModelVariantType>;
this.updateCurrent({ variants: newVariants } as unknown as ModelType);
} 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 = [
{
...this.#variantScaffold,
...invariantVariantId.toObject(),
...variant,
...update,
} as ModelVariantType,
];
this.updateCurrent({ variants: newVariants } as unknown as ModelType);
} else {
throw new Error('Varies by culture is missing');
}
const variant = currentData.variants.find((x) => variantId.compare(x));
const newVariants = appendToFrozenArray(
currentData.variants,
{
...this.#variantScaffold,
...variantId.toObject(),
...variant,
...update,
} as ModelVariantType,
(x) => variantId.compare(x),
) as Array<ModelVariantType>;
this.updateCurrent({ variants: newVariants } as unknown as ModelType);
}
#updateInvariantData(update?: Partial<ModelVariantType>) {
const currentData = this.getCurrent();
if (!currentData) throw new Error('Data is missing');
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 = [
{
...this.#variantScaffold,
...invariantVariantId.toObject(),
...variant,
...update,
} as ModelVariantType,
];
this.updateCurrent({ variants: newVariants } as unknown as ModelType);
}
getChangedVariants() {

View File

@@ -17,8 +17,8 @@ export class UmbElementWorkspaceDataManager<ModelType extends UmbElementDetailMo
implements UmbWorkspaceDataManager<ModelType>
{
protected _varies?: boolean;
//#variesByCulture?: boolean;
//#variesBySegment?: boolean;
protected _variesByCulture?: boolean;
protected _variesBySegment?: boolean;
protected override _sortCurrentData<GivenType extends Partial<ModelType> = Partial<ModelType>>(
persistedData: Partial<ModelType>,
@@ -60,14 +60,14 @@ export class UmbElementWorkspaceDataManager<ModelType extends UmbElementDetailMo
}
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
setVariesByCulture(vary: boolean | undefined) {
//this.#variesByCulture = vary;
this._variesByCulture = vary;
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
setVariesBySegment(vary: boolean | undefined) {
//this.#variesBySegment = vary;
this._variesBySegment = vary;
}
setVaries(vary: boolean | undefined) {
this._varies = vary;
}