From fa3ac93010bea3805438ee3ab0a182bfbf7423da Mon Sep 17 00:00:00 2001
From: baoshiwei <baoshiwei@shlanbao.cn>
Date: 星期一, 27 五月 2024 16:19:31 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 src/views/system/depart/components/DepartRuleTab.vue |  160 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 160 insertions(+), 0 deletions(-)

diff --git a/src/views/system/depart/components/DepartRuleTab.vue b/src/views/system/depart/components/DepartRuleTab.vue
new file mode 100644
index 0000000..d66ca3f
--- /dev/null
+++ b/src/views/system/depart/components/DepartRuleTab.vue
@@ -0,0 +1,160 @@
+<template>
+  <a-spin :spinning="loading">
+    <template v-if="treeData.length > 0">
+      <BasicTree ref="basicTree" class="depart-rule-tree" checkable :treeData="treeData" :checkedKeys="checkedKeys"
+        :selectedKeys="selectedKeys" :expandedKeys="expandedKeys" :checkStrictly="checkStrictly"
+        style="height: 500px; overflow: auto" @check="onCheck" @expand="onExpand" @select="onSelect">
+        <template #title="{ slotTitle, ruleFlag }">
+          <span>{{ slotTitle }}</span>
+          <Icon v-if="ruleFlag" icon="ant-design:align-left-outlined" style="margin-left: 5px; color: red" />
+        </template>
+      </BasicTree>
+    </template>
+    <a-empty v-else description="鏃犲彲閰嶇疆閮ㄩ棬鏉冮檺" />
+
+    <div class="j-box-bottom-button offset-20" style="margin-top: 30px">
+      <div class="j-box-bottom-button-float">
+        <a-dropdown :trigger="['click']" placement="top">
+          <template #overlay>
+            <a-menu>
+              <a-menu-item key="1" @click="toggleCheckStrictly(false)">鐖跺瓙鍏宠仈</a-menu-item>
+              <a-menu-item key="2" @click="toggleCheckStrictly(true)">鍙栨秷鍏宠仈</a-menu-item>
+              <a-menu-item key="3" @click="toggleCheckALL(true)">鍏ㄩ儴鍕鹃��</a-menu-item>
+              <a-menu-item key="4" @click="toggleCheckALL(false)">鍙栨秷鍏ㄩ��</a-menu-item>
+              <a-menu-item key="5" @click="toggleExpandAll(true)">灞曞紑鎵�鏈�</a-menu-item>
+              <a-menu-item key="6" @click="toggleExpandAll(false)">鏀惰捣鎵�鏈�</a-menu-item>
+            </a-menu>
+          </template>
+          <a-button style="float: left">
+            鏍戞搷浣�
+            <Icon icon="ant-design:up-outlined" />
+          </a-button>
+        </a-dropdown>
+        <a-button type="primary" preIcon="ant-design:save-filled" @click="onSubmit">淇濆瓨</a-button>
+      </div>
+    </div>
+  </a-spin>
+  <DepartDataRuleDrawer @register="registerDataRuleDrawer" />
+</template>
+
+<script lang="ts" setup>
+import { computed, inject, nextTick, ref, watch } from 'vue'
+import { queryDepartPermission, queryRoleTreeList, saveDepartPermission } from '../depart.api'
+import DepartDataRuleDrawer from './DepartDataRuleDrawer.vue'
+import { useDrawer } from '/@/components/Drawer'
+import { BasicTree } from '/@/components/Tree/index'
+
+const props = defineProps({
+  data: { type: Object, default: () => ({}) },
+})
+// 褰撳墠閫変腑鐨勯儴闂↖D锛屽彲鑳戒細涓虹┖锛屼唬琛ㄦ湭閫夋嫨閮ㄩ棬
+const departId = computed(() => props.data?.id)
+
+const prefixCls = inject('prefixCls')
+const basicTree = ref()
+const loading = ref<boolean>(false)
+const treeData = ref<any[]>([])
+const expandedKeys = ref<Array<any>>([])
+const selectedKeys = ref<Array<any>>([])
+const checkedKeys = ref<Array<any>>([])
+const lastCheckedKeys = ref<Array<any>>([])
+const checkStrictly = ref(true)
+
+// 娉ㄥ唽鏁版嵁瑙勫垯鎺堟潈寮圭獥鎶藉眽
+const [registerDataRuleDrawer, dataRuleDrawer] = useDrawer()
+
+// onCreated
+loadData()
+watch(departId, () => loadDepartPermission(), { immediate: true })
+
+async function loadData() {
+  try {
+    loading.value = true
+    let { treeList } = await queryRoleTreeList()
+    treeData.value = treeList
+    await nextTick()
+    toggleExpandAll(true)
+  } finally {
+    loading.value = false
+  }
+}
+
+async function loadDepartPermission() {
+  if (departId.value) {
+    try {
+      loading.value = true
+      let keys = await queryDepartPermission({ departId: departId.value })
+      checkedKeys.value = keys
+      lastCheckedKeys.value = [...keys]
+    } finally {
+      loading.value = false
+    }
+  }
+}
+
+async function onSubmit() {
+  try {
+    loading.value = true
+    await saveDepartPermission({
+      departId: departId.value,
+      permissionIds: checkedKeys.value.join(','),
+      lastpermissionIds: lastCheckedKeys.value.join(','),
+    })
+    await loadData()
+    await loadDepartPermission()
+  } finally {
+    loading.value = false
+  }
+}
+
+// tree鍕鹃�夊閫夋浜嬩欢
+function onCheck(event) {
+  if (!Array.isArray(event)) {
+    checkedKeys.value = event.checked
+  } else {
+    checkedKeys.value = event
+  }
+}
+
+// tree灞曞紑浜嬩欢
+function onExpand($expandedKeys) {
+  expandedKeys.value = $expandedKeys
+}
+
+// tree閫変腑浜嬩欢
+function onSelect($selectedKeys, { selectedNodes }) {
+  if (selectedNodes[0]?.ruleFlag) {
+    let functionId = $selectedKeys[0]
+    dataRuleDrawer.openDrawer(true, { departId, functionId })
+  }
+  selectedKeys.value = []
+}
+
+// 鍒囨崲鐖跺瓙鍏宠仈
+async function toggleCheckStrictly(flag) {
+  checkStrictly.value = flag
+  await nextTick()
+  checkedKeys.value = basicTree.value.getCheckedKeys()
+}
+
+// 鍒囨崲灞曞紑鏀惰捣
+async function toggleExpandAll(flag) {
+  basicTree.value.expandAll(flag)
+  await nextTick()
+  expandedKeys.value = basicTree.value.getExpandedKeys()
+}
+
+// 鍒囨崲鍏ㄩ��
+async function toggleCheckALL(flag) {
+  basicTree.value.checkAll(flag)
+  await nextTick()
+  checkedKeys.value = basicTree.value.getCheckedKeys()
+}
+</script>
+
+<style lang="less" scoped>
+// 銆怴UEN-188銆戣В鍐虫粴鍔ㄦ潯涓嶇伒鏁忕殑闂
+.depart-rule-tree :deep(.scrollbar__bar) {
+  pointer-events: none;
+}
+</style>

--
Gitblit v1.9.3