Files
nestjs-admin/admin/src/pages/role/index.tsx
2024-10-26 17:37:09 +08:00

172 lines
3.7 KiB
TypeScript

import React, {useEffect, useState} from 'react';
import {
Button,
Card,
Message,
PaginationProps,
Table,
TableColumnProps,
Typography
} from '@arco-design/web-react';
import {useHistory} from "react-router";
import {useQuery} from 'react-query';
import Form from './form';
import {IconPlus} from '@arco-design/web-react/icon';
import {getColumns, TableOptions} from './constants';
import {getRole,deleteRole} from "@/api/role";
import GrantRolesForm from "./grantPerm";
import SearchForm from "./searchForm";
const {Title} = Typography;
function UserManage() {
const reactQueryKey = useHistory().location.pathname
const [visible, setVisible] = useState(false);
const [visibleAssignRoles, setVisibleAssignRoles] = useState(false);
const [record, setRecord] = useState(null);
const [pagination, setPagination] = useState<PaginationProps>({
sizeCanChange: true,
showTotal: true,
pageSize: 10,
current: 1,
pageSizeChangeResetCurrent: true,
total: 0
});
const [searchQuery, setSearchQuery] = useState<Record<string, any>>({
page: pagination.current,
pageSize: pagination.pageSize,
});
const showAssignRolesModal = (payload) => {
setRecord(payload);
setVisibleAssignRoles(true);
};
const showModal = (payload?) => {
payload && setRecord(payload);
setVisible(true);
};
const onDelete = async ({id}) => {
await deleteRole(id);
Message.success('删除成功!');
await refetch();
};
const tableCallback = async (type: TableOptions, record: any) => {
switch (type) {
case TableOptions.EDIT:
showModal(record)
break;
case TableOptions.DELETE:
await onDelete(record);
break
case TableOptions.ASSIGN_PERMISSION:
showAssignRolesModal(record);
break
}
}
const columns: TableColumnProps[] = getColumns(tableCallback)
const handleSearch = async (params) => {
setSearchQuery(prev => ({...prev, page: 1, ...params}))
}
const onChangeTable = async ({current, pageSize}) => {
setSearchQuery(prev => ({...prev, page: current, pageSize}));
};
const fetchData = async ({queryKey}) => {
const [, params] = queryKey;
const {data} = await getRole(params);
setPagination(prev => ({
...prev,
total: data.count
}))
// 当前列表不存在数据回退1页
if (params.page > 1 && data.list.length === 0) {
setSearchQuery({
...searchQuery,
page: params.page - 1
});
}
return data;
};
const {data, isLoading, isFetching, refetch} = useQuery(
[reactQueryKey, {
page: pagination.current,
pageSize: pagination.pageSize,
...searchQuery
}],
fetchData);
const handleConfirm = async () => {
setRecord(null);
setVisible(false);
setVisibleAssignRoles(false);
await refetch();
};
const handleCancel = () => {
setRecord(null);
setVisible(false);
setVisibleAssignRoles(false);
};
useEffect(() => {
setPagination(prev => ({
...prev,
current: searchQuery.page,
pageSize: pagination.pageSize,
}))
}, [searchQuery])
return (
<>
<Card>
<Form
handleConfirm={handleConfirm}
handleCancel={handleCancel}
visible={visible}
record={record}
/>
<GrantRolesForm
handleConfirm={handleConfirm}
handleCancel={handleCancel}
visible={visibleAssignRoles}
record={record}
/>
<Title heading={6}></Title>
<SearchForm onSearch={handleSearch}/>
<Button
style={{marginBottom: 12}}
type="primary"
icon={<IconPlus/>}
onClick={() => showModal()}
>
</Button>
<Table
rowKey="id"
loading={isLoading || isFetching}
columns={columns}
onChange={onChangeTable}
pagination={pagination}
data={data?.list}
/>
</Card>
</>
);
}
export default UserManage;