index.tsx 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. import React, { useCallback, useEffect, useRef, useState } from 'react'
  2. import styles from './index.module.scss'
  3. import { A1EditInfoType } from '@/pages/A1event/data'
  4. import { Button, DatePicker, Form, FormInstance, InputNumber, Select } from 'antd'
  5. import dayjs from 'dayjs'
  6. import { MessageFu } from '@/utils/message'
  7. import classNames from 'classnames'
  8. import ZupOne from '@/components/ZupOne'
  9. import TextArea from 'antd/es/input/TextArea'
  10. import ZRichTexts from '@/components/ZRichTexts'
  11. import MyPopconfirm from '@/components/MyPopconfirm'
  12. import { A4Selct_1 } from '../data'
  13. import { A4_APIgetInfo, A4_APIsave } from '@/store/action/A4study'
  14. type Props = {
  15. editInfo: A1EditInfoType
  16. closeFu: () => void
  17. editTableFu: () => void
  18. addTableFu: () => void
  19. }
  20. function A4add({ editInfo, closeFu, editTableFu, addTableFu }: Props) {
  21. const [dirCode, setDirCode] = useState('')
  22. // 表单的ref
  23. const FormBoxRef = useRef<FormInstance>(null)
  24. // 封面图的ref
  25. const ZupThumbRef = useRef<any>(null)
  26. // 富文本的ref
  27. const ZRichTextRef = useRef<any>(null)
  28. // 编辑/查看 进入页面 获取信息
  29. const getInfoFu = useCallback(async (id: number) => {
  30. const res = await A4_APIgetInfo(id)
  31. if (res.code === 0) {
  32. const data = res.data
  33. setDirCode(data.dirCode)
  34. // 设置富文本
  35. ZRichTextRef.current?.ritxtShowFu(JSON.parse(data.rtf))
  36. const obj = {
  37. ...data,
  38. myTime: dayjs(data.datePublish),
  39. myTimeSta: dayjs(data.dateStart)
  40. }
  41. if (data.dateEnd) {
  42. obj.myTimeEnd = dayjs(data.dateEnd)
  43. }
  44. FormBoxRef.current?.setFieldsValue(obj)
  45. // 设置封面图
  46. ZupThumbRef.current?.setFileComFileFu({
  47. fileName: '',
  48. filePath: data.thumb
  49. })
  50. }
  51. }, [])
  52. // 附件 是否 已经点击过确定
  53. const [fileCheck, setFileCheck] = useState(false)
  54. // 没有通过校验
  55. const onFinishFailed = useCallback(() => {
  56. setFileCheck(true)
  57. }, [])
  58. // 通过校验点击确定
  59. const onFinish = useCallback(
  60. async (values: any) => {
  61. setFileCheck(true)
  62. const coverUrl1 = ZupThumbRef.current?.fileComFileResFu()
  63. // 没有传 封面图
  64. if (!coverUrl1.filePath) return MessageFu.warning('请上传封面图!')
  65. // 发布日期
  66. const datePublish = dayjs(values.myTime).format('YYYY-MM-DD')
  67. // 开始时间
  68. const dateStart = dayjs(values.myTimeSta).format('YYYY-MM-DD HH:mm')
  69. // 结束时间(可能为空)
  70. let dateEnd = ''
  71. if (values.myTimeEnd) dateEnd = dayjs(values.myTimeEnd).format('YYYY-MM-DD HH:mm')
  72. // 富文本校验不通过
  73. const rtf = ZRichTextRef.current?.fatherBtnOkFu() || { flag: true }
  74. if (rtf.flag) return MessageFu.warning('请输入完整正文!')
  75. const obj = {
  76. ...values,
  77. id: editInfo.id > 0 ? editInfo.id : null,
  78. datePublish,
  79. thumb: coverUrl1.filePath,
  80. rtf: JSON.stringify(rtf.val || ''),
  81. dirCode,
  82. dateStart,
  83. dateEnd
  84. }
  85. // if (obj) {
  86. // console.log(123, obj);
  87. // return;
  88. // }
  89. const res = await A4_APIsave(obj)
  90. if (res.code === 0) {
  91. MessageFu.success(`${editInfo.txt}成功!`)
  92. editInfo.id > 0 ? editTableFu() : addTableFu()
  93. closeFu()
  94. }
  95. },
  96. [addTableFu, closeFu, dirCode, editInfo.id, editInfo.txt, editTableFu]
  97. )
  98. useEffect(() => {
  99. if (editInfo.id > 0) {
  100. getInfoFu(editInfo.id)
  101. } else {
  102. setDirCode(Date.now() + '')
  103. FormBoxRef.current?.setFieldsValue({
  104. myTime: dayjs(Date.now()),
  105. sort: 999,
  106. display: 1
  107. })
  108. }
  109. }, [editInfo.id, getInfoFu])
  110. return (
  111. <div className={styles.A4add}>
  112. <div className={classNames('A4eMain', editInfo.txt === '查看' ? 'A4eMainLook' : '')}>
  113. <Form
  114. ref={FormBoxRef}
  115. name='basic'
  116. labelCol={{ span: 3 }}
  117. onFinish={onFinish}
  118. onFinishFailed={onFinishFailed}
  119. autoComplete='off'
  120. scrollToFirstError
  121. >
  122. <Form.Item label='标题' name='name' rules={[{ required: true, message: '请输入标题!' }]}>
  123. <TextArea
  124. readOnly={editInfo.txt === '查看'}
  125. maxLength={200}
  126. showCount
  127. placeholder='请输入内容'
  128. />
  129. </Form.Item>
  130. <Form.Item label='板块' name='type' rules={[{ required: true, message: '请选择板块!' }]}>
  131. <Select
  132. placeholder='请选择板块'
  133. style={{ width: 200 }}
  134. options={A4Selct_1.filter(v => v.label !== '全部')}
  135. />
  136. </Form.Item>
  137. <Form.Item
  138. label='开始时间'
  139. name='myTimeSta'
  140. rules={[{ required: true, message: '请选择开始时间!' }]}
  141. >
  142. <DatePicker showTime format={'YYYY-MM-DD HH:mm'} placeholder='请选择开始时间' />
  143. </Form.Item>
  144. <Form.Item label='结束时间' name='myTimeEnd'>
  145. <DatePicker showTime format={'YYYY-MM-DD HH:mm'} placeholder='请选择结束时间' />
  146. </Form.Item>
  147. <Form.Item
  148. label='地点'
  149. name='address'
  150. rules={[{ required: true, message: '请输入标题!' }]}
  151. >
  152. <TextArea
  153. readOnly={editInfo.txt === '查看'}
  154. placeholder='请输入内容'
  155. maxLength={100}
  156. showCount
  157. />
  158. </Form.Item>
  159. <Form.Item
  160. label='人数限制'
  161. name='remark'
  162. rules={[{ required: true, message: '请输入标题!' }]}
  163. >
  164. <TextArea
  165. readOnly={editInfo.txt === '查看'}
  166. placeholder='请输入内容'
  167. maxLength={100}
  168. showCount
  169. />
  170. </Form.Item>
  171. {/* 封面 */}
  172. <div className='formRow'>
  173. <div className='formLeft'>
  174. <span>* </span>
  175. 封面:
  176. </div>
  177. <div className='formRight'>
  178. <ZupOne
  179. ref={ZupThumbRef}
  180. isLook={editInfo.txt === '查看'}
  181. fileCheck={fileCheck}
  182. size={5}
  183. dirCode={dirCode}
  184. myUrl='cms/learn/upload'
  185. format={['image/jpeg', 'image/png']}
  186. formatTxt='png、jpg和jpeg'
  187. checkTxt='请上传封面图!'
  188. upTxt='最多1张'
  189. myType='thumb'
  190. />
  191. </div>
  192. </div>
  193. {editInfo.txt === '查看' ? <br /> : null}
  194. {/* 正文 */}
  195. <div className='formRow'>
  196. <div className='formLeft'>
  197. <span>* </span>
  198. 正文:
  199. </div>
  200. <div className='formRight'>
  201. <ZRichTexts
  202. check={fileCheck}
  203. dirCode={dirCode}
  204. isLook={editInfo.txt === '查看'}
  205. ref={ZRichTextRef}
  206. myUrl='cms/learn/upload'
  207. isOne={true}
  208. upAudioBtnNone={true}
  209. />
  210. </div>
  211. </div>
  212. <Form.Item
  213. label='发布日期'
  214. name='myTime'
  215. rules={[{ required: true, message: '请选择发布日期!' }]}
  216. >
  217. <DatePicker />
  218. </Form.Item>
  219. <div className='A4fromRow'>
  220. <Form.Item
  221. label='排序值'
  222. name='sort'
  223. rules={[{ required: true, message: '请输入排序值!' }]}
  224. >
  225. <InputNumber min={1} max={999} precision={0} placeholder='请输入' />
  226. </Form.Item>
  227. <div className='A4_6Frow' hidden={editInfo.txt === '查看'}>
  228. 请输入1~999的数字。数字越小,排序越靠前。数字相同时,更新发布的内容排在前面
  229. </div>
  230. </div>
  231. <Form.Item
  232. label='状态'
  233. name='display'
  234. rules={[{ required: true, message: '请选择状态!' }]}
  235. >
  236. <Select
  237. placeholder='请选择状态'
  238. style={{ width: 149 }}
  239. options={[
  240. { value: 1, label: '发布' },
  241. { value: 0, label: '不发布' }
  242. ]}
  243. />
  244. </Form.Item>
  245. {/* 确定和取消按钮 */}
  246. <Form.Item className='A4Ebtn'>
  247. {editInfo.txt === '查看' ? (
  248. <Button onClick={closeFu}>返回</Button>
  249. ) : (
  250. <>
  251. <Button type='primary' htmlType='submit'>
  252. 提交
  253. </Button>
  254. <br />
  255. <br />
  256. <MyPopconfirm txtK='取消' onConfirm={closeFu} />
  257. </>
  258. )}
  259. </Form.Item>
  260. </Form>
  261. </div>
  262. </div>
  263. )
  264. }
  265. const MemoA4add = React.memo(A4add)
  266. export default MemoA4add