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}
+
+
+ )
+}