Commit 6860bef5dd9c5abc0d2bd191dfb1ab74cb75ca8c

Authored by ww
1 parent ad0b74c2

fix: role manange not save half checked menu keys

@@ -46,4 +46,5 @@ export interface MenuRecord { @@ -46,4 +46,5 @@ export interface MenuRecord {
46 icon?: string; 46 icon?: string;
47 title?: string; 47 title?: string;
48 key?: string; 48 key?: string;
  49 + checked?: boolean;
49 } 50 }
@@ -66,8 +66,6 @@ @@ -66,8 +66,6 @@
66 showActionButtonGroup: false, 66 showActionButtonGroup: false,
67 }); 67 });
68 68
69 - const originMenus = ref();  
70 -  
71 const transformName = (data: TreeData[]) => { 69 const transformName = (data: TreeData[]) => {
72 return data.map((item) => { 70 return data.map((item) => {
73 item.name = t(item.name); 71 item.name = t(item.name);
@@ -81,8 +79,6 @@ @@ -81,8 +79,6 @@
81 const userStore = useUserStore(); 79 const userStore = useUserStore();
82 const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => { 80 const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => {
83 allCheckedKeys.value = []; 81 allCheckedKeys.value = [];
84 - originMenus.value = [];  
85 - allCheckedKeys.value.length = 0;  
86 resetFields(); 82 resetFields();
87 roleId.value = ''; 83 roleId.value = '';
88 // 在打开弹窗时清除所有选择的菜单 84 // 在打开弹窗时清除所有选择的菜单
@@ -110,13 +106,12 @@ @@ -110,13 +106,12 @@
110 106
111 // 更新 107 // 更新
112 if (unref(isUpdate)) { 108 if (unref(isUpdate)) {
113 - allCheckedKeys.value = [];  
114 checked.value = []; 109 checked.value = [];
115 roleId.value = data.record.id; 110 roleId.value = data.record.id;
116 111
117 //通过角色id去获取角色对应的菜单的ids 112 //通过角色id去获取角色对应的菜单的ids
118 - originMenus.value = roleMenus.value = await getMenusIdsByRoleId(data.record.id);  
119 - 113 + allCheckedKeys.value = roleMenus.value = await getMenusIdsByRoleId(data.record.id);
  114 + excludeHalfCheckedKeys(unref(treeData));
120 await nextTick(); 115 await nextTick();
121 treeRef.value.setCheckedKeys(roleMenus.value); 116 treeRef.value.setCheckedKeys(roleMenus.value);
122 setFieldsValue(data.record); 117 setFieldsValue(data.record);
@@ -141,7 +136,7 @@ @@ -141,7 +136,7 @@
141 name: values.name, 136 name: values.name,
142 remark: values.remark, 137 remark: values.remark,
143 status: values.status, 138 status: values.status,
144 - menu: unref(treeRef).getCheckedKeys() || [], 139 + menu: unref(allCheckedKeys) || [],
145 }; 140 };
146 if (req.menu == undefined) return createMessage.error('请勾选权限菜单'); 141 if (req.menu == undefined) return createMessage.error('请勾选权限菜单');
147 saveOrUpdateRoleInfoWithMenu(req).then(() => { 142 saveOrUpdateRoleInfoWithMenu(req).then(() => {
@@ -226,6 +221,25 @@ @@ -226,6 +221,25 @@
226 return result; 221 return result;
227 }; 222 };
228 223
  224 + const excludeHalfCheckedKeys = (treeData: MenuRecord[]) => {
  225 + const needExcludeKeys: string[] = [];
  226 + const query = (data: MenuRecord[]) => {
  227 + data.forEach((item) => {
  228 + item.checked = roleMenus.value.includes(item.id);
  229 + if (item.children && item.children.length) {
  230 + query(item.children);
  231 + item.checked = item.children.every((item) => item.checked);
  232 + }
  233 + if (!item.checked) {
  234 + needExcludeKeys.push(item.id);
  235 + }
  236 + });
  237 + };
  238 + query(treeData);
  239 + roleMenus.value = unref(roleMenus).filter((key) => !needExcludeKeys.includes(key));
  240 + return needExcludeKeys;
  241 + };
  242 +
229 return { 243 return {
230 spinning, 244 spinning,
231 registerDrawer, 245 registerDrawer,
@@ -52,7 +52,7 @@ @@ -52,7 +52,7 @@
52 emits: ['success', 'register'], 52 emits: ['success', 'register'],
53 setup(_, { emit }) { 53 setup(_, { emit }) {
54 const isUpdate = ref(true); 54 const isUpdate = ref(true);
55 - const treeData = ref<TreeItem[]>([]); 55 + const treeData = ref<TreeData[]>([]);
56 const roleMenus = ref<string[]>([]); 56 const roleMenus = ref<string[]>([]);
57 const allCheckedKeys = ref<string[]>([]); 57 const allCheckedKeys = ref<string[]>([]);
58 const roleId = ref(''); 58 const roleId = ref('');
@@ -66,8 +66,6 @@ @@ -66,8 +66,6 @@
66 showActionButtonGroup: false, 66 showActionButtonGroup: false,
67 }); 67 });
68 68
69 - const originMenus = ref();  
70 -  
71 const transformName = (data: TreeData[]) => { 69 const transformName = (data: TreeData[]) => {
72 return data.map((item) => { 70 return data.map((item) => {
73 item.name = t(item.name); 71 item.name = t(item.name);
@@ -80,8 +78,6 @@ @@ -80,8 +78,6 @@
80 78
81 const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => { 79 const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => {
82 allCheckedKeys.value = []; 80 allCheckedKeys.value = [];
83 - originMenus.value = [];  
84 - allCheckedKeys.value.length = 0;  
85 resetFields(); 81 resetFields();
86 roleId.value = ''; 82 roleId.value = '';
87 // 在打开弹窗时清除所有选择的菜单 83 // 在打开弹窗时清除所有选择的菜单
@@ -108,12 +104,12 @@ @@ -108,12 +104,12 @@
108 104
109 // 更新 105 // 更新
110 if (unref(isUpdate)) { 106 if (unref(isUpdate)) {
111 - allCheckedKeys.value = [];  
112 checked.value = []; 107 checked.value = [];
113 roleId.value = data.record.id; 108 roleId.value = data.record.id;
114 109
115 //通过角色id去获取角色对应的菜单的ids 110 //通过角色id去获取角色对应的菜单的ids
116 - originMenus.value = roleMenus.value = await getMenusIdsByRoleId(data.record.id); 111 + allCheckedKeys.value = roleMenus.value = await getMenusIdsByRoleId(data.record.id);
  112 + excludeHalfCheckedKeys(unref(treeData));
117 113
118 await nextTick(); 114 await nextTick();
119 treeRef.value.setCheckedKeys(roleMenus.value); 115 treeRef.value.setCheckedKeys(roleMenus.value);
@@ -140,7 +136,7 @@ @@ -140,7 +136,7 @@
140 remark: values.remark, 136 remark: values.remark,
141 status: values.status, 137 status: values.status,
142 roleType: RoleEnum.TENANT_ADMIN, 138 roleType: RoleEnum.TENANT_ADMIN,
143 - menu: unref(treeRef).getCheckedKeys() || [], 139 + menu: unref(allCheckedKeys) || [],
144 }; 140 };
145 if (req.menu == undefined) return createMessage.error('请勾选权限菜单'); 141 if (req.menu == undefined) return createMessage.error('请勾选权限菜单');
146 const res = await saveOrUpdateRoleInfoWithMenu(req); 142 const res = await saveOrUpdateRoleInfoWithMenu(req);
@@ -229,6 +225,25 @@ @@ -229,6 +225,25 @@
229 return result; 225 return result;
230 }; 226 };
231 227
  228 + const excludeHalfCheckedKeys = (treeData: MenuRecord[]) => {
  229 + const needExcludeKeys: string[] = [];
  230 + const query = (data: MenuRecord[]) => {
  231 + data.forEach((item) => {
  232 + item.checked = roleMenus.value.includes(item.id);
  233 + if (item.children && item.children.length) {
  234 + query(item.children);
  235 + item.checked = item.children.every((item) => item.checked);
  236 + }
  237 + if (!item.checked) {
  238 + needExcludeKeys.push(item.id);
  239 + }
  240 + });
  241 + };
  242 + query(treeData);
  243 + roleMenus.value = unref(roleMenus).filter((key) => !needExcludeKeys.includes(key));
  244 + return needExcludeKeys;
  245 + };
  246 +
232 return { 247 return {
233 spinning, 248 spinning,
234 registerDrawer, 249 registerDrawer,