Merge branch 'main' into 'add/widgets/conditional-deleting'

# Conflicts:
#   client/src/components/layout/Canvas/views/DashboardCanvas.jsx
This commit is contained in:
2025-07-28 19:45:54 +00:00
6 changed files with 37 additions and 24 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 />}
@@ -10,16 +10,10 @@ import { useState, useEffect, useDebugValue } from "react";
import { CancelButton } from "../components/CancelButton"; import { CancelButton } from "../components/CancelButton";
import { SaveButton } from "../components/SaveButton"; import { SaveButton } from "../components/SaveButton";
export function DashboardCanvas() { export function DashboardCanvas({ layout, setLayout, onLayoutChange }) {
console.log("rendering dashboardcanvas");
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 [isDelete, setIsDelete] = useState(false); const [isDelete, setIsDelete] = useState(false);
const [newCounter, setNewCounter] = useState(3); const [newCounter, setNewCounter] = useState(3);
const [layout, setLayout] = useState([
{ 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: '2', x: 6, y: 0, w: 3, h: 3, minH: 3, minW: 1, static: !isEditable }
]);
const [originalLayout, setOriginalLayout] = useState([]); const [originalLayout, setOriginalLayout] = useState([]);
const onAddWidget = () => { const onAddWidget = () => {
@@ -85,11 +79,6 @@ export function DashboardCanvas() {
setLayout(layout => layout.filter(w => w.i !== id)); setLayout(layout => layout.filter(w => w.i !== id));
} }
const onLayoutChange = (newLayout) => {
setLayout(newLayout);
console.log('Updated layout:', newLayout)
};
return ( return (
/* HEADER */ /* HEADER */
<Tabs.Root lazyMount defaultValue="my dashboard"> <Tabs.Root lazyMount defaultValue="my dashboard">
@@ -97,7 +86,7 @@ export function DashboardCanvas() {
as="header" as="header"
position="sticky" position="sticky"
top="0" top="0"
zIndex="banner" zIndex="dropdown" // zIndex: 1100
bg="base200" bg="base200"
px={6} px={6}
py={3} py={3}
@@ -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!
+11 -1
View File
@@ -11,6 +11,11 @@ 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 }
]);
return ( return (
<> <>
@@ -62,7 +67,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>
</> </>
@@ -18,7 +18,8 @@ export default function UserAvatarMenu({ name, avatar }) {
</Box> </Box>
</Menu.Trigger> </Menu.Trigger>
<Portal> <Portal>
<Menu.Positioner zIndex="popover"> {/* zIndex: overlay = 1300 */}
<Menu.Positioner zIndex="overlay">
<Menu.Content> <Menu.Content>
<Menu.Item value="account">Account</Menu.Item> <Menu.Item value="account">Account</Menu.Item>
<Menu.Item value="settings">Settings</Menu.Item> <Menu.Item value="settings">Settings</Menu.Item>
@@ -1,5 +1,6 @@
import { useSlotRecipe, Box, Button, createIcon, CloseButton, IconButton, Stack, useDisclosure, Tooltip } from "@chakra-ui/react"; import { useSlotRecipe, Box, Button, createIcon, CloseButton, IconButton } from "@chakra-ui/react";
import { ColorModeButton } from "@/components/ui/color-mode"; import { ColorModeButton } from "@/components/ui/color-mode";
import { Tooltip } from "@/components/ui/tooltip";
import { FaVolcano } from "react-icons/fa6"; import { FaVolcano } from "react-icons/fa6";
import { RxHamburgerMenu } from "react-icons/rx"; import { RxHamburgerMenu } from "react-icons/rx";
import { useState } from "react"; import { useState } from "react";
@@ -96,8 +97,9 @@ export default function Sidebar({ onChangeView }) {
{buttons.map((button, idx) => { {buttons.map((button, idx) => {
const Icon = button.icon; const Icon = button.icon;
return ( const buttonElement = (
<Button key={idx} <Button
// key={idx}
css={styles.buttons} css={styles.buttons}
onClick={() => { onClick={() => {
setActiveButton(idx); setActiveButton(idx);
@@ -119,9 +121,17 @@ export default function Sidebar({ onChangeView }) {
{button.name} {button.name}
</span> </span>
</Button> </Button>
) );
// console.log("buttonElement is:", buttonElement)
console.log("Returning:", !isOpen ? "Tooltip" : "Button", buttonElement);
return !isOpen ? (
<Tooltip key={ idx } content={ button.name } placement="right" hasArrow>
{ buttonElement }
</Tooltip>
) : (
buttonElement
);
})} })}
<ColorModeButton position="absolute" bottom="2"/> <ColorModeButton position="absolute" bottom="2"/>
</Box> </Box>
); );