index.tsx 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'
  2. import styles from './index.module.scss'
  3. import { Button, Empty, Input, Modal, Select } from 'antd'
  4. import { MessageFu } from '@/utils/message'
  5. import MyPopconfirm from '@/components/MyPopconfirm'
  6. import { A1RRlistType } from '../data'
  7. import { useDispatch, useSelector } from 'react-redux'
  8. import { A1_APIgetList, A1_APIsaveRR } from '@/store/action/A1record'
  9. import { RootState } from '@/store'
  10. import { DeleteOutlined } from '@ant-design/icons'
  11. import classNames from 'classnames'
  12. type Props = {
  13. sId: number
  14. sName: string
  15. closeFu: () => void
  16. upDataFu: () => void
  17. oldList: A1RRlistType[]
  18. }
  19. function A1relation({ sId, closeFu, upDataFu, oldList, sName }: Props) {
  20. // 获取所有烈士信息
  21. const dispatch = useDispatch()
  22. useEffect(() => {
  23. dispatch(
  24. A1_APIgetList({
  25. pageNum: 1,
  26. pageSize: 99999
  27. })
  28. )
  29. }, [dispatch])
  30. const listAll = useSelector((state: RootState) => state.A1record.tableInfo.list)
  31. const [list, setList] = useState<A1RRlistType[]>([])
  32. const listAllRes = useMemo(() => {
  33. return listAll
  34. .filter(v => v.id !== sId)
  35. .map(c => ({
  36. value: c.id,
  37. label: c.name,
  38. disabled: list.map(q => q.moduleId).includes(c.id)
  39. }))
  40. }, [list, listAll, sId])
  41. // 获取所有烈士信息-end
  42. // useEffect(() => {
  43. // console.log('xxxxx', list)
  44. // }, [list])
  45. const [loding, setLoding] = useState(false)
  46. useEffect(() => {
  47. setList(oldList)
  48. setLoding(true)
  49. }, [oldList])
  50. // 点击删除
  51. const delArrRef = useRef<number[]>([])
  52. const delOneFu = useCallback(
  53. (item: A1RRlistType) => {
  54. if (!item.isNew) delArrRef.current.push(item.id)
  55. setList(list.filter(v => v.id !== item.id))
  56. },
  57. [list]
  58. )
  59. // 下拉框的改变
  60. const selectChangeFu = useCallback(
  61. (id: number, value: any, key: 'moduleId' | 'relationMartyr' | 'relationModule') => {
  62. // if (list.find(v => v.moduleId === id)) {
  63. // return MessageFu.warning('不可重复选择')
  64. // }
  65. setList(
  66. list.map(v => ({
  67. ...v,
  68. [key]: v.id === id ? value : v[key]
  69. }))
  70. )
  71. },
  72. [list]
  73. )
  74. // 下拉框id转换成lable
  75. const selectNameRes = useCallback(
  76. (moduleId: number) => {
  77. let txt = ''
  78. const obj = listAllRes.find(v => v.value === moduleId)
  79. if (obj) txt = obj.label
  80. return txt
  81. },
  82. [listAllRes]
  83. )
  84. // 是否可以点击确定 为true表示不满足,不能点击
  85. const isOkFlag = useMemo(() => {
  86. let index = 0
  87. const findIndex = list.findIndex(v => !v.moduleId || !v.relationModule || !v.relationMartyr)
  88. if (findIndex >= 0) index = findIndex + 1
  89. return index
  90. }, [list])
  91. // 点击提交
  92. const addBtn = useCallback(async () => {
  93. const obj = {
  94. delIds: delArrRef.current,
  95. relation: list.map(v => ({
  96. id: v.isNew ? null : v.id,
  97. martyrId: sId,
  98. moduleId: v.moduleId,
  99. relationMartyr: v.relationMartyr,
  100. relationModule: v.relationModule,
  101. type: 'martyr'
  102. }))
  103. }
  104. const res = await A1_APIsaveRR(obj)
  105. if (res.code === 0) {
  106. MessageFu.success('编辑成功')
  107. upDataFu()
  108. closeFu()
  109. }
  110. }, [closeFu, list, sId, upDataFu])
  111. return (
  112. <Modal
  113. wrapClassName={styles.A1relation}
  114. open={true}
  115. title={
  116. <div className='A1Rtit'>
  117. <div>关联烈士</div>
  118. <Button
  119. type='primary'
  120. onClick={() => {
  121. if (list.length >= 50) return MessageFu.warning('可关联最多50个烈士')
  122. setList([
  123. ...list,
  124. {
  125. id: Date.now(),
  126. moduleName: '',
  127. moduleId: null,
  128. relationMartyr: '',
  129. relationModule: '',
  130. isNew: true
  131. }
  132. ])
  133. }}
  134. >
  135. 新增
  136. </Button>
  137. </div>
  138. }
  139. footer={
  140. [] // 设置footer为空,去掉 取消 确定默认按钮
  141. }
  142. >
  143. <div className='A1Rmain'>
  144. {list.length === 0 && loding ? (
  145. <div style={{ textAlign: 'center' }}>
  146. <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />
  147. </div>
  148. ) : (
  149. <>
  150. {list.map((item, index) => (
  151. <div className='A1Rrow' key={item.id}>
  152. <div className='A1RrowIndex'>{index + 1}:</div>
  153. <div className='A1Rrow1'>
  154. <Select
  155. style={{ width: 455 }}
  156. getPopupContainer={() => document.querySelector('.ant-modal-content')!}
  157. filterOption={(input, option) =>
  158. (option?.label ?? '').toLowerCase().includes(input.toLowerCase())
  159. }
  160. allowClear
  161. placeholder='请搜索并选择'
  162. showSearch
  163. options={listAllRes}
  164. value={item.moduleId || null}
  165. onChange={e => selectChangeFu(item.id, e, 'moduleId')}
  166. />
  167. <MyPopconfirm
  168. txtK='删除'
  169. onConfirm={() => delOneFu(item)}
  170. Dom={<DeleteOutlined />}
  171. />
  172. </div>
  173. <div className='A1Rrow2'>
  174. <div>
  175. {selectNameRes(item.moduleId!)} → {sName}
  176. </div>
  177. <div>
  178. {sName} → {selectNameRes(item.moduleId!)}
  179. </div>
  180. </div>
  181. <div className='A1Rrow3'>
  182. <div>
  183. <Input
  184. placeholder='请输入'
  185. maxLength={10}
  186. showCount
  187. value={item.relationModule}
  188. onChange={e =>
  189. selectChangeFu(item.id, e.target.value.trim(), 'relationModule')
  190. }
  191. />
  192. </div>
  193. <div>
  194. <Input
  195. placeholder='请输入'
  196. maxLength={10}
  197. showCount
  198. value={item.relationMartyr}
  199. onChange={e =>
  200. selectChangeFu(item.id, e.target.value.trim(), 'relationMartyr')
  201. }
  202. />
  203. </div>
  204. </div>
  205. </div>
  206. ))}
  207. </>
  208. )}
  209. </div>
  210. <div className='A1Rbtn'>
  211. <Button type='primary' onClick={addBtn} disabled={!!isOkFlag}>
  212. 提交
  213. </Button>
  214. &emsp;
  215. <MyPopconfirm txtK='取消' onConfirm={closeFu} />
  216. <p className={classNames(isOkFlag ? 'A1RbtnTxt' : '')}>请完善第 {isOkFlag} 条关联信息</p>
  217. </div>
  218. </Modal>
  219. )
  220. }
  221. const MemoA1relation = React.memo(A1relation)
  222. export default MemoA1relation