From 1b08979699e61f6862e3426353abb966448792a9 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sat, 22 Aug 2026 06:10:26 +0000 Subject: [PATCH] fix(web): allow dragging connections between step nodes Treat in-progress connections (no target yet) as valid so React Flow can complete handle-to-handle links, and enlarge step handles. Co-authored-by: Nasyarobby Putra --- .../web/src/components/workflow/GraphTab.jsx | 8 ++++--- .../components/workflow/graph/GraphNodes.jsx | 22 ++++++++++++++----- packages/web/src/index.css | 4 ++++ 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/packages/web/src/components/workflow/GraphTab.jsx b/packages/web/src/components/workflow/GraphTab.jsx index 3503371..2d4d80e 100644 --- a/packages/web/src/components/workflow/GraphTab.jsx +++ b/packages/web/src/components/workflow/GraphTab.jsx @@ -158,8 +158,10 @@ function GraphTabInner({ (conn) => { if (disabled) return false; const from = parseGraphNodeId(conn.source); + if (from?.kind !== "step") return false; + if (!conn.target) return true; const to = parseGraphNodeId(conn.target); - if (from?.kind !== "step" || to?.kind !== "step") return false; + if (to?.kind !== "step") return false; return canConnectSteps(doc, from.uiId, to.uiId); }, [doc, disabled], @@ -282,8 +284,8 @@ function GraphTabInner({ onEdgesDelete={onEdgesDelete} nodesConnectable={!disabled} nodesDraggable={!disabled} - elementsSelectable - fitView + connectionRadius={40} + defaultEdgeOptions={{ type: "smoothstep" }} proOptions={{ hideAttribution: false }} > diff --git a/packages/web/src/components/workflow/graph/GraphNodes.jsx b/packages/web/src/components/workflow/graph/GraphNodes.jsx index e0d973d..7ff6f91 100644 --- a/packages/web/src/components/workflow/graph/GraphNodes.jsx +++ b/packages/web/src/components/workflow/graph/GraphNodes.jsx @@ -3,7 +3,7 @@ import { Handle, Position } from "@xyflow/react"; export function TriggerGraphNode({ data, selected }) { return (
@@ -12,7 +12,7 @@ export function TriggerGraphNode({ data, selected }) {

{data.label}

- +
); } @@ -21,7 +21,7 @@ export function StepGraphNode({ data, selected }) { const kindLabel = data.kind === "set" ? "set" : data.profile ? "profile" : "script"; return (
- +

{kindLabel}

{data.stepId ? ( @@ -52,7 +58,13 @@ export function StepGraphNode({ data, selected }) { {data.missingNeeds?.length ? (

Unknown needs: {data.missingNeeds.join(", ")}

) : null} - +
); } diff --git a/packages/web/src/index.css b/packages/web/src/index.css index 5542848..65cc7b7 100644 --- a/packages/web/src/index.css +++ b/packages/web/src/index.css @@ -29,3 +29,7 @@ body, width: 100%; height: 100%; } + +.workflow-graph .react-flow__handle { + opacity: 1; +}