Skip to content

Commit 3accbe5

Browse files
committed
fix: 修复菜单页面搜索异常
1 parent cbd7104 commit 3accbe5

File tree

3 files changed

+85
-8
lines changed

3 files changed

+85
-8
lines changed

src/pages/system/menu/SysMenuPage.tsx

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
1-
import { useState, useRef } from 'react';
1+
import { useRef, useState } from 'react';
22
import type { SysI18nListVo, SysMenuDto, SysMenuQo, SysMenuVo } from '@/services/ballcat/system';
3+
import { i18n, menu } from '@/services/ballcat/system';
34
import type { ActionType, ProColumns } from '@ant-design/pro-table';
45
import { EditableProTable } from '@ant-design/pro-table';
56
import type { FormStatus, ModalFormRef } from '@/components/Form';
6-
import Form, { FormNumber } from '@/components/Form';
7-
import { FormDictRadio } from '@/components/Form';
7+
import Form, { FormDictRadio, FormNumber } from '@/components/Form';
88
import { ProFormRadio, ProFormSelect, ProFormText, ProFormTextArea } from '@ant-design/pro-form';
99
import Page from '@/components/Page';
10-
import { message, Button, Form as AntdForm, Modal, TreeSelect, Typography } from 'antd';
11-
import { menu, i18n } from '@/services/ballcat/system';
10+
import { Button, Form as AntdForm, message, Modal, TreeSelect, Typography } from 'antd';
1211
import TreeUtils from '@/utils/TreeUtils';
1312
import Icon, { IconSelect } from '@/components/Icon';
1413
import I18n from '@/utils/I18nUtils';
1514
import Auth from '@/components/Auth';
1615
import SysI18nCreate from '@/pages/i18n/SysI18nCreate';
1716
import { DownOutlined, EditTwoTone, UpOutlined } from '@ant-design/icons';
1817
import { settings } from '@/utils/ConfigUtils';
18+
import { FormInstance } from 'antd/es';
1919

2020
const isBtn = (data: SysMenuVo | any) => {
2121
return data.type === 2 || data === 2;
@@ -29,6 +29,7 @@ const isDir = (data: SysMenuVo | any) => {
2929
};
3030

3131
export default () => {
32+
const searchFormRef = useRef<FormInstance>();
3233
const formRef = useRef<ModalFormRef<SysMenuDto>>();
3334
const tableRef = useRef<ActionType>();
3435
const [status, setStatus] = useState<FormStatus>(undefined);
@@ -144,6 +145,14 @@ export default () => {
144145
<>
145146
<Page.Modal<SysMenuVo, SysMenuQo, SysMenuDto>
146147
{...menu}
148+
query={(params) => {
149+
return menu.query({
150+
size: params.size,
151+
current: params.current,
152+
sortFields: params.sortFields,
153+
sortOrders: params.sortOrders,
154+
});
155+
}}
147156
title="菜单权限"
148157
rowKey="id"
149158
columns={dataColumns}
@@ -186,6 +195,7 @@ export default () => {
186195
}}
187196
tableProps={{
188197
pagination: false,
198+
formRef: searchFormRef,
189199
expandable: { expandIconColumnIndex: 1 },
190200
postData: (data) => {
191201
const treeData = TreeUtils.ofList(data, 0, (item) => {
@@ -202,7 +212,30 @@ export default () => {
202212
});
203213
treeSelectData[0].children = treeData;
204214
setTreeSelectData(treeSelectData);
205-
return treeData;
215+
return TreeUtils.treeFilter(
216+
treeData,
217+
(item) => {
218+
const queryParams = searchFormRef.current?.getFieldsValue();
219+
let show = true;
220+
if (show && queryParams.id) {
221+
show = String(item.id) === queryParams.id;
222+
}
223+
224+
if (show && queryParams.path && queryParams.path.length > 0) {
225+
show = item.path === queryParams.path;
226+
}
227+
228+
if (show && queryParams.title) {
229+
show =
230+
(item.i18nTitle && item.i18nTitle.indexOf(queryParams.title) > -1) ||
231+
(item.title && item.title.indexOf(queryParams.title) > -1);
232+
}
233+
return show;
234+
},
235+
(_, children) => {
236+
return isBtn(children[0]);
237+
},
238+
);
206239
},
207240
}}
208241
formProps={{ titleSuffix: '菜单' }}

src/typings.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ export type QueryParam<T> = {
3636
size: number;
3737
sortFields: string[];
3838
sortOrders: ('desc' | 'asc')[];
39-
} & T;
39+
} & Partial<T>;
4040

4141
export type PageResult<T> = {
4242
total: number;

src/utils/TreeUtils.ts

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,4 +116,48 @@ export function toTreeData<T>(
116116
return treeData.length > 0 ? treeData : undefined;
117117
}
118118

119-
export default { ofList, toTreeSelectData, toTreeData };
119+
/**
120+
* 树形结构过滤
121+
* @param data 树形结构数据
122+
* @param filter 过滤函数, 判断当前数据是否展示
123+
* @param showParent 判断在当前数据不展示的情况下, 有子级要展示时是否展示自己
124+
* @param cField 子级字段名称
125+
*/
126+
export function treeFilter<T>(
127+
data: T[],
128+
filter: (item: T) => boolean = () => true,
129+
showParent: (item: T, children: T[]) => boolean = () => true,
130+
cField = 'children',
131+
) {
132+
const filterData: T[] = [];
133+
134+
data.forEach((item) => {
135+
// 自己是否展示
136+
const showSelf = filter(item);
137+
// 获取需要展示的子级
138+
let children: any[] | undefined = treeFilter(item[cField] || [], filter, showParent, cField);
139+
children = children && children.length > 0 ? children : undefined;
140+
const fd = { ...item };
141+
// 如果展示自己
142+
if (showSelf) {
143+
fd[cField] = children;
144+
filterData.push(fd);
145+
}
146+
// 有子级要展示
147+
else if (children && children.length > 0) {
148+
// @ts-ignore 展示父级
149+
if (showParent(item, children)) {
150+
fd[cField] = children;
151+
filterData.push(fd);
152+
}
153+
// 不展示父级, 把子级提权到父级
154+
else {
155+
// @ts-ignore
156+
filterData.push(...children);
157+
}
158+
}
159+
});
160+
return filterData;
161+
}
162+
163+
export default { ofList, toTreeSelectData, toTreeData, treeFilter };

0 commit comments

Comments
 (0)