panel-index.vue 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. <template>
  2. <transition name="slide">
  3. <div class="panel-index" v-if="WorkflowStore.panel.show">
  4. <div class="panel-header">
  5. <h3>{{ state.nodeData.title }}</h3>
  6. <div class="__hover" @click="WorkflowStore.nodePanelClose()">×</div>
  7. </div>
  8. <div class="panel-sub">
  9. <CzrFormColumn
  10. :span="24"
  11. label-width="0px"
  12. v-model:param="state.nodeData.subTitle"
  13. :transparent="true"
  14. placeholder="副标题..."
  15. :max-length="20"
  16. :clearable="false"
  17. />
  18. </div>
  19. <div class="panel-content">
  20. <template v-if="nodeDataCpt.type === NodeType.Root">
  21. <rootPanel :node="WorkflowStore.panel.node"/>
  22. </template>
  23. <template v-else-if="nodeDataCpt.type === NodeType.Test">
  24. <testPanel :node="WorkflowStore.panel.node"/>
  25. </template>
  26. <template v-else-if="nodeDataCpt.type === NodeType.Answer">
  27. <answerPanel :node="WorkflowStore.panel.node"/>
  28. </template>
  29. <template v-else-if="nodeDataCpt.type === NodeType.IfElse">
  30. <ifElsePanel :node="WorkflowStore.panel.node"/>
  31. </template>
  32. </div>
  33. </div>
  34. </transition>
  35. </template>
  36. <script setup lang="ts">
  37. import {computed, getCurrentInstance, onMounted, reactive, ref, watch} from "vue";
  38. import rootPanel from '../instance/root/panel/index.vue'
  39. import answerPanel from '../instance/answer/panel/index.vue'
  40. import ifElsePanel from '../instance/if-else/panel/index.vue'
  41. import testPanel from '../instance/test/panel/index.vue'
  42. import {useWorkflowStore} from "@/stores";
  43. import {NodeType} from "@/views/workflow/types";
  44. const WorkflowStore = useWorkflowStore()
  45. const emits = defineEmits([])
  46. const props = defineProps({
  47. })
  48. const {proxy}: any = getCurrentInstance()
  49. const state: any = reactive({
  50. nodeData: {}
  51. })
  52. const nodeDataCpt = computed(() => WorkflowStore.panel.node?.data.workflowData || {})
  53. watch(() => nodeDataCpt.value, (n) => {
  54. if (n) {
  55. state.nodeData = WorkflowStore.panel.node?.data.workflowData || {}
  56. }
  57. })
  58. </script>
  59. <style lang="scss" scoped>
  60. @use "@/views/workflow/instance/component/style";
  61. .panel-index {
  62. width: 400px;
  63. height: 100%;
  64. background-color: white;
  65. box-shadow: -2px 0 8px rgba(0, 0, 0, 0.15);
  66. z-index: 1000;
  67. display: flex;
  68. flex-direction: column;
  69. border-radius: 10px 0 0 10px;
  70. .panel-header {
  71. padding: 16px 16px 0 16px;
  72. display: flex;
  73. justify-content: space-between;
  74. align-items: center;
  75. font-weight: bold;
  76. }
  77. .panel-sub {
  78. border-bottom: style.$borderStyle;
  79. padding: 6px;
  80. }
  81. .panel-content {
  82. padding: 0 16px 16px;
  83. flex: 1;
  84. overflow-y: auto;
  85. }
  86. }
  87. /* 过渡动画 */
  88. .slide-enter-active,
  89. .slide-leave-active {
  90. transition: transform 0.3s ease;
  91. }
  92. .slide-enter-from,
  93. .slide-leave-to {
  94. transform: translateX(100%);
  95. }
  96. </style>