index.tsx 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  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 {
  5. Button,
  6. DatePicker,
  7. Form,
  8. FormInstance,
  9. Input,
  10. InputNumber,
  11. Select,
  12. } from "antd";
  13. import { A3_APIgetInfo, A3_APIsave } from "@/store/action/A3holding";
  14. import dayjs from "dayjs";
  15. import { MessageFu } from "@/utils/message";
  16. import classNames from "classnames";
  17. import ZupAudio from "@/components/ZupAudio";
  18. import ZRichTexts from "@/components/ZRichTexts";
  19. import ZupTypes from "@/components/ZupTypes";
  20. import MyPopconfirm from "@/components/MyPopconfirm";
  21. import TextArea from "antd/es/input/TextArea";
  22. import { A3Selct_1 } from "../data";
  23. type Props = {
  24. editInfo: A1EditInfoType;
  25. selectAgeArr: { value: number | string; label: string }[];
  26. closeFu: () => void;
  27. editTableFu: () => void;
  28. addTableFu: () => void;
  29. };
  30. function A3add({
  31. editInfo,
  32. selectAgeArr,
  33. closeFu,
  34. editTableFu,
  35. addTableFu,
  36. }: Props) {
  37. const [dirCode, setDirCode] = useState("");
  38. // 表单的ref
  39. const FormBoxRef = useRef<FormInstance>(null);
  40. // 富文本的ref
  41. const ZRichTextRef = useRef<any>(null);
  42. // 标题的音频
  43. const [nameAudio, setNameAudio] = useState({
  44. fileName: "",
  45. filePath: "",
  46. });
  47. // 多个图片的ref
  48. const ZupFilesRef2 = useRef<any>(null);
  49. // 编辑/查看 进入页面 获取信息
  50. const getInfoFu = useCallback(async (id: number) => {
  51. const res = await A3_APIgetInfo(id);
  52. if (res.code === 0) {
  53. const data = res.data;
  54. setDirCode(data.dirCode);
  55. // 展示图片
  56. ZupFilesRef2.current?.setFileComFileFu({
  57. type: "img",
  58. fileList: data.files || [],
  59. });
  60. // 设置标题的 音频
  61. if (data.fileName && data.filePath) {
  62. setNameAudio({
  63. fileName: data.fileName,
  64. filePath: data.filePath,
  65. });
  66. }
  67. // 设置富文本
  68. ZRichTextRef.current?.ritxtShowFu(JSON.parse(data.rtf));
  69. const obj = {
  70. ...data,
  71. myTime: dayjs(data.datePublish),
  72. };
  73. FormBoxRef.current?.setFieldsValue(obj);
  74. }
  75. }, []);
  76. // 附件 是否 已经点击过确定
  77. const [fileCheck, setFileCheck] = useState(false);
  78. // 没有通过校验
  79. const onFinishFailed = useCallback(() => {
  80. setFileCheck(true);
  81. }, []);
  82. // 通过校验点击确定
  83. const onFinish = useCallback(
  84. async (values: any) => {
  85. setFileCheck(true);
  86. // 图片的校验
  87. const { sonFileIds: fileIds, coverUrl } =
  88. ZupFilesRef2.current?.fileComFileResFu();
  89. if (fileIds.length <= 0) {
  90. return MessageFu.warning("请最少上传一张图片!");
  91. }
  92. // 富文本校验不通过
  93. const rtf = ZRichTextRef.current?.fatherBtnOkFu() || { flag: true };
  94. if (rtf.flag) return MessageFu.warning("请输入完整正文!");
  95. // 发布日期
  96. const datePublish = dayjs(values.myTime).format("YYYY-MM-DD");
  97. const obj = {
  98. ...values,
  99. id: editInfo.id > 0 ? editInfo.id : null,
  100. datePublish,
  101. thumb: coverUrl,
  102. rtf: JSON.stringify(rtf.val || ""),
  103. fileName: nameAudio.fileName,
  104. filePath: nameAudio.filePath,
  105. fileIds: fileIds.join(","),
  106. dirCode,
  107. };
  108. const res = await A3_APIsave(obj);
  109. if (res.code === 0) {
  110. MessageFu.success(`${editInfo.txt}成功!`);
  111. editInfo.id > 0 ? editTableFu() : addTableFu();
  112. closeFu();
  113. }
  114. },
  115. [addTableFu, closeFu, dirCode, editInfo, editTableFu, nameAudio]
  116. );
  117. useEffect(() => {
  118. if (editInfo.id > 0) {
  119. getInfoFu(editInfo.id);
  120. } else {
  121. setDirCode(Date.now() + "");
  122. FormBoxRef.current?.setFieldsValue({
  123. myTime: dayjs(Date.now()),
  124. sort: 999,
  125. display: 1,
  126. });
  127. }
  128. }, [editInfo.id, getInfoFu]);
  129. return (
  130. <div className={styles.A3add}>
  131. <div
  132. className={classNames(
  133. "A3eMain",
  134. editInfo.txt === "查看" ? "A3eMainLook" : ""
  135. )}
  136. >
  137. <Form
  138. ref={FormBoxRef}
  139. name="basic"
  140. labelCol={{ span: 3 }}
  141. onFinish={onFinish}
  142. onFinishFailed={onFinishFailed}
  143. autoComplete="off"
  144. scrollToFirstError
  145. >
  146. <div className="A3fromRow">
  147. <Form.Item
  148. label="名称"
  149. name="name"
  150. rules={[{ required: true, message: "请输入名称!" }]}
  151. // getValueFromEvent={(e) => e.target.value.replace(/\s+/g, "")}
  152. >
  153. <TextArea
  154. readOnly={editInfo.txt === "查看"}
  155. style={{ width: "500px" }}
  156. maxLength={100}
  157. showCount
  158. placeholder="请输入内容"
  159. />
  160. </Form.Item>
  161. {/* 标题的无障碍音频 */}
  162. <div className="A3_1Frow">
  163. <ZupAudio
  164. fileInfo={nameAudio}
  165. upDataFu={(info) => setNameAudio(info)}
  166. delFu={() => setNameAudio({ fileName: "", filePath: "" })}
  167. dirCode={dirCode}
  168. myUrl="cms/collection/upload"
  169. isLook={editInfo.txt === "查看"}
  170. />
  171. </div>
  172. </div>
  173. {/* 图片 */}
  174. <div className="formRow">
  175. <div className="formLeft">
  176. <span>* </span>
  177. 图片:
  178. </div>
  179. <div className="formRight">
  180. <ZupTypes
  181. ref={ZupFilesRef2}
  182. selecFlag="图片"
  183. fileCheck={fileCheck}
  184. dirCode={dirCode}
  185. myUrl="cms/collection/upload"
  186. isLook={editInfo.txt === "查看"}
  187. imgLength={50}
  188. isTypeShow={true}
  189. lastImgTxt="第一张将作为封面"
  190. oneIsCover={true}
  191. />
  192. </div>
  193. </div>
  194. <Form.Item
  195. label="类别"
  196. name="type"
  197. rules={[{ required: true, message: "请选择类别!" }]}
  198. >
  199. <Select
  200. placeholder="请选择类别"
  201. style={{ width: 200 }}
  202. options={A3Selct_1.filter((v) => v.label !== "全部")}
  203. />
  204. </Form.Item>
  205. <Form.Item
  206. label="年代"
  207. name="dictAgeId"
  208. rules={[{ required: true, message: "请选择年代!" }]}
  209. >
  210. <Select
  211. placeholder="请选择年代"
  212. style={{ width: 200 }}
  213. options={selectAgeArr.filter((v) => v.label !== "全部")}
  214. />
  215. </Form.Item>
  216. <Form.Item label="作者" name="author">
  217. <Input
  218. readOnly={editInfo.txt === "查看"}
  219. maxLength={50}
  220. showCount
  221. placeholder="请输入内容"
  222. />
  223. </Form.Item>
  224. <Form.Item label="尺寸" name="size">
  225. <Input
  226. readOnly={editInfo.txt === "查看"}
  227. maxLength={50}
  228. showCount
  229. placeholder="请输入内容"
  230. />
  231. </Form.Item>
  232. <Form.Item label="摘要" name="digest">
  233. <TextArea
  234. readOnly={editInfo.txt === "查看"}
  235. placeholder="请输入内容"
  236. maxLength={500}
  237. showCount
  238. />
  239. </Form.Item>
  240. {/* 简介 */}
  241. <div className="formRow">
  242. <div className="formLeft">
  243. <span>* </span>
  244. 简介:
  245. </div>
  246. <div className="formRight">
  247. <ZRichTexts
  248. check={fileCheck}
  249. dirCode={dirCode}
  250. isLook={editInfo.txt === "查看"}
  251. ref={ZRichTextRef}
  252. myUrl="cms/collection/upload"
  253. isOne={true}
  254. />
  255. </div>
  256. </div>
  257. <Form.Item
  258. label="发布日期"
  259. name="myTime"
  260. rules={[{ required: true, message: "请选择发布日期!" }]}
  261. >
  262. <DatePicker />
  263. </Form.Item>
  264. <div className="A3fromRow">
  265. <Form.Item
  266. label="排序值"
  267. name="sort"
  268. rules={[{ required: true, message: "请输入排序值!" }]}
  269. >
  270. <InputNumber
  271. min={1}
  272. max={999}
  273. precision={0}
  274. placeholder="请输入"
  275. />
  276. </Form.Item>
  277. <div className="A3_6Frow" hidden={editInfo.txt === "查看"}>
  278. 请输入1~999的数字。数字越小,排序越靠前。数字相同时,更新发布的内容排在前面
  279. </div>
  280. </div>
  281. <Form.Item
  282. label="状态"
  283. name="display"
  284. rules={[{ required: true, message: "请选择状态!" }]}
  285. >
  286. <Select
  287. placeholder="请选择状态"
  288. style={{ width: 149 }}
  289. options={[
  290. { value: 1, label: "发布" },
  291. { value: 0, label: "不发布" },
  292. ]}
  293. />
  294. </Form.Item>
  295. {/* 确定和取消按钮 */}
  296. <Form.Item className="A3Ebtn">
  297. {editInfo.txt === "查看" ? (
  298. <Button onClick={closeFu}>返回</Button>
  299. ) : (
  300. <>
  301. <Button type="primary" htmlType="submit">
  302. 提交
  303. </Button>
  304. <br />
  305. <br />
  306. <MyPopconfirm txtK="取消" onConfirm={closeFu} />
  307. </>
  308. )}
  309. </Form.Item>
  310. </Form>
  311. </div>
  312. </div>
  313. );
  314. }
  315. const MemoA3add = React.memo(A3add);
  316. export default MemoA3add;