From 6b2f994cafa4d98aedaa368659633b8d8cebb277 Mon Sep 17 00:00:00 2001 From: c-bata Date: Fri, 30 Dec 2022 15:56:28 +0900 Subject: [PATCH] Add mini drawer --- .../ts/components/StudyDetailBeta.tsx | 229 +------------- .../ts/components/StudyDetailDrawer.tsx | 298 ++++++++++++++++++ 2 files changed, 305 insertions(+), 222 deletions(-) create mode 100644 optuna_dashboard/ts/components/StudyDetailDrawer.tsx diff --git a/optuna_dashboard/ts/components/StudyDetailBeta.tsx b/optuna_dashboard/ts/components/StudyDetailBeta.tsx index de46204c..83afdbd2 100644 --- a/optuna_dashboard/ts/components/StudyDetailBeta.tsx +++ b/optuna_dashboard/ts/components/StudyDetailBeta.tsx @@ -4,9 +4,7 @@ import { Link, useParams } from "react-router-dom" import MuiDrawer from "@mui/material/Drawer" import IconButton from "@mui/material/IconButton" import ChevronLeftIcon from "@mui/icons-material/ChevronLeft" -import ClearIcon from "@mui/icons-material/Clear" import Divider from "@mui/material/Divider" -import MenuIcon from "@mui/icons-material/Menu" import List from "@mui/material/List" import ListItem from "@mui/material/ListItem" import ListItemButton from "@mui/material/ListItemButton" @@ -22,21 +20,16 @@ import { Theme, CSSObject, styled, + Typography, + Toolbar, } from "@mui/material" -import AutoGraphIcon from "@mui/icons-material/AutoGraph" -import SyncIcon from "@mui/icons-material/Sync" -import SyncDisabledIcon from "@mui/icons-material/SyncDisabled" -import HomeIcon from "@mui/icons-material/Home" -import Brightness4Icon from "@mui/icons-material/Brightness4" -import Brightness7Icon from "@mui/icons-material/Brightness7" -import TableViewIcon from "@mui/icons-material/TableView" -import RateReviewIcon from "@mui/icons-material/RateReview" import { GraphHistory } from "./GraphHistory" import { Note } from "./Note" import { actionCreator } from "../action" import { reloadIntervalState, studyDetailsState } from "../state" import { TrialTable } from "./TrialTable" +import { StudyDetailDrawer } from "./StudyDetailDrawer" interface ParamTypes { studyId: string @@ -131,219 +124,11 @@ export const StudyDetailBeta: FC<{ - {content} + toggleColorMode={toggleColorMode} + > + {content} + ) } - -const StudyDetailDrawer: FC<{ - studyId: number - toggleColorMode: () => void - page: PageId -}> = ({ studyId, toggleColorMode, page }) => { - const theme = useTheme() - const [open, setOpen] = React.useState(false) - const drawerWidth = 240 - const [reloadInterval, updateReloadInterval] = - useRecoilState(reloadIntervalState) - - const openedMixin = (theme: Theme): CSSObject => ({ - width: drawerWidth, - transition: theme.transitions.create("width", { - easing: theme.transitions.easing.sharp, - duration: theme.transitions.duration.enteringScreen, - }), - overflowX: "hidden", - }) - const closedMixin = (theme: Theme): CSSObject => ({ - transition: theme.transitions.create("width", { - easing: theme.transitions.easing.sharp, - duration: theme.transitions.duration.leavingScreen, - }), - overflowX: "hidden", - width: `calc(${theme.spacing(7)} + 1px)`, - [theme.breakpoints.up("sm")]: { - width: `calc(${theme.spacing(8)} + 1px)`, - }, - }) - const DrawerHeader = styled("div")(({ theme }) => ({ - display: "flex", - alignItems: "center", - justifyContent: "flex-end", - padding: theme.spacing(0, 1), - // necessary for content to be below app bar - ...theme.mixins.toolbar, - })) - - const Drawer = styled(MuiDrawer, { - shouldForwardProp: (prop) => prop !== "open", - })(({ theme, open }) => ({ - width: drawerWidth, - flexShrink: 0, - whiteSpace: "nowrap", - boxSizing: "border-box", - ...(open && { - ...openedMixin(theme), - "& .MuiDrawer-paper": openedMixin(theme), - }), - ...(!open && { - ...closedMixin(theme), - "& .MuiDrawer-paper": closedMixin(theme), - }), - })) - - const styleListItem = { - display: "block", - } - const styleListItemButton = { - minHeight: 48, - justifyContent: open ? "initial" : "center", - px: 2.5, - } - const styleListItemIcon = { - minWidth: 0, - mr: open ? 3 : "auto", - justifyContent: "center", - } - const styleListItemText = { - opacity: open ? 1 : 0, - } - const styleSwitch = { - display: open ? "inherit" : "none", - } - - return ( - - - { - setOpen(!open) - }} - > - {open ? : } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { - updateReloadInterval(reloadInterval === -1 ? 10 : -1) - }} - > - - {reloadInterval === -1 ? : } - - - - - - - { - toggleColorMode() - }} - > - - {theme.palette.mode === "dark" ? ( - - ) : ( - - )} - - - - - - - - - - - - - - - - - ) -} diff --git a/optuna_dashboard/ts/components/StudyDetailDrawer.tsx b/optuna_dashboard/ts/components/StudyDetailDrawer.tsx new file mode 100644 index 00000000..51566170 --- /dev/null +++ b/optuna_dashboard/ts/components/StudyDetailDrawer.tsx @@ -0,0 +1,298 @@ +import React, { FC } from "react" +import { useRecoilState } from "recoil" +import { styled, useTheme, Theme, CSSObject } from "@mui/material/styles" +import Box from "@mui/material/Box" +import MuiDrawer from "@mui/material/Drawer" +import MuiAppBar, { AppBarProps as MuiAppBarProps } from "@mui/material/AppBar" +import Toolbar from "@mui/material/Toolbar" +import List from "@mui/material/List" +import Typography from "@mui/material/Typography" +import Divider from "@mui/material/Divider" +import IconButton from "@mui/material/IconButton" +import ChevronLeftIcon from "@mui/icons-material/ChevronLeft" +import ChevronRightIcon from "@mui/icons-material/ChevronRight" +import ListItem from "@mui/material/ListItem" +import ListItemButton from "@mui/material/ListItemButton" +import ListItemIcon from "@mui/material/ListItemIcon" +import ListItemText from "@mui/material/ListItemText" +import { reloadIntervalState } from "../state" +import { Link } from "react-router-dom" +import AutoGraphIcon from "@mui/icons-material/AutoGraph" +import SyncIcon from "@mui/icons-material/Sync" +import SyncDisabledIcon from "@mui/icons-material/SyncDisabled" +import HomeIcon from "@mui/icons-material/Home" +import Brightness4Icon from "@mui/icons-material/Brightness4" +import Brightness7Icon from "@mui/icons-material/Brightness7" +import TableViewIcon from "@mui/icons-material/TableView" +import RateReviewIcon from "@mui/icons-material/RateReview" +import ClearIcon from "@mui/icons-material/Clear" +import MenuIcon from "@mui/icons-material/Menu" +import { Switch } from "@mui/material" + +const drawerWidth = 240 + +const openedMixin = (theme: Theme): CSSObject => ({ + width: drawerWidth, + transition: theme.transitions.create("width", { + easing: theme.transitions.easing.sharp, + duration: theme.transitions.duration.enteringScreen, + }), + overflowX: "hidden", +}) + +const closedMixin = (theme: Theme): CSSObject => ({ + transition: theme.transitions.create("width", { + easing: theme.transitions.easing.sharp, + duration: theme.transitions.duration.leavingScreen, + }), + overflowX: "hidden", + width: `calc(${theme.spacing(7)} + 1px)`, + [theme.breakpoints.up("sm")]: { + width: `calc(${theme.spacing(8)} + 1px)`, + }, +}) + +const DrawerHeader = styled("div")(({ theme }) => ({ + display: "flex", + alignItems: "center", + justifyContent: "flex-end", + padding: theme.spacing(0, 1), + // necessary for content to be below app bar + ...theme.mixins.toolbar, +})) + +interface AppBarProps extends MuiAppBarProps { + open?: boolean +} + +const AppBar = styled(MuiAppBar, { + shouldForwardProp: (prop) => prop !== "open", +})(({ theme, open }) => ({ + zIndex: theme.zIndex.drawer + 1, + transition: theme.transitions.create(["width", "margin"], { + easing: theme.transitions.easing.sharp, + duration: theme.transitions.duration.leavingScreen, + }), + ...(open && { + marginLeft: drawerWidth, + width: `calc(100% - ${drawerWidth}px)`, + transition: theme.transitions.create(["width", "margin"], { + easing: theme.transitions.easing.sharp, + duration: theme.transitions.duration.enteringScreen, + }), + }), +})) + +const Drawer = styled(MuiDrawer, { + shouldForwardProp: (prop) => prop !== "open", +})(({ theme, open }) => ({ + width: drawerWidth, + flexShrink: 0, + whiteSpace: "nowrap", + boxSizing: "border-box", + ...(open && { + ...openedMixin(theme), + "& .MuiDrawer-paper": openedMixin(theme), + }), + ...(!open && { + ...closedMixin(theme), + "& .MuiDrawer-paper": closedMixin(theme), + }), +})) + +export const StudyDetailDrawer: FC<{ + studyId: number + toggleColorMode: () => void + page: "top" | "trials" | "note" + children?: React.ReactNode +}> = ({ studyId, toggleColorMode, page, children }) => { + const theme = useTheme() + const [open, setOpen] = React.useState(false) + const [reloadInterval, updateReloadInterval] = + useRecoilState(reloadIntervalState) + + const styleListItem = { + display: "block", + } + const styleListItemButton = { + minHeight: 48, + justifyContent: open ? "initial" : "center", + px: 2.5, + } + const styleListItemIcon = { + minWidth: 0, + mr: open ? 3 : "auto", + justifyContent: "center", + } + const styleListItemText = { + opacity: open ? 1 : 0, + } + const styleSwitch = { + display: open ? "inherit" : "none", + } + + const handleDrawerOpen = () => { + setOpen(true) + } + + const handleDrawerClose = () => { + setOpen(false) + } + + return ( + + + + + + + + Mini variant drawer + + + + + + + {theme.direction === "rtl" ? ( + + ) : ( + + )} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { + updateReloadInterval(reloadInterval === -1 ? 10 : -1) + }} + > + + {reloadInterval === -1 ? : } + + + + + + + { + toggleColorMode() + }} + > + + {theme.palette.mode === "dark" ? ( + + ) : ( + + )} + + + + + + + + + + + + + + + + + + + {children || null} + + + ) +}