index.tsx 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. /*
  2. * @Author: your name
  3. * @Date: 2021-12-07 09:28:41
  4. * @LastEditTime: 2022-02-28 14:11:18
  5. * @LastEditors: Please set LastEditors
  6. * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  7. * @FilePath: /MedicalWisdomCheckSys/src/pages/GradeHospitalAccreditation/accreditationDetail/components/materialTable/index.tsx
  8. */
  9. import React, { useEffect, useState,useRef } from 'react';
  10. import MccsSelect from '@/components/MccsProFormSelect/index';
  11. import { Input, Row, Col, Button, Checkbox, Divider, Pagination, Empty,Spin,Tooltip } from 'antd';
  12. import './style.less';
  13. import { CheckboxChangeEvent } from 'antd/lib/checkbox';
  14. const { Search } = Input;
  15. const TableItem: React.FC<any> = ({ data, actionHandle,checkBoxChangeHandle }) => {
  16. //注意!!!!data类型有待补充
  17. const textWraperSpanRef = useRef(null);
  18. const subTextRef = useRef(null);
  19. const [ifShowTip,setIfShowTip] = useState(false);
  20. const [ifHasMore,setifHasMore] = useState(false);
  21. const onVisibleChangeHanfle = (bool:boolean)=>{
  22. if(bool){
  23. setIfShowTip(ifHasMore);
  24. }else{
  25. setIfShowTip(false);
  26. }
  27. }
  28. useEffect(()=>{
  29. if(textWraperSpanRef.current&&subTextRef.current){
  30. setifHasMore(textWraperSpanRef.current['clientWidth'] > subTextRef.current['clientWidth'])
  31. }
  32. },[]);
  33. return (
  34. <div className='tableChild'>
  35. {
  36. //用于测量渲染出文案的长度
  37. }
  38. <div ref={textWraperSpanRef} style={{height:0.1,position:'absolute',visibility:'hidden'}}>{`档次:${data.grade} 目录:${data.directory}`}</div>
  39. <Checkbox className='check' onChange={(e:CheckboxChangeEvent)=>checkBoxChangeHandle(e,data)} />
  40. <div className='tableChildContent' ref={subTextRef}>
  41. {(data.sort&&data.profileName)&&<div className='mainText'>{`${data.sort}.${data.profileName}`}</div>}
  42. <Tooltip title={`档次:${data.grade} 目录:${data.directory}`} visible={ifShowTip} onVisibleChange={onVisibleChangeHanfle}>
  43. <div className='subText' >{`档次:${data.grade} 目录:${data.directory}`}</div>
  44. </Tooltip>
  45. </div>
  46. <div className='action'>
  47. <a onClick={() => actionHandle('EDIT',[data])}>修改</a><Divider type='vertical' /><a onClick={() => actionHandle('DEL',[data])}>删除</a>
  48. </div>
  49. </div>
  50. )
  51. }
  52. const MaterialTable: React.FC<MaterialTable.MaterialTableProps> = (props) => {
  53. const { selectOptions, request, addHandle, tableItemActionHandle } = props;
  54. const [list, setList] = useState<any[]>([]);
  55. const [selectorFilter, setSelectorFilter] = useState<string>(''); //下拉筛选
  56. const [keyword, setKeyword] = useState<string>('');
  57. const [relaodData, setRelaodData] = useState(false);
  58. const [loading,setLoading] = useState(false); //加载中
  59. const [pageData, setPageData] = useState<{
  60. pageSize: number,
  61. current: number,
  62. }>({ current: 1, pageSize: 10 });
  63. const [total,setTotal] = useState(0);
  64. const [checkedList,setCheckedList] = useState<any[]>([]); //已勾选的项集合
  65. const geData = async () => {
  66. if (request) {
  67. setLoading(true);
  68. const res = await request({ ...pageData, keyword, selectorFilter:selectorFilter=='全部'?'':selectorFilter });
  69. if (res) {
  70. setList(res.list);
  71. setPageData({
  72. pageSize: res.pageSize,
  73. current: res.current
  74. });
  75. setTotal(res.total);
  76. setRelaodData(false);
  77. setLoading(false);
  78. }
  79. }
  80. }
  81. const tableItemAction = async (type: 'EDIT' | 'DEL', data: any[]) => {
  82. if (tableItemActionHandle) {
  83. const resp = await tableItemActionHandle(type, data);
  84. if (resp) {
  85. geData();
  86. }
  87. }
  88. }
  89. const checkBoxChangeHandle = (e:CheckboxChangeEvent,data:any)=>{
  90. if(e.target.checked){
  91. setCheckedList([...checkedList,data]);
  92. }else{
  93. let _checkedList = checkedList;
  94. _checkedList.splice(_checkedList.findIndex(t=>t.id == data.id),1);
  95. setCheckedList([..._checkedList]);
  96. }
  97. }
  98. //批量删除
  99. const batchDelList = async ()=>{
  100. if (tableItemActionHandle) {
  101. const resp = await tableItemActionHandle('DEL',checkedList);
  102. if (resp) {
  103. geData();
  104. setCheckedList([]);
  105. }
  106. }
  107. }
  108. useEffect(() => {
  109. //刷新数据
  110. if (relaodData) {
  111. geData();
  112. }
  113. }, [relaodData]);
  114. useEffect(() => {
  115. if (props.reload) {
  116. setRelaodData(true);
  117. }
  118. }, [props]);
  119. useEffect(() => {
  120. geData();
  121. }, [])
  122. return (
  123. <div className='materialTable'>
  124. <div className='tableFilter'>
  125. <Row>
  126. <Col span={8}>
  127. <MccsSelect
  128. selectList={selectOptions ? [{ label: '全部', value: '全部' }, ...selectOptions] : []}
  129. width="sm"
  130. fieldProps={{
  131. defaultValue: '全部',
  132. onChange: val => {
  133. setSelectorFilter(val);
  134. setRelaodData(true);
  135. }
  136. }}
  137. />
  138. </Col>
  139. <Col span={15} offset={1}>
  140. <Search placeholder={'请输入'}
  141. allowClear
  142. onSearch={val => {
  143. setKeyword(val);
  144. setRelaodData(true);
  145. }}
  146. onChange={e => {
  147. const key = e.target.value;
  148. if (!key || key.length == 0) {
  149. setKeyword(key);
  150. setRelaodData(true);
  151. }
  152. }}
  153. />
  154. </Col>
  155. </Row>
  156. </div>
  157. <div className='titleAndAction'>
  158. <div className='tableTitle'>资料目录</div>
  159. <div className='actionBtnGroup'>
  160. {checkedList.length>0&&<Button className='actionBtn' onClick={batchDelList}>{`批量删除(${checkedList.length})`}</Button>}
  161. <Button type='primary' className='addBtn actionBtn' onClick={() => addHandle && addHandle()}>新增</Button>
  162. </div>
  163. </div>
  164. <div className='tableList'>
  165. {loading&&<div style={{display:'flex',width:'100%',height:'100%',justifyContent:'center',alignItems:'center'}}><Spin /></div>}
  166. {
  167. (list.length == 0&&!loading) && (
  168. <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />
  169. )
  170. }
  171. {
  172. !loading&&list.map((item, index) => (
  173. <TableItem key={index} data={item} actionHandle={tableItemAction} checkBoxChangeHandle={checkBoxChangeHandle} />
  174. ))
  175. }
  176. </div>
  177. <div style={{ display: 'flex', justifyContent: 'center',alignItems:'center' }}>
  178. {/* <Pagination size="small" total={50} /> */}
  179. <Pagination
  180. size="small"
  181. hideOnSinglePage={true}
  182. showLessItems={true}
  183. showSizeChanger
  184. simple={true}
  185. current={pageData.current}
  186. onChange={(page, pageSize) => {
  187. setPageData({
  188. current:page,
  189. pageSize:pageSize?pageSize:10
  190. });
  191. setRelaodData(true);
  192. }}
  193. defaultCurrent={3}
  194. total={total}
  195. />
  196. <div style={{fontSize:12}}>10条/页</div>
  197. </div>
  198. </div>
  199. )
  200. }
  201. export default MaterialTable;