index.tsx 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. /*
  2. * @Author: your name
  3. * @Date: 2021-09-27 10:45:50
  4. * @LastEditTime: 2022-01-04 16:51:39
  5. * @LastEditors: Please set LastEditors
  6. * @Description: In User Settings Edit
  7. * @FilePath: /MedicalWisdomCheckSys/src/components/MccsEditableTable/index.tsx
  8. */
  9. import { Pagination, Popconfirm } from 'antd';
  10. import React, { useState, useEffect, useRef } from 'react'
  11. import { EditableProTable } from '@ant-design/pro-table';
  12. import { Key } from 'antd/lib/table/interface';
  13. //仅仅对pro-table简单的包装,详细使用参考antd pro
  14. const objectSimpleFilter = (obj: object, keyToDel: string) => {
  15. return JSON.parse(JSON.stringify(obj, function (key, value) {
  16. if (key == keyToDel) {
  17. return undefined;
  18. } else {
  19. return value;
  20. }
  21. }))
  22. }
  23. const MccsEditableTable: React.FC<MccsEditableTableType.MccsEditableTableProps> = (props) => {
  24. const { columns = [], request, addHandle, pagination, editHandle, delHandle, reload, edit = true, ...rest } = props;
  25. const [editableKeys, setEditableRowKeys] = useState<React.Key[]>([]);
  26. const [dataSource, setDataSource] = useState<any>([]);
  27. const tableRef = useRef<any>();
  28. const [tableColumns, setTableColumns] = useState<any[]>([]);
  29. const [pageData, setPageData] = useState({ current: 1, pageSize: 10 });
  30. const [total, setTotal] = useState(0);
  31. const mccsEditableTableAction = {
  32. title: '操作',
  33. valueType: 'option',
  34. width: '10%',
  35. align: 'center',
  36. render: (text: string, record: any, _: any, action: any) => [
  37. <a
  38. key="editable"
  39. onClick={() => {
  40. action?.startEditable?.(record.id);
  41. }}
  42. >
  43. 编辑
  44. </a>,
  45. <Popconfirm
  46. title="是否确定删除?"
  47. key="del"
  48. onConfirm={()=>{
  49. // console.log({text,record,_,action});
  50. delHandle && delHandle(record);
  51. setDataSource(dataSource.filter((item: any) => item.id !== record.id));
  52. }}
  53. okText="确定"
  54. cancelText="取消"
  55. >
  56. <a> 删除 </a>
  57. </Popconfirm>
  58. ]
  59. }
  60. const getData = async () => {
  61. if (request) {
  62. const resp = await request(pageData.current, pageData.pageSize);
  63. const { data, current = 1, total = 0 } = resp;
  64. setTotal(total);
  65. setDataSource(data);
  66. }
  67. }
  68. const onShowSizeChangeHandle = (current: number, pageSize: number) => {
  69. setPageData({ ...pageData, current, pageSize });
  70. }
  71. const pageChangeHandle = (page:number,pageSize:number|undefined)=>{
  72. //分页页码变化时
  73. // console.log({page,pageSize});
  74. setPageData({current:page,pageSize:pageSize?pageSize:10});
  75. }
  76. const generateRowKey = ()=>{
  77. const currentAddRowkey = (Math.random() * 1000000).toFixed(0);
  78. // setCurrentEditRowkey(currentAddRowkey);
  79. return currentAddRowkey
  80. }
  81. useEffect(() => {
  82. //加载模块获取数据
  83. getData();
  84. }, [reload]);
  85. useEffect(() => {
  86. const hasIndex = columns.findIndex(item => item.valueType == 'option');
  87. // console.log({hasIndex,edit});
  88. if (hasIndex == -1 && edit) {
  89. //当无操作按钮时,自行添加默认
  90. setTableColumns([...columns, mccsEditableTableAction]);
  91. return;
  92. }
  93. if (!edit) {
  94. //当非编辑下时除去操作项
  95. setTableColumns(columns.filter(item => item.valueType != 'option'));
  96. tableRef.current.cancelEditable(editableKeys[editableKeys.length-1]);
  97. return;
  98. }
  99. setTableColumns(columns);
  100. }, [columns, edit]);
  101. useEffect(() => {
  102. getData();
  103. }, [pageData]);
  104. return (
  105. <div>
  106. <EditableProTable
  107. {...rest}
  108. rowKey="id"
  109. columns={tableColumns}
  110. // request={request}
  111. controlled={edit}
  112. value={dataSource}
  113. actionRef={tableRef}
  114. onChange={setDataSource}
  115. recordCreatorProps={
  116. edit ? {
  117. record: () => {
  118. return { id:generateRowKey()}
  119. },
  120. newRecordType: 'dataSource',
  121. } : false
  122. }
  123. editable={{
  124. type:'multiple',
  125. editableKeys,
  126. actionRender: (row, config, defaultDoms) => {
  127. return [defaultDoms.save, defaultDoms.cancel];
  128. },
  129. onSave: async (rowKey, data, row) => {
  130. const { id } = data;
  131. console.log({dataSource});
  132. if (typeof id == 'string') {
  133. //新增
  134. addHandle && addHandle(objectSimpleFilter(data, 'id'));
  135. } else if(typeof id == 'number') {
  136. editHandle && editHandle(data);
  137. }
  138. },
  139. onChange: (editableKeys: Key[], editableRows: {id:string}|{id:string}[])=>{
  140. // console.log({editableKeys,editableRows});
  141. setEditableRowKeys(editableKeys)
  142. },
  143. deletePopconfirmMessage: '确认删除?'
  144. }}
  145. />
  146. {
  147. pagination && (
  148. <div className='pagination' style={{ display: 'flex', flexDirection: 'row', justifyContent: 'flex-end' }}>
  149. <Pagination
  150. size='small'
  151. showSizeChanger
  152. onChange={(page,pageSize)=>pageChangeHandle(page,pageSize)}
  153. onShowSizeChange={onShowSizeChangeHandle}
  154. current={pageData.current}
  155. total={total}
  156. />
  157. </div>
  158. )
  159. }
  160. </div>
  161. )
  162. }
  163. export default MccsEditableTable