From eef88eb91fce6618f80ca5d4254d4c1c55a61db2 Mon Sep 17 00:00:00 2001 From: tombch Date: Fri, 13 Mar 2026 19:31:16 +0100 Subject: [PATCH 1/7] initial functionality --- .../components/SearchPage/SearchFullUI.tsx | 46 +++++++++++++++++++ .../SearchPage/useSearchPageState.ts | 2 + 2 files changed, 48 insertions(+) diff --git a/website/src/components/SearchPage/SearchFullUI.tsx b/website/src/components/SearchPage/SearchFullUI.tsx index 32643636cd..5a6853ce32 100644 --- a/website/src/components/SearchPage/SearchFullUI.tsx +++ b/website/src/components/SearchPage/SearchFullUI.tsx @@ -89,6 +89,7 @@ export const InnerSearchFullUI = ({ const { state, + setState, previewedSeqId, setPreviewedSeqId, previewHalfScreen, @@ -106,6 +107,43 @@ export const InnerSearchFullUI = ({ setAColumnVisibility, } = useSearchPageState({ initialQueryDict, schema, hiddenFieldValues, filterSchema, referenceGenomesInfo }); + // Update sessionQuery whenever state changes + const sessionQueryKey = `${organism}QueryState`; + useEffect(() => { + if (typeof sessionStorage === 'undefined') return; + + if (Object.keys(state).length > 0) { + sessionStorage.setItem(sessionQueryKey, JSON.stringify(state)); + } else { + sessionStorage.removeItem(sessionQueryKey); + } + }, [state]); + + const sessionQuery: QueryState | null = useMemo(() => { + if (typeof sessionStorage === 'undefined') return null; + + const sessionQueryValue = sessionStorage.getItem(sessionQueryKey); + console.log('Restoring session query from sessionStorage:', sessionQueryValue); + if (sessionQueryValue) { + try { + return JSON.parse(sessionQueryValue); + } catch {} + } + return null; + }, []); + const isSessionQueryRestorable = Object.keys(state).length == 0 && sessionQuery; + const [showSessionQueryRestore, setShowSessionQueryRestore] = useState(false); + useEffect(() => { + if (isSessionQueryRestorable) { + setShowSessionQueryRestore(true); + } else { + setShowSessionQueryRestore(false); + } + }, []); + const restoreSessionQuery = () => { + if (sessionQuery) setState(sessionQuery); + }; + const searchVisibilities = useMemo(() => { return getFieldVisibilitiesFromQuery(schema, state); }, [schema, state]); @@ -314,6 +352,14 @@ export const InnerSearchFullUI = ({ )} + {isSessionQueryRestorable && showSessionQueryRestore && ( + + )}
{buildSequenceCountText(totalSequences, oldCount, initialCount)} diff --git a/website/src/components/SearchPage/useSearchPageState.ts b/website/src/components/SearchPage/useSearchPageState.ts index 521c78a6de..edbf9b1721 100644 --- a/website/src/components/SearchPage/useSearchPageState.ts +++ b/website/src/components/SearchPage/useSearchPageState.ts @@ -249,6 +249,7 @@ export function useSearchPageState({ return useMemo( () => ({ state, + setState, previewedSeqId, setPreviewedSeqId, previewHalfScreen, @@ -267,6 +268,7 @@ export function useSearchPageState({ }), [ state, + setState, previewedSeqId, setPreviewedSeqId, previewHalfScreen, From 34afdd011dee6d44016b2fe3a3e54411433f786f Mon Sep 17 00:00:00 2001 From: tombch Date: Mon, 16 Mar 2026 09:25:38 +0100 Subject: [PATCH 2/7] Cleaned up effects and added comments --- .../components/SearchPage/SearchFullUI.tsx | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/website/src/components/SearchPage/SearchFullUI.tsx b/website/src/components/SearchPage/SearchFullUI.tsx index 5a6853ce32..64b4a32d01 100644 --- a/website/src/components/SearchPage/SearchFullUI.tsx +++ b/website/src/components/SearchPage/SearchFullUI.tsx @@ -112,18 +112,14 @@ export const InnerSearchFullUI = ({ useEffect(() => { if (typeof sessionStorage === 'undefined') return; - if (Object.keys(state).length > 0) { - sessionStorage.setItem(sessionQueryKey, JSON.stringify(state)); - } else { - sessionStorage.removeItem(sessionQueryKey); - } + if (Object.keys(state).length > 0) sessionStorage.setItem(sessionQueryKey, JSON.stringify(state)); + else sessionStorage.removeItem(sessionQueryKey); }, [state]); const sessionQuery: QueryState | null = useMemo(() => { if (typeof sessionStorage === 'undefined') return null; const sessionQueryValue = sessionStorage.getItem(sessionQueryKey); - console.log('Restoring session query from sessionStorage:', sessionQueryValue); if (sessionQueryValue) { try { return JSON.parse(sessionQueryValue); @@ -131,17 +127,19 @@ export const InnerSearchFullUI = ({ } return null; }, []); - const isSessionQueryRestorable = Object.keys(state).length == 0 && sessionQuery; + const [showSessionQueryRestore, setShowSessionQueryRestore] = useState(false); useEffect(() => { - if (isSessionQueryRestorable) { - setShowSessionQueryRestore(true); - } else { - setShowSessionQueryRestore(false); - } + const isSessionQueryRestorable = Object.keys(state).length == 0 && sessionQuery; + if (isSessionQueryRestorable) setShowSessionQueryRestore(true); + else setShowSessionQueryRestore(false); }, []); + const restoreSessionQuery = () => { - if (sessionQuery) setState(sessionQuery); + if (sessionQuery) { + setState(sessionQuery); + setShowSessionQueryRestore(false); + } }; const searchVisibilities = useMemo(() => { @@ -352,7 +350,7 @@ export const InnerSearchFullUI = ({
)} - {isSessionQueryRestorable && showSessionQueryRestore && ( + {showSessionQueryRestore && ( - )} {!tableFilter.isEmpty() && (
@@ -370,6 +362,17 @@ export const InnerSearchFullUI = ({
{buildSequenceCountText(totalSequences, oldCount, initialCount)} + {showSessionQueryRestore && ( + + | + + + )} {detailsHook.isPending || aggregatedHook.isPending || !firstClientSideLoadOfCountCompleted || From fab92473e420c10cc8ef991687e91992a9ab02f2 Mon Sep 17 00:00:00 2001 From: tombch Date: Mon, 16 Mar 2026 17:37:29 +0100 Subject: [PATCH 7/7] Updating query key --- website/src/components/SearchPage/SearchFullUI.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/src/components/SearchPage/SearchFullUI.tsx b/website/src/components/SearchPage/SearchFullUI.tsx index 7b1b9a9c9b..84fd0dfdd5 100644 --- a/website/src/components/SearchPage/SearchFullUI.tsx +++ b/website/src/components/SearchPage/SearchFullUI.tsx @@ -108,7 +108,7 @@ export const InnerSearchFullUI = ({ } = useSearchPageState({ initialQueryDict, schema, hiddenFieldValues, filterSchema, referenceGenomesInfo }); const isEmptyQueryState = (q: QueryState | null) => q === null || Object.keys(q).length === 0; - const sessionQueryKey = `${organism}QueryState`; + const sessionQueryKey = `${organism}SearchPageQuery`; const restorableQuery: QueryState | null = useMemo(() => { // On mount, check if sessionStorage has a query to restore