¶Ô±ÈÐÂÎļþ |
| | |
| | | <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: () => ({}) }, |
| | | }) |
| | | // å½åéä¸çé¨é¨IDï¼å¯è½ä¼ä¸ºç©ºï¼ä»£è¡¨æªéæ©é¨é¨ |
| | | 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> |
| | | // ãVUEN-188ãè§£å³æ»å¨æ¡ä¸çµæçé®é¢ |
| | | .depart-rule-tree :deep(.scrollbar__bar) { |
| | | pointer-events: none; |
| | | } |
| | | </style> |