in src/components/CompareResults/TableHeader.tsx [81:189]
function FilterableColumnHeader({
name,
columnId,
possibleValues,
checkedValues,
onToggleFilter,
onClearFilter,
tooltip,
}: FilterableColumnHeaderProps) {
const popupState = usePopupState({ variant: 'popover', popupId: columnId });
const possibleCheckedValues = checkedValues?.size ?? possibleValues.length;
const onClickFilter = (valueKey: string) => {
const newCheckedValues = checkedValues
? new Set(checkedValues)
: new Set(possibleValues.map(({ key }) => key));
if (newCheckedValues.has(valueKey)) {
newCheckedValues.delete(valueKey);
} else {
newCheckedValues.add(valueKey);
}
onToggleFilter(newCheckedValues);
};
const onClickOnlyFilter = (valueKey: string) => {
const newCheckedValues = new Set([valueKey]);
onToggleFilter(newCheckedValues);
};
const hasFilteredValues =
checkedValues && checkedValues.size < possibleValues.length;
const buttonAriaLabel = hasFilteredValues
? `${name} (Click to filter values. Some filters are active.)`
: `${name} (Click to filter values)`;
return (
<>
{/* setting tooltip in button will stop the overlay on filtermenu and also prevent tooltip from popping up when filter menu is open and active */}
<Tooltip title={tooltip} placement='top' arrow>
<Button
{...bindTrigger(popupState)}
color='tableHeaderButton'
size='small'
aria-label={buttonAriaLabel}
sx={{ paddingInline: 1.5, fontSize: '16px' }}
>
{name}
<Box
sx={{
paddingInlineStart: 0.5,
color: 'primary.main',
}}
aria-label={`${possibleCheckedValues} items selected`}
>
({possibleCheckedValues})
</Box>
<KeyboardArrowDownIcon />
</Button>
</Tooltip>
<Menu {...bindMenu(popupState)}>
<MenuItem
dense={true}
onClick={onClearFilter}
sx={{ fontSize: '16px' }}
>
Select all values
</MenuItem>
<Divider />
{possibleValues.map((possibleValue) => (
<MenuItem
sx={{ fontSize: '16px' }}
dense={true}
key={possibleValue.key}
onClick={() => onClickOnlyFilter(possibleValue.key)}
>
Select only “{possibleValue.label}”
</MenuItem>
))}
<Divider />
{possibleValues.map((possibleValue) => {
const isChecked =
!checkedValues || checkedValues.has(possibleValue.key);
return (
<MenuItem
dense
key={possibleValue.key}
role='menuitemcheckbox'
aria-checked={isChecked ? 'true' : 'false'}
aria-label={`${possibleValue.label}${
isChecked ? ' (selected)' : ''
}`}
onClick={() => onClickFilter(possibleValue.key)}
>
<ListItemIcon>
<Checkbox
checked={isChecked}
tabIndex={-1}
disableRipple
sx={{ padding: 0 }}
/>
</ListItemIcon>
<ListItemText primary={possibleValue.label} />
</MenuItem>
);
})}
</Menu>
</>
);
}