DepartRuleTab.vue 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. <template>
  2. <a-spin :spinning="loading">
  3. <template v-if="treeData.length > 0">
  4. <BasicTree
  5. ref="basicTree"
  6. class="depart-rule-tree"
  7. checkable
  8. :treeData="treeData"
  9. :checkedKeys="checkedKeys"
  10. :selectedKeys="selectedKeys"
  11. :expandedKeys="expandedKeys"
  12. :checkStrictly="checkStrictly"
  13. style="height:500px; overflow: auto;"
  14. @check="onCheck"
  15. @expand="onExpand"
  16. @select="onSelect"
  17. >
  18. <template #title="{slotTitle, ruleFlag}">
  19. <span>{{ slotTitle }}</span>
  20. <Icon v-if="ruleFlag" icon="ant-design:align-left-outlined" style="margin-left:5px;color: red;"/>
  21. </template>
  22. </BasicTree>
  23. </template>
  24. <a-empty v-else description="无可配置部门权限"/>
  25. <div class="j-box-bottom-button offset-20" style="margin-top: 30px;">
  26. <div class="j-box-bottom-button-float">
  27. <a-dropdown :trigger="['click']" placement="topCenter">
  28. <template #overlay>
  29. <a-menu>
  30. <a-menu-item key="3" @click="toggleCheckALL(true)">全部勾选</a-menu-item>
  31. <a-menu-item key="4" @click="toggleCheckALL(false)">取消全选</a-menu-item>
  32. <a-menu-item key="5" @click="toggleExpandAll(true)">展开所有</a-menu-item>
  33. <a-menu-item key="6" @click="toggleExpandAll(false)">收起所有</a-menu-item>
  34. </a-menu>
  35. </template>
  36. <a-button style="float: left">
  37. 树操作
  38. <Icon icon="ant-design:up-outlined"/>
  39. </a-button>
  40. </a-dropdown>
  41. <a-button type="primary" preIcon="ant-design:save-filled" @click="onSubmit">保存</a-button>
  42. </div>
  43. </div>
  44. </a-spin>
  45. <DepartDataRuleDrawer @register="registerDataRuleDrawer"/>
  46. </template>
  47. <script lang="ts" setup>
  48. import { watch, computed, inject, ref, nextTick } from 'vue'
  49. import { useDrawer } from '/@/components/Drawer'
  50. import { BasicTree } from '/@/components/Tree/index'
  51. import DepartDataRuleDrawer from './DepartDataRuleDrawer.vue'
  52. import { queryRoleTreeList, queryDepartPermission, saveDepartPermission } from '../depart.api'
  53. const props = defineProps({
  54. data: { type: Object, default: () => ({}) },
  55. })
  56. // 当前选中的部门ID,可能会为空,代表未选择部门
  57. const departId = computed(() => props.data?.id)
  58. const prefixCls = inject('prefixCls')
  59. const basicTree = ref()
  60. const loading = ref<boolean>(false)
  61. const treeData = ref<any[]>([])
  62. const expandedKeys = ref<Array<any>>([])
  63. const selectedKeys = ref<Array<any>>([])
  64. const checkedKeys = ref<Array<any>>([])
  65. const lastCheckedKeys = ref<Array<any>>([])
  66. const checkStrictly = ref(true)
  67. // 注册数据规则授权弹窗抽屉
  68. const [registerDataRuleDrawer, dataRuleDrawer] = useDrawer()
  69. // onCreated
  70. loadData()
  71. watch(departId, () => loadDepartPermission(), { immediate: true })
  72. async function loadData() {
  73. try {
  74. loading.value = true
  75. let { treeList } = await queryRoleTreeList()
  76. treeData.value = treeList
  77. await nextTick()
  78. toggleExpandAll(true)
  79. } finally {
  80. loading.value = false
  81. }
  82. }
  83. async function loadDepartPermission() {
  84. if (departId.value) {
  85. try {
  86. loading.value = true
  87. let keys = await queryDepartPermission({ departId: departId.value })
  88. checkedKeys.value = keys
  89. lastCheckedKeys.value = [...keys]
  90. } finally {
  91. loading.value = false
  92. }
  93. }
  94. }
  95. async function onSubmit() {
  96. try {
  97. loading.value = true
  98. await saveDepartPermission({
  99. departId: departId.value,
  100. permissionIds: checkedKeys.value.join(','),
  101. lastpermissionIds: lastCheckedKeys.value.join(','),
  102. })
  103. await loadData()
  104. await loadDepartPermission()
  105. } finally {
  106. loading.value = false
  107. }
  108. }
  109. // tree勾选复选框事件
  110. function onCheck(event) {
  111. if (!Array.isArray(event)) {
  112. checkedKeys.value = event.checked
  113. } else {
  114. checkedKeys.value = event
  115. }
  116. }
  117. // tree展开事件
  118. function onExpand($expandedKeys) {
  119. expandedKeys.value = $expandedKeys
  120. }
  121. // tree选中事件
  122. function onSelect($selectedKeys, { selectedNodes }) {
  123. if (selectedNodes[0]?.props?.ruleFlag) {
  124. let functionId = $selectedKeys[0]
  125. dataRuleDrawer.openDrawer(true, { departId, functionId })
  126. }
  127. selectedKeys.value = []
  128. }
  129. // 切换父子关联
  130. async function toggleCheckStrictly(flag) {
  131. checkStrictly.value = flag
  132. await nextTick()
  133. checkedKeys.value = basicTree.value.getCheckedKeys()
  134. }
  135. // 切换展开收起
  136. async function toggleExpandAll(flag) {
  137. basicTree.value.expandAll(flag)
  138. await nextTick()
  139. expandedKeys.value = basicTree.value.getExpandedKeys()
  140. }
  141. // 切换全选
  142. async function toggleCheckALL(flag) {
  143. basicTree.value.checkAll(flag)
  144. await nextTick()
  145. checkedKeys.value = basicTree.value.getCheckedKeys()
  146. }
  147. </script>
  148. <style lang="less" scoped>
  149. // 【VUEN-188】解决滚动条不灵敏的问题
  150. .depart-rule-tree ::v-deep(.scrollbar__bar) {
  151. pointer-events: none;
  152. }
  153. </style>