feat(editor): Make focused node props editable (no-changelog) (#16942)

Co-authored-by: Milorad FIlipović <milorad@n8n.io>
This commit is contained in:
Daria
2025-07-03 16:04:00 +03:00
committed by GitHub
parent cfe3699782
commit 827fb6963d

View File

@@ -1,10 +1,12 @@
<script setup lang="ts"> <script setup lang="ts">
import { useFocusPanelStore } from '@/stores/focusPanel.store'; import { useFocusPanelStore } from '@/stores/focusPanel.store';
import { useNodeTypesStore } from '@/stores/nodeTypes.store';
import { N8nText, N8nInput } from '@n8n/design-system'; import { N8nText, N8nInput } from '@n8n/design-system';
import { computed } from 'vue'; import { computed } from 'vue';
import { useI18n } from '@n8n/i18n'; import { useI18n } from '@n8n/i18n';
import { isValueExpression } from '@/utils/nodeTypesUtils'; import { isValueExpression } from '@/utils/nodeTypesUtils';
import { useNodeHelpers } from '@/composables/useNodeHelpers'; import { useNodeHelpers } from '@/composables/useNodeHelpers';
import { useNodeSettingsParameters } from '@/composables/useNodeSettingsParameters';
defineOptions({ name: 'FocusPanel' }); defineOptions({ name: 'FocusPanel' });
@@ -15,6 +17,8 @@ const props = defineProps<{
const locale = useI18n(); const locale = useI18n();
const nodeHelpers = useNodeHelpers(); const nodeHelpers = useNodeHelpers();
const focusPanelStore = useFocusPanelStore(); const focusPanelStore = useFocusPanelStore();
const nodeTypesStore = useNodeTypesStore();
const nodeSettingsParameters = useNodeSettingsParameters();
const focusedNodeParameter = computed(() => focusPanelStore.focusedNodeParameters[0]); const focusedNodeParameter = computed(() => focusPanelStore.focusedNodeParameters[0]);
const resolvedParameter = computed(() => const resolvedParameter = computed(() =>
@@ -38,6 +42,10 @@ const isExecutable = computed(() => {
); );
}); });
const isToolNode = computed(() =>
resolvedParameter.value ? nodeTypesStore.isToolNode(resolvedParameter.value?.node.type) : false,
);
const expressionModeEnabled = computed( const expressionModeEnabled = computed(
() => () =>
resolvedParameter.value && resolvedParameter.value &&
@@ -48,13 +56,22 @@ function optionSelected() {
// TODO: Handle the option selected (command: string) from the dropdown // TODO: Handle the option selected (command: string) from the dropdown
} }
function valueChanged() { function valueChanged(value: string) {
// TODO: Update parameter value if (resolvedParameter.value === undefined) {
return;
}
nodeSettingsParameters.updateNodeParameter(
{ value, name: resolvedParameter.value.parameterPath as `parameters.${string}` },
value,
resolvedParameter.value.node,
isToolNode.value,
);
} }
</script> </script>
<template> <template>
<div v-if="focusPanelActive" :class="$style.container"> <div v-if="focusPanelActive" :class="$style.container" @keydown.stop>
<div :class="$style.header"> <div :class="$style.header">
<N8nText size="small" :bold="true"> <N8nText size="small" :bold="true">
{{ locale.baseText('nodeView.focusPanel.title') }} {{ locale.baseText('nodeView.focusPanel.title') }}
@@ -105,14 +122,15 @@ function valueChanged() {
nodeName: resolvedParameter.node.name, nodeName: resolvedParameter.node.name,
parameterPath: resolvedParameter.parameterPath, parameterPath: resolvedParameter.parameterPath,
}" }"
@change="valueChanged" @change="valueChanged($event.value)"
/> />
<N8nInput <N8nInput
v-else v-else
v-model="resolvedParameter.value" :model-value="resolvedParameter.value"
:class="$style.editor" :class="$style.editor"
type="textarea" type="textarea"
resize="none" resize="none"
@update:model-value="valueChanged($event)"
></N8nInput> ></N8nInput>
</div> </div>
</div> </div>