Skip to content

Commit

Permalink
Fix: Edges not changing on change in position of node handles
Browse files Browse the repository at this point in the history
  • Loading branch information
mahesh-gfx committed Aug 19, 2024
1 parent 368bc8c commit 91683b8
Show file tree
Hide file tree
Showing 5 changed files with 159 additions and 114 deletions.
59 changes: 31 additions & 28 deletions packages/frontend/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import UserMenu from "./components/UserMenu";
import WorkflowOptions from "./components/WorkflowOptions";
import { WorkflowProvider } from "./context/WorkflowContext";
import { StyledEngineProvider } from "@mui/material/styles";
import { ReactFlowProvider } from "reactflow";

const App: React.FC = () => {
useEffect(() => {
Expand All @@ -28,34 +29,36 @@ const App: React.FC = () => {
return (
<StyledEngineProvider injectFirst>
{" "}
<WorkflowProvider>
<Router>
<div className="App">
<HeaderWithConditionalComponent />
<Routes>
<Route
path="/"
element={
<ProtectedRoute>
<Dashboard />
</ProtectedRoute>
}
/>
<Route
path="/workflow/:id"
element={
<ProtectedRoute>
<WorkflowCanvas />
</ProtectedRoute>
}
/>
<Route path="/login" element={<Login />} />
<Route path="/register" element={<Register />} />
<Route path="*" element={<Navigate to="/" replace />} />
</Routes>
</div>
</Router>
</WorkflowProvider>
<ReactFlowProvider>
<WorkflowProvider>
<Router>
<div className="App">
<HeaderWithConditionalComponent />
<Routes>
<Route
path="/"
element={
<ProtectedRoute>
<Dashboard />
</ProtectedRoute>
}
/>
<Route
path="/workflow/:id"
element={
<ProtectedRoute>
<WorkflowCanvas />
</ProtectedRoute>
}
/>
<Route path="/login" element={<Login />} />
<Route path="/register" element={<Register />} />
<Route path="*" element={<Navigate to="/" replace />} />
</Routes>
</div>
</Router>
</WorkflowProvider>
</ReactFlowProvider>
</StyledEngineProvider>
);
};
Expand Down
161 changes: 77 additions & 84 deletions packages/frontend/src/components/WorkflowCanvas.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,5 @@
import React, { useEffect, useContext } from "react";
import ReactFlow, {
ReactFlowProvider,
Controls,
Background,
MiniMap,
} from "reactflow";
import ReactFlow, { Controls, Background, MiniMap } from "reactflow";
import "reactflow/dist/style.css";
import NodePanel from "./NodePanel";
import NodeConfigPopup from "./NodeConfigPopup";
Expand Down Expand Up @@ -43,6 +38,7 @@ const WorkflowCanvas: React.FC = () => {
setExecutionStatus,
onNodesDelete,
transformEdges,
onNodeDragStop,
}: any = useContext(WorkflowContext);

//useEffects
Expand Down Expand Up @@ -75,88 +71,85 @@ const WorkflowCanvas: React.FC = () => {
}, []);

return (
<ReactFlowProvider>
<div style={{ height: "600px" }} ref={reactFlowWrapper}>
<ReactFlow
nodes={nodes}
edges={edges}
onNodesChange={onNodesChange}
onEdgesChange={onEdgesChange}
onConnect={onConnect}
onInit={setReactFlowInstance}
onDrop={onDrop}
onDragOver={onDragOver}
onNodeDoubleClick={onNodeDoubleClick}
nodeTypes={nodeTypes}
edgeTypes={edgeTypes}
fitView
connectionLineStyle={connectionLineStyle}
onNodesDelete={onNodesDelete}
>
<Controls position="top-right" />
<Background />
<MiniMap position="bottom-right" />
</ReactFlow>
<NodePanel nodeTypes={nodeDefinitions} onDragStart={onDragStart} />
<div
style={{
display: "flex",
position: "fixed",
top: "20px",
right: "20px",
gap: "10px",
}}
></div>
{selectedNode &&
selectedNode.type &&
nodeDefinitions[selectedNode.type] && (
<NodeConfigPopup
node={selectedNode}
nodeDefinition={
nodeDefinitions[
selectedNode.type as keyof typeof nodeDefinitions
]
}
onClose={() => setSelectedNode(null)}
onUpdate={(nodeId, newData) => {
setNodes((nds: any) =>
nds.map((node: any) =>
node.id === nodeId
? {
...node,
data: {
...node.data,
properties: {
...node.data.properties,
...newData.properties,
},
},
}
: node
)
);
}}
/>
)}
{executionStatus && (
<PopupMessage
message={executionStatus}
type={
executionErrors
? "error"
: executionStatus.includes("completed successfully")
? "success"
: "loading"
<div style={{ height: "600px" }} ref={reactFlowWrapper}>
<ReactFlow
nodes={nodes}
edges={edges}
onNodesChange={onNodesChange}
onEdgesChange={onEdgesChange}
onConnect={onConnect}
onInit={setReactFlowInstance}
onDrop={onDrop}
onDragOver={onDragOver}
onNodeDoubleClick={onNodeDoubleClick}
onNodeDragStop={onNodeDragStop}
nodeTypes={nodeTypes}
edgeTypes={edgeTypes}
fitView
connectionLineStyle={connectionLineStyle}
onNodesDelete={onNodesDelete}
>
<Controls position="top-right" />
<Background />
<MiniMap position="bottom-right" />
</ReactFlow>
<NodePanel nodeTypes={nodeDefinitions} onDragStart={onDragStart} />
<div
style={{
display: "flex",
position: "fixed",
top: "20px",
right: "20px",
gap: "10px",
}}
></div>
{selectedNode &&
selectedNode.type &&
nodeDefinitions[selectedNode.type] && (
<NodeConfigPopup
node={selectedNode}
nodeDefinition={
nodeDefinitions[selectedNode.type as keyof typeof nodeDefinitions]
}
onClose={() => {
setExecutionStatus(null);
if (!executionErrors) {
}
onClose={() => setSelectedNode(null)}
onUpdate={(nodeId, newData) => {
setNodes((nds: any) =>
nds.map((node: any) =>
node.id === nodeId
? {
...node,
data: {
...node.data,
properties: {
...node.data.properties,
...newData.properties,
},
},
}
: node
)
);
}}
/>
)}
</div>
</ReactFlowProvider>
{executionStatus && (
<PopupMessage
message={executionStatus}
type={
executionErrors
? "error"
: executionStatus.includes("completed successfully")
? "success"
: "loading"
}
onClose={() => {
setExecutionStatus(null);
if (!executionErrors) {
}
}}
/>
)}
</div>
);
};

Expand Down
20 changes: 20 additions & 0 deletions packages/frontend/src/components/handle/CustomHandle.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import React, { useEffect } from "react";
import { Handle, Position, useUpdateNodeInternals } from "reactflow";

const CustomHandle = ({ nodeId, type, position, style }: any) => {
const updateNodeInternals = useUpdateNodeInternals();
useEffect(() => {
updateNodeInternals(nodeId);
}, [position]);
return (
<Handle
type={type}
position={position}
style={{
...style,
}}
/>
);
};

export default CustomHandle;
7 changes: 5 additions & 2 deletions packages/frontend/src/components/nodes/DefaultNode.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { useContext, useEffect } from "react";
import { Handle, Position, useReactFlow } from "reactflow";
import { WorkflowContext } from "../../context/WorkflowContext";
import { camelCaseToTitleCase } from "@data-viz-tool/shared";
import CustomHandle from "../handle/CustomHandle";

const DefaultNode = ({ id, data, def, type, children }: any) => {
const { deleteNodeById, edges, setEdges } = useContext(WorkflowContext);
Expand Down Expand Up @@ -57,7 +58,8 @@ const DefaultNode = ({ id, data, def, type, children }: any) => {
}}
>
{def.inputs.map((input: any, index: any) => (
<Handle
<CustomHandle
nodeId={id}
key={`input-${index}`}
type="target"
position={calculateHandlePosition(id, "target")}
Expand Down Expand Up @@ -125,7 +127,8 @@ const DefaultNode = ({ id, data, def, type, children }: any) => {
</div>
)}
{def.outputs.map((output: any, index: any) => (
<Handle
<CustomHandle
nodeId={id}
key={`output-${index}`}
type="source"
position={calculateHandlePosition(id, "source")}
Expand Down
26 changes: 26 additions & 0 deletions packages/frontend/src/context/WorkflowContext.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import {
ReactFlowInstance,
Edge,
getConnectedEdges,
useUpdateNodeInternals,
} from "reactflow";
import "reactflow/dist/style.css";
import {
Expand Down Expand Up @@ -92,6 +93,7 @@ const WorkflowProvider = ({ children }: any) => {
const [executionStatus, setExecutionStatus] = useState<string | null>(null);
const [workflowId, setWorkflowId] = useState<string>("");
const [NodeConfigModalIsOpen, setNodeConfigModalIsOpen] = useState(false);
const updateNodeInternals = useUpdateNodeInternals();

const openModal = () => {
setNodeConfigModalIsOpen(true);
Expand Down Expand Up @@ -139,6 +141,7 @@ const WorkflowProvider = ({ children }: any) => {
);

const onDragOver = useCallback((event: React.DragEvent) => {
console.log("Dragover...");
event.preventDefault();
event.dataTransfer.dropEffect = "move";
}, []);
Expand Down Expand Up @@ -408,6 +411,28 @@ const WorkflowProvider = ({ children }: any) => {
});
};

const getNodeById = useCallback(
(nodeId: string) => {
const node = nodes.find((node) => node.id === nodeId);
if (!node) {
console.warn(`Node with ID ${nodeId} not found.`);
return null;
}
return node;
},
[nodes]
);

const onNodeDragStop = (event: Event, node: any) => {
console.log("On node drag stop: ", event, node);
// const updatedEdges = edges.map((edge: any) => {
// return {
// ...edge,
// };
// });
// setEdges(updatedEdges); // Trigger re-render of edges with updated handles
};

return (
<WorkflowContext.Provider
value={{
Expand Down Expand Up @@ -456,6 +481,7 @@ const WorkflowProvider = ({ children }: any) => {
NodeConfigModalIsOpen,
openModal,
closeModal,
onNodeDragStop,
}}
>
{children}
Expand Down

0 comments on commit 91683b8

Please sign in to comment.