From 0f01c4bbce19fa8489a4e835c83cb9415549f681 Mon Sep 17 00:00:00 2001
From: wujingjing <gersonwu@qq.com>
Date: 星期一, 17 二月 2025 17:54:22 +0800
Subject: [PATCH] 表单校验

---
 src/components/vue-flow/ui/nodes/LLMNode.vue |  136 ++++++++++++++++++++++++++++++--------------
 1 files changed, 92 insertions(+), 44 deletions(-)

diff --git a/src/components/vue-flow/ui/nodes/LLMNode.vue b/src/components/vue-flow/ui/nodes/LLMNode.vue
index f114e2d..0c0e258 100644
--- a/src/components/vue-flow/ui/nodes/LLMNode.vue
+++ b/src/components/vue-flow/ui/nodes/LLMNode.vue
@@ -3,71 +3,119 @@
 		v-model:title="data.title"
 		:type="NodeType.LLM"
 		:description="VueFlowHelper.getConfigValue(data, 'description', '璋冪敤澶фā鍨嬪洖绛旂敤鎴烽棶棰樻垨鑰呭鐞嗕换鍔°��')"
+		:isViewMode="isViewMode"
 	>
 		<Handle :id="targetHandleId" type="target" :position="Position.Left" />
-		<FieldLayout :title="outputParam.name">
-			<el-input  class="w-full flex-0" v-model="outputParam.params[0].value" placeholder="杈撳嚭鍙傛暟鍚�"> </el-input>
-		</FieldLayout>
-		<FieldLayout :title="VueFlowHelper.getConfigValue(modelSetting, 'name', '妯″瀷璁剧疆')">
-			<div class="w-[340px] flex-items-center gap-x-2">
-				<div class="flex-column gap-y-1.5">
-					<span class="text-gray-500">{{ VueFlowHelper.getParams(modelSetting, 'llm_model').label }}</span>
+		<el-form :model="data" :rules="formRules" label-position="right" label-width="60px" status-icon>
+			<FieldLayout :title="VueFlowHelper.getConfigValue(modelSetting, 'name', '妯″瀷璁剧疆')">
+				<div class="w-full flex-items-center gap-x-2">
+					<div class="flex-column gap-y-1.5">
+						<el-form-item
+							labelPosition="top"
+							:label="VueFlowHelper.getParams(modelSetting, 'llm_model').label"
+							prop="group_params.0.params.0.value"
+						>
+							<el-tree-select
+								v-model="VueFlowHelper.getParams(modelSetting, 'llm_model').value"
+								:data="llmInfoList"
+								:props="{ label: 'name', value: 'id' }"
+								:render-after-expand="false"
+								:check-strictly="false"
+								:show-checkbox="false"
+								:accordion="true"
+								:disabled="isViewMode"
+								filterable
+								clearable
+								:placeholder="VueFlowHelper.getParams(modelSetting, 'llm_model').placeholder"
+							/>
+						</el-form-item>
+					</div>
+					<div class="flex-column gap-y-1.5">
+						<el-form-item
+							labelPosition="top"
+							:label="VueFlowHelper.getParams(modelSetting, 'temperature').label"
+							prop="group_params.0.params.1.value"
+						>
+							<el-input-number
+								class="w-full"
+								controls-position="right"
+								v-model="VueFlowHelper.getParams(modelSetting, 'temperature').value"
+								:readonly="isViewMode"
+								placeholder=""
+							></el-input-number>
+						</el-form-item>
+					</div>
+				</div>
+			</FieldLayout>
+			<FieldLayout :title="prompt.name">
+				<CodeEditor
+					:title="prompt.name"
+					class="nowheel"
+					v-model:editValue="VueFlowHelper.getParams(prompt, 'prompt').value"
+					:maxHeight="180"
+					:disabled="isViewMode"
+				/>
+			</FieldLayout>
+			<FieldLayout :title="outputParam.name" >
+				<el-form-item labelWidth="0" prop="group_params.2.params.0.value">
+					<el-input
+						class="w-full flex-0"
+						v-model="outputParam.params[0].value"
+						placeholder="杈撳嚭鍙傛暟鍚�"
+						:readonly="isViewMode"
+					></el-input>
+				</el-form-item>
+			</FieldLayout>
+		</el-form>
 
-					<el-select
-						v-model="VueFlowHelper.getParams(modelSetting, 'llm_model').value"
-						class="w-[150px]"
-						:placeholder="VueFlowHelper.getParams(modelSetting, 'llm_model').placeholder"
-					>
-						<el-option v-for="item in VueFlowConstant.LLM_MODEL_LIST" :key="item.value" :label="item.label" :value="item.value" />
-					</el-select>
-				</div>
-				<div class="flex-column gap-y-1.5">
-					<span class="text-gray-500">{{ VueFlowHelper.getParams(modelSetting, 'temperature').label }}</span>
-					<el-input-number
-						v-model="VueFlowHelper.getParams(modelSetting, 'temperature').value"
-						class="w-[180px]"
-						placeholder=""
-					></el-input-number>
-				</div>
-			</div>
-		</FieldLayout>
-		<FieldLayout :title="prompt.name">
-			<el-input
-				class="nowheel"
-				v-model="VueFlowHelper.getParams(prompt, 'prompt').value"
-				type="textarea"
-				:autosize="{ minRows: 3, maxRows: 6 }"
-				autocomplete="off"
-			>
-			</el-input>
-		</FieldLayout>
 		<Handle :id="sourceHandleId" type="source" :position="Position.Right" />
 	</NodeBasicLayout>
 </template>
 
-<script lang="ts" setup>
-import { Handle, Position, useNode, useVueFlow } from '@vue-flow/core';
-import { ref } from 'vue';
-
+<script setup lang="ts">
 import type { NodeProps } from '@vue-flow/core';
-import { VueFlowConstant } from '../../VueFlowConstant';
+import { Handle, Position, useNode } from '@vue-flow/core';
+import { ref } from 'vue';
 import { VueFlowHelper } from '../../VueFlowHelper';
-import type { LLMNodeData, LLMNodeEvents } from './index';
-import { deepClone } from '/@/utils/other';
 import { NodeType } from '../../vueFlowEnum';
-
 import FieldLayout from './components/FieldLayout.vue';
 import NodeBasicLayout from './components/NodeBasicLayout.vue';
+import type { LLMNodeData, LLMNodeEvents } from './index';
+import CodeEditor from '/@/components/input/codeEditor/index.vue';
 
-defineProps<NodeProps<LLMNodeData, LLMNodeEvents>>();
+defineProps<
+	NodeProps<LLMNodeData, LLMNodeEvents> & {
+		isViewMode?: boolean;
+		llmInfoList: any[];
+	}
+>();
 
 const node = useNode();
 const sourceHandleId = ref(VueFlowHelper.getHandleId(node.node, 'source'));
 const targetHandleId = ref(VueFlowHelper.getHandleId(node.node, 'target'));
 
 const data = ref(node.node.data);
+console.log('馃殌 ~ data.value:', data.value);
 const modelSetting = ref(VueFlowHelper.getGroupParam(data.value, 0));
 const prompt = ref(VueFlowHelper.getGroupParam(data.value, 1));
 const outputParam = ref(VueFlowHelper.getGroupParam(data.value, 2));
 VueFlowHelper.getConfigValue(VueFlowHelper.getParams(prompt.value, 'prompt'), 'label', '');
+
+const formRules = ref({
+	'group_params.0.params.0.value': [{ required: true, message: '璇烽�夋嫨妯″瀷', trigger: 'change' }],
+	// 'group_params.0.params.1.value': [{ required: true, message: '璇疯緭鍏ユ俯搴�', trigger: 'blur' }],
+	// 'group_params.2.params.0.value': [{ required: true, message: '璇疯緭鍏ヨ緭鍑哄弬鏁板悕', trigger: 'blur' }],
+});
+
+const formRef = ref();
+const validateForm = async () => {
+	const valid = await formRef.value.validate();
+	if (valid) {
+		console.log('submit!');
+	}
+};
+
+defineExpose({
+	validateForm,
+});
 </script>

--
Gitblit v1.9.3