Skip to content

Commit 652b8d1

Browse files
fix(Wait Node): Fix for hasNextPage in waiting forms (#12636)
1 parent 847aa12 commit 652b8d1

File tree

4 files changed

+66
-9
lines changed

4 files changed

+66
-9
lines changed

Diff for: packages/core/src/execution-engine/node-execution-context/node-execution-context.ts

+9-3
Original file line numberDiff line numberDiff line change
@@ -79,18 +79,24 @@ export abstract class NodeExecutionContext implements Omit<FunctionsBase, 'getCr
7979
return this.workflow.getStaticData(type, this.node);
8080
}
8181

82-
getChildNodes(nodeName: string) {
82+
getChildNodes(nodeName: string, options?: { includeNodeParameters?: boolean }) {
8383
const output: NodeTypeAndVersion[] = [];
8484
const nodeNames = this.workflow.getChildNodes(nodeName);
8585

8686
for (const n of nodeNames) {
8787
const node = this.workflow.nodes[n];
88-
output.push({
88+
const entry: NodeTypeAndVersion = {
8989
name: node.name,
9090
type: node.type,
9191
typeVersion: node.typeVersion,
9292
disabled: node.disabled ?? false,
93-
});
93+
};
94+
95+
if (options?.includeNodeParameters) {
96+
entry.parameters = node.parameters;
97+
}
98+
99+
output.push(entry);
94100
}
95101
return output;
96102
}

Diff for: packages/nodes-base/nodes/Form/test/utils.test.ts

+41-1
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,16 @@ import type {
55
INode,
66
IWebhookFunctions,
77
MultiPartFormData,
8+
NodeTypeAndVersion,
89
} from 'n8n-workflow';
910

10-
import { formWebhook, prepareFormData, prepareFormReturnItem, resolveRawData } from '../utils';
11+
import {
12+
formWebhook,
13+
prepareFormData,
14+
prepareFormReturnItem,
15+
resolveRawData,
16+
isFormConnected,
17+
} from '../utils';
1118

1219
describe('FormTrigger, formWebhook', () => {
1320
beforeEach(() => {
@@ -721,3 +728,36 @@ describe('resolveRawData', () => {
721728
);
722729
});
723730
});
731+
732+
describe('FormTrigger, isFormConnected', () => {
733+
it('should return false if Wait node is connected but resume parameter is not form', async () => {
734+
const result = isFormConnected([
735+
mock<NodeTypeAndVersion>({
736+
type: 'n8n-nodes-base.wait',
737+
parameters: {
738+
resume: 'timeInterval',
739+
},
740+
}),
741+
]);
742+
expect(result).toBe(false);
743+
});
744+
it('should return true if Wait node is connected and resume parameter is form', async () => {
745+
const result = isFormConnected([
746+
mock<NodeTypeAndVersion>({
747+
type: 'n8n-nodes-base.wait',
748+
parameters: {
749+
resume: 'form',
750+
},
751+
}),
752+
]);
753+
expect(result).toBe(true);
754+
});
755+
it('should return true if Form node is connected', async () => {
756+
const result = isFormConnected([
757+
mock<NodeTypeAndVersion>({
758+
type: 'n8n-nodes-base.form',
759+
}),
760+
]);
761+
expect(result).toBe(true);
762+
});
763+
});

Diff for: packages/nodes-base/nodes/Form/utils.ts

+11-4
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,13 @@ export function renderForm({
326326
res.render('form-trigger', data);
327327
}
328328

329+
export const isFormConnected = (nodes: NodeTypeAndVersion[]) => {
330+
return nodes.some(
331+
(n) =>
332+
n.type === FORM_NODE_TYPE || (n.type === WAIT_NODE_TYPE && n.parameters?.resume === 'form'),
333+
);
334+
};
335+
329336
export async function formWebhook(
330337
context: IWebhookFunctions,
331338
authProperty = FORM_TRIGGER_AUTHENTICATION_PROPERTY,
@@ -403,10 +410,10 @@ export async function formWebhook(
403410
}
404411

405412
if (!redirectUrl && node.type !== FORM_TRIGGER_NODE_TYPE) {
406-
const connectedNodes = context.getChildNodes(context.getNode().name);
407-
const hasNextPage = connectedNodes.some(
408-
(n) => n.type === FORM_NODE_TYPE || n.type === WAIT_NODE_TYPE,
409-
);
413+
const connectedNodes = context.getChildNodes(context.getNode().name, {
414+
includeNodeParameters: true,
415+
});
416+
const hasNextPage = isFormConnected(connectedNodes);
410417

411418
if (hasNextPage) {
412419
redirectUrl = context.evaluateExpression('{{ $execution.resumeFormUrl }}') as string;

Diff for: packages/workflow/src/Interfaces.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -852,6 +852,7 @@ export type NodeTypeAndVersion = {
852852
type: string;
853853
typeVersion: number;
854854
disabled: boolean;
855+
parameters?: INodeParameters;
855856
};
856857

857858
export interface FunctionsBase {
@@ -869,7 +870,10 @@ export interface FunctionsBase {
869870
getRestApiUrl(): string;
870871
getInstanceBaseUrl(): string;
871872
getInstanceId(): string;
872-
getChildNodes(nodeName: string): NodeTypeAndVersion[];
873+
getChildNodes(
874+
nodeName: string,
875+
options?: { includeNodeParameters?: boolean },
876+
): NodeTypeAndVersion[];
873877
getParentNodes(nodeName: string): NodeTypeAndVersion[];
874878
getKnownNodeTypes(): IDataObject;
875879
getMode?: () => WorkflowExecuteMode;

0 commit comments

Comments
 (0)