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">
<Canvas
v-if="workflow"
:id="id"
:nodes="mappedNodes"
:connections="mappedConnections"
: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[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', () => {

View file

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

View file

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