From dcabe98d3dff15ccc56fd5bd0cbc64ed0bc2a6c6 Mon Sep 17 00:00:00 2001 From: c-bata Date: Thu, 16 Nov 2023 10:08:18 +0900 Subject: [PATCH] Add refactor changes on DataGrid --- optuna_dashboard/ts/components/DataGrid.tsx | 62 +++++++++------------ 1 file changed, 25 insertions(+), 37 deletions(-) diff --git a/optuna_dashboard/ts/components/DataGrid.tsx b/optuna_dashboard/ts/components/DataGrid.tsx index 32cbf5f9..41ecc4e4 100644 --- a/optuna_dashboard/ts/components/DataGrid.tsx +++ b/optuna_dashboard/ts/components/DataGrid.tsx @@ -92,10 +92,6 @@ function DataGrid(props: { setFilters(newFilters) } - const clearFilter = (columnIdx: number): void => { - setFilters(filters.filter((f) => f.columnIdx !== columnIdx)) - } - const filteredRows = rows.filter((row, rowIdx) => { if (defaultFilter !== undefined && defaultFilter(row)) { return false @@ -119,11 +115,6 @@ function DataGrid(props: { }) // Sorting - const createSortHandler = (columnId: number) => { - const isAsc = orderBy === columnId && order === "asc" - setOrder(isAsc ? "desc" : "asc") - setOrderBy(columnId) - } const sortedRows = stableSort(filteredRows, order, orderBy, columns) const currentPageRows = rowsPerPage > 0 @@ -149,12 +140,15 @@ function DataGrid(props: { {columns.map((column, columnIdx) => ( key={column.label} - createSortHandler={createSortHandler} column={column} - columnIdx={columnIdx} - orderBy={orderBy} - order={order} - clearFilter={clearFilter} + orderBy={orderBy === columnIdx ? order : null} + onOrderByChange={(direction: Order) => { + setOrder(direction) + setOrderBy(columnIdx) + }} + onFilterClear={() => { + setFilters(filters.filter((f) => f.columnIdx !== columnIdx)) + }} filtered={fieldAlreadyFiltered(columnIdx)} /> ))} @@ -195,24 +189,14 @@ function DataGrid(props: { function DataGridHeaderColumn(props: { column: DataGridColumn - columnIdx: number - orderBy: number - order: Order - dense?: boolean - createSortHandler: (columnIdx: number) => void - clearFilter: (columnIdx: number) => void + orderBy: Order | null + onOrderByChange: (direction: Order) => void filtered: boolean + onFilterClear: () => void + dense?: boolean }) { - const { - column, - columnIdx, - dense, - orderBy, - order, - createSortHandler, - clearFilter, - filtered, - } = props + const { column, orderBy, onOrderByChange, filtered, onFilterClear, dense } = + props const HiddenSpan = styled("span")({ border: 0, @@ -231,21 +215,25 @@ function DataGridHeaderColumn(props: { return ( {column.sortable ? ( { - createSortHandler(columnIdx) + if (orderBy === null) { + onOrderByChange("asc") + } else { + onOrderByChange(orderBy === "desc" ? "asc" : "desc") + } }} > {column.label} - {orderBy === column.field ? ( + {orderBy !== null ? ( - {order === "desc" ? "sorted descending" : "sorted ascending"} + {orderBy === "desc" ? "sorted descending" : "sorted ascending"} ) : null} @@ -258,7 +246,7 @@ function DataGridHeaderColumn(props: { style={filtered ? {} : { visibility: "hidden" }} color="inherit" onClick={() => { - clearFilter(columnIdx) + onFilterClear() }} >