node-add.vue 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. <template>
  2. <template v-if="port?.group === 'start'">
  3. <div class="port">
  4. <div/>
  5. </div>
  6. </template>
  7. <template v-else>
  8. <ElPopover placement="right" trigger="click">
  9. <template #reference>
  10. <div class="port">
  11. <ElTooltip
  12. placement="top"
  13. effect="light"
  14. content="<div><b>点击</b>添加节点</div><div><b>拖拽</b>连接节点</div>"
  15. raw-content
  16. >
  17. <div/>
  18. </ElTooltip>
  19. </div>
  20. </template>
  21. <div class="node-add">
  22. <div class="node-add-item __hover" @click="onAddNode(NodeType.Test)">{{ NodeTypeObj[NodeType.Test].title }}</div>
  23. <div class="node-add-item __hover" @click="onAddNode(NodeType.Answer)">{{ NodeTypeObj[NodeType.Answer].title }}</div>
  24. <div class="node-add-item __hover" @click="onAddNode(NodeType.IfElse)">{{ NodeTypeObj[NodeType.IfElse].title }}</div>
  25. </div>
  26. </ElPopover>
  27. </template>
  28. </template>
  29. <script setup lang="ts">
  30. import {getCurrentInstance, inject, reactive, ref} from "vue";
  31. import { ElPopover, ElTooltip } from 'element-plus';
  32. import {getNodeDefault} from "@/views/workflow/config";
  33. import {NodeType, NodeTypeObj} from "@/views/workflow/types";
  34. import {handleEdge, handleNode} from "@/views/workflow/handle";
  35. const emits = defineEmits([])
  36. const props = defineProps({
  37. port: <any>{},
  38. node: <any>{},
  39. graph: <any>{},
  40. })
  41. const {proxy}: any = getCurrentInstance()
  42. const state: any = reactive({})
  43. const onAddNode = (type) => {
  44. const node = getNodeDefault(type)
  45. const sons = props.graph.getSuccessors(props.node, {breadthFirst: true, deep: false, distance: 1}).filter(v => v.data.workflowData.edgeSource === props.port.id)
  46. const diff = 100
  47. let X = 0
  48. let Y = 0
  49. if (sons.length > 0) {
  50. sons.forEach(s => {
  51. const {x, y} = s.position()
  52. const {width, height} = s.size()
  53. X = Math.max(x, X)
  54. Y = Math.max(y + height, Y)
  55. })
  56. Y += diff
  57. } else {
  58. const {x, y} = props.node.position()
  59. const {width, height} = props.node.size()
  60. X = x + width + diff
  61. Y = y
  62. }
  63. node.x = X
  64. node.y = Y
  65. const edge = {
  66. target: node.id,
  67. source: props.port.args.nodeId,
  68. port: '',
  69. }
  70. if (props.port.args.type === 'more') {
  71. edge.port = props.port.id
  72. node.data.edgeSource = props.port.id
  73. } else {
  74. node.data.edgeSource = `${props.node.id}_end`
  75. }
  76. props.graph.startBatch('custom-batch-name')
  77. props.graph.addNode(handleNode(node))
  78. props.graph.addEdge(handleEdge(edge))
  79. setTimeout(() => {
  80. props.graph.stopBatch('custom-batch-name')
  81. }, 100)
  82. }
  83. </script>
  84. <style lang="scss" scoped>
  85. @use "@/views/workflow/instance/component/style";
  86. .port {
  87. width: 100%;
  88. height: 100%;
  89. >div {
  90. width: 100%;
  91. height: 100%;
  92. border: style.$borderStyle;
  93. background-color: #ffffff;
  94. border-radius: 50%;
  95. }
  96. }
  97. .node-add {
  98. width: 100px;
  99. }
  100. </style>