From bb755188b54fda179ae0eca6ff1f67e1392afb46 Mon Sep 17 00:00:00 2001 From: Lee Kelleher Date: Fri, 31 Jan 2025 12:20:55 +0000 Subject: [PATCH] User Group picker modal: adds filter input (#18159) Fixes #16452. --- .../user-group-picker-modal.element.ts | 54 +++++++++++++++++-- 1 file changed, 49 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/modals/user-group-picker/user-group-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/modals/user-group-picker/user-group-picker-modal.element.ts index f68f9efd48..dc356f6e31 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/modals/user-group-picker/user-group-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/modals/user-group-picker/user-group-picker-modal.element.ts @@ -1,11 +1,12 @@ import { UmbUserGroupCollectionRepository } from '../../collection/repository/index.js'; import type { UmbUserGroupDetailModel } from '../../types.js'; -import { customElement, html, repeat, state, when } from '@umbraco-cms/backoffice/external/lit'; +import { css, customElement, html, repeat, state, when } from '@umbraco-cms/backoffice/external/lit'; +import { debounce, UmbSelectionManager } from '@umbraco-cms/backoffice/utils'; +import { umbFocus } from '@umbraco-cms/backoffice/lit-element'; import { UmbDeselectedEvent, UmbSelectedEvent } from '@umbraco-cms/backoffice/event'; -import { UmbSelectionManager } from '@umbraco-cms/backoffice/utils'; import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; import type { UMB_USER_GROUP_PICKER_MODAL } from '@umbraco-cms/backoffice/user-group'; -import type { UUIMenuItemEvent } from '@umbraco-cms/backoffice/external/uui'; +import type { UUIInputEvent, UUIMenuItemEvent } from '@umbraco-cms/backoffice/external/uui'; import '../../components/user-group-ref/user-group-ref.element.js'; @@ -14,10 +15,23 @@ export class UmbUserGroupPickerModalElement extends UmbModalBaseElement< typeof UMB_USER_GROUP_PICKER_MODAL.DATA, typeof UMB_USER_GROUP_PICKER_MODAL.VALUE > { + @state() + private _filteredItems: Array = []; + @state() private _userGroups: Array = []; + #debouncedFilter = debounce((filter: string) => { + this._filteredItems = filter + ? this._userGroups.filter( + (userGroup) => + userGroup.alias.toLowerCase().includes(filter) || userGroup.name.toLowerCase().includes(filter), + ) + : this._userGroups; + }, 500); + #selectionManager = new UmbSelectionManager(this); + #userGroupCollectionRepository = new UmbUserGroupCollectionRepository(this); constructor() { @@ -40,7 +54,7 @@ export class UmbUserGroupPickerModalElement extends UmbModalBaseElement< const { error, asObservable } = await this.#userGroupCollectionRepository.requestCollection(); if (error) return; - this.observe(asObservable(), (items) => (this._userGroups = items), 'umbUserGroupsObserver'); + this.observe(asObservable(), (items) => (this._userGroups = this._filteredItems = items), 'umbUserGroupsObserver'); } #onSelected(event: UUIMenuItemEvent, item: UmbUserGroupDetailModel) { @@ -63,6 +77,11 @@ export class UmbUserGroupPickerModalElement extends UmbModalBaseElement< this.modalContext?.dispatchEvent(new UmbDeselectedEvent(item.unique)); } + #onFilterInput(event: UUIInputEvent) { + const query = (event.target.value as string) || ''; + this.#debouncedFilter(query.toLowerCase()); + } + #onSubmit() { this.updateValue({ selection: this.#selectionManager.getSelection() }); this._submitModal(); @@ -72,8 +91,17 @@ export class UmbUserGroupPickerModalElement extends UmbModalBaseElement< return html` + + + ${repeat( - this._userGroups, + this._filteredItems, (userGroup) => userGroup.alias, (userGroup) => html` `; } + + static override styles = [ + css` + #filter { + width: 100%; + margin-bottom: var(--uui-size-space-4); + } + + #filter-icon { + display: flex; + color: var(--uui-color-border); + height: 100%; + padding-left: var(--uui-size-space-2); + } + `, + ]; } export default UmbUserGroupPickerModalElement;