Skip to content

Commit

Permalink
fix: Show actual execution data for production executions even if pin…
Browse files Browse the repository at this point in the history
… data exists (#6302)
  • Loading branch information
alexgrozav committed Jun 1, 2023
1 parent b5cabfe commit 4eb8437
Show file tree
Hide file tree
Showing 5 changed files with 86 additions and 32 deletions.
13 changes: 12 additions & 1 deletion packages/editor-ui/src/components/WorkflowPreview.vue
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand Down Expand Up @@ -73,7 +74,7 @@ export default defineComponent({
};
},
computed: {
...mapStores(useRootStore),
...mapStores(useRootStore, useWorkflowsStore),
showPreview(): boolean {
return (
!this.loading &&
Expand Down Expand Up @@ -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(
Expand Down
69 changes: 38 additions & 31 deletions packages/editor-ui/src/mixins/workflowHelpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<INodeExecutionData[]>((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;
}
}
}

Expand All @@ -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;
}
Expand Down
31 changes: 31 additions & 0 deletions packages/editor-ui/src/stores/__tests__/workflows.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import { createTestingPinia } from '@pinia/testing';
import { useWorkflowsStore } from '@/stores';

let pinia: ReturnType<typeof createTestingPinia>;
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);
});
});
});
3 changes: 3 additions & 0 deletions packages/editor-ui/src/stores/workflows.store.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
},
Expand Down
2 changes: 2 additions & 0 deletions packages/editor-ui/src/views/NodeView.vue
Original file line number Diff line number Diff line change
Expand Up @@ -3622,6 +3622,8 @@ export default defineComponent({
type: 'error',
});
}
} else if (json?.command === 'setActiveExecution') {
this.workflowsStore.activeWorkflowExecution = json.execution;
}
} catch (e) {}
},
Expand Down

0 comments on commit 4eb8437

Please sign in to comment.