From ed3ad6d684597f7c4b7419dfa81d476e66f10eba Mon Sep 17 00:00:00 2001 From: Michael Kret <88898367+michael-radency@users.noreply.github.com> Date: Wed, 13 Nov 2024 13:44:44 +0200 Subject: [PATCH 01/16] fix(n8n Form Node): Find completion page (#11674) --- .../webhooks/__tests__/waiting-forms.test.ts | 199 ++++++++++++++++++ packages/cli/src/webhooks/waiting-forms.ts | 62 +++--- 2 files changed, 234 insertions(+), 27 deletions(-) create mode 100644 packages/cli/src/webhooks/__tests__/waiting-forms.test.ts diff --git a/packages/cli/src/webhooks/__tests__/waiting-forms.test.ts b/packages/cli/src/webhooks/__tests__/waiting-forms.test.ts new file mode 100644 index 00000000000..bec6f95d7fa --- /dev/null +++ b/packages/cli/src/webhooks/__tests__/waiting-forms.test.ts @@ -0,0 +1,199 @@ +import { mock } from 'jest-mock-extended'; +import { FORM_NODE_TYPE, type Workflow } from 'n8n-workflow'; + +import type { ExecutionRepository } from '@/databases/repositories/execution.repository'; +import { WaitingForms } from '@/webhooks/waiting-forms'; + +describe('WaitingForms', () => { + const executionRepository = mock(); + const waitingWebhooks = new WaitingForms(mock(), mock(), executionRepository); + + beforeEach(() => { + jest.restoreAllMocks(); + }); + + describe('findCompletionPage', () => { + it('should return lastNodeExecuted if it is a non-disabled form completion node', () => { + const workflow = mock({ + getParentNodes: jest.fn().mockReturnValue([]), + nodes: { + Form1: { + disabled: undefined, + type: FORM_NODE_TYPE, + parameters: { + operation: 'completion', + }, + }, + }, + }); + + const result = waitingWebhooks.findCompletionPage(workflow, {}, 'Form1'); + expect(result).toBe('Form1'); + }); + + it('should return undefined if lastNodeExecuted is disabled', () => { + const workflow = mock({ + getParentNodes: jest.fn().mockReturnValue([]), + nodes: { + Form1: { + disabled: true, + type: FORM_NODE_TYPE, + parameters: { + operation: 'completion', + }, + }, + }, + }); + + const result = waitingWebhooks.findCompletionPage(workflow, {}, 'Form1'); + expect(result).toBeUndefined(); + }); + + it('should return undefined if lastNodeExecuted is not a form node', () => { + const workflow = mock({ + getParentNodes: jest.fn().mockReturnValue([]), + nodes: { + NonForm: { + disabled: undefined, + type: 'other-node-type', + parameters: {}, + }, + }, + }); + + const result = waitingWebhooks.findCompletionPage(workflow, {}, 'NonForm'); + expect(result).toBeUndefined(); + }); + + it('should return undefined if lastNodeExecuted operation is not completion', () => { + const workflow = mock({ + getParentNodes: jest.fn().mockReturnValue([]), + nodes: { + Form1: { + disabled: undefined, + type: FORM_NODE_TYPE, + parameters: { + operation: 'page', + }, + }, + }, + }); + + const result = waitingWebhooks.findCompletionPage(workflow, {}, 'Form1'); + expect(result).toBeUndefined(); + }); + + it('should find first valid completion form in parent nodes if lastNodeExecuted is not valid', () => { + const workflow = mock({ + getParentNodes: jest.fn().mockReturnValue(['Form1', 'Form2', 'Form3']), + nodes: { + LastNode: { + disabled: undefined, + type: 'other-node-type', + parameters: {}, + }, + Form1: { + disabled: true, + type: FORM_NODE_TYPE, + parameters: { + operation: 'completion', + }, + }, + Form2: { + disabled: undefined, + type: FORM_NODE_TYPE, + parameters: { + operation: 'completion', + }, + }, + Form3: { + disabled: undefined, + type: FORM_NODE_TYPE, + parameters: { + operation: 'completion', + }, + }, + }, + }); + + const runData = { + Form2: [], + Form3: [], + }; + + const result = waitingWebhooks.findCompletionPage(workflow, runData, 'LastNode'); + expect(result).toBe('Form3'); + }); + + it('should return undefined if no valid completion form is found in parent nodes', () => { + const workflow = mock({ + getParentNodes: jest.fn().mockReturnValue(['Form1', 'Form2']), + nodes: { + LastNode: { + disabled: undefined, + type: 'other-node-type', + parameters: {}, + }, + Form1: { + disabled: true, + type: FORM_NODE_TYPE, + parameters: { + operation: 'completion', + }, + }, + Form2: { + disabled: undefined, + type: FORM_NODE_TYPE, + parameters: { + operation: 'submit', + }, + }, + }, + }); + + const result = waitingWebhooks.findCompletionPage(workflow, {}, 'LastNode'); + expect(result).toBeUndefined(); + }); + + it('should skip parent nodes without runData', () => { + const workflow = mock({ + getParentNodes: jest.fn().mockReturnValue(['Form1', 'Form2', 'Form3']), + nodes: { + LastNode: { + disabled: undefined, + type: 'other-node-type', + parameters: {}, + }, + Form1: { + disabled: undefined, + type: FORM_NODE_TYPE, + parameters: { + operation: 'completion', + }, + }, + Form2: { + disabled: undefined, + type: FORM_NODE_TYPE, + parameters: { + operation: 'completion', + }, + }, + Form3: { + disabled: undefined, + type: FORM_NODE_TYPE, + parameters: { + operation: 'completion', + }, + }, + }, + }); + + const runData = { + Form2: [], + }; + + const result = waitingWebhooks.findCompletionPage(workflow, runData, 'LastNode'); + expect(result).toBe('Form2'); + }); + }); +}); diff --git a/packages/cli/src/webhooks/waiting-forms.ts b/packages/cli/src/webhooks/waiting-forms.ts index 5a491c1fb3b..cd2de74ed0d 100644 --- a/packages/cli/src/webhooks/waiting-forms.ts +++ b/packages/cli/src/webhooks/waiting-forms.ts @@ -1,5 +1,6 @@ import axios from 'axios'; import type express from 'express'; +import type { IRunData } from 'n8n-workflow'; import { FORM_NODE_TYPE, sleep, Workflow } from 'n8n-workflow'; import { Service } from 'typedi'; @@ -57,6 +58,29 @@ export class WaitingForms extends WaitingWebhooks { } catch (error) {} } + findCompletionPage(workflow: Workflow, runData: IRunData, lastNodeExecuted: string) { + const parentNodes = workflow.getParentNodes(lastNodeExecuted); + const lastNode = workflow.nodes[lastNodeExecuted]; + + if ( + !lastNode.disabled && + lastNode.type === FORM_NODE_TYPE && + lastNode.parameters.operation === 'completion' + ) { + return lastNodeExecuted; + } else { + return parentNodes.reverse().find((nodeName) => { + const node = workflow.nodes[nodeName]; + return ( + !node.disabled && + node.type === FORM_NODE_TYPE && + node.parameters.operation === 'completion' && + runData[nodeName] + ); + }); + } + } + async executeWebhook( req: WaitingWebhookRequest, res: express.Response, @@ -89,35 +113,19 @@ export class WaitingForms extends WaitingWebhooks { throw new ConflictError(`The execution "${executionId}" is running already.`); } - let completionPage; + let lastNodeExecuted = execution.data.resultData.lastNodeExecuted as string; + if (execution.finished) { + // find the completion page to render + // if there is no completion page, render the default page const workflow = this.getWorkflow(execution); - const parentNodes = workflow.getParentNodes( - execution.data.resultData.lastNodeExecuted as string, + const completionPage = this.findCompletionPage( + workflow, + execution.data.resultData.runData, + lastNodeExecuted, ); - const lastNodeExecuted = execution.data.resultData.lastNodeExecuted as string; - const lastNode = workflow.nodes[lastNodeExecuted]; - - if ( - !lastNode.disabled && - lastNode.type === FORM_NODE_TYPE && - lastNode.parameters.operation === 'completion' - ) { - completionPage = lastNodeExecuted; - } else { - completionPage = Object.keys(workflow.nodes).find((nodeName) => { - const node = workflow.nodes[nodeName]; - return ( - parentNodes.includes(nodeName) && - !node.disabled && - node.type === FORM_NODE_TYPE && - node.parameters.operation === 'completion' - ); - }); - } - if (!completionPage) { res.render('form-trigger-completion', { title: 'Form Submitted', @@ -128,16 +136,16 @@ export class WaitingForms extends WaitingWebhooks { return { noWebhookResponse: true, }; + } else { + lastNodeExecuted = completionPage; } } - const targetNode = completionPage || (execution.data.resultData.lastNodeExecuted as string); - return await this.getWebhookExecutionData({ execution, req, res, - lastNodeExecuted: targetNode, + lastNodeExecuted, executionId, suffix, }); From 3202e8c9461ed0df6d7561c7d89a45082929e690 Mon Sep 17 00:00:00 2001 From: Michael Kret <88898367+michael-radency@users.noreply.github.com> Date: Wed, 13 Nov 2024 14:16:49 +0200 Subject: [PATCH 02/16] fix(Notion Node): Safe access in simplifyProperty (no-changelog) (#11712) --- .../nodes/Notion/shared/GenericFunctions.ts | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/nodes-base/nodes/Notion/shared/GenericFunctions.ts b/packages/nodes-base/nodes/Notion/shared/GenericFunctions.ts index 68270ce05a4..bf483b66a08 100644 --- a/packages/nodes-base/nodes/Notion/shared/GenericFunctions.ts +++ b/packages/nodes-base/nodes/Notion/shared/GenericFunctions.ts @@ -575,7 +575,7 @@ export function mapFilters(filtersList: IDataObject[], timezone: string) { } return Object.assign(obj, { - ['property']: getNameAndType(value.key as string).name, + ['property']: getNameAndType(value.key as string)?.name, [key]: { [`${value.condition}`]: valuePropertyName }, }); }, {}); @@ -606,7 +606,7 @@ function simplifyProperty(property: any) { ) { result = property[type]; } else if (['created_by', 'last_edited_by', 'select'].includes(property.type as string)) { - result = property[type] ? property[type].name : null; + result = property[type] ? property[type]?.name : null; } else if (['people'].includes(property.type as string)) { if (Array.isArray(property[type])) { result = property[type].map((person: any) => person.person?.email || {}); @@ -615,35 +615,35 @@ function simplifyProperty(property: any) { } } else if (['multi_select'].includes(property.type as string)) { if (Array.isArray(property[type])) { - result = property[type].map((e: IDataObject) => e.name || {}); + result = property[type].map((e: IDataObject) => e?.name || {}); } else { - result = property[type].options.map((e: IDataObject) => e.name || {}); + result = property[type].options.map((e: IDataObject) => e?.name || {}); } } else if (['relation'].includes(property.type as string)) { if (Array.isArray(property[type])) { - result = property[type].map((e: IDataObject) => e.id || {}); + result = property[type].map((e: IDataObject) => e?.id || {}); } else { - result = property[type].database_id; + result = property[type]?.database_id; } } else if (['formula'].includes(property.type as string)) { - result = property[type][property[type].type]; + result = property[type]?.[property[type]?.type]; } else if (['rollup'].includes(property.type as string)) { - const rollupFunction = property[type].function as string; + const rollupFunction = property[type]?.function as string; if (rollupFunction.startsWith('count') || rollupFunction.includes('empty')) { - result = property[type].number; + result = property[type]?.number; if (rollupFunction.includes('percent')) { result = result * 100; } - } else if (rollupFunction.startsWith('show') && property[type].type === 'array') { + } else if (rollupFunction.startsWith('show') && property[type]?.type === 'array') { const elements = property[type].array.map(simplifyProperty).flat(); result = rollupFunction === 'show_unique' ? [...new Set(elements as string)] : elements; } } else if (['files'].includes(property.type as string)) { result = property[type].map( - (file: { type: string; [key: string]: any }) => file[file.type].url, + (file: { type: string; [key: string]: any }) => file[file.type]?.url, ); } else if (['status'].includes(property.type as string)) { - result = property[type].name; + result = property[type]?.name; } return result; } From 0d8aada49005d6a6078e8460003a0de61a8f423c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E0=A4=95=E0=A4=BE=E0=A4=B0=E0=A4=A4=E0=A5=8B=E0=A4=AB?= =?UTF-8?q?=E0=A5=8D=E0=A4=AB=E0=A5=87=E0=A4=B2=E0=A4=B8=E0=A5=8D=E0=A4=95?= =?UTF-8?q?=E0=A5=8D=E0=A4=B0=E0=A4=BF=E0=A4=AA=E0=A5=8D=E0=A4=9F=E2=84=A2?= Date: Wed, 13 Nov 2024 14:18:21 +0100 Subject: [PATCH 03/16] feat(core): Make all http requests made with `httpRequestWithAuthentication` abortable (#11704) --- packages/core/src/NodeExecuteFunctions.ts | 9 +++++++++ packages/workflow/src/Interfaces.ts | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/packages/core/src/NodeExecuteFunctions.ts b/packages/core/src/NodeExecuteFunctions.ts index e6453096448..b3701c1ca38 100644 --- a/packages/core/src/NodeExecuteFunctions.ts +++ b/packages/core/src/NodeExecuteFunctions.ts @@ -918,6 +918,10 @@ function convertN8nRequestToAxios(n8nRequest: IHttpRequestOptions): AxiosRequest axiosRequest.params = n8nRequest.qs; + if (n8nRequest.abortSignal) { + axiosRequest.signal = n8nRequest.abortSignal; + } + if (n8nRequest.baseURL !== undefined) { axiosRequest.baseURL = n8nRequest.baseURL; } @@ -1718,6 +1722,11 @@ export async function httpRequestWithAuthentication( ) { removeEmptyBody(requestOptions); + // Cancel this request on execution cancellation + if ('getExecutionCancelSignal' in this) { + requestOptions.abortSignal = this.getExecutionCancelSignal(); + } + let credentialsDecrypted: ICredentialDataDecryptedObject | undefined; try { const parentTypes = additionalData.credentialsHelper.getParentTypes(credentialsType); diff --git a/packages/workflow/src/Interfaces.ts b/packages/workflow/src/Interfaces.ts index 271fd0838e9..41cee333d15 100644 --- a/packages/workflow/src/Interfaces.ts +++ b/packages/workflow/src/Interfaces.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import type { CallbackManager as CallbackManagerLC } from '@langchain/core/callbacks/manager'; -import type { AxiosProxyConfig } from 'axios'; +import type { AxiosProxyConfig, GenericAbortSignal } from 'axios'; import type * as express from 'express'; import type FormData from 'form-data'; import type { PathLike } from 'fs'; @@ -529,6 +529,7 @@ export interface IHttpRequestOptions { }; timeout?: number; json?: boolean; + abortSignal?: GenericAbortSignal; } /** From ca8cb455ba59831295c238afb11aeab6ad18428e Mon Sep 17 00:00:00 2001 From: Elias Meire Date: Wed, 13 Nov 2024 14:47:27 +0100 Subject: [PATCH 04/16] fix(editor): Prevent error being thrown in RLC while loading (#11676) --- .../components/ResourceLocator/ResourceLocatorDropdown.vue | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/editor-ui/src/components/ResourceLocator/ResourceLocatorDropdown.vue b/packages/editor-ui/src/components/ResourceLocator/ResourceLocatorDropdown.vue index 01c7b4071d2..a4e00af9f73 100644 --- a/packages/editor-ui/src/components/ResourceLocator/ResourceLocatorDropdown.vue +++ b/packages/editor-ui/src/components/ResourceLocator/ResourceLocatorDropdown.vue @@ -145,7 +145,12 @@ function onKeyDown(e: KeyboardEvent) { } } } else if (e.key === 'Enter') { - emit('update:modelValue', sortedResources.value[hoverIndex.value].value); + const selected = sortedResources.value[hoverIndex.value]?.value; + + // Selected resource can be empty when loading or empty results + if (selected) { + emit('update:modelValue', selected); + } } } From b22142ddb85d8baa550c25ba296a231906544aa1 Mon Sep 17 00:00:00 2001 From: oleg Date: Wed, 13 Nov 2024 15:33:02 +0100 Subject: [PATCH 05/16] fix(editor): Fix canvasNodes reactivity in canvas chat (no-changelog) (#11717) --- .../editor-ui/src/components/CanvasChat/CanvasChat.vue | 3 ++- .../components/CanvasChat/composables/useChatTrigger.ts | 8 ++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/editor-ui/src/components/CanvasChat/CanvasChat.vue b/packages/editor-ui/src/components/CanvasChat/CanvasChat.vue index 4d551a67bec..51bf1bf8bea 100644 --- a/packages/editor-ui/src/components/CanvasChat/CanvasChat.vue +++ b/packages/editor-ui/src/components/CanvasChat/CanvasChat.vue @@ -52,6 +52,7 @@ const isChatOpen = computed(() => { const result = workflowsStore.isChatPanelOpen; return result; }); +const canvasNodes = computed(() => workflowsStore.allNodes); const isLogsOpen = computed(() => workflowsStore.isLogsPanelOpen); const previousChatMessages = computed(() => workflowsStore.getPastChatMessages); @@ -70,7 +71,7 @@ const { runWorkflow } = useRunWorkflow({ router }); const { chatTriggerNode, connectedNode, allowFileUploads, setChatTriggerNode, setConnectedNode } = useChatTrigger({ workflow, - canvasNodes: workflowsStore.allNodes, + canvasNodes, getNodeByName: workflowsStore.getNodeByName, getNodeType: nodeTypesStore.getNodeType, }); diff --git a/packages/editor-ui/src/components/CanvasChat/composables/useChatTrigger.ts b/packages/editor-ui/src/components/CanvasChat/composables/useChatTrigger.ts index 9ec2e346a6c..7d0cff0d8d2 100644 --- a/packages/editor-ui/src/components/CanvasChat/composables/useChatTrigger.ts +++ b/packages/editor-ui/src/components/CanvasChat/composables/useChatTrigger.ts @@ -1,5 +1,5 @@ -import type { ComputedRef } from 'vue'; -import { ref, computed } from 'vue'; +import type { ComputedRef, MaybeRef } from 'vue'; +import { ref, computed, unref } from 'vue'; import { CHAIN_SUMMARIZATION_LANGCHAIN_NODE_TYPE, NodeConnectionType, @@ -19,7 +19,7 @@ import type { INodeUi } from '@/Interface'; export interface ChatTriggerDependencies { getNodeByName: (name: string) => INodeUi | null; getNodeType: (type: string, version: number) => INodeTypeDescription | null; - canvasNodes: INodeUi[]; + canvasNodes: MaybeRef; workflow: ComputedRef; } @@ -52,7 +52,7 @@ export function useChatTrigger({ /** Gets the chat trigger node from the workflow */ function setChatTriggerNode() { - const triggerNode = canvasNodes.find((node) => + const triggerNode = unref(canvasNodes).find((node) => [CHAT_TRIGGER_NODE_TYPE, MANUAL_CHAT_TRIGGER_NODE_TYPE].includes(node.type), ); From 70d315b3d5b8f5f3e0f39527bba11e254a52028e Mon Sep 17 00:00:00 2001 From: Jon Date: Wed, 13 Nov 2024 14:43:25 +0000 Subject: [PATCH 06/16] fix(Facebook Lead Ads Trigger Node): Fix issue with optional fields (#11692) --- .../nodes/FacebookLeadAds/FacebookLeadAdsTrigger.node.ts | 5 ++++- .../nodes-base/nodes/FacebookLeadAds/GenericFunctions.ts | 6 +++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/nodes-base/nodes/FacebookLeadAds/FacebookLeadAdsTrigger.node.ts b/packages/nodes-base/nodes/FacebookLeadAds/FacebookLeadAdsTrigger.node.ts index 5a1c06f91d1..325ac81d4a6 100644 --- a/packages/nodes-base/nodes/FacebookLeadAds/FacebookLeadAdsTrigger.node.ts +++ b/packages/nodes-base/nodes/FacebookLeadAds/FacebookLeadAdsTrigger.node.ts @@ -273,7 +273,10 @@ export class FacebookLeadAdsTrigger implements INodeType { return { id: lead.id, data: lead.field_data.reduce( - (acc, field) => ({ ...acc, [field.name]: field.values[0] }), + (acc, field) => ({ + ...acc, + [field.name]: field.values && field.values.length > 0 ? field.values[0] : null, + }), {}, ), form: { diff --git a/packages/nodes-base/nodes/FacebookLeadAds/GenericFunctions.ts b/packages/nodes-base/nodes/FacebookLeadAds/GenericFunctions.ts index a6086050964..5d4950ea070 100644 --- a/packages/nodes-base/nodes/FacebookLeadAds/GenericFunctions.ts +++ b/packages/nodes-base/nodes/FacebookLeadAds/GenericFunctions.ts @@ -33,7 +33,7 @@ export async function facebookApiRequest( qs, body, gzip: true, - uri: `https://graph.facebook.com/v17.0${resource}`, + uri: `https://graph.facebook.com/v21.0${resource}`, json: true, }; @@ -89,7 +89,7 @@ export async function facebookAppApiRequest( method, qs, gzip: true, - uri: `https://graph.facebook.com/v17.0${resource}`, + uri: `https://graph.facebook.com/v21.0${resource}`, json: true, }; @@ -181,7 +181,7 @@ export async function facebookPageApiRequest( qs, body, gzip: true, - uri: `https://graph.facebook.com/v17.0${resource}`, + uri: `https://graph.facebook.com/v21.0${resource}`, json: true, }; From 6d5ee832966fab96043b0d65697c059ced61d334 Mon Sep 17 00:00:00 2001 From: Shireen Missi <94372015+ShireenMissi@users.noreply.github.com> Date: Wed, 13 Nov 2024 15:23:24 +0000 Subject: [PATCH 07/16] fix(core): Continue with error output reverse items in success branch (#11684) --- packages/core/src/WorkflowExecute.ts | 2 +- packages/core/test/WorkflowExecute.test.ts | 6 +- .../core/test/workflows/error_outputs.json | 331 +++++++----------- 3 files changed, 139 insertions(+), 200 deletions(-) diff --git a/packages/core/src/WorkflowExecute.ts b/packages/core/src/WorkflowExecute.ts index f8c32351bb8..bb1b1633df2 100644 --- a/packages/core/src/WorkflowExecute.ts +++ b/packages/core/src/WorkflowExecute.ts @@ -1243,7 +1243,7 @@ export class WorkflowExecute { : []; while (items.length) { - const item = items.pop(); + const item = items.shift(); if (item === undefined) { continue; } diff --git a/packages/core/test/WorkflowExecute.test.ts b/packages/core/test/WorkflowExecute.test.ts index 6d1927fb889..ab69a7574b6 100644 --- a/packages/core/test/WorkflowExecute.test.ts +++ b/packages/core/test/WorkflowExecute.test.ts @@ -188,7 +188,11 @@ describe('WorkflowExecute', () => { if (nodeData.data === undefined) { return null; } - return nodeData.data.main[0]; + return nodeData.data.main[0]!.map((entry) => { + // remove pairedItem from entry if it is an error output test + if (testData.description.includes('error_outputs')) delete entry.pairedItem; + return entry; + }); }); expect(resultData).toEqual(testData.output.nodeData[nodeName]); diff --git a/packages/core/test/workflows/error_outputs.json b/packages/core/test/workflows/error_outputs.json index f8e698bd529..5e143b644ef 100644 --- a/packages/core/test/workflows/error_outputs.json +++ b/packages/core/test/workflows/error_outputs.json @@ -1,13 +1,13 @@ { - "name": "Error Output - Test Workflow", + "name": "My workflow 105", "nodes": [ { "parameters": {}, - "id": "c41b46f0-3e76-4655-b5ea-4d15af58c138", + "id": "a94bc1fb-1f39-404b-b149-a76c4fbaed25", "name": "When clicking \"Execute Workflow\"", "type": "n8n-nodes-base.manualTrigger", "typeVersion": 1, - "position": [-680, 460] + "position": [-60, 780] }, { "parameters": { @@ -21,11 +21,11 @@ }, "options": {} }, - "id": "247f4118-d80f-49ab-8d9a-0cdbbb9271df", + "id": "6ba26bdf-91e2-4f18-8f4c-09e98aa4a9df", "name": "Success", "type": "n8n-nodes-base.set", "typeVersion": 3.2, - "position": [200, 860] + "position": [820, 1180] }, { "parameters": { @@ -39,21 +39,21 @@ }, "options": {} }, - "id": "311e3650-d89c-405a-9c8d-c238f48a8a5a", + "id": "e3d1eadf-0994-4806-97ce-c5c5f673c624", "name": "Error", "type": "n8n-nodes-base.set", "typeVersion": 3.2, - "position": [200, 1040] + "position": [820, 1360] }, { "parameters": { "jsCode": "return [\n {\n \"id\": \"23423532\",\n \"name\": \"Jay Gatsby\",\n \"email\": \"gatsby@west-egg.com\",\n \"notes\": \"Keeps asking about a green light??\",\n \"country\": \"US\",\n \"created\": \"1925-04-10\"\n },\n {\n \"id\": \"23423533\",\n \"name\": \"José Arcadio Buendía\",\n \"email\": \"jab@macondo.co\",\n \"notes\": \"Lots of people named after him. Very confusing\",\n \"country\": \"CO\",\n \"created\": \"1967-05-05\"\n },\n {\n \"id\": \"23423534\",\n \"name\": \"Max Sendak\",\n \"email\": \"info@in-and-out-of-weeks.org\",\n \"notes\": \"Keeps rolling his terrible eyes\",\n \"country\": \"US\",\n \"created\": \"1963-04-09\"\n },\n {\n \"id\": \"23423535\",\n \"name\": \"Zaphod Beeblebrox\",\n \"email\": \"captain@heartofgold.com\",\n \"notes\": \"Felt like I was talking to more than one person\",\n \"country\": null,\n \"created\": \"1979-10-12\"\n },\n {\n \"id\": \"23423536\",\n \"name\": \"Edmund Pevensie\",\n \"email\": \"edmund@narnia.gov\",\n \"notes\": \"Passionate sailor\",\n \"country\": \"UK\",\n \"created\": \"1950-10-16\"\n }\n]" }, - "id": "179d4fe7-1ae7-4957-a77d-12c3ca6d141b", + "id": "01adfc2d-141d-4843-b2d6-04115a476bc1", "name": "Mock Data", "type": "n8n-nodes-base.code", "typeVersion": 2, - "position": [-460, 460] + "position": [160, 780] }, { "parameters": { @@ -61,11 +61,11 @@ "height": 414, "width": 564 }, - "id": "1ec2a8b6-54e2-4319-90b3-30b387855b36", + "id": "8ca689eb-7910-43ad-bd10-fae35a8fc203", "name": "Sticky Note", "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, - "position": [-160, 780] + "position": [460, 1100] }, { "parameters": { @@ -73,11 +73,11 @@ "height": 279, "width": 564 }, - "id": "49a2b7d9-8bd1-4cdf-9649-2d93668b0f8f", + "id": "a17460d6-b0c0-432d-ac6f-8ff684357c8d", "name": "Sticky Note1", "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, - "position": [-160, 140] + "position": [460, 460] }, { "parameters": { @@ -91,22 +91,22 @@ }, "options": {} }, - "id": "9852f1d9-95b4-4ef7-bb18-8f0bab81a0bc", + "id": "46df5463-4289-4e61-9f80-87e035931bda", "name": "Combined", "type": "n8n-nodes-base.set", "typeVersion": 3.2, - "position": [180, 240] + "position": [800, 560] }, { "parameters": { "mode": "runOnceForEachItem", "jsCode": "// Add a new field called 'myNewField' to the JSON of the item\n$input.item.json.myNewField = 1;\n\nif ($input.item.json.country === 'US') {\n throw new Error('This is an error');\n}\n\nreturn $input.item;" }, - "id": "40d4dba3-3db7-4eb5-aa27-e76f955a5e09", + "id": "a4708520-aaca-4618-b7a2-94da268fba37", "name": "Throw Error", "type": "n8n-nodes-base.code", "typeVersion": 2, - "position": [-140, 960], + "position": [480, 1280], "errorOutput": true, "onError": "continueErrorOutput" }, @@ -116,22 +116,22 @@ "height": 279, "width": 564 }, - "id": "8eb3dd54-c1dd-4167-abfa-c06d044c63f3", + "id": "f0a450cd-4124-490d-964f-a71b645f770c", "name": "Sticky Note2", "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, - "position": [-160, 460] + "position": [460, 780] }, { "parameters": { "mode": "runOnceForEachItem", "jsCode": "// Add a new field called 'myNewField' to the JSON of the item\n$input.item.json.myNewField = 1;\n\nif ($input.item.json.country === 'US') {\n throw new Error('This is an error');\n}\n\nreturn $input.item;" }, - "id": "19a3d6ac-e610-4296-9b7a-9ed19d242bdb", + "id": "823f12e6-cbfc-4545-8505-fab158d1effe", "name": "Throw Error2", "type": "n8n-nodes-base.code", "typeVersion": 2, - "position": [-120, 560], + "position": [500, 880], "onError": "continueRegularOutput" }, { @@ -146,22 +146,22 @@ }, "options": {} }, - "id": "5f803fdc-7d88-4c12-8886-6092cfbc03c6", + "id": "8f88d130-9a13-4236-81c0-157f8a8990c0", "name": "Combined1", "type": "n8n-nodes-base.set", "typeVersion": 3.2, - "position": [180, 560] + "position": [800, 880] }, { "parameters": { "mode": "runOnceForEachItem", "jsCode": "// Add a new field called 'myNewField' to the JSON of the item\n$input.item.json.myNewField = 1;\n\nif ($input.item.json.country === 'US') {\n throw new Error('This is an error');\n}\n\nreturn $input.item;" }, - "id": "c2696c1f-1abd-4549-9ad9-e62017dc14b8", + "id": "1a3f4beb-0d1e-44fe-a411-5bd1096ffd74", "name": "Throw Error1", "type": "n8n-nodes-base.code", "typeVersion": 2, - "position": [-120, 240], + "position": [500, 560], "continueOnFail": true }, { @@ -176,11 +176,11 @@ }, "options": {} }, - "id": "01740d7e-e572-408a-9fae-729068803113", + "id": "c617a3d7-15e3-49b4-a7dd-d45c5e059a22", "name": "Success1", "type": "n8n-nodes-base.set", "typeVersion": 3.2, - "position": [200, 1320] + "position": [820, 1640] }, { "parameters": { @@ -188,22 +188,22 @@ "height": 509.71047006830065, "width": 1183.725293692246 }, - "id": "ed409181-4847-4d65-af45-f45078a6343e", + "id": "046de2cf-970a-4925-b87d-16e8cca511fd", "name": "Sticky Note3", "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, - "position": [-160, 1240] + "position": [460, 1560] }, { "parameters": { "mode": "runOnceForEachItem", "jsCode": "// Add a new field called 'myNewField' to the JSON of the item\n$input.item.json.myNewField = 1;\n\nif ($input.item.json.country === 'US') {\n throw new Error('This is an error');\n}\n\nreturn $input.item;" }, - "id": "93d03f38-b928-4b4b-832a-3f1a5deebb2d", + "id": "9ec21de1-dfca-4fff-b5a7-a56364239d7b", "name": "Throw Error3", "type": "n8n-nodes-base.code", "typeVersion": 2, - "position": [-140, 1420], + "position": [480, 1740], "errorOutput": true, "onError": "continueErrorOutput" }, @@ -211,11 +211,11 @@ "parameters": { "options": {} }, - "id": "c92a6ce5-41ea-4fb9-a07b-c4e98f905b12", + "id": "e3605953-75cf-4036-99f7-05e3971a6a75", "name": "Edit Fields", "type": "n8n-nodes-base.set", "typeVersion": 3.2, - "position": [420, 1500], + "position": [1040, 1820], "onError": "continueErrorOutput" }, { @@ -230,11 +230,11 @@ }, "options": {} }, - "id": "ab838cc1-0987-4b41-bdc5-fe17f38e0691", + "id": "a71cfb77-adfd-4c77-9a8e-7e58cbd0931b", "name": "Success2", "type": "n8n-nodes-base.set", "typeVersion": 3.2, - "position": [700, 1360] + "position": [1320, 1680] }, { "parameters": { @@ -248,11 +248,11 @@ }, "options": {} }, - "id": "22e04172-19b9-4735-9dd0-a3e2fa3bf000", + "id": "ea9d02e9-1716-4f69-a14a-9133f5184886", "name": "Error2", "type": "n8n-nodes-base.set", "typeVersion": 3.2, - "position": [700, 1580] + "position": [1320, 1900] }, { "parameters": { @@ -266,101 +266,19 @@ }, "options": {} }, - "id": "69e7257a-1ba8-46ba-9394-d38d65b2e567", + "id": "17780679-f7a3-4b1b-b6ee-f3f61e0843ad", "name": "Error1", "type": "n8n-nodes-base.set", "typeVersion": 3.2, - "position": [200, 1500] + "position": [820, 1820] } ], "pinData": { - "Error": [ - { - "json": { - "id": "23423534", - "name": "Max Sendak", - "email": "info@in-and-out-of-weeks.org", - "notes": "Keeps rolling his terrible eyes", - "country": "US", - "created": "1963-04-09", - "error": "This is an error [line 5, for item 2]", - "originalName": "Max Sendak" - }, - "pairedItem": { - "item": 0 - } - }, - { - "json": { - "id": "23423532", - "name": "Jay Gatsby", - "email": "gatsby@west-egg.com", - "notes": "Keeps asking about a green light??", - "country": "US", - "created": "1925-04-10", - "error": "This is an error [line 5, for item 0]", - "originalName": "Jay Gatsby" - }, - "pairedItem": { - "item": 1 - } - } - ], - "Success": [ - { - "json": { - "id": "23423536", - "name": "Edmund Pevensie", - "email": "edmund@narnia.gov", - "notes": "Passionate sailor", - "country": "UK", - "created": "1950-10-16", - "myNewField": 1, - "originalName": "Edmund Pevensie" - }, - "pairedItem": { - "item": 0 - } - }, - { - "json": { - "id": "23423535", - "name": "Zaphod Beeblebrox", - "email": "captain@heartofgold.com", - "notes": "Felt like I was talking to more than one person", - "country": null, - "created": "1979-10-12", - "myNewField": 1, - "originalName": "Zaphod Beeblebrox" - }, - "pairedItem": { - "item": 1 - } - }, - { - "json": { - "id": "23423533", - "name": "José Arcadio Buendía", - "email": "jab@macondo.co", - "notes": "Lots of people named after him. Very confusing", - "country": "CO", - "created": "1967-05-05", - "myNewField": 1, - "originalName": "José Arcadio Buendía" - }, - "pairedItem": { - "item": 2 - } - } - ], "Combined": [ { "json": { "error": "This is an error [line 5, for item 0]", "originalName": "Jay Gatsby" - }, - "pairedItem": { - "item": 0 } }, { @@ -373,18 +291,12 @@ "created": "1967-05-05", "myNewField": 1, "originalName": "José Arcadio Buendía" - }, - "pairedItem": { - "item": 1 } }, { "json": { "error": "This is an error [line 5, for item 2]", "originalName": "Max Sendak" - }, - "pairedItem": { - "item": 2 } }, { @@ -397,9 +309,6 @@ "created": "1979-10-12", "myNewField": 1, "originalName": "Zaphod Beeblebrox" - }, - "pairedItem": { - "item": 3 } }, { @@ -412,9 +321,6 @@ "created": "1950-10-16", "myNewField": 1, "originalName": "Edmund Pevensie" - }, - "pairedItem": { - "item": 4 } } ], @@ -423,9 +329,6 @@ "json": { "error": "This is an error [line 5, for item 0]", "originalName": "Jay Gatsby" - }, - "pairedItem": { - "item": 0 } }, { @@ -438,18 +341,12 @@ "created": "1967-05-05", "myNewField": 1, "originalName": "José Arcadio Buendía" - }, - "pairedItem": { - "item": 1 } }, { "json": { "error": "This is an error [line 5, for item 2]", "originalName": "Max Sendak" - }, - "pairedItem": { - "item": 2 } }, { @@ -462,9 +359,6 @@ "created": "1979-10-12", "myNewField": 1, "originalName": "Zaphod Beeblebrox" - }, - "pairedItem": { - "item": 3 } }, { @@ -477,26 +371,20 @@ "created": "1950-10-16", "myNewField": 1, "originalName": "Edmund Pevensie" - }, - "pairedItem": { - "item": 4 } } ], "Success1": [ { "json": { - "id": "23423536", - "name": "Edmund Pevensie", - "email": "edmund@narnia.gov", - "notes": "Passionate sailor", - "country": "UK", - "created": "1950-10-16", + "id": "23423533", + "name": "José Arcadio Buendía", + "email": "jab@macondo.co", + "notes": "Lots of people named after him. Very confusing", + "country": "CO", + "created": "1967-05-05", "myNewField": 1, - "originalName": "Edmund Pevensie" - }, - "pairedItem": { - "item": 0 + "originalName": "José Arcadio Buendía" } }, { @@ -509,43 +397,22 @@ "created": "1979-10-12", "myNewField": 1, "originalName": "Zaphod Beeblebrox" - }, - "pairedItem": { - "item": 1 } }, { "json": { - "id": "23423533", - "name": "José Arcadio Buendía", - "email": "jab@macondo.co", - "notes": "Lots of people named after him. Very confusing", - "country": "CO", - "created": "1967-05-05", + "id": "23423536", + "name": "Edmund Pevensie", + "email": "edmund@narnia.gov", + "notes": "Passionate sailor", + "country": "UK", + "created": "1950-10-16", "myNewField": 1, - "originalName": "José Arcadio Buendía" - }, - "pairedItem": { - "item": 2 + "originalName": "Edmund Pevensie" } } ], "Error1": [ - { - "json": { - "id": "23423534", - "name": "Max Sendak", - "email": "info@in-and-out-of-weeks.org", - "notes": "Keeps rolling his terrible eyes", - "country": "US", - "created": "1963-04-09", - "error": "This is an error [line 5, for item 2]", - "originalName": "Max Sendak" - }, - "pairedItem": { - "item": 0 - } - }, { "json": { "id": "23423532", @@ -556,9 +423,18 @@ "created": "1925-04-10", "error": "This is an error [line 5, for item 0]", "originalName": "Jay Gatsby" - }, - "pairedItem": { - "item": 1 + } + }, + { + "json": { + "id": "23423534", + "name": "Max Sendak", + "email": "info@in-and-out-of-weeks.org", + "notes": "Keeps rolling his terrible eyes", + "country": "US", + "created": "1963-04-09", + "error": "This is an error [line 5, for item 2]", + "originalName": "Max Sendak" } } ], @@ -573,9 +449,6 @@ "created": "1925-04-10", "error": "This is an error [line 5, for item 0]", "originalName": "Jay Gatsby" - }, - "pairedItem": { - "item": 0 } }, { @@ -588,9 +461,70 @@ "created": "1963-04-09", "error": "This is an error [line 5, for item 2]", "originalName": "Max Sendak" - }, - "pairedItem": { - "item": 1 + } + } + ], + "Error": [ + { + "json": { + "id": "23423532", + "name": "Jay Gatsby", + "email": "gatsby@west-egg.com", + "notes": "Keeps asking about a green light??", + "country": "US", + "created": "1925-04-10", + "error": "This is an error [line 5, for item 0]", + "originalName": "Jay Gatsby" + } + }, + { + "json": { + "id": "23423534", + "name": "Max Sendak", + "email": "info@in-and-out-of-weeks.org", + "notes": "Keeps rolling his terrible eyes", + "country": "US", + "created": "1963-04-09", + "error": "This is an error [line 5, for item 2]", + "originalName": "Max Sendak" + } + } + ], + "Success": [ + { + "json": { + "id": "23423533", + "name": "José Arcadio Buendía", + "email": "jab@macondo.co", + "notes": "Lots of people named after him. Very confusing", + "country": "CO", + "created": "1967-05-05", + "myNewField": 1, + "originalName": "José Arcadio Buendía" + } + }, + { + "json": { + "id": "23423535", + "name": "Zaphod Beeblebrox", + "email": "captain@heartofgold.com", + "notes": "Felt like I was talking to more than one person", + "country": null, + "created": "1979-10-12", + "myNewField": 1, + "originalName": "Zaphod Beeblebrox" + } + }, + { + "json": { + "id": "23423536", + "name": "Edmund Pevensie", + "email": "edmund@narnia.gov", + "notes": "Passionate sailor", + "country": "UK", + "created": "1950-10-16", + "myNewField": 1, + "originalName": "Edmund Pevensie" } } ] @@ -725,10 +659,11 @@ "settings": { "executionOrder": "v1" }, - "versionId": "e73e1eda-293c-4ee2-87b9-923873241774", - "id": "UgoluWRMeg7fPLCB", + "versionId": "94aaa2ce-558a-4fed-948a-09860174272a", "meta": { - "instanceId": "021d3c82ba2d3bc090cbf4fc81c9312668bcc34297e022bb3438c5c88a43a5ff" + "templateCredsSetupCompleted": true, + "instanceId": "27cc9b56542ad45b38725555722c50a1c3fee1670bbb67980558314ee08517c4" }, + "id": "FJvJXVvjM5rw3sUM", "tags": [] } From 145d0921b217bbd4b625beaacfa14429560bf51b Mon Sep 17 00:00:00 2001 From: Jon Date: Wed, 13 Nov 2024 15:40:00 +0000 Subject: [PATCH 08/16] fix(Google BigQuery Node): Add item index to insert error (#11702) --- .../Google/BigQuery/v2/actions/database/insert.operation.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/nodes-base/nodes/Google/BigQuery/v2/actions/database/insert.operation.ts b/packages/nodes-base/nodes/Google/BigQuery/v2/actions/database/insert.operation.ts index 1eb66904b39..18d53996c1c 100644 --- a/packages/nodes-base/nodes/Google/BigQuery/v2/actions/database/insert.operation.ts +++ b/packages/nodes-base/nodes/Google/BigQuery/v2/actions/database/insert.operation.ts @@ -275,6 +275,7 @@ export async function execute(this: IExecuteFunctions): Promise Date: Wed, 13 Nov 2024 18:10:34 +0200 Subject: [PATCH 09/16] feat: Github star button in-app (#11695) --- cypress/e2e/1-workflows.cy.ts | 4 + cypress/e2e/17-workflow-tags.cy.ts | 2 + cypress/e2e/19-execution.cy.ts | 1 + cypress/e2e/20-workflow-executions.cy.ts | 1 + .../e2e/34-template-credentials-setup.cy.ts | 1 + cypress/e2e/45-ai-assistant.cy.ts | 1 + cypress/e2e/5-ndv.cy.ts | 3 + packages/editor-ui/package.json | 1 + .../src/components/MainHeader/MainHeader.vue | 47 +++++- pnpm-lock.yaml | 158 +++++------------- 10 files changed, 97 insertions(+), 122 deletions(-) diff --git a/cypress/e2e/1-workflows.cy.ts b/cypress/e2e/1-workflows.cy.ts index a6683bbee48..eb93c07ee6c 100644 --- a/cypress/e2e/1-workflows.cy.ts +++ b/cypress/e2e/1-workflows.cy.ts @@ -23,6 +23,7 @@ describe('Workflows', () => { }); it('should create multiple new workflows using add workflow button', () => { + cy.viewport(1920, 1080); [...Array(multipleWorkflowsCount).keys()].forEach(() => { cy.visit(WorkflowsPage.url); WorkflowsPage.getters.createWorkflowButton().click(); @@ -35,6 +36,7 @@ describe('Workflows', () => { }); it('should search for a workflow', () => { + cy.viewport(1920, 1080); // One Result WorkflowsPage.getters.searchBar().type('Empty State Card Workflow'); WorkflowsPage.getters.workflowCards().should('have.length', 1); @@ -60,6 +62,7 @@ describe('Workflows', () => { }); it('should delete all the workflows', () => { + cy.viewport(1920, 1080); WorkflowsPage.getters.workflowCards().should('have.length', multipleWorkflowsCount + 1); WorkflowsPage.getters.workflowCards().each(($el) => { @@ -75,6 +78,7 @@ describe('Workflows', () => { }); it('should respect tag querystring filter when listing workflows', () => { + cy.viewport(1920, 1080); WorkflowsPage.getters.newWorkflowButtonCard().click(); cy.createFixtureWorkflow('Test_workflow_2.json', getUniqueWorkflowName('My New Workflow')); diff --git a/cypress/e2e/17-workflow-tags.cy.ts b/cypress/e2e/17-workflow-tags.cy.ts index 26ea7cbe2ce..e8dacca2b84 100644 --- a/cypress/e2e/17-workflow-tags.cy.ts +++ b/cypress/e2e/17-workflow-tags.cy.ts @@ -53,6 +53,7 @@ describe('Workflow tags', () => { }); it('should detach a tag inline by clicking on X on tag pill', () => { + cy.viewport(1920, 1080); wf.getters.createTagButton().click(); wf.actions.addTags(TEST_TAGS); wf.getters.nthTagPill(1).click(); @@ -73,6 +74,7 @@ describe('Workflow tags', () => { }); it('should not show non existing tag as a selectable option', () => { + cy.viewport(1920, 1080); const NON_EXISTING_TAG = 'My Test Tag'; wf.getters.createTagButton().click(); diff --git a/cypress/e2e/19-execution.cy.ts b/cypress/e2e/19-execution.cy.ts index 5be2399253f..b8b30dd7a9f 100644 --- a/cypress/e2e/19-execution.cy.ts +++ b/cypress/e2e/19-execution.cy.ts @@ -514,6 +514,7 @@ describe('Execution', () => { }); it('should send proper payload for node rerun', () => { + cy.viewport(1920, 1080); cy.createFixtureWorkflow('Multiple_trigger_node_rerun.json', 'Multiple trigger node rerun'); workflowPage.getters.zoomToFitButton().click(); diff --git a/cypress/e2e/20-workflow-executions.cy.ts b/cypress/e2e/20-workflow-executions.cy.ts index 5788af171cd..bfa9bca1d9b 100644 --- a/cypress/e2e/20-workflow-executions.cy.ts +++ b/cypress/e2e/20-workflow-executions.cy.ts @@ -101,6 +101,7 @@ describe('Workflow Executions', () => { }); it('should show workflow data in executions tab after hard reload and modify name and tags', () => { + cy.viewport(1920, 1080); executionsTab.actions.switchToExecutionsTab(); checkMainHeaderELements(); workflowPage.getters.saveButton().find('button').should('not.exist'); diff --git a/cypress/e2e/34-template-credentials-setup.cy.ts b/cypress/e2e/34-template-credentials-setup.cy.ts index 815f4b1cebf..a2f9a019f79 100644 --- a/cypress/e2e/34-template-credentials-setup.cy.ts +++ b/cypress/e2e/34-template-credentials-setup.cy.ts @@ -182,6 +182,7 @@ describe('Template credentials setup', () => { }); it('should fill credentials from workflow editor', () => { + cy.viewport(1920, 1080); templateCredentialsSetupPage.visitTemplateCredentialSetupPage(testTemplate.id); templateCredentialsSetupPage.getters.skipLink().click(); diff --git a/cypress/e2e/45-ai-assistant.cy.ts b/cypress/e2e/45-ai-assistant.cy.ts index 9b50fef44a0..7f9c79e0e65 100644 --- a/cypress/e2e/45-ai-assistant.cy.ts +++ b/cypress/e2e/45-ai-assistant.cy.ts @@ -36,6 +36,7 @@ describe('AI Assistant::enabled', () => { }); it('renders placeholder UI', () => { + cy.viewport(1920, 1080); aiAssistant.getters.askAssistantFloatingButton().should('be.visible'); aiAssistant.getters.askAssistantFloatingButton().click(); aiAssistant.getters.askAssistantChat().should('be.visible'); diff --git a/cypress/e2e/5-ndv.cy.ts b/cypress/e2e/5-ndv.cy.ts index 96b917d4c3d..9ad1fceae1b 100644 --- a/cypress/e2e/5-ndv.cy.ts +++ b/cypress/e2e/5-ndv.cy.ts @@ -66,6 +66,7 @@ describe('NDV', () => { }); it('should disconect Switch outputs if rules order was changed', () => { + cy.viewport(1920, 1080); cy.createFixtureWorkflow('NDV-test-switch_reorder.json', 'NDV test switch reorder'); workflowPage.actions.zoomToFit(); @@ -232,6 +233,7 @@ describe('NDV', () => { ndv.getters.outputPanel().find('[class*=_pagination]').should('exist'); }); it('should display large schema', () => { + cy.viewport(1920, 1080); cy.createFixtureWorkflow( 'Test_workflow_schema_test_pinned_data.json', 'NDV test schema view 2', @@ -718,6 +720,7 @@ describe('NDV', () => { }); it('Should open appropriate node creator after clicking on connection hint link', () => { + cy.viewport(1920, 1080); const nodeCreator = new NodeCreator(); const hintMapper = { Memory: 'AI Nodes', diff --git a/packages/editor-ui/package.json b/packages/editor-ui/package.json index 5d5c63a298c..cc3744924c3 100644 --- a/packages/editor-ui/package.json +++ b/packages/editor-ui/package.json @@ -74,6 +74,7 @@ "vue": "catalog:frontend", "vue-agile": "^2.0.0", "vue-chartjs": "^5.2.0", + "vue-github-button": "^3.1.3", "vue-i18n": "^9.2.2", "vue-json-pretty": "2.2.4", "vue-markdown-render": "catalog:frontend", diff --git a/packages/editor-ui/src/components/MainHeader/MainHeader.vue b/packages/editor-ui/src/components/MainHeader/MainHeader.vue index 0625d2ff2c5..67428421e05 100644 --- a/packages/editor-ui/src/components/MainHeader/MainHeader.vue +++ b/packages/editor-ui/src/components/MainHeader/MainHeader.vue @@ -18,6 +18,8 @@ import { useWorkflowsStore } from '@/stores/workflows.store'; import { useExecutionsStore } from '@/stores/executions.store'; import { usePushConnection } from '@/composables/usePushConnection'; +import GithubButton from 'vue-github-button'; + const router = useRouter(); const route = useRoute(); const locale = useI18n(); @@ -161,7 +163,7 @@ async function navigateToExecutionsView(openInNewTab: boolean) { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 10e0fbf08b6..dd9248e4148 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -265,7 +265,7 @@ importers: version: 4.0.7 axios: specifier: 'catalog:' - version: 1.7.4 + version: 1.7.4(debug@4.3.7) dotenv: specifier: 8.6.0 version: 8.6.0 @@ -333,7 +333,7 @@ importers: dependencies: axios: specifier: 'catalog:' - version: 1.7.4 + version: 1.7.4(debug@4.3.7) packages/@n8n/codemirror-lang: dependencies: @@ -407,7 +407,7 @@ importers: version: 3.666.0(@aws-sdk/client-sts@3.666.0) '@getzep/zep-cloud': specifier: 1.0.12 - version: 1.0.12(@langchain/core@0.3.15(openai@4.69.0(encoding@0.1.13)(zod@3.23.8)))(encoding@0.1.13)(langchain@0.3.5(7umjwzmwnymi4lyinuvazmp6ki)) + version: 1.0.12(@langchain/core@0.3.15(openai@4.69.0(encoding@0.1.13)(zod@3.23.8)))(encoding@0.1.13)(langchain@0.3.5(4ubssgvn2k3t3hxnzmxuoc2aja)) '@getzep/zep-js': specifier: 0.9.0 version: 0.9.0 @@ -434,7 +434,7 @@ importers: version: 0.3.1(@aws-sdk/client-sso-oidc@3.666.0(@aws-sdk/client-sts@3.666.0))(@langchain/core@0.3.15(openai@4.69.0(encoding@0.1.13)(zod@3.23.8)))(encoding@0.1.13) '@langchain/community': specifier: 0.3.11 - version: 0.3.11(simkpjwqw7qnwbripe37u5qu7a) + version: 0.3.11(tzffvezibmkr4px5bpuitcp7xu) '@langchain/core': specifier: 'catalog:' version: 0.3.15(openai@4.69.0(encoding@0.1.13)(zod@3.23.8)) @@ -521,7 +521,7 @@ importers: version: 23.0.1 langchain: specifier: 0.3.5 - version: 0.3.5(7umjwzmwnymi4lyinuvazmp6ki) + version: 0.3.5(4ubssgvn2k3t3hxnzmxuoc2aja) lodash: specifier: 'catalog:' version: 4.17.21 @@ -774,7 +774,7 @@ importers: version: 1.11.0 axios: specifier: 'catalog:' - version: 1.7.4 + version: 1.7.4(debug@4.3.7) bcryptjs: specifier: 2.4.3 version: 2.4.3 @@ -1093,7 +1093,7 @@ importers: dependencies: '@langchain/core': specifier: 'catalog:' - version: 0.3.15(openai@4.69.0(zod@3.23.8)) + version: 0.3.15(openai@4.69.0(encoding@0.1.13)(zod@3.23.8)) '@n8n/client-oauth2': specifier: workspace:* version: link:../@n8n/client-oauth2 @@ -1105,7 +1105,7 @@ importers: version: 1.11.0 axios: specifier: 'catalog:' - version: 1.7.4 + version: 1.7.4(debug@4.3.7) concat-stream: specifier: 2.0.0 version: 2.0.0 @@ -1395,7 +1395,7 @@ importers: version: 10.11.0(vue@3.5.11(typescript@5.6.2)) axios: specifier: 'catalog:' - version: 1.7.4 + version: 1.7.4(debug@4.3.7) bowser: specifier: 2.11.0 version: 2.11.0 @@ -1477,6 +1477,9 @@ importers: vue-chartjs: specifier: ^5.2.0 version: 5.2.0(chart.js@4.4.0)(vue@3.5.11(typescript@5.6.2)) + vue-github-button: + specifier: ^3.1.3 + version: 3.1.3 vue-i18n: specifier: ^9.2.2 version: 9.2.2(vue@3.5.11(typescript@5.6.2)) @@ -1872,7 +1875,7 @@ importers: version: 0.15.2 axios: specifier: 'catalog:' - version: 1.7.4 + version: 1.7.4(debug@4.3.7) callsites: specifier: 3.1.0 version: 3.1.0 @@ -1918,7 +1921,7 @@ importers: devDependencies: '@langchain/core': specifier: 'catalog:' - version: 0.3.15(openai@4.69.0) + version: 0.3.15(openai@4.69.0(encoding@0.1.13)(zod@3.23.8)) '@types/deep-equal': specifier: ^1.0.1 version: 1.0.1 @@ -5392,6 +5395,7 @@ packages: '@xmldom/xmldom@0.8.6': resolution: {integrity: sha512-uRjjusqpoqfmRkTaNuLJ2VohVr67Q5YwDATW3VU7PfzTj6IRaihGrYI7zckGZjxQPBIp63nfvJbM+Yu5ICh0Bg==} engines: {node: '>=10.0.0'} + deprecated: this version has critical issues, please update to the latest version a-sync-waterfall@1.0.1: resolution: {integrity: sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==} @@ -7632,6 +7636,9 @@ packages: getpass@0.1.7: resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} + github-buttons@2.29.1: + resolution: {integrity: sha512-TV3YgAKda5hPz75n7QXmGCsSzgVya1vvmBieebg3EB5ScmashTZ0FldViG1aU2d4V5rcAGrtQ7k5uAaCo0A4PA==} + github-from-package@0.0.0: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} @@ -12074,6 +12081,9 @@ packages: peerDependencies: eslint: '>=6.0.0' + vue-github-button@3.1.3: + resolution: {integrity: sha512-ZdOnUuYJL/wUsxISsC96TARzCdf1twaWooZoI14+g4RHsJltPY+Agw6Ox6pjuMqMX0uhSK1JOMFUFNCQGlcZGA==} + vue-i18n@9.2.2: resolution: {integrity: sha512-yswpwtj89rTBhegUAv9Mu37LNznyu3NpyLQmozF3i1hYOhwpG8RjcjIFIIfnu+2MDZJGSZPXaKWvnQA71Yv9TQ==} engines: {node: '>= 14'} @@ -14066,7 +14076,7 @@ snapshots: '@gar/promisify@1.1.3': optional: true - '@getzep/zep-cloud@1.0.12(@langchain/core@0.3.15(openai@4.69.0(encoding@0.1.13)(zod@3.23.8)))(encoding@0.1.13)(langchain@0.3.5(7umjwzmwnymi4lyinuvazmp6ki))': + '@getzep/zep-cloud@1.0.12(@langchain/core@0.3.15(openai@4.69.0(encoding@0.1.13)(zod@3.23.8)))(encoding@0.1.13)(langchain@0.3.5(4ubssgvn2k3t3hxnzmxuoc2aja))': dependencies: form-data: 4.0.0 node-fetch: 2.7.0(encoding@0.1.13) @@ -14075,7 +14085,7 @@ snapshots: zod: 3.23.8 optionalDependencies: '@langchain/core': 0.3.15(openai@4.69.0(encoding@0.1.13)(zod@3.23.8)) - langchain: 0.3.5(7umjwzmwnymi4lyinuvazmp6ki) + langchain: 0.3.5(4ubssgvn2k3t3hxnzmxuoc2aja) transitivePeerDependencies: - encoding @@ -14542,7 +14552,7 @@ snapshots: - aws-crt - encoding - '@langchain/community@0.3.11(simkpjwqw7qnwbripe37u5qu7a)': + '@langchain/community@0.3.11(tzffvezibmkr4px5bpuitcp7xu)': dependencies: '@ibm-cloud/watsonx-ai': 1.1.2 '@langchain/core': 0.3.15(openai@4.69.0(encoding@0.1.13)(zod@3.23.8)) @@ -14552,7 +14562,7 @@ snapshots: flat: 5.0.2 ibm-cloud-sdk-core: 5.1.0 js-yaml: 4.1.0 - langchain: 0.3.5(7umjwzmwnymi4lyinuvazmp6ki) + langchain: 0.3.5(4ubssgvn2k3t3hxnzmxuoc2aja) langsmith: 0.2.3(openai@4.69.0(encoding@0.1.13)(zod@3.23.8)) uuid: 10.0.0 zod: 3.23.8 @@ -14565,7 +14575,7 @@ snapshots: '@aws-sdk/client-s3': 3.666.0 '@aws-sdk/credential-provider-node': 3.666.0(@aws-sdk/client-sso-oidc@3.666.0(@aws-sdk/client-sts@3.666.0))(@aws-sdk/client-sts@3.666.0) '@azure/storage-blob': 12.18.0(encoding@0.1.13) - '@getzep/zep-cloud': 1.0.12(@langchain/core@0.3.15(openai@4.69.0(encoding@0.1.13)(zod@3.23.8)))(encoding@0.1.13)(langchain@0.3.5(7umjwzmwnymi4lyinuvazmp6ki)) + '@getzep/zep-cloud': 1.0.12(@langchain/core@0.3.15(openai@4.69.0(encoding@0.1.13)(zod@3.23.8)))(encoding@0.1.13)(langchain@0.3.5(4ubssgvn2k3t3hxnzmxuoc2aja)) '@getzep/zep-js': 0.9.0 '@google-ai/generativelanguage': 2.6.0(encoding@0.1.13) '@google-cloud/storage': 7.12.1(encoding@0.1.13) @@ -14629,38 +14639,6 @@ snapshots: transitivePeerDependencies: - openai - '@langchain/core@0.3.15(openai@4.69.0(zod@3.23.8))': - dependencies: - ansi-styles: 5.2.0 - camelcase: 6.3.0 - decamelize: 1.2.0 - js-tiktoken: 1.0.12 - langsmith: 0.2.3(openai@4.69.0(zod@3.23.8)) - mustache: 4.2.0 - p-queue: 6.6.2 - p-retry: 4.6.2 - uuid: 10.0.0 - zod: 3.23.8 - zod-to-json-schema: 3.23.3(zod@3.23.8) - transitivePeerDependencies: - - openai - - '@langchain/core@0.3.15(openai@4.69.0)': - dependencies: - ansi-styles: 5.2.0 - camelcase: 6.3.0 - decamelize: 1.2.0 - js-tiktoken: 1.0.12 - langsmith: 0.2.3(openai@4.69.0) - mustache: 4.2.0 - p-queue: 6.6.2 - p-retry: 4.6.2 - uuid: 10.0.0 - zod: 3.23.8 - zod-to-json-schema: 3.23.3(zod@3.23.8) - transitivePeerDependencies: - - openai - '@langchain/google-common@0.1.1(@langchain/core@0.3.15(openai@4.69.0(encoding@0.1.13)(zod@3.23.8)))(zod@3.23.8)': dependencies: '@langchain/core': 0.3.15(openai@4.69.0(encoding@0.1.13)(zod@3.23.8)) @@ -15278,7 +15256,7 @@ snapshots: '@rudderstack/rudder-sdk-node@2.0.9(tslib@2.6.2)': dependencies: - axios: 1.7.4 + axios: 1.7.4(debug@4.3.7) axios-retry: 3.7.0 component-type: 1.2.1 join-component: 1.1.0 @@ -17534,23 +17512,7 @@ snapshots: '@babel/runtime': 7.24.7 is-retry-allowed: 2.2.0 - axios@1.7.4: - dependencies: - follow-redirects: 1.15.6(debug@4.3.6) - form-data: 4.0.0 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - axios@1.7.4(debug@4.3.7): - dependencies: - follow-redirects: 1.15.6(debug@4.3.7) - form-data: 4.0.0 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - - axios@1.7.7: dependencies: follow-redirects: 1.15.6(debug@4.3.6) form-data: 4.0.0 @@ -19226,7 +19188,7 @@ snapshots: eslint-import-resolver-node@0.3.9: dependencies: - debug: 3.2.7(supports-color@5.5.0) + debug: 3.2.7(supports-color@8.1.1) is-core-module: 2.13.1 resolve: 1.22.8 transitivePeerDependencies: @@ -19251,7 +19213,7 @@ snapshots: eslint-module-utils@2.8.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.2))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0): dependencies: - debug: 3.2.7(supports-color@5.5.0) + debug: 3.2.7(supports-color@8.1.1) optionalDependencies: '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.6.2) eslint: 8.57.0 @@ -19271,7 +19233,7 @@ snapshots: array.prototype.findlastindex: 1.2.3 array.prototype.flat: 1.3.2 array.prototype.flatmap: 1.3.2 - debug: 3.2.7(supports-color@5.5.0) + debug: 3.2.7(supports-color@8.1.1) doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 @@ -19983,6 +19945,8 @@ snapshots: dependencies: assert-plus: 1.0.0 + github-buttons@2.29.1: {} + github-from-package@0.0.0: {} github-slugger@2.0.0: {} @@ -20062,7 +20026,7 @@ snapshots: array-parallel: 0.1.3 array-series: 0.1.5 cross-spawn: 4.0.2 - debug: 3.2.7(supports-color@5.5.0) + debug: 3.2.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -20448,7 +20412,7 @@ snapshots: infisical-node@1.3.0: dependencies: - axios: 1.7.7 + axios: 1.7.7(debug@4.3.6) dotenv: 16.3.1 tweetnacl: 1.0.3 tweetnacl-util: 0.15.1 @@ -21378,7 +21342,7 @@ snapshots: kuler@2.0.0: {} - langchain@0.3.5(7umjwzmwnymi4lyinuvazmp6ki): + langchain@0.3.5(4ubssgvn2k3t3hxnzmxuoc2aja): dependencies: '@langchain/core': 0.3.15(openai@4.69.0(encoding@0.1.13)(zod@3.23.8)) '@langchain/openai': 0.3.11(@langchain/core@0.3.15(openai@4.69.0(encoding@0.1.13)(zod@3.23.8)))(encoding@0.1.13) @@ -21402,7 +21366,7 @@ snapshots: '@langchain/groq': 0.1.2(@langchain/core@0.3.15(openai@4.69.0(encoding@0.1.13)(zod@3.23.8)))(encoding@0.1.13) '@langchain/mistralai': 0.1.1(@langchain/core@0.3.15(openai@4.69.0(encoding@0.1.13)(zod@3.23.8)))(encoding@0.1.13) '@langchain/ollama': 0.1.1(@langchain/core@0.3.15(openai@4.69.0(encoding@0.1.13)(zod@3.23.8))) - axios: 1.7.4 + axios: 1.7.4(debug@4.3.7) cheerio: 1.0.0 handlebars: 4.7.8 transitivePeerDependencies: @@ -21421,28 +21385,6 @@ snapshots: optionalDependencies: openai: 4.69.0(encoding@0.1.13)(zod@3.23.8) - langsmith@0.2.3(openai@4.69.0(zod@3.23.8)): - dependencies: - '@types/uuid': 10.0.0 - commander: 10.0.1 - p-queue: 6.6.2 - p-retry: 4.6.2 - semver: 7.6.0 - uuid: 10.0.0 - optionalDependencies: - openai: 4.69.0(zod@3.23.8) - - langsmith@0.2.3(openai@4.69.0): - dependencies: - '@types/uuid': 10.0.0 - commander: 10.0.1 - p-queue: 6.6.2 - p-retry: 4.6.2 - semver: 7.6.0 - uuid: 10.0.0 - optionalDependencies: - openai: 4.69.0(zod@3.23.8) - lazy-ass@1.6.0: {} ldapts@4.2.6: @@ -22777,22 +22719,6 @@ snapshots: - encoding - supports-color - openai@4.69.0(zod@3.23.8): - dependencies: - '@types/node': 18.16.16 - '@types/node-fetch': 2.6.4 - abort-controller: 3.0.0 - agentkeepalive: 4.2.1 - form-data-encoder: 1.7.2 - formdata-node: 4.4.1 - node-fetch: 2.7.0(encoding@0.1.13) - optionalDependencies: - zod: 3.23.8 - transitivePeerDependencies: - - encoding - - supports-color - optional: true - openapi-sampler@1.5.1: dependencies: '@types/json-schema': 7.0.15 @@ -22973,7 +22899,7 @@ snapshots: pdf-parse@1.1.1: dependencies: - debug: 3.2.7(supports-color@5.5.0) + debug: 3.2.7(supports-color@8.1.1) node-ensure: 0.0.0 transitivePeerDependencies: - supports-color @@ -23175,7 +23101,7 @@ snapshots: posthog-node@3.2.1: dependencies: - axios: 1.7.7 + axios: 1.7.7(debug@4.3.6) rusha: 0.8.14 transitivePeerDependencies: - debug @@ -23804,7 +23730,7 @@ snapshots: rhea@1.0.24: dependencies: - debug: 3.2.7(supports-color@5.5.0) + debug: 3.2.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -24180,7 +24106,7 @@ snapshots: asn1.js: 5.4.1 asn1.js-rfc2560: 5.0.1(asn1.js@5.4.1) asn1.js-rfc5280: 3.0.0 - axios: 1.7.7 + axios: 1.7.7(debug@4.3.6) big-integer: 1.6.51 bignumber.js: 9.1.2 binascii: 0.0.2 @@ -25420,6 +25346,10 @@ snapshots: transitivePeerDependencies: - supports-color + vue-github-button@3.1.3: + dependencies: + github-buttons: 2.29.1 + vue-i18n@9.2.2(vue@3.5.11(typescript@5.6.2)): dependencies: '@intlify/core-base': 9.2.2 From e28ec6ec014847590fdfd9a70c05ed63579f0863 Mon Sep 17 00:00:00 2001 From: Justin Ellingwood Date: Wed, 13 Nov 2024 17:43:26 +0000 Subject: [PATCH 10/16] docs: Update npm package README.md to put minimum version to v18 (no-changelog) (#11726) --- packages/cli/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cli/README.md b/packages/cli/README.md index 526f4631676..0235c694da9 100644 --- a/packages/cli/README.md +++ b/packages/cli/README.md @@ -48,7 +48,7 @@ It will download everything that is needed to start n8n. You can then access n8n by opening: [http://localhost:5678](http://localhost:5678) -**Note:** The minimum required version for Node.js is v14.15. Make sure to update Node.js to v14.15 or above. +**Note:** The minimum required version for Node.js is v18. Make sure to update Node.js to v18 or above. ### Run with Docker From a91abeeff5f614e22741b6942a5cd8bc498a97fa Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 13 Nov 2024 16:53:54 +0000 Subject: [PATCH 11/16] :rocket: Release 1.68.0 (#11725) Co-authored-by: ShireenMissi <94372015+ShireenMissi@users.noreply.github.com> --- CHANGELOG.md | 64 ++++++++++++++++++++++ package.json | 2 +- packages/@n8n/chat/package.json | 2 +- packages/@n8n/config/package.json | 2 +- packages/@n8n/nodes-langchain/package.json | 2 +- packages/@n8n/task-runner/package.json | 2 +- packages/cli/package.json | 2 +- packages/core/package.json | 2 +- packages/design-system/package.json | 2 +- packages/editor-ui/package.json | 2 +- packages/node-dev/package.json | 2 +- packages/nodes-base/package.json | 2 +- packages/workflow/package.json | 2 +- 13 files changed, 76 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f85ab264bef..7c7a1e036fa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,67 @@ +# [1.68.0](https://github.com/n8n-io/n8n/compare/n8n@1.67.0...n8n@1.68.0) (2024-11-13) + + +### Bug Fixes + +* **AI Agent Node:** Throw better errors for non-tool agents when using structured tools ([#11582](https://github.com/n8n-io/n8n/issues/11582)) ([9b6123d](https://github.com/n8n-io/n8n/commit/9b6123dfb2648f880c7829211fa07666611ad0ea)) +* **Auto-fixing Output Parser Node:** Only run retry chain on parsing errors ([#11569](https://github.com/n8n-io/n8n/issues/11569)) ([21b31e4](https://github.com/n8n-io/n8n/commit/21b31e488ff6ab0bcf3c79edcd17b9e37d4c64a4)) +* **core:** Continue with error output reverse items in success branch ([#11684](https://github.com/n8n-io/n8n/issues/11684)) ([6d5ee83](https://github.com/n8n-io/n8n/commit/6d5ee832966fab96043b0d65697c059ced61d334)) +* **core:** Ensure task runner server closes websocket connection correctly ([#11633](https://github.com/n8n-io/n8n/issues/11633)) ([b496bf3](https://github.com/n8n-io/n8n/commit/b496bf3147d2cd873d24371be02cb7ea5dbd8621)) +* **core:** Handle websocket connection error more gracefully in task runners ([#11635](https://github.com/n8n-io/n8n/issues/11635)) ([af7d6e6](https://github.com/n8n-io/n8n/commit/af7d6e68d0436ff8a3d4e8410dc8ee4f3a035c44)) +* **core:** Improve model sub-nodes error handling ([#11418](https://github.com/n8n-io/n8n/issues/11418)) ([57467d0](https://github.com/n8n-io/n8n/commit/57467d0285d67509322630c4c01130022f274a41)) +* **core:** Make push work for waiting webhooks ([#11678](https://github.com/n8n-io/n8n/issues/11678)) ([600479b](https://github.com/n8n-io/n8n/commit/600479bf36ba8870d4aecacad19a2dc5f2d97959)) +* **core:** Revert all the context helpers changes ([#11616](https://github.com/n8n-io/n8n/issues/11616)) ([20fd38f](https://github.com/n8n-io/n8n/commit/20fd38f3517f7ef35604ba16abb4d951270b4d50)) +* **core:** Set the authentication methad to `email` during startup if the SAML configuration in the database has been corrupted ([#11600](https://github.com/n8n-io/n8n/issues/11600)) ([6439291](https://github.com/n8n-io/n8n/commit/6439291738dec16261979d6d835acbc63743d51a)) +* **core:** Use cached value in retrieval of personal project owner ([#11533](https://github.com/n8n-io/n8n/issues/11533)) ([04029d8](https://github.com/n8n-io/n8n/commit/04029d82a11b52990890380ba7094055b18e7c1f)) +* Credentials save button is hidden unless you make changes to the ([#11492](https://github.com/n8n-io/n8n/issues/11492)) ([835fbfe](https://github.com/n8n-io/n8n/commit/835fbfe337dd8dc0d0b0318c7227e174484e1328)) +* **editor:** Add stickies to node insert position conflict check allowlist ([#11624](https://github.com/n8n-io/n8n/issues/11624)) ([fc39e3c](https://github.com/n8n-io/n8n/commit/fc39e3ca16231c176957e2504d55df6b416874fe)) +* **editor:** Adjust Scrollbar Width of RunData Header Row ([#11561](https://github.com/n8n-io/n8n/issues/11561)) ([d17d76a](https://github.com/n8n-io/n8n/commit/d17d76a85d5425bc091d29fc84605ffbccbca984)) +* **editor:** Cap NDV Output View Tab Index to prevent rare edge case ([#11614](https://github.com/n8n-io/n8n/issues/11614)) ([a6c8ee4](https://github.com/n8n-io/n8n/commit/a6c8ee4a82e6055766dc1307f79c774c17bb5f4d)) +* **editor:** Do not show hover tooltip when autocomplete is active ([#11653](https://github.com/n8n-io/n8n/issues/11653)) ([23caf43](https://github.com/n8n-io/n8n/commit/23caf43e30342a21d45c825f438aa1e6193601d1)) +* **editor:** Enable pinning main output with error and always allow unpinning ([#11452](https://github.com/n8n-io/n8n/issues/11452)) ([40c8882](https://github.com/n8n-io/n8n/commit/40c88822acdcda6401bd92b9cf89d013c44b8453)) +* **editor:** Fix collapsing nested items in expression modal schema view ([#11645](https://github.com/n8n-io/n8n/issues/11645)) ([41dea52](https://github.com/n8n-io/n8n/commit/41dea522fbfb1c9acee51f47f384973914454b5f)) +* **editor:** Fix default workflow settings ([#11632](https://github.com/n8n-io/n8n/issues/11632)) ([658568e](https://github.com/n8n-io/n8n/commit/658568e2700bfd5b61da53f3052403d0098c2d90)) +* **editor:** Fix duplicate chat trigger ([#11693](https://github.com/n8n-io/n8n/issues/11693)) ([a025848](https://github.com/n8n-io/n8n/commit/a025848ec4be96f74d4de2ab104256b6d89bb837)) +* **editor:** Fix hiding SQL query output when trying to select ([#11649](https://github.com/n8n-io/n8n/issues/11649)) ([4dbf2f4](https://github.com/n8n-io/n8n/commit/4dbf2f4256111985b367030020f1494b8a8b95af)) +* **editor:** Fix scrolling in code edit modal ([#11647](https://github.com/n8n-io/n8n/issues/11647)) ([8f695f3](https://github.com/n8n-io/n8n/commit/8f695f3417820e7b9bb04b78972f6abbd61abbe8)) +* **editor:** Prevent error being thrown in RLC while loading ([#11676](https://github.com/n8n-io/n8n/issues/11676)) ([ca8cb45](https://github.com/n8n-io/n8n/commit/ca8cb455ba59831295c238afb11aeab6ad18428e)) +* **editor:** Prevent NodeCreator from swallowing AskAssistant enter event ([#11532](https://github.com/n8n-io/n8n/issues/11532)) ([db94f16](https://github.com/n8n-io/n8n/commit/db94f169fcd03983fc78a3b4c5e11543610825bf)) +* **editor:** Show node executing status shortly before switching to success on new canvas ([#11675](https://github.com/n8n-io/n8n/issues/11675)) ([b0ba24c](https://github.com/n8n-io/n8n/commit/b0ba24cbbc55cebc26e9f62ead7396c4c8fbd062)) +* **editor:** Show only error title and 'Open errored node' button; hide 'Ask Assistant' in root for sub-node errors ([#11573](https://github.com/n8n-io/n8n/issues/11573)) ([8cba100](https://github.com/n8n-io/n8n/commit/8cba1004888f60ca653ee069501c13b3cadcc561)) +* **Facebook Lead Ads Trigger Node:** Fix issue with optional fields ([#11692](https://github.com/n8n-io/n8n/issues/11692)) ([70d315b](https://github.com/n8n-io/n8n/commit/70d315b3d5b8f5f3e0f39527bba11e254a52028e)) +* **Google BigQuery Node:** Add item index to insert error ([#11702](https://github.com/n8n-io/n8n/issues/11702)) ([145d092](https://github.com/n8n-io/n8n/commit/145d0921b217bbd4b625beaacfa14429560bf51b)) +* **Google Drive Node:** Fix file upload for streams ([#11698](https://github.com/n8n-io/n8n/issues/11698)) ([770230f](https://github.com/n8n-io/n8n/commit/770230fbfe0b9e86527254e201c4602fbced94ff)) +* **In-Memory Vector Store Node:** Fix displaying execution data of connected embedding nodes ([#11701](https://github.com/n8n-io/n8n/issues/11701)) ([40ade15](https://github.com/n8n-io/n8n/commit/40ade151724f4af28a6ed959fd9363450ea711fd)) +* **Item List Output Parser Node:** Fix number of items parameter issue ([#11696](https://github.com/n8n-io/n8n/issues/11696)) ([01ebe9d](https://github.com/n8n-io/n8n/commit/01ebe9dd38629afbab954fb489f3ef2bb7ab5b34)) +* **n8n Form Node:** Find completion page ([#11674](https://github.com/n8n-io/n8n/issues/11674)) ([ed3ad6d](https://github.com/n8n-io/n8n/commit/ed3ad6d684597f7c4b7419dfa81d476e66f10eba)) +* **n8n Form Node:** Open form page if form trigger has pin data ([#11673](https://github.com/n8n-io/n8n/issues/11673)) ([f0492bd](https://github.com/n8n-io/n8n/commit/f0492bd3bb0d94802a2707fb1cf861313b6ea808)) +* **n8n Form Node:** Trigger page stack in waiting if error in workflow ([#11671](https://github.com/n8n-io/n8n/issues/11671)) ([94b5873](https://github.com/n8n-io/n8n/commit/94b5873248212a5500f02cf3c0d74df6f9d8fb26)) +* **n8n Form Trigger Node:** Checkboxes different sizes ([#11677](https://github.com/n8n-io/n8n/issues/11677)) ([c08d23c](https://github.com/n8n-io/n8n/commit/c08d23c00f01bb6fcb3b75f02e0338af375f9b32)) +* NDV search bugs ([#11613](https://github.com/n8n-io/n8n/issues/11613)) ([c32cf64](https://github.com/n8n-io/n8n/commit/c32cf644a6b8c21558e802449329877845de70b1)) +* **Notion Node:** Extract page url ([#11643](https://github.com/n8n-io/n8n/issues/11643)) ([cbdd535](https://github.com/n8n-io/n8n/commit/cbdd535fe0cb4e032ea82f008dcf35cc5f2264c2)) +* **Redis Chat Memory Node:** Respect the SSL flag from the credential ([#11689](https://github.com/n8n-io/n8n/issues/11689)) ([b5cbf75](https://github.com/n8n-io/n8n/commit/b5cbf7566d351d8a8e9972f13ff5867ff1c8d7d0)) +* **Supabase Node:** Reset query parameters in get many operation ([#11630](https://github.com/n8n-io/n8n/issues/11630)) ([7458229](https://github.com/n8n-io/n8n/commit/74582290c04d2dd32300b1a6c7715862ae837d34)) +* **Switch Node:** Maintain output connections ([#11162](https://github.com/n8n-io/n8n/issues/11162)) ([9bd79fc](https://github.com/n8n-io/n8n/commit/9bd79fceebc4453d0fe40ae5f628d5e31ff2b326)) + + +### Features + +* **AI Transform Node:** Show warning for binary data ([#11560](https://github.com/n8n-io/n8n/issues/11560)) ([ddbb263](https://github.com/n8n-io/n8n/commit/ddbb263dce0fc458abc95d850217251bb49d2b83)) +* **core:** Make all http requests made with `httpRequestWithAuthentication` abortable ([#11704](https://github.com/n8n-io/n8n/issues/11704)) ([0d8aada](https://github.com/n8n-io/n8n/commit/0d8aada49005d6a6078e8460003a0de61a8f423c)) +* **editor:** Improve how we show default Agent prompt and Memory session parameters ([#11491](https://github.com/n8n-io/n8n/issues/11491)) ([565f8cd](https://github.com/n8n-io/n8n/commit/565f8cd8c78b534a50e272997d659d162fa86625)) +* **editor:** Improve workflow loading performance on new canvas ([#11629](https://github.com/n8n-io/n8n/issues/11629)) ([f1e2df7](https://github.com/n8n-io/n8n/commit/f1e2df7d0753aa0f33cf299100a063bf89cc8b35)) +* **editor:** Redesign Canvas Chat ([#11634](https://github.com/n8n-io/n8n/issues/11634)) ([a412ab7](https://github.com/n8n-io/n8n/commit/a412ab7ebfcd6aa9051a8ca36e34f1067102c998)) +* **editor:** Restrict when a ChatTrigger Node is added automatically ([#11523](https://github.com/n8n-io/n8n/issues/11523)) ([93a6f85](https://github.com/n8n-io/n8n/commit/93a6f858fa3eb53f8b48b2a3d6b7377279dd6ed1)) +* Github star button in-app ([#11695](https://github.com/n8n-io/n8n/issues/11695)) ([0fd684d](https://github.com/n8n-io/n8n/commit/0fd684d90c830f8b0aab12b7f78a1fa5619c62c9)) +* **Oura Node:** Update node for v2 api ([#11604](https://github.com/n8n-io/n8n/issues/11604)) ([3348fbb](https://github.com/n8n-io/n8n/commit/3348fbb1547c430ff8707b298640e3461d3f6536)) + + +### Performance Improvements + +* **editor:** Add lint rules for optimization-friendly syntax ([#11681](https://github.com/n8n-io/n8n/issues/11681)) ([88295c7](https://github.com/n8n-io/n8n/commit/88295c70495ae3d017674d5745972a346fcbaf12)) + + + # [1.67.0](https://github.com/n8n-io/n8n/compare/n8n@1.66.0...n8n@1.67.0) (2024-11-06) diff --git a/package.json b/package.json index c7d4512b2e5..bdf3221845c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "n8n-monorepo", - "version": "1.67.0", + "version": "1.68.0", "private": true, "engines": { "node": ">=20.15", diff --git a/packages/@n8n/chat/package.json b/packages/@n8n/chat/package.json index a6098892f00..6ad77655b4f 100644 --- a/packages/@n8n/chat/package.json +++ b/packages/@n8n/chat/package.json @@ -1,6 +1,6 @@ { "name": "@n8n/chat", - "version": "0.30.0", + "version": "0.31.0", "scripts": { "dev": "pnpm run storybook", "build": "pnpm build:vite && pnpm build:bundle", diff --git a/packages/@n8n/config/package.json b/packages/@n8n/config/package.json index 4867390bf7f..20d1aec7269 100644 --- a/packages/@n8n/config/package.json +++ b/packages/@n8n/config/package.json @@ -1,6 +1,6 @@ { "name": "@n8n/config", - "version": "1.17.0", + "version": "1.18.0", "scripts": { "clean": "rimraf dist .turbo", "dev": "pnpm watch", diff --git a/packages/@n8n/nodes-langchain/package.json b/packages/@n8n/nodes-langchain/package.json index 38acd88c9aa..23805646eed 100644 --- a/packages/@n8n/nodes-langchain/package.json +++ b/packages/@n8n/nodes-langchain/package.json @@ -1,6 +1,6 @@ { "name": "@n8n/n8n-nodes-langchain", - "version": "1.67.0", + "version": "1.68.0", "description": "", "main": "index.js", "scripts": { diff --git a/packages/@n8n/task-runner/package.json b/packages/@n8n/task-runner/package.json index 83506670992..b595fefe6e4 100644 --- a/packages/@n8n/task-runner/package.json +++ b/packages/@n8n/task-runner/package.json @@ -1,6 +1,6 @@ { "name": "@n8n/task-runner", - "version": "1.5.0", + "version": "1.6.0", "scripts": { "clean": "rimraf dist .turbo", "start": "node dist/start.js", diff --git a/packages/cli/package.json b/packages/cli/package.json index 5c589116eec..88f84389319 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "n8n", - "version": "1.67.0", + "version": "1.68.0", "description": "n8n Workflow Automation Tool", "main": "dist/index", "types": "dist/index.d.ts", diff --git a/packages/core/package.json b/packages/core/package.json index 8628aa92efc..5ad1ac4d5d2 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "n8n-core", - "version": "1.67.0", + "version": "1.68.0", "description": "Core functionality of n8n", "main": "dist/index", "types": "dist/index.d.ts", diff --git a/packages/design-system/package.json b/packages/design-system/package.json index 94f1cba0aa5..11da59ddaa8 100644 --- a/packages/design-system/package.json +++ b/packages/design-system/package.json @@ -1,6 +1,6 @@ { "name": "n8n-design-system", - "version": "1.57.0", + "version": "1.58.0", "main": "src/main.ts", "import": "src/main.ts", "scripts": { diff --git a/packages/editor-ui/package.json b/packages/editor-ui/package.json index cc3744924c3..c9b866bb37b 100644 --- a/packages/editor-ui/package.json +++ b/packages/editor-ui/package.json @@ -1,6 +1,6 @@ { "name": "n8n-editor-ui", - "version": "1.67.0", + "version": "1.68.0", "description": "Workflow Editor UI for n8n", "main": "index.js", "scripts": { diff --git a/packages/node-dev/package.json b/packages/node-dev/package.json index 60e8ed6095c..37a0c88f277 100644 --- a/packages/node-dev/package.json +++ b/packages/node-dev/package.json @@ -1,6 +1,6 @@ { "name": "n8n-node-dev", - "version": "1.67.0", + "version": "1.68.0", "description": "CLI to simplify n8n credentials/node development", "main": "dist/src/index", "types": "dist/src/index.d.ts", diff --git a/packages/nodes-base/package.json b/packages/nodes-base/package.json index 539112b430e..1de487f7ad2 100644 --- a/packages/nodes-base/package.json +++ b/packages/nodes-base/package.json @@ -1,6 +1,6 @@ { "name": "n8n-nodes-base", - "version": "1.67.0", + "version": "1.68.0", "description": "Base nodes of n8n", "main": "index.js", "scripts": { diff --git a/packages/workflow/package.json b/packages/workflow/package.json index bbb75b75409..16589e19c4e 100644 --- a/packages/workflow/package.json +++ b/packages/workflow/package.json @@ -1,6 +1,6 @@ { "name": "n8n-workflow", - "version": "1.66.0", + "version": "1.67.0", "description": "Workflow base code of n8n", "main": "dist/index.js", "module": "src/index.ts", From 8a0ad0f910feeada6d0c63e81c3e97a1a6e44de7 Mon Sep 17 00:00:00 2001 From: Ivan Atanasov Date: Thu, 14 Nov 2024 12:19:12 +0100 Subject: [PATCH 12/16] fix(editor): Improve formatting of expired trial error message (#11708) --- .vscode/launch.json | 4 +- .../src/composables/usePushConnection.test.ts | 111 ++++++++++++++++++ .../src/composables/usePushConnection.ts | 1 + .../src/composables/useToast.test.ts | 55 +++++++++ 4 files changed, 168 insertions(+), 3 deletions(-) create mode 100644 packages/editor-ui/src/composables/useToast.test.ts diff --git a/.vscode/launch.json b/.vscode/launch.json index 448d745236c..5501fe44391 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -47,9 +47,7 @@ "request": "launch", "skipFiles": ["/**"], "type": "node", - "env": { - // "N8N_PORT": "5679", - }, + "envFile": "${workspaceFolder}/.env", "outputCapture": "std", "killBehavior": "polite" }, diff --git a/packages/editor-ui/src/composables/usePushConnection.test.ts b/packages/editor-ui/src/composables/usePushConnection.test.ts index c21fc767026..819b9e842e9 100644 --- a/packages/editor-ui/src/composables/usePushConnection.test.ts +++ b/packages/editor-ui/src/composables/usePushConnection.test.ts @@ -5,6 +5,10 @@ import type { PushMessage, PushPayload } from '@n8n/api-types'; import { usePushConnection } from '@/composables/usePushConnection'; import { usePushConnectionStore } from '@/stores/pushConnection.store'; import { useOrchestrationStore } from '@/stores/orchestration.store'; +import { useUIStore } from '@/stores/ui.store'; +import { useWorkflowsStore } from '@/stores/workflows.store'; +import { useToast } from '@/composables/useToast'; +import type { WorkflowOperationError } from 'n8n-workflow'; vi.mock('vue-router', () => { return { @@ -16,6 +20,19 @@ vi.mock('vue-router', () => { }; }); +vi.mock('@/composables/useToast', () => { + const showMessage = vi.fn(); + const showError = vi.fn(); + return { + useToast: () => { + return { + showMessage, + showError, + }; + }, + }; +}); + vi.useFakeTimers(); describe('usePushConnection()', () => { @@ -23,6 +40,9 @@ describe('usePushConnection()', () => { let pushStore: ReturnType; let orchestrationStore: ReturnType; let pushConnection: ReturnType; + let uiStore: ReturnType; + let workflowsStore: ReturnType; + let toast: ReturnType; beforeEach(() => { setActivePinia(createPinia()); @@ -30,7 +50,14 @@ describe('usePushConnection()', () => { router = vi.mocked(useRouter)(); pushStore = usePushConnectionStore(); orchestrationStore = useOrchestrationStore(); + uiStore = useUIStore(); + workflowsStore = useWorkflowsStore(); pushConnection = usePushConnection({ router }); + toast = useToast(); + }); + + afterEach(() => { + vi.restoreAllMocks(); }); describe('initialize()', () => { @@ -106,5 +133,89 @@ describe('usePushConnection()', () => { expect(result).toBeTruthy(); }); }); + + describe('executionFinished', () => { + it('should handle executionFinished event correctly', async () => { + const event: PushMessage = { + type: 'executionFinished', + data: { + executionId: '1', + data: { + data: { + resultData: { + runData: {}, + }, + }, + finished: true, + mode: 'manual', + startedAt: new Date(), + stoppedAt: new Date(), + status: 'success', + }, + }, + }; + + workflowsStore.activeExecutionId = '1'; + uiStore.isActionActive.workflowRunning = true; + + const result = await pushConnection.pushMessageReceived(event); + + expect(result).toBeTruthy(); + expect(workflowsStore.workflowExecutionData).toBeDefined(); + expect(uiStore.isActionActive['workflowRunning']).toBeTruthy(); + + expect(toast.showMessage).toHaveBeenCalledWith({ + title: 'Workflow executed successfully', + type: 'success', + }); + }); + + it('should handle isManualExecutionCancelled correctly', async () => { + const event: PushMessage = { + type: 'executionFinished', + data: { + executionId: '1', + data: { + data: { + startData: {}, + resultData: { + runData: { + 'Last Node': [], + }, + lastNodeExecuted: 'Last Node', + error: { + message: + 'Your trial has ended. Upgrade now to keep automating', + name: 'NodeApiError', + node: 'Last Node', + } as unknown as WorkflowOperationError, + }, + }, + startedAt: new Date(), + mode: 'manual', + status: 'running', + }, + }, + }; + + workflowsStore.activeExecutionId = '1'; + uiStore.isActionActive['workflowRunning'] = true; + + const result = await pushConnection.pushMessageReceived(event); + + expect(useToast().showMessage).toHaveBeenCalledWith({ + message: + 'Your trial has ended. Upgrade now to keep automating', + title: 'Problem in node ‘Last Node‘', + type: 'error', + duration: 0, + dangerouslyUseHTMLString: true, + }); + + expect(result).toBeTruthy(); + expect(workflowsStore.workflowExecutionData).toBeDefined(); + expect(uiStore.isActionActive.workflowRunning).toBeTruthy(); + }); + }); }); }); diff --git a/packages/editor-ui/src/composables/usePushConnection.ts b/packages/editor-ui/src/composables/usePushConnection.ts index ea9f79d27ec..a5976d35d48 100644 --- a/packages/editor-ui/src/composables/usePushConnection.ts +++ b/packages/editor-ui/src/composables/usePushConnection.ts @@ -423,6 +423,7 @@ export function usePushConnection({ router }: { router: ReturnType { + const original = await vi.importActual('element-plus'); + return { + ...original, + ElNotification: vi.fn(), + ElTooltip: vi.fn(), + }; +}); + +describe('useToast', () => { + let toast: ReturnType; + + beforeEach(() => { + setActivePinia(createPinia()); + + toast = useToast(); + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); + + it('should show a message', () => { + const messageData = { message: 'Test message', title: 'Test title' }; + toast.showMessage(messageData); + + expect(Notification).toHaveBeenCalledWith( + expect.objectContaining({ + message: 'Test message', + title: 'Test title', + }), + ); + }); + + it('should sanitize message and title', () => { + const messageData = { + message: '', + title: '', + }; + + toast.showMessage(messageData); + + expect(Notification).toHaveBeenCalledWith( + expect.objectContaining({ + message: 'alert("xss")', + title: 'alert("xss")', + }), + ); + }); +}); From 1a783606b4ef22d85e173a2a780d5c49ff208932 Mon Sep 17 00:00:00 2001 From: Csaba Tuncsik Date: Thu, 14 Nov 2024 13:59:08 +0100 Subject: [PATCH 13/16] fix(editor): Change Home label to Overview (#11736) --- cypress/e2e/39-projects.cy.ts | 6 +++--- .../editor-ui/src/components/Projects/ProjectHeader.test.ts | 2 +- .../editor-ui/src/components/Projects/ProjectHeader.vue | 2 +- .../editor-ui/src/components/Projects/ProjectNavigation.vue | 2 +- packages/editor-ui/src/plugins/i18n/locales/en.json | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/cypress/e2e/39-projects.cy.ts b/cypress/e2e/39-projects.cy.ts index 0d4154e6462..bbd0508662a 100644 --- a/cypress/e2e/39-projects.cy.ts +++ b/cypress/e2e/39-projects.cy.ts @@ -176,7 +176,7 @@ describe('Projects', { disableAutoLogin: true }, () => { let menuItems = cy.getByTestId('menu-item'); menuItems.filter('[class*=active_]').should('have.length', 1); - menuItems.filter(':contains("Home")[class*=active_]').should('exist'); + menuItems.filter(':contains("Overview")[class*=active_]').should('exist'); projects.getMenuItems().first().click(); @@ -222,7 +222,7 @@ describe('Projects', { disableAutoLogin: true }, () => { menuItems = cy.getByTestId('menu-item'); menuItems.filter('[class*=active_]').should('have.length', 1); - menuItems.filter(':contains("Home")[class*=active_]').should('exist'); + menuItems.filter(':contains("Overview")[class*=active_]').should('exist'); workflowsPage.getters.workflowCards().should('have.length', 2).first().click(); @@ -230,7 +230,7 @@ describe('Projects', { disableAutoLogin: true }, () => { cy.getByTestId('execute-workflow-button').should('be.visible'); menuItems = cy.getByTestId('menu-item'); - menuItems.filter(':contains("Home")[class*=active_]').should('not.exist'); + menuItems.filter(':contains("Overview")[class*=active_]').should('not.exist'); menuItems = cy.getByTestId('menu-item'); menuItems.filter('[class*=active_]').should('have.length', 1); diff --git a/packages/editor-ui/src/components/Projects/ProjectHeader.test.ts b/packages/editor-ui/src/components/Projects/ProjectHeader.test.ts index 46b18718bb4..01c96a8ad88 100644 --- a/packages/editor-ui/src/components/Projects/ProjectHeader.test.ts +++ b/packages/editor-ui/src/components/Projects/ProjectHeader.test.ts @@ -65,7 +65,7 @@ describe('ProjectHeader', () => { it('should render the correct title', async () => { const { getByText, rerender } = renderComponent(); - expect(getByText('Home')).toBeVisible(); + expect(getByText('Overview')).toBeVisible(); projectsStore.currentProject = { type: ProjectTypes.Personal } as Project; await rerender({}); diff --git a/packages/editor-ui/src/components/Projects/ProjectHeader.vue b/packages/editor-ui/src/components/Projects/ProjectHeader.vue index a89a195975a..6432bfcfcb0 100644 --- a/packages/editor-ui/src/components/Projects/ProjectHeader.vue +++ b/packages/editor-ui/src/components/Projects/ProjectHeader.vue @@ -23,7 +23,7 @@ const headerIcon = computed(() => { const projectName = computed(() => { if (!projectsStore.currentProject) { - return i18n.baseText('projects.menu.home'); + return i18n.baseText('projects.menu.overview'); } else if (projectsStore.currentProject.type === ProjectTypes.Personal) { return i18n.baseText('projects.menu.personal'); } else { diff --git a/packages/editor-ui/src/components/Projects/ProjectNavigation.vue b/packages/editor-ui/src/components/Projects/ProjectNavigation.vue index 47513ea1d6b..fd9145bb999 100644 --- a/packages/editor-ui/src/components/Projects/ProjectNavigation.vue +++ b/packages/editor-ui/src/components/Projects/ProjectNavigation.vue @@ -27,7 +27,7 @@ const isCreatingProject = ref(false); const isComponentMounted = ref(false); const home = computed(() => ({ id: 'home', - label: locale.baseText('projects.menu.home'), + label: locale.baseText('projects.menu.overview'), icon: 'home', route: { to: { name: VIEWS.HOMEPAGE }, diff --git a/packages/editor-ui/src/plugins/i18n/locales/en.json b/packages/editor-ui/src/plugins/i18n/locales/en.json index ca342147fcd..7e7c02315ad 100644 --- a/packages/editor-ui/src/plugins/i18n/locales/en.json +++ b/packages/editor-ui/src/plugins/i18n/locales/en.json @@ -2499,7 +2499,7 @@ "settings.mfa.title": "Multi-factor Authentication", "settings.mfa.updateConfiguration": "MFA configuration updated", "settings.mfa.invalidAuthenticatorCode": "Invalid authenticator code", - "projects.menu.home": "Home", + "projects.menu.overview": "Overview", "projects.menu.title": "Projects", "projects.menu.personal": "Personal", "projects.menu.addProject": "Add project", From 61fac4f93f81264e75e600874ee0735c9b258ce4 Mon Sep 17 00:00:00 2001 From: Giulio Andreini Date: Thu, 14 Nov 2024 14:25:17 +0100 Subject: [PATCH 14/16] fix(editor): Fix callout component border issue (no-changelog) (#11705) Co-authored-by: Elias Meire --- .../design-system/src/components/N8nCallout/Callout.vue | 8 ++++++++ packages/editor-ui/src/components/banners/BaseBanner.vue | 7 +------ .../banners/__snapshots__/V1Banner.test.ts.snap | 4 ++-- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/packages/design-system/src/components/N8nCallout/Callout.vue b/packages/design-system/src/components/N8nCallout/Callout.vue index 9d866715c13..6a796ba32a8 100644 --- a/packages/design-system/src/components/N8nCallout/Callout.vue +++ b/packages/design-system/src/components/N8nCallout/Callout.vue @@ -23,6 +23,7 @@ interface CalloutProps { iconless?: boolean; slim?: boolean; roundCorners?: boolean; + onlyBottomBorder?: boolean; } defineOptions({ name: 'N8nCallout' }); @@ -38,6 +39,7 @@ const classes = computed(() => [ $style[props.theme], props.slim ? $style.slim : '', props.roundCorners ? $style.round : '', + props.onlyBottomBorder ? $style.onlyBottomBorder : '', ]); const getIcon = computed( @@ -95,6 +97,12 @@ const getIconSize = computed(() => { border-radius: var(--border-radius-base); } +.onlyBottomBorder { + border-top: 0; + border-left: 0; + border-right: 0; +} + .messageSection { display: flex; align-items: center; diff --git a/packages/editor-ui/src/components/banners/BaseBanner.vue b/packages/editor-ui/src/components/banners/BaseBanner.vue index 32af54cec0d..bac58e74db1 100644 --- a/packages/editor-ui/src/components/banners/BaseBanner.vue +++ b/packages/editor-ui/src/components/banners/BaseBanner.vue @@ -39,6 +39,7 @@ async function onCloseClick() { icon-size="medium" :round-corners="false" :data-test-id="`banners-${props.name}`" + :only-bottom-border="true" >
@@ -78,10 +79,4 @@ async function onCloseClick() { align-items: center; gap: var(--spacing-l); } - -:global(.n8n-callout) { - border-top: 0; - border-left: 0; - border-right: 0; -} diff --git a/packages/editor-ui/src/components/banners/__snapshots__/V1Banner.test.ts.snap b/packages/editor-ui/src/components/banners/__snapshots__/V1Banner.test.ts.snap index 41daf105174..29665752de8 100644 --- a/packages/editor-ui/src/components/banners/__snapshots__/V1Banner.test.ts.snap +++ b/packages/editor-ui/src/components/banners/__snapshots__/V1Banner.test.ts.snap @@ -3,7 +3,7 @@ exports[`V1 Banner > should render banner 1`] = `