EditorCustomEdge.vue 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. <template>
  2. <path
  3. :id="id"
  4. :style="style"
  5. class="vue-flow__edge-path"
  6. :d="edgePath"
  7. :marker-end="markerEnd"
  8. />
  9. <edge-text
  10. v-if="label"
  11. :x="center[0]"
  12. :y="center[1]"
  13. :label="label"
  14. :label-style="{ fill: 'white' }"
  15. :label-show-bg="true"
  16. :label-bg-style="{ fill: '#3b82f6' }"
  17. :label-bg-padding="[2, 4]"
  18. :label-bg-border-radius="2"
  19. />
  20. </template>
  21. <script setup>
  22. import { computed } from 'vue';
  23. import {
  24. getBezierPath,
  25. getSmoothStepPath,
  26. getEdgeCenter,
  27. EdgeText,
  28. } from '@vue-flow/core';
  29. const props = defineProps({
  30. id: {
  31. type: String,
  32. required: true,
  33. },
  34. sourceX: {
  35. type: Number,
  36. required: true,
  37. },
  38. sourceY: {
  39. type: Number,
  40. required: true,
  41. },
  42. targetX: {
  43. type: Number,
  44. required: true,
  45. },
  46. targetY: {
  47. type: Number,
  48. required: true,
  49. },
  50. sourcePosition: {
  51. type: String,
  52. required: true,
  53. },
  54. targetPosition: {
  55. type: String,
  56. required: true,
  57. },
  58. data: {
  59. type: Object,
  60. required: false,
  61. default: () => ({}),
  62. },
  63. markerEnd: {
  64. type: String,
  65. required: false,
  66. default: '',
  67. },
  68. label: {
  69. type: String,
  70. required: false,
  71. default: '',
  72. },
  73. style: {
  74. type: Object,
  75. required: false,
  76. default: null,
  77. },
  78. });
  79. const center = computed(() => {
  80. if (!props.label) return null;
  81. return getEdgeCenter({
  82. sourceX: props.sourceX,
  83. sourceY: props.sourceY,
  84. targetX: props.targetX,
  85. targetY: props.targetY,
  86. });
  87. });
  88. const edgePath = computed(() => {
  89. const options = {
  90. sourceX: props.sourceX,
  91. sourceY: props.sourceY,
  92. sourcePosition: props.sourcePosition,
  93. targetX: props.targetX,
  94. targetY: props.targetY,
  95. targetPosition: props.targetPosition,
  96. };
  97. if (props.sourceX > props.targetX) {
  98. return getSmoothStepPath(options);
  99. }
  100. return getBezierPath(options);
  101. });
  102. </script>
  103. <script>
  104. export default {
  105. inheritAttrs: false,
  106. };
  107. </script>