index.tsx 8.2 KB

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