diff --git a/.github/workflows/jupyterlab-tests.yml b/.github/workflows/jupyterlab-tests.yml new file mode 100644 index 000000000..018733297 --- /dev/null +++ b/.github/workflows/jupyterlab-tests.yml @@ -0,0 +1,66 @@ +name: tests +on: + pull_request: + branches: + - main + paths: + - '.github/workflows/jupyterlab-tests.yml' + - '**.py' + - '**.ts' + - '**.tsx' + - 'optuna_dashboard/package.json' + - 'optuna_dashboard/package-lock.json' + - 'tslib/react/package.json' + - 'tslib/react/package-lock.json' + - 'tslib/storage/package.json' + - 'tslib/storage/package-lock.json' + - 'jupyterlab/pyproject.toml' + - 'jupyterlab/package.json' + - 'jupyterlab/yarn.lock' +jobs: + test-build: + name: Test build for JupyterLab extension + runs-on: ubuntu-latest + + steps: + - name: Check out code + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.11' + architecture: x64 + + - name: Install dependencies + run: | + python -m pip install --progress-bar off --upgrade pip setuptools build + pip install --progress-bar off jupyterlab + pip install --progress-bar off . + + - name: Set up Node + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + + - run: make tslib + + - name: Build JavaScript dependencies + working-directory: optuna_dashboard + run: | + npm install + npm run build:pkg + + # Without a following step, it will be failed to build the jupyter lab extension by the below error + # Type Error Cannot read properties of undefined (reading .../jupyterlab/.pnp.cjs) + - name: Mysterious hack to fix the build error + working-directory: jupyterlab + run: yarn install + + - name: Build package + working-directory: jupyterlab + env: + YARN_ENABLE_IMMUTABLE_INSTALLS: false + run: python -m build --sdist + diff --git a/.github/workflows/python-tests.yml b/.github/workflows/python-tests.yml index 7d1d5a5af..bc0fc9afc 100644 --- a/.github/workflows/python-tests.yml +++ b/.github/workflows/python-tests.yml @@ -106,49 +106,4 @@ jobs: - name: Run python unit tests run: | pytest python_tests - test-build: - name: Test build for JupyterLab extension - runs-on: ubuntu-latest - - steps: - - name: Check out code - uses: actions/checkout@v4 - - - name: Set up Python - uses: actions/setup-python@v4 - with: - python-version: '3.11' - architecture: x64 - - - name: Install dependencies - run: | - python -m pip install --progress-bar off --upgrade pip setuptools build - pip install --progress-bar off jupyterlab - pip install --progress-bar off . - - - name: Set up Node - uses: actions/setup-node@v4 - with: - node-version: '20' - cache: 'npm' - - - run: make tslib - - - name: Build JavaScript dependencies - working-directory: optuna_dashboard - run: | - npm install - npm run build:pkg - - # Without a following step, it will be failed to build the jupyter lab extension by the below error - # Type Error Cannot read properties of undefined (reading .../jupyterlab/.pnp.cjs) - - name: Mysterious hack to fix the build error - working-directory: jupyterlab - run: yarn install - - - name: Build package - working-directory: jupyterlab - env: - YARN_ENABLE_IMMUTABLE_INSTALLS: false - run: python -m build --sdist diff --git a/.github/workflows/typescript-tests.yml b/.github/workflows/typescript-tests.yml index 88f186c58..d382e568b 100644 --- a/.github/workflows/typescript-tests.yml +++ b/.github/workflows/typescript-tests.yml @@ -11,6 +11,8 @@ on: - 'optuna_dashboard/package-lock.json' - 'vscode/package.json' - 'vscode/package-lock.json' + - 'standalone_app/package.json' + - 'standalone_app/package-lock.json' - 'tslib/react/package.json' - 'tslib/react/package-lock.json' - 'tslib/storage/package.json' diff --git a/jupyterlab/src/components/JupyterLabEntrypoint.tsx b/jupyterlab/src/components/JupyterLabEntrypoint.tsx index fdd5fb84a..769d58ac9 100644 --- a/jupyterlab/src/components/JupyterLabEntrypoint.tsx +++ b/jupyterlab/src/components/JupyterLabEntrypoint.tsx @@ -5,16 +5,29 @@ import { Button, CssBaseline, FormControl, + ThemeProvider, Typography, + createTheme, + useMediaQuery, + useTheme, } from "@mui/material" import CircularProgress from "@mui/material/CircularProgress" +import blue from "@mui/material/colors/blue" +import pink from "@mui/material/colors/pink" import { APIClientProvider, App, ConstantsContext, } from "@optuna/optuna-dashboard" import { SnackbarProvider, enqueueSnackbar } from "notistack" -import React, { Dispatch, FC, SetStateAction, useEffect, useState } from "react" +import React, { + Dispatch, + FC, + SetStateAction, + useEffect, + useState, + useMemo, +} from "react" import { JupyterlabAPIClient } from "../apiClient" import { requestAPI } from "../handler" import { DebouncedInputTextField } from "./Debounce" @@ -25,13 +38,26 @@ export const JupyterLabEntrypoint: FC = () => { const [ready, setReady] = useState(false) const [pathName, setPathName] = useState("") + const prefersDarkMode = useMediaQuery("(prefers-color-scheme: dark)") + const colorMode = prefersDarkMode ? "dark" : "light" + const theme = useMemo( + () => + createTheme({ + palette: { + mode: colorMode, + primary: blue, + secondary: pink, + }, + }), + [colorMode] + ) useEffect(() => { setPathName(window.location.pathname) }, []) if (!ready) { return ( - <> + { flexDirection: "column", justifyContent: "center", alignItems: "center", + backgroundColor: theme.palette.background.default, }} > { /> - + ) } return ( @@ -160,6 +187,8 @@ const StartDashboardForm: FC<{ showOptunaDashboard: () => void setLoading: Dispatch> }> = ({ showOptunaDashboard, setLoading }) => { + const theme = useTheme() + const isDarkMode = theme.palette.mode === "dark" const [storageURL, setStorageURL] = useState("") const [artifactPath, setArtifactPath] = useState("") const [isValidURL, setIsValidURL] = useState(false) @@ -204,7 +233,9 @@ const StartDashboardForm: FC<{ flexDirection: "column", width: "600px", borderRadius: "8px", - boxShadow: "rgba(0, 0, 0, 0.08) 0 8px 24px", + boxShadow: isDarkMode + ? "rgba(255, 255, 255, 0.08) 0 8px 24px" + : "rgba(0, 0, 0, 0.08) 0 8px 24px", padding: "64px", }} >