Commit 6860bef5dd9c5abc0d2bd191dfb1ab74cb75ca8c
1 parent
ad0b74c2
fix: role manange not save half checked menu keys
Showing
3 changed files
with
46 additions
and
16 deletions
@@ -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, |