diff --git a/src/Umbraco.Cms.Api.Management/DependencyInjection/UmbracoBuilder.Collections.cs b/src/Umbraco.Cms.Api.Management/DependencyInjection/UmbracoBuilder.Collections.cs index cd86b2a95f..60555379f5 100644 --- a/src/Umbraco.Cms.Api.Management/DependencyInjection/UmbracoBuilder.Collections.cs +++ b/src/Umbraco.Cms.Api.Management/DependencyInjection/UmbracoBuilder.Collections.cs @@ -10,18 +10,26 @@ namespace Umbraco.Extensions { internal static void AddCollectionBuilders(this IUmbracoBuilder builder) { - builder.SignProviders() + builder.FlagProviders() .Append() .Append() .Append() .Append(); } + /// + /// Gets the flag providers collection builder. + /// + /// The builder. + public static FlagProviderCollectionBuilder FlagProviders(this IUmbracoBuilder builder) + => builder.WithCollectionBuilder(); + /// /// Gets the sign providers collection builder. /// /// The builder. + [Obsolete("Please use the correctly named FlagProviders. Scheduled for removal in Umbraco 19.")] public static FlagProviderCollectionBuilder SignProviders(this IUmbracoBuilder builder) - => builder.WithCollectionBuilder(); + => builder.FlagProviders(); } } diff --git a/src/Umbraco.Web.UI.Client/package-lock.json b/src/Umbraco.Web.UI.Client/package-lock.json index 9e960fe1fb..0aea8fee90 100644 --- a/src/Umbraco.Web.UI.Client/package-lock.json +++ b/src/Umbraco.Web.UI.Client/package-lock.json @@ -64,8 +64,8 @@ "web-component-analyzer": "^2.0.0" }, "engines": { - "node": ">=22", - "npm": ">=10.9" + "node": ">=22.17.1", + "npm": ">=10.9.2" } }, "node_modules/@adobe/css-tools": { diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json index 16e3c71578..66b75fa2bc 100644 --- a/src/Umbraco.Web.UI.Client/package.json +++ b/src/Umbraco.Web.UI.Client/package.json @@ -215,8 +215,8 @@ "generate:ui-api-docs": "npm run generate:check-const-test && typedoc --options typedoc.config.js" }, "engines": { - "node": ">=22", - "npm": ">=10.9" + "node": ">=22.17.1", + "npm": ">=10.9.2" }, "dependencies": { "element-internals-polyfill": "^3.0.2" diff --git a/src/Umbraco.Web.UI.Client/src/packages/content/content-type/workspace/views/design/content-type-design-editor-properties.element.ts b/src/Umbraco.Web.UI.Client/src/packages/content/content-type/workspace/views/design/content-type-design-editor-properties.element.ts index 720ff8432b..90c6c59528 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/content/content-type/workspace/views/design/content-type-design-editor-properties.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/content/content-type/workspace/views/design/content-type-design-editor-properties.element.ts @@ -137,7 +137,7 @@ export class UmbContentTypeDesignEditorPropertiesElement extends UmbLitElement { public set containerId(value: string | null | undefined) { if (value === this._containerId) return; this._containerId = value; - this.createPropertyTypeWorkspaceRoutes(); + this.#createPropertyTypeWorkspaceRoutes(); this.#propertyStructureHelper.setContainerId(value); this.#addPropertyModal?.setUniquePathValue('container-id', value === null ? 'root' : value); this.#editPropertyModal?.setUniquePathValue('container-id', value === null ? 'root' : value); @@ -153,6 +153,12 @@ export class UmbContentTypeDesignEditorPropertiesElement extends UmbLitElement { >; #propertyStructureHelper = new UmbContentTypePropertyStructureHelper(this); + #initResolver?: () => void; + #initReject?: (reason?: any) => void; + #init = new Promise((resolve, reject) => { + this.#initResolver = resolve; + this.#initReject = reject; + }); @property({ attribute: false }) editContentTypePath?: string; @@ -199,22 +205,34 @@ export class UmbContentTypeDesignEditorPropertiesElement extends UmbLitElement { } this._ownerContentTypeUnique = workspaceContext?.structure.getOwnerContentTypeUnique(); - this.createPropertyTypeWorkspaceRoutes(); + this.#createPropertyTypeWorkspaceRoutes(); - this.observe( - workspaceContext?.variesByCulture, - (variesByCulture) => { - this._ownerContentTypeVariesByCulture = variesByCulture; - }, - 'observeOwnerVariesByCulture', - ); - this.observe( - workspaceContext?.variesBySegment, - (variesBySegment) => { - this._ownerContentTypeVariesBySegment = variesBySegment; - }, - 'observeOwnerVariesBySegment', - ); + const varyByCulturePromise = + this.observe( + workspaceContext?.variesByCulture, + (variesByCulture) => { + this._ownerContentTypeVariesByCulture = variesByCulture; + }, + 'observeOwnerVariesByCulture', + )?.asPromise() ?? Promise.reject(); + const varyBySegmentPromise = + this.observe( + workspaceContext?.variesBySegment, + (variesBySegment) => { + this._ownerContentTypeVariesBySegment = variesBySegment; + }, + 'observeOwnerVariesBySegment', + )?.asPromise() ?? Promise.reject(); + + if (this.#initResolver) { + Promise.all([varyByCulturePromise, varyBySegmentPromise]) + .then(() => { + this.#initResolver?.(); + this.#initResolver = undefined; + this.#initReject = undefined; + }) + .catch(() => {}); + } }); this.observe(this.#propertyStructureHelper.propertyStructure, (propertyStructure) => { this._properties = propertyStructure; @@ -222,7 +240,13 @@ export class UmbContentTypeDesignEditorPropertiesElement extends UmbLitElement { }); } - createPropertyTypeWorkspaceRoutes() { + override disconnectedCallback(): void { + super.disconnectedCallback(); + this.#initReject?.(new Error('Component disconnected')); + } + + async #createPropertyTypeWorkspaceRoutes() { + await this.#init; if (!this._ownerContentTypeUnique || this._containerId === undefined) return; // Note: Route for adding a new property @@ -247,6 +271,12 @@ export class UmbContentTypeDesignEditorPropertiesElement extends UmbLitElement { } preset.sortOrder = sortOrderInt; } + if (this._ownerContentTypeVariesByCulture) { + preset.variesByCulture = true; + } + if (this._ownerContentTypeVariesBySegment) { + preset.variesBySegment = true; + } return { data: { contentTypeUnique: this._ownerContentTypeUnique, preset: preset } }; }) .observeRouteBuilder((routeBuilder) => { 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 f54818f38c..caa326e926 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 @@ -428,6 +428,8 @@ export abstract class UmbContentDetailWorkspaceContextBase< const repo = new UmbDataTypeDetailRepository(this); const propertyTypes = await this.structure.getContentTypeProperties(); + const contentTypeVariesByCulture = this.structure.getVariesByCulture(); + const contentTypeVariesBySegment = this.structure.getVariesByCulture(); const valueDefinitions = await Promise.all( propertyTypes.map(async (property) => { // TODO: Implement caching for data-type requests. [NL] @@ -446,8 +448,9 @@ export abstract class UmbContentDetailWorkspaceContextBase< propertyEditorSchemaAlias: dataType.editorAlias, config: dataType.values, typeArgs: { - variesByCulture: property.variesByCulture, - variesBySegment: property.variesBySegment, + // Only vary if the content type varies: + variesByCulture: contentTypeVariesByCulture ? property.variesByCulture : false, + variesBySegment: contentTypeVariesBySegment ? property.variesBySegment : false, } as UmbPropertyTypePresetModelTypeModel, } as UmbPropertyTypePresetModel; }), diff --git a/src/Umbraco.Web.UI.Client/src/packages/content/property-type/workspace/views/settings/property-workspace-view-settings.element.ts b/src/Umbraco.Web.UI.Client/src/packages/content/property-type/workspace/views/settings/property-workspace-view-settings.element.ts index b7bd794079..0720c5fcad 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/content/property-type/workspace/views/settings/property-workspace-view-settings.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/content/property-type/workspace/views/settings/property-workspace-view-settings.element.ts @@ -66,10 +66,12 @@ export class UmbPropertyTypeWorkspaceViewSettingsElement extends UmbLitElement i this.observe( instance?.variesByCulture, (variesByCulture) => (this._contentTypeVariesByCulture = variesByCulture), + 'observeVariesByCulture', ); this.observe( instance?.variesBySegment, (variesBySegment) => (this._contentTypeVariesBySegment = variesBySegment), + 'observeVariesBySegment', ); this._entityType = instance?.getEntityType(); }).passContextAliasMatches();