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,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 }
@@ -16,10 +16,10 @@ @@ -16,10 +16,10 @@
16 v-bind="getPopConfirmAttrs(item.popConfirm)" 16 v-bind="getPopConfirmAttrs(item.popConfirm)"
17 > 17 >
18 <template #icon v-if="item.popConfirm.icon"> 18 <template #icon v-if="item.popConfirm.icon">
19 - <Icon :icon="item.popConfirm.icon" /> 19 + <Icon :icon="item.popConfirm.icon" class="mr-2" />
20 </template> 20 </template>
21 <div> 21 <div>
22 - <Icon :icon="item.icon" v-if="item.icon" /> 22 + <Icon :icon="item.icon" v-if="item.icon" class="mr-2" />
23 <span class="ml-1">{{ item.text }}</span> 23 <span class="ml-1">{{ item.text }}</span>
24 </div> 24 </div>
25 </Popconfirm> 25 </Popconfirm>
@@ -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,