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, | ... | ... |