'Checkbox from material ui allows to pick just one element once it's open
In project in react table I use filtering prop and it's operated via Checkbox modal which should allow to pick certain properties. The issue I face is that Checkbox allows to pick just 1 item at a time, so onClick it opens, then I can choose just 1 element, then it close, once I open it again it remembers previously picked thing but still allows me to pick just one. So if I had 10 elemnts to pick it would be a nightmare. Can You please check it and advise how to solve it ?
It how table is defined:
const columns: any[] = [
{
Header: useTranslationFunc('Status'),
accessor: 'state',
collapse: true,
disableSortBy: true,
Cell: (props: CellValue) => (
<RenderTrainStatus statusType={props.cell.value} />
),
Filter: MultiCheckBoxColumnFilter,
filter: multiSelectFilterFunction,
},
{
Header: useTranslationFunc('Nr składu'),
accessor: 'trainId',
collapse: true,
Cell: (props: CellValue) => <div>{props.cell.value}</div>,
Filter: MultiCheckBoxColumnFilter,
filter: multiSelectFilterFunction,
},
This is MulticheckBoxColumnFIlter and it's logic:
export const MultiCheckBoxColumnFilter: FC<ColumnProps> = ({
column: { filterValue = [], Header, setFilter, preFilteredRows, id },
}) => {
const [anchorEl, setAnchorEl] = useState(null);
const theme = useTheme();
const handleClick = (event: any) => {
setAnchorEl(event.currentTarget);
};
const handleClose = (event: any) => {
setAnchorEl(null);
};
const options = useMemo(() => {
const counts: any = {};
preFilteredRows
.filter((record) => record.values[id])
.forEach((record: any) => {
record = record.values[id];
counts[record] = (counts[record] || 0) + 1;
});
return counts;
}, [id, preFilteredRows]);
const onChange = (e: any) => {
const selectedItem = e.target.name.toString();
if (filterValue && filterValue.includes(selectedItem)) {
setFilter(filterValue.filter((v: string) => v !== selectedItem));
} else {
setFilter([...filterValue, selectedItem]);
}
};
const setColor = (
value: string,
firstColor: PaletteColor,
secondColor: PaletteColor
) => (value ? firstColor : secondColor).toString();
return (
<StyledSpan>
<StyledFilterButton aria-haspopup="true" onClick={handleClick}>
<FilterListIcon
htmlColor={setColor(
filterValue.length,
theme.palette.red,
theme.palette.black
)}
/>
</StyledFilterButton>
<StyledMenu
id="customized-menu"
anchorEl={anchorEl}
keepMounted
open={Boolean(anchorEl)}
onClose={handleClose}
anchorOrigin={{ vertical: 'top', horizontal: 'center' }}
transformOrigin={{ vertical: 'top', horizontal: 'center' }}
>
<StyledDescriptionDiv>{Header}</StyledDescriptionDiv>
<StyledContainerDiv>
{Object.entries(options).map(([option, count], i) => (
<StyledLabel key={i} htmlFor={option}>
<Checkbox
name={option}
id={option}
checked={filterValue.includes(option)}
onChange={onChange}
title={`${option} (${count})`}
size="small"
sx={{
'&.Mui-checked': {
color: '#FD5C01',
},
}}
/>
{option} ({count})
</StyledLabel>
))}
</StyledContainerDiv>
</StyledMenu>
</StyledSpan>
);
};
enter code here
And here how it's rendered:
<StyledTableHeadRow
key={idx}
{...group.getHeaderGroupProps()}
>
{group.headers.map((column, idx) => {
return (
<StyledTableHeader
key={idx}
isSorted={column.isSorted}
key={column.id}
{...column.getHeaderProps({})}
style={{
whiteSpace:
!matches && 'unset',
}}
>
<RenderHeaderContent
column={column}
idx={idx}
/>
</StyledTableHeader>
);
})}
</StyledTableHeadRow>
const RenderHeaderContent = ({ column, idx }) => {
return (
<StyledHeaderContentWrapper>
<StyledTitleAndSortedIconWrapper
onClick={() => {
isDesktop && setClickedIndex(idx);
!column.isSortedDesc
? setIsSorted(true)
: setIsSorted(false);
}}
>
<span
{...column.getHeaderProps(
column.getSortByToggleProps(),
{
className: column.collapse ? 'collapse' : '',
}
)}
>
{column.render('Header')}
</span>
<span>
{column.isSorted ? (
column.isSortedDesc ? (
<StyledArrowDownwardIcon />
) : (
<StyledArrowUpwardIcon />
)
) : (
''
)}
</span>
</StyledTitleAndSortedIconWrapper>
<span
style={{
marginLeft: isDesktop
? isSorted &&
idx === clickedIndex &&
acceptedSortingIndex.includes(clickedIndex)
? '12px'
: '0px'
: null,
}}
>
{columnsCount > 5 ? (
<StyledHeaderDivFlex>
{column.canFilter ? column.render('Filter') : null}
</StyledHeaderDivFlex>
) : (
<StyledHeaderDivBlock>
{column.canFilter ? column.render('Filter') : null}
</StyledHeaderDivBlock>
)}
</span>
</StyledHeaderContentWrapper>
);
};
Somehow Checkbox lost some of it's propertly like but I cannot figure out where I did wrong.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
