diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/tree-picker/tree-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/tree-picker/tree-picker-modal.element.ts index 2b0a0c991a..991e270cd1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/tree-picker/tree-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/tree-picker/tree-picker-modal.element.ts @@ -46,6 +46,7 @@ export class UmbTreePickerModalElement diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.context.ts index ddd3c0af26..4128dbcaba 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.context.ts @@ -49,6 +49,8 @@ export class UmbTreeContextBase public repository?: UmbTreeRepository; public selectableFilter?: (item: TreeItemType) => boolean = () => true; + public filter?: (item: TreeItemType) => boolean = () => true; + #treeAlias?: string; #initResolver?: () => void; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.element.ts index 72a2a8194e..414d074ddc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.element.ts @@ -66,6 +66,15 @@ export class UmbTreeElement extends UmbLitElement { this.#treeContext.selectableFilter = newVal; } + @property() + get filter() { + return this.#treeContext.filter; + } + set filter(newVal) { + console.log(typeof newVal); + this.#treeContext.filter = newVal; + } + @state() private _items: TreeItemPresentationModel[] = []; @@ -97,7 +106,16 @@ export class UmbTreeElement extends UmbLitElement { if (asObservable) { this.#rootItemsObserver = this.observe(asObservable(), (rootItems) => { const oldValue = this._items; - this._items = rootItems; + if (this.filter) { + const items: Array = []; + rootItems.forEach((rootItem) => { + const filtered = this.filter!(rootItem); + if (filtered) items.push(rootItem); + }); + this._items = items; + } else { + this._items = rootItems; + } this.requestUpdate('_items', oldValue); }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/components/document-type-input/document-type-input.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/components/document-type-input/document-type-input.element.ts index 121f921f4a..ed1f48b65c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/components/document-type-input/document-type-input.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/components/document-type-input/document-type-input.element.ts @@ -1,5 +1,5 @@ import { UmbDocumentTypePickerContext } from './document-type-input.context.js'; -import { css, html, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; +import { css, html, customElement, property, state, ifDefined } from '@umbraco-cms/backoffice/external/lit'; import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import type { DocumentTypeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; @@ -7,6 +7,15 @@ import { splitStringToArray } from '@umbraco-cms/backoffice/utils'; @customElement('umb-document-type-input') export class UmbDocumentTypeInputElement extends FormControlMixin(UmbLitElement) { + /** + * Selects the element types only + * @type {boolean} + * @attr + * @default false + */ + @property({ type: Boolean, attribute: 'element-types-only' }) + elementTypesOnly: boolean = false; + /** * This is a minimum amount of selected items in this input. * @type {number} @@ -102,19 +111,28 @@ export class UmbDocumentTypeInputElement extends FormControlMixin(UmbLitElement) return undefined; } + #openPicker() { + if (this.elementTypesOnly) { + this.#pickerContext.openPicker({ + hideTreeRoot: true, + filter: (x) => x.isElement!, + }); + } else { + this.#pickerContext.openPicker({ hideTreeRoot: true }); + } + } + render() { return html` ${this._items?.map((item) => this._renderItem(item))} - this.#pickerContext.openPicker()} label="open" - >Add + Add `; } private _renderItem(item: DocumentTypeItemResponseModel) { if (!item.id) return; return html` - + this.#pickerContext.requestRemoveItem(item.id!)}