diff --git a/packages/editor-ui/package.json b/packages/editor-ui/package.json index 41eda67006..0086e30ab3 100644 --- a/packages/editor-ui/package.json +++ b/packages/editor-ui/package.json @@ -43,6 +43,7 @@ "@jsplumb/util": "^5.13.2", "@lezer/common": "^1.0.4", "@n8n/chat": "workspace:*", + "@n8n/codemirror-lang": "workspace:*", "@n8n/codemirror-lang-sql": "^1.0.2", "@n8n/permissions": "workspace:*", "@vue-flow/background": "^1.3.0", @@ -55,7 +56,6 @@ "axios": "1.6.7", "chart.js": "^4.4.0", "codemirror-lang-html-n8n": "^1.0.0", - "@n8n/codemirror-lang": "workspace:*", "dateformat": "^3.0.3", "email-providers": "^2.0.1", "esprima-next": "5.8.4", diff --git a/packages/editor-ui/src/__tests__/data/canvas.ts b/packages/editor-ui/src/__tests__/data/canvas.ts index 75fc413547..58e497ef01 100644 --- a/packages/editor-ui/src/__tests__/data/canvas.ts +++ b/packages/editor-ui/src/__tests__/data/canvas.ts @@ -10,9 +10,17 @@ export function createCanvasNodeData({ inputs = [], outputs = [], connections = { input: {}, output: {} }, + execution = {}, + issues = { items: [], visible: false }, + pinnedData = { count: 0, visible: false }, + runData = { count: 0, visible: false }, renderType = 'default', }: Partial = {}): CanvasElementData { return { + execution, + issues, + pinnedData, + runData, id, type, typeVersion, diff --git a/packages/editor-ui/src/__tests__/mocks.ts b/packages/editor-ui/src/__tests__/mocks.ts index 08ca10de8a..5b7bac23af 100644 --- a/packages/editor-ui/src/__tests__/mocks.ts +++ b/packages/editor-ui/src/__tests__/mocks.ts @@ -9,6 +9,7 @@ import type { IWorkflowSettings, LoadedClass, INodeTypeDescription, + INodeIssues, } from 'n8n-workflow'; import { NodeHelpers, Workflow } from 'n8n-workflow'; import { uuid } from '@jsplumb/util'; @@ -23,6 +24,7 @@ import { NO_OP_NODE_TYPE, SET_NODE_TYPE, } from '@/constants'; +import type { INodeUi } from '@/Interface'; export const mockNode = ({ id = uuid(), @@ -30,22 +32,30 @@ export const mockNode = ({ type, position = [0, 0], disabled = false, + issues = undefined, + typeVersion = 1, }: { - id?: INode['id']; - name: INode['name']; - type: INode['type']; - position?: INode['position']; - disabled?: INode['disabled']; -}) => mock({ id, name, type, position, disabled }); + id?: INodeUi['id']; + name: INodeUi['name']; + type: INodeUi['type']; + position?: INodeUi['position']; + disabled?: INodeUi['disabled']; + issues?: INodeIssues; + typeVersion?: INodeUi['typeVersion']; +}) => mock({ id, name, type, position, disabled, issues, typeVersion }); export const mockNodeTypeDescription = ({ name, version = 1, credentials = [], + inputs = ['main'], + outputs = ['main'], }: { name: INodeTypeDescription['name']; version?: INodeTypeDescription['version']; credentials?: INodeTypeDescription['credentials']; + inputs?: INodeTypeDescription['inputs']; + outputs?: INodeTypeDescription['outputs']; }) => mock({ name, @@ -58,8 +68,8 @@ export const mockNodeTypeDescription = ({ properties: [], maxNodes: Infinity, group: EXECUTABLE_TRIGGER_NODE_TYPES.includes(name) ? ['trigger'] : [], - inputs: ['main'], - outputs: ['main'], + inputs, + outputs, credentials, documentationUrl: 'https://docs', webhooks: undefined, diff --git a/packages/editor-ui/src/components/canvas/Canvas.vue b/packages/editor-ui/src/components/canvas/Canvas.vue index 918cc8e669..b5f31db044 100644 --- a/packages/editor-ui/src/components/canvas/Canvas.vue +++ b/packages/editor-ui/src/components/canvas/Canvas.vue @@ -58,6 +58,10 @@ function onNodeDragStop(e: NodeDragEvent) { }); } +function onSelectionDragStop(e: NodeDragEvent) { + onNodeDragStop(e); +} + function onSetNodeActive(id: string) { emit('update:node:active', id); } @@ -121,6 +125,7 @@ function onClickPane(event: MouseEvent) { :max-zoom="2" data-test-id="canvas" @node-drag-stop="onNodeDragStop" + @selection-drag-stop="onSelectionDragStop" @edge-mouse-enter="onMouseEnterEdge" @edge-mouse-leave="onMouseLeaveEdge" @pane-click="onClickPane" @@ -156,8 +161,6 @@ function onClickPane(event: MouseEvent) { - - diff --git a/packages/editor-ui/src/components/canvas/elements/nodes/render-types/CanvasNodeConfiguration.spec.ts b/packages/editor-ui/src/components/canvas/elements/nodes/render-types/CanvasNodeConfiguration.spec.ts index 8770ef9ac6..92884d634f 100644 --- a/packages/editor-ui/src/components/canvas/elements/nodes/render-types/CanvasNodeConfiguration.spec.ts +++ b/packages/editor-ui/src/components/canvas/elements/nodes/render-types/CanvasNodeConfiguration.spec.ts @@ -1,9 +1,16 @@ import CanvasNodeConfiguration from '@/components/canvas/elements/nodes/render-types/CanvasNodeConfiguration.vue'; import { createComponentRenderer } from '@/__tests__/render'; import { createCanvasNodeProvide } from '@/__tests__/data'; +import { createTestingPinia } from '@pinia/testing'; +import { setActivePinia } from 'pinia'; const renderComponent = createComponentRenderer(CanvasNodeConfiguration); +beforeEach(() => { + const pinia = createTestingPinia(); + setActivePinia(pinia); +}); + describe('CanvasNodeConfiguration', () => { it('should render node correctly', () => { const { getByText } = renderComponent({ diff --git a/packages/editor-ui/src/components/canvas/elements/nodes/render-types/CanvasNodeConfiguration.vue b/packages/editor-ui/src/components/canvas/elements/nodes/render-types/CanvasNodeConfiguration.vue index 3f6f401fa2..de994dd74d 100644 --- a/packages/editor-ui/src/components/canvas/elements/nodes/render-types/CanvasNodeConfiguration.vue +++ b/packages/editor-ui/src/components/canvas/elements/nodes/render-types/CanvasNodeConfiguration.vue @@ -1,22 +1,20 @@ @@ -24,6 +22,7 @@ const classes = computed(() => {