diff --git a/cypress/e2e/13-pinning.cy.ts b/cypress/e2e/13-pinning.cy.ts index 8a3ea4a7c8..6f1c328fd9 100644 --- a/cypress/e2e/13-pinning.cy.ts +++ b/cypress/e2e/13-pinning.cy.ts @@ -1,3 +1,9 @@ +import { + HTTP_REQUEST_NODE_NAME, + MANUAL_TRIGGER_NODE_DISPLAY_NAME, + PIPEDRIVE_NODE_NAME, + SET_NODE_NAME, +} from '../constants'; import { WorkflowPage, NDV } from '../pages'; const workflowPage = new WorkflowPage(); @@ -44,7 +50,7 @@ describe('Data pinning', () => { }); }); - it('Should be be able to set pinned data', () => { + it('Should be able to set pinned data', () => { workflowPage.actions.addInitialNodeToCanvas('Schedule Trigger', { keepNdvOpen: true }); ndv.getters.container().should('be.visible'); ndv.getters.pinDataButton().should('not.exist'); @@ -67,4 +73,35 @@ describe('Data pinning', () => { ndv.getters.outputTableHeaders().first().should('include.text', 'test'); ndv.getters.outputTbodyCell(1, 0).should('include.text', 1); }); + + it('Should be able to reference paired items in a node located before pinned data', () => { + workflowPage.actions.addInitialNodeToCanvas(MANUAL_TRIGGER_NODE_DISPLAY_NAME); + workflowPage.actions.addNodeToCanvas(HTTP_REQUEST_NODE_NAME, true, true); + ndv.actions.setPinnedData([{ http: 123 }]); + ndv.actions.close(); + + workflowPage.actions.addNodeToCanvas(PIPEDRIVE_NODE_NAME, true, true); + ndv.actions.setPinnedData(Array(3).fill({ pipedrive: 123 })); + ndv.actions.close(); + + workflowPage.actions.addNodeToCanvas(SET_NODE_NAME, true, true); + setExpressionOnStringValueInSet(`{{ $('${HTTP_REQUEST_NODE_NAME}').item`); + + const output = '[Object: {"json": {"http": 123}, "pairedItem": {"item": 0}}]'; + + cy.get('div').contains(output).should('be.visible'); + }); }); + +function setExpressionOnStringValueInSet(expression: string) { + cy.get('button').contains('Execute node').click(); + cy.get('input[placeholder="Add Value"]').click(); + cy.get('span').contains('String').click(); + + ndv.getters.nthParam(3).contains('Expression').invoke('show').click(); + + ndv.getters + .inlineExpressionEditorInput() + .clear() + .type(expression, { parseSpecialCharSequences: false }); +} diff --git a/packages/editor-ui/src/mixins/workflowHelpers.ts b/packages/editor-ui/src/mixins/workflowHelpers.ts index e3bdecac32..c4037e6d62 100644 --- a/packages/editor-ui/src/mixins/workflowHelpers.ts +++ b/packages/editor-ui/src/mixins/workflowHelpers.ts @@ -140,33 +140,6 @@ export function resolveParameter( runExecutionData = executionData.data; } - parentNode.forEach((parentNodeName) => { - const pinData: IPinData[string] | undefined = - useWorkflowsStore().pinDataByNodeName(parentNodeName); - - if (pinData) { - runExecutionData = { - ...runExecutionData, - resultData: { - ...runExecutionData.resultData, - runData: { - ...runExecutionData.resultData.runData, - [parentNodeName]: [ - { - startTime: new Date().valueOf(), - executionTime: 0, - source: [], - data: { - main: [pinData.map((data) => ({ json: data }))], - }, - }, - ], - }, - }, - }; - } - }); - if (_connectionInputData === null) { _connectionInputData = []; } @@ -254,7 +227,7 @@ function getWorkflow(nodes: INodeUi[], connections: IConnections, copyData?: boo nodeTypes, settings: useWorkflowsStore().workflowSettings, // @ts-ignore - pinData: useWorkflowsStore().pinData, + pinData: useWorkflowsStore().getPinData, }); return cachedWorkflow; diff --git a/packages/workflow/src/WorkflowDataProxy.ts b/packages/workflow/src/WorkflowDataProxy.ts index b90b21a134..48567826ae 100644 --- a/packages/workflow/src/WorkflowDataProxy.ts +++ b/packages/workflow/src/WorkflowDataProxy.ts @@ -719,18 +719,11 @@ export class WorkflowDataProxy { }; } - const previousNodeHasPinData = - sourceData && this.workflow.getPinDataOfNode(sourceData.previousNode) !== undefined; - let currentPairedItem = pairedItem; let nodeBeforeLast: string | undefined; - while ( - !previousNodeHasPinData && - sourceData !== null && - destinationNodeName !== sourceData.previousNode - ) { + while (sourceData !== null && destinationNodeName !== sourceData.previousNode) { taskData = that.runExecutionData!.resultData.runData[sourceData.previousNode][ sourceData?.previousNodeRun || 0