Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,14 @@ import { Icon } from "@/components/ui/icon";
import { BlockStack } from "@/components/ui/layout";
import { Heading, Paragraph } from "@/components/ui/typography";
import useConfirmationDialog from "@/hooks/useConfirmationDialog";
import { useNodeManager } from "@/hooks/useNodeManager";
import { useNodeSelectionTransfer } from "@/hooks/useNodeSelectionTransfer";
import useToastNotification from "@/hooks/useToastNotification";
import { useComponentSpec } from "@/providers/ComponentSpecProvider";
import { useContextPanel } from "@/providers/ContextPanelProvider";
import { type InputSpec } from "@/utils/componentSpec";
import { checkInputConnectionToRequiredFields } from "@/utils/inputConnectionUtils";
import { inputNameToNodeId } from "@/utils/nodes/nodeIdUtils";
import { inputNameToInputId } from "@/utils/nodes/nodeIdUtils";

import { NameField, TextField, TypeField } from "./FormFields/FormFields";
import { checkNameCollision } from "./FormFields/utils";
Expand All @@ -30,6 +31,16 @@ export const InputValueEditor = ({
input,
disabled = false,
}: InputValueEditorProps) => {
const { getInputNodeId } = useNodeManager();

const inputNameToNodeId = useCallback(
(inputName: string): string => {
const inputId = inputNameToInputId(inputName);
return getInputNodeId(inputId);
},
[getInputNodeId],
);

const notify = useToastNotification();
const { transferSelection } = useNodeSelectionTransfer(inputNameToNodeId);
const { componentSpec, setComponentSpec } = useComponentSpec();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@ import { Icon } from "@/components/ui/icon";
import { BlockStack, InlineStack } from "@/components/ui/layout";
import { Heading, Paragraph } from "@/components/ui/typography";
import useConfirmationDialog from "@/hooks/useConfirmationDialog";
import { useNodeManager } from "@/hooks/useNodeManager";
import { useNodeSelectionTransfer } from "@/hooks/useNodeSelectionTransfer";
import { useComponentSpec } from "@/providers/ComponentSpecProvider";
import { useContextPanel } from "@/providers/ContextPanelProvider";
import { type OutputSpec } from "@/utils/componentSpec";
import { outputNameToNodeId } from "@/utils/nodes/nodeIdUtils";

import { type OutputConnectedDetails } from "../../utils/getOutputConnectedDetails";
import { updateOutputNameOnComponentSpec } from "../../utils/updateOutputNameOnComponentSpec";
Expand All @@ -29,6 +29,16 @@ export const OutputNameEditor = ({
disabled,
connectedDetails,
}: OutputNameEditorProps) => {
const { getOutputNodeId } = useNodeManager();

const outputNameToNodeId = useCallback(
(outputName: string): string => {
const outputId = outputNameToNodeId(outputName);
return getOutputNodeId(outputId);
},
[getOutputNodeId],
);

const { transferSelection } = useNodeSelectionTransfer(outputNameToNodeId);
const { setComponentSpec, componentSpec } = useComponentSpec();
const { clearContent } = useContextPanel();
Expand Down
38 changes: 31 additions & 7 deletions src/components/shared/ReactFlow/FlowCanvas/FlowCanvas.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -303,15 +303,23 @@ const FlowCanvas = ({
let updatedComponentSpec = { ...componentSpec };

for (const edge of params.edges) {
updatedComponentSpec = removeEdge(edge, updatedComponentSpec);
updatedComponentSpec = removeEdge(
edge,
updatedComponentSpec,
nodeManager,
);
}
for (const node of params.nodes) {
updatedComponentSpec = removeNode(node, updatedComponentSpec);
updatedComponentSpec = removeNode(
node,
updatedComponentSpec,
nodeManager,
);
}

setComponentSpec(updatedComponentSpec);
},
[componentSpec, setComponentSpec],
[componentSpec, nodeManager, setComponentSpec],
);

const nodeCallbacks = useNodeCallbacks({
Expand All @@ -334,7 +342,11 @@ const FlowCanvas = ({
(connection: Connection) => {
if (connection.source === connection.target) return;

const updatedGraphSpec = handleConnection(graphSpec, connection);
const updatedGraphSpec = handleConnection(
graphSpec,
connection,
nodeManager,
);
updateGraphSpec(updatedGraphSpec);
},
[graphSpec, handleConnection, updateGraphSpec],
Expand Down Expand Up @@ -374,19 +386,30 @@ const FlowCanvas = ({
);

if (existingInputEdge) {
newComponentSpec = removeEdge(existingInputEdge, newComponentSpec);
newComponentSpec = removeEdge(
existingInputEdge,
newComponentSpec,
nodeManager,
);
}

const updatedComponentSpec = addAndConnectNode({
componentRef,
fromHandle,
position,
componentSpec: newComponentSpec,
nodeManager,
});

setComponentSpec(updatedComponentSpec);
},
[reactFlowInstance, componentSpec, setComponentSpec, updateOrAddNodes],
[
reactFlowInstance,
componentSpec,
nodeManager,
setComponentSpec,
updateOrAddNodes,
],
);

useEffect(() => {
Expand Down Expand Up @@ -633,14 +656,15 @@ const FlowCanvas = ({
const updatedComponentSpec = updateNodePositions(
updatedNodes,
componentSpec,
nodeManager,
);
setComponentSpec(updatedComponentSpec);
}
}

onNodesChange(changes);
},
[nodes, componentSpec, setComponentSpec, onNodesChange],
[nodes, componentSpec, nodeManager, setComponentSpec, onNodesChange],
);

const handleBeforeDelete = async (params: NodesAndEdges) => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,14 @@ import {
TooltipContent,
TooltipTrigger,
} from "@/components/ui/tooltip";
import { useNodeManager } from "@/hooks/useNodeManager";
import { cn } from "@/lib/utils";
import { useTaskNode } from "@/providers/TaskNodeProvider";
import type { InputSpec, OutputSpec } from "@/utils/componentSpec";
import {
inputNameToInputId,
outputNameToOutputId,
} from "@/utils/nodes/nodeIdUtils";

type InputHandleProps = {
input: InputSpec;
Expand All @@ -32,6 +37,7 @@ export const InputHandle = ({
onLabelClick,
onHandleSelectionChange,
}: InputHandleProps) => {
const { getInputNodeId } = useNodeManager();
const { nodeId, state } = useTaskNode();

const fromHandle = useConnection((connection) => connection.fromHandle?.id);
Expand All @@ -44,7 +50,7 @@ export const InputHandle = ({
const [selected, setSelected] = useState(false);
const [active, setActive] = useState(false);

const handleId = getInputHandleId(input.name);
const handleId = getInputNodeId(inputNameToInputId(input.name));

const missing = invalid ? "bg-red-700!" : "bg-gray-500!";
const hasValue = value !== undefined && value !== null;
Expand Down Expand Up @@ -218,6 +224,7 @@ export const OutputHandle = ({
onLabelClick,
onHandleSelectionChange,
}: OutputHandleProps) => {
const { getOutputNodeId } = useNodeManager();
const { nodeId, state } = useTaskNode();

const fromHandle = useConnection((connection) => connection.fromHandle?.id);
Expand All @@ -230,7 +237,7 @@ export const OutputHandle = ({
const [selected, setSelected] = useState(false);
const [active, setActive] = useState(false);

const handleId = getOutputHandleId(output.name);
const handleId = getOutputNodeId(outputNameToOutputId(output.name));
const hasValue = value !== undefined && value !== "" && value !== null;

const handleHandleClick = useCallback(
Expand Down Expand Up @@ -355,14 +362,6 @@ export const OutputHandle = ({
);
};

const getOutputHandleId = (outputName: string) => {
return `output_${outputName}`;
};

const getInputHandleId = (inputName: string) => {
return `input_${inputName}`;
};

const skipHandleDeselect = (e: MouseEvent) => {
let el = e.target as HTMLElement | null;
while (el) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { useConnection } from "@xyflow/react";
import { AlertCircle } from "lucide-react";
import { type MouseEvent, useCallback, useEffect, useState } from "react";

import { useNodeManager } from "@/hooks/useNodeManager";
import { cn } from "@/lib/utils";
import { useForcedSearchContext } from "@/providers/ComponentLibraryProvider/ForcedSearchProvider";
import { isValidFilterRequest } from "@/providers/ComponentLibraryProvider/types";
Expand All @@ -10,7 +11,7 @@ import { useTaskNode } from "@/providers/TaskNodeProvider";
import { inputsWithInvalidArguments } from "@/services/componentService";
import type { InputSpec } from "@/utils/componentSpec";
import { ComponentSearchFilter } from "@/utils/constants";
import { inputNameToNodeId } from "@/utils/nodes/nodeIdUtils";
import { inputNameToInputId } from "@/utils/nodes/nodeIdUtils";
import { checkArtifactMatchesSearchFilters } from "@/utils/searchUtils";

import { InputHandle } from "./Handles";
Expand All @@ -27,6 +28,7 @@ export function TaskNodeInputs({
expanded,
onBackgroundClick,
}: TaskNodeInputsProps) {
const { getInputNodeId } = useNodeManager();
const { inputs, taskSpec, state, select } = useTaskNode();
const { graphSpec } = useComponentSpec();
const {
Expand Down Expand Up @@ -145,7 +147,7 @@ export function TaskNodeInputs({
}

const input = inputs.find(
(i) => inputNameToNodeId(i.name) === fromHandle?.id,
(i) => getInputNodeId(inputNameToInputId(i.name)) === fromHandle?.id,
);

if (!input) return;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
import { useConnection, useEdges } from "@xyflow/react";
import { type MouseEvent, useCallback, useEffect, useState } from "react";

import { useNodeManager } from "@/hooks/useNodeManager";
import { cn } from "@/lib/utils";
import { useForcedSearchContext } from "@/providers/ComponentLibraryProvider/ForcedSearchProvider";
import { isValidFilterRequest } from "@/providers/ComponentLibraryProvider/types";
import { useTaskNode } from "@/providers/TaskNodeProvider";
import type { OutputSpec } from "@/utils/componentSpec";
import { ComponentSearchFilter } from "@/utils/constants";
import { outputNameToNodeId } from "@/utils/nodes/nodeIdUtils";
import { outputNameToOutputId } from "@/utils/nodes/nodeIdUtils";
import { checkArtifactMatchesSearchFilters } from "@/utils/searchUtils";

import { OutputHandle } from "./Handles";
Expand All @@ -23,6 +24,7 @@ export function TaskNodeOutputs({
expanded,
onBackgroundClick,
}: TaskNodeOutputsProps) {
const { getOutputNodeId } = useNodeManager();
const { nodeId, outputs, state, select } = useTaskNode();
const {
highlightSearchFilter,
Expand All @@ -40,7 +42,8 @@ export function TaskNodeOutputs({
edges.some(
(edge) =>
edge.source === nodeId &&
edge.sourceHandle === outputNameToNodeId(output.name),
edge.sourceHandle ===
getOutputNodeId(outputNameToOutputId(output.name)),
),
);

Expand Down Expand Up @@ -138,7 +141,7 @@ export function TaskNodeOutputs({
}

const output = outputs.find(
(o) => outputNameToNodeId(o.name) === fromHandle?.id,
(o) => getOutputNodeId(outputNameToOutputId(o.name)) === fromHandle?.id,
);

if (!output) return;
Expand Down
Loading