From bdcd8e12b62ec5e049271a492fd2fd7e18c90490 Mon Sep 17 00:00:00 2001
From: wujingjing <gersonwu@qq.com>
Date: 星期四, 12 十二月 2024 10:06:28 +0800
Subject: [PATCH] refactor(ui): 优化节点标题编辑和输入框聚焦逻辑

---
 src/directive/customDirective.ts                   |   19 ++++++---
 src/components/vue-flow/ui/nodes/AgentNode.vue     |    2 
 src/components/vue-flow/ui/nodes/EndNode.vue       |    4 +-
 src/components/vue-flow/ui/nodes/OutputNode.vue    |    8 ++--
 src/components/vue-flow/ui/nodes/ConditionNode.vue |   17 ++------
 src/components/vue-flow/ui/nodes/LLMNode.vue       |    8 +--
 src/components/vue-flow/ui/nodes/StartNode.vue     |   16 ++-----
 7 files changed, 32 insertions(+), 42 deletions(-)

diff --git a/src/components/vue-flow/ui/nodes/AgentNode.vue b/src/components/vue-flow/ui/nodes/AgentNode.vue
index 6a1cc38..b2d1acf 100644
--- a/src/components/vue-flow/ui/nodes/AgentNode.vue
+++ b/src/components/vue-flow/ui/nodes/AgentNode.vue
@@ -30,7 +30,7 @@
 					<img src="/@/components/vue-flow/ui/assets/images/icon_Start.png" class="h-4 w-4" alt="Start icon" />
 					<div class="flex flex-col gap-y-1">
 						<p v-if="!titleIsEdit" class="text-xl font-bold text-gray-500" @click="titleIsEdit = true">{{ data.title }}</p>
-						<el-input  v-elInputFocus v-else v-model="data.title" @blur="() => (titleIsEdit = false)"></el-input>
+						<el-input v-elInputFocus="true" v-else v-model="data.title" @blur="() => (titleIsEdit = false)"></el-input>
 					</div>
 				</div>
 			</div>
diff --git a/src/components/vue-flow/ui/nodes/ConditionNode.vue b/src/components/vue-flow/ui/nodes/ConditionNode.vue
index 6ab028b..e37835d 100644
--- a/src/components/vue-flow/ui/nodes/ConditionNode.vue
+++ b/src/components/vue-flow/ui/nodes/ConditionNode.vue
@@ -30,7 +30,7 @@
 					<img src="/@/components/vue-flow/ui/assets/images/icon_Start.png" class="h-4 w-4" alt="Start icon" />
 					<div class="flex flex-col gap-y-1">
 						<p v-if="!titleIsEdit" class="text-xl font-bold text-gray-500" @click="titleIsEdit = true">{{ data.title }}</p>
-						<el-input  v-elInputFocus v-else v-model="data.title" @blur="() => (titleIsEdit = false)"></el-input>
+						<el-input v-elInputFocus="true" v-else v-model="data.title" @blur="() => (titleIsEdit = false)"></el-input>
 					</div>
 				</div>
 			</div>
@@ -59,14 +59,7 @@
 
 					<div class="flex-column gap-y-2">
 						<div v-for="(subItem, subIndex) in item.conditions" class="ml-5 flex-items-center gap-x-2 group/conditionItem">
-							<el-input
-								filterable
-								class="w-[120px] flex-0"
-								v-model="subItem.left_value"
-								
-								placeholder="杈撳叆鍙橀噺"
-							>
-							</el-input>
+							<el-input filterable class="w-[120px] flex-0" v-model="subItem.left_value" placeholder="杈撳叆鍙橀噺"> </el-input>
 							<el-select v-model="subItem.comparison_operation" class="flex-0 w-[120px]" placeholder="閫夋嫨鏉′欢">
 								<el-option
 									v-for="item in Object.keys(compareOperationMap)"
@@ -151,7 +144,7 @@
 import { computed } from 'vue';
 import { VueFlowConstant } from '../../VueFlowConstant';
 import { ConditionHelper, VueFlowHelper } from '../../VueFlowHelper';
-import { compareOperationMap, VarType, conditionOperatorMap, varTypeMap } from '../../vueFlowEnum';
+import { VarType, compareOperationMap, conditionOperatorMap, varTypeMap } from '../../vueFlowEnum';
 import { LLMNodeData, LLMNodeEvents } from './index';
 import { deepClone } from '/@/utils/other';
 defineProps<NodeProps<LLMNodeData, LLMNodeEvents>>();
@@ -199,7 +192,7 @@
 			groupName: item?.data.title ?? item?.label,
 			options: [],
 		};
-        const varList = VueFlowHelper.getFieldValue(item.data,'var_list');
+		const varList = VueFlowHelper.getFieldValue(item.data, 'var_list');
 		if (varList) {
 			varList
 				.filter((item: any) => Boolean(item.name))
@@ -218,7 +211,7 @@
 });
 
 const data = ref(node.node.data);
-const conditionGroupList = ref(VueFlowHelper.getFieldValue(data.value,'condition'));
+const conditionGroupList = ref(VueFlowHelper.getFieldValue(data.value, 'condition'));
 const titleIsEdit = ref(false);
 
 function handleClickAddBtn() {
diff --git a/src/components/vue-flow/ui/nodes/EndNode.vue b/src/components/vue-flow/ui/nodes/EndNode.vue
index ab9ff1f..07fb440 100644
--- a/src/components/vue-flow/ui/nodes/EndNode.vue
+++ b/src/components/vue-flow/ui/nodes/EndNode.vue
@@ -31,7 +31,7 @@
 					<img src="/@/components/vue-flow/ui/assets/images/icon_End.png" class="h-4 w-4" alt="Start icon" />
 					<div class="flex flex-col gap-y-1">
 						<p v-if="!titleIsEdit" class="text-xl font-bold text-gray-500" @click="titleIsEdit = true">{{ data.title }}</p>
-						<el-input v-elInputFocus v-else v-model="data.title" @blur="() => (titleIsEdit = false)"></el-input>
+						<el-input v-elInputFocus="true" v-else v-model="data.title" @blur="() => (titleIsEdit = false)"></el-input>
 					</div>
 				</div>
 			</div>
@@ -51,9 +51,9 @@
 import { Handle, Position, useNode, useVueFlow } from '@vue-flow/core';
 import { computed, ref } from 'vue';
 import { VueFlowConstant } from '../../VueFlowConstant';
+import { VueFlowHelper } from '../../VueFlowHelper';
 import { LLMNodeData, LLMNodeEvents } from './index';
 import { deepClone } from '/@/utils/other';
-import { VueFlowHelper } from '../../VueFlowHelper';
 
 defineProps<NodeProps<LLMNodeData, LLMNodeEvents>>();
 
diff --git a/src/components/vue-flow/ui/nodes/LLMNode.vue b/src/components/vue-flow/ui/nodes/LLMNode.vue
index 2115202..2430ec9 100644
--- a/src/components/vue-flow/ui/nodes/LLMNode.vue
+++ b/src/components/vue-flow/ui/nodes/LLMNode.vue
@@ -30,7 +30,7 @@
 					<img src="/@/components/vue-flow/ui/assets/images/icon_Start.png" class="h-4 w-4" alt="Start icon" />
 					<div class="flex flex-col gap-y-1">
 						<p v-if="!titleIsEdit" class="text-xl font-bold text-gray-500" @click="titleIsEdit = true">{{ data.title }}</p>
-						<el-input v-else v-elInputFocus v-model="data.title" @blur="() => (titleIsEdit = false)"></el-input>
+						<el-input v-else v-elInputFocus="true" v-model="data.title" @blur="() => (titleIsEdit = false)"></el-input>
 					</div>
 				</div>
 			</div>
@@ -78,13 +78,11 @@
 
 <script lang="ts" setup>
 import { Handle, Position, useNode, useVueFlow } from '@vue-flow/core';
-import { ref, watchEffect } from 'vue';
+import { ref } from 'vue';
 
 import type { NodeProps } from '@vue-flow/core';
-import { computed } from 'vue';
 import { VueFlowConstant } from '../../VueFlowConstant';
 import { VueFlowHelper } from '../../VueFlowHelper';
-import { parameterTypeMap } from '../../vueFlowEnum';
 import { LLMNodeData, LLMNodeEvents } from './index';
 import { deepClone } from '/@/utils/other';
 
@@ -100,7 +98,7 @@
 const titleIsEdit = ref(false);
 
 const modelSetting = ref(VueFlowHelper.getGroupParam(data.value, 0));
-const prompt = ref(VueFlowHelper.getGroupParam(data.value,1));
+const prompt = ref(VueFlowHelper.getGroupParam(data.value, 1));
 
 const { removeNodes, nodes, addNodes } = useVueFlow();
 
diff --git a/src/components/vue-flow/ui/nodes/OutputNode.vue b/src/components/vue-flow/ui/nodes/OutputNode.vue
index 9c6cd7b..7aeacb5 100644
--- a/src/components/vue-flow/ui/nodes/OutputNode.vue
+++ b/src/components/vue-flow/ui/nodes/OutputNode.vue
@@ -30,7 +30,7 @@
 					<img src="/@/components/vue-flow/ui/assets/images/icon_Start.png" class="h-4 w-4" alt="Start icon" />
 					<div class="flex flex-col gap-y-1">
 						<p v-if="!titleIsEdit" class="text-xl font-bold text-gray-500" @click="titleIsEdit = true">{{ data.title }}</p>
-						<el-input v-elInputFocus v-else v-model="data.title" @blur="() => (titleIsEdit = false)"></el-input>
+						<el-input v-elInputFocus="true" v-else v-model="data.title" @blur="() => (titleIsEdit = false)"></el-input>
 					</div>
 				</div>
 			</div>
@@ -82,7 +82,7 @@
 								></span>
 							</div>
 						</div>
-						
+
 						<div v-if="isEditStatus" class="flex-items-center w-full">
 							<el-input class="flex-auto" v-model="tmpEditValue"></el-input>
 							<el-button class="flex-0 ml-2" type="success" @click="confirmClick">纭畾 </el-button>
@@ -107,11 +107,11 @@
 import { ref } from 'vue';
 
 import type { NodeProps } from '@vue-flow/core';
+import { nextTick } from 'vue';
 import { VueFlowHelper } from '../../VueFlowHelper';
+import { InteractionType, interactionTypeMap } from '../../vueFlowEnum';
 import { LLMNodeData, LLMNodeEvents } from './index';
 import { deepClone } from '/@/utils/other';
-import { InteractionType, interactionTypeMap } from '../../vueFlowEnum';
-import { nextTick } from 'vue';
 defineProps<NodeProps<LLMNodeData, LLMNodeEvents>>();
 
 const node = useNode();
diff --git a/src/components/vue-flow/ui/nodes/StartNode.vue b/src/components/vue-flow/ui/nodes/StartNode.vue
index 5f2e58a..a2b4094 100644
--- a/src/components/vue-flow/ui/nodes/StartNode.vue
+++ b/src/components/vue-flow/ui/nodes/StartNode.vue
@@ -29,7 +29,7 @@
 					<img src="/@/components/vue-flow/ui/assets/images/icon_Start.png" class="h-4 w-4" alt="Start icon" />
 					<div class="flex flex-col gap-y-1">
 						<p v-if="!titleIsEdit" class="text-xl font-bold text-gray-500" @click="titleIsEdit = true">{{ data.title }}</p>
-						<el-input v-elInputFocus v-else v-model="data.title" @blur="() => (titleIsEdit = false)"></el-input>
+						<el-input v-elInputFocus="true" v-else v-model="data.title" @blur="() => (titleIsEdit = false)"></el-input>
 					</div>
 				</div>
 			</div>
@@ -91,10 +91,9 @@
 
 <script lang="ts" setup>
 import { Handle, Position, useNode, useVueFlow } from '@vue-flow/core';
-import { ref, watchEffect } from 'vue';
+import { ref } from 'vue';
 
 import type { NodeProps } from '@vue-flow/core';
-import { computed } from 'vue';
 import { VueFlowConstant } from '../../VueFlowConstant';
 import { VueFlowHelper } from '../../VueFlowHelper';
 import { parameterTypeMap } from '../../vueFlowEnum';
@@ -108,19 +107,17 @@
 
 const data = ref(node.node.data);
 
-const getVarList = () =>{
+const getVarList = () => {
 	const varList = data.value[VueFlowConstant.GROUP_PARAMS_KEY][0][VueFlowConstant.PARAMS_KEY].find(
 		(item) => item.key === 'condition'
 	).value;
 	return varList;
-}
+};
 
-const varList = ref(VueFlowHelper.getFieldValue(data.value,'var_list'));
+const varList = ref(VueFlowHelper.getFieldValue(data.value, 'var_list'));
 const titleIsEdit = ref(false);
 
 function handleClickAddBtn() {
-
-
 	varList.value.push({
 		name: '',
 		description: '',
@@ -150,7 +147,4 @@
 const clickDeleteBtn = () => {
 	removeNodes(node.id);
 };
-
-
-
 </script>
diff --git a/src/directive/customDirective.ts b/src/directive/customDirective.ts
index 525793c..a62d939 100644
--- a/src/directive/customDirective.ts
+++ b/src/directive/customDirective.ts
@@ -1,4 +1,4 @@
-import type { App } from 'vue';
+import { nextTick, type App } from 'vue';
 const map = new WeakMap();
 const ob = new ResizeObserver((entries) => {
 	for (const entry of entries) {
@@ -203,13 +203,18 @@
 	});
 };
 
-
-
 export const eleFocusDirective = (app: App) => {
 	app.directive('elInputFocus', {
-		mounted: (el) => {
-			el.querySelector('input.el-input__inner')?.focus();
+		mounted: (el, binding: any) => {
+			const inputInner = el.querySelector('input.el-input__inner');
+			inputInner?.focus();
+			// 閫変腑 input 涓殑鎵�鏈夊唴瀹�
+			// 鍒ゆ柇鏄惁缁戝畾鍊兼湁瑕侀�変腑
+			if (binding.value) {
+				nextTick(() => {
+					inputInner?.select();
+				});
+			}
 		},
-		
 	});
-};
\ No newline at end of file
+};

--
Gitblit v1.9.3