From 20e331c8678c8d49d0ab7ef416add4936e5e6d98 Mon Sep 17 00:00:00 2001 From: Konstantin Tieber <46342664+konstantintieber@users.noreply.github.com> Date: Tue, 11 Aug 2026 09:53:26 +0200 Subject: [PATCH] feat(core): Hide feature request link for nodes in canvas-only mode (no-changelog) (#35998) --- .../settings/components/NodeSettings.test.ts | 28 ++++++++++++++++++- .../ndv/settings/components/NodeSettings.vue | 8 ++++-- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/packages/frontend/editor-ui/src/features/ndv/settings/components/NodeSettings.test.ts b/packages/frontend/editor-ui/src/features/ndv/settings/components/NodeSettings.test.ts index b13f2446384..ba1ed698a2a 100644 --- a/packages/frontend/editor-ui/src/features/ndv/settings/components/NodeSettings.test.ts +++ b/packages/frontend/editor-ui/src/features/ndv/settings/components/NodeSettings.test.ts @@ -14,6 +14,7 @@ import { NdvAgentConfigKey } from '@/features/ndv/agents/composables/useNdvAgent import type { UseNdvAgentConfigReturn } from '@/features/ndv/agents/composables/useNdvAgentConfig'; import { useNDVStore } from '@/features/ndv/shared/ndv.store'; import { useNodeTypesStore } from '@/app/stores/nodeTypes.store'; +import { useSettingsStore } from '@n8n/stores/settings.store'; import { useWorkflowsStore } from '@/app/stores/workflows.store'; import { createWorkflowDocumentId, @@ -110,16 +111,26 @@ interface RenderOptions { nodeType?: INodeTypeDescription; provide?: Record; stubs?: Record; + canvasOnly?: boolean; } const renderNodeSettings = (options: RenderOptions = {}) => { - const { runData, node = httpNode, nodeType = httpNodeType, provide = {}, stubs = {} } = options; + const { + runData, + node = httpNode, + nodeType = httpNodeType, + provide = {}, + stubs = {}, + canvasOnly = false, + } = options; const pinia = createTestingPinia({ stubActions: false }); setActivePinia(pinia); const workflow = createTestWorkflow({ nodes: [node], connections: {} }); const workflowsStore = useWorkflowsStore(); const nodeTypesStore = useNodeTypesStore(); + const settingsStore = useSettingsStore(); + settingsStore.settings = { ...settingsStore.settings, canvasOnly }; workflowsStore.setWorkflowId(workflow.id); const ndvStore = useNDVStore(createWorkflowDocumentId(workflow.id)); const workflowDocumentStore = useWorkflowDocumentStore(createWorkflowDocumentId(workflow.id)); @@ -231,6 +242,21 @@ describe('NodeSettings', () => { }); }); + describe('feature request link', () => { + it('renders the feature request link by default', async () => { + const { findByTestId } = renderNodeSettings({}); + + expect(await findByTestId('node-feature-request')).toBeInTheDocument(); + }); + + it('hides the feature request link when in canvas-only mode', async () => { + const { findByTestId, queryByTestId } = renderNodeSettings({ canvasOnly: true }); + + await findByTestId('tab-params'); + expect(queryByTestId('node-feature-request')).not.toBeInTheDocument(); + }); + }); + describe('AI Agent node surfaces', () => { // The children are stubbed, so NodeSettings only checks the facade's // presence + mode. A missing `mode` resolves to referenced. diff --git a/packages/frontend/editor-ui/src/features/ndv/settings/components/NodeSettings.vue b/packages/frontend/editor-ui/src/features/ndv/settings/components/NodeSettings.vue index 5dc2142bdf4..6ee9a88ca0d 100644 --- a/packages/frontend/editor-ui/src/features/ndv/settings/components/NodeSettings.vue +++ b/packages/frontend/editor-ui/src/features/ndv/settings/components/NodeSettings.vue @@ -305,7 +305,7 @@ const credentialOwnerName = computed(() => { }); const featureRequestUrl = computed(() => { - if (!nodeType.value) { + if (!nodeType.value || settingsStore.isCanvasOnly) { return ''; } return `${BASE_NODE_SURVEY_URL}${nodeType.value.name}`; @@ -845,7 +845,11 @@ function handleSelectAction(params: INodeParameters) { ({{ nodeVersionTag }}) -
+
{{ i18n.baseText('ndv.featureRequest') }}