A2add.tsx 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. import React, { useCallback, useEffect, useRef, useState } from 'react'
  2. import styles from './index.module.scss'
  3. import { Button, Cascader, Form, FormInstance, Input, InputNumber, Modal } from 'antd'
  4. import MyPopconfirm from '@/components/MyPopconfirm'
  5. import { useSelector } from 'react-redux'
  6. import { RootState } from '@/store'
  7. import { A2_APIgetInfo1, A2_APIsave1 } from '@/store/action/A2classify'
  8. import { MessageFu } from '@/utils/message'
  9. import { A2TreeType } from '@/types'
  10. export type A2AddInfoType = {
  11. id: number
  12. txt: '新增' | '编辑'
  13. acInfo: A2TreeType
  14. }
  15. type Props = {
  16. addInfo: A2AddInfoType
  17. addFu: () => void
  18. closeFu: () => void
  19. }
  20. function A2add({ addInfo, addFu, closeFu }: Props) {
  21. const treeData = useSelector((state: RootState) => state.A2classify.treeData)
  22. // 级联选择器改变的时候 筛选当前级联的 信息出来
  23. const [acCardInfo, setAcCardInfo] = useState({} as A2TreeType)
  24. const [parentIdArr, setParentIdArr] = useState<number[] | null>(null)
  25. // useEffect(() => {
  26. // console.log(acCardInfo, parentIdArr)
  27. // }, [acCardInfo, parentIdArr])
  28. useEffect(() => {
  29. setAcCardInfo(addInfo.acInfo)
  30. let ids: number[] | null = addInfo.acInfo.id ? [addInfo.acInfo.id] : null
  31. if (addInfo.acInfo.ancestor)
  32. ids = [...addInfo.acInfo.ancestor.split(',').map(v => Number(v)), addInfo.acInfo.id]
  33. setParentIdArr(ids)
  34. }, [addInfo.acInfo])
  35. const cardChange = useCallback((aa: any, bb: any) => {
  36. setParentIdArr(aa)
  37. if (bb && bb.length) setAcCardInfo(bb[bb.length - 1])
  38. else setAcCardInfo({} as A2TreeType)
  39. }, [])
  40. const getInfoFu = useCallback(async (id: number) => {
  41. const res = await A2_APIgetInfo1(id)
  42. if (res.code === 0) {
  43. FormBoxRef.current?.setFieldsValue({
  44. ...res.data
  45. })
  46. }
  47. }, [])
  48. useEffect(() => {
  49. if (addInfo.txt === '编辑') getInfoFu(addInfo.id)
  50. else {
  51. FormBoxRef.current?.setFieldsValue({
  52. sort: 999
  53. })
  54. }
  55. }, [addInfo.id, addInfo.txt, getInfoFu])
  56. // 设置表单初始数据(区分编辑和新增)
  57. const FormBoxRef = useRef<FormInstance>(null)
  58. // 没有通过校验
  59. const onFinishFailed = useCallback(() => {
  60. // return MessageFu.warning("有表单不符号规则!");
  61. }, [])
  62. // 通过校验点击确定
  63. const onFinish = useCallback(
  64. async (values: any) => {
  65. let ancestor = ''
  66. let parentId: number | null = null
  67. if (parentIdArr && parentIdArr.length >= 5 && addInfo.txt === '新增')
  68. return MessageFu.warning('最多支持五级!')
  69. if (acCardInfo) parentId = addInfo.txt === '编辑' ? acCardInfo.parentId : acCardInfo.id
  70. if (parentIdArr && parentId) ancestor = parentIdArr.filter(v => v !== addInfo.id).join(',')
  71. let level = 1
  72. if (parentIdArr) {
  73. level = addInfo.txt === '新增' ? acCardInfo.level + 1 : acCardInfo.level
  74. }
  75. const obj = {
  76. ...values,
  77. id: addInfo.id > 0 ? addInfo.id : null,
  78. ancestor,
  79. level,
  80. parentId
  81. }
  82. // console.log(123, obj)
  83. // if (1 + 1 === 2) {
  84. // return
  85. // }
  86. const res = await A2_APIsave1(obj)
  87. if (res.code === 0) {
  88. MessageFu.success(addInfo.txt + '成功!')
  89. addFu()
  90. closeFu()
  91. }
  92. },
  93. [acCardInfo, addFu, addInfo.id, addInfo.txt, closeFu, parentIdArr]
  94. )
  95. return (
  96. <Modal
  97. wrapClassName={styles.A2add}
  98. open={true}
  99. title={`${addInfo.txt} - 中图法分类`}
  100. footer={
  101. [] // 设置footer为空,去掉 取消 确定默认按钮
  102. }
  103. >
  104. <div className='A2aMain'>
  105. <Form
  106. scrollToFirstError={true}
  107. ref={FormBoxRef}
  108. name='basic'
  109. labelCol={{ span: 3 }}
  110. onFinish={onFinish}
  111. onFinishFailed={onFinishFailed}
  112. autoComplete='off'
  113. >
  114. <div className='fromRow' hidden={addInfo.txt === '编辑'}>
  115. <div className='fromRowll'>{addInfo.txt === '新增' ? '父级' : '当前'}分类:</div>
  116. <div className='fromRowrr'>
  117. <Cascader
  118. style={{ width: 658 }}
  119. disabled={addInfo.txt === '编辑'}
  120. changeOnSelect
  121. fieldNames={{ label: 'name', value: 'id', children: 'children' }}
  122. options={treeData}
  123. placeholder='请选择'
  124. value={parentIdArr ? [...parentIdArr] : []}
  125. onChange={cardChange}
  126. />
  127. </div>
  128. </div>
  129. <Form.Item
  130. label='分类编号'
  131. name='num'
  132. rules={[{ required: true, message: '请输入分类编号!' }]}
  133. getValueFromEvent={e => e.target.value.replace(/\s+/g, '')}
  134. >
  135. <Input maxLength={20} showCount placeholder='请输入内容' />
  136. </Form.Item>
  137. <Form.Item
  138. label='分类名称'
  139. name='name'
  140. rules={[{ required: true, message: '请输入分类名称!' }]}
  141. getValueFromEvent={e => e.target.value.replace(/\s+/g, '')}
  142. >
  143. <Input maxLength={20} showCount placeholder='请输入内容' />
  144. </Form.Item>
  145. <div className='fromRow2'>
  146. <Form.Item
  147. label='排序值'
  148. name='sort'
  149. rules={[{ required: true, message: '请输入排序值!' }]}
  150. >
  151. <InputNumber min={1} max={999} precision={0} placeholder='请输入' />
  152. </Form.Item>
  153. <div className='fromRowTit'>
  154. 请输入1~999的数字。数字越小,排序越靠前。数字相同时,更新发布的内容排在前面
  155. </div>
  156. </div>
  157. {/* 确定和取消按钮 */}
  158. <br />
  159. <Form.Item wrapperCol={{ offset: 9, span: 16 }}>
  160. <Button type='primary' htmlType='submit'>
  161. 提交
  162. </Button>
  163. &emsp;
  164. <MyPopconfirm txtK='取消' onConfirm={closeFu} />
  165. </Form.Item>
  166. </Form>
  167. </div>
  168. </Modal>
  169. )
  170. }
  171. const MemoA2add = React.memo(A2add)
  172. export default MemoA2add