From 4f4f766b487121fc2d0a1b39e34e651b5c551f2b Mon Sep 17 00:00:00 2001 From: Nicole Rappe <nicole.rappe@bunny-lab.io> Date: Wed, 14 May 2025 06:19:00 -0600 Subject: [PATCH] Isolated Node Configuration Sidebar into its own JSX file. --- Data/Server/WebUI/src/Flow_Editor.jsx | 88 ++---------------- .../WebUI/src/Node_Configuration_Sidebar.jsx | 91 +++++++++++++++++++ 2 files changed, 98 insertions(+), 81 deletions(-) create mode 100644 Data/Server/WebUI/src/Node_Configuration_Sidebar.jsx diff --git a/Data/Server/WebUI/src/Flow_Editor.jsx b/Data/Server/WebUI/src/Flow_Editor.jsx index 69a22c8..471309c 100644 --- a/Data/Server/WebUI/src/Flow_Editor.jsx +++ b/Data/Server/WebUI/src/Flow_Editor.jsx @@ -1,5 +1,8 @@ // //////// PROJECT FILE SEPARATION LINE ////////// CODE AFTER THIS LINE ARE FROM: <ProjectRoot>/Data/WebUI/src/Flow_Editor.jsx +// Import Node Configuration Sidebar +import NodeConfigurationSidebar from "./Node_Configuration_Sidebar"; + import React, { useState, useEffect, useCallback, useRef } from "react"; import ReactFlow, { Background, @@ -47,6 +50,9 @@ export default function FlowEditor({ nodeTypes, categorizedNodes }) { + // Node Configuration Sidebar State + const [drawerOpen, setDrawerOpen] = useState(false); + const wrapperRef = useRef(null); const { project } = useReactFlow(); @@ -60,7 +66,6 @@ export default function FlowEditor({ const [labelOpacity, setLabelOpacity] = useState(0.8); const [tempColor, setTempColor] = useState({ hex: "#58a6ff" }); const [pickerPos, setPickerPos] = useState({ x: 0, y: 0 }); - const [drawerOpen, setDrawerOpen] = useState(false); // helper-line state // guides: array of { xFlow, xPx } or { yFlow, yPx } for stationary nodes @@ -351,86 +356,7 @@ export default function FlowEditor({ ref={wrapperRef} style={{ position: "relative" }} > - {/* Top-right gear icon */} - <IconButton - onClick={() => setDrawerOpen(true)} - size="small" - sx={{ - position: "absolute", - top: 8, - right: 8, - zIndex: 1500, - bgcolor: "#2a2a2a", - color: "#58a6ff", - border: "1px solid #444", - "&:hover": { bgcolor: "#3a3a3a" } - }} - > - <SettingsIcon fontSize="small" /> - </IconButton> - -{/* Dim overlay when drawer is open */} -{drawerOpen && ( - <Box - onClick={() => setDrawerOpen(false)} - sx={{ - position: "absolute", - top: 0, - left: 0, - right: 0, - bottom: 0, - backgroundColor: "rgba(0,0,0,0.4)", - zIndex: 10 - }} - /> -)} - -{/* Right-Side Node Configuration Panel */} - <Box - onClick={() => setDrawerOpen(false)} - sx={{ - position: "absolute", - top: 0, - left: 0, - right: 0, - bottom: 0, - backgroundColor: "rgba(0, 0, 0, 0.3)", - opacity: drawerOpen ? 1 : 0, - pointerEvents: drawerOpen ? "auto" : "none", - transition: "opacity 0.6s ease", - zIndex: 10 - }} - /> - - {/* Animated right drawer panel */} - <Box - sx={{ - position: "absolute", - top: 0, - right: 0, - bottom: 0, - width: 400, // Width of the Node Configuration Sidebar - bgcolor: "#121212", // Matches NodeSidebar base color - color: "#ccc", - borderLeft: "1px solid #333", - padding: 2, - zIndex: 11, - overflowY: "auto", - transform: drawerOpen ? "translateX(0)" : "translateX(100%)", - transition: "transform 0.3s ease" - }} - onClick={(e) => e.stopPropagation()} // Prevent closing when clicking inside drawer - > - <Typography variant="h6" sx={{ mb: 2, color: "#0475c2" }}> - Node Configuration Panel - </Typography> - <p style={{ fontSize: "0.85rem", color: "#aaa" }}> - This sidebar will be used to configure nodes in the future. - </p> - <p style={{ fontSize: "0.85rem", color: "#aaa" }}> - The idea is that this area will allow for more node configuration controls to by dynamically-populated by the nodes to allow more complex node documentation and configuration. - </p> - </Box> +<NodeConfigurationSidebar drawerOpen={drawerOpen} setDrawerOpen={setDrawerOpen} /> <ReactFlow nodes={nodes} diff --git a/Data/Server/WebUI/src/Node_Configuration_Sidebar.jsx b/Data/Server/WebUI/src/Node_Configuration_Sidebar.jsx new file mode 100644 index 0000000..a9cf24b --- /dev/null +++ b/Data/Server/WebUI/src/Node_Configuration_Sidebar.jsx @@ -0,0 +1,91 @@ +////////// PROJECT FILE SEPARATION LINE ////////// CODE AFTER THIS LINE ARE FROM: <ProjectRoot>/Data/WebUI/src/Node_Configuration_Sidebar.jsx +import React from "react"; +import { Box, Typography, IconButton } from "@mui/material"; +import { Settings as SettingsIcon } from "@mui/icons-material"; + +export default function NodeConfigurationSidebar({ drawerOpen, setDrawerOpen }) { + return ( + <> + {/* Top-right gear icon */} + <IconButton + onClick={() => setDrawerOpen(true)} + size="small" + sx={{ + position: "absolute", + top: 8, + right: 8, + zIndex: 1500, + bgcolor: "#2a2a2a", + color: "#58a6ff", + border: "1px solid #444", + "&:hover": { bgcolor: "#3a3a3a" } + }} + > + <SettingsIcon fontSize="small" /> + </IconButton> + + {/* Dim overlay when drawer is open */} + {drawerOpen && ( + <Box + onClick={() => setDrawerOpen(false)} + sx={{ + position: "absolute", + top: 0, + left: 0, + right: 0, + bottom: 0, + backgroundColor: "rgba(0,0,0,0.4)", + zIndex: 10 + }} + /> + )} + + {/* Right-Side Node Configuration Panel */} + <Box + onClick={() => setDrawerOpen(false)} + sx={{ + position: "absolute", + top: 0, + left: 0, + right: 0, + bottom: 0, + backgroundColor: "rgba(0, 0, 0, 0.3)", + opacity: drawerOpen ? 1 : 0, + pointerEvents: drawerOpen ? "auto" : "none", + transition: "opacity 0.6s ease", + zIndex: 10 + }} + /> + + {/* Animated right drawer panel */} + <Box + sx={{ + position: "absolute", + top: 0, + right: 0, + bottom: 0, + width: 400, + bgcolor: "#121212", + color: "#ccc", + borderLeft: "1px solid #333", + padding: 2, + zIndex: 11, + overflowY: "auto", + transform: drawerOpen ? "translateX(0)" : "translateX(100%)", + transition: "transform 0.3s ease" + }} + onClick={(e) => e.stopPropagation()} + > + <Typography variant="h6" sx={{ mb: 2, color: "#0475c2" }}> + Node Configuration Panel + </Typography> + <p style={{ fontSize: "0.85rem", color: "#aaa" }}> + This sidebar will be used to configure nodes in the future. + </p> + <p style={{ fontSize: "0.85rem", color: "#aaa" }}> + The idea is that this area will allow for more node configuration controls to be dynamically-populated by the nodes to allow more complex node documentation and configuration. + </p> + </Box> + </> + ); +}