wujingjing
2025-02-17 0f01c4bbce19fa8489a4e835c83cb9415549f681
src/components/vue-flow/MainCanvas.vue
@@ -1,15 +1,51 @@
<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 #node-start="startNodeProps">
            <StartNode ref="nodeRef" v-bind="startNodeProps" :isViewMode="isViewMode" />
         </template>
         <template #node-condition="conditionNodeProps">
            <ConditionNode ref="nodeRef" v-bind="conditionNodeProps" :isViewMode="isViewMode" />
         </template>
         <template #node-output_msg="outputNodeProps">
            <OutputNode ref="nodeRef" v-bind="outputNodeProps" :isViewMode="isViewMode" />
         </template>
         <template #node-end="endNodeProps">
            <EndNode ref="nodeRef" v-bind="endNodeProps" :isViewMode="isViewMode" />
         </template>
         <template #edge-custom="customEdgeProps">
            <CustomEdge v-bind="customEdgeProps" />
            <CustomEdge v-bind="customEdgeProps" :isViewMode="isViewMode" />
         </template>
         <template #node-agent="agentNodeProps">
            <AgentNode v-bind="agentNodeProps" :agentNames="agentNames" />
            <AgentNode ref="nodeRef" v-bind="agentNodeProps" :agentNames="agentNames" :isViewMode="isViewMode" />
         </template>
         <Controls />
         <template #node-func="funcNodeProps">
            <FuncNode ref="nodeRef" v-bind="funcNodeProps" :funcNames="funcNames" :isViewMode="isViewMode" />
         </template>
         <template #node-code="codeNodeProps">
            <CodeNode ref="nodeRef" v-bind="codeNodeProps" :isViewMode="isViewMode" />
         </template>
         <template #node-python_code="pythonCodeNodeProps">
            <PythonCodeNode ref="nodeRef" v-bind="pythonCodeNodeProps" :isViewMode="isViewMode" />
         </template>
         <template #node-text_resource="textResourceNodeProps">
            <TextResourceNode ref="nodeRef" v-bind="textResourceNodeProps" :isViewMode="isViewMode" />
         </template>
         <template #node-analysis="analysisNodeProps">
            <AnalysisNode ref="nodeRef" v-bind="analysisNodeProps" :llmInfoList="llmInfoList" :isViewMode="isViewMode" />
         </template>
         <template #node-LLM="llmNodeProps">
            <LLMNode ref="nodeRef" v-bind="llmNodeProps" :llmInfoList="llmInfoList" :isViewMode="isViewMode" />
         </template>
         <Controls :showInteractive="false" />
         <Background />
         <MiniMap pannable zoomable />
      </VueFlow>
   </div>
</template>
@@ -17,41 +53,48 @@
<script setup lang="ts">
import { Background } from '@vue-flow/background';
import { Controls } from '@vue-flow/controls';
import { Dimensions, Elements, useVueFlow, VueFlow, ConnectionMode, MarkerType } from '@vue-flow/core';
import { markRaw, nextTick, ref, watch } from 'vue';
import { MiniMap } from '@vue-flow/minimap';
import type { Dimensions, Elements, FlowProps } from '@vue-flow/core';
import { ConnectionMode, MarkerType, useVueFlow, VueFlow } from '@vue-flow/core';
import { nextTick, onMounted, 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 CustomEdge from './ui/edges/CustomEdge.vue';
import AgentNode from './ui/nodes/AgentNode.vue';
import AnalysisNode from './ui/nodes/AnalysisNode.vue';
import CodeNode from './ui/nodes/CodeNode.vue';
import ConditionNode from './ui/nodes/ConditionNode.vue';
import EndNode from './ui/nodes/EndNode.vue';
import FuncNode from './ui/nodes/FuncNode.vue';
import LLMNode from './ui/nodes/LLMNode.vue';
import OutputNode from './ui/nodes/OutputNode.vue';
import AgentNode from './ui/nodes/AgentNode.vue';
import PythonCodeNode from './ui/nodes/PythonCodeNode.vue';
import StartNode from './ui/nodes/StartNode.vue';
import TextResourceNode from './ui/nodes/TextResourceNode.vue';
import { NodeType, nodeTypeMap } from './vueFlowEnum';
import { VueFlowHelper } from './VueFlowHelper';
import CustomEdge from './ui/edges/CustomEdge.vue';
import { onMounted } from 'vue';
const props = defineProps(['flowJson', 'agentNames', 'funcNames', 'llmInfoList', 'isViewMode']);
const props = defineProps(['flowJson', 'agentNames']);
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 nodeTypes = {};
const elements = ref<Elements>();
const { findNode, nodes, addNodes, addEdges, project, vueFlowRef, onConnect, setNodes, setEdges, setViewport, fitView } = useVueFlow(
const {
   findNode,
   nodes,
   addNodes,
   addEdges,
   project,
   vueFlowRef,
   onConnect,
   setNodes,
   setEdges,
   setViewport,
   fitView,
   setInteractive,
} = useVueFlow(
   Object.keys(props.flowJson).length > 0
      ? props.flowJson
      : {
      : ({
            nodes: [
               {
                  id: '1',
@@ -62,7 +105,7 @@
               },
            ],
            edges: [],
        }
        } as FlowProps)
);
onConnect((params) => {
@@ -83,10 +126,14 @@
   // addEdges());
});
const initFlowStatus = () => {
   fitView();
   setInteractive(!props.isViewMode);
};
onMounted(() => {
   setTimeout(() => {
      fitView();
      initFlowStatus();
   }, 30);
});
@@ -142,19 +189,37 @@
      event.dataTransfer.dropEffect = 'move';
   }
}
const nodeRef = ref();
const validateForm = () => {
   // nodeRef.value.validateForm();
   console.log('🚀 ~ nodeRef.value:', nodeRef.value);
};
defineExpose({
   validateForm,
});
</script>
<style lang="scss">
@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: 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>