Skip to content

Commit 6fe3a59

Browse files
committed
feat: add mui autocomplete checkboxes for product filters
1 parent 0d7aa71 commit 6fe3a59

File tree

2 files changed

+65
-2
lines changed

2 files changed

+65
-2
lines changed

ui/css/react-table.css

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -504,3 +504,16 @@
504504
-ms-user-select: none;
505505
user-select: none;
506506
}
507+
508+
.ReactTable .MuiAutocomplete-tag {
509+
height: 20px;
510+
}
511+
.ReactTable .MuiAutocomplete-inputRoot {
512+
height: 2em;
513+
}
514+
.ReactTable .MuiInputBase-input {
515+
height: 0.2em;
516+
}
517+
.ReactTable .MuiAutocomplete-input {
518+
display: none;
519+
}

ui/intermittent-failures/MainView.jsx

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ import { Row, Col, Breadcrumb, BreadcrumbItem } from 'reactstrap';
33
import PropTypes from 'prop-types';
44
import moment from 'moment';
55
import ReactTable from 'react-table-6';
6+
import Checkbox from '@mui/material/Checkbox';
7+
import TextField from '@mui/material/TextField';
8+
import Autocomplete from '@mui/material/Autocomplete';
69

710
import { bugsEndpoint } from '../helpers/url';
811
import { setUrlParam, getUrlParam } from '../helpers/location';
@@ -32,6 +35,7 @@ const MainView = (props) => {
3235
updateAppState,
3336
} = props;
3437

38+
const [selectedProduct, setSelectedProduct] = React.useState([]);
3539
const textFilter = (filter, row) => {
3640
if (getUrlParam(filter.id) !== filter.value) {
3741
setUrlParam(filter.id, filter.value);
@@ -75,7 +79,46 @@ const MainView = (props) => {
7579
Header: 'Product',
7680
accessor: 'product',
7781
maxWidth: 100,
78-
filterMethod: (filter, row) => textFilter(filter, row),
82+
filterMethod: (filter, row) => {
83+
const regex = RegExp(filter.value.join('|'), 'i');
84+
if (regex.test(row.product)) {
85+
return row;
86+
}
87+
},
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+
},
79122
},
80123
{
81124
Header: 'Component',
@@ -128,7 +171,14 @@ const MainView = (props) => {
128171
for (const header of ['product', 'component', 'summary', 'whiteboard']) {
129172
const param = getUrlParam(header);
130173
if (param) {
131-
filters.push({ id: header, value: getUrlParam(header) });
174+
if (header === 'product') {
175+
filters.push({ id: header, value: param.split(',') });
176+
if (selectedProduct.length === 0) {
177+
setSelectedProduct(param.split(','));
178+
}
179+
} else {
180+
filters.push({ id: header, value: param });
181+
}
132182
}
133183
}
134184
return filters;

0 commit comments

Comments
 (0)