Merge branch 'release/17.0'

# Conflicts:
#	src/Umbraco.Infrastructure/PropertyEditors/ImageCropperPropertyEditor.cs
This commit is contained in:
Niels Lyngsø
2025-11-10 12:46:47 +01:00
6 changed files with 68 additions and 25 deletions

View File

@@ -10,18 +10,26 @@ namespace Umbraco.Extensions
{ {
internal static void AddCollectionBuilders(this IUmbracoBuilder builder) internal static void AddCollectionBuilders(this IUmbracoBuilder builder)
{ {
builder.SignProviders() builder.FlagProviders()
.Append<HasScheduleFlagProvider>() .Append<HasScheduleFlagProvider>()
.Append<IsProtectedFlagProvider>() .Append<IsProtectedFlagProvider>()
.Append<HasPendingChangesFlagProvider>() .Append<HasPendingChangesFlagProvider>()
.Append<HasCollectionFlagProvider>(); .Append<HasCollectionFlagProvider>();
} }
/// <summary>
/// Gets the flag providers collection builder.
/// </summary>
/// <param name="builder">The builder.</param>
public static FlagProviderCollectionBuilder FlagProviders(this IUmbracoBuilder builder)
=> builder.WithCollectionBuilder<FlagProviderCollectionBuilder>();
/// <summary> /// <summary>
/// Gets the sign providers collection builder. /// Gets the sign providers collection builder.
/// </summary> /// </summary>
/// <param name="builder">The builder.</param> /// <param name="builder">The builder.</param>
[Obsolete("Please use the correctly named FlagProviders. Scheduled for removal in Umbraco 19.")]
public static FlagProviderCollectionBuilder SignProviders(this IUmbracoBuilder builder) public static FlagProviderCollectionBuilder SignProviders(this IUmbracoBuilder builder)
=> builder.WithCollectionBuilder<FlagProviderCollectionBuilder>(); => builder.FlagProviders();
} }
} }

View File

@@ -64,8 +64,8 @@
"web-component-analyzer": "^2.0.0" "web-component-analyzer": "^2.0.0"
}, },
"engines": { "engines": {
"node": ">=22", "node": ">=22.17.1",
"npm": ">=10.9" "npm": ">=10.9.2"
} }
}, },
"node_modules/@adobe/css-tools": { "node_modules/@adobe/css-tools": {

View File

@@ -215,8 +215,8 @@
"generate:ui-api-docs": "npm run generate:check-const-test && typedoc --options typedoc.config.js" "generate:ui-api-docs": "npm run generate:check-const-test && typedoc --options typedoc.config.js"
}, },
"engines": { "engines": {
"node": ">=22", "node": ">=22.17.1",
"npm": ">=10.9" "npm": ">=10.9.2"
}, },
"dependencies": { "dependencies": {
"element-internals-polyfill": "^3.0.2" "element-internals-polyfill": "^3.0.2"

View File

@@ -137,7 +137,7 @@ export class UmbContentTypeDesignEditorPropertiesElement extends UmbLitElement {
public set containerId(value: string | null | undefined) { public set containerId(value: string | null | undefined) {
if (value === this._containerId) return; if (value === this._containerId) return;
this._containerId = value; this._containerId = value;
this.createPropertyTypeWorkspaceRoutes(); this.#createPropertyTypeWorkspaceRoutes();
this.#propertyStructureHelper.setContainerId(value); this.#propertyStructureHelper.setContainerId(value);
this.#addPropertyModal?.setUniquePathValue('container-id', value === null ? 'root' : value); this.#addPropertyModal?.setUniquePathValue('container-id', value === null ? 'root' : value);
this.#editPropertyModal?.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<UmbContentTypeModel>(this); #propertyStructureHelper = new UmbContentTypePropertyStructureHelper<UmbContentTypeModel>(this);
#initResolver?: () => void;
#initReject?: (reason?: any) => void;
#init = new Promise<void>((resolve, reject) => {
this.#initResolver = resolve;
this.#initReject = reject;
});
@property({ attribute: false }) @property({ attribute: false })
editContentTypePath?: string; editContentTypePath?: string;
@@ -199,22 +205,34 @@ export class UmbContentTypeDesignEditorPropertiesElement extends UmbLitElement {
} }
this._ownerContentTypeUnique = workspaceContext?.structure.getOwnerContentTypeUnique(); this._ownerContentTypeUnique = workspaceContext?.structure.getOwnerContentTypeUnique();
this.createPropertyTypeWorkspaceRoutes(); this.#createPropertyTypeWorkspaceRoutes();
this.observe( const varyByCulturePromise =
workspaceContext?.variesByCulture, this.observe(
(variesByCulture) => { workspaceContext?.variesByCulture,
this._ownerContentTypeVariesByCulture = variesByCulture; (variesByCulture) => {
}, this._ownerContentTypeVariesByCulture = variesByCulture;
'observeOwnerVariesByCulture', },
); 'observeOwnerVariesByCulture',
this.observe( )?.asPromise() ?? Promise.reject();
workspaceContext?.variesBySegment, const varyBySegmentPromise =
(variesBySegment) => { this.observe(
this._ownerContentTypeVariesBySegment = variesBySegment; workspaceContext?.variesBySegment,
}, (variesBySegment) => {
'observeOwnerVariesBySegment', 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.observe(this.#propertyStructureHelper.propertyStructure, (propertyStructure) => {
this._properties = 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; if (!this._ownerContentTypeUnique || this._containerId === undefined) return;
// Note: Route for adding a new property // Note: Route for adding a new property
@@ -247,6 +271,12 @@ export class UmbContentTypeDesignEditorPropertiesElement extends UmbLitElement {
} }
preset.sortOrder = sortOrderInt; preset.sortOrder = sortOrderInt;
} }
if (this._ownerContentTypeVariesByCulture) {
preset.variesByCulture = true;
}
if (this._ownerContentTypeVariesBySegment) {
preset.variesBySegment = true;
}
return { data: { contentTypeUnique: this._ownerContentTypeUnique, preset: preset } }; return { data: { contentTypeUnique: this._ownerContentTypeUnique, preset: preset } };
}) })
.observeRouteBuilder((routeBuilder) => { .observeRouteBuilder((routeBuilder) => {

View File

@@ -428,6 +428,8 @@ export abstract class UmbContentDetailWorkspaceContextBase<
const repo = new UmbDataTypeDetailRepository(this); const repo = new UmbDataTypeDetailRepository(this);
const propertyTypes = await this.structure.getContentTypeProperties(); const propertyTypes = await this.structure.getContentTypeProperties();
const contentTypeVariesByCulture = this.structure.getVariesByCulture();
const contentTypeVariesBySegment = this.structure.getVariesByCulture();
const valueDefinitions = await Promise.all( const valueDefinitions = await Promise.all(
propertyTypes.map(async (property) => { propertyTypes.map(async (property) => {
// TODO: Implement caching for data-type requests. [NL] // TODO: Implement caching for data-type requests. [NL]
@@ -446,8 +448,9 @@ export abstract class UmbContentDetailWorkspaceContextBase<
propertyEditorSchemaAlias: dataType.editorAlias, propertyEditorSchemaAlias: dataType.editorAlias,
config: dataType.values, config: dataType.values,
typeArgs: { typeArgs: {
variesByCulture: property.variesByCulture, // Only vary if the content type varies:
variesBySegment: property.variesBySegment, variesByCulture: contentTypeVariesByCulture ? property.variesByCulture : false,
variesBySegment: contentTypeVariesBySegment ? property.variesBySegment : false,
} as UmbPropertyTypePresetModelTypeModel, } as UmbPropertyTypePresetModelTypeModel,
} as UmbPropertyTypePresetModel; } as UmbPropertyTypePresetModel;
}), }),

View File

@@ -66,10 +66,12 @@ export class UmbPropertyTypeWorkspaceViewSettingsElement extends UmbLitElement i
this.observe( this.observe(
instance?.variesByCulture, instance?.variesByCulture,
(variesByCulture) => (this._contentTypeVariesByCulture = variesByCulture), (variesByCulture) => (this._contentTypeVariesByCulture = variesByCulture),
'observeVariesByCulture',
); );
this.observe( this.observe(
instance?.variesBySegment, instance?.variesBySegment,
(variesBySegment) => (this._contentTypeVariesBySegment = variesBySegment), (variesBySegment) => (this._contentTypeVariesBySegment = variesBySegment),
'observeVariesBySegment',
); );
this._entityType = instance?.getEntityType(); this._entityType = instance?.getEntityType();
}).passContextAliasMatches(); }).passContextAliasMatches();