index.tsx 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. import {
  2. useCallback,
  3. useEffect,
  4. useMemo,
  5. useRef,
  6. useState,
  7. forwardRef,
  8. useImperativeHandle
  9. } from 'react'
  10. import styles from './index.module.scss'
  11. import { useDispatch } from 'react-redux'
  12. import history from '@/utils/history'
  13. import { Button, DatePicker, Input, Select, Cascader } from 'antd'
  14. import { tableListAuditBtnFu } from '@/utils/authority'
  15. import MyTable from '@/components/MyTable'
  16. import dayjs from 'dayjs'
  17. const { RangePicker } = DatePicker
  18. type Props = {
  19. baseFormData: any
  20. getListAPI: (data: any) => any
  21. pageKey: string
  22. tableInfo: any
  23. columnsTemp: any
  24. yHeight: number
  25. searchDom: any[]
  26. // 右侧按钮的宽度
  27. rightBtnWidth?: number
  28. // 左侧每个输入框盒子的宽度
  29. leftRowWidth?: string
  30. // 故事管理/藏品总账定制右侧内容
  31. storyTableListToprr?: (props: any) => React.ReactNode
  32. // 故事管理/藏品总账定制操作栏
  33. storyTableLastBtn?: any
  34. // 额外查询参数(不会影响顶部表单状态),在发请求时合并
  35. extraParams?: any
  36. // antd Table rowSelection 配置(例如跨页多选)
  37. rowSelection?: any
  38. }
  39. const TableList = forwardRef<any, Props>(function TableList(props, ref) {
  40. const {
  41. baseFormData,
  42. getListAPI,
  43. pageKey,
  44. tableInfo,
  45. columnsTemp,
  46. yHeight,
  47. searchDom,
  48. rightBtnWidth = 250,
  49. leftRowWidth = '25%',
  50. storyTableLastBtn,
  51. storyTableListToprr,
  52. extraParams,
  53. rowSelection
  54. } = props
  55. const dispatch = useDispatch()
  56. const [formData, setFormData] = useState({ ...baseFormData })
  57. const formDataRef = useRef({ ...baseFormData })
  58. useEffect(() => {
  59. formDataRef.current = formData
  60. }, [formData])
  61. // 点击搜索的 时间戳
  62. const [timeKey, setTimeKey] = useState(0)
  63. // 点击搜索
  64. const clickSearch = useCallback(() => {
  65. setFormData({ ...formData, pageNum: 1 })
  66. setTimeout(() => {
  67. setTimeKey(Date.now())
  68. }, 50)
  69. }, [formData])
  70. // 时间选择器改变
  71. const timeChange = useCallback(
  72. (dateString: any, key: any) => {
  73. let startTime = ''
  74. let endTime = ''
  75. if (dateString[0] && dateString[1]) {
  76. startTime = dateString[0] + ' 00:00:00'
  77. endTime = dateString[1] + ' 23:59:59'
  78. }
  79. setFormData({ ...formData, [key[0]]: startTime, [key[1]]: endTime })
  80. },
  81. [formData]
  82. )
  83. // 封装发送请求的函数
  84. const getListFu = useCallback(() => {
  85. const params = {
  86. ...formDataRef.current,
  87. ...(extraParams || {})
  88. }
  89. dispatch(getListAPI(params))
  90. }, [dispatch, getListAPI, extraParams])
  91. useEffect(() => {
  92. getListFu()
  93. }, [getListFu, timeKey])
  94. // 输入框的改变
  95. const txtChangeFu = useCallback(
  96. (txt: string, key: any) => {
  97. setFormData({
  98. ...formData,
  99. [key]: txt
  100. })
  101. },
  102. [formData]
  103. )
  104. // 点击重置
  105. const resetSelectFu = useCallback(() => {
  106. setFormData({ ...baseFormData })
  107. setTimeout(() => {
  108. setTimeKey(Date.now())
  109. }, 50)
  110. }, [baseFormData])
  111. // 页码变化
  112. const paginationChange = useCallback(
  113. (pageNum: number, pageSize: number) => {
  114. setFormData({ ...formData, pageNum, pageSize })
  115. setTimeout(() => {
  116. setTimeKey(Date.now())
  117. }, 50)
  118. },
  119. [formData]
  120. )
  121. // 点击各种操作按钮
  122. const tableBtnFu = useCallback(
  123. (id: number, key: string) => {
  124. history.push(`/${pageKey}_edit/${key}/${id}`)
  125. },
  126. [pageKey]
  127. )
  128. const tableLastBtn = useMemo(() => {
  129. return [
  130. {
  131. title: '操作',
  132. render: (item: any) => (
  133. <>
  134. <Button size='small' type='text' onClick={() => tableBtnFu(item.id, '4')}>
  135. 查看
  136. </Button>
  137. {tableListAuditBtnFu(item) ? (
  138. <Button size='small' type='text' onClick={() => tableBtnFu(item.id, '3')}>
  139. 审批
  140. </Button>
  141. ) : null}
  142. </>
  143. )
  144. }
  145. ]
  146. }, [tableBtnFu])
  147. useImperativeHandle(ref, () => ({
  148. getListFu,
  149. txtChangeFu
  150. }))
  151. return (
  152. <>
  153. <div className={styles.TableListTop}>
  154. <div className='TableListTopll' style={{ width: `calc(100% - ${rightBtnWidth + 20}px)` }}>
  155. {searchDom.map((item, index) => (
  156. <div key={index} style={{ width: leftRowWidth }}>
  157. {item.type === 'time' ? (
  158. <RangePicker
  159. value={
  160. formData[item.key[0]]
  161. ? [dayjs(formData[item.key[0]]), dayjs(formData[item.key[1]])]
  162. : null
  163. }
  164. onChange={(_, dateString) => timeChange(dateString, item.key)}
  165. placeholder={item.placeholder}
  166. />
  167. ) : item.type === 'input' ? (
  168. <Input
  169. style={item.style || ''}
  170. placeholder={item.placeholder}
  171. maxLength={item.maxLength || 30}
  172. value={formData[item.key]}
  173. onChange={e => txtChangeFu(e.target.value, item.key)}
  174. />
  175. ) : item.type === 'select' ? (
  176. <Select
  177. allowClear={true}
  178. placeholder={item.placeholder}
  179. style={item.style || ''}
  180. value={formData[item.key] ? formData[item.key] : null}
  181. onChange={e => setFormData({ ...formData, [item.key]: e })}
  182. options={item.options}
  183. />
  184. ) : item.type === 'cascader' ? (
  185. <Cascader
  186. allowClear={true}
  187. placeholder={item.placeholder}
  188. style={item.style || ''}
  189. value={formData[item.key] ? formData[item.key] : null}
  190. fieldNames={{ label: 'name', value: 'id', children: 'children' }}
  191. onChange={e => setFormData({ ...formData, [item.key]: e })}
  192. options={item.options}
  193. />
  194. ) : null}
  195. </div>
  196. ))}
  197. </div>
  198. <div className='TableListToprr' style={{ width: rightBtnWidth + 'px' }}>
  199. {storyTableListToprr ? (
  200. storyTableListToprr({ clickSearch, resetSelectFu })
  201. ) : (
  202. <>
  203. <Button type='primary' onClick={() => history.push(`/${pageKey}_edit/1/null`)}>
  204. 发起申请
  205. </Button>
  206. <Button type='primary' onClick={clickSearch}>
  207. 查询
  208. </Button>
  209. <Button onClick={resetSelectFu}>重置</Button>
  210. </>
  211. )}
  212. </div>
  213. </div>
  214. <div className={styles.TableListTable}>
  215. <MyTable
  216. yHeight={yHeight}
  217. list={tableInfo.list}
  218. columnsTemp={columnsTemp}
  219. lastBtn={storyTableLastBtn ? storyTableLastBtn : tableLastBtn}
  220. pageNum={formData.pageNum}
  221. pageSize={formData.pageSize}
  222. total={tableInfo.total}
  223. onChange={(pageNum, pageSize) => paginationChange(pageNum, pageSize)}
  224. rowSelection={rowSelection}
  225. />
  226. </div>
  227. </>
  228. )
  229. })
  230. export default TableList