From b2856dec66939a6f0b132001e1994202a73fc06f Mon Sep 17 00:00:00 2001 From: keisuke-umezawa Date: Thu, 18 Apr 2024 16:58:43 +0900 Subject: [PATCH] Fix filter for multiple values --- optuna_dashboard/ts/components/DataGrid.tsx | 113 +++++++++++--------- 1 file changed, 60 insertions(+), 53 deletions(-) diff --git a/optuna_dashboard/ts/components/DataGrid.tsx b/optuna_dashboard/ts/components/DataGrid.tsx index a1fd52a8..ede175f9 100644 --- a/optuna_dashboard/ts/components/DataGrid.tsx +++ b/optuna_dashboard/ts/components/DataGrid.tsx @@ -47,6 +47,7 @@ import { getFilteredRowModel, getFacetedUniqueValues, getFacetedRowModel, + Header, SortingState, PaginationState, ColumnFiltersState, @@ -69,6 +70,61 @@ const HiddenSpan = styled("span")({ width: 1, }) +function FilterMenu(props: { + header: Header + filterChoices: string[] +}): React.ReactElement { + const { header, filterChoices } = props + const [filterMenuAnchorEl, setFilterMenuAnchorEl] = + React.useState(null) + return ( + <> + { + setFilterMenuAnchorEl(e.currentTarget) + }} + > + + + { + setFilterMenuAnchorEl(null) + }} + > + {filterChoices.map((choice) => ( + { + const skippedValues = header.column.getFilterValue() as string[] + const isSkipped = skippedValues.includes(choice) + const newSkippedValues = isSkipped + ? skippedValues.filter((v) => v !== choice) + : skippedValues.concat(choice) + header.column.setFilterValue(newSkippedValues) + }} + > + + {header.column.getFilterValue() !== undefined ? ( + (header.column.getFilterValue() as string[]).includes( + choice + ) ? ( + + ) : ( + + ) + ) : null} + + {choice ?? "(missing value)"} + + ))} + + + ) +} + function DataGrid(props: { data: T[] columns: ColumnDef[] @@ -78,8 +134,6 @@ function DataGrid(props: { const [columnFilters, setColumnFilters] = React.useState( [] ) - const [filterMenuAnchorEl, setFilterMenuAnchorEl] = - React.useState(null) const [pagination, setPagination] = React.useState({ pageIndex: 0, pageSize: 50, @@ -154,57 +208,10 @@ function DataGrid(props: { ) )} {filterChoices !== null ? ( - <> - { - setFilterMenuAnchorEl(e.currentTarget) - }} - > - - - { - setFilterMenuAnchorEl(null) - }} - > - {filterChoices.map((choice) => ( - { - const skippedValues = - header.column.getFilterValue() as string[] - const isSkipped = - skippedValues.includes(choice) - const newSkippedValues = isSkipped - ? skippedValues.filter( - (v) => v !== choice - ) - : skippedValues.concat(choice) - header.column.setFilterValue( - newSkippedValues - ) - }} - > - - {header.column.getFilterValue() !== - undefined ? ( - ( - header.column.getFilterValue() as string[] - ).includes(choice) ? ( - - ) : ( - - ) - ) : null} - - {choice ?? "(missing value)"} - - ))} - - + ) : null} )}