Commit 7e5ba48442f736999ca18ffb07e4616bc7202d0f

Authored by xp.Huang
2 parents cc270f03 6860bef5

Merge branch 'ww' into 'main'

fix: role manange not save half checked menu keys

See merge request huang/yun-teng-iot-front!468
... ... @@ -46,4 +46,5 @@ export interface MenuRecord {
46 46 icon?: string;
47 47 title?: string;
48 48 key?: string;
  49 + checked?: boolean;
49 50 }
... ...
... ... @@ -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,
... ...