Merge branch 'feature/first-widget-button' into 'main'

Feature/first widget button

See merge request vkuchenik/website-framework!57
This commit is contained in:
Dan Hansen
2025-08-11 19:20:32 +00:00
4 changed files with 87 additions and 18 deletions
@@ -0,0 +1,50 @@
import { Box, Heading, Center, Menu, Portal, Flex } from '@chakra-ui/react'
import AlertLevel from './AlertLevelWidget'
// import AddWidgetMenu from './AddWidgetMenu';
export default function FirstWidgetButton({ appendWidget }) {
return (
<Menu.Root positioning={{ placement: "bottom-middle" }} >
<Menu.Trigger asChild>
<Box
p={6}
m="auto"
mt={6}
align="center"
textAlign="center"
justify="center"
width="400px"
borderRadius="md"
boxShadow="md"
border="2px dashed"
borderColor="gray.300"
bg="gray.50"
cursor="pointer"
_hover = {{
bg: "gray.100",
borderColor: "gray.400",
boxShadow: "lg",
}}
>
Add First Widget
</Box>
</Menu.Trigger>
<Portal>
<Menu.Positioner>
<Menu.Content>
<Menu.Item
value="AlertLevel"
onClick={() => appendWidget(AlertLevel, 3, 6, 3, 6, 3, 6)}
>
Alert Level
</Menu.Item>
<Menu.Item value="co2">CO2</Menu.Item>
<Menu.Item value="ivans">IVANS</Menu.Item>
<Menu.Item value="plume heights">Plume Heights</Menu.Item>
<Menu.Item value="alert level changes">Alert Level Changes</Menu.Item>
</Menu.Content>
</Menu.Positioner>
</Portal>
</Menu.Root>
);
}
+1 -2
View File
@@ -11,7 +11,6 @@ import { SaveButton } from "../CanvasComponents/SaveButton";
import DeleteAllButton from "../CanvasComponents/DeleteAllButton";
import { v4 as uuid } from 'uuid';
export default function Home({...props}) {
// deconstructing props
const { view, layout, setLayout, setOriginalLayout, onLayoutChange, onChangeView, onCancel,
@@ -99,7 +98,7 @@ export default function Home({...props}) {
}
// Prop Forwarding
const MyDashboardProps = { layout, onLayoutChange, isEditable, isDelete, DeleteWidget, widgetArray };
const MyDashboardProps = { layout, onLayoutChange, isEditable, isDelete, DeleteWidget, widgetArray, appendWidget };
const settingsButtonProps = { onEditWidgets, onDeleteWidgets, appendWidget };
return (
@@ -1,8 +1,9 @@
import GridLayout, { WidthProvider } from 'react-grid-layout';
import { useSlotRecipe, chakra, Flex } from '@chakra-ui/react';
import CustomResizeHandle from '../../CanvasComponents/CustomResizeHandle';
import FirstWidgetButton from '../../CanvasComponents/FirstWidgetButton';
export default function MyDashboard({layout, onLayoutChange, isEditable, isDelete, DeleteWidget, widgetArray}) {
export default function MyDashboard({layout, onLayoutChange, isEditable, isDelete, DeleteWidget, widgetArray, appendWidget}) {
console.log("rendering MyDashboard");
const recipe = useSlotRecipe({ key: "widget" });
const styles = recipe(); // using root recipe for widget below
@@ -24,6 +25,23 @@ export default function MyDashboard({layout, onLayoutChange, isEditable, isDelet
});
};
// Show large 'Add Widget' button when dashboard is empty
if ( !widgetArray.length ) {
return (
<Flex
align="center"
justify="center"
h="100%"
w="100%"
bg="gray.150"
borderRadius="md"
>
<FirstWidgetButton appendWidget={ appendWidget } />
</Flex>
);
}
// Show responsive grid of widgets
return (
<chakra.div width="100%">
<ResponsiveGridLayout
@@ -45,10 +63,11 @@ export default function MyDashboard({layout, onLayoutChange, isEditable, isDelet
const Widget = item.widget;
return (
<Flex key={item.i} css={styles.root} boxShadow="md" height="100%" >
<Widget id={item.i} isEditable={isEditable} isDelete={isDelete} DeleteWidget={DeleteWidget}/>
<Widget id={item.i} isEditable={isEditable} isDelete={isDelete} DeleteWidget={DeleteWidget} appendWidget={appendWidget}/>
</Flex>
)
})}
);
})
}
</ResponsiveGridLayout>
</chakra.div>
);
+2 -1
View File
@@ -100,7 +100,8 @@ export default function Sidebar({ view, onChangeView, darkMode, setDarkMode }) {
toggleColorMode();
}}
position="absolute"
bottom="2"/>
bottom="2"
/>
</Box>
);
}