Skip to content

Commit 4a6e17b

Browse files
committed
feat: add filter select picker
1 parent dc8225b commit 4a6e17b

File tree

4 files changed

+80
-1
lines changed

4 files changed

+80
-1
lines changed
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
/*
2+
* Copyright (c) 2024. Devtron Inc.
3+
*/
4+
5+
import { useEffect, useState } from 'react'
6+
import SelectPicker from './SelectPicker.component'
7+
import { FilterSelectPickerProps, SelectPickerProps } from './type'
8+
9+
const FilterSelectPicker = ({ appliedFilterOptions, handleApplyFilter, ...props }: FilterSelectPickerProps) => {
10+
const [isMenuOpen, setIsMenuOpen] = useState(false)
11+
const [selectedOptions, setSelectedOptions] = useState<FilterSelectPickerProps['options']>()
12+
13+
const resetSelectedOptions = () => {
14+
setSelectedOptions(structuredClone(appliedFilterOptions))
15+
}
16+
17+
useEffect(() => {
18+
resetSelectedOptions()
19+
}, [appliedFilterOptions])
20+
21+
const openMenu = () => {
22+
setIsMenuOpen(true)
23+
}
24+
25+
const closeMenu = () => {
26+
setIsMenuOpen(false)
27+
}
28+
29+
const handleSelectOnChange: SelectPickerProps['onChange'] = (selectedOptionsToUpdate) => {
30+
setSelectedOptions(structuredClone(selectedOptionsToUpdate))
31+
}
32+
33+
const handleMenuClose = () => {
34+
closeMenu()
35+
resetSelectedOptions()
36+
}
37+
38+
const handleApplyClick = () => {
39+
handleApplyFilter(selectedOptions)
40+
closeMenu()
41+
}
42+
43+
const renderApplyButton = () => (
44+
<div className="p-8 dc__border-top-n1">
45+
<button
46+
type="button"
47+
className="dc__unset-button-styles w-100 br-4 h-28 flex bcb-5 cn-0 fw-6 lh-28 fs-12 h-28 br-4 pt-5 pr-12 pb-5 pl-12"
48+
onClick={handleApplyClick}
49+
aria-label="Apply filters"
50+
>
51+
Apply
52+
</button>
53+
</div>
54+
)
55+
56+
return (
57+
<div>
58+
<SelectPicker
59+
{...props}
60+
isMulti
61+
menuIsOpen={isMenuOpen}
62+
onMenuOpen={openMenu}
63+
onMenuClose={handleMenuClose}
64+
onChange={handleSelectOnChange}
65+
renderMenuListFooter={renderApplyButton}
66+
/>
67+
</div>
68+
)
69+
}
70+
71+
export default FilterSelectPicker

src/Shared/Components/SelectPicker/SelectPicker.component.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,6 @@ const SelectPicker = ({
228228
)
229229

230230
// Used to show the create new option for creatable select
231-
// TODO: FilterButton; Target Platform
232231
const isValidNewOption = (inputValue: string) =>
233232
isCreatable &&
234233
!!inputValue?.trim() &&

src/Shared/Components/SelectPicker/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,5 @@
1515
*/
1616

1717
export { default as SelectPicker } from './SelectPicker.component'
18+
export { default as FilterSelectPicker } from './FilterSelectPicker'
1819
export * from './type'

src/Shared/Components/SelectPicker/type.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ export type SelectPickerProps = Pick<
6767
| 'menuIsOpen'
6868
| 'onMenuOpen'
6969
| 'onMenuClose'
70+
| 'autoFocus'
7071
> &
7172
Required<Pick<SelectProps, 'inputId'>> & {
7273
/**
@@ -193,3 +194,10 @@ export type SelectPickerProps = Pick<
193194
renderCustomOptions?: never
194195
}
195196
)
197+
198+
export interface FilterSelectPickerProps
199+
extends Required<Pick<SelectPickerProps, 'options' | 'isDisabled' | 'placeholder' | 'isLoading'>>,
200+
Pick<SelectPickerProps, 'selectRef' | 'inputId' | 'menuPosition' | 'autoFocus'> {
201+
appliedFilterOptions: SelectPickerProps['options']
202+
handleApplyFilter: (filtersToApply: SelectPickerProps['options']) => void
203+
}

0 commit comments

Comments
 (0)