From 2d2818cdf8faffa96d90ca415de9a6846f5987f9 Mon Sep 17 00:00:00 2001 From: Daria Date: Wed, 2 Jul 2025 19:23:48 +0300 Subject: [PATCH] feat(editor): Implement execute step mechanism for focused panel (no-changelog) (#16891) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Charlie Kolb Co-authored-by: Milorad FIlipović --- .../frontend/@n8n/i18n/src/locales/en.json | 1 - .../editor-ui/src/components/FocusPanel.vue | 89 ++++++++++++------- .../src/components/NodeExecuteButton.vue | 10 +++ .../src/components/ParameterInput.vue | 3 +- .../src/components/ParameterInputList.vue | 4 +- .../src/composables/useNodeHelpers.ts | 6 -- .../editor-ui/src/stores/focusPanel.store.ts | 42 +++++++-- .../frontend/editor-ui/src/views/NodeView.vue | 2 +- 8 files changed, 106 insertions(+), 51 deletions(-) diff --git a/packages/frontend/@n8n/i18n/src/locales/en.json b/packages/frontend/@n8n/i18n/src/locales/en.json index 58ba833cc0..a20e49308b 100644 --- a/packages/frontend/@n8n/i18n/src/locales/en.json +++ b/packages/frontend/@n8n/i18n/src/locales/en.json @@ -1478,7 +1478,6 @@ "nodeView.couldntImportWorkflow": "Could not import workflow", "nodeView.couldntLoadWorkflow.invalidWorkflowObject": "Invalid workflow object", "nodeView.deletesTheCurrentExecutionData": "Deletes the current execution data", - "nodeView.focusPanel.executeButtonTooltip": "Execute AI Agent", "nodeView.focusPanel.title": "Focus", "nodeView.focusPanel.noParameters": "No parameters focused. Focus a parameter by clicking on the action dropdown in the node detail view.", "nodeView.itLooksLikeYouHaveBeenEditingSomething": "It looks like you made some edits. If you leave before saving, your changes will be lost.", diff --git a/packages/frontend/editor-ui/src/components/FocusPanel.vue b/packages/frontend/editor-ui/src/components/FocusPanel.vue index 6f54534325..eebf1d0e12 100644 --- a/packages/frontend/editor-ui/src/components/FocusPanel.vue +++ b/packages/frontend/editor-ui/src/components/FocusPanel.vue @@ -4,21 +4,44 @@ import { N8nText, N8nInput } from '@n8n/design-system'; import { computed } from 'vue'; import { useI18n } from '@n8n/i18n'; import { isValueExpression } from '@/utils/nodeTypesUtils'; +import { useNodeHelpers } from '@/composables/useNodeHelpers'; defineOptions({ name: 'FocusPanel' }); -const locale = useI18n(); +const props = defineProps<{ + executable: boolean; +}>(); +const locale = useI18n(); +const nodeHelpers = useNodeHelpers(); const focusPanelStore = useFocusPanelStore(); const focusedNodeParameter = computed(() => focusPanelStore.focusedNodeParameters[0]); +const resolvedParameter = computed(() => + focusedNodeParameter.value && focusPanelStore.isRichParameter(focusedNodeParameter.value) + ? focusedNodeParameter.value + : undefined, +); const focusPanelActive = computed(() => focusPanelStore.focusPanelActive); +const isExecutable = computed(() => { + if (!resolvedParameter.value) return false; + + const foreignCredentials = nodeHelpers.getForeignCredentialsIfSharingEnabled( + resolvedParameter.value.node.credentials, + ); + return nodeHelpers.isNodeExecutable( + resolvedParameter.value.node, + props.executable, + foreignCredentials, + ); +}); + const expressionModeEnabled = computed( () => - focusedNodeParameter.value && - isValueExpression(focusedNodeParameter.value.parameter, focusedNodeParameter.value.value), + resolvedParameter.value && + isValueExpression(resolvedParameter.value.parameter, resolvedParameter.value.value), ); function optionSelected() { @@ -28,10 +51,6 @@ function optionSelected() { function valueChanged() { // TODO: Update parameter value } - -function executeFocusedNode() { - // TODO: Implement execution of the focused node -}