From 890adec7fddfe9d5f5da4511343ac6e8341d46b3 Mon Sep 17 00:00:00 2001
From: wujingjing <gersonwu@qq.com>
Date: 星期一, 16 十二月 2024 10:34:41 +0800
Subject: [PATCH] 可改变大小

---
 src/components/vue-flow/MainCanvas.vue |  116 ++++++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 85 insertions(+), 31 deletions(-)

diff --git a/src/components/vue-flow/MainCanvas.vue b/src/components/vue-flow/MainCanvas.vue
index b02e2ab..db9aabb 100644
--- a/src/components/vue-flow/MainCanvas.vue
+++ b/src/components/vue-flow/MainCanvas.vue
@@ -1,8 +1,19 @@
 <template>
 	<div class="relative h-full w-full" id="main-canvas" @drop="handleOnDrop" @dragover="handleOnDragOver">
-		<VueFlow v-model="elements" :node-types="nodeTypes" :connection-mode="ConnectionMode.Loose">
+		<VueFlow v-model="elements" :node-types="nodeTypes" :connection-mode="ConnectionMode.Strict">
+			<template #edge-custom="customEdgeProps">
+				<CustomEdge v-bind="customEdgeProps" />
+			</template>
+
+			<template #node-agent="agentNodeProps">
+				<AgentNode v-bind="agentNodeProps" :agentNames="agentNames" />
+			</template>
+			<template #node-func="funcNodeProps">
+				<FuncNode v-bind="funcNodeProps" :funcNames="funcNames" />
+			</template>
 			<Controls />
 			<Background />
+			<MiniMap pannable zoomable />
 		</VueFlow>
 	</div>
 </template>
@@ -10,50 +21,82 @@
 <script setup lang="ts">
 import { Background } from '@vue-flow/background';
 import { Controls } from '@vue-flow/controls';
-import { Dimensions, Elements, useVueFlow, VueFlow,ConnectionMode } from '@vue-flow/core';
+import { MiniMap } from '@vue-flow/minimap';
+
+import { Dimensions, Elements, useVueFlow, VueFlow, ConnectionMode, MarkerType } from '@vue-flow/core';
 import { markRaw, nextTick, ref, watch } from 'vue';
 import { Test_data } from './testData';
 import StartNode from './ui/nodes/StartNode.vue';
 import EndNode from './ui/nodes/EndNode.vue';
 import { VueFlowHelper } from './VueFlowHelper';
 import { NodeType, nodeTypeMap } from './vueFlowEnum';
+import ConditionNode from './ui/nodes/ConditionNode.vue';
+import LLMNode from './ui/nodes/LLMNode.vue';
+import OutputNode from './ui/nodes/OutputNode.vue';
+import AgentNode from './ui/nodes/AgentNode.vue';
+import FuncNode from './ui/nodes/FuncNode.vue';
+
+import CustomEdge from './ui/edges/CustomEdge.vue';
+import { onMounted } from 'vue';
+
+const props = defineProps(['flowJson', 'agentNames', 'funcNames']);
+
 const nodeTypes = {
 	start: markRaw(StartNode),
 	end: markRaw(EndNode),
+	condition: markRaw(ConditionNode),
+	LLM: markRaw(LLMNode),
+	// output:markRaw(OutputNode),
+	// agent: markRaw(AgentNode),
+	[NodeType.Output]: markRaw(OutputNode),
 	// LLM: markRaw(LLMNode),
 	// code: markRaw(CodeNode),
 	// knowledge: markRaw(KnowledgeNode),
 	// api: markRaw(ApiNode),
 };
 const elements = ref<Elements>();
-const { findNode, nodes, addNodes, addEdges, project, vueFlowRef, onConnect, setNodes, setEdges, setViewport } = useVueFlow({
-	nodes: [
-		{
-			id: '1',
-			type: 'start',
-			data: {
-				title: '寮�濮�',
-			},
+const { findNode, nodes, addNodes, addEdges, project, vueFlowRef, onConnect, setNodes, setEdges, setViewport, fitView } = useVueFlow(
+	Object.keys(props.flowJson).length > 0
+		? props.flowJson
+		: {
+				nodes: [
+					{
+						id: '1',
+						type: 'start',
+						data: VueFlowHelper.getDefaultData(NodeType.Start),
 
-			position: { x: 25, y: 400 },
+						position: { x: 25, y: 400 },
+					},
+				],
+				edges: [],
+		  }
+);
+
+onConnect((params) => {
+	addEdges({
+		id: VueFlowHelper.genGeometryId(),
+
+		source: params.source,
+		target: params.target,
+		sourceHandle: params.sourceHandle,
+		targetHandle: params.targetHandle,
+		type: 'custom',
+		markerEnd: {
+			type: MarkerType.ArrowClosed,
+			width: 40,
+			height: 70,
 		},
-		{
-			id: '2',
-			type: 'end',
-			data: {
-				title: '缁撴潫',
-			},
-			position: { x: 1000, y: 400 },
-		},
-	],
-	edges: [
-		// {
-		// 	id: 'test',
-		// 	source: '1',
-		// 	target: '2',
-		// },
-	],
+	});
+
+	// addEdges());
 });
+
+onMounted(() => {
+	setTimeout(() => {
+		fitView();
+	}, 30);
+});
+
 function handleOnDrop(event: DragEvent) {
 	const type = event.dataTransfer?.getData('application/vueflow') as NodeType;
 	if (type === 'workflow') {
@@ -73,7 +116,7 @@
 	});
 
 	const newNode = {
-		id: (nodes.value.length + 1).toString(),
+		id: VueFlowHelper.genGeometryId(),
 		type,
 		position,
 		label: nodeTypeMap[type],
@@ -111,13 +154,24 @@
 @import '@vue-flow/core/dist/style.css';
 @import '@vue-flow/core/dist/theme-default.css';
 @import '@vue-flow/controls/dist/style.css';
+@import '@vue-flow/minimap/dist/style.css';
+@import '@vue-flow/node-resizer/dist/style.css';
 
 #main-canvas {
 	--vf-handle: #2563eb;
-
+	--handle-size: 13px;
+	--resize-handle-size:8px;
 	.vue-flow__handle {
-		width: 18px;
-		height: 18px;
+		width: var(--handle-size);
+		height: var(--handle-size);
+	}
+
+	.vue-flow__resize-control.handle {
+		width: var(--resize-handle-size);
+		height: var(--resize-handle-size);
+		// visibility: hidden;
 	}
 }
 </style>
+
+<style lang="scss" scoped></style>

--
Gitblit v1.9.3