From 3aeb622978a41136c38ce00d4b38153f271efbe1 Mon Sep 17 00:00:00 2001 From: Daria Date: Wed, 9 Jul 2025 14:40:39 +0300 Subject: [PATCH] feat(editor): Show the right editor in focus panel (#17062) Co-authored-by: Charlie Kolb --- .../frontend/@n8n/i18n/src/locales/en.json | 1 + .../CodeNodeEditor/CodeNodeEditor.vue | 10 +- .../ExpressionEditorModalInput.vue | 3 +- .../editor-ui/src/components/FocusPanel.vue | 291 ++++++++++++++++-- .../src/components/ParameterInputList.vue | 189 ++---------- .../src/composables/useCodeEditor.ts | 2 +- .../src/composables/useExpressionEditor.ts | 6 +- .../composables/useNodeSettingsParameters.ts | 123 +++++++- .../completions/dollar.completions.ts | 26 +- .../plugins/codemirror/completions/utils.ts | 6 +- .../typescript/client/completions.ts | 5 +- .../typescript/client/useTypescript.ts | 4 +- .../editor-ui/src/utils/nodeSettingsUtils.ts | 16 + .../frontend/editor-ui/src/views/NodeView.vue | 2 +- 14 files changed, 464 insertions(+), 220 deletions(-) diff --git a/packages/frontend/@n8n/i18n/src/locales/en.json b/packages/frontend/@n8n/i18n/src/locales/en.json index 8379ece5c3..588a68dc71 100644 --- a/packages/frontend/@n8n/i18n/src/locales/en.json +++ b/packages/frontend/@n8n/i18n/src/locales/en.json @@ -1497,6 +1497,7 @@ "nodeView.deletesTheCurrentExecutionData": "Deletes the current execution data", "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.focusPanel.missingParameter": "This parameter is no longer visible on the node. A related parameter was likely changed, removing this one.", "nodeView.itLooksLikeYouHaveBeenEditingSomething": "It looks like you made some edits. If you leave before saving, your changes will be lost.", "nodeView.loadingTemplate": "Loading template", "nodeView.moreInfo": "More info", diff --git a/packages/frontend/editor-ui/src/components/CodeNodeEditor/CodeNodeEditor.vue b/packages/frontend/editor-ui/src/components/CodeNodeEditor/CodeNodeEditor.vue index fa8369fa8d..a03cf7f558 100644 --- a/packages/frontend/editor-ui/src/components/CodeNodeEditor/CodeNodeEditor.vue +++ b/packages/frontend/editor-ui/src/components/CodeNodeEditor/CodeNodeEditor.vue @@ -19,6 +19,7 @@ import { CODE_PLACEHOLDERS } from './constants'; import { useLinter } from './linter'; import { useSettingsStore } from '@/stores/settings.store'; import { dropInCodeEditor } from '@/plugins/codemirror/dragAndDrop'; +import type { TargetNodeParameterContext } from '@/Interface'; type Props = { mode: CodeExecutionMode; @@ -29,6 +30,8 @@ type Props = { isReadOnly?: boolean; rows?: number; id?: string; + targetNodeParameterContext?: TargetNodeParameterContext; + disableAskAi?: boolean; }; const props = withDefaults(defineProps(), { @@ -38,6 +41,8 @@ const props = withDefaults(defineProps(), { isReadOnly: false, rows: 4, id: () => crypto.randomUUID(), + targetNodeParameterContext: undefined, + disableAskAi: false, }); const emit = defineEmits<{ 'update:modelValue': [value: string]; @@ -81,6 +86,7 @@ const { highlightLine, readEditorValue, editor } = useCodeEditor({ rows: props.rows, }, onChange: onEditorUpdate, + targetNodeParameterContext: () => props.targetNodeParameterContext, }); onMounted(() => { @@ -98,7 +104,9 @@ onBeforeUnmount(() => { }); const askAiEnabled = computed(() => { - return settingsStore.isAskAiEnabled && props.language === 'javaScript'; + return ( + props.disableAskAi !== true && settingsStore.isAskAiEnabled && props.language === 'javaScript' + ); }); watch([() => props.language, () => props.mode], (_, [prevLanguage, prevMode]) => { diff --git a/packages/frontend/editor-ui/src/components/ExpressionEditorModal/ExpressionEditorModalInput.vue b/packages/frontend/editor-ui/src/components/ExpressionEditorModal/ExpressionEditorModalInput.vue index 9d01a1cc5e..8f32c9d107 100644 --- a/packages/frontend/editor-ui/src/components/ExpressionEditorModal/ExpressionEditorModalInput.vue +++ b/packages/frontend/editor-ui/src/components/ExpressionEditorModal/ExpressionEditorModalInput.vue @@ -26,6 +26,7 @@ type Props = { const props = withDefaults(defineProps(), { isReadOnly: false, + targetNodeParameterContext: undefined, }); const emit = defineEmits<{ @@ -85,7 +86,7 @@ onMounted(() => { focus(); }); -defineExpose({ editor }); +defineExpose({ editor, focus });