diff --git a/optuna_dashboard/ts/components/DataGrid.tsx b/optuna_dashboard/ts/components/DataGrid.tsx index 24e45dc7..32cbf5f9 100644 --- a/optuna_dashboard/ts/components/DataGrid.tsx +++ b/optuna_dashboard/ts/components/DataGrid.tsx @@ -119,7 +119,7 @@ function DataGrid(props: { }) // Sorting - const createSortHandler = (columnId: number) => () => { + const createSortHandler = (columnId: number) => { const isAsc = orderBy === columnId && order === "asc" setOrder(isAsc ? "desc" : "asc") setOrderBy(columnId) @@ -135,20 +135,6 @@ function DataGrid(props: { const RootDiv = styled("div")({ width: "100%", }) - const HiddenSpan = styled("span")({ - border: 0, - clip: "rect(0 0 0 0)", - height: 1, - margin: -1, - overflow: "hidden", - padding: 0, - position: "absolute", - top: 20, - width: 1, - }) - const TableHeaderCellSpan = styled("span")({ - display: "inline-flex", - }) return ( @@ -161,48 +147,16 @@ function DataGrid(props: { {collapseBody ? : null} {columns.map((column, columnIdx) => ( - - - {column.sortable ? ( - - {column.label} - {orderBy === column.field ? ( - - {order === "desc" - ? "sorted descending" - : "sorted ascending"} - - ) : null} - - ) : ( - column.label - )} - {column.filterable ? ( - { - clearFilter(columnIdx) - }} - > - - - ) : null} - - + + key={column.label} + createSortHandler={createSortHandler} + column={column} + columnIdx={columnIdx} + orderBy={orderBy} + order={order} + clearFilter={clearFilter} + filtered={fieldAlreadyFiltered(columnIdx)} + /> ))} @@ -239,6 +193,82 @@ function DataGrid(props: { ) } +function DataGridHeaderColumn(props: { + column: DataGridColumn + columnIdx: number + orderBy: number + order: Order + dense?: boolean + createSortHandler: (columnIdx: number) => void + clearFilter: (columnIdx: number) => void + filtered: boolean +}) { + const { + column, + columnIdx, + dense, + orderBy, + order, + createSortHandler, + clearFilter, + filtered, + } = props + + const HiddenSpan = styled("span")({ + border: 0, + clip: "rect(0 0 0 0)", + height: 1, + margin: -1, + overflow: "hidden", + padding: 0, + position: "absolute", + top: 20, + width: 1, + }) + const TableHeaderCellSpan = styled("span")({ + display: "inline-flex", + }) + return ( + + + {column.sortable ? ( + { + createSortHandler(columnIdx) + }} + > + {column.label} + {orderBy === column.field ? ( + + {order === "desc" ? "sorted descending" : "sorted ascending"} + + ) : null} + + ) : ( + column.label + )} + {column.filterable ? ( + { + clearFilter(columnIdx) + }} + > + + + ) : null} + + + ) +} + function DataGridRow(props: { columns: DataGridColumn[] rowIndex: number