From e98c7f160b018243dc88490d46fb1047a4d7fcdc Mon Sep 17 00:00:00 2001 From: Michael Kret <88898367+michael-radency@users.noreply.github.com> Date: Mon, 16 Dec 2024 17:30:11 +0200 Subject: [PATCH] feat: Send and wait operation - freeText and customForm response types (#12106) --- .../cli/templates/form-trigger.handlebars | 6 +- packages/nodes-base/nodes/Form/Form.node.ts | 77 +++--- packages/nodes-base/nodes/Form/interfaces.ts | 1 + packages/nodes-base/nodes/Form/utils.ts | 3 + .../nodes/Google/Gmail/Gmail.node.json | 2 +- .../nodes/Google/Gmail/v2/GmailV2.node.ts | 9 + .../Google/Gmail/v2/MessageDescription.ts | 4 +- .../nodes-base/nodes/Slack/Slack.node.json | 1 + .../nodes/Slack/V2/MessageDescription.ts | 4 +- .../nodes-base/nodes/Slack/V2/SlackV2.node.ts | 9 + .../utils/sendAndWait/email-templates.ts | 2 +- .../utils/sendAndWait/test/util.test.ts | 160 ++++++++++- .../nodes-base/utils/sendAndWait/utils.ts | 255 +++++++++++++++++- 13 files changed, 475 insertions(+), 58 deletions(-) diff --git a/packages/cli/templates/form-trigger.handlebars b/packages/cli/templates/form-trigger.handlebars index 8d2b13e5a793a..ee868b072fd05 100644 --- a/packages/cli/templates/form-trigger.handlebars +++ b/packages/cli/templates/form-trigger.handlebars @@ -450,7 +450,11 @@
{{formSubmittedText}} diff --git a/packages/nodes-base/nodes/Form/Form.node.ts b/packages/nodes-base/nodes/Form/Form.node.ts index 62e3121a20fee..b6f0d852c0af1 100644 --- a/packages/nodes-base/nodes/Form/Form.node.ts +++ b/packages/nodes-base/nodes/Form/Form.node.ts @@ -2,6 +2,7 @@ import type { FormFieldsParameter, IExecuteFunctions, INodeExecutionData, + INodeProperties, INodeTypeDescription, IWebhookFunctions, NodeTypeAndVersion, @@ -22,6 +23,45 @@ import { formDescription, formFields, formTitle } from '../Form/common.descripti import { prepareFormReturnItem, renderForm, resolveRawData } from '../Form/utils'; import { type CompletionPageConfig } from './interfaces'; +export const formFieldsProperties: INodeProperties[] = [ + { + displayName: 'Define Form', + name: 'defineForm', + type: 'options', + noDataExpression: true, + options: [ + { + name: 'Using Fields Below', + value: 'fields', + }, + { + name: 'Using JSON', + value: 'json', + }, + ], + default: 'fields', + }, + { + displayName: 'Form Fields', + name: 'jsonOutput', + type: 'json', + typeOptions: { + rows: 5, + }, + default: + '[\n {\n "fieldLabel":"Name",\n "placeholder":"enter you name",\n "requiredField":true\n },\n {\n "fieldLabel":"Age",\n "fieldType":"number",\n "placeholder":"enter your age"\n },\n {\n "fieldLabel":"Email",\n "fieldType":"email",\n "requiredField":true\n }\n]', + validateType: 'form-fields', + ignoreValidationDuringExecution: true, + hint: 'See docs for field syntax', + displayOptions: { + show: { + defineForm: ['json'], + }, + }, + }, + { ...formFields, displayOptions: { show: { defineForm: ['fields'] } } }, +]; + const pageProperties = updateDisplayOptions( { show: { @@ -29,42 +69,7 @@ const pageProperties = updateDisplayOptions( }, }, [ - { - displayName: 'Define Form', - name: 'defineForm', - type: 'options', - noDataExpression: true, - options: [ - { - name: 'Using Fields Below', - value: 'fields', - }, - { - name: 'Using JSON', - value: 'json', - }, - ], - default: 'fields', - }, - { - displayName: 'Form Fields', - name: 'jsonOutput', - type: 'json', - typeOptions: { - rows: 5, - }, - default: - '[\n {\n "fieldLabel":"Name",\n "placeholder":"enter you name",\n "requiredField":true\n },\n {\n "fieldLabel":"Age",\n "fieldType":"number",\n "placeholder":"enter your age"\n },\n {\n "fieldLabel":"Email",\n "fieldType":"email",\n "requiredField":true\n }\n]', - validateType: 'form-fields', - ignoreValidationDuringExecution: true, - hint: 'See docs for field syntax', - displayOptions: { - show: { - defineForm: ['json'], - }, - }, - }, - { ...formFields, displayOptions: { show: { defineForm: ['fields'] } } }, + ...formFieldsProperties, { displayName: 'Options', name: 'options', diff --git a/packages/nodes-base/nodes/Form/interfaces.ts b/packages/nodes-base/nodes/Form/interfaces.ts index ce2196949a437..bf69644c77441 100644 --- a/packages/nodes-base/nodes/Form/interfaces.ts +++ b/packages/nodes-base/nodes/Form/interfaces.ts @@ -22,6 +22,7 @@ export type FormTriggerData = { validForm: boolean; formTitle: string; formDescription?: string; + formSubmittedHeader?: string; formSubmittedText?: string; redirectUrl?: string; n8nWebsiteLink: string; diff --git a/packages/nodes-base/nodes/Form/utils.ts b/packages/nodes-base/nodes/Form/utils.ts index 2809024e2b6d1..8eb4a8d3a5e5c 100644 --- a/packages/nodes-base/nodes/Form/utils.ts +++ b/packages/nodes-base/nodes/Form/utils.ts @@ -28,6 +28,7 @@ import { getResolvables } from '../../utils/utilities'; export function prepareFormData({ formTitle, formDescription, + formSubmittedHeader, formSubmittedText, redirectUrl, formFields, @@ -49,6 +50,7 @@ export function prepareFormData({ useResponseData?: boolean; appendAttribution?: boolean; buttonLabel?: string; + formSubmittedHeader?: string; }) { const validForm = formFields.length > 0; const utm_campaign = instanceId ? `&utm_campaign=${instanceId}` : ''; @@ -63,6 +65,7 @@ export function prepareFormData({ validForm, formTitle, formDescription, + formSubmittedHeader, formSubmittedText, n8nWebsiteLink, formFields: [], diff --git a/packages/nodes-base/nodes/Google/Gmail/Gmail.node.json b/packages/nodes-base/nodes/Google/Gmail/Gmail.node.json index f55b13a1667db..878e9c06778ee 100644 --- a/packages/nodes-base/nodes/Google/Gmail/Gmail.node.json +++ b/packages/nodes-base/nodes/Google/Gmail/Gmail.node.json @@ -52,5 +52,5 @@ } ] }, - "alias": ["email"] + "alias": ["email", "human", "form", "wait"] } diff --git a/packages/nodes-base/nodes/Google/Gmail/v2/GmailV2.node.ts b/packages/nodes-base/nodes/Google/Gmail/v2/GmailV2.node.ts index debb9a7fbc3c7..0be7c6507dda6 100644 --- a/packages/nodes-base/nodes/Google/Gmail/v2/GmailV2.node.ts +++ b/packages/nodes-base/nodes/Google/Gmail/v2/GmailV2.node.ts @@ -88,6 +88,15 @@ const versionDescription: INodeTypeDescription = { restartWebhook: true, isFullPath: true, }, + { + name: 'default', + httpMethod: 'POST', + responseMode: 'onReceived', + responseData: '', + path: '={{ $nodeId }}', + restartWebhook: true, + isFullPath: true, + }, ], properties: [ { diff --git a/packages/nodes-base/nodes/Google/Gmail/v2/MessageDescription.ts b/packages/nodes-base/nodes/Google/Gmail/v2/MessageDescription.ts index 83b1e6fcb0245..426d78bbb5d97 100644 --- a/packages/nodes-base/nodes/Google/Gmail/v2/MessageDescription.ts +++ b/packages/nodes-base/nodes/Google/Gmail/v2/MessageDescription.ts @@ -59,9 +59,9 @@ export const messageOperations: INodeProperties[] = [ action: 'Send a message', }, { - name: 'Send and Wait for Approval', + name: 'Send and Wait for Response', value: SEND_AND_WAIT_OPERATION, - action: 'Send a message and wait for approval', + action: 'Send message and wait for response', }, ], default: 'send', diff --git a/packages/nodes-base/nodes/Slack/Slack.node.json b/packages/nodes-base/nodes/Slack/Slack.node.json index a81eeef453026..3ac416b245353 100644 --- a/packages/nodes-base/nodes/Slack/Slack.node.json +++ b/packages/nodes-base/nodes/Slack/Slack.node.json @@ -3,6 +3,7 @@ "nodeVersion": "1.0", "codexVersion": "1.0", "categories": ["Communication"], + "alias": ["human", "form", "wait"], "resources": { "credentialDocumentation": [ { diff --git a/packages/nodes-base/nodes/Slack/V2/MessageDescription.ts b/packages/nodes-base/nodes/Slack/V2/MessageDescription.ts index de31614b44fda..93d1cfc4e2db7 100644 --- a/packages/nodes-base/nodes/Slack/V2/MessageDescription.ts +++ b/packages/nodes-base/nodes/Slack/V2/MessageDescription.ts @@ -33,9 +33,9 @@ export const messageOperations: INodeProperties[] = [ action: 'Send a message', }, { - name: 'Send and Wait for Approval', + name: 'Send and Wait for Response', value: SEND_AND_WAIT_OPERATION, - action: 'Send a message and wait for approval', + action: 'Send message and wait for response', }, { name: 'Update', diff --git a/packages/nodes-base/nodes/Slack/V2/SlackV2.node.ts b/packages/nodes-base/nodes/Slack/V2/SlackV2.node.ts index 5966e7a7b457a..195ae91313158 100644 --- a/packages/nodes-base/nodes/Slack/V2/SlackV2.node.ts +++ b/packages/nodes-base/nodes/Slack/V2/SlackV2.node.ts @@ -89,6 +89,15 @@ export class SlackV2 implements INodeType { restartWebhook: true, isFullPath: true, }, + { + name: 'default', + httpMethod: 'POST', + responseMode: 'onReceived', + responseData: '', + path: '={{ $nodeId }}', + restartWebhook: true, + isFullPath: true, + }, ], properties: [ { diff --git a/packages/nodes-base/utils/sendAndWait/email-templates.ts b/packages/nodes-base/utils/sendAndWait/email-templates.ts index 8c9bd20345db2..1b0bc6153d709 100644 --- a/packages/nodes-base/utils/sendAndWait/email-templates.ts +++ b/packages/nodes-base/utils/sendAndWait/email-templates.ts @@ -103,7 +103,7 @@ export function createEmailBody(message: string, buttons: string, instanceId?: s
${message}
+${message}