Skip to content

Commit 937f5c1

Browse files
authored
Merge pull request #244 from devtron-labs/feat/multi-select-picker
feat: add support for multi select picker
2 parents 4c26f7b + e1acab8 commit 937f5c1

File tree

11 files changed

+886
-202
lines changed

11 files changed

+886
-202
lines changed

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@devtron-labs/devtron-fe-common-lib",
3-
"version": "0.2.12",
3+
"version": "0.2.13",
44
"description": "Supporting common component library",
55
"type": "module",
66
"main": "dist/index.js",
@@ -23,12 +23,12 @@
2323
],
2424
"scripts": {
2525
"prepare": "node -e \"try { require('husky').install() } catch (e) {}\"",
26-
"lint": "tsc --noEmit && NODE_OPTIONS=--max_old_space_size=8192 eslint 'src/**/*.{js,jsx,ts,tsx}' --max-warnings 0",
26+
"lint": "tsc --noEmit && NODE_OPTIONS=--max_old_space_size=3072 eslint 'src/**/*.{js,jsx,ts,tsx}' --max-warnings 0",
2727
"lint-fix": "eslint 'src/**/*.{js,jsx,ts,tsx}' --fix",
2828
"test": "exit 0",
29-
"dev": "NODE_OPTIONS=--max_old_space_size=8192 vite",
30-
"build": "NODE_OPTIONS=--max_old_space_size=8192 vite build --sourcemap",
31-
"build-watch": "NODE_OPTIONS=--max_old_space_size=8192 vite build --sourcemap --watch",
29+
"dev": "NODE_OPTIONS=--max_old_space_size=3072 vite",
30+
"build": "NODE_OPTIONS=--max_old_space_size=3072 vite build --sourcemap",
31+
"build-watch": "NODE_OPTIONS=--max_old_space_size=3072 vite build --sourcemap --watch",
3232
"build-lib": "vite build",
3333
"preview": "vite preview",
3434
"lint-staged": "lint-staged"

src/Assets/Icon/ic-filter-applied.svg

Lines changed: 3 additions & 3 deletions
Loading

src/Assets/Icon/ic-filter.svg

Lines changed: 2 additions & 2 deletions
Loading

src/Shared/Components/DeploymentConfigDiff/DeploymentConfigDiffMain.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,14 @@ export const DeploymentConfigDiffMain = ({
6969
}
7070

7171
const { selectPickerProps } = configItem
72+
7273
return (
7374
<Fragment key={configItem.id}>
7475
<div className="dc__mxw-300">
75-
<SelectPicker {...selectPickerProps} isDisabled={isLoading || selectPickerProps?.isDisabled} />
76+
<SelectPicker<string | number, false>
77+
{...selectPickerProps}
78+
isDisabled={isLoading || selectPickerProps?.isDisabled}
79+
/>
7680
</div>
7781
{index !== list.length - 1 && <span className="cn-9 fs-13 lh-20">/</span>}
7882
</Fragment>
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
/*
2+
* Copyright (c) 2024. Devtron Inc.
3+
*/
4+
5+
import { useMemo, useState } from 'react'
6+
import { ReactComponent as ICFilter } from '@Icons/ic-filter.svg'
7+
import { ReactComponent as ICFilterApplied } from '@Icons/ic-filter-applied.svg'
8+
import SelectPicker from './SelectPicker.component'
9+
import { FilterSelectPickerProps, SelectPickerOptionType, SelectPickerProps } from './type'
10+
11+
const FilterSelectPicker = ({
12+
appliedFilterOptions,
13+
handleApplyFilter,
14+
options,
15+
...props
16+
}: FilterSelectPickerProps) => {
17+
const [isMenuOpen, setIsMenuOpen] = useState(false)
18+
const [selectedOptions, setSelectedOptions] = useState<SelectPickerOptionType[]>(
19+
structuredClone(appliedFilterOptions ?? []),
20+
)
21+
22+
const appliedFiltersCount = appliedFilterOptions?.length ?? 0
23+
24+
const filterIcon = useMemo(
25+
() => (appliedFiltersCount ? <ICFilterApplied className="p-2" /> : <ICFilter className="p-2" />),
26+
[appliedFiltersCount],
27+
)
28+
29+
const openMenu = () => {
30+
setIsMenuOpen(true)
31+
}
32+
33+
const closeMenu = () => {
34+
setIsMenuOpen(false)
35+
}
36+
37+
const handleSelectOnChange: SelectPickerProps<number | string, true>['onChange'] = (selectedOptionsToUpdate) => {
38+
setSelectedOptions(structuredClone(selectedOptionsToUpdate))
39+
}
40+
41+
const handleMenuClose = () => {
42+
closeMenu()
43+
setSelectedOptions(structuredClone(appliedFilterOptions ?? []))
44+
}
45+
46+
const renderApplyButton = (optionsSelected: Parameters<FilterSelectPickerProps['handleApplyFilter']>[0]) => {
47+
const handleApplyClick = () => {
48+
handleApplyFilter(optionsSelected)
49+
closeMenu()
50+
}
51+
52+
return (
53+
<div className="p-8 dc__border-top-n1">
54+
<button
55+
type="button"
56+
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"
57+
onClick={handleApplyClick}
58+
aria-label="Apply filters"
59+
>
60+
Apply
61+
</button>
62+
</div>
63+
)
64+
}
65+
66+
return (
67+
<div className="dc__mxw-250">
68+
<SelectPicker
69+
{...props}
70+
options={options}
71+
value={selectedOptions}
72+
isMulti
73+
menuIsOpen={isMenuOpen}
74+
onMenuOpen={openMenu}
75+
onMenuClose={handleMenuClose}
76+
onChange={handleSelectOnChange}
77+
renderMenuListFooter={renderApplyButton}
78+
controlShouldRenderValue={false}
79+
showSelectedOptionsCount
80+
isSearchable
81+
isClearable={false}
82+
customSelectedOptionsCount={appliedFiltersCount}
83+
icon={filterIcon}
84+
/>
85+
</div>
86+
)
87+
}
88+
89+
export default FilterSelectPicker

0 commit comments

Comments
 (0)