From 60457456f9647c8ebc28531a187dc6e730aa34d6 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 1 May 2025 15:17:49 +0200 Subject: [PATCH] Block Type Configuration: filter search to only include element types (#19201) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Incorrect forum and security urls when raising issue (#19080) * Add 'ManifestWithDynamicConditions' to ManifestHeaderApp so Header Apps can be conditionally shown/loaded (#19124) * V15 QA Added acceptance tests for bulk trash dialog (#19125) * Added tests for bulk trash content dialog * Updated tests for trash content dialog * Added tests for trash and bulk trash media dialog * Moved trash content tests into a folder * Bumped version * Make trash tests run in the pipeline * Make trash tests run in the pipeline * Fixed comments * Reverted npm command * readme shield for forum * Allow deselection of color picker property. (#19174) * V15 Added acceptance tests for tiptap statusbar (#19131) * Updated tests for tiptap RTE * Moved tests for titptap toolbar to another class * Added tests for titptap toolbar * Added tests for tiptap statusbar * Bumped version * Make tiptap tests run in the pipeline * Bumped version * Reverted npm command * build: restores some of the behavior from V13 in relation to StaticAssets (#19189) In v13, the StaticAssets build was only triggered based on the existence of either the output folder or a preserve.* marker file. Here, we also additionally check for the node_modules/.package-lock.json file before reinstalling npm dependencies. We also now only run `npm install` rather than `npm ci` to optimise the build. * filter search to only include element types * V16 QA update failing nightly tests (#19190) * Fixed tests * More updates for tests * Bumped version of testhelpers * Fixed notifications in tests * Last fixes * Revert "Merge branch 'v16/dev' into v16/hotfix/filter-element-type-search-for-block-types" This reverts commit 7b8b5c28da5f1aea30b398d1b0a9bfc6552fc17d, reversing changes made to 6d4ddb70776c46a5ddbc1815c4a1a7609ba891df. * disable not pickable search results * correct use of pickable filter --------- Co-authored-by: Lotte Pitcher Co-authored-by: Warren Buckley Co-authored-by: Nhu Dinh <150406148+nhudinh0309@users.noreply.github.com> Co-authored-by: Sebastiaan Janssen Co-authored-by: Lotte Pitcher Co-authored-by: Andy Butland Co-authored-by: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Co-authored-by: Andreas Zerbst <73799582+andr317c@users.noreply.github.com> Co-authored-by: mole Co-authored-by: Niels Lyngsø --- .../input-block-type.element.ts | 6 +++++ .../search/picker-search-result.element.ts | 24 +++++++++++++++---- ...fault-picker-search-result-item.element.ts | 3 ++- .../picker-search-result-item-element-base.ts | 6 ++++- .../tree-picker-modal.element.ts | 2 +- ...-type-picker-search-result-item.element.ts | 3 ++- ...ument-picker-search-result-item.element.ts | 3 ++- ...ember-picker-search-result-item.element.ts | 3 ++- 8 files changed, 39 insertions(+), 11 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-type/components/input-block-type/input-block-type.element.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-type/components/input-block-type/input-block-type.element.ts index c44cc0369f..d4d60b54c6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-type/components/input-block-type/input-block-type.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-type/components/input-block-type/input-block-type.element.ts @@ -106,6 +106,12 @@ export class UmbInputBlockTypeElement< presetAlias: 'element', }, }, + // TODO: hide the queryParams and filter config under a "elementTypesOnly" field. [MR] + search: { + queryParams: { + isElementType: true, + }, + }, pickableFilter: (docType) => // Only pick elements: docType.isElement && diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/picker/search/picker-search-result.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/picker/search/picker-search-result.element.ts index 7b74306a45..4437d9b0b9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/picker/search/picker-search-result.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/picker/search/picker-search-result.element.ts @@ -1,11 +1,13 @@ import { UMB_PICKER_CONTEXT } from '../picker.context.token.js'; import type { UmbPickerContext } from '../picker.context.js'; import type { ManifestPickerSearchResultItem } from './result-item/picker-search-result-item.extension.js'; -import { customElement, html, nothing, repeat, state } from '@umbraco-cms/backoffice/external/lit'; +import { customElement, html, nothing, property, repeat, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import type { UmbSearchRequestArgs } from '@umbraco-cms/backoffice/search'; import type { UmbEntityModel } from '@umbraco-cms/backoffice/entity'; +type PickableFilterMethodType = (item: T) => boolean; + @customElement('umb-picker-search-result') export class UmbPickerSearchResultElement extends UmbLitElement { @state() @@ -20,6 +22,9 @@ export class UmbPickerSearchResultElement extends UmbLitElement { @state() _isSearchable: boolean = false; + @property({ attribute: false }) + pickableFilter: PickableFilterMethodType = () => true; + #pickerContext?: UmbPickerContext; constructor() { @@ -30,10 +35,15 @@ export class UmbPickerSearchResultElement extends UmbLitElement { this.observe( this.#pickerContext?.search.searchable, (isSearchable) => (this._isSearchable = isSearchable ?? false), + 'obsSearchable', ); - this.observe(this.#pickerContext?.search.query, (query) => (this._query = query)); - this.observe(this.#pickerContext?.search.searching, (query) => (this._searching = query ?? false)); - this.observe(this.#pickerContext?.search.resultItems, (items) => (this._items = items ?? [])); + this.observe(this.#pickerContext?.search.query, (query) => (this._query = query), 'obsQuery'); + this.observe( + this.#pickerContext?.search.searching, + (query) => (this._searching = query ?? false), + 'obsSearching', + ); + this.observe(this.#pickerContext?.search.resultItems, (items) => (this._items = items ?? []), 'obsResultItems'); }); } @@ -58,11 +68,15 @@ export class UmbPickerSearchResultElement extends UmbLitElement { } #renderResultItem(item: UmbEntityModel) { + console.log('pickableFilter', this.pickableFilter(item)); return html` manifest.forEntityTypes.includes(item.entityType)} - .elementProps=${{ item }}> + .elementProps=${{ + item, + disabled: !this.pickableFilter(item), + }}> `; } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/picker/search/result-item/default/default-picker-search-result-item.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/picker/search/result-item/default/default-picker-search-result-item.element.ts index f886f47986..a936ff88d7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/picker/search/result-item/default/default-picker-search-result-item.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/picker/search/result-item/default/default-picker-search-result-item.element.ts @@ -13,8 +13,9 @@ export class UmbDefaultPickerSearchResultItemElement extends UmbPickerSearchResu id=${item.unique} icon=${item.icon ?? 'icon-document'} select-only - selectable + ?selectable=${!this.disabled} ?selected=${this._isSelected} + ?disabled=${this.disabled} @deselected=${() => this.pickerContext?.selection.deselect(item.unique)} @selected=${() => this.pickerContext?.selection.select(item.unique)}> diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/picker/search/result-item/picker-search-result-item-element-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/picker/search/result-item/picker-search-result-item-element-base.ts index c0c429aec1..07969e0aa0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/picker/search/result-item/picker-search-result-item-element-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/picker/search/result-item/picker-search-result-item-element-base.ts @@ -18,6 +18,9 @@ export abstract class UmbPickerSearchResultItemElementBase this.pickerContext?.selection.deselect(item.unique)} @selected=${() => this.pickerContext?.selection.select(item.unique)}> diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-picker-modal/tree-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-picker-modal/tree-picker-modal.element.ts index bb1fe200de..b2e6c66084 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-picker-modal/tree-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-picker-modal/tree-picker-modal.element.ts @@ -159,7 +159,7 @@ export class UmbTreePickerModalElement - + `; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/picker/document-type-picker-search-result-item.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/picker/document-type-picker-search-result-item.element.ts index f97639eb2a..44864c8b3b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/picker/document-type-picker-search-result-item.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/picker/document-type-picker-search-result-item.element.ts @@ -13,8 +13,9 @@ export class UmbDocumentTypePickerSearchResultItemElement extends UmbPickerSearc id=${item.unique} icon=${item.icon ?? 'icon-document'} select-only - selectable + ?selectable=${!this.disabled} ?selected=${this._isSelected} + ?disabled=${this.disabled} @deselected=${() => this.pickerContext?.selection.deselect(item.unique)} @selected=${() => this.pickerContext?.selection.select(item.unique)}> ${when( diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/picker/document-picker-search-result-item.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/picker/document-picker-search-result-item.element.ts index 8086682f33..52d0090b3e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/picker/document-picker-search-result-item.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/picker/document-picker-search-result-item.element.ts @@ -13,8 +13,9 @@ export class UmbDocumentPickerSearchResultItemElement extends UmbPickerSearchRes id=${item.unique} icon=${item.documentType.icon ?? 'icon-document'} select-only - selectable + ?selectable=${!this.disabled} ?selected=${this._isSelected} + ?disabled=${this.disabled} @deselected=${() => this.pickerContext?.selection.deselect(item.unique)} @selected=${() => this.pickerContext?.selection.select(item.unique)}> diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member/picker/member-picker-search-result-item.element.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/picker/member-picker-search-result-item.element.ts index 2e73f8d596..e9e9641c8c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member/picker/member-picker-search-result-item.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member/picker/member-picker-search-result-item.element.ts @@ -13,8 +13,9 @@ export class UmbMemberPickerSearchResultItemElement extends UmbPickerSearchResul id=${item.unique} icon=${item.memberType.icon ?? 'icon-user'} select-only - selectable + ?selectable=${!this.disabled} ?selected=${this._isSelected} + ?disabled=${this.disabled} @deselected=${() => this.pickerContext?.selection.deselect(item.unique)} @selected=${() => this.pickerContext?.selection.select(item.unique)}>