From 3efa0eb877cf40180c499d6494b7768f459243f3 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 8 May 2023 10:02:10 +0200 Subject: [PATCH] use selection manager in tree --- .../modal/token/section-picker-modal.token.ts | 17 +++++++--- .../core/components/tree/tree.context.ts | 31 +++++++++---------- .../core/components/tree/tree.element.ts | 1 + 3 files changed, 28 insertions(+), 21 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/libs/modal/token/section-picker-modal.token.ts b/src/Umbraco.Web.UI.Client/libs/modal/token/section-picker-modal.token.ts index c74346cc70..1ded522931 100644 --- a/src/Umbraco.Web.UI.Client/libs/modal/token/section-picker-modal.token.ts +++ b/src/Umbraco.Web.UI.Client/libs/modal/token/section-picker-modal.token.ts @@ -2,10 +2,17 @@ import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; export interface UmbSectionPickerModalData { multiple: boolean; - selection: string[]; + selection: Array; } -export const UMB_SECTION_PICKER_MODAL = new UmbModalToken('Umb.Modal.SectionPicker', { - type: 'sidebar', - size: 'small', -}); +export interface UmbSectionPickerModalResult { + selection: Array; +} + +export const UMB_SECTION_PICKER_MODAL = new UmbModalToken( + 'Umb.Modal.SectionPicker', + { + type: 'sidebar', + size: 'small', + } +); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/core/components/tree/tree.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/core/components/tree/tree.context.ts index f9102ef0bd..d5ae1bfbe1 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/core/components/tree/tree.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/core/components/tree/tree.context.ts @@ -1,19 +1,23 @@ import { Observable, map } from 'rxjs'; import { UmbPagedData, UmbTreeRepository } from '@umbraco-cms/backoffice/repository'; import type { ManifestTree } from '@umbraco-cms/backoffice/extensions-registry'; -import { UmbBooleanState, UmbArrayState, UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; +import { UmbBooleanState, UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { createExtensionClass, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extensions-api'; import { ProblemDetailsModel, TreeItemPresentationModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbContextProviderController } from '@umbraco-cms/backoffice/context-api'; +import { UmbSelectionManagerBase } from '@umbraco-cms/backoffice/utils'; // TODO: update interface export interface UmbTreeContext { readonly selectable: Observable; readonly selection: Observable>; setSelectable(value: boolean): void; + getSelectable(): boolean; setMultiple(value: boolean): void; + getMultiple(): boolean; setSelection(value: Array): void; + getSelection(): Array; select(unique: string | null): void; deselect(unique: string | null): void; requestChildrenOf: (parentUnique: string | null) => Promise<{ @@ -28,18 +32,16 @@ export class UmbTreeContextBase { public host: UmbControllerHostElement; + #selectionManager = new UmbSelectionManagerBase(); + #selectable = new UmbBooleanState(false); public readonly selectable = this.#selectable.asObservable(); - #multiple = new UmbBooleanState(false); - public readonly multiple = this.#multiple.asObservable(); - - #selection = new UmbArrayState(>[]); - public readonly selection = this.#selection.asObservable(); + public readonly multiple = this.#selectionManager.multiple; + public readonly selection = this.#selectionManager.selection; #treeAlias?: string; repository?: UmbTreeRepository; - #treeManifestObserver?: UmbObserverController; #initResolver?: () => void; @@ -84,32 +86,29 @@ export class UmbTreeContextBase } public setMultiple(value: boolean) { - this.#multiple.next(value); + this.#selectionManager.setMultiple(value); } public getMultiple() { - return this.#multiple.getValue(); + return this.#selectionManager.getMultiple(); } public setSelection(value: Array) { - if (!value) return; - this.#selection.next(value); + this.#selectionManager.setSelection(value); } public getSelection() { - return this.#selection.getValue(); + return this.#selectionManager.getSelection(); } public select(unique: string | null) { if (!this.getSelectable()) return; - const newSelection = this.getMultiple() ? [...this.getSelection(), unique] : [unique]; - this.#selection.next(newSelection); + this.#selectionManager.select(unique); this.host.dispatchEvent(new CustomEvent('selected')); } public deselect(unique: string | null) { - const newSelection = this.getSelection().filter((x) => x !== unique); - this.#selection.next(newSelection); + this.#selectionManager.deselect(unique); this.host.dispatchEvent(new CustomEvent('selected')); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/core/components/tree/tree.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/core/components/tree/tree.element.ts index 304fc8d38e..ad8135b515 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/core/components/tree/tree.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/core/components/tree/tree.element.ts @@ -34,6 +34,7 @@ export class UmbTreeElement extends UmbLitElement { return this.#treeContext.getSelection(); } set selection(newVal) { + if (!Array.isArray(newVal)) return; this.#treeContext?.setSelection(newVal); }