Commit 7e5ba48442f736999ca18ffb07e4616bc7202d0f
Merge branch 'ww' into 'main'
fix: role manange not save half checked menu keys See merge request huang/yun-teng-iot-front!468
Showing
4 changed files
with
48 additions
and
18 deletions
... | ... | @@ -16,10 +16,10 @@ |
16 | 16 | v-bind="getPopConfirmAttrs(item.popConfirm)" |
17 | 17 | > |
18 | 18 | <template #icon v-if="item.popConfirm.icon"> |
19 | - <Icon :icon="item.popConfirm.icon" /> | |
19 | + <Icon :icon="item.popConfirm.icon" class="mr-2" /> | |
20 | 20 | </template> |
21 | 21 | <div> |
22 | - <Icon :icon="item.icon" v-if="item.icon" /> | |
22 | + <Icon :icon="item.icon" v-if="item.icon" class="mr-2" /> | |
23 | 23 | <span class="ml-1">{{ item.text }}</span> |
24 | 24 | </div> |
25 | 25 | </Popconfirm> | ... | ... |
... | ... | @@ -66,8 +66,6 @@ |
66 | 66 | showActionButtonGroup: false, |
67 | 67 | }); |
68 | 68 | |
69 | - const originMenus = ref(); | |
70 | - | |
71 | 69 | const transformName = (data: TreeData[]) => { |
72 | 70 | return data.map((item) => { |
73 | 71 | item.name = t(item.name); |
... | ... | @@ -81,8 +79,6 @@ |
81 | 79 | const userStore = useUserStore(); |
82 | 80 | const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => { |
83 | 81 | allCheckedKeys.value = []; |
84 | - originMenus.value = []; | |
85 | - allCheckedKeys.value.length = 0; | |
86 | 82 | resetFields(); |
87 | 83 | roleId.value = ''; |
88 | 84 | // 在打开弹窗时清除所有选择的菜单 |
... | ... | @@ -110,13 +106,12 @@ |
110 | 106 | |
111 | 107 | // 更新 |
112 | 108 | if (unref(isUpdate)) { |
113 | - allCheckedKeys.value = []; | |
114 | 109 | checked.value = []; |
115 | 110 | roleId.value = data.record.id; |
116 | 111 | |
117 | 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 | 115 | await nextTick(); |
121 | 116 | treeRef.value.setCheckedKeys(roleMenus.value); |
122 | 117 | setFieldsValue(data.record); |
... | ... | @@ -141,7 +136,7 @@ |
141 | 136 | name: values.name, |
142 | 137 | remark: values.remark, |
143 | 138 | status: values.status, |
144 | - menu: unref(treeRef).getCheckedKeys() || [], | |
139 | + menu: unref(allCheckedKeys) || [], | |
145 | 140 | }; |
146 | 141 | if (req.menu == undefined) return createMessage.error('请勾选权限菜单'); |
147 | 142 | saveOrUpdateRoleInfoWithMenu(req).then(() => { |
... | ... | @@ -226,6 +221,25 @@ |
226 | 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 | 243 | return { |
230 | 244 | spinning, |
231 | 245 | registerDrawer, | ... | ... |
... | ... | @@ -52,7 +52,7 @@ |
52 | 52 | emits: ['success', 'register'], |
53 | 53 | setup(_, { emit }) { |
54 | 54 | const isUpdate = ref(true); |
55 | - const treeData = ref<TreeItem[]>([]); | |
55 | + const treeData = ref<TreeData[]>([]); | |
56 | 56 | const roleMenus = ref<string[]>([]); |
57 | 57 | const allCheckedKeys = ref<string[]>([]); |
58 | 58 | const roleId = ref(''); |
... | ... | @@ -66,8 +66,6 @@ |
66 | 66 | showActionButtonGroup: false, |
67 | 67 | }); |
68 | 68 | |
69 | - const originMenus = ref(); | |
70 | - | |
71 | 69 | const transformName = (data: TreeData[]) => { |
72 | 70 | return data.map((item) => { |
73 | 71 | item.name = t(item.name); |
... | ... | @@ -80,8 +78,6 @@ |
80 | 78 | |
81 | 79 | const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => { |
82 | 80 | allCheckedKeys.value = []; |
83 | - originMenus.value = []; | |
84 | - allCheckedKeys.value.length = 0; | |
85 | 81 | resetFields(); |
86 | 82 | roleId.value = ''; |
87 | 83 | // 在打开弹窗时清除所有选择的菜单 |
... | ... | @@ -108,12 +104,12 @@ |
108 | 104 | |
109 | 105 | // 更新 |
110 | 106 | if (unref(isUpdate)) { |
111 | - allCheckedKeys.value = []; | |
112 | 107 | checked.value = []; |
113 | 108 | roleId.value = data.record.id; |
114 | 109 | |
115 | 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 | 114 | await nextTick(); |
119 | 115 | treeRef.value.setCheckedKeys(roleMenus.value); |
... | ... | @@ -140,7 +136,7 @@ |
140 | 136 | remark: values.remark, |
141 | 137 | status: values.status, |
142 | 138 | roleType: RoleEnum.TENANT_ADMIN, |
143 | - menu: unref(treeRef).getCheckedKeys() || [], | |
139 | + menu: unref(allCheckedKeys) || [], | |
144 | 140 | }; |
145 | 141 | if (req.menu == undefined) return createMessage.error('请勾选权限菜单'); |
146 | 142 | const res = await saveOrUpdateRoleInfoWithMenu(req); |
... | ... | @@ -229,6 +225,25 @@ |
229 | 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 | 247 | return { |
233 | 248 | spinning, |
234 | 249 | registerDrawer, | ... | ... |