mirror of
https://github.com/n8n-io/n8n.git
synced 2025-03-05 20:50:17 -08:00
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:
parent
054fe9745f
commit
f67c0710e1
|
@ -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"
|
||||||
|
|
|
@ -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', () => {
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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"
|
||||||
|
|
Loading…
Reference in a new issue