Add persistant widget state across sidebar 'dashboard' button and canvas header nav 'my dashboard' button

This commit is contained in:
Daniel S. Hansen
2025-07-25 13:19:09 -07:00
parent 2544d1bbdb
commit 5f17293ac6
4 changed files with 33 additions and 15 deletions
@@ -9,10 +9,15 @@ import VolcanoCanvas from "./views/VolcanoCanvas";
import AdminCanvas from "./views/AdminCanvas"; import AdminCanvas from "./views/AdminCanvas";
import { DashboardCanvas } from "./views/DashboardCanvas"; import { DashboardCanvas } from "./views/DashboardCanvas";
export default function Canvas({ view }) { export default function Canvas({ view, layout, setLayout, onLayoutChange }) {
return ( return (
<Box height="100%" width="100%"> <Box height="100%" width="100%">
{view === "widget" && <DashboardCanvas />} {view === "widget" &&
<DashboardCanvas
layout={ layout }
setLayout={ setLayout }
onLayoutChange={ onLayoutChange }
/>}
{view === "global" && <GlobalMapCanvas />} {view === "global" && <GlobalMapCanvas />}
{view === "regional" && <RegionalMapCanvas />} {view === "regional" && <RegionalMapCanvas />}
{view === "volcano" && <VolcanoCanvas />} {view === "volcano" && <VolcanoCanvas />}
@@ -8,14 +8,14 @@ import { Seismic } from "./DashboardCanvasNav/Seismic";
import { RemoteSensing } from "./DashboardCanvasNav/RemoteSensing"; import { RemoteSensing } from "./DashboardCanvasNav/RemoteSensing";
import { useState, useEffect } from "react"; import { useState, useEffect } from "react";
export function DashboardCanvas() { export function DashboardCanvas({ layout, setLayout, onLayoutChange }) {
const [isEditable, setIsEditable] = useState(false); // editable=true means static=false (vice versa) const [isEditable, setIsEditable] = useState(false); // editable=true means static=false (vice versa)
const [newCounter, setNewCounter] = useState(3); const [newCounter, setNewCounter] = useState(3);
const [layout, setLayout] = useState([ // const [layout, setLayout] = useState([
{ i: '0', x: 0, y: 0, w: 3, h: 3, minH: 3, minW: 1, static: !isEditable }, // { i: '0', x: 0, y: 0, w: 3, h: 3, minH: 3, minW: 1, static: !isEditable },
{ i: '1', x: 3, y: 0, w: 3, h: 3, minH: 3, minW: 1, static: !isEditable }, // { i: '1', x: 3, y: 0, w: 3, h: 3, minH: 3, minW: 1, static: !isEditable },
{ i: '2', x: 6, y: 0, w: 3, h: 3, minH: 3, minW: 1, static: !isEditable } // { i: '2', x: 6, y: 0, w: 3, h: 3, minH: 3, minW: 1, static: !isEditable }
]); // ]);
const [originalLayout, setOriginalLayout] = useState([]); const [originalLayout, setOriginalLayout] = useState([]);
useEffect(() => { useEffect(() => {
@@ -68,10 +68,10 @@ export function DashboardCanvas() {
setLayout(prev => prev.filter(w => w.i !== id)); setLayout(prev => prev.filter(w => w.i !== id));
} }
const onLayoutChange = (newLayout) => { // const onLayoutChange = (newLayout) => {
setLayout(newLayout); // setLayout(newLayout);
console.log('Updated layout:', newLayout) // console.log('Updated layout:', newLayout)
}; // };
return ( return (
/* HEADER */ /* HEADER */
@@ -14,8 +14,6 @@ export default function RegionalMapCanvas() {
display="flex" display="flex"
alignItems="center" alignItems="center"
justifyContent="center" justifyContent="center"
> >
<Text fontsize="2xl" fontWeight="bold" color="gray.700"> <Text fontsize="2xl" fontWeight="bold" color="gray.700">
Regional Map Canvas coming soon! Regional Map Canvas coming soon!
+16 -1
View File
@@ -11,6 +11,16 @@ export default function Dashboard() {
// Lifted State - defaults to widget dashboard // Lifted State - defaults to widget dashboard
const [view, setView] = useState("widget"); const [view, setView] = useState("widget");
const [layout, setLayout] = useState([
{ i: '0', x: 0, y: 0, w: 3, h: 3, minH: 3, minW: 1, static: true },
{ i: '1', x: 3, y: 0, w: 3, h: 3, minH: 3, minW: 1, static: true },
{ i: '2', x: 6, y: 0, w: 3, h: 3, minH: 3, minW: 1, static: true }
]);
const onLayoutChange = (newLayout) => {
setLayout(newLayout);
console.log('Updated layout:', newLayout)
};
return ( return (
<> <>
@@ -62,7 +72,12 @@ export default function Dashboard() {
<Sidebar onChangeView={ setView }/> <Sidebar onChangeView={ setView }/>
</GridItem> </GridItem>
<GridItem colSpan={1} width="100%" overflow="auto"> <GridItem colSpan={1} width="100%" overflow="auto">
<Canvas view={ view }/> <Canvas
view={ view }
layout={ layout }
setLayout={ setLayout }
onLayoutChange={( newLayout ) => setLayout( newLayout )}
/>
</GridItem> </GridItem>
</Grid> </Grid>
</> </>