From 4e5c6c625384d392fcf5907202a99c5ab2ab93d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Mon, 1 Dec 2025 14:55:31 +0100 Subject: [PATCH 1/5] refactor to load segments before processing incoming data --- .../content-type-workspace-context-base.ts | 1 - .../content-detail-workspace-base.ts | 43 ++++++++++++++----- .../entity-detail-workspace-base.ts | 5 +-- .../workspace/document-workspace.context.ts | 26 +++++------ 4 files changed, 44 insertions(+), 31 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/content/content-type/workspace/content-type-workspace-context-base.ts b/src/Umbraco.Web.UI.Client/src/packages/content/content-type/workspace/content-type-workspace-context-base.ts index 67873bffb961..2d23f998dd7a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/content/content-type/workspace/content-type-workspace-context-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/content/content-type/workspace/content-type-workspace-context-base.ts @@ -92,7 +92,6 @@ export abstract class UmbContentTypeWorkspaceContextBase< let { data } = await request; if (data) { - data = await this._processIncomingData(data); data = await this._scaffoldProcessData(data); if (this.modalContext) { diff --git a/src/Umbraco.Web.UI.Client/src/packages/content/content/workspace/content-detail-workspace-base.ts b/src/Umbraco.Web.UI.Client/src/packages/content/content/workspace/content-detail-workspace-base.ts index caa326e926fb..719618db69da 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/content/content/workspace/content-detail-workspace-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/content/content/workspace/content-detail-workspace-base.ts @@ -155,6 +155,13 @@ export abstract class UmbContentDetailWorkspaceContextBase< */ public readonly languages = this.#languages.asObservable(); + protected readonly _segmentsLoaded: Promise = new Promise((resolve, reject) => { + this._segmentsLoadedResolver = resolve; + this._segmentsLoadedRejector = reject; + }); + protected _segmentsLoadedResolver!: () => void; + protected _segmentsLoadedRejector!: () => void; + protected readonly _segments = new UmbArrayState([], (x) => x.alias); // eslint-disable-next-line @typescript-eslint/ban-ts-comment @@ -368,11 +375,6 @@ export abstract class UmbContentDetailWorkspaceContextBase< (varies) => { this._data.setVariesBySegment(varies); this.#variesBySegment = varies; - if (varies) { - this.loadSegments(); - } else { - this._segments.setValue([]); - } }, null, ); @@ -393,7 +395,20 @@ export abstract class UmbContentDetailWorkspaceContextBase< this.#languages.setValue(data?.items ?? []); } + /** + * @deprecated Call `_loadSegmentsFor` instead. `loadSegments` will be removed in v.18. + */ protected async loadSegments() { + const unique = await firstValueFrom(this.unique); + if (!unique) { + this._segments.setValue([]); + return; + } + this._loadSegmentsFor(unique); + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + protected async _loadSegmentsFor(unique: string): Promise { console.warn( `UmbContentDetailWorkspaceContextBase: Segments are not implemented in the workspace context for "${this.getEntityType()}" types.`, ); @@ -415,21 +430,27 @@ export abstract class UmbContentDetailWorkspaceContextBase< // Load the content type structure, usually this comes from the data, but in this case we are making the data, and we need this to be able to complete the data. [NL] await this.structure.loadType(contentTypeUnique); + // Load segments if varying by segment, or reset to empty array: + if (this.#variesBySegment) { + await this._loadSegmentsFor(contentTypeUnique); + } else { + this._segments.setValue([]); + } + // Set culture and segment for all values: const cultures = this.#languages.getValue().map((x) => x.unique); - if (this.structure.variesBySegment) { - // TODO: v.17 Engage please note we have not implemented support for segments yet. [NL] - console.warn('Segments are not yet implemented for preset'); + let segments: Array | undefined; + if (this.#variesBySegment) { + segments = this._segments.getValue().map((s) => s.alias); + console.log('segments', segments, cultures); } - // TODO: Add Segments for Presets: - const segments: Array | undefined = this.structure.variesBySegment ? [] : undefined; const repo = new UmbDataTypeDetailRepository(this); const propertyTypes = await this.structure.getContentTypeProperties(); const contentTypeVariesByCulture = this.structure.getVariesByCulture(); - const contentTypeVariesBySegment = this.structure.getVariesByCulture(); + const contentTypeVariesBySegment = this.structure.getVariesBySegment(); const valueDefinitions = await Promise.all( propertyTypes.map(async (property) => { // TODO: Implement caching for data-type requests. [NL] diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/entity-detail/entity-detail-workspace-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/entity-detail/entity-detail-workspace-base.ts index c1e0912a3f61..b9e95b34ef1c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/entity-detail/entity-detail-workspace-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/entity-detail/entity-detail-workspace-base.ts @@ -253,7 +253,7 @@ export abstract class UmbEntityDetailWorkspaceContextBase< } } } else if (data) { - const processedData = await this._processIncomingData(data); + const processedData = await this._scaffoldProcessData(data); this._data.setPersisted(processedData); this._data.setCurrent(processedData); @@ -311,7 +311,6 @@ export abstract class UmbEntityDetailWorkspaceContextBase< let { data } = await request; if (data) { - data = await this._processIncomingData(data); data = await this._scaffoldProcessData(data); if (this.modalContext) { @@ -336,7 +335,7 @@ export abstract class UmbEntityDetailWorkspaceContextBase< * @returns {Promise} The processed data. */ protected async _scaffoldProcessData(data: DetailModelType): Promise { - return data; + return await this._processIncomingData(data); } protected async _processIncomingData(data: DetailModelType): Promise { return data; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts index 0d199d874c3a..7ddd97262f49 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts @@ -227,22 +227,16 @@ export class UmbDocumentWorkspaceContext this.#isTrashedContext.setIsTrashed(false); } - protected override async loadSegments(): Promise { - this.observe( - this.unique, - async (unique) => { - if (!unique) { - this._segments.setValue([]); - return; - } - const { data } = await this.#documentSegmentRepository.getDocumentByIdSegmentOptions(unique, { - skip: 0, - take: 9999, - }); - this._segments.setValue(data?.items ?? []); - }, - '_loadSegmentsUnique', - ); + protected override async _loadSegmentsFor(unique: string): Promise { + if (!unique) { + this._segments.setValue([]); + return; + } + const { data } = await this.#documentSegmentRepository.getDocumentByIdSegmentOptions(unique, { + skip: 0, + take: 9999, + }); + this._segments.setValue(data?.items ?? []); } async create(parent: UmbEntityModel, documentTypeUnique: string, blueprintUnique?: string) { From 64b4813a10e7ce8b146900ed1ae7e413b4c8d8c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Mon, 1 Dec 2025 15:46:27 +0100 Subject: [PATCH 2/5] clean up --- .../content/workspace/content-detail-workspace-base.ts | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/content/content/workspace/content-detail-workspace-base.ts b/src/Umbraco.Web.UI.Client/src/packages/content/content/workspace/content-detail-workspace-base.ts index 719618db69da..fd277a4996cc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/content/content/workspace/content-detail-workspace-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/content/content/workspace/content-detail-workspace-base.ts @@ -415,13 +415,6 @@ export abstract class UmbContentDetailWorkspaceContextBase< this._segments.setValue([]); } - /** - * @deprecated Call `_processIncomingData` instead. `_scaffoldProcessData` will be removed in v.18. - */ - protected override _scaffoldProcessData(data: DetailModelType): Promise { - return this._processIncomingData(data); - } - protected override async _processIncomingData(data: DetailModelType): Promise { const contentTypeUnique: string | undefined = (data as any)[this.#contentTypePropertyName].unique; if (!contentTypeUnique) { @@ -443,7 +436,6 @@ export abstract class UmbContentDetailWorkspaceContextBase< let segments: Array | undefined; if (this.#variesBySegment) { segments = this._segments.getValue().map((s) => s.alias); - console.log('segments', segments, cultures); } const repo = new UmbDataTypeDetailRepository(this); @@ -453,7 +445,6 @@ export abstract class UmbContentDetailWorkspaceContextBase< const contentTypeVariesBySegment = this.structure.getVariesBySegment(); const valueDefinitions = await Promise.all( propertyTypes.map(async (property) => { - // TODO: Implement caching for data-type requests. [NL] const dataType = (await repo.requestByUnique(property.dataType.unique)).data; // This means if its not loaded this will never resolve and the error below will never happen. if (!dataType) { From d3f5001dad8bd61ce78d934ef6a4a97acc190a5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Mon, 1 Dec 2025 15:50:28 +0100 Subject: [PATCH 3/5] remove unused segment promise --- .../content/workspace/content-detail-workspace-base.ts | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/content/content/workspace/content-detail-workspace-base.ts b/src/Umbraco.Web.UI.Client/src/packages/content/content/workspace/content-detail-workspace-base.ts index fd277a4996cc..f694657e672e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/content/content/workspace/content-detail-workspace-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/content/content/workspace/content-detail-workspace-base.ts @@ -155,13 +155,6 @@ export abstract class UmbContentDetailWorkspaceContextBase< */ public readonly languages = this.#languages.asObservable(); - protected readonly _segmentsLoaded: Promise = new Promise((resolve, reject) => { - this._segmentsLoadedResolver = resolve; - this._segmentsLoadedRejector = reject; - }); - protected _segmentsLoadedResolver!: () => void; - protected _segmentsLoadedRejector!: () => void; - protected readonly _segments = new UmbArrayState([], (x) => x.alias); // eslint-disable-next-line @typescript-eslint/ban-ts-comment From 450937ae5e1fd68bdfae89d8609dcc220e76f65d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Mon, 1 Dec 2025 15:59:03 +0100 Subject: [PATCH 4/5] use document unique --- .../content/content/workspace/content-detail-workspace-base.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/content/content/workspace/content-detail-workspace-base.ts b/src/Umbraco.Web.UI.Client/src/packages/content/content/workspace/content-detail-workspace-base.ts index f694657e672e..8395984584ee 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/content/content/workspace/content-detail-workspace-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/content/content/workspace/content-detail-workspace-base.ts @@ -418,7 +418,7 @@ export abstract class UmbContentDetailWorkspaceContextBase< // Load segments if varying by segment, or reset to empty array: if (this.#variesBySegment) { - await this._loadSegmentsFor(contentTypeUnique); + await this._loadSegmentsFor(data.unique); } else { this._segments.setValue([]); } From 0739e130dd4bb26e31ca55a09f530f2bc5ffe8b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Mon, 1 Dec 2025 16:04:00 +0100 Subject: [PATCH 5/5] better more clear deprecation --- .../content/content/workspace/content-detail-workspace-base.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/content/content/workspace/content-detail-workspace-base.ts b/src/Umbraco.Web.UI.Client/src/packages/content/content/workspace/content-detail-workspace-base.ts index 8395984584ee..5abb4d4f7f05 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/content/content/workspace/content-detail-workspace-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/content/content/workspace/content-detail-workspace-base.ts @@ -390,8 +390,10 @@ export abstract class UmbContentDetailWorkspaceContextBase< /** * @deprecated Call `_loadSegmentsFor` instead. `loadSegments` will be removed in v.18. + * (note this was introduced in v.17, and deprecated in v.17.0.1) */ protected async loadSegments() { + console.warn('Stop using loadSegments, call _loadSegmentsFor instead. loadSegments will be removed in v.18.'); const unique = await firstValueFrom(this.unique); if (!unique) { this._segments.setValue([]);