From 09b77be0b10f257a4e2059fe89c050641e8ec05e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Tue, 9 Sep 2025 20:28:27 +0200 Subject: [PATCH 01/11] update types for callArgs --- .../core/property/property-value-preset/types.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/types.ts b/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/types.ts index de87eed76680..c749e53612f0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/types.ts @@ -33,7 +33,17 @@ export interface UmbPropertyTypePresetModelTypeModel { variesByCulture?: boolean; variesBySegment?: boolean; } -export interface UmbPropertyValuePresetApiCallArgs { + +export interface UmbPropertyValuePresetApiCallArgsEntityBase { + entityType: string; + entityUnique: string; + entityTypeUnique?: string; +} + +export interface UmbPropertyValuePresetApiCallArgs extends UmbPropertyValuePresetApiCallArgsEntityBase { + alias: string; + propertyEditorUiAlias: string; + propertyEditorSchemaAlias?: string; variantId?: UmbVariantId; } From 3f8a99c31027a74e8b46fc1652b298563ef9c63a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Tue, 9 Sep 2025 20:28:35 +0200 Subject: [PATCH 02/11] note for Engage --- .../property-value-preset-variant-builder.controller.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/property-value-preset-variant-builder.controller.ts b/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/property-value-preset-variant-builder.controller.ts index ab5a4aa358fc..80370c44ece3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/property-value-preset-variant-builder.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/property-value-preset-variant-builder.controller.ts @@ -14,6 +14,8 @@ export class UmbPropertyValuePresetVariantBuilderController extends UmbPropertyV // Always declare the default segment (null) #segments: Array = [null]; + // TODO: We properly need to break this, as Engage needs to control which Segments are available for each culture, maybe investigate the option to go about a new option to just parse options.? Break in v.17.0 [NL] + setCultures(cultures: Array): void { this.#cultures = cultures; } From cd7a6128e653b3f138b3ba8b454b52d2d1b51e2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Tue, 9 Sep 2025 20:28:55 +0200 Subject: [PATCH 03/11] implement callArgs type updates --- ...roperty-value-preset-builder.controller.ts | 32 ++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/property-value-preset-builder.controller.ts b/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/property-value-preset-builder.controller.ts index 778a921acf33..2fb49deb346a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/property-value-preset-builder.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/property-value-preset-builder.controller.ts @@ -1,3 +1,4 @@ +import { UMB_BLOCK_ENTRY_CONTEXT } from '@umbraco-cms/backoffice/block'; import type { UmbPropertyValueData, UmbPropertyValueDataPotentiallyWithEditorAlias } from '../index.js'; import type { ManifestPropertyValuePreset, @@ -5,6 +6,7 @@ import type { UmbPropertyTypePresetWithSchemaAliasModel, UmbPropertyValuePreset, UmbPropertyValuePresetApiCallArgs, + UmbPropertyValuePresetApiCallArgsEntityBase, } from './types.js'; import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; import { createExtensionApi } from '@umbraco-cms/backoffice/extension-api'; @@ -15,6 +17,8 @@ const EMPTY_CALL_ARGS = Object.freeze({}); export class UmbPropertyValuePresetBuilderController< ReturnType = UmbPropertyValueData | UmbPropertyValueDataPotentiallyWithEditorAlias, > extends UmbControllerBase { + #baseCreateArgs?: UmbPropertyValuePresetApiCallArgsEntityBase; + /** * Clones the property data. * @param {UmbPropertyValueDataPotentiallyWithEditorAlias} propertyTypes - Data about the properties to make a preset for. @@ -22,7 +26,25 @@ export class UmbPropertyValuePresetBuilderController< */ async create( propertyTypes: Array, + // TODO: Remove Option argument and Partial<> in v.17.0 [NL] + createArgs?: Partial, ): Promise> { + // + // TODO: Clean up warnings in v.17.0 [NL] + this.#baseCreateArgs = { + entityType: createArgs?.entityType ?? 'document', + entityUnique: + createArgs?.entityUnique ?? + 'needs to be parsed from UmbPropertyValuePresetBuilderController, this is not present because of a custom legacy implementation', + entityTypeUnique: createArgs?.entityTypeUnique, + }; + + if (!createArgs?.entityUnique) { + console.log( + `[UmbPropertyValuePresetBuilderController] - entityUnique was not provided. This will be required in v.17.0 and must be provided when calling create().`, + ); + } + const result = await Promise.all(propertyTypes.map(this.#createPropertyPreset)); //Merge all the values into a single array: @@ -87,9 +109,17 @@ export class UmbPropertyValuePresetBuilderController< protected async _generatePropertyValue( apis: Array, propertyType: UmbPropertyTypePresetModel | UmbPropertyTypePresetWithSchemaAliasModel, - callArgs: UmbPropertyValuePresetApiCallArgs, + incomingCallArgs: Partial, ): Promise { let value: unknown = undefined; + + const callArgs: UmbPropertyValuePresetApiCallArgs = { + ...this.#baseCreateArgs!, + alias: propertyType.alias, + propertyEditorUiAlias: propertyType.propertyEditorUiAlias, + propertyEditorSchemaAlias: (propertyType as UmbPropertyTypePresetWithSchemaAliasModel).propertyEditorSchemaAlias, + ...incomingCallArgs, + }; // Important to use a inline for loop, to secure that each entry is processed(asynchronously) in order for (const api of apis) { if (!api.processValue) { From bce7bd4c8cd99e994f478a67abea6333cdd2f7e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Tue, 9 Sep 2025 20:29:02 +0200 Subject: [PATCH 04/11] tests --- ...ty-value-preset-builder.controller.test.ts | 25 +++++++++++++++---- ...-preset-variant-builder.controller.test.ts | 25 +++++++++++++++---- 2 files changed, 40 insertions(+), 10 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/property-value-preset-builder.controller.test.ts b/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/property-value-preset-builder.controller.test.ts index 55a274478504..ed9a344d175d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/property-value-preset-builder.controller.test.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/property-value-preset-builder.controller.test.ts @@ -72,7 +72,10 @@ describe('UmbPropertyValuePresetBuilderController', () => { }, ]; - const result = await ctrl.create(propertyTypes); + const result = await ctrl.create(propertyTypes, { + entityUnique: 'test-unique', + entityType: 'test', + }); expect(result.length).to.be.equal(1); expect(result[0]?.value).to.be.equal('first'); @@ -120,7 +123,10 @@ describe('UmbPropertyValuePresetBuilderController', () => { }, ]; - const result = await ctrl.create(propertyTypes); + const result = await ctrl.create(propertyTypes, { + entityUnique: 'test-unique', + entityType: 'test', + }); expect(result.length).to.be.equal(1); expect(result[0]?.value).to.be.equal('first_second'); @@ -168,7 +174,10 @@ describe('UmbPropertyValuePresetBuilderController', () => { }, ]; - const result = await ctrl.create(propertyTypes); + const result = await ctrl.create(propertyTypes, { + entityUnique: 'test-unique', + entityType: 'test', + }); expect(result.length).to.be.equal(1); expect(result[0]?.value).to.be.equal('second_first'); @@ -233,7 +242,10 @@ describe('UmbPropertyValuePresetBuilderController', () => { }, ]; - const result = await ctrl.create(propertyTypes); + const result = await ctrl.create(propertyTypes, { + entityUnique: 'test-unique', + entityType: 'test', + }); expect(result.length).to.be.equal(2); expect(result[0]?.alias).to.be.equal('test'); @@ -310,7 +322,10 @@ describe('UmbPropertyValuePresetBuilderController', () => { }, ]; - const result = await ctrl.create(propertyTypes); + const result = await ctrl.create(propertyTypes, { + entityUnique: 'test-unique', + entityType: 'test', + }); // Test that only the right presets are used: expect(result.length).to.be.equal(3); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/property-value-preset-variant-builder.controller.test.ts b/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/property-value-preset-variant-builder.controller.test.ts index 74f04d849eff..dda4302a4cf7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/property-value-preset-variant-builder.controller.test.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/property-value-preset-variant-builder.controller.test.ts @@ -63,7 +63,10 @@ describe('UmbPropertyValuePresetVariantBuilderController', () => { }, ]; - const result = await ctrl.create(propertyTypes); + const result = await ctrl.create(propertyTypes, { + entityType: 'test', + entityUnique: 'some-unique', + }); expect(result.length).to.be.equal(2); expect(result[0]?.value).to.be.equal('value for culture cultureA'); @@ -86,7 +89,10 @@ describe('UmbPropertyValuePresetVariantBuilderController', () => { ]; try { - await ctrl.create(propertyTypes); + await ctrl.create(propertyTypes, { + entityType: 'test', + entityUnique: 'some-unique', + }); expect.fail('Expected to fail'); } catch (e) {} }); @@ -105,7 +111,10 @@ describe('UmbPropertyValuePresetVariantBuilderController', () => { }, ]; - const result = await ctrl.create(propertyTypes); + const result = await ctrl.create(propertyTypes, { + entityType: 'test', + entityUnique: 'some-unique', + }); expect(result.length).to.be.equal(3); expect(result[0]?.value).to.be.equal('value for culture invariant'); @@ -132,7 +141,10 @@ describe('UmbPropertyValuePresetVariantBuilderController', () => { }, ]; - const result = await ctrl.create(propertyTypes); + const result = await ctrl.create(propertyTypes, { + entityType: 'test', + entityUnique: 'some-unique', + }); expect(result.length).to.be.equal(1); expect(result[0]?.value).to.be.equal('value for culture invariant'); @@ -155,7 +167,10 @@ describe('UmbPropertyValuePresetVariantBuilderController', () => { }, ]; - const result = await ctrl.create(propertyTypes); + const result = await ctrl.create(propertyTypes, { + entityType: 'test', + entityUnique: 'some-unique', + }); expect(result.length).to.be.equal(6); From 0bb5954e5408551716957e45408393eb9ce5f586 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Tue, 9 Sep 2025 20:29:26 +0200 Subject: [PATCH 05/11] implement callArgs for Value Preset Builder --- .../block/block/context/block-manager.context.ts | 6 +++++- .../workspace/content-detail-workspace-base.ts | 12 ++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block/context/block-manager.context.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block/context/block-manager.context.ts index a54d1190c416..ca4387dc9c65 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block/context/block-manager.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block/context/block-manager.context.ts @@ -414,7 +414,11 @@ export abstract class UmbBlockManagerContext< if (segments) { controller.setSegments(segments); } - const values = await controller.create(valueDefinitions); + const values = await controller.create(valueDefinitions, { + entityType: 'block', + entityUnique: key, + entityTypeUnique: contentTypeKey, + }); // Set culture and segment for all values: 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 7d4dd3a84f05..9e57506a4514 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 @@ -382,8 +382,12 @@ export abstract class UmbContentDetailWorkspaceContextBase< } protected override async _scaffoldProcessData(data: DetailModelType): Promise { + const contentTypeUnique: string | undefined = (data as any)[this.#contentTypePropertyName].unique; + if (!contentTypeUnique) { + throw new Error(`Could not find content type unique on property '${this.#contentTypePropertyName}'`); + } // 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((data as any)[this.#contentTypePropertyName].unique); + await this.structure.loadType(contentTypeUnique); /** * TODO: Should we also set Preset Values when loading Content, because maybe content contains uncreated Cultures or Segments. @@ -432,7 +436,11 @@ export abstract class UmbContentDetailWorkspaceContextBase< controller.setSegments(segments); } - const presetValues = await controller.create(valueDefinitions); + const presetValues = await controller.create(valueDefinitions, { + entityType: this.getEntityType(), + entityUnique: data.unique, + entityTypeUnique: contentTypeUnique, + }); // Don't just set the values, as we could have some already populated from a blueprint. // If we have a value from both a blueprint and a preset, use the latter as priority. From 4a7c7a22409b84ca10a0311d91aa2816531eaca8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Tue, 9 Sep 2025 20:34:14 +0200 Subject: [PATCH 06/11] updated fallback and console.log feedback --- .../property-value-preset-builder.controller.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/property-value-preset-builder.controller.ts b/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/property-value-preset-builder.controller.ts index 2fb49deb346a..a2d5fca5b5e0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/property-value-preset-builder.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/property-value-preset-builder.controller.ts @@ -32,16 +32,18 @@ export class UmbPropertyValuePresetBuilderController< // // TODO: Clean up warnings in v.17.0 [NL] this.#baseCreateArgs = { - entityType: createArgs?.entityType ?? 'document', + entityType: + createArgs?.entityType ?? + 'needs to be parsed to the UmbPropertyValuePresetBuilderController, this is not present because of a custom legacy implementation', entityUnique: createArgs?.entityUnique ?? - 'needs to be parsed from UmbPropertyValuePresetBuilderController, this is not present because of a custom legacy implementation', + 'needs to be parsed to the UmbPropertyValuePresetBuilderController, this is not present because of a custom legacy implementation', entityTypeUnique: createArgs?.entityTypeUnique, }; - if (!createArgs?.entityUnique) { + if (!createArgs?.entityUnique || !createArgs?.entityType) { console.log( - `[UmbPropertyValuePresetBuilderController] - entityUnique was not provided. This will be required in v.17.0 and must be provided when calling create().`, + `entityUnique or entityType was not provided for UmbPropertyValuePresetBuilderController.create in the second argument. This will be required in v.17.0 and must be provided when calling create().`, ); } From 051c749f8726d5125adba836cc7637e629669fe6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Tue, 9 Sep 2025 20:34:41 +0200 Subject: [PATCH 07/11] change to warn --- .../property-value-preset-builder.controller.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/property-value-preset-builder.controller.ts b/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/property-value-preset-builder.controller.ts index a2d5fca5b5e0..a0830ea169d4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/property-value-preset-builder.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/property-value-preset-builder.controller.ts @@ -42,7 +42,7 @@ export class UmbPropertyValuePresetBuilderController< }; if (!createArgs?.entityUnique || !createArgs?.entityType) { - console.log( + console.warn( `entityUnique or entityType was not provided for UmbPropertyValuePresetBuilderController.create in the second argument. This will be required in v.17.0 and must be provided when calling create().`, ); } From 1103cd061a76edbd7ddbd26cf380f1a0715bca2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Tue, 9 Sep 2025 20:38:16 +0200 Subject: [PATCH 08/11] remove unused import --- .../property-value-preset-builder.controller.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/property-value-preset-builder.controller.ts b/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/property-value-preset-builder.controller.ts index a0830ea169d4..c72c0ce5a677 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/property-value-preset-builder.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/property-value-preset-builder.controller.ts @@ -1,4 +1,3 @@ -import { UMB_BLOCK_ENTRY_CONTEXT } from '@umbraco-cms/backoffice/block'; import type { UmbPropertyValueData, UmbPropertyValueDataPotentiallyWithEditorAlias } from '../index.js'; import type { ManifestPropertyValuePreset, From 0b555e37fc6777828847c3a3100c87cfd67898f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Tue, 9 Sep 2025 20:47:31 +0200 Subject: [PATCH 09/11] JS docs --- .../property-value-preset-builder.controller.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/property-value-preset-builder.controller.ts b/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/property-value-preset-builder.controller.ts index c72c0ce5a677..e73b840640c4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/property-value-preset-builder.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/property-value-preset-builder.controller.ts @@ -21,6 +21,7 @@ export class UmbPropertyValuePresetBuilderController< /** * Clones the property data. * @param {UmbPropertyValueDataPotentiallyWithEditorAlias} propertyTypes - Data about the properties to make a preset for. + * @param createArgs * @returns {Promise} - A promise that resolves to the cloned property data. */ async create( From 4fdf6b26a4f2f5b31b21125522db6a9ddf5063ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Tue, 9 Sep 2025 20:47:35 +0200 Subject: [PATCH 10/11] TODO --- .../content/content/workspace/content-detail-workspace-base.ts | 1 + 1 file changed, 1 insertion(+) 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 9e57506a4514..c224375f7d70 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 @@ -397,6 +397,7 @@ export abstract class UmbContentDetailWorkspaceContextBase< 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'); } // TODO: Add Segments for Presets: From 2a27b67ec1a629f8fa65319c194d06494015e23e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Tue, 9 Sep 2025 20:47:43 +0200 Subject: [PATCH 11/11] lint fix --- .../src/packages/tiptap/extensions/italic/italic.tiptap-api.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/italic/italic.tiptap-api.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/italic/italic.tiptap-api.ts index 49a3077adc8b..29300a4ee545 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/italic/italic.tiptap-api.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/italic/italic.tiptap-api.ts @@ -4,4 +4,3 @@ import { Italic } from '@umbraco-cms/backoffice/external/tiptap'; export default class UmbTiptapItalicExtensionApi extends UmbTiptapExtensionApiBase { getTiptapExtensions = () => [Italic]; } -