Merge branch 'main' into 'add/widgets/conditional-deleting'
# Conflicts: # client/src/components/layout/Canvas/views/DashboardCanvas.jsx
This commit is contained in:
@@ -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,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>
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user