From 540ed18441d452a1067aedb77fe609a2ea5a69e0 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 16 Sep 2024 10:57:57 +0200 Subject: [PATCH 1/9] only select writable cultures --- .../documents/workspace/document-workspace.context.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/packages/documents/documents/workspace/document-workspace.context.ts b/src/packages/documents/documents/workspace/document-workspace.context.ts index 9eaa8c1d43..0fe483682f 100644 --- a/src/packages/documents/documents/workspace/document-workspace.context.ts +++ b/src/packages/documents/documents/workspace/document-workspace.context.ts @@ -536,11 +536,15 @@ export class UmbDocumentWorkspaceContext const selected = activeVariantIds.concat(changedVariantIds); // Selected can contain entries that are not part of the options, therefor the modal filters selection based on options. + const readOnlyCultures = this.readOnlyState.getStates().map((s) => s.variantId.culture); + const selectedCultures = selected.map((x) => x.toString()).filter((v, i, a) => a.indexOf(v) === i); + const writable = selectedCultures.filter((x) => readOnlyCultures.includes(x) === false); + const options = await firstValueFrom(this.variantOptions); return { options, - selected: selected.map((x) => x.toString()).filter((v, i, a) => a.indexOf(v) === i), + selected: writable, }; } From c6138cef963b47b017d04d5a1e8e7dc75a4c866c Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 16 Sep 2024 12:21:14 +0200 Subject: [PATCH 2/9] add selection filter option --- .../utils/selection-manager/selection.manager.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/packages/core/utils/selection-manager/selection.manager.ts b/src/packages/core/utils/selection-manager/selection.manager.ts index d1127cbb8d..e3b686c941 100644 --- a/src/packages/core/utils/selection-manager/selection.manager.ts +++ b/src/packages/core/utils/selection-manager/selection.manager.ts @@ -18,6 +18,9 @@ export class UmbSelectionManager true; + constructor(host: UmbControllerHost) { super(host); } @@ -109,6 +112,9 @@ export class UmbSelectionManager boolean): void { + this.#selectionFilter = filter; + } } From 0670c3c1d0f7db7a6dc8381fd657b6aebdafc890 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 16 Sep 2024 12:21:20 +0200 Subject: [PATCH 3/9] add tests --- .../selection-manager/selection.manager.test.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/packages/core/utils/selection-manager/selection.manager.test.ts b/src/packages/core/utils/selection-manager/selection.manager.test.ts index c5a6cfff65..364ecf3775 100644 --- a/src/packages/core/utils/selection-manager/selection.manager.test.ts +++ b/src/packages/core/utils/selection-manager/selection.manager.test.ts @@ -76,6 +76,10 @@ describe('UmbSelectionManager', () => { it('has a clearSelection method', () => { expect(manager).to.have.property('clearSelection').that.is.a('function'); }); + + it('has a setFilter method', () => { + expect(manager).to.have.property('setFilter').that.is.a('function'); + }); }); }); @@ -150,6 +154,15 @@ describe('UmbSelectionManager', () => { manager.select('3'); expect(manager.getSelection()).to.deep.equal([]); }); + + it('can not select an item if it does not pass the filter', () => { + manager.setFilter((item) => item !== '2'); + manager.select('2'); + expect(manager.getSelection()).to.deep.equal([]); + + manager.select('1'); + expect(manager.getSelection()).to.deep.equal(['1']); + }); }); describe('Deselect', () => { From c1d83e14949d887b96b675951de211eea1dadcb6 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 16 Sep 2024 12:22:27 +0200 Subject: [PATCH 4/9] apply filter to input --- ...ocument-variant-language-picker.element.ts | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/packages/documents/documents/modals/shared/document-variant-language-picker.element.ts b/src/packages/documents/documents/modals/shared/document-variant-language-picker.element.ts index 52d69df997..b5c6b5e86b 100644 --- a/src/packages/documents/documents/modals/shared/document-variant-language-picker.element.ts +++ b/src/packages/documents/documents/modals/shared/document-variant-language-picker.element.ts @@ -1,5 +1,14 @@ import { UmbDocumentVariantState, type UmbDocumentVariantOptionModel } from '../../types.js'; -import { css, customElement, html, nothing, property, repeat, state } from '@umbraco-cms/backoffice/external/lit'; +import { + css, + customElement, + html, + nothing, + property, + repeat, + state, + type PropertyValues, +} from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import type { UmbSelectionManager } from '@umbraco-cms/backoffice/utils'; @@ -37,6 +46,17 @@ export class UmbDocumentVariantLanguagePickerElement extends UmbLitElement { @property({ attribute: false }) public pickableFilter?: (item: UmbDocumentVariantOptionModel) => boolean; + protected override updated(_changedProperties: PropertyValues): void { + super.updated(_changedProperties); + + if (this.selectionManager && this.pickableFilter) { + this.#selectionManager.setFilter((unique) => { + const option = this.variantLanguageOptions.find((o) => o.unique === unique); + return option ? this.pickableFilter!(option) : true; + }); + } + } + override render() { return this.variantLanguageOptions.length ? repeat( From 3c3d56f691d635a265d49ba8501e9e355aaffdf5 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 16 Sep 2024 12:26:42 +0200 Subject: [PATCH 5/9] schedule publishing - apply filter to selection manager --- .../schedule-modal/document-schedule-modal.element.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/packages/documents/documents/modals/schedule-modal/document-schedule-modal.element.ts b/src/packages/documents/documents/modals/schedule-modal/document-schedule-modal.element.ts index 643285640c..1d1042a69f 100644 --- a/src/packages/documents/documents/modals/schedule-modal/document-schedule-modal.element.ts +++ b/src/packages/documents/documents/modals/schedule-modal/document-schedule-modal.element.ts @@ -41,6 +41,15 @@ export class UmbDocumentScheduleModalElement extends UmbModalBaseElement< this.#selectionManager.setMultiple(true); this.#selectionManager.setSelectable(true); + const pickableFilter = this.data?.pickableFilter; + + if (pickableFilter) { + this.#selectionManager.setFilter((unique) => { + const option = this.data?.options.find((o) => o.unique === unique); + return option ? pickableFilter(option) : true; + }); + } + // Only display variants that are relevant to pick from, i.e. variants that are draft or published with pending changes: this._options = this.data?.options.filter( From f2d68da8eee7c9d0b2f56a2da620948b8cc7b463 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 16 Sep 2024 12:40:24 +0200 Subject: [PATCH 6/9] rename filter to disallow --- .../selection-manager/selection.manager.test.ts | 8 ++++---- .../utils/selection-manager/selection.manager.ts | 12 ++++++------ .../document-schedule-modal.element.ts | 2 +- .../document-variant-language-picker.element.ts | 2 +- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/packages/core/utils/selection-manager/selection.manager.test.ts b/src/packages/core/utils/selection-manager/selection.manager.test.ts index 364ecf3775..06e41c4176 100644 --- a/src/packages/core/utils/selection-manager/selection.manager.test.ts +++ b/src/packages/core/utils/selection-manager/selection.manager.test.ts @@ -77,8 +77,8 @@ describe('UmbSelectionManager', () => { expect(manager).to.have.property('clearSelection').that.is.a('function'); }); - it('has a setFilter method', () => { - expect(manager).to.have.property('setFilter').that.is.a('function'); + it('has a setDisallow method', () => { + expect(manager).to.have.property('setDisallow').that.is.a('function'); }); }); }); @@ -155,8 +155,8 @@ describe('UmbSelectionManager', () => { expect(manager.getSelection()).to.deep.equal([]); }); - it('can not select an item if it does not pass the filter', () => { - manager.setFilter((item) => item !== '2'); + it('can not select an item if it does not pass the disallow function', () => { + manager.setDisallow((item) => item !== '2'); manager.select('2'); expect(manager.getSelection()).to.deep.equal([]); diff --git a/src/packages/core/utils/selection-manager/selection.manager.ts b/src/packages/core/utils/selection-manager/selection.manager.ts index e3b686c941..34d45a2e97 100644 --- a/src/packages/core/utils/selection-manager/selection.manager.ts +++ b/src/packages/core/utils/selection-manager/selection.manager.ts @@ -19,7 +19,7 @@ export class UmbSelectionManager true; + #disallow = (unique: ValueType) => true; constructor(host: UmbControllerHost) { super(host); @@ -112,7 +112,7 @@ export class UmbSelectionManager boolean): void { - this.#selectionFilter = filter; + public setDisallow(compareFn: (unique: ValueType) => boolean): void { + this.#disallow = compareFn; } } diff --git a/src/packages/documents/documents/modals/schedule-modal/document-schedule-modal.element.ts b/src/packages/documents/documents/modals/schedule-modal/document-schedule-modal.element.ts index 1d1042a69f..7c2360419d 100644 --- a/src/packages/documents/documents/modals/schedule-modal/document-schedule-modal.element.ts +++ b/src/packages/documents/documents/modals/schedule-modal/document-schedule-modal.element.ts @@ -44,7 +44,7 @@ export class UmbDocumentScheduleModalElement extends UmbModalBaseElement< const pickableFilter = this.data?.pickableFilter; if (pickableFilter) { - this.#selectionManager.setFilter((unique) => { + this.#selectionManager.setDisallow((unique) => { const option = this.data?.options.find((o) => o.unique === unique); return option ? pickableFilter(option) : true; }); diff --git a/src/packages/documents/documents/modals/shared/document-variant-language-picker.element.ts b/src/packages/documents/documents/modals/shared/document-variant-language-picker.element.ts index b5c6b5e86b..dd9d5ab6b3 100644 --- a/src/packages/documents/documents/modals/shared/document-variant-language-picker.element.ts +++ b/src/packages/documents/documents/modals/shared/document-variant-language-picker.element.ts @@ -50,7 +50,7 @@ export class UmbDocumentVariantLanguagePickerElement extends UmbLitElement { super.updated(_changedProperties); if (this.selectionManager && this.pickableFilter) { - this.#selectionManager.setFilter((unique) => { + this.#selectionManager.setDisallow((unique) => { const option = this.variantLanguageOptions.find((o) => o.unique === unique); return option ? this.pickableFilter!(option) : true; }); From 7b211399f75bca242f109892d972fcd111d4739d Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 16 Sep 2024 13:41:27 +0200 Subject: [PATCH 7/9] turn filter around to allow + fix test --- .../utils/selection-manager/selection.manager.test.ts | 6 +++--- .../core/utils/selection-manager/selection.manager.ts | 10 +++++----- .../schedule-modal/document-schedule-modal.element.ts | 2 +- .../shared/document-variant-language-picker.element.ts | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/packages/core/utils/selection-manager/selection.manager.test.ts b/src/packages/core/utils/selection-manager/selection.manager.test.ts index 06e41c4176..81630b60bc 100644 --- a/src/packages/core/utils/selection-manager/selection.manager.test.ts +++ b/src/packages/core/utils/selection-manager/selection.manager.test.ts @@ -155,9 +155,9 @@ describe('UmbSelectionManager', () => { expect(manager.getSelection()).to.deep.equal([]); }); - it('can not select an item if it does not pass the disallow function', () => { - manager.setDisallow((item) => item !== '2'); - manager.select('2'); + it('can not select an item if it does not pass the allow function', () => { + manager.setAllow((item) => item !== '2'); + expect(() => manager.select('2')).to.throw(); expect(manager.getSelection()).to.deep.equal([]); manager.select('1'); diff --git a/src/packages/core/utils/selection-manager/selection.manager.ts b/src/packages/core/utils/selection-manager/selection.manager.ts index 34d45a2e97..58073bdb37 100644 --- a/src/packages/core/utils/selection-manager/selection.manager.ts +++ b/src/packages/core/utils/selection-manager/selection.manager.ts @@ -19,7 +19,7 @@ export class UmbSelectionManager true; + #allow = (unique: ValueType) => true; constructor(host: UmbControllerHost) { super(host); @@ -112,8 +112,8 @@ export class UmbSelectionManager boolean): void { - this.#disallow = compareFn; + public setAllow(compareFn: (unique: ValueType) => boolean): void { + this.#allow = compareFn; } } diff --git a/src/packages/documents/documents/modals/schedule-modal/document-schedule-modal.element.ts b/src/packages/documents/documents/modals/schedule-modal/document-schedule-modal.element.ts index 7c2360419d..fbef782e92 100644 --- a/src/packages/documents/documents/modals/schedule-modal/document-schedule-modal.element.ts +++ b/src/packages/documents/documents/modals/schedule-modal/document-schedule-modal.element.ts @@ -44,7 +44,7 @@ export class UmbDocumentScheduleModalElement extends UmbModalBaseElement< const pickableFilter = this.data?.pickableFilter; if (pickableFilter) { - this.#selectionManager.setDisallow((unique) => { + this.#selectionManager.setAllow((unique) => { const option = this.data?.options.find((o) => o.unique === unique); return option ? pickableFilter(option) : true; }); diff --git a/src/packages/documents/documents/modals/shared/document-variant-language-picker.element.ts b/src/packages/documents/documents/modals/shared/document-variant-language-picker.element.ts index dd9d5ab6b3..cf5f90efbf 100644 --- a/src/packages/documents/documents/modals/shared/document-variant-language-picker.element.ts +++ b/src/packages/documents/documents/modals/shared/document-variant-language-picker.element.ts @@ -50,7 +50,7 @@ export class UmbDocumentVariantLanguagePickerElement extends UmbLitElement { super.updated(_changedProperties); if (this.selectionManager && this.pickableFilter) { - this.#selectionManager.setDisallow((unique) => { + this.#selectionManager.setAllow((unique) => { const option = this.variantLanguageOptions.find((o) => o.unique === unique); return option ? this.pickableFilter!(option) : true; }); From c4bb356098ebf9e92a1516bfcdc2e31c0abd901d Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 16 Sep 2024 14:13:56 +0200 Subject: [PATCH 8/9] Update selection.manager.test.ts --- .../core/utils/selection-manager/selection.manager.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/packages/core/utils/selection-manager/selection.manager.test.ts b/src/packages/core/utils/selection-manager/selection.manager.test.ts index 81630b60bc..7b4bf7e51e 100644 --- a/src/packages/core/utils/selection-manager/selection.manager.test.ts +++ b/src/packages/core/utils/selection-manager/selection.manager.test.ts @@ -77,8 +77,8 @@ describe('UmbSelectionManager', () => { expect(manager).to.have.property('clearSelection').that.is.a('function'); }); - it('has a setDisallow method', () => { - expect(manager).to.have.property('setDisallow').that.is.a('function'); + it('has a setAllow method', () => { + expect(manager).to.have.property('setAllow').that.is.a('function'); }); }); }); From 1abe22925df76978f0b942638a97bce196a9d670 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 17 Sep 2024 12:43:37 +0200 Subject: [PATCH 9/9] update method name --- .../core/utils/selection-manager/selection.manager.test.ts | 6 +++--- .../core/utils/selection-manager/selection.manager.ts | 2 +- .../schedule-modal/document-schedule-modal.element.ts | 2 +- .../shared/document-variant-language-picker.element.ts | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/packages/core/utils/selection-manager/selection.manager.test.ts b/src/packages/core/utils/selection-manager/selection.manager.test.ts index 7b4bf7e51e..18d8647457 100644 --- a/src/packages/core/utils/selection-manager/selection.manager.test.ts +++ b/src/packages/core/utils/selection-manager/selection.manager.test.ts @@ -77,8 +77,8 @@ describe('UmbSelectionManager', () => { expect(manager).to.have.property('clearSelection').that.is.a('function'); }); - it('has a setAllow method', () => { - expect(manager).to.have.property('setAllow').that.is.a('function'); + it('has a setAllowLimitation method', () => { + expect(manager).to.have.property('setAllowLimitation').that.is.a('function'); }); }); }); @@ -156,7 +156,7 @@ describe('UmbSelectionManager', () => { }); it('can not select an item if it does not pass the allow function', () => { - manager.setAllow((item) => item !== '2'); + manager.setAllowLimitation((item) => item !== '2'); expect(() => manager.select('2')).to.throw(); expect(manager.getSelection()).to.deep.equal([]); diff --git a/src/packages/core/utils/selection-manager/selection.manager.ts b/src/packages/core/utils/selection-manager/selection.manager.ts index 58073bdb37..3e1cd91ca1 100644 --- a/src/packages/core/utils/selection-manager/selection.manager.ts +++ b/src/packages/core/utils/selection-manager/selection.manager.ts @@ -158,7 +158,7 @@ export class UmbSelectionManager boolean): void { + public setAllowLimitation(compareFn: (unique: ValueType) => boolean): void { this.#allow = compareFn; } } diff --git a/src/packages/documents/documents/modals/schedule-modal/document-schedule-modal.element.ts b/src/packages/documents/documents/modals/schedule-modal/document-schedule-modal.element.ts index fbef782e92..dc850eb0ad 100644 --- a/src/packages/documents/documents/modals/schedule-modal/document-schedule-modal.element.ts +++ b/src/packages/documents/documents/modals/schedule-modal/document-schedule-modal.element.ts @@ -44,7 +44,7 @@ export class UmbDocumentScheduleModalElement extends UmbModalBaseElement< const pickableFilter = this.data?.pickableFilter; if (pickableFilter) { - this.#selectionManager.setAllow((unique) => { + this.#selectionManager.setAllowLimitation((unique) => { const option = this.data?.options.find((o) => o.unique === unique); return option ? pickableFilter(option) : true; }); diff --git a/src/packages/documents/documents/modals/shared/document-variant-language-picker.element.ts b/src/packages/documents/documents/modals/shared/document-variant-language-picker.element.ts index cf5f90efbf..ccfd6c36d4 100644 --- a/src/packages/documents/documents/modals/shared/document-variant-language-picker.element.ts +++ b/src/packages/documents/documents/modals/shared/document-variant-language-picker.element.ts @@ -50,7 +50,7 @@ export class UmbDocumentVariantLanguagePickerElement extends UmbLitElement { super.updated(_changedProperties); if (this.selectionManager && this.pickableFilter) { - this.#selectionManager.setAllow((unique) => { + this.#selectionManager.setAllowLimitation((unique) => { const option = this.variantLanguageOptions.find((o) => o.unique === unique); return option ? this.pickableFilter!(option) : true; });