From 7f3cd697e84c9b0683ca86659565f10a168c0c5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Milorad=20FIlipovi=C4=87?= Date: Fri, 24 Jan 2025 14:47:14 +0100 Subject: [PATCH 01/13] feat(editor): Updating copy around execute workflow nodes (no-changelog) --- packages/editor-ui/src/constants.workflows.ts | 4 ++-- .../ExecuteWorkflow/ExecuteWorkflow/ExecuteWorkflow.node.json | 2 +- .../ExecuteWorkflow/ExecuteWorkflow/ExecuteWorkflow.node.ts | 4 ++-- .../ExecuteWorkflowTrigger/ExecuteWorkflowTrigger.node.ts | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/editor-ui/src/constants.workflows.ts b/packages/editor-ui/src/constants.workflows.ts index 3816ea80a8771..05884c3c85f17 100644 --- a/packages/editor-ui/src/constants.workflows.ts +++ b/packages/editor-ui/src/constants.workflows.ts @@ -10,7 +10,7 @@ export const SAMPLE_SUBWORKFLOW_WORKFLOW: WorkflowDataWithTemplateId = { { id: 'c055762a-8fe7-4141-a639-df2372f30060', typeVersion: 1.1, - name: 'Workflow Input Trigger', + name: 'When Called by Another Workflow', type: 'n8n-nodes-base.executeWorkflowTrigger', position: [260, 340], parameters: {}, @@ -24,7 +24,7 @@ export const SAMPLE_SUBWORKFLOW_WORKFLOW: WorkflowDataWithTemplateId = { }, ] as INodeUi[], connections: { - 'Workflow Input Trigger': { + 'When Called by Another Workflow': { main: [ [ { diff --git a/packages/nodes-base/nodes/ExecuteWorkflow/ExecuteWorkflow/ExecuteWorkflow.node.json b/packages/nodes-base/nodes/ExecuteWorkflow/ExecuteWorkflow/ExecuteWorkflow.node.json index 9fc522970319a..9212ce8a62862 100644 --- a/packages/nodes-base/nodes/ExecuteWorkflow/ExecuteWorkflow/ExecuteWorkflow.node.json +++ b/packages/nodes-base/nodes/ExecuteWorkflow/ExecuteWorkflow/ExecuteWorkflow.node.json @@ -11,7 +11,7 @@ } ] }, - "alias": ["n8n"], + "alias": ["n8n", "call", "sub", "workflow", "sub-workflow", "subworkflow"], "subcategories": { "Core Nodes": ["Helpers", "Flow"] } diff --git a/packages/nodes-base/nodes/ExecuteWorkflow/ExecuteWorkflow/ExecuteWorkflow.node.ts b/packages/nodes-base/nodes/ExecuteWorkflow/ExecuteWorkflow/ExecuteWorkflow.node.ts index a04ef4375c538..6b5f4bd1873ae 100644 --- a/packages/nodes-base/nodes/ExecuteWorkflow/ExecuteWorkflow/ExecuteWorkflow.node.ts +++ b/packages/nodes-base/nodes/ExecuteWorkflow/ExecuteWorkflow/ExecuteWorkflow.node.ts @@ -15,7 +15,7 @@ import { } from '../../../utils/workflowInputsResourceMapping/GenericFunctions'; export class ExecuteWorkflow implements INodeType { description: INodeTypeDescription = { - displayName: 'Execute Workflow', + displayName: 'Execute Sub-workflow', name: 'executeWorkflow', icon: 'fa:sign-in-alt', iconColor: 'orange-red', @@ -38,7 +38,7 @@ export class ExecuteWorkflow implements INodeType { default: 'call_workflow', options: [ { - name: 'Call Another Workflow', + name: 'Execute a Sub-Workflow', value: 'call_workflow', }, ], diff --git a/packages/nodes-base/nodes/ExecuteWorkflow/ExecuteWorkflowTrigger/ExecuteWorkflowTrigger.node.ts b/packages/nodes-base/nodes/ExecuteWorkflow/ExecuteWorkflowTrigger/ExecuteWorkflowTrigger.node.ts index a15780a80ea7a..4e38f80aa3567 100644 --- a/packages/nodes-base/nodes/ExecuteWorkflow/ExecuteWorkflowTrigger/ExecuteWorkflowTrigger.node.ts +++ b/packages/nodes-base/nodes/ExecuteWorkflow/ExecuteWorkflowTrigger/ExecuteWorkflowTrigger.node.ts @@ -30,7 +30,7 @@ export class ExecuteWorkflowTrigger implements INodeType { eventTriggerDescription: '', maxNodes: 1, defaults: { - name: 'Workflow Input Trigger', + name: 'When Called by Another Workflow', color: '#ff6d5a', }, inputs: [], From bd440de9f9fb46c18af28ee5a175716fec9fd6fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Milorad=20FIlipovi=C4=87?= Date: Fri, 24 Jan 2025 15:08:58 +0100 Subject: [PATCH 02/13] =?UTF-8?q?=F0=9F=92=84=20Updating=20copy=20in=20the?= =?UTF-8?q?=20`Execute=20Workflow=20Trigger`=20node?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ExecuteWorkflowTrigger.node.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/nodes-base/nodes/ExecuteWorkflow/ExecuteWorkflowTrigger/ExecuteWorkflowTrigger.node.ts b/packages/nodes-base/nodes/ExecuteWorkflow/ExecuteWorkflowTrigger/ExecuteWorkflowTrigger.node.ts index 4e38f80aa3567..254f16fc6c497 100644 --- a/packages/nodes-base/nodes/ExecuteWorkflow/ExecuteWorkflowTrigger/ExecuteWorkflowTrigger.node.ts +++ b/packages/nodes-base/nodes/ExecuteWorkflow/ExecuteWorkflowTrigger/ExecuteWorkflowTrigger.node.ts @@ -37,7 +37,8 @@ export class ExecuteWorkflowTrigger implements INodeType { outputs: [NodeConnectionType.Main], hints: [ { - message: 'Please make sure to define your input fields.', + message: + "This workflow isn't set to accept any input data. Fill out the workflow input schema or change the workflow to accept any data passed to it.", // This condition checks if we have no input fields, which gets a bit awkward: // For WORKFLOW_INPUTS: keys() only contains `VALUES` if at least one value is provided // For JSON_EXAMPLE: We remove all whitespace and check if we're left with an empty object. Note that we already error if the example is not valid JSON @@ -142,7 +143,7 @@ export class ExecuteWorkflowTrigger implements INodeType { }, }, { - displayName: 'Workflow Inputs', + displayName: 'Workflow Input Schema', name: WORKFLOW_INPUTS, placeholder: 'Add field', type: 'fixedCollection', @@ -168,7 +169,8 @@ export class ExecuteWorkflowTrigger implements INodeType { type: 'string', default: '', placeholder: 'e.g. fieldName', - description: 'Name of the field', + description: + 'A unique name for this workflow input, used to reference it from another workflows', required: true, noDataExpression: true, }, @@ -176,7 +178,8 @@ export class ExecuteWorkflowTrigger implements INodeType { displayName: 'Type', name: 'type', type: 'options', - description: 'The field value type', + description: + "Expected data type for this input value. Determines how this field's values are stored, validated, and displayed.", options: TYPE_OPTIONS, required: true, default: 'string', From 34908d89fa16130a5dcfe2076e3ef0a134c3a9b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Milorad=20FIlipovi=C4=87?= Date: Fri, 24 Jan 2025 16:31:17 +0100 Subject: [PATCH 03/13] =?UTF-8?q?=E2=9C=A8=20Initial=20implementation=20of?= =?UTF-8?q?=20custom=20empty=20state=20notice?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ResourceMapper/ResourceMapper.vue | 11 ++++++-- .../ExecuteWorkflowTrigger.node.ts | 4 +-- .../GenericFunctions.ts | 28 ++++++++++++++++--- packages/workflow/src/Interfaces.ts | 2 ++ 4 files changed, 37 insertions(+), 8 deletions(-) diff --git a/packages/editor-ui/src/components/ResourceMapper/ResourceMapper.vue b/packages/editor-ui/src/components/ResourceMapper/ResourceMapper.vue index c4ef8d816135e..2292de977e186 100644 --- a/packages/editor-ui/src/components/ResourceMapper/ResourceMapper.vue +++ b/packages/editor-ui/src/components/ResourceMapper/ResourceMapper.vue @@ -28,7 +28,7 @@ import { i18n as locale } from '@/plugins/i18n'; import { useNDVStore } from '@/stores/ndv.store'; import { useWorkflowsStore } from '@/stores/workflows.store'; import { useDocumentVisibility } from '@/composables/useDocumentVisibility'; -import { N8nButton, N8nCallout } from 'n8n-design-system'; +import { N8nButton, N8nCallout, N8nNotice } from 'n8n-design-system'; type Props = { parameter: INodeProperties; @@ -74,6 +74,7 @@ const state = reactive({ refreshInProgress: false, // Shows inline loader when refreshing fields loadingError: false, hasStaleFields: false, + emptyFieldsNotice: '', }); // Reload fields to map when dependent parameters change @@ -315,7 +316,7 @@ async function fetchFields(): Promise { const { resourceMapperMethod, localResourceMapperMethod } = props.parameter.typeOptions?.resourceMapper ?? {}; - let fetchedFields = null; + let fetchedFields: ResourceMapperFields | null = null; if (typeof resourceMapperMethod === 'string') { const requestParams = createRequestParams( @@ -329,6 +330,9 @@ async function fetchFields(): Promise { fetchedFields = await nodeTypesStore.getLocalResourceMapperFields(requestParams); } + if (fetchedFields?.emptyFieldsNotice) { + state.emptyFieldsNotice = fetchedFields.emptyFieldsNotice; + } return fetchedFields; } @@ -619,6 +623,9 @@ defineExpose({ @add-field="addField" @refresh-field-list="initFetching(true)" /> + + {{ state.emptyFieldsNotice }} + {{ locale.baseText('resourceMapper.staleDataWarning.notice') }}