index.tsx 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. import services from '@/services/demo';
  2. import {
  3. ActionType,
  4. FooterToolbar,
  5. PageContainer,
  6. ProDescriptions,
  7. ProDescriptionsItemProps,
  8. ProTable,
  9. } from '@ant-design/pro-components';
  10. import { Button, Divider, Drawer, message } from 'antd';
  11. import React, { useRef, useState } from 'react';
  12. import CreateForm from './components/CreateForm';
  13. import UpdateForm, { FormValueType } from './components/UpdateForm';
  14. const { addUser, queryUserList, deleteUser, modifyUser } =
  15. services.UserController;
  16. /**
  17. * 添加节点
  18. * @param fields
  19. */
  20. const handleAdd = async (fields: API.UserInfo) => {
  21. const hide = message.loading('正在添加');
  22. try {
  23. await addUser({ ...fields });
  24. hide();
  25. message.success('添加成功');
  26. return true;
  27. } catch (error) {
  28. hide();
  29. message.error('添加失败请重试!');
  30. return false;
  31. }
  32. };
  33. /**
  34. * 更新节点
  35. * @param fields
  36. */
  37. const handleUpdate = async (fields: FormValueType) => {
  38. const hide = message.loading('正在配置');
  39. try {
  40. await modifyUser(
  41. {
  42. userId: fields.id || '',
  43. },
  44. {
  45. name: fields.name || '',
  46. nickName: fields.nickName || '',
  47. email: fields.email || '',
  48. },
  49. );
  50. hide();
  51. message.success('配置成功');
  52. return true;
  53. } catch (error) {
  54. hide();
  55. message.error('配置失败请重试!');
  56. return false;
  57. }
  58. };
  59. /**
  60. * 删除节点
  61. * @param selectedRows
  62. */
  63. const handleRemove = async (selectedRows: API.UserInfo[]) => {
  64. const hide = message.loading('正在删除');
  65. if (!selectedRows) return true;
  66. try {
  67. await deleteUser({
  68. userId: selectedRows.find((row) => row.id)?.id || '',
  69. });
  70. hide();
  71. message.success('删除成功,即将刷新');
  72. return true;
  73. } catch (error) {
  74. hide();
  75. message.error('删除失败,请重试');
  76. return false;
  77. }
  78. };
  79. const TableList: React.FC<unknown> = () => {
  80. const [createModalVisible, handleModalVisible] = useState<boolean>(false);
  81. const [updateModalVisible, handleUpdateModalVisible] =
  82. useState<boolean>(false);
  83. const [stepFormValues, setStepFormValues] = useState({});
  84. const actionRef = useRef<ActionType>();
  85. const [row, setRow] = useState<API.UserInfo>();
  86. const [selectedRowsState, setSelectedRows] = useState<API.UserInfo[]>([]);
  87. const columns: ProDescriptionsItemProps<API.UserInfo>[] = [
  88. {
  89. title: '名称',
  90. dataIndex: 'name',
  91. tip: '名称是唯一的 key',
  92. formItemProps: {
  93. rules: [
  94. {
  95. required: true,
  96. message: '名称为必填项',
  97. },
  98. ],
  99. },
  100. },
  101. {
  102. title: '昵称',
  103. dataIndex: 'nickName',
  104. valueType: 'text',
  105. },
  106. {
  107. title: '性别',
  108. dataIndex: 'gender',
  109. hideInForm: true,
  110. valueEnum: {
  111. 0: { text: '男', status: 'MALE' },
  112. 1: { text: '女', status: 'FEMALE' },
  113. },
  114. },
  115. {
  116. title: '操作',
  117. dataIndex: 'option',
  118. valueType: 'option',
  119. render: (_, record) => (
  120. <>
  121. <a
  122. onClick={() => {
  123. handleUpdateModalVisible(true);
  124. setStepFormValues(record);
  125. }}
  126. >
  127. 配置
  128. </a>
  129. <Divider type="vertical" />
  130. <a href="">订阅警报</a>
  131. </>
  132. ),
  133. },
  134. ];
  135. return (
  136. <PageContainer
  137. header={{
  138. title: 'CRUD 示例',
  139. }}
  140. >
  141. <ProTable<API.UserInfo>
  142. headerTitle="查询表格"
  143. actionRef={actionRef}
  144. rowKey="id"
  145. search={{
  146. labelWidth: 120,
  147. }}
  148. toolBarRender={() => [
  149. <Button
  150. key="1"
  151. type="primary"
  152. onClick={() => handleModalVisible(true)}
  153. >
  154. 新建
  155. </Button>,
  156. ]}
  157. request={async (params, sorter, filter) => {
  158. const { data, success } = await queryUserList({
  159. ...params,
  160. // FIXME: remove @ts-ignore
  161. // @ts-ignore
  162. sorter,
  163. filter,
  164. });
  165. return {
  166. data: data?.list || [],
  167. success,
  168. };
  169. }}
  170. columns={columns}
  171. rowSelection={{
  172. onChange: (_, selectedRows) => setSelectedRows(selectedRows),
  173. }}
  174. />
  175. {selectedRowsState?.length > 0 && (
  176. <FooterToolbar
  177. extra={
  178. <div>
  179. 已选择{' '}
  180. <a style={{ fontWeight: 600 }}>{selectedRowsState.length}</a>{' '}
  181. 项&nbsp;&nbsp;
  182. </div>
  183. }
  184. >
  185. <Button
  186. onClick={async () => {
  187. await handleRemove(selectedRowsState);
  188. setSelectedRows([]);
  189. actionRef.current?.reloadAndRest?.();
  190. }}
  191. >
  192. 批量删除
  193. </Button>
  194. <Button type="primary">批量审批</Button>
  195. </FooterToolbar>
  196. )}
  197. <CreateForm
  198. onCancel={() => handleModalVisible(false)}
  199. modalVisible={createModalVisible}
  200. >
  201. <ProTable<API.UserInfo, API.UserInfo>
  202. onSubmit={async (value) => {
  203. const success = await handleAdd(value);
  204. if (success) {
  205. handleModalVisible(false);
  206. if (actionRef.current) {
  207. actionRef.current.reload();
  208. }
  209. }
  210. }}
  211. rowKey="id"
  212. type="form"
  213. columns={columns}
  214. />
  215. </CreateForm>
  216. {stepFormValues && Object.keys(stepFormValues).length ? (
  217. <UpdateForm
  218. onSubmit={async (value) => {
  219. const success = await handleUpdate(value);
  220. if (success) {
  221. handleUpdateModalVisible(false);
  222. setStepFormValues({});
  223. if (actionRef.current) {
  224. actionRef.current.reload();
  225. }
  226. }
  227. }}
  228. onCancel={() => {
  229. handleUpdateModalVisible(false);
  230. setStepFormValues({});
  231. }}
  232. updateModalVisible={updateModalVisible}
  233. values={stepFormValues}
  234. />
  235. ) : null}
  236. <Drawer
  237. width={600}
  238. open={!!row}
  239. onClose={() => {
  240. setRow(undefined);
  241. }}
  242. closable={false}
  243. >
  244. {row?.name && (
  245. <ProDescriptions<API.UserInfo>
  246. column={2}
  247. title={row?.name}
  248. request={async () => ({
  249. data: row || {},
  250. })}
  251. params={{
  252. id: row?.name,
  253. }}
  254. columns={columns}
  255. />
  256. )}
  257. </Drawer>
  258. </PageContainer>
  259. );
  260. };
  261. export default TableList;