@@ -5,12 +5,13 @@ import {
5
5
Button ,
6
6
Flex ,
7
7
FlexItem ,
8
- InputGroup ,
8
+ MenuToggle ,
9
9
TextInput ,
10
- type SelectOptionProps ,
10
+ Dropdown ,
11
+ DropdownItem ,
12
+ DropdownList ,
11
13
} from '@patternfly/react-core' ;
12
14
13
- import DropdownSelect from 'components/DropdownSelect/DropdownSelect' ;
14
15
import { FilterIcon , SearchIcon } from '@patternfly/react-icons' ;
15
16
import Hide from 'components/Hide/Hide' ;
16
17
import useDebounce from 'Hooks/useDebounce' ;
@@ -30,9 +31,21 @@ const useStyles = createUseStyles({
30
31
clearFilters : {
31
32
marginLeft : '16px' ,
32
33
} ,
34
+ menuToggle : {
35
+ width : 'fit-content' ,
36
+ maxWidth : 'unset!important' , // Remove arbitrary button width
37
+ } ,
38
+ filter : {
39
+ maxWidth : 'unset!important' , // Remove arbitrary button width
40
+ width : '-webkit-fill-available' ,
41
+ } ,
42
+ filterDropdown : {
43
+ width : 'fit-content' ,
44
+ } ,
33
45
} ) ;
34
46
35
47
const statusValues = [ 'Running' , 'Failed' , 'Completed' , 'Canceled' , 'Pending' ] ;
48
+
36
49
const typeValues = [
37
50
'snapshot' ,
38
51
'delete-repository-snapshots' ,
@@ -41,13 +54,17 @@ const typeValues = [
41
54
'update-template-content' ,
42
55
'update-repository' ,
43
56
] ;
57
+
44
58
const filters = [ 'Account ID' , 'Org ID' , 'Status' , 'Type' ] ;
59
+
45
60
export type AdminTaskFilters = 'Account ID' | 'Org ID' | 'Status' | 'Type' ;
46
61
47
62
const AdminTaskFilters = ( { isLoading, setFilterData, filterData } : Props ) => {
48
63
const classes = useStyles ( ) ;
49
64
const [ filterType , setFilterType ] = useState < AdminTaskFilters > ( 'Account ID' ) ;
50
65
const [ accountId , setAccountId ] = useState ( '' ) ;
66
+ const [ typeFilterOpen , setTypeFilterOpen ] = useState ( false ) ;
67
+ const [ isActionOpen , setActionOpen ] = useState ( false ) ;
51
68
const [ orgId , setOrgId ] = useState ( '' ) ;
52
69
const [ selectedStatuses , setSelectedStatuses ] = useState < string [ ] > ( [ ] ) ;
53
70
const [ selectedTypenames , setSelectedTypenames ] = useState < string [ ] > ( [ ] ) ;
@@ -129,94 +146,142 @@ const AdminTaskFilters = ({ isLoading, setFilterData, filterData }: Props) => {
129
146
) ;
130
147
case 'Status' :
131
148
return (
132
- < DropdownSelect
149
+ < Dropdown
133
150
onSelect = { ( _ , val ) =>
134
151
setSelectedStatuses ( ( prev ) =>
135
152
selectedStatuses . includes ( val as string )
136
153
? prev . filter ( ( item ) => item !== ( val as string ) )
137
154
: [ ...prev , val as string ] ,
138
155
)
139
156
}
140
- menuToggleProps = { {
141
- 'aria-label' : 'filter status' ,
142
- id : 'statusSelect' ,
143
- } }
144
- multiSelect
145
- dropDownItems = {
146
- statusValues . map ( ( status ) => ( {
147
- hasCheckbox : true ,
148
- value : status ,
149
- isSelected : selectedStatuses . includes ( status ) ,
150
- children : status ,
151
- 'data-ouia-component-id' : `filter_${ status } ` ,
152
- } ) ) as SelectOptionProps [ ]
153
- }
154
- isDisabled = { isLoading }
155
- menuValue = 'Filter by status'
156
- ouiaId = 'filter_status'
157
- />
157
+ toggle = { ( toggleRef ) => (
158
+ < MenuToggle
159
+ ref = { toggleRef }
160
+ className = { classes . menuToggle }
161
+ aria-label = 'filter status'
162
+ id = 'statusSelect'
163
+ ouiaId = 'filter_status'
164
+ onClick = { ( ) => setActionOpen ( ( prev ) => ! prev ) }
165
+ isDisabled = { isLoading }
166
+ isExpanded = { isActionOpen }
167
+ >
168
+ Filter by status
169
+ </ MenuToggle >
170
+ ) }
171
+ onOpenChange = { ( isOpen ) => setActionOpen ( isOpen ) }
172
+ isOpen = { isActionOpen }
173
+ >
174
+ < DropdownList >
175
+ { statusValues . map ( ( status ) => (
176
+ < DropdownItem
177
+ key = { status }
178
+ hasCheckbox
179
+ value = { status }
180
+ isSelected = { selectedStatuses . includes ( status ) }
181
+ component = 'button'
182
+ data-ouia-component-id = { `filter_${ status } ` }
183
+ >
184
+ { status }
185
+ </ DropdownItem >
186
+ ) ) }
187
+ </ DropdownList >
188
+ </ Dropdown >
158
189
) ;
159
190
case 'Type' :
160
191
return (
161
- < DropdownSelect
192
+ < Dropdown
162
193
onSelect = { ( _ , val ) =>
163
194
setSelectedTypenames ( ( prev ) =>
164
195
selectedTypenames . includes ( val as string )
165
196
? prev . filter ( ( item ) => item !== ( val as string ) )
166
197
: [ ...prev , val as string ] ,
167
198
)
168
199
}
169
- menuToggleProps = { {
170
- 'aria-label' : 'filter type' ,
171
- id : 'typeSelect' ,
172
- } }
173
- multiSelect
174
- dropDownItems = {
175
- typeValues . map ( ( status ) => ( {
176
- hasCheckbox : true ,
177
- value : status ,
178
- isSelected : selectedTypenames . includes ( status ) ,
179
- children : status ,
180
- 'data-ouia-component-id' : `filter_${ status } ` ,
181
- } ) ) as SelectOptionProps [ ]
182
- }
183
- isDisabled = { isLoading }
184
- menuValue = 'Filter by type'
185
- ouiaId = 'filter_type'
186
- />
200
+ toggle = { ( toggleRef ) => (
201
+ < MenuToggle
202
+ ref = { toggleRef }
203
+ className = { classes . menuToggle }
204
+ aria-label = 'filter type'
205
+ id = 'typeSelect'
206
+ ouiaId = 'filter_type'
207
+ onClick = { ( ) => setActionOpen ( ( prev ) => ! prev ) }
208
+ isDisabled = { isLoading }
209
+ isExpanded = { isActionOpen }
210
+ >
211
+ Filter by type
212
+ </ MenuToggle >
213
+ ) }
214
+ onOpenChange = { ( isOpen ) => setActionOpen ( isOpen ) }
215
+ isOpen = { isActionOpen }
216
+ >
217
+ < DropdownList >
218
+ { typeValues . map ( ( type ) => (
219
+ < DropdownItem
220
+ key = { type }
221
+ hasCheckbox
222
+ value = { type }
223
+ isSelected = { selectedTypenames . includes ( type ) }
224
+ component = 'button'
225
+ data-ouia-component-id = { `filter_${ type } ` }
226
+ >
227
+ { type }
228
+ </ DropdownItem >
229
+ ) ) }
230
+ </ DropdownList >
231
+ </ Dropdown >
187
232
) ;
188
233
default :
189
234
return < > </ > ;
190
235
}
191
- } , [ filterType , isLoading , accountId , orgId , selectedStatuses , selectedTypenames ] ) ;
236
+ } , [ filterType , isLoading , accountId , orgId , selectedStatuses , selectedTypenames , isActionOpen ] ) ;
192
237
193
238
return (
194
239
< Flex direction = { { default : 'column' } } >
195
- < Flex >
196
- < FlexItem >
197
- < InputGroup >
198
- < DropdownSelect
199
- onSelect = { ( _ , val ) => setFilterType ( val as AdminTaskFilters ) }
200
- menuToggleProps = { {
201
- 'aria-label' : 'filterSelectionDropdown' ,
202
- id : 'typeSelect' ,
203
- icon : < FilterIcon /> ,
204
- } }
205
- dropDownItems = {
206
- filters . map ( ( filter ) => ( {
207
- value : filter ,
208
- isSelected : filterType === filter ,
209
- children : filter ,
210
- 'data-ouia-component-id' : `filter_${ filter } ` ,
211
- } ) ) as SelectOptionProps [ ]
212
- }
213
- isDisabled = { isLoading }
214
- menuValue = { filterType }
240
+ < Flex
241
+ direction = { { default : 'row' } }
242
+ gap = { { default : 'gap' } }
243
+ flexWrap = { { default : 'nowrap' } }
244
+ alignItems = { { default : 'alignItemsCenter' } }
245
+ >
246
+ < Dropdown
247
+ onSelect = { ( _ , val ) => {
248
+ setFilterType ( val as AdminTaskFilters ) ;
249
+ setTypeFilterOpen ( false ) ;
250
+ } }
251
+ toggle = { ( toggleRef ) => (
252
+ < MenuToggle
253
+ icon = { < FilterIcon /> }
254
+ ref = { toggleRef }
255
+ className = { classes . filter }
256
+ aria-label = 'filterSelectionDropdown'
257
+ id = 'filterSelectionDropdown'
215
258
ouiaId = 'filter_type'
216
- />
217
- { Filter }
218
- </ InputGroup >
219
- </ FlexItem >
259
+ onClick = { ( ) => setTypeFilterOpen ( ( prev ) => ! prev ) }
260
+ isDisabled = { isLoading }
261
+ isExpanded = { typeFilterOpen }
262
+ >
263
+ { filterType }
264
+ </ MenuToggle >
265
+ ) }
266
+ onOpenChange = { ( isOpen ) => setTypeFilterOpen ( isOpen ) }
267
+ isOpen = { typeFilterOpen }
268
+ ouiaId = 'filter_type'
269
+ >
270
+ < DropdownList >
271
+ { filters . map ( ( filter ) => (
272
+ < DropdownItem
273
+ key = { filter }
274
+ value = { filter }
275
+ isSelected = { filterType === filter }
276
+ component = 'button'
277
+ data-ouia-component-id = { `filter_${ filter } ` }
278
+ >
279
+ { filter }
280
+ </ DropdownItem >
281
+ ) ) }
282
+ </ DropdownList >
283
+ </ Dropdown >
284
+ < FlexItem className = { classes . filterDropdown } > { Filter } </ FlexItem >
220
285
</ Flex >
221
286
< Hide
222
287
hide = {
0 commit comments