¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <BasicDrawer v-bind="$attrs" |
| | | @register="registerDrawer" |
| | | width="650px" |
| | | destroyOnClose |
| | | showFooter> |
| | | <template #title> |
| | | è§è²æéé
ç½® |
| | | <a-dropdown> |
| | | <Icon icon="ant-design:more-outlined" class="more-icon" /> |
| | | <template #overlay> |
| | | <a-menu @click="treeMenuClick"> |
| | | <a-menu-item key="checkAll">éæ©å
¨é¨</a-menu-item> |
| | | <a-menu-item key="cancelCheck">åæ¶éæ©</a-menu-item> |
| | | <div class="line"></div> |
| | | <a-menu-item key="openAll">å±å¼å
¨é¨</a-menu-item> |
| | | <a-menu-item key="closeAll">æå å
¨é¨</a-menu-item> |
| | | <div class="line"></div> |
| | | <a-menu-item key="relation">å±çº§å
³è</a-menu-item> |
| | | <a-menu-item key="standAlone">å±çº§ç¬ç«</a-menu-item> |
| | | </a-menu> |
| | | </template> |
| | | </a-dropdown> |
| | | </template> |
| | | <BasicTree ref="treeRef" checkable :treeData="treeData" :checkedKeys="checkedKeys" :expandedKeys="expandedKeys" |
| | | :selectedKeys="selectedKeys" :checkStrictly="checkStrictly" :clickRowToExpand="false" title="ææ¥æççæé" |
| | | @check="onCheck" @select="onTreeNodeSelect"> |
| | | <template #title="{ slotTitle, ruleFlag }"> |
| | | {{ slotTitle }} |
| | | <Icon v-if="ruleFlag" icon="ant-design:align-left-outlined" style="margin-left: 5px; color: red"></Icon> |
| | | </template> |
| | | </BasicTree> |
| | | <!--å³ä¸è§æé®--> |
| | | <template #footer> |
| | | <PopConfirmButton title="ç¡®å®æ¾å¼ç¼è¾ï¼" @confirm="closeDrawer" okText="ç¡®å®" cancelText="åæ¶">åæ¶</PopConfirmButton> |
| | | <a-button @click="handleSubmit(false)" type="primary" :loading="loading" ghost |
| | | style="margin-right: 0.8rem">ä»
ä¿å</a-button> |
| | | <a-button @click="handleSubmit(true)" type="primary" :loading="loading">ä¿åå¹¶å
³é</a-button> |
| | | </template> |
| | | <RoleDataRuleDrawer @register="registerDrawer1" /> |
| | | </BasicDrawer> |
| | | </template> |
| | | <script lang="ts" setup> |
| | | import { ref, computed, unref, onMounted } from 'vue' |
| | | import { BasicDrawer, useDrawer, useDrawerInner } from '/src/components/Drawer' |
| | | import { BasicTree, TreeItem } from '/src/components/Tree' |
| | | import { PopConfirmButton } from '/@/components/Button' |
| | | import RoleDataRuleDrawer from './RoleDataRuleDrawer.vue' |
| | | import { queryTreeListForRole, queryRolePermission, saveRolePermission } from '../role.api' |
| | | const emit = defineEmits(['register']) |
| | | //æ çä¿¡æ¯ |
| | | const treeData = ref<TreeItem[]>([]) |
| | | //æ çå
¨é¨èç¹ä¿¡æ¯ |
| | | const allTreeKeys = ref([]) |
| | | //æ çéæ©èç¹ä¿¡æ¯ |
| | | const checkedKeys = ref([]) |
| | | const defaultCheckedKeys = ref([]) |
| | | //æ çéä¸çèç¹ä¿¡æ¯ |
| | | const selectedKeys = ref([]) |
| | | const roleId = ref('') |
| | | //æ çå®ä¾ |
| | | const treeRef = ref(null) |
| | | const loading = ref(false) |
| | | |
| | | //å±å¼æå çkey |
| | | const expandedKeys = ref<any>([]) |
| | | //ç¶åèç¹éä¸ç¶ææ¯å¦å
³è |
| | | const checkStrictly = ref<boolean>(true) |
| | | const [registerDrawer1, { openDrawer: openDataRuleDrawer }] = useDrawer() |
| | | const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => { |
| | | await reset() |
| | | setDrawerProps({ confirmLoading: false, loading: true }) |
| | | roleId.value = data.roleId |
| | | //åå§åæ°æ® |
| | | const roleResult = await queryTreeListForRole() |
| | | treeData.value = roleResult.treeList |
| | | allTreeKeys.value = roleResult.ids |
| | | expandedKeys.value = roleResult.ids |
| | | //åå§åè§è²èåæ°æ® |
| | | const permResult = await queryRolePermission({ roleId: unref(roleId) }) |
| | | checkedKeys.value = permResult |
| | | defaultCheckedKeys.value = permResult |
| | | setDrawerProps({ loading: false }) |
| | | }) |
| | | /** |
| | | * ç¹å»éä¸ |
| | | */ |
| | | function onCheck(o) { |
| | | checkedKeys.value = o.checked ? o.checked : o |
| | | } |
| | | /** |
| | | * éä¸èç¹ï¼æå¼æ°æ®æéæ½å± |
| | | */ |
| | | function onTreeNodeSelect(key) { |
| | | if (key && key.length > 0) { |
| | | selectedKeys.value = key |
| | | } |
| | | openDataRuleDrawer(true, { functionId: unref(selectedKeys)[0], roleId: unref(roleId) }) |
| | | } |
| | | /** |
| | | * æ°æ®éç½® |
| | | */ |
| | | function reset() { |
| | | treeData.value = [] |
| | | allTreeKeys.value = [] |
| | | checkedKeys.value = [] |
| | | defaultCheckedKeys.value = [] |
| | | selectedKeys.value = [] |
| | | roleId.value = '' |
| | | } |
| | | /** |
| | | * è·åtreeå®ä¾ |
| | | */ |
| | | function getTree() { |
| | | const tree = unref(treeRef) |
| | | if (!tree) { |
| | | throw new Error('tree is null!') |
| | | } |
| | | return tree |
| | | } |
| | | /** |
| | | * æäº¤ |
| | | */ |
| | | async function handleSubmit(exit) { |
| | | let params = { |
| | | roleId: unref(roleId), |
| | | permissionIds: unref(getTree().getCheckedKeys()).join(','), |
| | | lastpermissionIds: unref(defaultCheckedKeys).join(','), |
| | | } |
| | | //update-begin-author:taoyan date:2023-2-11 for: issues/352 VUEè§è²ææéå¤ä¿å |
| | | if (loading.value === false) { |
| | | await doSave(params) |
| | | } else { |
| | | console.log('请çå¾
䏿¬¡æ§è¡å®æ¯!') |
| | | } |
| | | if (exit) { |
| | | // 妿å
³é |
| | | closeDrawer() |
| | | } else { |
| | | // 没æå
³ééè¦éæ°è·åé䏿°æ® |
| | | const permResult = await queryRolePermission({ roleId: unref(roleId) }) |
| | | defaultCheckedKeys.value = permResult |
| | | } |
| | | } |
| | | |
| | | // VUEè§è²ææéå¤ä¿å #352 |
| | | async function doSave(params) { |
| | | loading.value = true |
| | | await saveRolePermission(params) |
| | | setTimeout(() => { |
| | | loading.value = false |
| | | }, 500) |
| | | } |
| | | //update-end-author:taoyan date:2023-2-11 for: issues/352 VUEè§è²ææéå¤ä¿å |
| | | |
| | | /** |
| | | * æ èåéæ© |
| | | * @param key |
| | | */ |
| | | function treeMenuClick({ key }) { |
| | | if (key === 'checkAll') { |
| | | checkedKeys.value = allTreeKeys.value |
| | | } else if (key === 'cancelCheck') { |
| | | checkedKeys.value = [] |
| | | } else if (key === 'openAll') { |
| | | expandedKeys.value = allTreeKeys.value |
| | | } else if (key === 'closeAll') { |
| | | expandedKeys.value = [] |
| | | } else if (key === 'relation') { |
| | | checkStrictly.value = false |
| | | } else { |
| | | checkStrictly.value = true |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style lang="less" scoped> |
| | | /** åºå®æä½æé® */ |
| | | .jeecg-basic-tree { |
| | | position: absolute; |
| | | width: 618px; |
| | | } |
| | | |
| | | //update-begin---author:wangshuai ---date:20230202 forï¼æ½å±å¼¹çªæ é¢å¾æ ä¸ææ ·å¼------------ |
| | | .line { |
| | | height: 1px; |
| | | width: 100%; |
| | | border-bottom: 1px solid #f0f0f0; |
| | | } |
| | | |
| | | .more-icon { |
| | | font-size: 20px !important; |
| | | color: black; |
| | | display: inline-flex; |
| | | float: right; |
| | | margin-right: 2px; |
| | | cursor: pointer; |
| | | } |
| | | |
| | | :deep(.jeecg-tree-header) { |
| | | border-bottom: none; |
| | | } |
| | | |
| | | //update-end---author:wangshuai ---date:20230202 forï¼æ½å±å¼¹çªæ é¢å¾æ ä¸ææ ·å¼------------ |
| | | </style> |