From f9cba7fdc9d60bbb2eee6d4eeff3556daea3e2ef Mon Sep 17 00:00:00 2001 From: wujingjing <gersonwu@qq.com> Date: 星期四, 12 十二月 2024 16:35:25 +0800 Subject: [PATCH] feat(flow): 优化流程编辑功能 --- src/components/vue-flow/ui/nodes/OutputNode.vue | 39 +++++++++++++++++++++++++++++++++++---- 1 files changed, 35 insertions(+), 4 deletions(-) diff --git a/src/components/vue-flow/ui/nodes/OutputNode.vue b/src/components/vue-flow/ui/nodes/OutputNode.vue index 8c355f4..a62d7ec 100644 --- a/src/components/vue-flow/ui/nodes/OutputNode.vue +++ b/src/components/vue-flow/ui/nodes/OutputNode.vue @@ -52,7 +52,7 @@ <div class="flex-column gap-y-1.5 w-full"> <span class="self-start text-gray-500">{{ VueFlowHelper.getParams(outputParams, 'output_result').label }}</span> - <el-radio-group v-model="VueFlowHelper.getParams(outputParams, 'output_result').value.type"> + <el-radio-group v-model="VueFlowHelper.getParams(outputParams, 'output_result').value.type" @change="interactionTypeChange"> <el-radio v-for="item in Object.keys(interactionTypeMap)" :key="item" :value="item">{{ interactionTypeMap[item] }}</el-radio> @@ -71,7 +71,7 @@ > <div class="flex-column gap-2"> <div - class="text-gray-400 cursor-not-allowed border border-solid rounded-lg border-gray-300 py-3 pl-3 pr-2 items-center justify-between flex group/option relative" + class="text-gray-400 cursor-not-allowed border border-solid rounded-lg border-gray-300 py-3 pl-3 pr-2 items-center justify-between flex group/option relative mr-6" :key="item.id" v-for="(item, index) in VueFlowHelper.getParams(outputParams, 'output_result').options" > @@ -80,6 +80,7 @@ @click="delOption(index)" class="cursor-pointer group-hover/option:visible invisible ywifont ywicon-shanchu text-red-500" ></span> + <Handle class="absolute !-right-4" :id="item.id" type="source" :position="Position.Right" /> </div> </div> @@ -92,7 +93,15 @@ </div> </div> </div> - <Handle v-if="VueFlowHelper.getParams(outputParams, 'output_result').value.type === InteractionType.Input ||VueFlowHelper.getParams(outputParams, 'output_result').value.type === InteractionType.None" :id="sourceHandleId" type="source" :position="Position.Right" /> + <Handle + v-if=" + VueFlowHelper.getParams(outputParams, 'output_result').value.type === InteractionType.Input || + VueFlowHelper.getParams(outputParams, 'output_result').value.type === InteractionType.None + " + :id="sourceHandleId" + type="source" + :position="Position.Right" + /> </div> <!-- <div> @@ -112,6 +121,7 @@ import { InteractionType, interactionTypeMap } from '../../vueFlowEnum'; import { LLMNodeData, LLMNodeEvents } from './index'; import { deepClone } from '/@/utils/other'; +import { remove } from 'nprogress'; defineProps<NodeProps<LLMNodeData, LLMNodeEvents>>(); const node = useNode(); @@ -124,7 +134,7 @@ const outputParams = ref(VueFlowHelper.getGroupParam(data.value, 0)); -const { removeNodes, nodes, addNodes } = useVueFlow(); +const { removeNodes, nodes, addNodes, removeEdges } = useVueFlow(); function handleClickDuplicateBtn() { const { type, position, data } = node.node; @@ -163,9 +173,30 @@ }); }; +const removeRelativeHandleEdge = (handleId: string) => { + const edges = node.connectedEdges.value.filter((item) => item.sourceHandle === handleId || item.targetHandle === handleId); + removeEdges(edges); +}; + const delOption = (index) => { const options = VueFlowHelper.getParams(outputParams.value, 'output_result').options; + const option = options[index]; + options.splice(index); + removeRelativeHandleEdge(option.id); +}; + +let preInteractionType = VueFlowHelper.getParams(outputParams.value, 'output_result').value.type; +const interactionTypeChange = (type) => { + removeRelativeHandleEdge(sourceHandleId.value); + if (preInteractionType === InteractionType.Select) { + const options = VueFlowHelper.getParams(outputParams.value, 'output_result').options; + for (const item of options) { + removeRelativeHandleEdge(item.id); + } + } + preInteractionType = type; + }; const isEditStatus = ref(false); -- Gitblit v1.9.3