From 50327be6e73be4eb0c2eca349aa7a3ca8a83eada Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 30 Jun 2025 15:22:44 +0200 Subject: [PATCH] React on late read only guard rules (#19621) * Observe read-only guard rules in variant selector Added observation of read-only guard rules in the workspace split view variant selector to ensure read-only cultures are updated when rules change. * Improve save action to react to read-only rule changes * remove unused --- ...ace-split-view-variant-selector.element.ts | 9 +++++ .../workspace/actions/save.action.ts | 35 ++++++++++++++----- 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-split-view/workspace-split-view-variant-selector.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-split-view/workspace-split-view-variant-selector.element.ts index 194319a1e9..3ee0a82c33 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-split-view/workspace-split-view-variant-selector.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-split-view/workspace-split-view-variant-selector.element.ts @@ -76,6 +76,7 @@ export class UmbWorkspaceSplitViewVariantSelectorElement< this.#observeVariants(workspaceContext); this.#observeActiveVariants(workspaceContext); this.#observeCurrentVariant(); + this.#observeReadOnlyGuardRules(workspaceContext); this.observe( workspaceContext?.variesBySegment, @@ -152,6 +153,14 @@ export class UmbWorkspaceSplitViewVariantSelectorElement< ); } + #observeReadOnlyGuardRules(workspaceContext?: UmbVariantDatasetWorkspaceContext) { + this.observe( + workspaceContext?.readOnlyGuard.rules, + () => this.#setReadOnlyCultures(workspaceContext), + 'umbObserveReadOnlyGuardRules', + ); + } + #handleInput(event: UUIInputEvent) { if (event instanceof UUIInputEvent) { const target = event.composedPath()[0] as UUIInputElement; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/save.action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/save.action.ts index eb8e00e2ea..c17c8b7e66 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/save.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/save.action.ts @@ -1,5 +1,6 @@ import { UMB_DOCUMENT_WORKSPACE_CONTEXT } from '../document-workspace.context-token.js'; import type UmbDocumentWorkspaceContext from '../document-workspace.context.js'; +import type { UmbDocumentVariantModel } from '../../types.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; import { @@ -13,6 +14,8 @@ export class UmbDocumentSaveWorkspaceAction extends UmbSaveWorkspaceAction implements UmbWorkspaceActionDefaultKind { + #variants: Array | undefined; + constructor( host: UmbControllerHost, args: UmbSaveWorkspaceActionArgs, @@ -32,25 +35,39 @@ export class UmbDocumentSaveWorkspaceAction override _gotWorkspaceContext() { super._gotWorkspaceContext(); this.#observeVariants(); + this.#observeReadOnlyGuardRules(); } #observeVariants() { this.observe( this._workspaceContext?.variants, (variants) => { - const allVariantsAreReadOnly = - variants?.filter((variant) => - this._workspaceContext!.readOnlyGuard.getIsPermittedForVariant(UmbVariantId.Create(variant)), - ).length === variants?.length; - if (allVariantsAreReadOnly) { - this.disable(); - } else { - this.enable(); - } + this.#variants = variants; + this.#checkReadOnlyGuardRules(); }, 'saveWorkspaceActionVariantsObserver', ); } + + #observeReadOnlyGuardRules() { + this.observe( + this._workspaceContext?.readOnlyGuard.rules, + () => this.#checkReadOnlyGuardRules(), + 'umbObserveReadOnlyGuardRules', + ); + } + + #checkReadOnlyGuardRules() { + const allVariantsAreReadOnly = + this.#variants?.filter((variant) => + this._workspaceContext!.readOnlyGuard.getIsPermittedForVariant(UmbVariantId.Create(variant)), + ).length === this.#variants?.length; + if (allVariantsAreReadOnly) { + this.disable(); + } else { + this.enable(); + } + } } export { UmbDocumentSaveWorkspaceAction as api };