From 32da5a2358e780ae196a7fca667d8589fe9b37df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Tue, 25 Feb 2025 15:13:37 +0100 Subject: [PATCH] Feature: enforce block variations to be present in all mandatory languages (#18280) * no need to re-request cause application refreshes when user changes * implement promise to retrieve languages * expose on all mandatory languages, to ensure the right mandatory effect --- .../block/context/block-manager.context.ts | 47 ++++++++++++------- 1 file changed, 31 insertions(+), 16 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 2ed85ca7c0..f851d49ee5 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 @@ -15,7 +15,7 @@ import { UmbDocumentTypeDetailRepository } from '@umbraco-cms/backoffice/documen import { UmbContentTypeStructureManager, type UmbContentTypeModel } from '@umbraco-cms/backoffice/content-type'; import { UmbId } from '@umbraco-cms/backoffice/id'; import type { UmbPropertyEditorConfigCollection } from '@umbraco-cms/backoffice/property-editor'; -import type { UmbVariantId } from '@umbraco-cms/backoffice/variant'; +import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; import type { UmbBlockTypeBaseModel } from '@umbraco-cms/backoffice/block-type'; import { UmbReadOnlyVariantStateManager } from '@umbraco-cms/backoffice/utils'; import { @@ -479,21 +479,36 @@ export abstract class UmbBlockManagerContext< } // Expose inserted block: - this.contentTypesLoaded.then(() => { - const contentStructure = this.getStructure(content.contentTypeKey); - if (!contentStructure) { - throw new Error(`Cannot expose block, missing content structure for ${content.contentTypeKey}`); - } - const variantId = this.getVariantId(); - if (!variantId) { - throw new Error(`Cannot expose block, missing variantId`); - } - const blockVariantId = variantId.toVariant( - contentStructure.getVariesByCulture(), - contentStructure.getVariesBySegment(), - ); - this.setOneExpose(content.key, blockVariantId); - }); + this.#setInitialBlockExpose(content); + } + + async #setInitialBlockExpose(content: UmbBlockDataModel) { + await this.contentTypesLoaded; + const contentStructure = this.getStructure(content.contentTypeKey); + if (!contentStructure) { + throw new Error(`Cannot expose block, missing content structure for ${content.contentTypeKey}`); + } + const variantId = this.getVariantId(); + if (!variantId) { + throw new Error(`Cannot expose block, missing variantId`); + } + + const varyByCulture = contentStructure.getVariesByCulture(); + const varyBySegment = contentStructure.getVariesBySegment(); + const blockVariantId = variantId.toVariant(varyByCulture, varyBySegment); + this.setOneExpose(content.key, blockVariantId); + + if (varyByCulture) { + // get all mandatory cultures: + const appLanguageContext = await this.getContext(UMB_APP_LANGUAGE_CONTEXT); + const mandatoryLanguages = await appLanguageContext.getMandatoryLanguages(); + mandatoryLanguages.forEach((x) => { + // No need to insert the same expose twice: + if (blockVariantId.culture !== x.unique) { + this.setOneExpose(content.key, new UmbVariantId(x.unique)); + } + }); + } } protected removeBlockKey(contentKey: string) {