From 294cb935c0290edc58dbd2f43507d9f6bda5740f Mon Sep 17 00:00:00 2001 From: Yukthi Date: Thu, 4 Dec 2025 12:22:28 -0500 Subject: [PATCH 01/28] Test --- Eplant/main.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Eplant/main.tsx b/Eplant/main.tsx index c9357ed..a2fd48a 100644 --- a/Eplant/main.tsx +++ b/Eplant/main.tsx @@ -20,7 +20,7 @@ import { Config, defaultConfig } from './config' import Eplant from './Eplant' import './css/index.css' -console.log('DEBUG') +console.log('DEBUG-') const router = createBrowserRouter([ { path: '/', From 68aab2f65217038a1b8b540978430a860c8957e5 Mon Sep 17 00:00:00 2001 From: Yukthi Date: Thu, 4 Dec 2025 12:28:11 -0500 Subject: [PATCH 02/28] Fix yaml --- .github/workflows/build.yml | 3 ++- .github/workflows/deploy.yml | 3 +-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 62e1def..17b4c0f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -2,7 +2,8 @@ name: Build on: push: branches-ignore: - - debug-staging + - main + - staging pull_request: jobs: build: diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 70598b7..a026420 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -2,8 +2,7 @@ name: Deploy on: push: branches: - - main - - staging + - staging-debug permissions: contents: read From 7fb4da309ff5c021d5047410d0a44b414b218d83 Mon Sep 17 00:00:00 2001 From: Yukthi Date: Thu, 4 Dec 2025 12:29:40 -0500 Subject: [PATCH 03/28] ignore build on staging-debug --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 17b4c0f..7cc3418 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -4,6 +4,7 @@ on: branches-ignore: - main - staging + - staging-debug pull_request: jobs: build: From 2750c49edc242e444310c04d28d284fe38f305c8 Mon Sep 17 00:00:00 2001 From: Yukthi Date: Thu, 4 Dec 2025 12:59:16 -0500 Subject: [PATCH 04/28] Add correct router path --- Eplant/main.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Eplant/main.tsx b/Eplant/main.tsx index a2fd48a..34107b6 100644 --- a/Eplant/main.tsx +++ b/Eplant/main.tsx @@ -20,10 +20,9 @@ import { Config, defaultConfig } from './config' import Eplant from './Eplant' import './css/index.css' -console.log('DEBUG-') const router = createBrowserRouter([ { - path: '/', + path: process.env.BASE_URL ?? '/', element: , children: [ { From ec9d6efe6661c3a040a4d722362aec6e98ff134d Mon Sep 17 00:00:00 2001 From: Yukthi Date: Tue, 16 Dec 2025 10:14:25 -0500 Subject: [PATCH 05/28] Fixed router path --- Eplant/main.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Eplant/main.tsx b/Eplant/main.tsx index 34107b6..463de8b 100644 --- a/Eplant/main.tsx +++ b/Eplant/main.tsx @@ -22,7 +22,7 @@ import Eplant from './Eplant' import './css/index.css' const router = createBrowserRouter([ { - path: process.env.BASE_URL ?? '/', + path: import.meta.env.BASE_URL ?? '/', element: , children: [ { From 3c09e0dc5de08f2b445436de6dcf51b82e143ee1 Mon Sep 17 00:00:00 2001 From: Yukthi Date: Tue, 16 Dec 2025 10:27:29 -0500 Subject: [PATCH 06/28] Added basename arg --- Eplant/main.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Eplant/main.tsx b/Eplant/main.tsx index 463de8b..907e170 100644 --- a/Eplant/main.tsx +++ b/Eplant/main.tsx @@ -22,7 +22,7 @@ import Eplant from './Eplant' import './css/index.css' const router = createBrowserRouter([ { - path: import.meta.env.BASE_URL ?? '/', + path: '/', element: , children: [ { @@ -67,7 +67,9 @@ const router = createBrowserRouter([ ], errorElement: , }, -]) +], { + basename: import.meta.env.BASE_URL ?? '/', +}) export const queryClient = new QueryClient() From f949b05f0135ace297ab9a0c0101f27522071849 Mon Sep 17 00:00:00 2001 From: Yukthi Date: Tue, 16 Dec 2025 10:29:30 -0500 Subject: [PATCH 07/28] Prettier --- Eplant/main.tsx | 101 +++++++++++++++++++++++++----------------------- 1 file changed, 52 insertions(+), 49 deletions(-) diff --git a/Eplant/main.tsx b/Eplant/main.tsx index 907e170..5260001 100644 --- a/Eplant/main.tsx +++ b/Eplant/main.tsx @@ -20,56 +20,59 @@ import { Config, defaultConfig } from './config' import Eplant from './Eplant' import './css/index.css' -const router = createBrowserRouter([ +const router = createBrowserRouter( + [ + { + path: '/', + element: , + children: [ + { + element: , + }, + { + path: 'cell-efp/:geneid?', + element: , + }, + { + path: 'publications/:geneid?', + element: , + }, + { + path: 'chromosome/:geneid?', + element: , + }, + { + path: 'plant-efp/:geneid?', + element: , + }, + { + path: 'experiment-efp/:geneid?', + element: , + }, + { + path: 'gene-info/:geneid?', + element: , + }, + { + path: 'get-started/:geneid?', + element: , + }, + { + path: 'navigator-view/:geneid?', + element: , + }, + { + path: 'interactions-view/:geneid?', + element: , + }, + ], + errorElement: , + }, + ], { - path: '/', - element: , - children: [ - { - element: , - }, - { - path: 'cell-efp/:geneid?', - element: , - }, - { - path: 'publications/:geneid?', - element: , - }, - { - path: 'chromosome/:geneid?', - element: , - }, - { - path: 'plant-efp/:geneid?', - element: , - }, - { - path: 'experiment-efp/:geneid?', - element: , - }, - { - path: 'gene-info/:geneid?', - element: , - }, - { - path: 'get-started/:geneid?', - element: , - }, - { - path: 'navigator-view/:geneid?', - element: , - }, - { - path: 'interactions-view/:geneid?', - element: , - }, - ], - errorElement: , - }, -], { - basename: import.meta.env.BASE_URL ?? '/', -}) + basename: import.meta.env.BASE_URL ?? '/', + } +) export const queryClient = new QueryClient() From 400cbb09ab0fa76772f23a96c0b507d596ea19e8 Mon Sep 17 00:00:00 2001 From: Yukthi Date: Tue, 16 Dec 2025 10:33:03 -0500 Subject: [PATCH 08/28] Revert guthub actions change --- .github/workflows/build.yml | 1 - .github/workflows/deploy.yml | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 7cc3418..17b4c0f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -4,7 +4,6 @@ on: branches-ignore: - main - staging - - staging-debug pull_request: jobs: build: diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index a026420..70598b7 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -2,7 +2,8 @@ name: Deploy on: push: branches: - - staging-debug + - main + - staging permissions: contents: read From 94f7de51a2f2d6b7bfea51347cb2b5fe4b817ed2 Mon Sep 17 00:00:00 2001 From: Yukthi Date: Tue, 16 Dec 2025 16:35:45 -0500 Subject: [PATCH 09/28] Changed entrypoint path back to being base relative --- index.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/index.html b/index.html index a00036c..af309e3 100644 --- a/index.html +++ b/index.html @@ -4,7 +4,7 @@ - + - + Eplant From cd42aa77887df847dcd14e056bfca41dc2e9c62f Mon Sep 17 00:00:00 2001 From: Yukthi Date: Thu, 25 Dec 2025 18:07:05 -0500 Subject: [PATCH 10/28] Moving to hashrouter --- Eplant/UI/Layout/ViewContainer/index.tsx | 85 ++---------------------- Eplant/main.tsx | 4 +- 2 files changed, 7 insertions(+), 82 deletions(-) diff --git a/Eplant/UI/Layout/ViewContainer/index.tsx b/Eplant/UI/Layout/ViewContainer/index.tsx index b46b978..c02c6f8 100644 --- a/Eplant/UI/Layout/ViewContainer/index.tsx +++ b/Eplant/UI/Layout/ViewContainer/index.tsx @@ -1,5 +1,5 @@ -import { useEffect, useState } from 'react' -import { Outlet, useLocation, useNavigate, useParams } from 'react-router-dom' +import { useState } from 'react' +import { Outlet } from 'react-router-dom' import { useConfig } from '@eplant/config' import { @@ -7,7 +7,6 @@ import { useActiveViewId, useGeneticElements, usePrinting, - useSpecies, } from '@eplant/state' import Modal from '@eplant/UI/Modal' import ErrorBoundary from '@eplant/util/ErrorBoundary' @@ -37,83 +36,9 @@ export function ViewContainer({ ...props }) { const [printing, setPrinting] = usePrinting() const [viewingCitations, setViewingCitations] = useState(false) const { views } = useConfig() - const navigate = useNavigate() - const location = useLocation() - const params = useParams() - const [speciesList] = useSpecies() - const [genes, setGenes] = useGeneticElements() - const [activeGeneId, setActiveGeneId] = useActiveGeneId() - const [activeViewId, setActiveViewId] = useActiveViewId() - const [geneNotFound, setGeneNotFound] = useState(false) - - // On app url change, make sure loaded gene and view aligns with URL - useEffect(() => { - const loadGene = async (geneid: string) => { - // TODO: This is super jank, should probably write some better utilities for loading genes - const species = speciesList.find( - (species) => species.name === 'Arabidopsis' - ) - const newGene = await species?.api.searchGene(geneid) - if (newGene) { - setGenes([...genes, newGene]) - } else { - setGeneNotFound(true) - setActiveGeneId('') - } - } - if (params.geneid) { - if (params.geneid !== activeGeneId) { - if (!genes.find((g) => g.id === params.geneid)) { - loadGene(params.geneid) - } - if (!geneNotFound) setActiveGeneId(params.geneid) - } - } else { - // Set active gene to first available if one is already loaded - if (genes.length > 0) { - setActiveGeneId(genes[0].id) - } else { - setActiveGeneId('') - } - } - - // Set activeview - const urlView = - views.find((view) => view.id === location.pathname.split('/')[1]) ?? - GeneInfoViewMetadata - - setActiveViewId(urlView.id) - }, []) - - // On when the activegene or view changes, update path - useEffect(() => { - const oldPathSegments = location.pathname - .split('/') - .filter((segment) => segment !== '') - - const newPathSegments = [] - if (activeViewId) { - newPathSegments.push(activeViewId) - } - if (activeGeneId) { - newPathSegments.push(activeGeneId) - } - - if (newPathSegments.length > 0) { - let newPath - if ( - oldPathSegments.length > 0 && - oldPathSegments[0] == newPathSegments[0] - ) { - // If the view is the same we want to retain quary params in url, else we can wipe - // them and have URLStateManager handle things - newPath = '/' + newPathSegments.join('/') + location.search - } else { - newPath = '/' + newPathSegments.join('/') - } - navigate(newPath) - } - }, [activeGeneId, activeViewId]) + const [genes] = useGeneticElements() + const [activeGeneId] = useActiveGeneId() + const [activeViewId] = useActiveViewId() // Get view and gene objects once everything resolves const activeView = diff --git a/Eplant/main.tsx b/Eplant/main.tsx index 5260001..def8e77 100644 --- a/Eplant/main.tsx +++ b/Eplant/main.tsx @@ -1,7 +1,7 @@ import { StrictMode } from 'react' import { Provider } from 'jotai' import * as ReactDOM from 'react-dom/client' -import { createBrowserRouter, Navigate, RouterProvider } from 'react-router-dom' +import { createHashRouter, Navigate, RouterProvider } from 'react-router-dom' import { QueryClient, QueryClientProvider } from '@tanstack/react-query' import { ReactQueryDevtools } from '@tanstack/react-query-devtools' @@ -20,7 +20,7 @@ import { Config, defaultConfig } from './config' import Eplant from './Eplant' import './css/index.css' -const router = createBrowserRouter( +const router = createHashRouter( [ { path: '/', From 1077bde74a1a41ed86237633b0ae7f02a149a8ad Mon Sep 17 00:00:00 2001 From: Yukthi Date: Fri, 26 Dec 2025 14:21:06 -0500 Subject: [PATCH 11/28] Trying to fix view alignment issues --- Eplant/state/URLStateProvider.tsx | 151 +++++++++++++++++++++++++++--- Eplant/state/stateUtils.ts | 5 + 2 files changed, 142 insertions(+), 14 deletions(-) diff --git a/Eplant/state/URLStateProvider.tsx b/Eplant/state/URLStateProvider.tsx index 5fd7f37..bcd3c7a 100644 --- a/Eplant/state/URLStateProvider.tsx +++ b/Eplant/state/URLStateProvider.tsx @@ -4,20 +4,40 @@ import React, { useCallback, useContext, useEffect, + useMemo, useRef, useState, } from 'react' import { debounce } from 'lodash' -import { useSearchParams } from 'react-router-dom' +import { + useLocation, + useNavigate, + useParams, + useSearchParams, +} from 'react-router-dom' import { AnyZodObject } from 'zod' -import { flattenObject, getStateFromParams, getZodDefaults } from './stateUtils' -import { useActiveViewId } from '.' +import { useConfig } from '@eplant/config' +import GeneInfoViewMetadata from '@eplant/views/GeneInfoView' + +import { + flattenObject, + getStateFromParams, + getViewIdFromPathname, + getZodDefaults, +} from './stateUtils' +import { + useActiveGeneId, + useActiveViewId, + useGeneticElements, + useSpecies, +} from '.' interface URLStateContext { state: T | null setState: (updatedState: T) => void initializeState: (schema: AnyZodObject) => void + currentStateViewIdRef: React.MutableRefObject } const URLStateContext = createContext>({ @@ -28,26 +48,105 @@ const URLStateContext = createContext>({ initializeState: () => { throw new Error('initializeState must be used within a URLStateProvider') }, + currentStateViewIdRef: { current: null }, }) export const URLStateProvider = ({ children }: { children: ReactNode }) => { - const [activeViewId] = useActiveViewId() - const [searchParams, setSearchParams] = useSearchParams() - const stateCache = useRef(new Map()) const [state, setState] = useState(() => { null }) + const [activeViewId, setActiveViewId] = useActiveViewId() + const [searchParams, setSearchParams] = useSearchParams() + const stateCache = useRef(new Map()) + const currentStateViewIdRef = useRef(null) + const { views } = useConfig() + const location = useLocation() + const navigate = useNavigate() + const [speciesList] = useSpecies() + const [genes, setGenes] = useGeneticElements() + const [activeGeneId, setActiveGeneId] = useActiveGeneId() + const [geneNotFound, setGeneNotFound] = useState(false) + const params = useParams() + + useEffect(() => { + const loadGene = async (geneid: string) => { + // TODO: This is super jank, should probably write some better utilities for loading genes + const species = speciesList.find( + (species) => species.name === 'Arabidopsis' + ) + const newGene = await species?.api.searchGene(geneid) + if (newGene) { + setGenes([...genes, newGene]) + } else { + setGeneNotFound(true) + setActiveGeneId('') + } + } + if (params.geneid) { + if (params.geneid !== activeGeneId) { + if (!genes.find((g) => g.id === params.geneid)) { + loadGene(params.geneid) + } + if (!geneNotFound) setActiveGeneId(params.geneid) + } + } else { + // Set active gene to first available if one is already loaded + if (genes.length > 0) { + setActiveGeneId(genes[0].id) + } else { + setActiveGeneId('') + } + } + + // Set activeview + const urlView = + views.find((view) => view.id === location.pathname.split('/')[1]) ?? + GeneInfoViewMetadata + + setActiveViewId(urlView.id) + }, []) + + // On when the activegene or view changes, update path + useEffect(() => { + const oldPathSegments = location.pathname + .split('/') + .filter((segment) => segment !== '') + + const newPathSegments = [] + if (activeViewId) { + newPathSegments.push(activeViewId) + } + if (activeGeneId) { + newPathSegments.push(activeGeneId) + } + + if (newPathSegments.length > 0) { + let newPath + if ( + oldPathSegments.length > 0 && + oldPathSegments[0] == newPathSegments[0] + ) { + // If the view is the same we want to retain query params in url, else we can wipe + // them and have URLStateManager handle things + newPath = '/' + newPathSegments.join('/') + location.search + } else { + newPath = '/' + newPathSegments.join('/') + } + navigate(newPath) + } + }, [activeGeneId, activeViewId]) const debouncedUpdateSearchParams = useCallback( debounce((updatedState: any) => { - // Setting component state - stateCache.current.set(activeViewId, updatedState) + // Get current view ID from location to ensure correct caching + const currentViewId = getViewIdFromPathname(location.pathname) + stateCache.current.set(currentViewId, updatedState) // Setting params const flattenedState = flattenObject(updatedState) setSearchParams(new URLSearchParams(flattenedState as any)) }, 50), - [activeViewId] + [location.pathname, setSearchParams] ) useEffect(() => { @@ -61,19 +160,25 @@ export const URLStateProvider = ({ children }: { children: ReactNode }) => { const initializeState = useCallback( (schema: T) => { - // Get validated state - const defaultState = getZodDefaults(schema) // This returns the defaults defined by Zod Schema + const currentViewId = getViewIdFromPathname(location.pathname) + + const defaultState = getZodDefaults(schema) const paramsState = getStateFromParams(schema, searchParams) - const cachedState = stateCache.current.get(activeViewId) || {} + const cachedState = stateCache.current.get(currentViewId) || {} + // Merge precedence: search params > cached state > defaults const mergedState = { ...defaultState, ...cachedState, ...paramsState, } + + // Track which view ID this state belongs to + currentStateViewIdRef.current = currentViewId + setActiveViewId(currentViewId) setState(mergedState) }, - [searchParams, activeViewId] + [searchParams, location.pathname] ) return ( @@ -82,6 +187,7 @@ export const URLStateProvider = ({ children }: { children: ReactNode }) => { state, setState: (updatedState) => setState(updatedState), initializeState, + currentStateViewIdRef, }} > {children} @@ -91,8 +197,25 @@ export const URLStateProvider = ({ children }: { children: ReactNode }) => { export const useURLState = () => { const context = useContext(URLStateContext) + const location = useLocation() + if (!context.setState) { throw new Error('useURLState must be used within a URLStateProvider') } - return context as URLStateContext + + const currentUrlViewId = useMemo( + () => getViewIdFromPathname(location.pathname), + [location.pathname] + ) + + // Clear state to avoid + const safeState = + currentUrlViewId === context.currentStateViewIdRef.current + ? context.state + : null + + return { + ...context, + state: safeState, + } as URLStateContext } diff --git a/Eplant/state/stateUtils.ts b/Eplant/state/stateUtils.ts index 733a646..e202f0d 100644 --- a/Eplant/state/stateUtils.ts +++ b/Eplant/state/stateUtils.ts @@ -111,3 +111,8 @@ export const unflattenObject = ( } return result } + +export const getViewIdFromPathname = (pathname: string): string => { + const pathParts = pathname.split('/').filter(Boolean) + return pathParts[0] || 'gene-info' +} From 6652b373e23aecbcb27d1abe5034e1a2bc0abf31 Mon Sep 17 00:00:00 2001 From: Yukthi Date: Fri, 26 Dec 2025 14:43:18 -0500 Subject: [PATCH 12/28] Revert "Trying to fix view alignment issues" This reverts commit 1077bde74a1a41ed86237633b0ae7f02a149a8ad. --- Eplant/state/URLStateProvider.tsx | 151 +++--------------------------- Eplant/state/stateUtils.ts | 5 - 2 files changed, 14 insertions(+), 142 deletions(-) diff --git a/Eplant/state/URLStateProvider.tsx b/Eplant/state/URLStateProvider.tsx index bcd3c7a..5fd7f37 100644 --- a/Eplant/state/URLStateProvider.tsx +++ b/Eplant/state/URLStateProvider.tsx @@ -4,40 +4,20 @@ import React, { useCallback, useContext, useEffect, - useMemo, useRef, useState, } from 'react' import { debounce } from 'lodash' -import { - useLocation, - useNavigate, - useParams, - useSearchParams, -} from 'react-router-dom' +import { useSearchParams } from 'react-router-dom' import { AnyZodObject } from 'zod' -import { useConfig } from '@eplant/config' -import GeneInfoViewMetadata from '@eplant/views/GeneInfoView' - -import { - flattenObject, - getStateFromParams, - getViewIdFromPathname, - getZodDefaults, -} from './stateUtils' -import { - useActiveGeneId, - useActiveViewId, - useGeneticElements, - useSpecies, -} from '.' +import { flattenObject, getStateFromParams, getZodDefaults } from './stateUtils' +import { useActiveViewId } from '.' interface URLStateContext { state: T | null setState: (updatedState: T) => void initializeState: (schema: AnyZodObject) => void - currentStateViewIdRef: React.MutableRefObject } const URLStateContext = createContext>({ @@ -48,105 +28,26 @@ const URLStateContext = createContext>({ initializeState: () => { throw new Error('initializeState must be used within a URLStateProvider') }, - currentStateViewIdRef: { current: null }, }) export const URLStateProvider = ({ children }: { children: ReactNode }) => { + const [activeViewId] = useActiveViewId() + const [searchParams, setSearchParams] = useSearchParams() + const stateCache = useRef(new Map()) const [state, setState] = useState(() => { null }) - const [activeViewId, setActiveViewId] = useActiveViewId() - const [searchParams, setSearchParams] = useSearchParams() - const stateCache = useRef(new Map()) - const currentStateViewIdRef = useRef(null) - const { views } = useConfig() - const location = useLocation() - const navigate = useNavigate() - const [speciesList] = useSpecies() - const [genes, setGenes] = useGeneticElements() - const [activeGeneId, setActiveGeneId] = useActiveGeneId() - const [geneNotFound, setGeneNotFound] = useState(false) - const params = useParams() - - useEffect(() => { - const loadGene = async (geneid: string) => { - // TODO: This is super jank, should probably write some better utilities for loading genes - const species = speciesList.find( - (species) => species.name === 'Arabidopsis' - ) - const newGene = await species?.api.searchGene(geneid) - if (newGene) { - setGenes([...genes, newGene]) - } else { - setGeneNotFound(true) - setActiveGeneId('') - } - } - if (params.geneid) { - if (params.geneid !== activeGeneId) { - if (!genes.find((g) => g.id === params.geneid)) { - loadGene(params.geneid) - } - if (!geneNotFound) setActiveGeneId(params.geneid) - } - } else { - // Set active gene to first available if one is already loaded - if (genes.length > 0) { - setActiveGeneId(genes[0].id) - } else { - setActiveGeneId('') - } - } - - // Set activeview - const urlView = - views.find((view) => view.id === location.pathname.split('/')[1]) ?? - GeneInfoViewMetadata - - setActiveViewId(urlView.id) - }, []) - - // On when the activegene or view changes, update path - useEffect(() => { - const oldPathSegments = location.pathname - .split('/') - .filter((segment) => segment !== '') - - const newPathSegments = [] - if (activeViewId) { - newPathSegments.push(activeViewId) - } - if (activeGeneId) { - newPathSegments.push(activeGeneId) - } - - if (newPathSegments.length > 0) { - let newPath - if ( - oldPathSegments.length > 0 && - oldPathSegments[0] == newPathSegments[0] - ) { - // If the view is the same we want to retain query params in url, else we can wipe - // them and have URLStateManager handle things - newPath = '/' + newPathSegments.join('/') + location.search - } else { - newPath = '/' + newPathSegments.join('/') - } - navigate(newPath) - } - }, [activeGeneId, activeViewId]) const debouncedUpdateSearchParams = useCallback( debounce((updatedState: any) => { - // Get current view ID from location to ensure correct caching - const currentViewId = getViewIdFromPathname(location.pathname) - stateCache.current.set(currentViewId, updatedState) + // Setting component state + stateCache.current.set(activeViewId, updatedState) // Setting params const flattenedState = flattenObject(updatedState) setSearchParams(new URLSearchParams(flattenedState as any)) }, 50), - [location.pathname, setSearchParams] + [activeViewId] ) useEffect(() => { @@ -160,25 +61,19 @@ export const URLStateProvider = ({ children }: { children: ReactNode }) => { const initializeState = useCallback( (schema: T) => { - const currentViewId = getViewIdFromPathname(location.pathname) - - const defaultState = getZodDefaults(schema) + // Get validated state + const defaultState = getZodDefaults(schema) // This returns the defaults defined by Zod Schema const paramsState = getStateFromParams(schema, searchParams) - const cachedState = stateCache.current.get(currentViewId) || {} - + const cachedState = stateCache.current.get(activeViewId) || {} // Merge precedence: search params > cached state > defaults const mergedState = { ...defaultState, ...cachedState, ...paramsState, } - - // Track which view ID this state belongs to - currentStateViewIdRef.current = currentViewId - setActiveViewId(currentViewId) setState(mergedState) }, - [searchParams, location.pathname] + [searchParams, activeViewId] ) return ( @@ -187,7 +82,6 @@ export const URLStateProvider = ({ children }: { children: ReactNode }) => { state, setState: (updatedState) => setState(updatedState), initializeState, - currentStateViewIdRef, }} > {children} @@ -197,25 +91,8 @@ export const URLStateProvider = ({ children }: { children: ReactNode }) => { export const useURLState = () => { const context = useContext(URLStateContext) - const location = useLocation() - if (!context.setState) { throw new Error('useURLState must be used within a URLStateProvider') } - - const currentUrlViewId = useMemo( - () => getViewIdFromPathname(location.pathname), - [location.pathname] - ) - - // Clear state to avoid - const safeState = - currentUrlViewId === context.currentStateViewIdRef.current - ? context.state - : null - - return { - ...context, - state: safeState, - } as URLStateContext + return context as URLStateContext } diff --git a/Eplant/state/stateUtils.ts b/Eplant/state/stateUtils.ts index e202f0d..733a646 100644 --- a/Eplant/state/stateUtils.ts +++ b/Eplant/state/stateUtils.ts @@ -111,8 +111,3 @@ export const unflattenObject = ( } return result } - -export const getViewIdFromPathname = (pathname: string): string => { - const pathParts = pathname.split('/').filter(Boolean) - return pathParts[0] || 'gene-info' -} From e7d92bff3622edcc6ef2c14db4384c94aad88fa1 Mon Sep 17 00:00:00 2001 From: Yukthi Date: Fri, 26 Dec 2025 14:47:54 -0500 Subject: [PATCH 13/28] Revert "Moving to hashrouter" This reverts commit cd42aa77887df847dcd14e056bfca41dc2e9c62f. --- Eplant/UI/Layout/ViewContainer/index.tsx | 85 ++++++++++++++++++++++-- Eplant/main.tsx | 4 +- 2 files changed, 82 insertions(+), 7 deletions(-) diff --git a/Eplant/UI/Layout/ViewContainer/index.tsx b/Eplant/UI/Layout/ViewContainer/index.tsx index c02c6f8..b46b978 100644 --- a/Eplant/UI/Layout/ViewContainer/index.tsx +++ b/Eplant/UI/Layout/ViewContainer/index.tsx @@ -1,5 +1,5 @@ -import { useState } from 'react' -import { Outlet } from 'react-router-dom' +import { useEffect, useState } from 'react' +import { Outlet, useLocation, useNavigate, useParams } from 'react-router-dom' import { useConfig } from '@eplant/config' import { @@ -7,6 +7,7 @@ import { useActiveViewId, useGeneticElements, usePrinting, + useSpecies, } from '@eplant/state' import Modal from '@eplant/UI/Modal' import ErrorBoundary from '@eplant/util/ErrorBoundary' @@ -36,9 +37,83 @@ export function ViewContainer({ ...props }) { const [printing, setPrinting] = usePrinting() const [viewingCitations, setViewingCitations] = useState(false) const { views } = useConfig() - const [genes] = useGeneticElements() - const [activeGeneId] = useActiveGeneId() - const [activeViewId] = useActiveViewId() + const navigate = useNavigate() + const location = useLocation() + const params = useParams() + const [speciesList] = useSpecies() + const [genes, setGenes] = useGeneticElements() + const [activeGeneId, setActiveGeneId] = useActiveGeneId() + const [activeViewId, setActiveViewId] = useActiveViewId() + const [geneNotFound, setGeneNotFound] = useState(false) + + // On app url change, make sure loaded gene and view aligns with URL + useEffect(() => { + const loadGene = async (geneid: string) => { + // TODO: This is super jank, should probably write some better utilities for loading genes + const species = speciesList.find( + (species) => species.name === 'Arabidopsis' + ) + const newGene = await species?.api.searchGene(geneid) + if (newGene) { + setGenes([...genes, newGene]) + } else { + setGeneNotFound(true) + setActiveGeneId('') + } + } + if (params.geneid) { + if (params.geneid !== activeGeneId) { + if (!genes.find((g) => g.id === params.geneid)) { + loadGene(params.geneid) + } + if (!geneNotFound) setActiveGeneId(params.geneid) + } + } else { + // Set active gene to first available if one is already loaded + if (genes.length > 0) { + setActiveGeneId(genes[0].id) + } else { + setActiveGeneId('') + } + } + + // Set activeview + const urlView = + views.find((view) => view.id === location.pathname.split('/')[1]) ?? + GeneInfoViewMetadata + + setActiveViewId(urlView.id) + }, []) + + // On when the activegene or view changes, update path + useEffect(() => { + const oldPathSegments = location.pathname + .split('/') + .filter((segment) => segment !== '') + + const newPathSegments = [] + if (activeViewId) { + newPathSegments.push(activeViewId) + } + if (activeGeneId) { + newPathSegments.push(activeGeneId) + } + + if (newPathSegments.length > 0) { + let newPath + if ( + oldPathSegments.length > 0 && + oldPathSegments[0] == newPathSegments[0] + ) { + // If the view is the same we want to retain quary params in url, else we can wipe + // them and have URLStateManager handle things + newPath = '/' + newPathSegments.join('/') + location.search + } else { + newPath = '/' + newPathSegments.join('/') + } + navigate(newPath) + } + }, [activeGeneId, activeViewId]) // Get view and gene objects once everything resolves const activeView = diff --git a/Eplant/main.tsx b/Eplant/main.tsx index def8e77..5260001 100644 --- a/Eplant/main.tsx +++ b/Eplant/main.tsx @@ -1,7 +1,7 @@ import { StrictMode } from 'react' import { Provider } from 'jotai' import * as ReactDOM from 'react-dom/client' -import { createHashRouter, Navigate, RouterProvider } from 'react-router-dom' +import { createBrowserRouter, Navigate, RouterProvider } from 'react-router-dom' import { QueryClient, QueryClientProvider } from '@tanstack/react-query' import { ReactQueryDevtools } from '@tanstack/react-query-devtools' @@ -20,7 +20,7 @@ import { Config, defaultConfig } from './config' import Eplant from './Eplant' import './css/index.css' -const router = createHashRouter( +const router = createBrowserRouter( [ { path: '/', From 3e98a0432228ce7618ddd0d2863fa65049b98fdb Mon Sep 17 00:00:00 2001 From: Yukthi Date: Fri, 26 Dec 2025 15:18:51 -0500 Subject: [PATCH 14/28] Changing entrypoint again --- index.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/index.html b/index.html index af309e3..a00036c 100644 --- a/index.html +++ b/index.html @@ -4,7 +4,7 @@ - + - + Eplant From 477c467980b669532bb96d5e9e5afab08d88ef9f Mon Sep 17 00:00:00 2001 From: Yukthi Date: Fri, 26 Dec 2025 15:21:06 -0500 Subject: [PATCH 15/28] Setting homepage variable --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 571621d..9ee5b67 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "description": "Eplant", "main": "index.ts", "type": "module", + "homepage": "https://bioanalyticresource.github.io/ePlant/", "scripts": { "test": "jest --passWithNoTests", "dev": "vite", From 3f62c8cf891c359fed825bd22d1f6d661b69c34a Mon Sep 17 00:00:00 2001 From: Yukthi Date: Fri, 26 Dec 2025 15:44:39 -0500 Subject: [PATCH 16/28] Added workaround for github pages --- index.html | 20 +++++++++++++++++++- public/404.html | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 public/404.html diff --git a/index.html b/index.html index a00036c..6442196 100644 --- a/index.html +++ b/index.html @@ -4,7 +4,25 @@ - + + + + + + Redirecting… + + + + From d6702bf34f4cd0a999ddc1d84cdab56a883164a6 Mon Sep 17 00:00:00 2001 From: Yukthi Date: Sun, 4 Jan 2026 20:21:12 -0500 Subject: [PATCH 17/28] refactored mask modal --- Eplant/views/eFP/Viewer/EFPViewer.tsx | 2 +- Eplant/views/eFP/Viewer/MaskModal.tsx | 15 +++++++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/Eplant/views/eFP/Viewer/EFPViewer.tsx b/Eplant/views/eFP/Viewer/EFPViewer.tsx index 42b815d..c9bf6e4 100644 --- a/Eplant/views/eFP/Viewer/EFPViewer.tsx +++ b/Eplant/views/eFP/Viewer/EFPViewer.tsx @@ -208,7 +208,7 @@ export const EFPViewer = ({ /> setViewState({ ...state, maskModalVisible: false }) diff --git a/Eplant/views/eFP/Viewer/MaskModal.tsx b/Eplant/views/eFP/Viewer/MaskModal.tsx index 56efaac..bd90b2a 100644 --- a/Eplant/views/eFP/Viewer/MaskModal.tsx +++ b/Eplant/views/eFP/Viewer/MaskModal.tsx @@ -10,25 +10,28 @@ import { useTheme, } from '@mui/material' -import { EFPViewerState } from './types' - // Modal component with a slider interface MaskModalProps { isVisible: boolean - state: EFPViewerState + threshold: number onClose: () => void onSubmit: (threshhold: number) => void } -const MaskModal = ({ isVisible, state, onClose, onSubmit }: MaskModalProps) => { - const [sliderValue, setSliderValue] = useState(state.maskThreshold) +const MaskModal = ({ + isVisible, + threshold, + onClose, + onSubmit, +}: MaskModalProps) => { + const [sliderValue, setSliderValue] = useState(threshold) const theme = useTheme() const handleSliderChange = (event: Event, newValue: number | number[]) => { setSliderValue(newValue as number) } const handleClose = () => { - setSliderValue(state.maskThreshold) + setSliderValue(threshold) onClose() } From 4fcb9ca671a59a073289fbe96f199c767ce0bc78 Mon Sep 17 00:00:00 2001 From: Yukthi Date: Mon, 5 Jan 2026 16:46:33 -0500 Subject: [PATCH 18/28] Worldefp conversion to routing --- Eplant/config.tsx | 4 +- Eplant/main.tsx | 5 + Eplant/views/WorldEFP/WorldEFP.tsx | 170 ++++++++++++++++++++ Eplant/views/WorldEFP/index.tsx | 241 ++++++----------------------- Eplant/views/WorldEFP/types.tsx | 33 ++-- 5 files changed, 244 insertions(+), 209 deletions(-) create mode 100644 Eplant/views/WorldEFP/WorldEFP.tsx diff --git a/Eplant/config.tsx b/Eplant/config.tsx index 6c1d0d1..48a6daa 100644 --- a/Eplant/config.tsx +++ b/Eplant/config.tsx @@ -10,7 +10,7 @@ import InteractionsViewer from './views/InteractionsViewer' import NavigatorView from './views/NavigatorView' import PlantEFP from './views/PlantEFP' import PublicationViewer from './views/PublicationViewer' -// import WorldEFP from './views/WorldEFP' +import WorldEFP from './views/WorldEFP' import { type ViewMetadata } from './View' export type EplantConfig = { @@ -34,7 +34,7 @@ const userViewMetadata = [ PlantEFP, CellEFP, ExperimentEFP, - // WorldEFP, + WorldEFP, ChromosomeViewerObject, NavigatorView, InteractionsViewer, diff --git a/Eplant/main.tsx b/Eplant/main.tsx index 5260001..a0a2980 100644 --- a/Eplant/main.tsx +++ b/Eplant/main.tsx @@ -16,6 +16,7 @@ import { InteractionsViewObject } from './views/InteractionsViewer/InteractionsV import { NavigatorViewObject } from './views/NavigatorView/NavigatorView' import { PlantEFPView } from './views/PlantEFP/PlantEFP' import { PublicationsViewer } from './views/PublicationViewer/PublicationsView' +import { WorldEFPView } from './views/WorldEFP/WorldEFP' import { Config, defaultConfig } from './config' import Eplant from './Eplant' @@ -65,6 +66,10 @@ const router = createBrowserRouter( path: 'interactions-view/:geneid?', element: , }, + { + path: 'world-efp/:geneid?', + element: , + }, ], errorElement: , }, diff --git a/Eplant/views/WorldEFP/WorldEFP.tsx b/Eplant/views/WorldEFP/WorldEFP.tsx new file mode 100644 index 0000000..c568d8d --- /dev/null +++ b/Eplant/views/WorldEFP/WorldEFP.tsx @@ -0,0 +1,170 @@ +import { useEffect, useState } from 'react' +import { useOutletContext } from 'react-router-dom' + +import GeneticElement from '@eplant/GeneticElement' +import { useURLState } from '@eplant/state/URLStateProvider' +import LoadingPage from '@eplant/UI/Layout/ViewContainer/LoadingPage' +import { ViewContext } from '@eplant/UI/Layout/ViewContainer/types' +import { ViewDataError } from '@eplant/View' +import { useQuery } from '@tanstack/react-query' +import { APIProvider } from '@vis.gl/react-google-maps' + +import { EFPData, EFPGroup } from '../eFP/types' +import MaskModal from '../eFP/Viewer/MaskModal' + +import MapContainer from './MapContainer' +import { + Coordinates, + WorldEFPAction, + WorldEFPData, + WorldEFPMicroArrayResponse, + WorldEFPState, + WorldEFPStateSchema, +} from './types' +import WorldEFP from '.' + +export const WorldEFPView = () => { + const { geneticElement } = useOutletContext() + const { state, setState, initializeState } = useURLState() + const [loadAmount, setLoadAmount] = useState(0) + + const { data, isLoading, isError, error } = useQuery< + WorldEFPData, + ViewDataError + >({ + queryKey: [`world-efp-${geneticElement?.id}`], + queryFn: async () => { + return worldEFPLoader(geneticElement, setLoadAmount) + }, + }) + useEffect(() => { + // On mount, initialize state + initializeState(WorldEFPStateSchema) + }, []) + + if (!geneticElement) { + return ( + + ) + } else if (isError) { + return ( + + ) + } else if (isLoading && loadAmount < 100) { + return ( + + ) + } else if (!data || !state) return <> + + return ( + <> + + { + // TODO: implement reducer logic + }} + /> + + { + setState({ ...state, maskModalVisible: !state.maskModalVisible }) + }} + onSubmit={(threshold) => { + setState({ + ...state, + maskThreshold: threshold, + maskingEnabled: !state.maskingEnabled, + maskModalVisible: !state.maskModalVisible, + }) + }} + /> + + ) +} + +export const worldEFPLoader = async ( + geneticElement: GeneticElement | null, + loadEvent: (loaded: number) => void +) => { + if (!geneticElement) throw ViewDataError.UNSUPPORTED_GENE + + const microArrayDataURL = `https://bar.utoronto.ca/api_dev/microarray_gene_expression/world_efp/arabidopsis/${geneticElement.id}` + const microArrayData: WorldEFPMicroArrayResponse = await fetch( + microArrayDataURL + ) + .then((response) => { + if (!response.ok) { + throw new Error(`HTTP error! Status: ${response.status}`) + } + return response.json() + }) + .catch((error) => { + console.error('Error fetching map marker data:', error) + throw error + }) + + const positions: Coordinates[] = [] + const groupData: EFPGroup[] = [] + Object.entries(microArrayData.data).forEach(([key, marker]) => { + // Coordinates + positions.push({ + lat: parseFloat(marker.position.lat), + lng: parseFloat(marker.position.lng), + }) + const samples = Object.values(marker.values) + // Sample data + const mean = samples.reduce((sum, value) => sum + value, 0) / samples.length + const efpGroupData = { + name: marker.id, + tissues: [], + mean: mean, + min: Math.min(...samples), + max: Math.max(...samples), + std: Math.sqrt( + samples.reduce((sum, value) => Math.pow(value - mean, 2)) / + (samples.length - 1) + ), + samples: samples.length, + } + + groupData.push(efpGroupData) + }) + + const totalSamples = groupData.reduce((sum, group) => sum + group.samples, 0) + const totalMean = + groupData.reduce((sum, group) => sum + group.mean * group.samples, 0) / + totalSamples + + const efpData = { + groups: groupData, + mean: totalMean, + min: Math.min(...groupData.map((group) => group.min)), + max: Math.max(...groupData.map((group) => group.max)), + std: 0, // This isn't needed, just set to 0 for convenience + samples: totalSamples, + } as EFPData + + return { + positions: positions, + efpData: efpData, + } +} diff --git a/Eplant/views/WorldEFP/index.tsx b/Eplant/views/WorldEFP/index.tsx index 08aa700..e6f0a7b 100644 --- a/Eplant/views/WorldEFP/index.tsx +++ b/Eplant/views/WorldEFP/index.tsx @@ -1,196 +1,47 @@ -// import GeneticElement from '@eplant/GeneticElement' -// import { ViewDataError } from '@eplant/View/viewData' -// import { APIProvider } from '@vis.gl/react-google-maps' +import { StateAction, ViewMetadata } from '@eplant/View' +import BuildRoundedIcon from '@mui/icons-material/BuildRounded' +import ColorLensIcon from '@mui/icons-material/ColorLens' +import MasksIcon from '@mui/icons-material/Masks' -// import { EFPData, EFPGroup } from '../eFP/types' -// import MaskModal from '../eFP/Viewer/MaskModal' - -// import WorldEFPIcon from './icon' -// import MapContainer from './MapContainer' -// import { -// Coordinates, -// WorldEFPAction, -// WorldEFPData, -// WorldEFPMicroArrayResponse, -// WorldEFPState, -// } from './types' -// import { ViewMetadata } from '@eplant/View' -// const WorldEFP: ViewMetadata = { -// name: 'World-EFP', -// id: 'World-EFP', -// getInitialState() { -// return { -// position: { lat: 25, lng: 0 }, -// zoom: 2, -// mapTypeId: 'roadmap', -// maskingEnabled: false, -// maskModalVisible: false, -// maskThreshold: 100, -// colorMode: 'absolute', -// } -// }, -// async getInitialData( -// gene: GeneticElement | null, -// loadEvent: (progress: number) => void -// ) { -// if (!gene) throw ViewDataError.UNSUPPORTED_GENE -// const microArrayDataURL = `https://bar.utoronto.ca/api_dev/microarray_gene_expression/world_efp/arabidopsis/${gene.id}` -// const microArrayData: WorldEFPMicroArrayResponse = await fetch( -// microArrayDataURL -// ) -// .then((response) => { -// if (!response.ok) { -// throw new Error(`HTTP error! Status: ${response.status}`) -// } -// return response.json() -// }) -// .catch((error) => { -// console.error('Error fetching map marker data:', error) -// throw error -// }) - -// const positions: Coordinates[] = [] -// const groupData: EFPGroup[] = [] -// Object.entries(microArrayData.data).forEach(([key, marker]) => { -// // Coordinates -// positions.push({ -// lat: parseFloat(marker.position.lat), -// lng: parseFloat(marker.position.lng), -// }) -// const samples = Object.values(marker.values) -// // Sample data -// const mean = -// samples.reduce((sum, value) => sum + value, 0) / samples.length -// const efpGroupData = { -// name: marker.id, -// tissues: [], -// mean: mean, -// min: Math.min(...samples), -// max: Math.max(...samples), -// std: Math.sqrt( -// samples.reduce((sum, value) => Math.pow(value - mean, 2)) / -// (samples.length - 1) -// ), -// samples: samples.length, -// } - -// groupData.push(efpGroupData) -// }) - -// const totalSamples = groupData.reduce( -// (sum, group) => sum + group.samples, -// 0 -// ) -// const totalMean = -// groupData.reduce((sum, group) => sum + group.mean * group.samples, 0) / -// totalSamples - -// const efpData = { -// groups: groupData, -// mean: totalMean, -// min: Math.min(...groupData.map((group) => group.min)), -// max: Math.max(...groupData.map((group) => group.max)), -// std: 0, // This isn't needed, just set to 0 for convenience -// samples: totalSamples, -// } as EFPData - -// return { -// positions: positions, -// efpData: efpData, -// } -// }, -// component({ -// geneticElement, -// dispatch, -// activeData, -// state, -// }: ViewProps) { -// if (!geneticElement) return <> -// return ( -// <> -// -// -// -// dispatch({ type: 'toggle-mask-modal' })} -// onSubmit={(threshold) => -// dispatch({ -// type: 'set-mask-threshold', -// threshold: threshold, -// }) -// } -// /> -// -// ) -// }, -// icon: () => , -// description: '', -// // TODO: If dark theme is active, use ThumbnailDark -// citation({ gene }) { -// return
-// }, -// reducer: (state: WorldEFPState, action: WorldEFPAction) => { -// switch (action.type) { -// case 'toggle-color-mode': -// return { -// ...state, -// colorMode: -// state.colorMode == 'absolute' -// ? ('relative' as const) -// : ('absolute' as const), -// } -// case 'toggle-mask-modal': -// if (state.maskingEnabled) { -// return { -// ...state, -// maskingEnabled: !state.maskingEnabled, -// } -// } else { -// return { -// ...state, -// maskModalVisible: !state.maskModalVisible, -// } -// } -// case 'set-mask-threshold': -// return { -// ...state, -// maskThreshold: action.threshold, -// maskingEnabled: !state.maskingEnabled, -// maskModalVisible: !state.maskModalVisible, -// } -// case 'set-map-position': -// return { -// ...state, -// position: action.position, -// } -// case 'set-map-zoom': -// return { -// ...state, -// zoom: action.zoom, -// } -// default: -// return state -// } -// }, -// actions: [ -// { -// action: { type: 'reset-transform' }, -// render: () => <>Reset pan/zoom, -// }, -// { -// action: { type: 'toggle-color-mode' }, -// render: (props) => <>Toggle data mode: {props.state.colorMode}, -// }, -// { -// action: { type: 'toggle-mask-modal' }, -// render: () => <>Mask data, -// }, -// ], -// } -// export default WorldEFP +import WorldEFPIcon from './icon' +import { WorldEFPData, WorldEFPState } from './types' +const WorldEFP: ViewMetadata = { + name: 'World-EFP', + id: 'world-efp', + icon: () => , + description: '', + // TODO: If dark theme is active, use ThumbnailDark + citation({ gene }) { + return
+ }, + actions: [ + { + name: 'Toggle Color Mode', + description: 'Toggle between absolute and relative color modes', + icon: , + mutation: (prevState) => ({ + ...prevState, + colorMode: prevState.colorMode == 'absolute' ? 'relative' : 'absolute', + }), + }, + { + name: 'Toggle Masking', + description: 'Toggle colour masking', + icon: , + mutation: (prevState) => { + if (prevState.maskingEnabled) { + return { + ...prevState, + maskingEnabled: !prevState.maskingEnabled, + } + } else { + return { + ...prevState, + maskModalVisible: !prevState.maskModalVisible, + } + } + }, + }, + ] as StateAction[], +} +export default WorldEFP diff --git a/Eplant/views/WorldEFP/types.tsx b/Eplant/views/WorldEFP/types.tsx index 9c7ba1e..868f3a2 100644 --- a/Eplant/views/WorldEFP/types.tsx +++ b/Eplant/views/WorldEFP/types.tsx @@ -1,18 +1,27 @@ -import { ColorMode, EFPData } from '../eFP/types' +import { z } from 'zod' + +import { EFPData } from '../eFP/types' export type Coordinates = { lat: number; lng: number } -type MapTypeId = 'roadmap' | 'satellite' | 'hybrid' | 'terrain' +export const WorldEFPStateSchema = z.object({ + position: z + .object({ + lat: z.number().min(-90).max(90), + lng: z.number().min(-180).max(180), + }) + .default({ lat: 25, lng: 0 }), + zoom: z.number().min(0).max(22).default(2), + mapTypeId: z + .enum(['roadmap', 'satellite', 'hybrid', 'terrain']) + .default('roadmap'), + maskModalVisible: z.boolean().default(false), + maskingEnabled: z.boolean().default(false), + maskThreshold: z.number().min(0).max(100).default(100), + colorMode: z.enum(['absolute', 'relative']).default('absolute'), +}) -export type WorldEFPState = { - position: Coordinates - zoom: number - mapTypeId: MapTypeId - maskModalVisible: boolean - maskingEnabled: boolean - maskThreshold: number - colorMode: ColorMode -} +export type WorldEFPState = z.infer export type WorldEFPData = { positions: Coordinates[] @@ -23,7 +32,6 @@ export interface WorldEFPMicroArrayResponse { wasSuccessful: boolean data: { [key: string]: WorldEFPMicroArrayData } } - export interface WorldEFPMicroArrayData { source: string id: string @@ -34,6 +42,7 @@ export interface WorldEFPMicroArrayData { values: { [key: string]: number } code: string } + export type WorldEFPAction = | { type: 'toggle-color-mode' } | { type: 'toggle-masking' } From daab8274124495cb63a4d0e0ddc87aa765a8207e Mon Sep 17 00:00:00 2001 From: Yukthi Date: Mon, 5 Jan 2026 16:56:47 -0500 Subject: [PATCH 19/28] Fixing local url navigation --- index.html | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/index.html b/index.html index 6442196..dc22a37 100644 --- a/index.html +++ b/index.html @@ -6,8 +6,13 @@ + Eplant From e82cb7ed16210953812ac941d313bcc0e4ac55b9 Mon Sep 17 00:00:00 2001 From: Yukthi Date: Mon, 5 Jan 2026 17:36:36 -0500 Subject: [PATCH 20/28] Added state management and reconstruction from url params --- Eplant/views/WorldEFP/MapContainer.tsx | 25 +++++++++++-------------- Eplant/views/WorldEFP/WorldEFP.tsx | 8 +------- Eplant/views/WorldEFP/types.tsx | 10 ++++------ 3 files changed, 16 insertions(+), 27 deletions(-) diff --git a/Eplant/views/WorldEFP/MapContainer.tsx b/Eplant/views/WorldEFP/MapContainer.tsx index 2b405ec..559b3f5 100644 --- a/Eplant/views/WorldEFP/MapContainer.tsx +++ b/Eplant/views/WorldEFP/MapContainer.tsx @@ -1,9 +1,7 @@ -import { useCallback } from 'react' +import { useEffect } from 'react' -import { ViewDispatch } from '@eplant/View' import { useTheme } from '@mui/material' import { - APIProvider, Map, MapCameraChangedEvent, MapEvent, @@ -15,33 +13,32 @@ import GeneDistributionChart from '../eFP/Viewer/GeneDistributionChart' import Legend from '../eFP/Viewer/legend' import MapMarker from './MapMarker' -import { WorldEFPAction, WorldEFPData, WorldEFPState } from './types' +import { WorldEFPData, WorldEFPState } from './types' interface MapContainerProps { activeData: WorldEFPData state: WorldEFPState - dispatch: ViewDispatch + setState: (state: WorldEFPState) => void } -const MapContainer = ({ activeData, state, dispatch }: MapContainerProps) => { +const MapContainer = ({ activeData, state, setState }: MapContainerProps) => { const theme = useTheme() const map = useMap('WorldEFP') + // set map state on load from cache, url or default + useEffect(() => { + map?.moveCamera({ zoom: state.zoom, center: state.position }) + }, [map]) + const hangleDragEnd = (event: MapEvent) => { const mapPos = map?.getCenter() if (!mapPos) return const coords = { lat: mapPos.lat(), lng: mapPos.lng() } - dispatch({ - type: 'set-map-position', - position: coords, - }) + setState({ ...state, position: coords }) } const handleZoom = (event: MapCameraChangedEvent) => { - dispatch({ - type: 'set-map-zoom', - zoom: event.detail.zoom, - }) + setState({ ...state, zoom: event.detail.zoom }) } return ( diff --git a/Eplant/views/WorldEFP/WorldEFP.tsx b/Eplant/views/WorldEFP/WorldEFP.tsx index c568d8d..df6398d 100644 --- a/Eplant/views/WorldEFP/WorldEFP.tsx +++ b/Eplant/views/WorldEFP/WorldEFP.tsx @@ -74,13 +74,7 @@ export const WorldEFPView = () => { return ( <> - { - // TODO: implement reducer logic - }} - /> + Date: Thu, 8 Jan 2026 17:07:23 -0500 Subject: [PATCH 21/28] Fixed genedist chart --- Eplant/views/WorldEFP/MapContainer.tsx | 32 +++++++++++++++---- Eplant/views/WorldEFP/WorldEFP.tsx | 2 +- .../eFP/Viewer/GeneDistributionChart.tsx | 17 +++++++--- 3 files changed, 39 insertions(+), 12 deletions(-) diff --git a/Eplant/views/WorldEFP/MapContainer.tsx b/Eplant/views/WorldEFP/MapContainer.tsx index 559b3f5..4807d35 100644 --- a/Eplant/views/WorldEFP/MapContainer.tsx +++ b/Eplant/views/WorldEFP/MapContainer.tsx @@ -1,6 +1,7 @@ import { useEffect } from 'react' -import { useTheme } from '@mui/material' +import { Box, useTheme } from '@mui/material' +import { alpha } from '@mui/material/styles' import { Map, MapCameraChangedEvent, @@ -74,17 +75,36 @@ const MapContainer = ({ activeData, state, setState }: MapContainerProps) => { > ) })} - ({ position: 'absolute', left: theme.spacing(2), bottom: theme.spacing(4), zIndex: 10, + display: 'flex', + flexDirection: 'column', + alignItems: 'flex-start', + gap: theme.spacing(1), + padding: theme.spacing(1), + borderRadius: theme.spacing(1), + backgroundColor: alpha(theme.palette.background.active, 0.4), + boxShadow: '0 8px 24px rgba(0, 0, 0, 0.18)', + border: `1px solid ${alpha(theme.palette.background.edge, 0.7)}`, + backdropFilter: 'blur(8px)', + WebkitBackdropFilter: 'blur(8px)', })} - colorMode={'absolute'} - data={activeData.efpData} - > - + > + + + ) } diff --git a/Eplant/views/WorldEFP/WorldEFP.tsx b/Eplant/views/WorldEFP/WorldEFP.tsx index df6398d..2d9664a 100644 --- a/Eplant/views/WorldEFP/WorldEFP.tsx +++ b/Eplant/views/WorldEFP/WorldEFP.tsx @@ -10,12 +10,12 @@ import { useQuery } from '@tanstack/react-query' import { APIProvider } from '@vis.gl/react-google-maps' import { EFPData, EFPGroup } from '../eFP/types' +import GeneDistributionChart from '../eFP/Viewer/GeneDistributionChart' import MaskModal from '../eFP/Viewer/MaskModal' import MapContainer from './MapContainer' import { Coordinates, - WorldEFPAction, WorldEFPData, WorldEFPMicroArrayResponse, WorldEFPState, diff --git a/Eplant/views/eFP/Viewer/GeneDistributionChart.tsx b/Eplant/views/eFP/Viewer/GeneDistributionChart.tsx index b6afbc1..4513794 100644 --- a/Eplant/views/eFP/Viewer/GeneDistributionChart.tsx +++ b/Eplant/views/eFP/Viewer/GeneDistributionChart.tsx @@ -1,13 +1,19 @@ import * as React from 'react' -import { SVGProps, useEffect, useMemo, useState } from 'react' +import { useEffect, useState } from 'react' -import { useDarkMode } from '@eplant/state' -import { Mail } from '@mui/icons-material' import { useTheme } from '@mui/material' import { EFPData } from '../types' -const GeneDistributionChart = ({ data }: { data: EFPData }) => { +type GeneDistributionChartProps = { + data: EFPData + containerStyle?: React.CSSProperties +} + +const GeneDistributionChart = ({ + data, + containerStyle, +}: GeneDistributionChartProps) => { const theme = useTheme() const [geneRanking, setGeneRanking] = useState<{ [key: string]: string @@ -41,10 +47,11 @@ const GeneDistributionChart = ({ data }: { data: EFPData }) => { style={{ display: 'flex', flexDirection: 'column', - position: 'relative', + position: 'absolute', zIndex: 10, width: '100%', height: '10%', + ...containerStyle, }} > {geneRanking ? ( From 5485bda6c50586447cfa278419c4e04c45f3a179 Mon Sep 17 00:00:00 2001 From: Yukthi Date: Fri, 9 Jan 2026 10:43:18 -0500 Subject: [PATCH 22/28] Added map selector --- Eplant/views/WorldEFP/MapContainer.tsx | 19 +++- Eplant/views/WorldEFP/MapTypeSelector.tsx | 119 ++++++++++++++++++++++ Eplant/views/WorldEFP/index.tsx | 2 +- Eplant/views/WorldEFP/types.tsx | 8 -- 4 files changed, 138 insertions(+), 10 deletions(-) create mode 100644 Eplant/views/WorldEFP/MapTypeSelector.tsx diff --git a/Eplant/views/WorldEFP/MapContainer.tsx b/Eplant/views/WorldEFP/MapContainer.tsx index 4807d35..c9f331a 100644 --- a/Eplant/views/WorldEFP/MapContainer.tsx +++ b/Eplant/views/WorldEFP/MapContainer.tsx @@ -14,6 +14,7 @@ import GeneDistributionChart from '../eFP/Viewer/GeneDistributionChart' import Legend from '../eFP/Viewer/legend' import MapMarker from './MapMarker' +import MapTypeSelector from './MapTypeSelector' import { WorldEFPData, WorldEFPState } from './types' interface MapContainerProps { @@ -48,7 +49,7 @@ const MapContainer = ({ activeData, state, setState }: MapContainerProps) => { defaultZoom={2} mapId={import.meta.env.VITE_MAP_ID} streetViewControl={false} - mapTypeId={'roadmap'} + mapTypeId={state.mapTypeId} mapTypeControl={false} onDragend={hangleDragEnd} onZoomChanged={handleZoom} @@ -75,6 +76,22 @@ const MapContainer = ({ activeData, state, setState }: MapContainerProps) => { > ) })} + ({ + position: 'absolute', + left: theme.spacing(2), + top: theme.spacing(2), + zIndex: 10, + display: 'flex', + flexDirection: 'column', + gap: theme.spacing(1), + })} + > + setState({ ...state, mapTypeId })} + /> + ({ position: 'absolute', diff --git a/Eplant/views/WorldEFP/MapTypeSelector.tsx b/Eplant/views/WorldEFP/MapTypeSelector.tsx new file mode 100644 index 0000000..71709c5 --- /dev/null +++ b/Eplant/views/WorldEFP/MapTypeSelector.tsx @@ -0,0 +1,119 @@ +import { useState } from 'react' + +import MapIcon from '@mui/icons-material/Map' +import { Box, Button, Collapse } from '@mui/material' +import { alpha } from '@mui/material/styles' + +import { WorldEFPState } from './types' + +const MAP_TYPES = ['roadmap', 'satellite', 'hybrid', 'terrain'] as const + +type MapTypeSelectorProps = { + mapTypeId: WorldEFPState['mapTypeId'] + onSelect: (mapTypeId: WorldEFPState['mapTypeId']) => void +} + +const MapTypeSelector = ({ mapTypeId, onSelect }: MapTypeSelectorProps) => { + const [isOpen, setIsOpen] = useState(false) + + const handleMapTypeSelect = (nextType: WorldEFPState['mapTypeId']) => { + onSelect(nextType) + setIsOpen(false) + } + + const formatMapTypeLabel = (type: WorldEFPState['mapTypeId']) => + type.charAt(0).toUpperCase() + type.slice(1) + + return ( + ({ + width: isOpen ? theme.spacing(15) : theme.spacing(5), + borderRadius: theme.spacing(1), + backgroundColor: alpha(theme.palette.background.active, 0.7), + boxShadow: '0 8px 24px rgba(0, 0, 0, 0.18)', + border: `1px solid ${alpha(theme.palette.background.active, 0.7)}`, + backdropFilter: 'blur(8px)', + WebkitBackdropFilter: 'blur(8px)', + overflow: 'hidden', + transition: 'width 220ms ease, box-shadow 220ms ease', + })} + > + + + ({ + display: 'flex', + flexDirection: 'column', + gap: theme.spacing(0.5), + padding: theme.spacing(0.5, 1, 1), + })} + > + {MAP_TYPES.map((type) => ( + + ))} + + + + ) +} + +export default MapTypeSelector diff --git a/Eplant/views/WorldEFP/index.tsx b/Eplant/views/WorldEFP/index.tsx index e6f0a7b..4238042 100644 --- a/Eplant/views/WorldEFP/index.tsx +++ b/Eplant/views/WorldEFP/index.tsx @@ -1,7 +1,7 @@ import { StateAction, ViewMetadata } from '@eplant/View' +import { Map } from '@mui/icons-material' import BuildRoundedIcon from '@mui/icons-material/BuildRounded' import ColorLensIcon from '@mui/icons-material/ColorLens' -import MasksIcon from '@mui/icons-material/Masks' import WorldEFPIcon from './icon' import { WorldEFPData, WorldEFPState } from './types' diff --git a/Eplant/views/WorldEFP/types.tsx b/Eplant/views/WorldEFP/types.tsx index c0304ca..8dd9d50 100644 --- a/Eplant/views/WorldEFP/types.tsx +++ b/Eplant/views/WorldEFP/types.tsx @@ -40,11 +40,3 @@ export interface WorldEFPMicroArrayData { values: { [key: string]: number } code: string } - -export type WorldEFPAction = - | { type: 'toggle-color-mode' } - | { type: 'toggle-masking' } - | { type: 'toggle-mask-modal' } - | { type: 'set-mask-threshold'; threshold: number } - | { type: 'set-map-position'; position: Coordinates } - | { type: 'set-map-zoom'; zoom: number } From f0d7bbd871067bbe9eed4dc8ccca1ece128323cf Mon Sep 17 00:00:00 2001 From: Yukthi Date: Fri, 9 Jan 2026 10:45:00 -0500 Subject: [PATCH 23/28] formatting --- Eplant/views/WorldEFP/MapTypeSelector.tsx | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/Eplant/views/WorldEFP/MapTypeSelector.tsx b/Eplant/views/WorldEFP/MapTypeSelector.tsx index 71709c5..24daef9 100644 --- a/Eplant/views/WorldEFP/MapTypeSelector.tsx +++ b/Eplant/views/WorldEFP/MapTypeSelector.tsx @@ -86,17 +86,11 @@ const MapTypeSelector = ({ mapTypeId, onSelect }: MapTypeSelectorProps) => { color: theme.palette.text.primary, padding: theme.spacing(0.5, 1), '&:hover': { - backgroundColor: alpha( - theme.palette.background.active, - 0.45 - ), + backgroundColor: alpha(theme.palette.background.active, 0.45), }, ...(mapTypeId === type && { fontWeight: 600, - backgroundColor: alpha( - theme.palette.background.active, - 0.6 - ), + backgroundColor: alpha(theme.palette.background.active, 0.6), borderRadius: theme.spacing(0.75), '&:hover': { backgroundColor: alpha( From c6f7cf5d2f07e50147fa725fd8bb0025f412a581 Mon Sep 17 00:00:00 2001 From: Yukthi Date: Fri, 9 Jan 2026 10:46:48 -0500 Subject: [PATCH 24/28] Icon change --- Eplant/views/WorldEFP/index.tsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Eplant/views/WorldEFP/index.tsx b/Eplant/views/WorldEFP/index.tsx index 4238042..0d0a117 100644 --- a/Eplant/views/WorldEFP/index.tsx +++ b/Eplant/views/WorldEFP/index.tsx @@ -1,14 +1,13 @@ import { StateAction, ViewMetadata } from '@eplant/View' -import { Map } from '@mui/icons-material' import BuildRoundedIcon from '@mui/icons-material/BuildRounded' import ColorLensIcon from '@mui/icons-material/ColorLens' +import PublicIcon from '@mui/icons-material/Public' -import WorldEFPIcon from './icon' import { WorldEFPData, WorldEFPState } from './types' const WorldEFP: ViewMetadata = { name: 'World-EFP', id: 'world-efp', - icon: () => , + icon: () => , description: '', // TODO: If dark theme is active, use ThumbnailDark citation({ gene }) { From 028543eb3ffd7b1127975f7f0b1f53c6a4a11a70 Mon Sep 17 00:00:00 2001 From: Yukthi Date: Sun, 12 Apr 2026 17:32:16 -0400 Subject: [PATCH 25/28] Precipitation Overlay --- Eplant/views/WorldEFP/ClimateOverlay.tsx | 104 +++++++++++++++ Eplant/views/WorldEFP/MapContainer.tsx | 11 +- Eplant/views/WorldEFP/MapTypeSelector.tsx | 10 +- Eplant/views/WorldEFP/OverlaySelector.tsx | 120 ++++++++++++++++++ Eplant/views/WorldEFP/overlayTiles.ts | 48 +++++++ Eplant/views/WorldEFP/types.tsx | 28 +++- .../Annual_Precipitation&zoom=0&x=0&y=0.png | Bin 0 -> 13555 bytes .../Annual_Precipitation&zoom=1&x=0&y=0.png | Bin 0 -> 15982 bytes .../Annual_Precipitation&zoom=1&x=0&y=1.png | Bin 0 -> 4476 bytes .../Annual_Precipitation&zoom=1&x=1&y=0.png | Bin 0 -> 21583 bytes .../Annual_Precipitation&zoom=1&x=1&y=1.png | Bin 0 -> 5765 bytes .../Annual_Precipitation&zoom=2&x=0&y=0.png | Bin 0 -> 7940 bytes .../Annual_Precipitation&zoom=2&x=0&y=1.png | Bin 0 -> 16611 bytes .../Annual_Precipitation&zoom=2&x=0&y=2.png | Bin 0 -> 1939 bytes .../Annual_Precipitation&zoom=2&x=0&y=3.png | Bin 0 -> 425 bytes .../Annual_Precipitation&zoom=2&x=1&y=0.png | Bin 0 -> 14848 bytes .../Annual_Precipitation&zoom=2&x=1&y=1.png | Bin 0 -> 15180 bytes .../Annual_Precipitation&zoom=2&x=1&y=2.png | Bin 0 -> 9967 bytes .../Annual_Precipitation&zoom=2&x=1&y=3.png | Bin 0 -> 425 bytes .../Annual_Precipitation&zoom=2&x=2&y=0.png | Bin 0 -> 6653 bytes .../Annual_Precipitation&zoom=2&x=2&y=1.png | Bin 0 -> 34553 bytes .../Annual_Precipitation&zoom=2&x=2&y=2.png | Bin 0 -> 7602 bytes .../Annual_Precipitation&zoom=2&x=2&y=3.png | Bin 0 -> 425 bytes .../Annual_Precipitation&zoom=2&x=3&y=0.png | Bin 0 -> 9155 bytes .../Annual_Precipitation&zoom=2&x=3&y=1.png | Bin 0 -> 23386 bytes .../Annual_Precipitation&zoom=2&x=3&y=2.png | Bin 0 -> 8526 bytes .../Annual_Precipitation&zoom=2&x=3&y=3.png | Bin 0 -> 425 bytes public/temp_world_efp/tile-placeholder.png | Bin 0 -> 755 bytes 28 files changed, 309 insertions(+), 12 deletions(-) create mode 100644 Eplant/views/WorldEFP/ClimateOverlay.tsx create mode 100644 Eplant/views/WorldEFP/OverlaySelector.tsx create mode 100644 Eplant/views/WorldEFP/overlayTiles.ts create mode 100644 public/temp_world_efp/AnnualPrecip/Annual_Precipitation&zoom=0&x=0&y=0.png create mode 100644 public/temp_world_efp/AnnualPrecip/Annual_Precipitation&zoom=1&x=0&y=0.png create mode 100644 public/temp_world_efp/AnnualPrecip/Annual_Precipitation&zoom=1&x=0&y=1.png create mode 100644 public/temp_world_efp/AnnualPrecip/Annual_Precipitation&zoom=1&x=1&y=0.png create mode 100644 public/temp_world_efp/AnnualPrecip/Annual_Precipitation&zoom=1&x=1&y=1.png create mode 100644 public/temp_world_efp/AnnualPrecip/Annual_Precipitation&zoom=2&x=0&y=0.png create mode 100644 public/temp_world_efp/AnnualPrecip/Annual_Precipitation&zoom=2&x=0&y=1.png create mode 100644 public/temp_world_efp/AnnualPrecip/Annual_Precipitation&zoom=2&x=0&y=2.png create mode 100644 public/temp_world_efp/AnnualPrecip/Annual_Precipitation&zoom=2&x=0&y=3.png create mode 100644 public/temp_world_efp/AnnualPrecip/Annual_Precipitation&zoom=2&x=1&y=0.png create mode 100644 public/temp_world_efp/AnnualPrecip/Annual_Precipitation&zoom=2&x=1&y=1.png create mode 100644 public/temp_world_efp/AnnualPrecip/Annual_Precipitation&zoom=2&x=1&y=2.png create mode 100644 public/temp_world_efp/AnnualPrecip/Annual_Precipitation&zoom=2&x=1&y=3.png create mode 100644 public/temp_world_efp/AnnualPrecip/Annual_Precipitation&zoom=2&x=2&y=0.png create mode 100644 public/temp_world_efp/AnnualPrecip/Annual_Precipitation&zoom=2&x=2&y=1.png create mode 100644 public/temp_world_efp/AnnualPrecip/Annual_Precipitation&zoom=2&x=2&y=2.png create mode 100644 public/temp_world_efp/AnnualPrecip/Annual_Precipitation&zoom=2&x=2&y=3.png create mode 100644 public/temp_world_efp/AnnualPrecip/Annual_Precipitation&zoom=2&x=3&y=0.png create mode 100644 public/temp_world_efp/AnnualPrecip/Annual_Precipitation&zoom=2&x=3&y=1.png create mode 100644 public/temp_world_efp/AnnualPrecip/Annual_Precipitation&zoom=2&x=3&y=2.png create mode 100644 public/temp_world_efp/AnnualPrecip/Annual_Precipitation&zoom=2&x=3&y=3.png create mode 100644 public/temp_world_efp/tile-placeholder.png diff --git a/Eplant/views/WorldEFP/ClimateOverlay.tsx b/Eplant/views/WorldEFP/ClimateOverlay.tsx new file mode 100644 index 0000000..d6f7dc0 --- /dev/null +++ b/Eplant/views/WorldEFP/ClimateOverlay.tsx @@ -0,0 +1,104 @@ +import { useEffect, useRef } from 'react' + +import { useQuery } from '@tanstack/react-query' +import { useMap } from '@vis.gl/react-google-maps' + +import { fetchOverlayTiles, OverlayTileData } from './overlayTiles' +import { OverlayType } from './types' + +const PLACEHOLDER_TILE = '/temp_world_efp/tile-placeholder.png' + +/** + * Normalizes tile coordinates per Google Maps conventions. + * - Does NOT repeat across the y-axis (returns null for out-of-bounds y) + * - Wraps across the x-axis (world repeats horizontally) + * + * Ported from the original WorldView implementation. + */ +function normalizeTileCoord( + coord: google.maps.Point, + zoom: number +): { x: number; y: number } | null { + const tileRange = 1 << zoom + const y = coord.y + let x = coord.x + + if (y < 0 || y >= tileRange) return null + if (x < 0 || x >= tileRange) { + x = ((x % tileRange) + tileRange) % tileRange + } + return { x, y } +} + +interface ClimateOverlayProps { + overlay: OverlayType +} + +const ClimateOverlay = ({ overlay }: ClimateOverlayProps) => { + const map = useMap('WorldEFP') + + // Tile data is fetched independently — doesn't block the map from rendering. + const { data: tileData } = useQuery({ + queryKey: ['overlay-tiles', overlay], + queryFn: () => + fetchOverlayTiles(overlay as Exclude), + enabled: overlay !== OverlayType.None, + }) + + // Keep a ref to the latest tile data so the getTileUrl closure always reads + // the most recent data without needing to recreate the ImageMapType layer. + const tileDataRef = useRef(null) + useEffect(() => { + tileDataRef.current = tileData ?? null + }, [tileData]) + + // Keep a ref to the active layer so we can force a tile refresh when data loads. + const layerRef = useRef(null) + + // Register / unregister the ImageMapType layer whenever the overlay or map changes. + useEffect(() => { + if (!map || !window.google?.maps || overlay === OverlayType.None) return + + const layer = new window.google.maps.ImageMapType({ + getTileUrl: (coord: google.maps.Point, zoom: number): string | null => { + if (zoom > 8) return null + + const normalized = normalizeTileCoord(coord, zoom) + if (!normalized) return null + + const { x, y } = normalized + const tileMap = tileDataRef.current?.tileMap + const url = tileMap?.[`${zoom}_${x}_${y}`] + return url ?? PLACEHOLDER_TILE + }, + tileSize: new window.google.maps.Size(256, 256), + opacity: 0.7, + name: overlay, + }) + + layerRef.current = layer + map.overlayMapTypes.push(layer) + + return () => { + const index = map.overlayMapTypes.getArray().indexOf(layer) + if (index !== -1) map.overlayMapTypes.removeAt(index) + layerRef.current = null + } + }, [map, overlay]) + + // When tile data finishes loading, force a tile refresh by removing and + // re-inserting the layer at the same position so grey placeholders are replaced. + useEffect(() => { + if (!tileData || !map || !layerRef.current) return + const layer = layerRef.current + const index = map.overlayMapTypes.getArray().indexOf(layer) + if (index !== -1) { + map.overlayMapTypes.removeAt(index) + map.overlayMapTypes.insertAt(index, layer) + } + }, [tileData, map]) + + return null +} + +export default ClimateOverlay diff --git a/Eplant/views/WorldEFP/MapContainer.tsx b/Eplant/views/WorldEFP/MapContainer.tsx index c9f331a..3607fe0 100644 --- a/Eplant/views/WorldEFP/MapContainer.tsx +++ b/Eplant/views/WorldEFP/MapContainer.tsx @@ -13,9 +13,11 @@ import { getColor } from '../eFP/svg' import GeneDistributionChart from '../eFP/Viewer/GeneDistributionChart' import Legend from '../eFP/Viewer/legend' +import ClimateOverlay from './ClimateOverlay' import MapMarker from './MapMarker' import MapTypeSelector from './MapTypeSelector' -import { WorldEFPData, WorldEFPState } from './types' +import OverlaySelector from './OverlaySelector' +import { ColorMode, WorldEFPData, WorldEFPState } from './types' interface MapContainerProps { activeData: WorldEFPData @@ -55,6 +57,7 @@ const MapContainer = ({ activeData, state, setState }: MapContainerProps) => { onZoomChanged={handleZoom} id='WorldEFP' > + {activeData.positions.map((pos, index) => { const color = getColor( activeData.efpData.groups[index].mean, @@ -91,6 +94,10 @@ const MapContainer = ({ activeData, state, setState }: MapContainerProps) => { mapTypeId={state.mapTypeId} onSelect={(mapTypeId) => setState({ ...state, mapTypeId })} /> + setState({ ...state, overlay })} + /> ({ @@ -120,7 +127,7 @@ const MapContainer = ({ activeData, state, setState }: MapContainerProps) => { marginLeft: '-12px', }} /> - + ) diff --git a/Eplant/views/WorldEFP/MapTypeSelector.tsx b/Eplant/views/WorldEFP/MapTypeSelector.tsx index 24daef9..3fac5a1 100644 --- a/Eplant/views/WorldEFP/MapTypeSelector.tsx +++ b/Eplant/views/WorldEFP/MapTypeSelector.tsx @@ -4,9 +4,9 @@ import MapIcon from '@mui/icons-material/Map' import { Box, Button, Collapse } from '@mui/material' import { alpha } from '@mui/material/styles' -import { WorldEFPState } from './types' +import { MapTypeId, WorldEFPState } from './types' -const MAP_TYPES = ['roadmap', 'satellite', 'hybrid', 'terrain'] as const +const MAP_TYPES = Object.values(MapTypeId) type MapTypeSelectorProps = { mapTypeId: WorldEFPState['mapTypeId'] @@ -16,12 +16,12 @@ type MapTypeSelectorProps = { const MapTypeSelector = ({ mapTypeId, onSelect }: MapTypeSelectorProps) => { const [isOpen, setIsOpen] = useState(false) - const handleMapTypeSelect = (nextType: WorldEFPState['mapTypeId']) => { + const handleMapTypeSelect = (nextType: MapTypeId) => { onSelect(nextType) setIsOpen(false) } - const formatMapTypeLabel = (type: WorldEFPState['mapTypeId']) => + const formatMapTypeLabel = (type: MapTypeId) => type.charAt(0).toUpperCase() + type.slice(1) return ( @@ -79,7 +79,7 @@ const MapTypeSelector = ({ mapTypeId, onSelect }: MapTypeSelectorProps) => { + + ({ + display: 'flex', + flexDirection: 'column', + gap: theme.spacing(0.5), + padding: theme.spacing(0.5, 1, 1), + })} + > + {OVERLAY_TYPES.map((type) => ( + + ))} + + + + ) +} + +export default OverlaySelector diff --git a/Eplant/views/WorldEFP/overlayTiles.ts b/Eplant/views/WorldEFP/overlayTiles.ts new file mode 100644 index 0000000..ab85262 --- /dev/null +++ b/Eplant/views/WorldEFP/overlayTiles.ts @@ -0,0 +1,48 @@ +import { OverlayType } from './types' + +export type TileMap = Record // "zoom_x_y" -> URL + +export type OverlayTileData = { + tileMap: TileMap + maxZoom: number +} + +const BASE_PATH = '/temp_world_efp' + +/** + * Builds a tileMap by constructing public URLs for all tiles in a grid up to maxZoom. + * At each zoom level z the grid is 2^z x 2^z. + */ +function buildTileMap(dir: string, prefix: string, maxZoom: number): OverlayTileData { + const tileMap: TileMap = {} + for (let zoom = 0; zoom <= maxZoom; zoom++) { + const count = 1 << zoom + for (let x = 0; x < count; x++) { + for (let y = 0; y < count; y++) { + tileMap[`${zoom}_${x}_${y}`] = + `${BASE_PATH}/${dir}/${prefix}&zoom=${zoom}&x=${x}&y=${y}.png` + } + } + } + return { tileMap, maxZoom } +} + +/** + * Fetches overlay tile data for the given overlay type. + * + * Currently a mock backed by files in public/temp_world_efp. + * Replace each case body with a fetch() call to the real tile API endpoint + * when available — the return type stays the same. + */ +export async function fetchOverlayTiles( + overlay: Exclude +): Promise { + switch (overlay) { + case OverlayType.Precipitation: + return buildTileMap('AnnualPrecip', 'Annual_Precipitation', 2) + case OverlayType.HistoricalMinTemp: + return buildTileMap('HistMin', 'Historical_Min_Temp_of_coldest_Month', 2) + case OverlayType.HistoricalMaxTemp: + return buildTileMap('HistMax', 'Historical_Max_temp_of_warmest_month', 2) + } +} diff --git a/Eplant/views/WorldEFP/types.tsx b/Eplant/views/WorldEFP/types.tsx index 8dd9d50..89434f2 100644 --- a/Eplant/views/WorldEFP/types.tsx +++ b/Eplant/views/WorldEFP/types.tsx @@ -4,19 +4,37 @@ import { EFPData } from '../eFP/types' export type Coordinates = { lat: number; lng: number } +export enum MapTypeId { + Roadmap = 'roadmap', + Satellite = 'satellite', + Hybrid = 'hybrid', + Terrain = 'terrain', +} + +export enum ColorMode { + Absolute = 'absolute', + Relative = 'relative', +} + +export enum OverlayType { + None = 'None', + Precipitation = 'Precipitation', + HistoricalMinTemp = 'HistoricalMinTemp', + HistoricalMaxTemp = 'HistoricalMaxTemp', +} + export const WorldEFPStateSchema = z.object({ position: z.object({ lat: z.number().default(25), lng: z.number().default(0), }), - zoom: z.number().min(0).max(22).default(2), - mapTypeId: z - .enum(['roadmap', 'satellite', 'hybrid', 'terrain']) - .default('roadmap'), + zoom: z.number().min(0).max(8).default(2), + mapTypeId: z.nativeEnum(MapTypeId).default(MapTypeId.Roadmap), maskModalVisible: z.boolean().default(false), maskingEnabled: z.boolean().default(false), maskThreshold: z.number().min(0).max(100).default(100), - colorMode: z.enum(['absolute', 'relative']).default('absolute'), + colorMode: z.nativeEnum(ColorMode).default(ColorMode.Absolute), + overlay: z.nativeEnum(OverlayType).default(OverlayType.None), }) export type WorldEFPState = z.infer diff --git a/public/temp_world_efp/AnnualPrecip/Annual_Precipitation&zoom=0&x=0&y=0.png b/public/temp_world_efp/AnnualPrecip/Annual_Precipitation&zoom=0&x=0&y=0.png new file mode 100644 index 0000000000000000000000000000000000000000..ed5b940ee4e4b297e50474dc703fac87c17823ec GIT binary patch literal 13555 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 DxW+GU literal 0 HcmV?d00001 diff --git a/public/temp_world_efp/AnnualPrecip/Annual_Precipitation&zoom=1&x=0&y=0.png b/public/temp_world_efp/AnnualPrecip/Annual_Precipitation&zoom=1&x=0&y=0.png new file mode 100644 index 0000000000000000000000000000000000000000..05922f54fee024ca998fe46e1df86d345c008a79 GIT binary patch literal 15982 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 literal 0 HcmV?d00001 diff --git a/public/temp_world_efp/AnnualPrecip/Annual_Precipitation&zoom=1&x=1&y=0.png b/public/temp_world_efp/AnnualPrecip/Annual_Precipitation&zoom=1&x=1&y=0.png new file mode 100644 index 0000000000000000000000000000000000000000..e2829bd09919f831a3c0be827cb1ea23c2760ce3 GIT binary patch literal 21583 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 KMNUMnLSTX>YZlM| literal 0 HcmV?d00001 diff --git a/public/temp_world_efp/AnnualPrecip/Annual_Precipitation&zoom=1&x=1&y=1.png b/public/temp_world_efp/AnnualPrecip/Annual_Precipitation&zoom=1&x=1&y=1.png new file mode 100644 index 0000000000000000000000000000000000000000..2e3f1c265cf1cd0d2b3bb36f5be43086f25028de GIT binary patch literal 5765 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 literal 0 HcmV?d00001 diff --git a/public/temp_world_efp/AnnualPrecip/Annual_Precipitation&zoom=2&x=0&y=1.png b/public/temp_world_efp/AnnualPrecip/Annual_Precipitation&zoom=2&x=0&y=1.png new file mode 100644 index 0000000000000000000000000000000000000000..06f4bfc85c9f7ce55c0bfc9d71ad2a1e9e81c0d8 GIT binary patch literal 16611 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 literal 0 HcmV?d00001 diff --git a/public/temp_world_efp/AnnualPrecip/Annual_Precipitation&zoom=2&x=1&y=0.png b/public/temp_world_efp/AnnualPrecip/Annual_Precipitation&zoom=2&x=1&y=0.png new file mode 100644 index 0000000000000000000000000000000000000000..8c629e255f0c293891021b4c0f9fb4e91718051b GIT binary patch literal 14848 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 literal 0 HcmV?d00001 diff --git a/public/temp_world_efp/AnnualPrecip/Annual_Precipitation&zoom=2&x=1&y=2.png b/public/temp_world_efp/AnnualPrecip/Annual_Precipitation&zoom=2&x=1&y=2.png new file mode 100644 index 0000000000000000000000000000000000000000..e35543db6ca640d78d953c26c823ec99b5218d7a GIT binary patch literal 9967 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 literal 0 HcmV?d00001 diff --git a/public/temp_world_efp/AnnualPrecip/Annual_Precipitation&zoom=2&x=1&y=3.png b/public/temp_world_efp/AnnualPrecip/Annual_Precipitation&zoom=2&x=1&y=3.png new file mode 100644 index 0000000000000000000000000000000000000000..409583ed1054eeed2e0f7264aabe9a454a4240d4 GIT binary patch literal 425 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G!U;i$lZxy-8q?;Kn`1yx4R3& ze-K=-cll(X2xoyuWHAE+w=f7ZGR&GI0Tg5}@$_|NzsWAntEIU1qI3vQh@-?cqQp5r zH#aq}gyGwnY5RdDi+Z{^hE&{od(aSM?V$x<{oiJDEC4b`FsNW=v|(Vpq3O&53ItDA KKbLh*2~7Z++$@&> literal 0 HcmV?d00001 diff --git a/public/temp_world_efp/AnnualPrecip/Annual_Precipitation&zoom=2&x=2&y=0.png b/public/temp_world_efp/AnnualPrecip/Annual_Precipitation&zoom=2&x=2&y=0.png new file mode 100644 index 0000000000000000000000000000000000000000..db7bc4209413ad223060f43a3449da5774840e42 GIT binary patch literal 6653 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 IM6N<$f-E}2SpWb4 literal 0 HcmV?d00001 diff --git a/public/temp_world_efp/AnnualPrecip/Annual_Precipitation&zoom=2&x=2&y=2.png b/public/temp_world_efp/AnnualPrecip/Annual_Precipitation&zoom=2&x=2&y=2.png new file mode 100644 index 0000000000000000000000000000000000000000..477b10951e9650ce89ce85e791a0136be8095da9 GIT binary patch literal 7602 zcmd^E`8yQQ_r5d67)$mwlNquTLiT0IPPSA-Ws4#uOWBt}vSn|fERzyK5kl7NLdg;l zhOxDfC0myJ_4zZtpU?T_J*8y;ae$^Za3Vr-;m4FKXWMF0%V zA$XJ!Z2&+{S(@4CLjWKeKqdg$0ptY`2cQUmQUIO=P#Hiq0JQ+r0Z

BLGbSGzZWc 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 Qn<-$dZ?5-R*D><{0Q literal 0 HcmV?d00001 diff --git a/public/temp_world_efp/AnnualPrecip/Annual_Precipitation&zoom=2&x=3&y=0.png b/public/temp_world_efp/AnnualPrecip/Annual_Precipitation&zoom=2&x=3&y=0.png new file mode 100644 index 0000000000000000000000000000000000000000..caebf89d5dc0f19db8f4d6fd140397d2894d45b7 GIT binary patch literal 9155 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 W%d>y`c;?@#0?^eo(5O_mkNh8e>VaSY literal 0 HcmV?d00001 diff --git a/public/temp_world_efp/AnnualPrecip/Annual_Precipitation&zoom=2&x=3&y=1.png b/public/temp_world_efp/AnnualPrecip/Annual_Precipitation&zoom=2&x=3&y=1.png new file mode 100644 index 0000000000000000000000000000000000000000..8b5b02058d5f1e48512d55d95d314908bfecb6fa GIT binary patch literal 23386 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 literal 0 HcmV?d00001 diff --git a/public/temp_world_efp/AnnualPrecip/Annual_Precipitation&zoom=2&x=3&y=3.png b/public/temp_world_efp/AnnualPrecip/Annual_Precipitation&zoom=2&x=3&y=3.png new file mode 100644 index 0000000000000000000000000000000000000000..409583ed1054eeed2e0f7264aabe9a454a4240d4 GIT binary patch literal 425 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G!U;i$lZxy-8q?;Kn`1yx4R3& ze-K=-cll(X2xoyuWHAE+w=f7ZGR&GI0Tg5}@$_|NzsWAntEIU1qI3vQh@-?cqQp5r zH#aq}gyGwnY5RdDi+Z{^hE&{od(aSM?V$x<{oiJDEC4b`FsNW=v|(Vpq3O&53ItDA KKbLh*2~7Z++$@&> literal 0 HcmV?d00001 diff --git a/public/temp_world_efp/tile-placeholder.png b/public/temp_world_efp/tile-placeholder.png new file mode 100644 index 0000000000000000000000000000000000000000..fa0a641021cd14d42420cd3facc2a3bd15a03d89 GIT binary patch literal 755 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911L)MWvCLk0$>U7jwEAr*7pUN!{EaWoht zOW&7}%i*k;(YoO$UxPoJ!dZqTk_{%z6Vezi@i@$4^e|?~92Fc5kO5B&w-_^OMI~Q- S_D=#PW(H4JKbLh*2~7ZQXVohJ literal 0 HcmV?d00001 From ec5e3e51bfc2e6a96eb6c041dc4a12843c4996d6 Mon Sep 17 00:00:00 2001 From: Yukthi Date: Wed, 15 Apr 2026 20:36:24 -0400 Subject: [PATCH 26/28] Climate legends --- Eplant/views/WorldEFP/MapContainer.tsx | 49 ++++++---- Eplant/views/WorldEFP/OverlayLegend.tsx | 107 ++++++++++++++++++++++ Eplant/views/WorldEFP/OverlaySelector.tsx | 3 +- public/img/climateLegend.png | Bin 0 -> 3457 bytes public/img/climateLegendFlip.png | Bin 0 -> 3463 bytes 5 files changed, 139 insertions(+), 20 deletions(-) create mode 100644 Eplant/views/WorldEFP/OverlayLegend.tsx create mode 100644 public/img/climateLegend.png create mode 100644 public/img/climateLegendFlip.png diff --git a/Eplant/views/WorldEFP/MapContainer.tsx b/Eplant/views/WorldEFP/MapContainer.tsx index 3607fe0..747fc1b 100644 --- a/Eplant/views/WorldEFP/MapContainer.tsx +++ b/Eplant/views/WorldEFP/MapContainer.tsx @@ -16,6 +16,7 @@ import Legend from '../eFP/Viewer/legend' import ClimateOverlay from './ClimateOverlay' import MapMarker from './MapMarker' import MapTypeSelector from './MapTypeSelector' +import OverlayLegend from './OverlayLegend' import OverlaySelector from './OverlaySelector' import { ColorMode, WorldEFPData, WorldEFPState } from './types' @@ -106,28 +107,38 @@ const MapContainer = ({ activeData, state, setState }: MapContainerProps) => { bottom: theme.spacing(4), zIndex: 10, display: 'flex', - flexDirection: 'column', - alignItems: 'flex-start', + flexDirection: 'row', + alignItems: 'flex-end', gap: theme.spacing(1), - padding: theme.spacing(1), - borderRadius: theme.spacing(1), - backgroundColor: alpha(theme.palette.background.active, 0.4), - boxShadow: '0 8px 24px rgba(0, 0, 0, 0.18)', - border: `1px solid ${alpha(theme.palette.background.edge, 0.7)}`, - backdropFilter: 'blur(8px)', - WebkitBackdropFilter: 'blur(8px)', })} > - - + ({ + display: 'flex', + flexDirection: 'column', + alignItems: 'flex-start', + gap: theme.spacing(1), + padding: theme.spacing(1), + borderRadius: theme.spacing(1), + backgroundColor: alpha(theme.palette.background.active, 0.4), + boxShadow: '0 8px 24px rgba(0, 0, 0, 0.18)', + border: `1px solid ${alpha(theme.palette.background.edge, 0.7)}`, + backdropFilter: 'blur(8px)', + WebkitBackdropFilter: 'blur(8px)', + })} + > + + + + ) diff --git a/Eplant/views/WorldEFP/OverlayLegend.tsx b/Eplant/views/WorldEFP/OverlayLegend.tsx new file mode 100644 index 0000000..242f9bd --- /dev/null +++ b/Eplant/views/WorldEFP/OverlayLegend.tsx @@ -0,0 +1,107 @@ +import { Box, Typography } from '@mui/material' +import { alpha } from '@mui/material/styles' + +import { OverlayType } from './types' + +interface OverlayLegendConfig { + title: [string, string] + imageSrc: string + max: string + min: string +} + +const LEGEND_CONFIG: Record< + Exclude, + OverlayLegendConfig +> = { + [OverlayType.Precipitation]: { + title: ['Annual', 'Precipitation'], + imageSrc: '/img/climateLegend.png', + max: '10577 mm', + min: '13 mm', + }, + [OverlayType.HistoricalMinTemp]: { + title: ['Minimum', 'Temperature'], + imageSrc: '/img/climateLegendFlip.png', + max: '31.9 °C', + min: '-27.8 °C', + }, + [OverlayType.HistoricalMaxTemp]: { + title: ['Maximum', 'Temperature'], + imageSrc: '/img/climateLegendFlip.png', + max: '31.9 °C', + min: '-27.8 °C', + }, +} + +interface OverlayLegendProps { + overlay: OverlayType +} + +const OverlayLegend = ({ overlay }: OverlayLegendProps) => { + if (overlay === OverlayType.None) return null + + const { title, imageSrc, max, min } = LEGEND_CONFIG[overlay] + + return ( + ({ + display: 'flex', + flexDirection: 'column', + alignItems: 'flex-start', + gap: theme.spacing(0.5), + padding: theme.spacing(1), + borderRadius: theme.spacing(1), + backgroundColor: alpha(theme.palette.background.active, 0.4), + boxShadow: '0 8px 24px rgba(0, 0, 0, 0.18)', + border: `1px solid ${alpha(theme.palette.background.edge, 0.7)}`, + backdropFilter: 'blur(8px)', + WebkitBackdropFilter: 'blur(8px)', + })} + > + {/* Title */} + + {title.map((line) => ( + ({ + display: 'block', + color: theme.palette.text.primary, + fontWeight: 600, + lineHeight: 1.2, + })} + > + {line} + + ))} + + + {/* Scale image with max/min labels */} + + + + + {max} + + + {min} + + + + + ) +} + +export default OverlayLegend diff --git a/Eplant/views/WorldEFP/OverlaySelector.tsx b/Eplant/views/WorldEFP/OverlaySelector.tsx index 65f0aa5..d8a11f6 100644 --- a/Eplant/views/WorldEFP/OverlaySelector.tsx +++ b/Eplant/views/WorldEFP/OverlaySelector.tsx @@ -31,7 +31,7 @@ const OverlaySelector = ({ overlay, onSelect }: OverlaySelectorProps) => { return ( ({ - width: isOpen ? theme.spacing(15) : theme.spacing(5), + width: isOpen ? theme.spacing(20) : theme.spacing(5), borderRadius: theme.spacing(1), backgroundColor: alpha(theme.palette.background.active, 0.7), boxShadow: '0 8px 24px rgba(0, 0, 0, 0.18)', @@ -80,6 +80,7 @@ const OverlaySelector = ({ overlay, onSelect }: OverlaySelectorProps) => { flexDirection: 'column', gap: theme.spacing(0.5), padding: theme.spacing(0.5, 1, 1), + minWidth: theme.spacing(20), })} > {OVERLAY_TYPES.map((type) => ( diff --git a/public/img/climateLegend.png b/public/img/climateLegend.png new file mode 100644 index 0000000000000000000000000000000000000000..69f06122fccb49899330acabe44f9e29aa8e72d6 GIT binary patch literal 3457 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 XIua2dw&zHs&NyIVV5wgRb&dZ&c?u>< literal 0 HcmV?d00001 diff --git a/public/img/climateLegendFlip.png b/public/img/climateLegendFlip.png new file mode 100644 index 0000000000000000000000000000000000000000..3842c0daf2cd7ca30c20fc987e6c6728a07ac3f1 GIT binary patch literal 3463 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 literal 0 HcmV?d00001 From 1067a95e54b3dd38738148f2bf632586ffed1a91 Mon Sep 17 00:00:00 2001 From: Yukthi Date: Wed, 15 Apr 2026 20:40:52 -0400 Subject: [PATCH 27/28] Fixed rendering of info --- Eplant/views/WorldEFP/InfoContent.tsx | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Eplant/views/WorldEFP/InfoContent.tsx b/Eplant/views/WorldEFP/InfoContent.tsx index 534e57a..217aed8 100644 --- a/Eplant/views/WorldEFP/InfoContent.tsx +++ b/Eplant/views/WorldEFP/InfoContent.tsx @@ -11,7 +11,14 @@ const InfoContent = ({ id, mean, std, sampleSize }: InfoContentProps) => { return (

- {id} + + {id.split(//i).map((line, i, arr) => ( + + {line} + {i < arr.length - 1 &&
} +
+ ))} +

Mean: {mean.toFixed(2)}

Standard error: {std.toFixed(2)}

From c0222f2f94c12283ead43d04e9c4e36dfde84d0f Mon Sep 17 00:00:00 2001 From: Yukthi Date: Wed, 15 Apr 2026 20:49:15 -0400 Subject: [PATCH 28/28] Max zoom capped at 8 --- Eplant/views/WorldEFP/MapContainer.tsx | 1 + Eplant/views/WorldEFP/overlayTiles.ts | 11 ++++++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/Eplant/views/WorldEFP/MapContainer.tsx b/Eplant/views/WorldEFP/MapContainer.tsx index 747fc1b..4a3aa7d 100644 --- a/Eplant/views/WorldEFP/MapContainer.tsx +++ b/Eplant/views/WorldEFP/MapContainer.tsx @@ -50,6 +50,7 @@ const MapContainer = ({ activeData, state, setState }: MapContainerProps) => {