FormModalAssignMenu.vue 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. <template>
  2. <BasicModal
  3. v-bind="$attrs"
  4. destroyOnClose
  5. @register="registerModal"
  6. title="分配菜单"
  7. @ok="handleSubmit"
  8. >
  9. <BasicTree
  10. :checkedKeys="checkedKeys"
  11. :treeData="treeData"
  12. checkable
  13. @check="handleCheck"
  14. :defaultExpandAll="true"
  15. :multiple="true"
  16. :fieldNames="{ key: 'id', title: 'name' }"
  17. />
  18. </BasicModal>
  19. </template>
  20. <script lang="ts" setup>
  21. import { onMounted, ref } from 'vue';
  22. import { BasicModal, useModalInner } from '/@/components/Modal';
  23. import { useMessage } from '/@/hooks/web/useMessage';
  24. import { BasicTree } from '/@/components/Tree';
  25. import { sysPackageAssign, sysPackageQueryMenuTree } from '/@/api/sys/sysTenantPackageApi';
  26. import { sysMenuQueryTree } from '/@/api/sys/sysMenuApi';
  27. const emit = defineEmits(['success', 'register']);
  28. const treeData = ref([]) as any;
  29. const packageId = ref();
  30. const checkedKeys = ref([]);
  31. const halfCheckedKeys = ref([]);
  32. const parentIds = ref([]) as any;
  33. onMounted(() => {
  34. getTreeData();
  35. });
  36. const { createMessage, createConfirm } = useMessage();
  37. const [registerModal, { setModalProps, closeModal }] = useModalInner(async data => {
  38. setModalProps({ confirmLoading: false });
  39. packageId.value = data.record.id;
  40. // 获取已选中列表
  41. const roleMenuList = (await sysPackageQueryMenuTree(packageId.value)) || [];
  42. debugger;
  43. // 找出菜单的所有父节点ID
  44. treeData.value.map(item => {
  45. if (item.children.length) {
  46. item.children.map(ele => {
  47. if (ele.children.length) {
  48. parentIds.value.push(ele.id);
  49. }
  50. });
  51. }
  52. parentIds.value.push(item.id);
  53. });
  54. // 因为antd树插件勾选父节点会导致所有子节点选中,所以过滤所有父节点
  55. halfCheckedKeys.value = Array.from(parentIds.value);
  56. checkedKeys.value = roleMenuList
  57. .filter(
  58. item =>
  59. (!parentIds.value.includes(item.id) && item.parentId != '0') || item.menuType == 'menu',
  60. )
  61. .map(item => item.id);
  62. });
  63. // 树节点选中事件
  64. function handleCheck(keys, e) {
  65. halfCheckedKeys.value = e.halfCheckedKeys;
  66. checkedKeys.value = keys;
  67. }
  68. // 提交按钮事件
  69. async function handleSubmit() {
  70. setModalProps({ confirmLoading: true });
  71. try {
  72. createConfirm({
  73. iconType: 'warning',
  74. title: '提示',
  75. content: '确认分配权限?',
  76. onOk: async () => {
  77. await sysPackageAssign({
  78. menuIds: checkedKeys.value.concat(halfCheckedKeys.value),
  79. packageId: packageId.value,
  80. });
  81. createMessage.success('分配成功!');
  82. emit('success', packageId.value);
  83. closeModal();
  84. },
  85. });
  86. } catch (error) {
  87. // console.log('error', error);
  88. createMessage.error((error as unknown as Error).message);
  89. } finally {
  90. setModalProps({ confirmLoading: false });
  91. }
  92. }
  93. // 查询树数据
  94. async function getTreeData() {
  95. treeData.value = await sysMenuQueryTree({});
  96. }
  97. </script>