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 -}