Skip to content

Commit bb75518

Browse files
authored
User Group picker modal: adds filter input (#18159)
Fixes #16452.
1 parent 7c5c3fd commit bb75518

File tree

1 file changed

+49
-5
lines changed

1 file changed

+49
-5
lines changed

src/Umbraco.Web.UI.Client/src/packages/user/user-group/modals/user-group-picker/user-group-picker-modal.element.ts

Lines changed: 49 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import { UmbUserGroupCollectionRepository } from '../../collection/repository/index.js';
22
import type { UmbUserGroupDetailModel } from '../../types.js';
3-
import { customElement, html, repeat, state, when } from '@umbraco-cms/backoffice/external/lit';
3+
import { css, customElement, html, repeat, state, when } from '@umbraco-cms/backoffice/external/lit';
4+
import { debounce, UmbSelectionManager } from '@umbraco-cms/backoffice/utils';
5+
import { umbFocus } from '@umbraco-cms/backoffice/lit-element';
46
import { UmbDeselectedEvent, UmbSelectedEvent } from '@umbraco-cms/backoffice/event';
5-
import { UmbSelectionManager } from '@umbraco-cms/backoffice/utils';
67
import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal';
78
import type { UMB_USER_GROUP_PICKER_MODAL } from '@umbraco-cms/backoffice/user-group';
8-
import type { UUIMenuItemEvent } from '@umbraco-cms/backoffice/external/uui';
9+
import type { UUIInputEvent, UUIMenuItemEvent } from '@umbraco-cms/backoffice/external/uui';
910

1011
import '../../components/user-group-ref/user-group-ref.element.js';
1112

@@ -14,10 +15,23 @@ export class UmbUserGroupPickerModalElement extends UmbModalBaseElement<
1415
typeof UMB_USER_GROUP_PICKER_MODAL.DATA,
1516
typeof UMB_USER_GROUP_PICKER_MODAL.VALUE
1617
> {
18+
@state()
19+
private _filteredItems: Array<UmbUserGroupDetailModel> = [];
20+
1721
@state()
1822
private _userGroups: Array<UmbUserGroupDetailModel> = [];
1923

24+
#debouncedFilter = debounce((filter: string) => {
25+
this._filteredItems = filter
26+
? this._userGroups.filter(
27+
(userGroup) =>
28+
userGroup.alias.toLowerCase().includes(filter) || userGroup.name.toLowerCase().includes(filter),
29+
)
30+
: this._userGroups;
31+
}, 500);
32+
2033
#selectionManager = new UmbSelectionManager(this);
34+
2135
#userGroupCollectionRepository = new UmbUserGroupCollectionRepository(this);
2236

2337
constructor() {
@@ -40,7 +54,7 @@ export class UmbUserGroupPickerModalElement extends UmbModalBaseElement<
4054
const { error, asObservable } = await this.#userGroupCollectionRepository.requestCollection();
4155
if (error) return;
4256

43-
this.observe(asObservable(), (items) => (this._userGroups = items), 'umbUserGroupsObserver');
57+
this.observe(asObservable(), (items) => (this._userGroups = this._filteredItems = items), 'umbUserGroupsObserver');
4458
}
4559

4660
#onSelected(event: UUIMenuItemEvent, item: UmbUserGroupDetailModel) {
@@ -63,6 +77,11 @@ export class UmbUserGroupPickerModalElement extends UmbModalBaseElement<
6377
this.modalContext?.dispatchEvent(new UmbDeselectedEvent(item.unique));
6478
}
6579

80+
#onFilterInput(event: UUIInputEvent) {
81+
const query = (event.target.value as string) || '';
82+
this.#debouncedFilter(query.toLowerCase());
83+
}
84+
6685
#onSubmit() {
6786
this.updateValue({ selection: this.#selectionManager.getSelection() });
6887
this._submitModal();
@@ -72,8 +91,17 @@ export class UmbUserGroupPickerModalElement extends UmbModalBaseElement<
7291
return html`
7392
<umb-body-layout headline=${this.localize.term('user_chooseUserGroup', true)}>
7493
<uui-box>
94+
<uui-input
95+
type="search"
96+
id="filter"
97+
label=${this.localize.term('placeholders_filter')}
98+
placeholder=${this.localize.term('placeholders_filter')}
99+
@input=${this.#onFilterInput}
100+
${umbFocus()}>
101+
<uui-icon name="search" slot="prepend" id="filter-icon"></uui-icon>
102+
</uui-input>
75103
${repeat(
76-
this._userGroups,
104+
this._filteredItems,
77105
(userGroup) => userGroup.alias,
78106
(userGroup) => html`
79107
<umb-user-group-ref
@@ -104,6 +132,22 @@ export class UmbUserGroupPickerModalElement extends UmbModalBaseElement<
104132
</umb-body-layout>
105133
`;
106134
}
135+
136+
static override styles = [
137+
css`
138+
#filter {
139+
width: 100%;
140+
margin-bottom: var(--uui-size-space-4);
141+
}
142+
143+
#filter-icon {
144+
display: flex;
145+
color: var(--uui-color-border);
146+
height: 100%;
147+
padding-left: var(--uui-size-space-2);
148+
}
149+
`,
150+
];
107151
}
108152

109153
export default UmbUserGroupPickerModalElement;

0 commit comments

Comments
 (0)