{"version":3,"file":"index.js","sources":["../../../../src/packages/core/property/components/unsupported-property/utils.ts","../../../../src/packages/core/property/property-value-cloner/property-value-clone.controller.ts","../../../../src/packages/core/property/property-value-preset/property-value-preset-builder.controller.ts","../../../../src/packages/core/property/property-value-preset/property-value-preset-variant-builder.controller.ts"],"sourcesContent":["import type { UmbUnsupportedEditorSchemaAliases } from '../../types/index.js';\r\n\r\nexport const UMB_UNSUPPORTED_EDITOR_SCHEMA_ALIASES: UmbUnsupportedEditorSchemaAliases = {\r\n\tblock: ['Umbraco.ImageCropper', 'Umbraco.UploadField'],\r\n};\r\n","import type { UmbPropertyValueDataPotentiallyWithEditorAlias } from '../index.js';\r\nimport { UmbControllerBase } from '@umbraco-cms/backoffice/class-api';\r\nimport { createExtensionApi } from '@umbraco-cms/backoffice/extension-api';\r\nimport { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry';\r\n\r\nexport class UmbPropertyValueCloneController extends UmbControllerBase {\r\n\t/**\r\n\t * Clones the property data.\r\n\t * @param {UmbPropertyValueDataPotentiallyWithEditorAlias} property - The property data.\r\n\t * @returns {Promise} - A promise that resolves to the cloned property data.\r\n\t */\r\n\tasync clone(\r\n\t\tproperty: UmbPropertyValueDataPotentiallyWithEditorAlias,\r\n\t): Promise> {\r\n\t\tconst result = await this.#cloneProperty(property);\r\n\r\n\t\tthis.destroy();\r\n\r\n\t\treturn result ?? property;\r\n\t}\r\n\r\n\tasync #cloneProperty(\r\n\t\tproperty: UmbPropertyValueDataPotentiallyWithEditorAlias,\r\n\t): Promise> {\r\n\t\tconst clonedProperty = await this.#cloneValue(property);\r\n\t\treturn await this.#cloneInnerValues(clonedProperty);\r\n\t}\r\n\r\n\tasync #cloneValue(\r\n\t\tincomingProperty: UmbPropertyValueDataPotentiallyWithEditorAlias,\r\n\t): Promise> {\r\n\t\tconst editorAlias = (incomingProperty as any).editorAlias as string | undefined;\r\n\t\tif (!editorAlias) {\r\n\t\t\tconsole.error(`Editor alias not found for ${incomingProperty.alias}`);\r\n\t\t\treturn incomingProperty;\r\n\t\t}\r\n\r\n\t\t// Find the cloner for this editor alias:\r\n\t\tconst manifest = umbExtensionsRegistry.getByTypeAndFilter(\r\n\t\t\t'propertyValueCloner',\r\n\t\t\t(x) => x.forEditorAlias === editorAlias,\r\n\t\t)[0];\r\n\r\n\t\tif (!manifest) {\r\n\t\t\treturn incomingProperty;\r\n\t\t}\r\n\r\n\t\tconst api = await createExtensionApi(this, manifest);\r\n\t\tif (!api) {\r\n\t\t\treturn incomingProperty;\r\n\t\t}\r\n\r\n\t\tlet clonedProperty = incomingProperty;\r\n\r\n\t\tif (api.cloneValue) {\r\n\t\t\tconst clonedValue = await api.cloneValue(incomingProperty.value);\r\n\t\t\tif (clonedValue) {\r\n\t\t\t\tclonedProperty = { ...incomingProperty, value: clonedValue };\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn clonedProperty;\r\n\t}\r\n\r\n\tasync #cloneInnerValues(\r\n\t\tincomingProperty: UmbPropertyValueDataPotentiallyWithEditorAlias,\r\n\t): Promise> {\r\n\t\tconst editorAlias = (incomingProperty as any).editorAlias as string | undefined;\r\n\t\tif (!editorAlias) {\r\n\t\t\treturn incomingProperty;\r\n\t\t}\r\n\r\n\t\t// Find the resolver for this editor alias:\r\n\t\tconst manifest = umbExtensionsRegistry.getByTypeAndFilter(\r\n\t\t\t'propertyValueResolver',\r\n\t\t\t// TODO: Remove depcrated filter option in v.17 [NL]\r\n\t\t\t(x) => x.forEditorAlias === editorAlias || x.meta?.editorAlias === editorAlias,\r\n\t\t)[0];\r\n\r\n\t\tif (!manifest) {\r\n\t\t\treturn incomingProperty;\r\n\t\t}\r\n\r\n\t\tconst api = await createExtensionApi(this, manifest);\r\n\t\tif (!api) {\r\n\t\t\treturn incomingProperty;\r\n\t\t}\r\n\r\n\t\tif (api.processValues) {\r\n\t\t\treturn (\r\n\t\t\t\t(await api.processValues(incomingProperty, async (properties) => {\r\n\t\t\t\t\t// Transform the values:\r\n\t\t\t\t\tconst clonedValues = await Promise.all(\r\n\t\t\t\t\t\tproperties.map(async (value) => {\r\n\t\t\t\t\t\t\treturn (await this.#cloneProperty(value)) ?? value;\r\n\t\t\t\t\t\t}),\r\n\t\t\t\t\t);\r\n\r\n\t\t\t\t\treturn clonedValues;\r\n\t\t\t\t})) ?? incomingProperty\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\t// the api did not provide a value processor, so we will return the incoming property:\r\n\t\treturn incomingProperty;\r\n\t}\r\n}\r\n","import type { UmbPropertyValueData, UmbPropertyValueDataPotentiallyWithEditorAlias } from '../index.js';\r\nimport type {\r\n\tManifestPropertyValuePreset,\r\n\tUmbPropertyTypePresetModel,\r\n\tUmbPropertyTypePresetWithSchemaAliasModel,\r\n\tUmbPropertyValuePreset,\r\n\tUmbPropertyValuePresetApiCallArgs,\r\n} from './types.js';\r\nimport { UmbControllerBase } from '@umbraco-cms/backoffice/class-api';\r\nimport { createExtensionApi } from '@umbraco-cms/backoffice/extension-api';\r\nimport { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry';\r\n\r\nconst EMPTY_CALL_ARGS = Object.freeze({});\r\n\r\nexport class UmbPropertyValuePresetBuilderController<\r\n\tReturnType = UmbPropertyValueData | UmbPropertyValueDataPotentiallyWithEditorAlias,\r\n> extends UmbControllerBase {\r\n\t/**\r\n\t * Clones the property data.\r\n\t * @param {UmbPropertyValueDataPotentiallyWithEditorAlias} propertyTypes - Data about the properties to make a preset for.\r\n\t * @returns {Promise} - A promise that resolves to the cloned property data.\r\n\t */\r\n\tasync create(\r\n\t\tpropertyTypes: Array,\r\n\t): Promise> {\r\n\t\tconst result = await Promise.all(propertyTypes.map(this.#createPropertyPreset));\r\n\r\n\t\t//Merge all the values into a single array:\r\n\t\tconst values = result.flatMap((x) => x);\r\n\r\n\t\tthis.destroy();\r\n\r\n\t\treturn values;\r\n\t}\r\n\r\n\t#createPropertyPreset = async (\r\n\t\tpropertyType: UmbPropertyTypePresetModel | UmbPropertyTypePresetWithSchemaAliasModel,\r\n\t): Promise> => {\r\n\t\tconst editorAlias: string | undefined = (propertyType as UmbPropertyTypePresetWithSchemaAliasModel)\r\n\t\t\t.propertyEditorSchemaAlias;\r\n\r\n\t\tconst editorUiAlias = propertyType.propertyEditorUiAlias;\r\n\t\tif (!editorUiAlias) {\r\n\t\t\tthrow new Error(`propertyEditorUiAlias was not defined in ${propertyType}`);\r\n\t\t}\r\n\r\n\t\tlet filter: (x: ManifestPropertyValuePreset) => boolean;\r\n\t\tif (editorAlias && editorUiAlias) {\r\n\t\t\tfilter = (x) => x.forPropertyEditorSchemaAlias === editorAlias || x.forPropertyEditorUiAlias === editorUiAlias;\r\n\t\t} else {\r\n\t\t\tfilter = (x) => x.forPropertyEditorUiAlias === editorUiAlias;\r\n\t\t}\r\n\r\n\t\t// Find a preset for this editor alias:\r\n\t\tconst manifests = umbExtensionsRegistry.getByTypeAndFilter('propertyValuePreset', filter);\r\n\r\n\t\tconst apis = (await Promise.all(manifests.map((x) => createExtensionApi(this, x)))).filter(\r\n\t\t\t(x) => x !== undefined,\r\n\t\t) as Array;\r\n\r\n\t\tconst result = await this._generatePropertyValues(apis, propertyType);\r\n\r\n\t\tfor (const api of apis) {\r\n\t\t\tapi.destroy();\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t};\r\n\r\n\tprotected async _generatePropertyValues(\r\n\t\tapis: Array,\r\n\t\tpropertyType: UmbPropertyTypePresetModel | UmbPropertyTypePresetWithSchemaAliasModel,\r\n\t): Promise> {\r\n\t\tconst property = await this._generatePropertyValue(apis, propertyType, EMPTY_CALL_ARGS);\r\n\t\treturn property ? [property] : [];\r\n\t}\r\n\r\n\tprotected async _generatePropertyValue(\r\n\t\tapis: Array,\r\n\t\tpropertyType: UmbPropertyTypePresetModel | UmbPropertyTypePresetWithSchemaAliasModel,\r\n\t\tcallArgs: UmbPropertyValuePresetApiCallArgs,\r\n\t): Promise {\r\n\t\tlet value: unknown = undefined;\r\n\t\t// Important to use a inline for loop, to secure that each entry is processed(asynchronously) in order\r\n\t\tfor (const api of apis) {\r\n\t\t\tif (!api.processValue) {\r\n\t\t\t\tthrow new Error(`'processValue()' method is not defined in the api: ${api.constructor.name}`);\r\n\t\t\t}\r\n\r\n\t\t\tvalue = await api.processValue(value, propertyType.config, propertyType.typeArgs, callArgs);\r\n\t\t}\r\n\r\n\t\tif (!value) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif ((propertyType as UmbPropertyTypePresetWithSchemaAliasModel).propertyEditorSchemaAlias) {\r\n\t\t\treturn {\r\n\t\t\t\teditorAlias: (propertyType as UmbPropertyTypePresetWithSchemaAliasModel).propertyEditorSchemaAlias,\r\n\t\t\t\talias: propertyType.alias,\r\n\t\t\t\tvalue,\r\n\t\t\t} satisfies UmbPropertyValueDataPotentiallyWithEditorAlias as ReturnType;\r\n\t\t} else {\r\n\t\t\treturn {\r\n\t\t\t\talias: propertyType.alias,\r\n\t\t\t\tvalue,\r\n\t\t\t} satisfies UmbPropertyValueData as ReturnType;\r\n\t\t}\r\n\t}\r\n}\r\n","import { UmbVariantId } from '../../variant/variant-id.class.js';\r\nimport { UmbPropertyValuePresetBuilderController } from './property-value-preset-builder.controller.js';\r\nimport type {\r\n\tUmbPropertyTypePresetModel,\r\n\tUmbPropertyTypePresetWithSchemaAliasModel,\r\n\tUmbPropertyValuePreset,\r\n} from './types.js';\r\nimport type { UmbElementValueModel } from '@umbraco-cms/backoffice/content';\r\n\r\ntype ReturnType = UmbElementValueModel;\r\n\r\nexport class UmbPropertyValuePresetVariantBuilderController extends UmbPropertyValuePresetBuilderController {\r\n\t#cultures: Array = [];\r\n\t// Always declare the default segment (null)\r\n\t#segments: Array = [null];\r\n\r\n\tsetCultures(cultures: Array): void {\r\n\t\tthis.#cultures = cultures;\r\n\t}\r\n\tsetSegments(segments: Array): void {\r\n\t\t// No matter how many segments are present, always include the default segment (null)\r\n\t\tthis.#segments = [null, ...segments];\r\n\t}\r\n\r\n\tprotected override async _generatePropertyValues(\r\n\t\tapis: Array,\r\n\t\tpropertyType: UmbPropertyTypePresetModel | UmbPropertyTypePresetWithSchemaAliasModel,\r\n\t): Promise> {\r\n\t\tconst values: Array = [];\r\n\r\n\t\tif (propertyType.typeArgs.variesBySegment && propertyType.typeArgs.variesByCulture) {\r\n\t\t\tif (this.#cultures.length === 0) {\r\n\t\t\t\tthrow new Error('Cultures must be set when varying by culture.');\r\n\t\t\t}\r\n\r\n\t\t\tfor (const culture of this.#cultures) {\r\n\t\t\t\tfor (const segment of this.#segments) {\r\n\t\t\t\t\tconst value = await this._generatePropertyValue(apis, propertyType, {\r\n\t\t\t\t\t\tvariantId: new UmbVariantId(culture, segment),\r\n\t\t\t\t\t});\r\n\t\t\t\t\tif (value) {\r\n\t\t\t\t\t\tvalue.culture = culture;\r\n\t\t\t\t\t\tvalue.segment = segment;\r\n\t\t\t\t\t\tvalues.push(value);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else if (propertyType.typeArgs.variesByCulture) {\r\n\t\t\tif (this.#cultures.length === 0) {\r\n\t\t\t\tthrow new Error('Cultures must be set when varying by culture.');\r\n\t\t\t}\r\n\r\n\t\t\tfor (const culture of this.#cultures) {\r\n\t\t\t\tconst value = await this._generatePropertyValue(apis, propertyType, {\r\n\t\t\t\t\tvariantId: new UmbVariantId(culture),\r\n\t\t\t\t});\r\n\t\t\t\tif (value) {\r\n\t\t\t\t\tvalue.culture = culture;\r\n\t\t\t\t\tvalue.segment = null;\r\n\t\t\t\t\tvalues.push(value);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else if (propertyType.typeArgs.variesBySegment) {\r\n\t\t\tfor (const segment of this.#segments) {\r\n\t\t\t\tconst value = await this._generatePropertyValue(apis, propertyType, {\r\n\t\t\t\t\tvariantId: new UmbVariantId(null, segment),\r\n\t\t\t\t});\r\n\t\t\t\tif (value) {\r\n\t\t\t\t\t// Be aware this maybe should have been the default culture?\r\n\t\t\t\t\tvalue.culture = null;\r\n\t\t\t\t\tvalue.segment = segment;\r\n\t\t\t\t\tvalues.push(value);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tconst value = await this._generatePropertyValue(apis, propertyType, {});\r\n\t\t\tif (value) {\r\n\t\t\t\t// Be aware this maybe should have been the default culture?\r\n\t\t\t\tvalue.culture = null;\r\n\t\t\t\tvalue.segment = null;\r\n\t\t\t\tvalues.push(value);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn values;\r\n\t}\r\n}\r\n"],"names":["UMB_UNSUPPORTED_EDITOR_SCHEMA_ALIASES","UmbPropertyValueCloneController","UmbControllerBase","property","result","#cloneProperty","clonedProperty","#cloneValue","#cloneInnerValues","incomingProperty","editorAlias","manifest","umbExtensionsRegistry","x","api","createExtensionApi","clonedValue","properties","value","EMPTY_CALL_ARGS","UmbPropertyValuePresetBuilderController","propertyTypes","values","#createPropertyPreset","propertyType","editorUiAlias","filter","manifests","apis","callArgs","UmbPropertyValuePresetVariantBuilderController","#cultures","#segments","cultures","segments","culture","segment","UmbVariantId"],"mappings":"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"}