From e7ea5d17aa198f756c2216f875ad76b172eb7442 Mon Sep 17 00:00:00 2001 From: nabenabe0928 Date: Thu, 21 Dec 2023 09:19:51 +0100 Subject: [PATCH] Enable users to jump arbitrary page numbers from text field --- optuna_dashboard/ts/components/DataGrid.tsx | 66 ++++++++++++++++++--- 1 file changed, 57 insertions(+), 9 deletions(-) diff --git a/optuna_dashboard/ts/components/DataGrid.tsx b/optuna_dashboard/ts/components/DataGrid.tsx index adf64e77..626440a7 100644 --- a/optuna_dashboard/ts/components/DataGrid.tsx +++ b/optuna_dashboard/ts/components/DataGrid.tsx @@ -8,10 +8,13 @@ import { TablePagination, TableRow, TableSortLabel, + TextField, Collapse, IconButton, Menu, MenuItem, + Button, + Box, } from "@mui/material" import { styled } from "@mui/system" import KeyboardArrowDownIcon from "@mui/icons-material/KeyboardArrowDown" @@ -43,6 +46,40 @@ interface RowFilter { values: Value[] } +function PaginationTextFieldComponent(props: { + onInputChange: (value: number) => void + maxPageNumber: number +}): React.ReactElement { + // This component is separated from DataGrid to prevent it from updating, + // every time any letters are input. + const { onInputChange, maxPageNumber } = props + const [navigationPage, setNavigationPage] = React.useState("") + + const handleSubmitPageNumber = (event: React.FormEvent) => { + event.preventDefault() + const newPage = parseInt(navigationPage, 10) + setNavigationPage("") // reset the input field + if (Number.isNaN(newPage)) { + return + } + const newPageNumber = newPage <= 0 ? 1 : Math.min(newPage, maxPageNumber) + // 0-indexed. + onInputChange(newPageNumber - 1) + } + + return ( +
+ { + setNavigationPage(e.target.value) + }} + /> + + ) +} + function DataGrid(props: { columns: DataGridColumn[] rows: T[] @@ -119,6 +156,7 @@ function DataGrid(props: { const RootDiv = styled("div")({ width: "100%", }) + const maxPageNumber = Math.ceil(filteredRows.length / rowsPerPage) return ( @@ -177,15 +215,25 @@ function DataGrid(props: { - + {filteredRows.length > 0 ? ( + + + {maxPageNumber > 4 ? ( + setPage(page)} + maxPageNumber={Math.ceil(filteredRows.length / rowsPerPage)} + /> + ) : null} + + ) : null} ) }