From 8316f220fb59e63d73ceca81979a983362903809 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 26 Apr 2024 21:23:07 +0200 Subject: [PATCH 1/2] accept the make tree-item-type as a generic type on the picker context --- .../input-collection-configuration.element.ts | 2 +- .../core/picker-input/picker-input.context.ts | 12 ++++++---- .../input-document-type.context.ts | 6 ++++- .../input-document-type.element.ts | 24 +++++++++++++++++-- ...t-type-workspace-view-structure.element.ts | 2 +- 5 files changed, 37 insertions(+), 9 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-collection-configuration/input-collection-configuration.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-collection-configuration/input-collection-configuration.element.ts index 5c6856d020..3fe5fd858b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-collection-configuration/input-collection-configuration.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-collection-configuration/input-collection-configuration.element.ts @@ -10,7 +10,7 @@ import { UmbModalRouteRegistrationController } from '@umbraco-cms/backoffice/mod import { UmbFormControlMixin } from '@umbraco-cms/backoffice/validation'; @customElement('umb-input-collection-configuration') -export class UmbInputCollectionConfigurationElement extends UmbFormControlMixin(UmbLitElement) { +export class UmbInputCollectionConfigurationElement extends UmbFormControlMixin(UmbLitElement, '') { protected getFormElement() { return undefined; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/picker-input/picker-input.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/picker-input/picker-input.context.ts index 99ac21aa30..08519dbb51 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/picker-input/picker-input.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/picker-input/picker-input.context.ts @@ -6,9 +6,13 @@ import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import type { UmbItemRepository } from '@umbraco-cms/backoffice/repository'; import type { UmbModalToken, UmbPickerModalData, UmbPickerModalValue } from '@umbraco-cms/backoffice/modal'; -export class UmbPickerInputContext extends UmbControllerBase { +type PickerItemBaseType = { name: string; unique: string }; +export class UmbPickerInputContext< + ItemType extends PickerItemBaseType, + TreeItemType extends PickerItemBaseType = ItemType, +> extends UmbControllerBase { // TODO: We are way too unsecure about the requirements for the Modal Token, as we have certain expectation for the data and value. - modalAlias: string | UmbModalToken, UmbPickerModalValue>; + modalAlias: string | UmbModalToken, UmbPickerModalValue>; repository?: UmbItemRepository; #getUnique: (entry: ItemType) => string | undefined; @@ -44,7 +48,7 @@ export class UmbPickerInputContext, UmbPickerModalValue>, + modalAlias: string | UmbModalToken, UmbPickerModalValue>, getUniqueMethod?: (entry: ItemType) => string | undefined, ) { super(host); @@ -66,7 +70,7 @@ export class UmbPickerInputContext value !== null) as Array); } - async openPicker(pickerData?: Partial>) { + async openPicker(pickerData?: Partial>) { await this.#itemManager.init; const modalManager = await this.getContext(UMB_MODAL_MANAGER_CONTEXT); const modalContext = modalManager.open(this, this.modalAlias, { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/components/input-document-type/input-document-type.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/components/input-document-type/input-document-type.context.ts index ac987fa0eb..7eec6cddde 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/components/input-document-type/input-document-type.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/components/input-document-type/input-document-type.context.ts @@ -1,10 +1,14 @@ import type { UmbDocumentTypeItemModel } from '../../repository/index.js'; +import type { UmbDocumentTypeTreeItemModel } from '../../tree/types.js'; import { UMB_DOCUMENT_TYPE_ITEM_REPOSITORY_ALIAS } from '../../repository/index.js'; import { UmbPickerInputContext } from '@umbraco-cms/backoffice/picker-input'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UMB_DOCUMENT_TYPE_PICKER_MODAL } from '@umbraco-cms/backoffice/document-type'; -export class UmbDocumentTypePickerContext extends UmbPickerInputContext { +export class UmbDocumentTypePickerContext extends UmbPickerInputContext< + UmbDocumentTypeItemModel, + UmbDocumentTypeTreeItemModel +> { constructor(host: UmbControllerHost) { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/components/input-document-type/input-document-type.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/components/input-document-type/input-document-type.element.ts index 0e0833545a..65cb668f40 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/components/input-document-type/input-document-type.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/components/input-document-type/input-document-type.element.ts @@ -1,4 +1,5 @@ import type { UmbDocumentTypeItemModel } from '../../repository/index.js'; +import type { UmbDocumentTypeTreeItemModel } from '../../tree/types.js'; import { UmbDocumentTypePickerContext } from './input-document-type.context.js'; import { css, html, customElement, property, state, repeat, nothing } from '@umbraco-cms/backoffice/external/lit'; import { splitStringToArray } from '@umbraco-cms/backoffice/utils'; @@ -32,9 +33,18 @@ export class UmbInputDocumentTypeElement extends UUIFormControlMixin(UmbLitEleme * @attr * @default false */ - @property({ type: Boolean }) + @property({ attribute: false }) elementTypesOnly: boolean = false; + /** + * Limits to only select Document Types + * @type {boolean} + * @attr + * @default false + */ + @property({ attribute: false }) + documentTypesOnly: boolean = false; + /** * This is a minimum amount of selected items in this input. * @type {number} @@ -138,10 +148,20 @@ export class UmbInputDocumentTypeElement extends UUIFormControlMixin(UmbLitEleme return undefined; } + #getPickableFilter() { + if (this.documentTypesOnly) { + return (x: UmbDocumentTypeTreeItemModel) => x.isFolder === false && x.isElement === false; + } + if (this.elementTypesOnly) { + return (x: UmbDocumentTypeTreeItemModel) => x.isElement; + } + return undefined; + } + #openPicker() { this.#pickerContext.openPicker({ hideTreeRoot: true, - pickableFilter: this.elementTypesOnly ? (x) => x.isElement : undefined, + pickableFilter: this.#getPickableFilter(), }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/views/structure/document-type-workspace-view-structure.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/views/structure/document-type-workspace-view-structure.element.ts index 71a89c2ed2..acd6eb3c3f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/views/structure/document-type-workspace-view-structure.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/views/structure/document-type-workspace-view-structure.element.ts @@ -81,7 +81,7 @@ export class UmbDocumentTypeWorkspaceViewStructureElement extends UmbLitElement
{ const unique = (e.target as UmbInputCollectionConfigurationElement).value as string; this.#workspaceContext?.setCollection({ unique });