fix(editor): Fix Adding nodes one after the other also adds connections (no-changelog) (#11312)

Co-authored-by: Alex Grozav <alex@grozav.com>
This commit is contained in:
Raúl Gómez Morales 2024-10-21 13:54:49 +02:00 committed by GitHub
parent 054fe9745f
commit f67c0710e1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 42 additions and 10 deletions

View file

@ -56,6 +56,7 @@ const { nodes: mappedNodes, connections: mappedConnections } = useCanvasMapping(
<div :class="$style.canvas"> <div :class="$style.canvas">
<Canvas <Canvas
v-if="workflow" v-if="workflow"
:id="id"
:nodes="mappedNodes" :nodes="mappedNodes"
:connections="mappedConnections" :connections="mappedConnections"
:show-bug-reporting-button="showBugReportingButton" :show-bug-reporting-button="showBugReportingButton"

View file

@ -613,6 +613,28 @@ describe('useCanvasOperations', () => {
expect(setNodePositionByIdSpy).toHaveBeenCalledWith(nodes[1].id, expect.any(Object)); expect(setNodePositionByIdSpy).toHaveBeenCalledWith(nodes[1].id, expect.any(Object));
expect(setNodePositionByIdSpy).toHaveBeenCalledWith(nodes[2].id, expect.any(Object)); expect(setNodePositionByIdSpy).toHaveBeenCalledWith(nodes[2].id, expect.any(Object));
}); });
it('should return newly added nodes', async () => {
const workflowsStore = mockedStore(useWorkflowsStore);
const nodeTypesStore = useNodeTypesStore();
const nodeTypeName = 'type';
const nodes = [
mockNode({ name: 'Node 1', type: nodeTypeName, position: [30, 40] }),
mockNode({ name: 'Node 2', type: nodeTypeName, position: [100, 240] }),
];
workflowsStore.getCurrentWorkflow.mockReturnValue(
createTestWorkflowObject(workflowsStore.workflow),
);
nodeTypesStore.nodeTypes = {
[nodeTypeName]: { 1: mockNodeTypeDescription({ name: nodeTypeName }) },
};
const { addNodes } = useCanvasOperations({ router });
const added = await addNodes(nodes, {});
expect(added.length).toBe(2);
});
}); });
describe('revertAddNode', () => { describe('revertAddNode', () => {

View file

@ -494,6 +494,7 @@ export function useCanvasOperations({ router }: { router: ReturnType<typeof useR
) { ) {
let insertPosition = options.position; let insertPosition = options.position;
let lastAddedNode: INodeUi | undefined; let lastAddedNode: INodeUi | undefined;
const addedNodes: INodeUi[] = [];
const nodesWithTypeVersion = nodes.map((node) => { const nodesWithTypeVersion = nodes.map((node) => {
const typeVersion = const typeVersion =
@ -516,7 +517,7 @@ export function useCanvasOperations({ router }: { router: ReturnType<typeof useR
const nodeTypeDescription = requireNodeTypeDescription(node.type, node.typeVersion); const nodeTypeDescription = requireNodeTypeDescription(node.type, node.typeVersion);
try { try {
lastAddedNode = addNode( const newNode = addNode(
{ {
...node, ...node,
position, position,
@ -528,6 +529,8 @@ export function useCanvasOperations({ router }: { router: ReturnType<typeof useR
isAutoAdd, isAutoAdd,
}, },
); );
lastAddedNode = newNode;
addedNodes.push(newNode);
} catch (error) { } catch (error) {
toast.showError(error, i18n.baseText('error')); toast.showError(error, i18n.baseText('error'));
console.error(error); console.error(error);
@ -552,6 +555,8 @@ export function useCanvasOperations({ router }: { router: ReturnType<typeof useR
if (!options.keepPristine) { if (!options.keepPristine) {
uiStore.stateIsDirty = true; uiStore.stateIsDirty = true;
} }
return addedNodes;
} }
function updatePositionForNodeWithMultipleInputs(node: INodeUi) { function updatePositionForNodeWithMultipleInputs(node: INodeUi) {
@ -605,6 +610,10 @@ export function useCanvasOperations({ router }: { router: ReturnType<typeof useR
historyStore.pushCommandToUndo(new AddNodeCommand(nodeData)); historyStore.pushCommandToUndo(new AddNodeCommand(nodeData));
} }
if (!options.isAutoAdd) {
createConnectionToLastInteractedWithNode(nodeData, options);
}
void nextTick(() => { void nextTick(() => {
workflowsStore.setNodePristine(nodeData.name, true); workflowsStore.setNodePristine(nodeData.name, true);
@ -613,10 +622,6 @@ export function useCanvasOperations({ router }: { router: ReturnType<typeof useR
nodeHelpers.updateNodeCredentialIssues(nodeData); nodeHelpers.updateNodeCredentialIssues(nodeData);
nodeHelpers.updateNodeInputIssues(nodeData); nodeHelpers.updateNodeInputIssues(nodeData);
if (!options.isAutoAdd) {
createConnectionToLastInteractedWithNode(nodeData, options);
}
if (options.telemetry) { if (options.telemetry) {
trackAddNode(nodeData, options); trackAddNode(nodeData, options);
} }

View file

@ -859,8 +859,12 @@ async function onAddNodesAndConnections(
return; return;
} }
await addNodes(nodes, { dragAndDrop, position, trackHistory: true, telemetry: true }); const addedNodes = await addNodes(nodes, {
await nextTick(); dragAndDrop,
position,
trackHistory: true,
telemetry: true,
});
const offsetIndex = editableWorkflow.value.nodes.length - nodes.length; const offsetIndex = editableWorkflow.value.nodes.length - nodes.length;
const mappedConnections: CanvasConnectionCreateData[] = connections.map(({ from, to }) => { const mappedConnections: CanvasConnectionCreateData[] = connections.map(({ from, to }) => {
@ -886,9 +890,8 @@ async function onAddNodesAndConnections(
addConnections(mappedConnections); addConnections(mappedConnections);
void nextTick(() => { uiStore.resetLastInteractedWith();
uiStore.resetLastInteractedWith(); selectNodes([addedNodes[addedNodes.length - 1].id]);
});
} }
async function onRevertAddNode({ node }: { node: INodeUi }) { async function onRevertAddNode({ node }: { node: INodeUi }) {
@ -1565,6 +1568,7 @@ onBeforeUnmount(() => {
<template> <template>
<WorkflowCanvas <WorkflowCanvas
v-if="editableWorkflow && editableWorkflowObject && !isLoading" v-if="editableWorkflow && editableWorkflowObject && !isLoading"
:id="editableWorkflow.id"
:workflow="editableWorkflow" :workflow="editableWorkflow"
:workflow-object="editableWorkflowObject" :workflow-object="editableWorkflowObject"
:fallback-nodes="fallbackNodes" :fallback-nodes="fallbackNodes"