diff --git a/packages/editor-ui/src/components/WorkflowPreview.vue b/packages/editor-ui/src/components/WorkflowPreview.vue index 390559a69361e..814971bb1e002 100644 --- a/packages/editor-ui/src/components/WorkflowPreview.vue +++ b/packages/editor-ui/src/components/WorkflowPreview.vue @@ -27,6 +27,7 @@ import { useToast } from '@/composables'; import type { IWorkflowDb } from '@/Interface'; import { mapStores } from 'pinia'; import { useRootStore } from '@/stores/n8nRoot.store'; +import { useWorkflowsStore } from '@/stores'; export default defineComponent({ name: 'WorkflowPreview', @@ -73,7 +74,7 @@ export default defineComponent({ }; }, computed: { - ...mapStores(useRootStore), + ...mapStores(useRootStore, useWorkflowsStore), showPreview(): boolean { return ( !this.loading && @@ -134,6 +135,16 @@ export default defineComponent({ }), '*', ); + + if (this.workflowsStore.activeWorkflowExecution) { + iframeRef.contentWindow.postMessage( + JSON.stringify({ + command: 'setActiveExecution', + execution: this.workflowsStore.activeWorkflowExecution, + }), + '*', + ); + } } } catch (error) { this.showError( diff --git a/packages/editor-ui/src/mixins/workflowHelpers.ts b/packages/editor-ui/src/mixins/workflowHelpers.ts index 914f1dc0bb7d6..d9fb8a11db5b7 100644 --- a/packages/editor-ui/src/mixins/workflowHelpers.ts +++ b/packages/editor-ui/src/mixins/workflowHelpers.ts @@ -223,32 +223,36 @@ function connectionInputData( } } - const parentPinData = parentNode.reduce((acc: INodeExecutionData[], parentNodeName, index) => { - const pinData = useWorkflowsStore().pinDataByNodeName(parentNodeName); - - if (pinData) { - acc.push({ - json: pinData[0], - pairedItem: { - item: index, - input: 1, - }, - }); - } + const workflowsStore = useWorkflowsStore(); + + if (workflowsStore.shouldReplaceInputDataWithPinData) { + const parentPinData = parentNode.reduce((acc, parentNodeName, index) => { + const pinData = workflowsStore.pinDataByNodeName(parentNodeName); + + if (pinData) { + acc.push({ + json: pinData[0], + pairedItem: { + item: index, + input: 1, + }, + }); + } - return acc; - }, []); + return acc; + }, []); - if (parentPinData.length > 0) { - if (connectionInputData && connectionInputData.length > 0) { - parentPinData.forEach((parentPinDataEntry) => { - connectionInputData![0].json = { - ...connectionInputData![0].json, - ...parentPinDataEntry.json, - }; - }); - } else { - connectionInputData = parentPinData; + if (parentPinData.length > 0) { + if (connectionInputData && connectionInputData.length > 0) { + parentPinData.forEach((parentPinDataEntry) => { + connectionInputData![0].json = { + ...connectionInputData![0].json, + ...parentPinDataEntry.json, + }; + }); + } else { + connectionInputData = parentPinData; + } } } @@ -271,21 +275,24 @@ function executeData( // Add the input data to be able to also resolve the short expression format // which does not use the node name const parentNodeName = parentNode[0]; + const workflowsStore = useWorkflowsStore(); - const parentPinData = useWorkflowsStore().getPinData![parentNodeName]; + if (workflowsStore.shouldReplaceInputDataWithPinData) { + const parentPinData = workflowsStore.getPinData![parentNodeName]; - // populate `executeData` from `pinData` + // populate `executeData` from `pinData` - if (parentPinData) { - executeData.data = { main: [parentPinData] }; - executeData.source = { main: [{ previousNode: parentNodeName }] }; + if (parentPinData) { + executeData.data = { main: [parentPinData] }; + executeData.source = { main: [{ previousNode: parentNodeName }] }; - return executeData; + return executeData; + } } // populate `executeData` from `runData` - const workflowRunData = useWorkflowsStore().getWorkflowRunData; + const workflowRunData = workflowsStore.getWorkflowRunData; if (workflowRunData === null) { return executeData; } diff --git a/packages/editor-ui/src/stores/__tests__/workflows.test.ts b/packages/editor-ui/src/stores/__tests__/workflows.test.ts new file mode 100644 index 0000000000000..51d0a001bb881 --- /dev/null +++ b/packages/editor-ui/src/stores/__tests__/workflows.test.ts @@ -0,0 +1,31 @@ +import { createTestingPinia } from '@pinia/testing'; +import { useWorkflowsStore } from '@/stores'; + +let pinia: ReturnType; +beforeAll(() => { + pinia = createTestingPinia(); +}); + +describe('Workflows Store', () => { + describe('shouldReplaceInputDataWithPinData', () => { + beforeEach(() => { + pinia.state.value = { + workflows: useWorkflowsStore(), + }; + }); + + it('should return true if no active execution is set', () => { + expect(useWorkflowsStore().shouldReplaceInputDataWithPinData).toBe(true); + }); + + it('should return true if active execution is set and mode is manual', () => { + pinia.state.value.workflows.activeWorkflowExecution = { mode: 'manual' }; + expect(useWorkflowsStore().shouldReplaceInputDataWithPinData).toBe(true); + }); + + it('should return false if active execution is set and mode is not manual', () => { + pinia.state.value.workflows.activeWorkflowExecution = { mode: 'webhook' }; + expect(useWorkflowsStore().shouldReplaceInputDataWithPinData).toBe(false); + }); + }); +}); diff --git a/packages/editor-ui/src/stores/workflows.store.ts b/packages/editor-ui/src/stores/workflows.store.ts index aabfc53a9f85e..3a4517ca0da7a 100644 --- a/packages/editor-ui/src/stores/workflows.store.ts +++ b/packages/editor-ui/src/stores/workflows.store.ts @@ -248,6 +248,9 @@ export const useWorkflowsStore = defineStore(STORES.WORKFLOWS, { return acc; }, 0); }, + shouldReplaceInputDataWithPinData(): boolean { + return !this.activeWorkflowExecution || this.activeWorkflowExecution?.mode === 'manual'; + }, executedNode(): string | undefined { return this.workflowExecutionData ? this.workflowExecutionData.executedNode : undefined; }, diff --git a/packages/editor-ui/src/views/NodeView.vue b/packages/editor-ui/src/views/NodeView.vue index f60fb0cea689c..f2d2a2a4ab3c0 100644 --- a/packages/editor-ui/src/views/NodeView.vue +++ b/packages/editor-ui/src/views/NodeView.vue @@ -3604,6 +3604,8 @@ export default defineComponent({ type: 'error', }); } + } else if (json?.command === 'setActiveExecution') { + this.workflowsStore.activeWorkflowExecution = json.execution; } } catch (e) {} },