import React, { FC, useEffect } from "react" import { useRecoilValue } from "recoil" import { Link } from "react-router-dom" import { createStyles, makeStyles, Theme } from "@material-ui/core/styles" import { AppBar, Toolbar, Typography, Container, Card, Grid, Box, Button, IconButton, Dialog, DialogTitle, DialogContent, DialogContentText, TextField, DialogActions, FormControlLabel, Checkbox, Menu, MenuItem, FormControl, FormLabel, Select, } from "@material-ui/core" import { Add, AddBox, Delete, Refresh, Remove } from "@material-ui/icons" import { actionCreator } from "../action" import { DataGrid, DataGridColumn } from "./DataGrid" import { studySummariesState } from "../state" const useStyles = makeStyles((theme: Theme) => createStyles({ card: { margin: theme.spacing(2), }, grow: { flexGrow: 1, }, objectiveButton: { marginRight: theme.spacing(1), }, }) ) export const StudyList: FC = () => { const classes = useStyles() const [ newStudySelectionAnchorEl, setNewStudySelectionAnchorEl, ] = React.useState(null) const openNewStudySelection = Boolean(newStudySelectionAnchorEl) const [ openNewSingleObjectiveStudyDialog, setOpenNewSingleObjectiveStudyDialog, ] = React.useState(false) const [ openNewMultiObjectiveStudyDialog, setOpenNewMultiObjectiveStudyDialog, ] = React.useState(false) const [openDeleteStudyDialog, setOpenDeleteStudyDialog] = React.useState( false ) const [deleteStudyID, setDeleteStudyID] = React.useState(-1) const [newStudyName, setNewStudyName] = React.useState("") const [maximize, setMaximize] = React.useState(false) const [directions, setDirections] = React.useState([ "minimize", ]) const action = actionCreator() const studies = useRecoilValue(studySummariesState) const newStudyNameAlreadyUsed = studies.some( (v) => v.study_name === newStudyName ) useEffect(() => { action.updateStudySummaries() }, []) const columns: DataGridColumn[] = [ { field: "study_id", label: "Study ID", sortable: true, }, { field: "study_name", label: "Name", sortable: true, toCellValue: (i) => ( {studies[i].study_name} ), }, { field: "directions", label: "Direction", sortable: false, toCellValue: (i) => studies[i].directions.join(), }, { field: "best_trial", label: "Best value", sortable: false, toCellValue: (i) => { if (studies[i].directions.length !== 1) { return "-" // Multi-objective study does not hold best_trial attribute. } return studies[i].best_trial?.values?.[0] || null }, }, { field: "study_name", label: "", sortable: false, padding: "none", toCellValue: (i) => ( { setDeleteStudyID(studies[i].study_id) setOpenDeleteStudyDialog(true) }} > ), }, ] const collapseAttrColumns: DataGridColumn[] = [ { field: "key", label: "Key", sortable: true }, { field: "value", label: "Value", sortable: true }, ] const handleCloseNewSingleObjectiveStudyDialog = () => { setNewStudyName("") setOpenNewSingleObjectiveStudyDialog(false) } const handleCreateNewSingleObjectiveStudy = () => { const direction = maximize ? "maximize" : "minimize" action.createNewStudy(newStudyName, [direction]) setOpenNewSingleObjectiveStudyDialog(false) setNewStudyName("") } const handleCloseNewMultiObjectiveStudyDialog = () => { setOpenNewMultiObjectiveStudyDialog(false) setNewStudyName("") setDirections(["minimize"]) } const handleCreateNewMultiObjectiveStudy = () => { action.createNewStudy(newStudyName, directions) setOpenNewMultiObjectiveStudyDialog(false) setNewStudyName("") setDirections(["minimize"]) } const handleCloseDeleteStudyDialog = () => { setOpenDeleteStudyDialog(false) setDeleteStudyID(-1) } const handleDeleteStudy = () => { action.deleteStudy(deleteStudyID) setOpenDeleteStudyDialog(false) setDeleteStudyID(-1) } const collapseBody = (index: number) => { return ( Study user attributes columns={collapseAttrColumns} rows={studies[index].user_attrs} keyField={"key"} dense={true} initialRowsPerPage={5} rowsPerPageOption={[5, 10, { label: "All", value: -1 }]} /> Study system attributes columns={collapseAttrColumns} rows={studies[index].system_attrs} keyField={"key"} dense={true} initialRowsPerPage={5} rowsPerPageOption={[5, 10, { label: "All", value: -1 }]} /> ) } return (
{APP_BAR_TITLE}
{ action.updateStudySummaries("Success to reload") }} color="inherit" > { setNewStudySelectionAnchorEl(e.currentTarget) }} color="inherit" > { setNewStudySelectionAnchorEl(null) }} > { setNewStudySelectionAnchorEl(null) setOpenNewSingleObjectiveStudyDialog(true) }} > Single-objective { setNewStudySelectionAnchorEl(null) setOpenNewMultiObjectiveStudyDialog(true) }} > Multi-objective columns={columns} rows={studies} keyField={"study_id"} collapseBody={collapseBody} initialRowsPerPage={-1} rowsPerPageOption={[5, 10, { label: "All", value: -1 }]} /> { handleCloseNewSingleObjectiveStudyDialog() }} aria-labelledby="create-single-objective-study-form-dialog-title" > New single-objective study To create a new study, please enter the study name here. { setNewStudyName(e.target.value) }} fullWidth /> { setMaximize(!maximize) }} color="primary" /> } label="Set maximize direction (default: minimize)" /> { handleCloseNewMultiObjectiveStudyDialog() }} aria-labelledby="create-multi-objective-study-form-dialog-title" > New multi-objective study To create a new study, please enter the study name and directions here. { setNewStudyName(e.target.value) }} fullWidth /> {directions.map((d, i) => ( Objective {i}: ))} { handleCloseDeleteStudyDialog() }} aria-labelledby="delete-study-dialog-title" > Delete study Are you sure you want to delete a study (id={deleteStudyID})?
) }