diff --git a/optuna_dashboard/ts/components/StudyList.tsx b/optuna_dashboard/ts/components/StudyList.tsx index 108e3abc..fee9de4b 100644 --- a/optuna_dashboard/ts/components/StudyList.tsx +++ b/optuna_dashboard/ts/components/StudyList.tsx @@ -1,4 +1,5 @@ -import React, { FC, useEffect, useState } from "react" +import React, { FC, useEffect, useMemo, useState } from "react" +import { useNavigate, useLocation } from "react-router-dom" import { useRecoilValue } from "recoil" import { Link } from "react-router-dom" import { @@ -56,10 +57,20 @@ export const StudyList: FC<{ useDeleteStudyDialog() const [openRenameStudyDialog, renderRenameStudyDialog] = useRenameStudyDialog(studies) - const [sortBy, setSortBy] = useState<"id-asc" | "id-desc">("id-asc") + + const navigate = useNavigate() + const useQuery = (): URLSearchParams => { + const { search } = useLocation() + return useMemo(() => new URLSearchParams(search), [search]) + } + const query = useQuery() + const initialSortBy = + query.get("studies_order_by") === "desc" ? "desc" : "asc" + const [sortBy, setSortBy] = useState<"asc" | "desc">(initialSortBy) let filteredStudies = studies.filter((s) => !studyFilter(s)) - if (sortBy === "id-desc") { + + if (sortBy === "desc") { filteredStudies = filteredStudies.reverse() } @@ -67,6 +78,13 @@ export const StudyList: FC<{ action.updateStudySummaries() }, []) + useEffect(() => { + query.set("studies_order_by", sortBy) + navigate(`${location.pathname}?${query.toString()}`, { + replace: true, + }) + }, [sortBy]) + const Select = styled(TextField)(({ theme }) => ({ "& .MuiInputBase-input": { // vertical padding + font size from searchIcon @@ -98,11 +116,11 @@ export const StudyList: FC<{ select value={sortBy} onChange={(e) => { - setSortBy(e.target.value as "id-asc" | "id-desc") + setSortBy(e.target.value as "asc" | "desc") }} > - Sort ascending - Sort descending + Sort ascending + Sort descending )