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)
{
builder.SignProviders()
builder.FlagProviders()
.Append<HasScheduleFlagProvider>()
.Append<IsProtectedFlagProvider>()
.Append<HasPendingChangesFlagProvider>()
.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>
/// Gets the sign providers collection builder.
/// </summary>
/// <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)
=> builder.WithCollectionBuilder<FlagProviderCollectionBuilder>();
=> builder.FlagProviders();
}
}

View File

@@ -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": {

View File

@@ -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"

View File

@@ -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<UmbContentTypeModel>(this);
#initResolver?: () => void;
#initReject?: (reason?: any) => void;
#init = new Promise<void>((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();
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) => {

View File

@@ -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;
}),

View File

@@ -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();