Files
kra-new/web/src/pages/admins/index.tsx
T

266 lines
6.5 KiB
TypeScript

import { type Admin, type ListAdminsRequest, services } from "@/services";
import type {
ActionType,
ProColumns,
ProDescriptionsItemProps,
} from "@ant-design/pro-components";
import {
FooterToolbar,
PageContainer,
ProDescriptions,
ProTable,
} from "@ant-design/pro-components";
import { FormattedMessage, useIntl } from "@umijs/max";
import { Button, Drawer, message, Popconfirm } from "antd";
import React, { useCallback, useRef, useState } from "react";
import CreateForm from "./components/CreateForm";
import UpdateForm from "./components/UpdateForm";
type AdminQueryParams = {
current?: number;
pageSize?: number;
name?: string;
email?: string;
phone?: string;
};
const handleList = async (params: AdminQueryParams) => {
const filters: string[] = [];
if (params.name) {
filters.push(`name="${params.name}"`);
}
if (params.email) {
filters.push(`email="${params.email}"`);
}
if (params.phone) {
filters.push(`phone="${params.phone}"`);
}
const requestParams: ListAdminsRequest = {
pageSize: params.pageSize,
pageToken: undefined,
filter: filters.join(" AND ") || undefined,
orderBy: undefined,
};
const res = await services.admin.ListAdmins(requestParams);
return {
data: res.admins ?? [],
success: true,
};
};
const TableList: React.FC = () => {
const actionRef = useRef<ActionType | null>(null);
const [showDetail, setShowDetail] = useState<boolean>(false);
const [currentRow, setCurrentRow] = useState<Admin>();
const [selectedRowsState, setSelectedRows] = useState<Admin[]>([]);
const [deleteLoading, setDeleteLoading] = useState(false);
const [messageApi, contextHolder] = message.useMessage();
const intl = useIntl();
/**
* Delete node
*
* @param selectedRows
*/
const handleRemove = useCallback(
async (selectedRows: Admin[]) => {
try {
setDeleteLoading(true);
for (const row of selectedRows) {
await services.admin.DeleteAdmin({ id: row.id });
}
setSelectedRows([]);
actionRef.current?.reloadAndRest?.();
messageApi.success("Deleted successfully and will refresh soon");
} catch {
// Reporting is handled globally in requestErrorConfig.
} finally {
setDeleteLoading(false);
}
},
[messageApi]
);
const columns: ProColumns<Admin>[] = [
{
title: (
<FormattedMessage
id="pages.searchTable.title.name"
defaultMessage="Name"
/>
),
dataIndex: "name",
},
{
title: (
<FormattedMessage
id="pages.searchTable.title.email"
defaultMessage="Email"
/>
),
dataIndex: "email",
},
{
title: (
<FormattedMessage
id="pages.searchTable.title.phone"
defaultMessage="Phone"
/>
),
dataIndex: "phone",
},
{
title: (
<FormattedMessage
id="pages.searchTable.title.access"
defaultMessage="Access"
/>
),
dataIndex: "access",
},
{
title: (
<FormattedMessage
id="pages.searchTable.title.createTime"
defaultMessage="CreateTime"
/>
),
dataIndex: "createTime",
valueType: "dateTime",
},
{
title: (
<FormattedMessage
id="pages.searchTable.title.updateTime"
defaultMessage="UpdateTime"
/>
),
dataIndex: "updateTime",
valueType: "dateTime",
},
{
title: (
<FormattedMessage
id="pages.searchTable.titleOption"
defaultMessage="Operating"
/>
),
dataIndex: "option",
valueType: "option",
render: (_, record) => [
<UpdateForm
trigger={
<a>
<FormattedMessage
id="pages.searchTable.edit"
defaultMessage="Edit"
/>
</a>
}
key="edit"
onOk={actionRef.current?.reload}
values={record}
/>,
<Popconfirm
title="Delete the user"
description="Are you sure to delete this user?"
onConfirm={() => {
handleRemove([record]);
}}
okText="Yes"
cancelText="No"
>
<a key="delete">
<FormattedMessage
id="pages.searchTable.delete"
defaultMessage="Delete"
/>
</a>
</Popconfirm>,
],
},
];
return (
<PageContainer>
{contextHolder}
<ProTable<Admin, AdminQueryParams>
headerTitle={intl.formatMessage({
id: "pages.searchTable.title",
defaultMessage: "Enquiry form",
})}
actionRef={actionRef}
rowKey="id"
search={{
labelWidth: 120,
}}
toolBarRender={() => [
<CreateForm key="create" reload={actionRef.current?.reload} />,
]}
request={handleList}
columns={columns}
rowSelection={{
onChange: (_, selectedRows) => {
setSelectedRows(selectedRows);
},
}}
/>
{selectedRowsState?.length > 0 && (
<FooterToolbar
extra={
<div>
<FormattedMessage
id="pages.searchTable.chosen"
defaultMessage="Chosen"
/>{" "}
<a style={{ fontWeight: 600 }}>{selectedRowsState.length}</a>{" "}
<FormattedMessage
id="pages.searchTable.item"
defaultMessage="Items"
/>
</div>
}
>
<Button
loading={deleteLoading}
onClick={() => {
handleRemove(selectedRowsState);
}}
>
<FormattedMessage
id="pages.searchTable.batchDeletion"
defaultMessage="Batch deletion"
/>
</Button>
</FooterToolbar>
)}
<Drawer
width={600}
open={showDetail}
onClose={() => {
setCurrentRow(undefined);
setShowDetail(false);
}}
closable={false}
>
{currentRow?.name && (
<ProDescriptions<Admin>
column={2}
title={currentRow?.name}
request={async () => ({
data: currentRow || {},
})}
params={{
id: currentRow?.name,
}}
columns={columns as ProDescriptionsItemProps<Admin>[]}
/>
)}
</Drawer>
</PageContainer>
);
};
export default TableList;