Skip to content

Commit 12b8336

Browse files
committed
feat: add mui autocomplete checkboxes for component filter
1 parent 67ff953 commit 12b8336

File tree

1 file changed

+74
-41
lines changed

1 file changed

+74
-41
lines changed

ui/intermittent-failures/MainView.jsx

Lines changed: 74 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import ReactTable from 'react-table-6';
66
import Checkbox from '@mui/material/Checkbox';
77
import TextField from '@mui/material/TextField';
88
import Autocomplete from '@mui/material/Autocomplete';
9+
import Popper from '@mui/material/Popper';
910

1011
import { bugsEndpoint } from '../helpers/url';
1112
import { setUrlParam, getUrlParam } from '../helpers/location';
@@ -21,6 +22,16 @@ import withView from './View';
2122
import Layout from './Layout';
2223
import DateRangePicker from './DateRangePicker';
2324

25+
const CustomPopper = function (props) {
26+
return (
27+
<Popper
28+
{...props}
29+
style={{ width: '350px', textAlign: 'left' }}
30+
placement="bottom-start"
31+
/>
32+
);
33+
};
34+
2435
const MainView = (props) => {
2536
const {
2637
graphData,
@@ -35,7 +46,10 @@ const MainView = (props) => {
3546
updateAppState,
3647
} = props;
3748

38-
const [selectedProduct, setSelectedProduct] = React.useState([]);
49+
const [selectedFilter, setSelectedFilter] = React.useState({
50+
product: [],
51+
component: [],
52+
});
3953
const textFilter = (filter, row) => {
4054
if (getUrlParam(filter.id) !== filter.value) {
4155
setUrlParam(filter.id, filter.value);
@@ -47,6 +61,40 @@ const MainView = (props) => {
4761
}
4862
};
4963

64+
const autoCompleteFilter = ({ column, onChange }) => {
65+
const options = [...new Set(tableData.map((d) => d[column.id]))];
66+
options.sort();
67+
return (
68+
<Autocomplete
69+
slots={{ popper: CustomPopper }}
70+
size="small"
71+
multiple
72+
id="checkboxes-tags-filter"
73+
options={options}
74+
onChange={(_event, values) => {
75+
setUrlParam(column.id, values);
76+
onChange(values);
77+
setSelectedFilter({ ...selectedFilter, [column.id]: values });
78+
}}
79+
disableCloseOnSelect
80+
defaultValue={selectedFilter[column.id]}
81+
fullWidth={true}
82+
renderOption={(props, option, { selected }) => {
83+
const { key, ...optionProps } = props;
84+
return (
85+
<li key={key} {...optionProps}>
86+
<Checkbox style={{ marginRight: 8 }} checked={selected} />
87+
{option}
88+
</li>
89+
);
90+
}}
91+
renderInput={(params) => (
92+
<TextField style={{ border: 'none', padding: '0' }} {...params} />
93+
)}
94+
/>
95+
);
96+
};
97+
5098
const columns = [
5199
{
52100
Header: 'Bug',
@@ -80,51 +128,28 @@ const MainView = (props) => {
80128
accessor: 'product',
81129
maxWidth: 100,
82130
filterMethod: (filter, row) => {
83-
const regex = RegExp(filter.value.join('|'), 'i');
84-
if (regex.test(row.product)) {
85-
return row;
131+
if (filter.value) {
132+
const regex = RegExp(filter.value.join('|'), 'i');
133+
if (regex.test(row.product)) {
134+
return row;
135+
}
86136
}
87137
},
88-
Filter: ({ onChange }) => {
89-
return (
90-
<Autocomplete
91-
multiple
92-
id="checkboxes-tags-filter"
93-
options={[...new Set(tableData.map((d) => d.product))]}
94-
onChange={(_event, values) => {
95-
setUrlParam('product', values);
96-
onChange(values);
97-
}}
98-
limitTags={2}
99-
disableCloseOnSelect
100-
defaultValue={selectedProduct}
101-
style={{
102-
width: '20em',
103-
}}
104-
renderOption={(props, option, { selected }) => {
105-
const { key, ...optionProps } = props;
106-
return (
107-
<li key={key} {...optionProps}>
108-
<Checkbox style={{ marginRight: 8 }} checked={selected} />
109-
{option}
110-
</li>
111-
);
112-
}}
113-
renderInput={(params) => (
114-
<TextField
115-
style={{ border: 'none', height: '0.3em', padding: '0' }}
116-
{...params}
117-
/>
118-
)}
119-
/>
120-
);
121-
},
138+
Filter: autoCompleteFilter,
122139
},
123140
{
124141
Header: 'Component',
125142
accessor: 'component',
126143
maxWidth: 100,
127-
filterMethod: (filter, row) => textFilter(filter, row),
144+
filterMethod: (filter, row) => {
145+
if (filter.value) {
146+
const regex = RegExp(filter.value.join('|'), 'i');
147+
if (regex.test(row.component)) {
148+
return row;
149+
}
150+
}
151+
},
152+
Filter: autoCompleteFilter,
128153
},
129154
{
130155
Header: 'Summary',
@@ -173,8 +198,16 @@ const MainView = (props) => {
173198
if (param) {
174199
if (header === 'product') {
175200
filters.push({ id: header, value: param.split(',') });
176-
if (selectedProduct.length === 0) {
177-
setSelectedProduct(param.split(','));
201+
if (selectedFilter.product.length === 0) {
202+
setSelectedFilter({ ...selectedFilter, product: param.split(',') });
203+
}
204+
} else if (header === 'component') {
205+
filters.push({ id: header, value: param.split(',') });
206+
if (selectedFilter.component.length === 0) {
207+
setSelectedFilter({
208+
...selectedFilter,
209+
component: param.split(','),
210+
});
178211
}
179212
} else {
180213
filters.push({ id: header, value: param });

0 commit comments

Comments
 (0)