RouterNode.vue 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. <template>
  2. <div class="node-wrapper">
  3. <div class="node-container">
  4. <div
  5. class="node-box"
  6. :class="[
  7. { 'node-config-error': !currentNode.showText },
  8. `${useTaskStatusClass(currentNode?.activityStatus)}`
  9. ]"
  10. >
  11. <div class="node-title-container">
  12. <div class="node-title-icon router-node">
  13. <span class="iconfont icon-router"></span>
  14. </div>
  15. <input
  16. v-if="!readonly && showInput"
  17. type="text"
  18. class="editable-title-input"
  19. @blur="blurEvent()"
  20. v-mountedFocus
  21. v-model="currentNode.name"
  22. :placeholder="currentNode.name"
  23. />
  24. <div v-else class="node-title" @click="clickTitle">
  25. {{ currentNode.name }}
  26. </div>
  27. </div>
  28. <div class="node-content" @click="openNodeConfig">
  29. <div class="node-text" :title="currentNode.showText" v-if="currentNode.showText">
  30. {{ currentNode.showText }}
  31. </div>
  32. <div class="node-text" v-else>
  33. {{ NODE_DEFAULT_TEXT.get(NodeType.ROUTER_BRANCH_NODE) }}
  34. </div>
  35. <Icon v-if="!readonly" icon="ep:arrow-right-bold" />
  36. </div>
  37. <div v-if="!readonly" class="node-toolbar">
  38. <div class="toolbar-icon"
  39. ><Icon color="#0089ff" icon="ep:circle-close-filled" :size="18" @click="deleteNode"
  40. /></div>
  41. </div>
  42. </div>
  43. <!-- 传递子节点给添加节点组件。会在子节点前面添加节点 -->
  44. <NodeHandler
  45. v-if="currentNode"
  46. v-model:child-node="currentNode.childNode"
  47. :current-node="currentNode"
  48. />
  49. </div>
  50. <RouterNodeConfig v-if="!readonly && currentNode" ref="nodeSetting" :flow-node="currentNode" />
  51. </div>
  52. </template>
  53. <script setup lang="ts">
  54. import { SimpleFlowNode, NodeType, NODE_DEFAULT_TEXT } from '../consts'
  55. import NodeHandler from '../NodeHandler.vue'
  56. import { useNodeName2, useWatchNode, useTaskStatusClass } from '../node'
  57. import RouterNodeConfig from '../nodes-config/RouterNodeConfig.vue'
  58. defineOptions({
  59. name: 'RouterNode'
  60. })
  61. const props = defineProps({
  62. flowNode: {
  63. type: Object as () => SimpleFlowNode,
  64. required: true
  65. }
  66. })
  67. // 定义事件,更新父组件
  68. const emits = defineEmits<{
  69. 'update:flowNode': [node: SimpleFlowNode | undefined]
  70. }>()
  71. // 是否只读
  72. const readonly = inject<Boolean>('readonly')
  73. // 监控节点的变化
  74. const currentNode = useWatchNode(props)
  75. // 节点名称编辑
  76. const { showInput, blurEvent, clickTitle } = useNodeName2(currentNode, NodeType.ROUTER_BRANCH_NODE)
  77. const nodeSetting = ref()
  78. // 打开节点配置
  79. const openNodeConfig = () => {
  80. if (readonly) {
  81. return
  82. }
  83. nodeSetting.value.showRouteNodeConfig(currentNode.value)
  84. nodeSetting.value.openDrawer()
  85. }
  86. // 删除节点。更新当前节点为孩子节点
  87. const deleteNode = () => {
  88. emits('update:flowNode', currentNode.value.childNode)
  89. }
  90. </script>
  91. <style lang="scss" scoped></style>