2025-07-23 11:01:25 -07:00
|
|
|
import { Global, css } from "@emotion/react";
|
|
|
|
|
import Header from './Header/Header.jsx';
|
|
|
|
|
import Sidebar from './Sidebar/Sidebar.jsx';
|
|
|
|
|
import Canvas from './Canvas/Canvas.jsx';
|
2025-07-23 11:35:28 -07:00
|
|
|
import { Grid, GridItem, useRecipe } from '@chakra-ui/react';
|
|
|
|
|
import { useState } from 'react';
|
2025-07-23 11:01:25 -07:00
|
|
|
|
|
|
|
|
export default function Dashboard() {
|
2025-07-28 13:32:03 -07:00
|
|
|
const recipe = useRecipe({ key: "dashboard" });
|
2025-07-23 11:01:25 -07:00
|
|
|
const styles = recipe();
|
|
|
|
|
|
2025-07-31 08:56:32 -07:00
|
|
|
const [darkMode, setDarkMode] = useState(false);
|
2025-07-31 12:23:45 -07:00
|
|
|
const [isEditable, setIsEditable] = useState(false); // editable=true means static=false (vice versa)
|
|
|
|
|
const [isDelete, setIsDelete] = useState(false);
|
|
|
|
|
const [originalLayout, setOriginalLayout] = useState([]);
|
2025-07-23 11:35:28 -07:00
|
|
|
const [view, setView] = useState("widget");
|
2025-07-25 13:19:09 -07:00
|
|
|
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 }
|
|
|
|
|
]);
|
|
|
|
|
|
2025-07-31 12:40:46 -07:00
|
|
|
const onCancel = () => {
|
|
|
|
|
console.log("canceling changes...");
|
|
|
|
|
if (originalLayout.length) {
|
|
|
|
|
setLayout(originalLayout.map(item => ({
|
|
|
|
|
...item,
|
|
|
|
|
static: true
|
|
|
|
|
})));
|
|
|
|
|
};
|
|
|
|
|
setIsEditable(false);
|
|
|
|
|
setIsDelete(false);
|
|
|
|
|
setOriginalLayout([]);
|
|
|
|
|
}
|
|
|
|
|
|
2025-07-31 12:23:45 -07:00
|
|
|
// Prevent navigation while in Edit mode without saving or cancelling
|
|
|
|
|
const handleViewChange = (nextView) => {
|
|
|
|
|
if (view === "widget" && isEditable) {
|
|
|
|
|
const confirmed = window.confirm(
|
|
|
|
|
"You have unsaved changes. Discard them and continue?"
|
|
|
|
|
);
|
|
|
|
|
if (!confirmed) return;
|
|
|
|
|
onCancel(); // Discards the layout
|
|
|
|
|
}
|
|
|
|
|
setView(nextView);
|
|
|
|
|
};
|
|
|
|
|
|
2025-07-23 11:01:25 -07:00
|
|
|
return (
|
2025-07-23 21:31:18 +00:00
|
|
|
<>
|
|
|
|
|
<Grid css={styles}
|
|
|
|
|
templateRows="1fr 11fr"
|
|
|
|
|
templateColumns="1fr 20fr"
|
|
|
|
|
height="100vh"
|
|
|
|
|
width="100vw"
|
|
|
|
|
>
|
|
|
|
|
<GridItem rowSpan={1} colSpan={2}>
|
2025-07-29 14:47:03 -07:00
|
|
|
<Header
|
|
|
|
|
view={ view }
|
|
|
|
|
setView={ setView }
|
2025-07-31 12:23:45 -07:00
|
|
|
onChangeView={ handleViewChange }
|
2025-07-29 14:47:03 -07:00
|
|
|
/>
|
2025-07-23 21:31:18 +00:00
|
|
|
</GridItem>
|
|
|
|
|
<GridItem colSpan={1}>
|
2025-07-29 09:59:17 -07:00
|
|
|
<Sidebar
|
2025-07-31 08:56:32 -07:00
|
|
|
darkMode={ darkMode }
|
|
|
|
|
setDarkMode={ setDarkMode }
|
2025-07-29 09:59:17 -07:00
|
|
|
view={ view }
|
2025-07-31 12:23:45 -07:00
|
|
|
onChangeView={ handleViewChange }
|
|
|
|
|
isEditabe={ isEditable }
|
2025-07-29 14:47:03 -07:00
|
|
|
/>
|
2025-07-23 21:31:18 +00:00
|
|
|
</GridItem>
|
2025-07-24 13:48:41 -07:00
|
|
|
<GridItem colSpan={1} width="100%" overflow="auto">
|
2025-07-25 13:19:09 -07:00
|
|
|
<Canvas
|
2025-07-31 08:56:32 -07:00
|
|
|
darkMode={ darkMode }
|
2025-07-25 13:19:09 -07:00
|
|
|
view={ view }
|
2025-07-29 09:59:17 -07:00
|
|
|
setView={ setView }
|
2025-07-25 13:19:09 -07:00
|
|
|
layout={ layout }
|
|
|
|
|
setLayout={ setLayout }
|
2025-07-31 12:23:45 -07:00
|
|
|
originalLayout={ originalLayout }
|
|
|
|
|
setOriginalLayout={ setOriginalLayout }
|
2025-07-25 13:19:09 -07:00
|
|
|
onLayoutChange={( newLayout ) => setLayout( newLayout )}
|
2025-07-31 12:23:45 -07:00
|
|
|
onChangeView={ handleViewChange }
|
2025-07-31 12:40:46 -07:00
|
|
|
onCancel={ onCancel }
|
2025-07-31 12:23:45 -07:00
|
|
|
isEditable={ isEditable }
|
|
|
|
|
setIsEditable={ setIsEditable }
|
|
|
|
|
isDelete={ isDelete }
|
|
|
|
|
setIsDelete={ setIsDelete }
|
2025-07-25 13:19:09 -07:00
|
|
|
/>
|
2025-07-23 21:31:18 +00:00
|
|
|
</GridItem>
|
|
|
|
|
</Grid>
|
2025-07-23 11:01:25 -07:00
|
|
|
</>
|
|
|
|
|
);
|
2025-07-23 21:31:18 +00:00
|
|
|
}
|