1
1
import { UmbUserGroupCollectionRepository } from '../../collection/repository/index.js' ;
2
2
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' ;
4
6
import { UmbDeselectedEvent , UmbSelectedEvent } from '@umbraco-cms/backoffice/event' ;
5
- import { UmbSelectionManager } from '@umbraco-cms/backoffice/utils' ;
6
7
import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal' ;
7
8
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' ;
9
10
10
11
import '../../components/user-group-ref/user-group-ref.element.js' ;
11
12
@@ -14,10 +15,23 @@ export class UmbUserGroupPickerModalElement extends UmbModalBaseElement<
14
15
typeof UMB_USER_GROUP_PICKER_MODAL . DATA ,
15
16
typeof UMB_USER_GROUP_PICKER_MODAL . VALUE
16
17
> {
18
+ @state ( )
19
+ private _filteredItems : Array < UmbUserGroupDetailModel > = [ ] ;
20
+
17
21
@state ( )
18
22
private _userGroups : Array < UmbUserGroupDetailModel > = [ ] ;
19
23
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
+
20
33
#selectionManager = new UmbSelectionManager ( this ) ;
34
+
21
35
#userGroupCollectionRepository = new UmbUserGroupCollectionRepository ( this ) ;
22
36
23
37
constructor ( ) {
@@ -40,7 +54,7 @@ export class UmbUserGroupPickerModalElement extends UmbModalBaseElement<
40
54
const { error, asObservable } = await this . #userGroupCollectionRepository. requestCollection ( ) ;
41
55
if ( error ) return ;
42
56
43
- this . observe ( asObservable ( ) , ( items ) => ( this . _userGroups = items ) , 'umbUserGroupsObserver' ) ;
57
+ this . observe ( asObservable ( ) , ( items ) => ( this . _userGroups = this . _filteredItems = items ) , 'umbUserGroupsObserver' ) ;
44
58
}
45
59
46
60
#onSelected( event : UUIMenuItemEvent , item : UmbUserGroupDetailModel ) {
@@ -63,6 +77,11 @@ export class UmbUserGroupPickerModalElement extends UmbModalBaseElement<
63
77
this . modalContext ?. dispatchEvent ( new UmbDeselectedEvent ( item . unique ) ) ;
64
78
}
65
79
80
+ #onFilterInput( event : UUIInputEvent ) {
81
+ const query = ( event . target . value as string ) || '' ;
82
+ this . #debouncedFilter( query . toLowerCase ( ) ) ;
83
+ }
84
+
66
85
#onSubmit( ) {
67
86
this . updateValue ( { selection : this . #selectionManager. getSelection ( ) } ) ;
68
87
this . _submitModal ( ) ;
@@ -72,8 +91,17 @@ export class UmbUserGroupPickerModalElement extends UmbModalBaseElement<
72
91
return html `
73
92
<umb- body- layout headline= ${ this . localize . term ( 'user_chooseUserGroup' , true ) } >
74
93
<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>
75
103
${ repeat (
76
- this . _userGroups ,
104
+ this . _filteredItems ,
77
105
( userGroup ) => userGroup . alias ,
78
106
( userGroup ) => html `
79
107
<umb- user- group- ref
@@ -104,6 +132,22 @@ export class UmbUserGroupPickerModalElement extends UmbModalBaseElement<
104
132
</ umb- body- layout>
105
133
` ;
106
134
}
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
+ ] ;
107
151
}
108
152
109
153
export default UmbUserGroupPickerModalElement ;
0 commit comments