index.vue 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. <template>
  2. <div class="designer-container">
  3. <!-- 流程信息栏(新增/编辑模式显示) -->
  4. <div v-if="flowInfoVisible" class="flow-info-bar">
  5. <el-tag v-if="mode === 'create'" type="primary">新增流程</el-tag>
  6. <el-tag v-else-if="mode === 'edit'" type="warning">编辑流程</el-tag>
  7. <span class="flow-info-item"><strong>编码:</strong>{{ flowCode }}</span>
  8. <span class="flow-info-item"><strong>名称:</strong>{{ flowName }}</span>
  9. <span v-if="flowCategory" class="flow-info-item"><strong>分类:</strong>{{ flowCategory }}</span>
  10. </div>
  11. <DesignerCanvas
  12. :set-container="setContainer"
  13. @drop="handleDrop"
  14. @save="handleSave"
  15. @clear="handleClear"
  16. @back="goBack"
  17. />
  18. <DesignerPropertyPanel
  19. :selected-node="selectedNode"
  20. :node-props="nodeProps"
  21. :outgoing-edges="outgoingEdges"
  22. :role-list="roleList"
  23. :get-edge-target-name="getEdgeTargetName"
  24. :update-node-name="updateNodeName"
  25. :on-default-change="onDefaultChange"
  26. :on-branch-blur="onBranchBlur"
  27. />
  28. <DesignerSaveDialog
  29. :visible="saveDialogVisible"
  30. @update:visible="saveDialogVisible = $event"
  31. :option-dialog-visible="optionDialogVisible"
  32. @update:optionDialogVisible="optionDialogVisible = $event"
  33. :save-form="saveForm"
  34. :save-form-rules="saveFormRules"
  35. :form-fields="formFields"
  36. :field-type-options="fieldTypeOptions"
  37. :option-editing-field="optionEditingField"
  38. :option-list="optionList"
  39. @submit="submitSave"
  40. @add-field="addFormField"
  41. @remove-field="removeFormField"
  42. @open-option-dialog="openOptionDialog"
  43. @add-option="addOption"
  44. @remove-option="removeOption"
  45. @save-options="saveOptions"
  46. />
  47. </div>
  48. </template>
  49. <script setup lang="ts">
  50. import { ref } from 'vue'
  51. import type { ComponentPublicInstance } from 'vue'
  52. import { useFlowDesigner } from './useFlowDesigner'
  53. import DesignerCanvas from './DesignerCanvas.vue'
  54. import DesignerPropertyPanel from './DesignerPropertyPanel.vue'
  55. import DesignerSaveDialog from './DesignerSaveDialog.vue'
  56. const lfContainer = ref<HTMLDivElement>()
  57. function setContainer(el: Element | ComponentPublicInstance | null) {
  58. lfContainer.value = el as HTMLDivElement | undefined
  59. }
  60. const {
  61. mode,
  62. flowInfoVisible,
  63. flowCode,
  64. flowName,
  65. flowCategory,
  66. selectedNode,
  67. nodeProps,
  68. outgoingEdges,
  69. roleList,
  70. getEdgeTargetName,
  71. updateNodeName,
  72. onDefaultChange,
  73. onBranchBlur,
  74. saveDialogVisible,
  75. optionDialogVisible,
  76. saveForm,
  77. saveFormRules,
  78. formFields,
  79. fieldTypeOptions,
  80. optionEditingField,
  81. optionList,
  82. handleDrop,
  83. handleSave,
  84. handleClear,
  85. goBack,
  86. submitSave,
  87. addFormField,
  88. removeFormField,
  89. openOptionDialog,
  90. addOption,
  91. removeOption,
  92. saveOptions
  93. } = useFlowDesigner(lfContainer)
  94. </script>
  95. <style scoped>
  96. .designer-container {
  97. display: flex;
  98. height: calc(100vh - 100px);
  99. background: #fff;
  100. }
  101. .flow-info-bar {
  102. position: absolute;
  103. top: 60px;
  104. left: 220px;
  105. right: 0;
  106. height: 40px;
  107. background: #f0f9ff;
  108. border-bottom: 1px solid #d9ecff;
  109. display: flex;
  110. align-items: center;
  111. gap: 16px;
  112. padding: 0 16px;
  113. z-index: 100;
  114. }
  115. .flow-info-item {
  116. font-size: 13px;
  117. color: #303133;
  118. }
  119. </style>