Skip to content

Commit c073c29

Browse files
committed
Rework TaskInput and TaskOutput logic
1 parent d32734d commit c073c29

File tree

9 files changed

+341
-116
lines changed

9 files changed

+341
-116
lines changed

src/components/shared/ReactFlow/FlowCanvas/IONode/IONode.tsx

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,7 @@ interface IONodeProps {
2727
}
2828

2929
const IONode = ({ type, data, selected = false }: IONodeProps) => {
30-
const {
31-
getInputNodeId,
32-
getOutputNodeId,
33-
getTaskInputNodeId,
34-
getTaskOutputNodeId,
35-
} = useNodeManager();
30+
const { getInputNodeId, getOutputNodeId } = useNodeManager();
3631
const { graphSpec, componentSpec } = useComponentSpec();
3732
const { setContent, clearContent } = useContextPanel();
3833

@@ -63,13 +58,12 @@ const IONode = ({ type, data, selected = false }: IONodeProps) => {
6358
[componentSpec.outputs, spec.name],
6459
);
6560

66-
const nodeId = isInput
67-
? getInputNodeId(inputNameToInputId(spec.name))
68-
: getOutputNodeId(outputNameToOutputId(spec.name));
61+
const inputId = inputNameToInputId(spec.name);
62+
const outputId = outputNameToOutputId(spec.name);
6963

70-
const nodeHandleId = isInput
71-
? getTaskOutputNodeId(inputNameToInputId(spec.name))
72-
: getTaskInputNodeId(outputNameToOutputId(spec.name));
64+
const nodeId = isInput ? getInputNodeId(inputId) : getOutputNodeId(outputId);
65+
66+
const nodeHandleId = `${nodeId}_handle`;
7367

7468
const handleHandleClick = useCallback(() => {
7569
if (ENABLE_DEBUG_MODE) {

src/components/shared/ReactFlow/FlowCanvas/TaskNode/TaskNodeCard/Handles.tsx

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,6 @@ import { cn } from "@/lib/utils";
1616
import { useTaskNode } from "@/providers/TaskNodeProvider";
1717
import type { InputSpec, OutputSpec } from "@/utils/componentSpec";
1818
import { ENABLE_DEBUG_MODE } from "@/utils/constants";
19-
import {
20-
inputNameToInputId,
21-
outputNameToOutputId,
22-
} from "@/utils/nodes/nodeIdUtils";
2319

2420
type InputHandleProps = {
2521
input: InputSpec;
@@ -39,7 +35,7 @@ export const InputHandle = ({
3935
onHandleSelectionChange,
4036
}: InputHandleProps) => {
4137
const { getTaskInputNodeId } = useNodeManager();
42-
const { nodeId, state, name } = useTaskNode();
38+
const { taskId, nodeId, state, name } = useTaskNode();
4339

4440
const fromHandle = useConnection((connection) => connection.fromHandle?.id);
4541
const toHandle = useConnection((connection) => connection.toHandle?.id);
@@ -51,7 +47,7 @@ export const InputHandle = ({
5147
const [selected, setSelected] = useState(false);
5248
const [active, setActive] = useState(false);
5349

54-
const handleId = getTaskInputNodeId(inputNameToInputId(input.name));
50+
const handleId = getTaskInputNodeId(taskId, input.name);
5551

5652
const missing = invalid ? "bg-red-700!" : "bg-gray-500!";
5753
const hasValue = value !== undefined && value !== null;
@@ -235,7 +231,7 @@ export const OutputHandle = ({
235231
onHandleSelectionChange,
236232
}: OutputHandleProps) => {
237233
const { getTaskOutputNodeId } = useNodeManager();
238-
const { nodeId, state, name } = useTaskNode();
234+
const { taskId, nodeId, state, name } = useTaskNode();
239235

240236
const fromHandle = useConnection((connection) => connection.fromHandle?.id);
241237
const toHandle = useConnection((connection) => connection.toHandle?.id);
@@ -247,7 +243,7 @@ export const OutputHandle = ({
247243
const [selected, setSelected] = useState(false);
248244
const [active, setActive] = useState(false);
249245

250-
const handleId = getTaskOutputNodeId(outputNameToOutputId(output.name));
246+
const handleId = getTaskOutputNodeId(taskId, output.name);
251247
const hasValue = value !== undefined && value !== "" && value !== null;
252248

253249
const handleHandleClick = useCallback(

src/components/shared/ReactFlow/FlowCanvas/TaskNode/TaskNodeCard/TaskNodeInputs.tsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import { useTaskNode } from "@/providers/TaskNodeProvider";
1111
import { inputsWithInvalidArguments } from "@/services/componentService";
1212
import type { InputSpec } from "@/utils/componentSpec";
1313
import { ComponentSearchFilter } from "@/utils/constants";
14-
import { inputNameToInputId } from "@/utils/nodes/nodeIdUtils";
1514
import { checkArtifactMatchesSearchFilters } from "@/utils/searchUtils";
1615

1716
import { InputHandle } from "./Handles";
@@ -28,8 +27,8 @@ export function TaskNodeInputs({
2827
expanded,
2928
onBackgroundClick,
3029
}: TaskNodeInputsProps) {
31-
const { getInputNodeId } = useNodeManager();
32-
const { inputs, taskSpec, state, select } = useTaskNode();
30+
const { getTaskInputNodeId } = useNodeManager();
31+
const { taskId, inputs, taskSpec, state, select } = useTaskNode();
3332
const { graphSpec } = useComponentSpec();
3433
const {
3534
highlightSearchFilter,
@@ -147,7 +146,7 @@ export function TaskNodeInputs({
147146
}
148147

149148
const input = inputs.find(
150-
(i) => getInputNodeId(inputNameToInputId(i.name)) === fromHandle?.id,
149+
(i) => getTaskInputNodeId(taskId, i.name) === fromHandle?.id,
151150
);
152151

153152
if (!input) return;

src/components/shared/ReactFlow/FlowCanvas/TaskNode/TaskNodeCard/TaskNodeOutputs.tsx

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import { isValidFilterRequest } from "@/providers/ComponentLibraryProvider/types
88
import { useTaskNode } from "@/providers/TaskNodeProvider";
99
import type { OutputSpec } from "@/utils/componentSpec";
1010
import { ComponentSearchFilter } from "@/utils/constants";
11-
import { outputNameToOutputId } from "@/utils/nodes/nodeIdUtils";
1211
import { checkArtifactMatchesSearchFilters } from "@/utils/searchUtils";
1312

1413
import { OutputHandle } from "./Handles";
@@ -25,7 +24,7 @@ export function TaskNodeOutputs({
2524
onBackgroundClick,
2625
}: TaskNodeOutputsProps) {
2726
const { getTaskOutputNodeId } = useNodeManager();
28-
const { nodeId, outputs, state, select } = useTaskNode();
27+
const { taskId, nodeId, outputs, state, select } = useTaskNode();
2928
const {
3029
highlightSearchFilter,
3130
resetSearchFilter,
@@ -42,8 +41,7 @@ export function TaskNodeOutputs({
4241
edges.some(
4342
(edge) =>
4443
edge.source === nodeId &&
45-
edge.sourceHandle ===
46-
getTaskOutputNodeId(outputNameToOutputId(output.name)),
44+
edge.sourceHandle === getTaskOutputNodeId(taskId, output.name),
4745
),
4846
);
4947

@@ -141,8 +139,7 @@ export function TaskNodeOutputs({
141139
}
142140

143141
const output = outputs.find(
144-
(o) =>
145-
getTaskOutputNodeId(outputNameToOutputId(o.name)) === fromHandle?.id,
142+
(o) => getTaskOutputNodeId(taskId, o.name) === fromHandle?.id,
146143
);
147144

148145
if (!output) return;

src/components/shared/ReactFlow/FlowCanvas/utils/addAndConnectNode.ts

Lines changed: 78 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ import {
1010
} from "@/utils/componentSpec";
1111
import { DEFAULT_NODE_DIMENSIONS } from "@/utils/constants";
1212
import {
13-
inputNameToInputId,
14-
outputNameToOutputId,
13+
inputIdToInputName,
14+
outputIdToOutputName,
1515
} from "@/utils/nodes/nodeIdUtils";
1616

1717
import addTask from "./addTask";
@@ -44,8 +44,58 @@ export function addAndConnectNode({
4444

4545
const oldGraphSpec = componentSpec.implementation.graph;
4646

47-
const fromHandleId = fromHandle?.id;
48-
const fromHandleType = fromHandleId?.startsWith("input") ? "input" : "output";
47+
if (!fromHandle?.id) {
48+
return componentSpec;
49+
}
50+
51+
const isTaskHandle = nodeManager.isManaged(fromHandle.id);
52+
let fromHandleType: "input" | "output";
53+
let fromHandleName: string | undefined;
54+
let fromTaskId: string | undefined;
55+
56+
if (isTaskHandle) {
57+
// Handle is managed by NodeManager (task handle)
58+
const fromHandleInfo = nodeManager.getHandleInfo(fromHandle.id);
59+
const fromNodeType = nodeManager.getNodeType(fromHandle.id);
60+
61+
if (!fromHandleInfo || !fromNodeType) {
62+
return componentSpec;
63+
}
64+
65+
fromHandleType = fromNodeType === "taskInput" ? "input" : "output";
66+
fromHandleName = fromHandleInfo.handleName;
67+
fromTaskId = fromHandleInfo.taskId;
68+
} else {
69+
// Simple IO node handle - get info from the source node, not the handle
70+
const fromNodeId = fromHandle.nodeId;
71+
const fromNodeType = nodeManager.getNodeType(fromNodeId);
72+
73+
if (!fromNodeType) {
74+
return componentSpec;
75+
}
76+
77+
if (fromNodeType === "input") {
78+
fromHandleType = "output";
79+
const inputId = nodeManager.getTaskId(fromNodeId);
80+
if (inputId) {
81+
fromHandleName = inputIdToInputName(inputId);
82+
fromTaskId = inputId;
83+
}
84+
} else if (fromNodeType === "output") {
85+
fromHandleType = "input";
86+
const outputId = nodeManager.getTaskId(fromNodeId);
87+
if (outputId) {
88+
fromHandleName = outputIdToOutputName(outputId);
89+
fromTaskId = outputId;
90+
}
91+
} else {
92+
return componentSpec;
93+
}
94+
}
95+
96+
if (!fromTaskId || !fromHandleName) {
97+
return componentSpec;
98+
}
4999

50100
const adjustedPosition =
51101
fromHandleType === "input"
@@ -77,22 +127,17 @@ export function addAndConnectNode({
77127
const newNodeId = nodeManager.getNodeId(newTaskId, "task");
78128

79129
// 3. Determine the connection data type and find the first matching handle on the new node
80-
if (!fromHandle) {
81-
return newComponentSpec;
130+
let fromComponentSpec: ComponentSpec | undefined;
131+
132+
if (isTaskHandle) {
133+
// Get spec from task
134+
const fromTaskSpec = graphSpec.tasks[fromTaskId];
135+
fromComponentSpec = fromTaskSpec?.componentRef.spec;
136+
} else {
137+
// For IO nodes, get spec from component spec
138+
fromComponentSpec = componentSpec;
82139
}
83140

84-
const fromTaskId = nodeManager.getTaskId(fromHandle.nodeId);
85-
if (!fromTaskId) {
86-
return newComponentSpec;
87-
}
88-
89-
const fromTaskSpec = graphSpec.tasks[fromTaskId];
90-
const fromComponentSpec = fromTaskSpec?.componentRef.spec;
91-
92-
const fromNodeId = fromHandle.nodeId;
93-
94-
const fromHandleName = fromHandleId?.replace(`${fromHandleType}_`, "");
95-
96141
let connectionType: TypeSpecType | undefined;
97142
if (fromHandleType === "input") {
98143
connectionType = fromComponentSpec?.inputs?.find(
@@ -106,7 +151,6 @@ export function addAndConnectNode({
106151

107152
// Find the first matching handle on the new node
108153
const toHandleType = fromHandleType === "input" ? "output" : "input";
109-
110154
let targetHandleId: string | undefined;
111155

112156
if (toHandleType === "input") {
@@ -117,8 +161,11 @@ export function addAndConnectNode({
117161
return newComponentSpec;
118162
}
119163

120-
const inputId = inputNameToInputId(handleName);
121-
targetHandleId = nodeManager.getNodeId(inputId, "taskInput");
164+
targetHandleId = nodeManager.getTaskHandleNodeId(
165+
newTaskId,
166+
handleName,
167+
"taskInput",
168+
);
122169
} else if (toHandleType === "output") {
123170
const handleName = componentRef.spec?.outputs?.find(
124171
(io) => io.type === connectionType,
@@ -127,14 +174,21 @@ export function addAndConnectNode({
127174
return newComponentSpec;
128175
}
129176

130-
const outputId = outputNameToOutputId(handleName);
131-
targetHandleId = nodeManager.getNodeId(outputId, "taskOutput");
177+
targetHandleId = nodeManager.getTaskHandleNodeId(
178+
newTaskId,
179+
handleName,
180+
"taskOutput",
181+
);
132182
}
133183

134184
// 4. Build a Connection object and use handleConnection to add the edge
135-
if (fromNodeId && fromHandleId && targetHandleId) {
185+
if (targetHandleId) {
186+
const fromNodeId = fromHandle.nodeId;
187+
const fromHandleId = fromHandle.id;
188+
136189
const isReversedConnection =
137190
fromHandleType === "input" && toHandleType === "output";
191+
138192
const connection: Connection = isReversedConnection
139193
? // Drawing from an input handle to a new output handle
140194
{

0 commit comments

Comments
 (0)