CondicionanteDetalle.jsx 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. import { Form, Input, Button, Spin, Row, Col, Switch, Select as AntdSelect, Checkbox } from 'antd'
  2. import { useEffect, useMemo, useState } from 'react'
  3. import HttpService from '../../services/httpService'
  4. import { respuestas } from '../../utilities'
  5. import { useNavigate } from 'react-router-dom'
  6. import { useQuery, useModel } from '../../hooks'
  7. import { commonRules } from '../../constants/rules'
  8. import { Select } from '../../components'
  9. const selectores = {
  10. productos: {
  11. name: "producto",
  12. expand: "subproductos",
  13. },
  14. }
  15. const endpoints = {
  16. condicionante: "condicionante",
  17. };
  18. const amplitudes = [
  19. {
  20. value: "Familia",
  21. label: "Familia",
  22. },
  23. {
  24. value: "Familia (Varios)",
  25. label: "Familia (Varios)",
  26. },
  27. ]
  28. const fines = [
  29. {
  30. value: "Consumo Humano",
  31. label: "Consumo Humano",
  32. },
  33. {
  34. value: "Polinización",
  35. label: "Polinización",
  36. }
  37. ]
  38. const tipos = [
  39. {
  40. value: "Introducción",
  41. label: "Introducción",
  42. },
  43. {
  44. value: "Expotación",
  45. label: "Expotación",
  46. },
  47. {
  48. value: "Tránsito",
  49. label: "Tránsito",
  50. },
  51. {
  52. value: "Movilización (Salida)",
  53. label: "Movilización (Salida)",
  54. },
  55. {
  56. value: "Importación",
  57. label: "Importación",
  58. }
  59. ]
  60. const ProductoDetalle = () => {
  61. const [form] = Form.useForm()
  62. const navigate = useNavigate()
  63. const [loading, setLoading] = useState(false)
  64. const query = useQuery()
  65. const id = query.get("id")
  66. const [request, setRequest] = useState({})
  67. const [activa, setActiva] = useState(false)
  68. const [subproductos, setSubproductos] = useState([])
  69. // const extraParams = useMemo(() => ({
  70. // idAgenda: id,
  71. // }), [id])
  72. const requestParams = useMemo(() => ({
  73. name: endpoints.condicionante,
  74. // expand: 'subproductos',
  75. id,
  76. // extraParams
  77. }), [id])
  78. const { model, modelLoading } = useModel(request)
  79. useEffect(() => {
  80. if (id) {
  81. setRequest(requestParams)
  82. }
  83. return () => {
  84. setRequest({})
  85. }
  86. }, [id, requestParams])
  87. useEffect(() => {
  88. if (model) {
  89. form.setFieldsValue({ //seteo cuando son varios
  90. ...model,
  91. subproductos: model.subproductos.map((subproducto, index) => ({
  92. ...subproducto,
  93. key: index
  94. }))
  95. })
  96. if (model?.activa) {
  97. setActiva(true)
  98. }
  99. }
  100. }, [form, model])
  101. const onFinish = async (values) => {
  102. try {
  103. setLoading(true);
  104. let body = {
  105. ...values,
  106. };
  107. if (id) {
  108. body.id = id
  109. }
  110. const res = await HttpService.post(`${endpoints.producto}/guardar`, body);
  111. respuestas(res);
  112. if (res?.status === 200) {
  113. navigate('/condicionantes')
  114. }
  115. } catch (error) {
  116. console.log(error);
  117. setLoading(false);
  118. } finally {
  119. setLoading(false);
  120. }
  121. }
  122. if (modelLoading) {
  123. return <Spin
  124. size="large"
  125. style={{ display: "block", margin: "auto", marginTop: "50px" }}
  126. />
  127. }
  128. return (
  129. <Form
  130. layout="vertical"
  131. name="basic"
  132. form={form}
  133. onFinish={onFinish}
  134. onFinishFailed={() => { }}
  135. >
  136. <Row gutter={16}>
  137. <Col span={24}>
  138. <h2>Información del Condicionante</h2>
  139. </Col>
  140. <Col md={8} xs={24}>
  141. <Form.Item
  142. label="Título"
  143. name="titulo"
  144. rules={[
  145. commonRules.requerido,
  146. ]}
  147. >
  148. <Input />
  149. </Form.Item>
  150. </Col>
  151. <Col md={8} xs={24}>
  152. <Form.Item
  153. label="Descripción"
  154. name="descripcion"
  155. rules={[
  156. commonRules.requerido,
  157. ]}
  158. >
  159. <Input.TextArea rows={3} />
  160. </Form.Item>
  161. </Col>
  162. <Col md={8} xs={24}>
  163. <Form.Item
  164. label="Activa"
  165. name="activa"
  166. >
  167. <Switch
  168. checkedChildren="Si"
  169. unCheckedChildren="No"
  170. style={{ backgroundColor: activa ? "#52c41a" : "#f5222d" }}
  171. checked={activa}
  172. onChange={(checked) => setActiva(checked)}
  173. />
  174. </Form.Item>
  175. </Col>
  176. <Col md={8} xs={24}>
  177. <Form.Item
  178. label="Amplitud"
  179. name="amplitud"
  180. rules={[
  181. commonRules.requerido,
  182. ]}
  183. >
  184. <AntdSelect
  185. showSearch
  186. placeholder="Seleccione una amplitud"
  187. optionFilterProp="children"
  188. filterOption={(input, option) =>
  189. option.children.toLowerCase().indexOf(input.toLowerCase()) >= 0
  190. }
  191. >
  192. {amplitudes.map((amplitud) => (
  193. <AntdSelect.Option key={amplitud.value} value={amplitud.value}>
  194. {amplitud.label}
  195. </AntdSelect.Option>
  196. ))}
  197. </AntdSelect>
  198. </Form.Item>
  199. </Col>
  200. <Col md={8} xs={24}>
  201. <Form.Item
  202. label="Fines de Movilización"
  203. name="fines"
  204. rules={[
  205. commonRules.requerido,
  206. ]}
  207. >
  208. <Checkbox.Group>
  209. {fines.map((fin) => (
  210. <Checkbox key={fin.value} value={fin.value}>
  211. {fin.label}
  212. </Checkbox>
  213. ))}
  214. </Checkbox.Group>
  215. </Form.Item>
  216. </Col>
  217. <Col md={8} xs={24}>
  218. <Form.Item
  219. label="Tipo de Movilización"
  220. name="tipos"
  221. rules={[
  222. commonRules.requerido,
  223. ]}
  224. >
  225. <Checkbox.Group>
  226. {tipos.map((tipo) => (
  227. <Checkbox key={tipo.value} value={tipo.value}>
  228. {tipo.label}
  229. </Checkbox>
  230. ))}
  231. </Checkbox.Group>
  232. </Form.Item>
  233. </Col>
  234. <Col md={8} xs={24}>
  235. <Form.Item
  236. label="Especies"
  237. name="idProducto"
  238. rules={[commonRules.requerido]}
  239. >
  240. <Select
  241. modelsParams={selectores.productos}
  242. labelProp="nombre"
  243. valueProp="idProducto"
  244. append={[model?.producto]}
  245. extraParams={{ padre: true }}
  246. onChange={(_, item) => {
  247. setSubproductos(item?.subproductos)
  248. console.log(item)
  249. }}
  250. />
  251. </Form.Item>
  252. </Col>
  253. <Col md={8} xs={24}>
  254. <Form.Item
  255. label="Subproductos"
  256. name="subproductos"
  257. >
  258. <Checkbox.Group>
  259. {subproductos.map((subproducto) => (
  260. <Checkbox key={subproducto?.id} value={subproducto?.id}>
  261. {subproducto?.nombre}
  262. </Checkbox>
  263. ))}
  264. </Checkbox.Group>
  265. </Form.Item>
  266. </Col>
  267. <Col span={24}>
  268. <Form.Item>
  269. <Button
  270. type="primary"
  271. htmlType="submit"
  272. style={{ marginTop: "30px" }}
  273. loading={loading}
  274. >
  275. Guardar
  276. </Button>
  277. </Form.Item>
  278. </Col>
  279. </Row>
  280. </Form>
  281. )
  282. }
  283. export default ProductoDetalle