StartUserNodeConfig.vue 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. <template>
  2. <el-drawer
  3. :append-to-body="true"
  4. v-model="settingVisible"
  5. :show-close="false"
  6. :size="550"
  7. :before-close="saveConfig"
  8. >
  9. <template #header>
  10. <div class="config-header">
  11. <input
  12. v-if="showInput"
  13. type="text"
  14. class="config-editable-input"
  15. @blur="blurEvent()"
  16. v-mountedFocus
  17. v-model="nodeName"
  18. :placeholder="nodeName"
  19. />
  20. <div v-else class="node-name">
  21. {{ nodeName }} <Icon class="ml-1" icon="ep:edit-pen" :size="16" @click="clickIcon()" />
  22. </div>
  23. <div class="divide-line"></div>
  24. </div>
  25. </template>
  26. <el-tabs type="border-card" v-model="activeTabName">
  27. <el-tab-pane label="权限" name="user">
  28. <el-text v-if="!startUserIds || startUserIds.length === 0"> 全部成员可以发起流程 </el-text>
  29. <el-text v-else-if="startUserIds.length == 1">
  30. {{ getUserNicknames(startUserIds) }} 可发起流程
  31. </el-text>
  32. <el-text v-else>
  33. <el-tooltip
  34. class="box-item"
  35. effect="dark"
  36. placement="top"
  37. :content="getUserNicknames(startUserIds)"
  38. >
  39. {{ getUserNicknames(startUserIds.slice(0,2)) }} 等 {{ startUserIds.length }} 人可发起流程
  40. </el-tooltip>
  41. </el-text>
  42. </el-tab-pane>
  43. <el-tab-pane label="表单字段权限" name="fields" v-if="formType === 10">
  44. <div class="field-setting-pane">
  45. <div class="field-setting-desc">字段权限</div>
  46. <div class="field-permit-title">
  47. <div class="setting-title-label first-title"> 字段名称 </div>
  48. <div class="other-titles">
  49. <span class="setting-title-label">只读</span>
  50. <span class="setting-title-label">可编辑</span>
  51. <span class="setting-title-label">隐藏</span>
  52. </div>
  53. </div>
  54. <div
  55. class="field-setting-item"
  56. v-for="(item, index) in fieldsPermissionConfig"
  57. :key="index"
  58. >
  59. <div class="field-setting-item-label"> {{ item.title }} </div>
  60. <el-radio-group class="field-setting-item-group" v-model="item.permission">
  61. <div class="item-radio-wrap">
  62. <el-radio
  63. :value="FieldPermissionType.READ"
  64. size="large"
  65. :label="FieldPermissionType.READ"
  66. ><span></span
  67. ></el-radio>
  68. </div>
  69. <div class="item-radio-wrap">
  70. <el-radio
  71. :value="FieldPermissionType.WRITE"
  72. size="large"
  73. :label="FieldPermissionType.WRITE"
  74. ><span></span
  75. ></el-radio>
  76. </div>
  77. <div class="item-radio-wrap">
  78. <el-radio
  79. :value="FieldPermissionType.NONE"
  80. size="large"
  81. :label="FieldPermissionType.NONE"
  82. ><span></span
  83. ></el-radio>
  84. </div>
  85. </el-radio-group>
  86. </div>
  87. </div>
  88. </el-tab-pane>
  89. </el-tabs>
  90. <template #footer>
  91. <el-divider />
  92. <div>
  93. <el-button type="primary" @click="saveConfig">确 定</el-button>
  94. <el-button @click="closeDrawer">取 消</el-button>
  95. </div>
  96. </template>
  97. </el-drawer>
  98. </template>
  99. <script setup lang="ts">
  100. import { SimpleFlowNode, NodeType, FieldPermissionType, START_USER_BUTTON_SETTING } from '../consts'
  101. import { useWatchNode, useDrawer, useNodeName, useFormFieldsPermission } from '../node'
  102. import * as UserApi from '@/api/system/user'
  103. defineOptions({
  104. name: 'StartUserNodeConfig'
  105. })
  106. const props = defineProps({
  107. flowNode: {
  108. type: Object as () => SimpleFlowNode,
  109. required: true
  110. }
  111. })
  112. // 可发起流程的用户编号
  113. const startUserIds = inject<Ref<any[]>>('startUserIds')
  114. // 用户列表
  115. const userOptions = inject<Ref<UserApi.UserVO[]>>('userList')
  116. // 抽屉配置
  117. const { settingVisible, closeDrawer, openDrawer } = useDrawer()
  118. // 当前节点
  119. const currentNode = useWatchNode(props)
  120. // 节点名称
  121. const { nodeName, showInput, clickIcon, blurEvent } = useNodeName(NodeType.COPY_TASK_NODE)
  122. // 激活的 Tab 标签页
  123. const activeTabName = ref('user')
  124. // 表单字段权限配置
  125. const { formType, fieldsPermissionConfig, getNodeConfigFormFields } = useFormFieldsPermission(
  126. FieldPermissionType.WRITE
  127. )
  128. const getUserNicknames = (userIds: number[]): string => {
  129. if (!userIds || userIds.length === 0) {
  130. return ''
  131. }
  132. const nicknames: string[] = []
  133. userIds.forEach((userId) => {
  134. const found = userOptions?.value.find((item) => item.id === userId)
  135. if (found && found.nickname) {
  136. nicknames.push(found.nickname)
  137. }
  138. })
  139. return nicknames.join(',')
  140. }
  141. // 保存配置
  142. const saveConfig = async () => {
  143. activeTabName.value = 'user'
  144. currentNode.value.name = nodeName.value!
  145. currentNode.value.showText = '已设置'
  146. // 设置表单权限
  147. currentNode.value.fieldsPermission = fieldsPermissionConfig.value
  148. // 设置发起人的按钮权限
  149. currentNode.value.buttonsSetting = START_USER_BUTTON_SETTING
  150. settingVisible.value = false
  151. return true
  152. }
  153. // 显示发起人节点配置, 由父组件传过来
  154. const showStartUserNodeConfig = (node: SimpleFlowNode) => {
  155. nodeName.value = node.name
  156. // 表单字段权限
  157. getNodeConfigFormFields(node.fieldsPermission)
  158. }
  159. defineExpose({ openDrawer, showStartUserNodeConfig }) // 暴露方法给父组件
  160. </script>
  161. <style lang="scss" scoped></style>