Skip to content

Commit 33ee144

Browse files
authored
Fix #18431 (#18445)
* Keep order from persisted data * refactor to also cover updateCurrent
1 parent e448f4b commit 33ee144

7 files changed

Lines changed: 83 additions & 12 deletions

File tree

src/Umbraco.Web.UI.Client/src/packages/core/content/manager/content-data-manager.ts

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import type { UmbContentDetailModel } from '../types.js';
22
import { UmbElementWorkspaceDataManager } from './element-data-manager.js';
33
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
44
import { appendToFrozenArray, jsonStringComparison } from '@umbraco-cms/backoffice/observable-api';
5-
import { UmbVariantId, type UmbEntityVariantModel } from '@umbraco-cms/backoffice/variant';
5+
import { UmbVariantId, umbVariantObjectCompare, type UmbEntityVariantModel } from '@umbraco-cms/backoffice/variant';
66

77
export class UmbContentWorkspaceDataManager<
88
ModelType extends UmbContentDetailModel,
@@ -19,6 +19,27 @@ export class UmbContentWorkspaceDataManager<
1919
this.#variantScaffold = variantScaffold;
2020
}
2121

22+
protected override _sortCurrentData<GivenType extends Partial<ModelType> = Partial<ModelType>>(
23+
persistedData: Partial<ModelType>,
24+
currentData: GivenType,
25+
): GivenType {
26+
currentData = super._sortCurrentData(persistedData, currentData);
27+
// Sort the variants in the same order as the persisted data:
28+
const persistedVariants = persistedData.variants;
29+
if (persistedVariants && currentData.variants) {
30+
return {
31+
...currentData,
32+
variants: [...currentData.variants].sort(function (a, b) {
33+
return (
34+
persistedVariants.findIndex((x) => umbVariantObjectCompare(x, a)) -
35+
persistedVariants.findIndex((x) => umbVariantObjectCompare(x, b))
36+
);
37+
}),
38+
};
39+
}
40+
return currentData;
41+
}
42+
2243
/**
2344
* Sets the variant scaffold data
2445
* @param {ModelVariantType} variantScaffold The variant scaffold data
@@ -50,8 +71,7 @@ export class UmbContentWorkspaceDataManager<
5071
} as ModelVariantType,
5172
(x) => variantId.compare(x),
5273
) as Array<ModelVariantType>;
53-
// TODO: I have some trouble with TypeScript here, I does not look like me, but i had to give up. [NL]
54-
this._current.update({ variants: newVariants } as any);
74+
this.updateCurrent({ variants: newVariants } as unknown as ModelType);
5575
} else if (this._varies === false) {
5676
// TODO: Beware about segments, in this case we need to also consider segments, if its allowed to vary by segments.
5777
const invariantVariantId = UmbVariantId.CreateInvariant();
@@ -65,8 +85,7 @@ export class UmbContentWorkspaceDataManager<
6585
...update,
6686
} as ModelVariantType,
6787
];
68-
// TODO: I have some trouble with TypeScript here, I does not look like me, but i had to give up. [NL]
69-
this._current.update({ variants: newVariants } as any);
88+
this.updateCurrent({ variants: newVariants } as unknown as ModelType);
7089
} else {
7190
throw new Error('Varies by culture is missing');
7291
}

src/Umbraco.Web.UI.Client/src/packages/core/content/manager/element-data-manager.ts

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
import { UmbMergeContentVariantDataController } from '../controller/merge-content-variant-data.controller.js';
22
import type { UmbElementDetailModel } from '../types.js';
3-
import { UmbVariantId } from '@umbraco-cms/backoffice/variant';
3+
import { UmbVariantId, umbVariantObjectCompare } from '@umbraco-cms/backoffice/variant';
44
import { UmbEntityWorkspaceDataManager, type UmbWorkspaceDataManager } from '@umbraco-cms/backoffice/workspace';
55

6+
function valueObjectCompare(a: any, b: any) {
7+
return a.alias === b.alias && umbVariantObjectCompare(a, b);
8+
}
9+
610
export class UmbElementWorkspaceDataManager<ModelType extends UmbElementDetailModel>
711
extends UmbEntityWorkspaceDataManager<ModelType>
812
implements UmbWorkspaceDataManager<ModelType>
@@ -11,6 +15,27 @@ export class UmbElementWorkspaceDataManager<ModelType extends UmbElementDetailMo
1115
//#variesByCulture?: boolean;
1216
//#variesBySegment?: boolean;
1317

18+
protected override _sortCurrentData<GivenType extends Partial<ModelType> = Partial<ModelType>>(
19+
persistedData: Partial<ModelType>,
20+
currentData: GivenType,
21+
): GivenType {
22+
currentData = super._sortCurrentData(persistedData, currentData);
23+
// Sort the values in the same order as the persisted data:
24+
const persistedValues = persistedData.values;
25+
if (persistedValues && currentData.values) {
26+
return {
27+
...currentData,
28+
values: [...currentData.values].sort(function (a, b) {
29+
return (
30+
persistedValues.findIndex((x) => valueObjectCompare(x, a)) -
31+
persistedValues.findIndex((x) => valueObjectCompare(x, b))
32+
);
33+
}),
34+
};
35+
}
36+
return currentData;
37+
}
38+
1439
#updateLock = 0;
1540
initiatePropertyValueChange() {
1641
this.#updateLock++;
@@ -54,7 +79,7 @@ export class UmbElementWorkspaceDataManager<ModelType extends UmbElementDetailMo
5479
variantsToStore = [...selectedVariants, invariantVariantId];
5580
}
5681

57-
const data = this._current.getValue();
82+
const data = this.getCurrent();
5883
if (!data) throw new Error('Current data is missing');
5984
//if (!data.unique) throw new Error('Unique of current data is missing');
6085

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
export * from './variant-id.class.js';
2+
export * from './variant-object-compare.function.js';
23
export type * from './types.js';

src/Umbraco.Web.UI.Client/src/packages/core/variant/types.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@ import type { UmbLanguageDetailModel } from '@umbraco-cms/backoffice/language';
33
import type { ScheduleRequestModel } from '@umbraco-cms/backoffice/external/backend-api';
44
import type { UmbPropertyValueData } from '@umbraco-cms/backoffice/property';
55

6+
export type UmbObjectWithVariantProperties = {
7+
culture: string | null;
8+
segment: string | null;
9+
};
10+
611
export interface UmbVariantDataModel {
712
culture: string | null;
813
segment: string | null;

src/Umbraco.Web.UI.Client/src/packages/core/variant/variant-id.class.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
import { UmbDeprecation } from '../utils/index.js';
2-
3-
export type UmbObjectWithVariantProperties = {
4-
culture: string | null;
5-
segment: string | null;
6-
};
2+
import type { UmbObjectWithVariantProperties } from './types.js';
73

84
/**
95
*
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import type { UmbObjectWithVariantProperties } from './types.js';
2+
3+
export function umbVariantObjectCompare(a: UmbObjectWithVariantProperties, b: UmbObjectWithVariantProperties): boolean {
4+
return a.culture === b.culture && a.segment === b.segment;
5+
}

src/Umbraco.Web.UI.Client/src/packages/core/workspace/entity/entity-workspace-data-manager.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,14 @@ export class UmbEntityWorkspaceDataManager<ModelType>
2828
*/
2929
public readonly current = this._current.asObservable();
3030

31+
protected _sortCurrentData<GivenType extends Partial<ModelType> = Partial<ModelType>>(
32+
persistedData: Partial<ModelType>,
33+
currentData: GivenType,
34+
): GivenType {
35+
// do nothing.
36+
return currentData;
37+
}
38+
3139
/**
3240
* Gets persisted data
3341
* @returns {(ModelType | undefined)}
@@ -81,6 +89,12 @@ export class UmbEntityWorkspaceDataManager<ModelType>
8189
* @memberof UmbSubmittableWorkspaceDataManager
8290
*/
8391
setCurrent(data: ModelType | undefined) {
92+
if (data) {
93+
const persistedData = this._persisted.getValue();
94+
if (persistedData) {
95+
data = this._sortCurrentData(persistedData, data);
96+
}
97+
}
8498
this._current.setValue(data);
8599
}
86100

@@ -90,6 +104,12 @@ export class UmbEntityWorkspaceDataManager<ModelType>
90104
* @memberof UmbSubmittableWorkspaceDataManager
91105
*/
92106
updateCurrent(partialData: Partial<ModelType>) {
107+
if (partialData) {
108+
const persistedData = this._persisted.getValue();
109+
if (persistedData) {
110+
partialData = this._sortCurrentData(persistedData, partialData);
111+
}
112+
}
93113
this._current.update(partialData);
94114
}
95115

0 commit comments

Comments
 (0)