diff --git a/optuna_dashboard/ts/components/StudyDetail.tsx b/optuna_dashboard/ts/components/StudyDetail.tsx
index 652400fe..ce214fd9 100644
--- a/optuna_dashboard/ts/components/StudyDetail.tsx
+++ b/optuna_dashboard/ts/components/StudyDetail.tsx
@@ -1,6 +1,7 @@
import ChevronRightIcon from "@mui/icons-material/ChevronRight"
import DownloadIcon from "@mui/icons-material/Download"
import HomeIcon from "@mui/icons-material/Home"
+import LinkIcon from "@mui/icons-material/Link"
import {
Box,
Button,
@@ -183,6 +184,19 @@ export const StudyDetail: FC<{
} else if (page === "trialList") {
content =
} else if (page === "trialTable" && study !== null) {
+ const detailButtonGenerator = (studyId: number, trialNumber: number) => {
+ return (
+
+
+
+ )
+ }
content = (
-
+
}
diff --git a/tslib/react/src/components/TrialTable.tsx b/tslib/react/src/components/TrialTable.tsx
index 737dd397..b1406bc9 100644
--- a/tslib/react/src/components/TrialTable.tsx
+++ b/tslib/react/src/components/TrialTable.tsx
@@ -22,7 +22,8 @@ const multiValueFilter: FilterFn = (
export const TrialTable: FC<{
study: Optuna.Study
initialRowsPerPage?: number
-}> = ({ study, initialRowsPerPage }) => {
+ detailButtonGenerator?: (studyId: number, trialNumber: number) => JSX.Element
+}> = ({ study, initialRowsPerPage, detailButtonGenerator }) => {
const trials: Optuna.Trial[] = study.trials
const metricNames: string[] = study.metric_names || []
@@ -125,6 +126,20 @@ export const TrialTable: FC<{
)
}
}
+ if (detailButtonGenerator) {
+ columns.push(
+ columnHelper.accessor((row) => row, {
+ header: "Detail",
+ cell: (info) =>
+ detailButtonGenerator(
+ info.getValue().study_id,
+ info.getValue().number
+ ),
+ enableSorting: false,
+ enableColumnFilter: false,
+ })
+ )
+ }
return (