A2add.tsx 6.1 KB

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