PermissionTreeCard.vue 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. <template>
  2. <el-card style="width: 100%">
  3. <template #header>
  4. <section class="title">{{ title }}</section>
  5. <section>
  6. <el-checkbox label="全部展开 / 全部收起" @change="expandAll" />
  7. <el-checkbox label="全选 / 全不选" @change="checkAll" />
  8. </section>
  9. </template>
  10. <el-tree
  11. ref="treeInstance"
  12. :data="treeData"
  13. node-key="value"
  14. show-checkbox
  15. :expand-on-click-node="false"
  16. @check="onNodeCheck"
  17. />
  18. </el-card>
  19. </template>
  20. <script setup lang="ts">
  21. import { ref, shallowRef } from 'vue';
  22. import { ElTree } from 'element-plus';
  23. import { PermissionViewTree, PermissionTreeKey } from '@/types/permission/type';
  24. defineProps<{
  25. title: string;
  26. treeData: PermissionViewTree;
  27. }>();
  28. const treeInstance = ref<InstanceType<typeof ElTree>>();
  29. const leafCheckedKeys = shallowRef<PermissionTreeKey[]>([]);
  30. /**
  31. * 当check树节点时,获取其下的所有leaf节点的值
  32. */
  33. const onNodeCheck = () => {
  34. leafCheckedKeys.value = treeInstance.value?.getCheckedKeys(true)!;
  35. };
  36. /**
  37. * 全部展开 / 全部收起
  38. * @param expanded
  39. */
  40. const expandAll = (expanded: boolean) => {
  41. treeInstance.value?.store._getAllNodes().forEach(node => node.expanded = expanded);
  42. };
  43. /**
  44. * 全选 / 全不选
  45. * @param checked
  46. */
  47. const checkAll = (checked: boolean) => {
  48. leafCheckedKeys.value = checked ? getAllLeafKeys() : [];
  49. treeInstance.value?.setCheckedKeys(leafCheckedKeys.value);
  50. };
  51. /**
  52. * 获取所有叶子节点的 node-key
  53. */
  54. const getAllLeafKeys = () => {
  55. return treeInstance.value?.store._getAllNodes()
  56. .filter(node => node.isLeaf)
  57. .map(node => node.data.value) as PermissionTreeKey[];
  58. };
  59. /**
  60. * 编辑角色时,勾选已分配的权限
  61. */
  62. const setAssignedPermissions = (keys: PermissionTreeKey[], keyPrefix = '') => {
  63. if (keyPrefix) {
  64. keys = keys.map(key => `${keyPrefix}-${key}`);
  65. }
  66. treeInstance.value?.setCheckedKeys(keys, true);
  67. leafCheckedKeys.value = keys;
  68. };
  69. /**
  70. * 返回选择的权限值.
  71. * 权限值可能是 相机ID、菜单ID、或 权限ID
  72. */
  73. const getSelectedPermissions = (): PermissionTreeKey[] => {
  74. return [ ...leafCheckedKeys.value ];
  75. };
  76. /**
  77. * 重置
  78. */
  79. const reset = () => {
  80. checkAll(false);
  81. }
  82. defineExpose({ getSelectedPermissions, reset, setAssignedPermissions });
  83. </script>
  84. <style scoped>
  85. .el-card + .el-card {
  86. margin-top: 10px;
  87. }
  88. :deep(.el-card__header) {
  89. padding: 10px;
  90. }
  91. .title:before {
  92. content: '';
  93. margin-right: 10px;
  94. border-left: 3px solid #1890ff;
  95. }
  96. </style>