index.vue 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. <!--
  2. * @Author: liuJie
  3. * @Date: 2026-01-25 22:13:06
  4. * @LastEditors: liuJie
  5. * @LastEditTime: 2026-01-27 10:01:23
  6. * @Describe: file describe
  7. -->
  8. <script lang="ts" setup>
  9. import { computed } from 'vue'
  10. import { Icon } from '@iconify/vue'
  11. import { useComponentMapInspector } from '@/store'
  12. import type { IWorkflow } from '@repo/workflow'
  13. import HttpSetter from './HttpSetter.vue'
  14. import CodeSetter from './CodeSetter.vue'
  15. import ConditionSetter from './ConditionSetter.vue'
  16. import DatabaseSetter from './DatabaseSetter.vue'
  17. const setterMap = {
  18. 'http-node': HttpSetter,
  19. 'code-node': CodeSetter,
  20. 'condition-node': ConditionSetter,
  21. 'database-node': DatabaseSetter
  22. }
  23. const store = useComponentMapInspector()
  24. console.log(store.componentMap['http'])
  25. interface Props {
  26. id: string
  27. workflow: IWorkflow
  28. visible: boolean
  29. }
  30. const props = withDefaults(defineProps<Props>(), {
  31. id: '',
  32. data: null,
  33. visible: false
  34. })
  35. const emit = defineEmits<{
  36. 'update:visible': [value: boolean]
  37. }>()
  38. const node = computed(() => {
  39. return props.workflow.nodes.find((node) => node.id === props.id)
  40. })
  41. const setter = computed(() => {
  42. return node.value?.type && setterMap[node.value.type as keyof typeof setterMap]
  43. })
  44. const closeDrawer = () => {
  45. emit('update:visible', false)
  46. }
  47. </script>
  48. <template>
  49. <div class="setter">
  50. <div class="drawer shadow-2xl" :class="{ 'drawer--open': props.visible && setter }">
  51. <header>
  52. <h4>{{ node?.label }}</h4>
  53. <Icon
  54. icon="lucide:x"
  55. height="24"
  56. width="24"
  57. @click="closeDrawer"
  58. class="cursor-pointer"
  59. ></Icon>
  60. </header>
  61. <div class="content">
  62. <component :is="setter" :data="node?.data"></component>
  63. </div>
  64. </div>
  65. </div>
  66. </template>
  67. <style lang="less" scoped>
  68. .setter {
  69. /* Drawer 主体 */
  70. .drawer {
  71. position: fixed;
  72. top: 100px;
  73. right: 5px;
  74. bottom: 10px;
  75. width: 420px;
  76. background: #fff;
  77. z-index: 1000;
  78. border-radius: 8px;
  79. display: flex;
  80. flex-direction: column;
  81. border: 1px solid #e4e4e4;
  82. /* 初始隐藏状态 */
  83. transform: translateX(110%);
  84. transition: transform 0.25s ease;
  85. }
  86. /* 显示状态 */
  87. .drawer--open {
  88. transform: translateX(0);
  89. }
  90. /* Header */
  91. .drawer header {
  92. height: 56px;
  93. padding: 0 16px;
  94. border-bottom: 1px solid #eee;
  95. display: flex;
  96. align-items: center;
  97. justify-content: space-between;
  98. }
  99. /* 内容区 */
  100. .drawer .content {
  101. flex: 1;
  102. // padding: 16px;
  103. overflow-y: auto;
  104. }
  105. ::v-deep(.el-collapse-item__header) {
  106. box-sizing: border-box;
  107. padding: 0 8px;
  108. }
  109. ::v-deep(.el-collapse-item__content) {
  110. box-sizing: border-box;
  111. padding: 0 8px;
  112. padding-bottom: 12px;
  113. }
  114. }
  115. </style>