From 1fe66fb986e14a577ad5eb9f0d032e89e4ef6d5b Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 7 May 2025 10:53:49 +0200 Subject: [PATCH 1/5] remove current implementation --- .../workspace/document-workspace.context.ts | 48 ------------------- 1 file changed, 48 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts index b6b0e49287a8..8503a95c257c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts @@ -104,14 +104,6 @@ export class UmbDocumentWorkspaceContext }; }); - this.consumeContext(UMB_DOCUMENT_CONFIGURATION_CONTEXT, async (context) => { - const documentConfiguration = (await context?.getDocumentConfiguration()) ?? undefined; - - if (documentConfiguration?.allowEditInvariantFromNonDefault !== true) { - this.#preventEditInvariantFromNonDefault(); - } - }); - this.observe( this.contentTypeUnique, (unique) => { @@ -226,46 +218,6 @@ export class UmbDocumentWorkspaceContext ]); } - #preventEditInvariantFromNonDefault() { - this.observe( - observeMultiple([this.structure.contentTypeProperties, this.languages]), - ([properties, languages]) => { - if (properties.length === 0) return; - if (languages.length === 0) return; - - const defaultLanguageUnique = languages.find((x) => x.isDefault)?.unique; - const ruleUnique = 'UMB_preventEditInvariantFromNonDefault'; - - const rule = { - unique: ruleUnique, - permitted: false, - message: 'Shared properties can only be edited in the default language', - variantId: UmbVariantId.CreateInvariant(), - }; - - /* The permission is false by default, and the onChange callback will not be triggered if the permission hasn't changed. - Therefore, we add the rule to the readOnlyGuard here. */ - this.propertyWriteGuard.addRule(rule); - - createExtensionApiByAlias(this, UMB_LANGUAGE_USER_PERMISSION_CONDITION_ALIAS, [ - { - config: { - allOf: [defaultLanguageUnique], - }, - onChange: (permitted: boolean) => { - if (permitted) { - this.propertyWriteGuard.removeRule(ruleUnique); - } else { - this.propertyWriteGuard.addRule(rule); - } - }, - }, - ]); - }, - 'observePreventEditInvariantFromNonDefault', - ); - } - override resetState(): void { super.resetState(); this.#isTrashedContext.setIsTrashed(false); From 5ccf921c6be4584a982bb9c4cf02feebdfaca1cb Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 7 May 2025 12:33:36 +0200 Subject: [PATCH 2/5] enforce allowEditInvariantFromNonDefault --- .../document-property-dataset.context.ts | 62 ++++++++++++++++++- 1 file changed, 60 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/property-dataset-context/document-property-dataset.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/property-dataset-context/document-property-dataset.context.ts index 5b34ca61e1cd..459fa22665f9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/property-dataset-context/document-property-dataset.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/property-dataset-context/document-property-dataset.context.ts @@ -1,9 +1,67 @@ -import type { UmbDocumentDetailModel, UmbDocumentVariantModel } from '../types.js'; +import type { UmbDocumentDetailModel, UmbDocumentVariantModel, UmbDocumentWorkspaceContext } from '../types.js'; +import { UMB_DOCUMENT_CONFIGURATION_CONTEXT } from '../global-contexts/index.js'; import { UmbContentPropertyDatasetContext } from '@umbraco-cms/backoffice/content'; import type { UmbDocumentTypeDetailModel } from '@umbraco-cms/backoffice/document-type'; +import type { UmbVariantId } from '@umbraco-cms/backoffice/variant'; +import type { DocumentConfigurationResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { observeMultiple } from '@umbraco-cms/backoffice/observable-api'; +import type { UmbVariantPropertyGuardRule } from '@umbraco-cms/backoffice/property'; export class UmbDocumentPropertyDatasetContext extends UmbContentPropertyDatasetContext< UmbDocumentDetailModel, UmbDocumentTypeDetailModel, UmbDocumentVariantModel -> {} +> { + #dataSetVariantId?: UmbVariantId; + #documentConfiguration?: DocumentConfigurationResponseModel; + + constructor(host: UmbControllerHost, dataOwner: UmbDocumentWorkspaceContext, variantId?: UmbVariantId) { + super(host, dataOwner, variantId); + + this.#dataSetVariantId = variantId; + + this.consumeContext(UMB_DOCUMENT_CONFIGURATION_CONTEXT, async (context) => { + this.#documentConfiguration = (await context?.getDocumentConfiguration()) ?? undefined; + + if (this.#documentConfiguration?.allowEditInvariantFromNonDefault !== true) { + this.#preventEditInvariantFromNonDefault(); + } + }); + } + + #preventEditInvariantFromNonDefault() { + this.observe( + observeMultiple([this._dataOwner.structure.contentTypeProperties, this._dataOwner.variantOptions]), + ([properties, variantOptions]) => { + if (properties.length === 0) return; + if (variantOptions.length === 0) return; + + const currentVariantOption = variantOptions.find( + (option) => option.culture === this.#dataSetVariantId?.culture, + ); + + const isDefaultLanguage = currentVariantOption?.language.isDefault; + + properties.forEach((property) => { + const unique = 'UMB_PREVENT_EDIT_INVARIANT_FROM_NON_DEFAULT_' + property.unique; + + this._dataOwner.propertyWriteGuard.removeRule(unique); + + if (!property.variesByCulture && !isDefaultLanguage) { + const rule: UmbVariantPropertyGuardRule = { + unique, + message: 'Shared properties can only be edited in the default language', + propertyType: { + unique: property.unique, + }, + permitted: false, + }; + + this._dataOwner.propertyWriteGuard.addRule(rule); + } + }); + }, + ); + } +} From 19a7595911e0e4ad38e5bef68b6f9be3bf406e95 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 7 May 2025 12:47:30 +0200 Subject: [PATCH 3/5] remove unused --- .../documents/documents/workspace/document-workspace.context.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts index 8503a95c257c..74034de7aa35 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts @@ -37,8 +37,6 @@ import type { UmbDocumentTypeDetailModel } from '@umbraco-cms/backoffice/documen import { UmbIsTrashedEntityContext } from '@umbraco-cms/backoffice/recycle-bin'; import { ensurePathEndsWithSlash, UmbDeprecation } from '@umbraco-cms/backoffice/utils'; import { createExtensionApiByAlias } from '@umbraco-cms/backoffice/extension-registry'; -import { observeMultiple } from '@umbraco-cms/backoffice/observable-api'; -import { UMB_LANGUAGE_USER_PERMISSION_CONDITION_ALIAS } from '@umbraco-cms/backoffice/language'; import { UMB_SERVER_CONTEXT } from '@umbraco-cms/backoffice/server'; type ContentModel = UmbDocumentDetailModel; From 0c449cf66606e3305b1d58545698bd22b9e3ebe6 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 7 May 2025 13:09:45 +0200 Subject: [PATCH 4/5] fix implementation when context is undefined --- .../document-property-dataset.context.ts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/property-dataset-context/document-property-dataset.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/property-dataset-context/document-property-dataset.context.ts index 459fa22665f9..04d2e713ed54 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/property-dataset-context/document-property-dataset.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/property-dataset-context/document-property-dataset.context.ts @@ -15,6 +15,7 @@ export class UmbDocumentPropertyDatasetContext extends UmbContentPropertyDataset > { #dataSetVariantId?: UmbVariantId; #documentConfiguration?: DocumentConfigurationResponseModel; + #allowEditInvariantFromNonDefault: boolean | undefined = undefined; constructor(host: UmbControllerHost, dataOwner: UmbDocumentWorkspaceContext, variantId?: UmbVariantId) { super(host, dataOwner, variantId); @@ -23,14 +24,12 @@ export class UmbDocumentPropertyDatasetContext extends UmbContentPropertyDataset this.consumeContext(UMB_DOCUMENT_CONFIGURATION_CONTEXT, async (context) => { this.#documentConfiguration = (await context?.getDocumentConfiguration()) ?? undefined; - - if (this.#documentConfiguration?.allowEditInvariantFromNonDefault !== true) { - this.#preventEditInvariantFromNonDefault(); - } + this.#allowEditInvariantFromNonDefault = this.#documentConfiguration?.allowEditInvariantFromNonDefault; + this.#enforceAllowEditInvariantFromNonDefault(); }); } - #preventEditInvariantFromNonDefault() { + #enforceAllowEditInvariantFromNonDefault() { this.observe( observeMultiple([this._dataOwner.structure.contentTypeProperties, this._dataOwner.variantOptions]), ([properties, variantOptions]) => { @@ -46,9 +45,11 @@ export class UmbDocumentPropertyDatasetContext extends UmbContentPropertyDataset properties.forEach((property) => { const unique = 'UMB_PREVENT_EDIT_INVARIANT_FROM_NON_DEFAULT_' + property.unique; + // Clean up the rule if it exists before adding a new one this._dataOwner.propertyWriteGuard.removeRule(unique); - if (!property.variesByCulture && !isDefaultLanguage) { + // If the property is invariant and not in the default language, we need to add a rule + if (!this.#allowEditInvariantFromNonDefault && !property.variesByCulture && !isDefaultLanguage) { const rule: UmbVariantPropertyGuardRule = { unique, message: 'Shared properties can only be edited in the default language', From 1c5f182ab26f1ec7e665860ecc8c20e98ac38b11 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 8 May 2025 21:13:51 +0200 Subject: [PATCH 5/5] only run when config is set to false --- .../document-property-dataset.context.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/property-dataset-context/document-property-dataset.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/property-dataset-context/document-property-dataset.context.ts index 04d2e713ed54..52f782f3a64e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/property-dataset-context/document-property-dataset.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/property-dataset-context/document-property-dataset.context.ts @@ -23,13 +23,16 @@ export class UmbDocumentPropertyDatasetContext extends UmbContentPropertyDataset this.#dataSetVariantId = variantId; this.consumeContext(UMB_DOCUMENT_CONFIGURATION_CONTEXT, async (context) => { + if (!context) return; this.#documentConfiguration = (await context?.getDocumentConfiguration()) ?? undefined; this.#allowEditInvariantFromNonDefault = this.#documentConfiguration?.allowEditInvariantFromNonDefault; - this.#enforceAllowEditInvariantFromNonDefault(); + if (this.#allowEditInvariantFromNonDefault === false) { + this.#preventEditInvariantFromNonDefault(); + } }); } - #enforceAllowEditInvariantFromNonDefault() { + #preventEditInvariantFromNonDefault() { this.observe( observeMultiple([this._dataOwner.structure.contentTypeProperties, this._dataOwner.variantOptions]), ([properties, variantOptions]) => { @@ -49,7 +52,7 @@ export class UmbDocumentPropertyDatasetContext extends UmbContentPropertyDataset this._dataOwner.propertyWriteGuard.removeRule(unique); // If the property is invariant and not in the default language, we need to add a rule - if (!this.#allowEditInvariantFromNonDefault && !property.variesByCulture && !isDefaultLanguage) { + if (!property.variesByCulture && !isDefaultLanguage) { const rule: UmbVariantPropertyGuardRule = { unique, message: 'Shared properties can only be edited in the default language',