Reac front end for psicometric app

AgregarManual.js 6.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. import React from 'react';
  2. import * as Yup from 'yup';
  3. import { Formik, Field, Form } from 'formik';
  4. import { Row, Col, Modal, Button} from 'react-bootstrap'
  5. import NotFound from '../../Images/not_found.png';
  6. const SUPPORTED_FORMATS = ["image/jpg", "image/jpeg", "image/gif", "image/png"];
  7. const NewPlazaSchema = Yup.object().shape({
  8. nombre : Yup.string().required('El nombre es requerido').min(5).max(20),
  9. description : Yup.string().required('La description es requerida').min(5).max(20),
  10. salario : Yup.number().required('El salario es requerido'),
  11. imagen: Yup.mixed().required('El imagen es requerido').test('fileSize', "El archivo es demasiado grande", value => {
  12. if(!value || value.length <= 0) return false
  13. return value[0].size < 200000
  14. }).test('fileType', "El tipo del archivo no es válido", value => {
  15. if(!value) return false
  16. return SUPPORTED_FORMATS.includes(value[0].type)
  17. })
  18. })
  19. export default function Manual ( props ) {
  20. let [ filename, setFilename ] = React.useState('');
  21. let [ file, setFile ] = React.useState(undefined);
  22. let [ type, setType ] = React.useState(undefined);
  23. let [ validType, setValidType ] = React.useState(false);
  24. let { visible, onClose, success } = props
  25. const hiddenFileInput = React.useRef(null);
  26. const PickFile = event => hiddenFileInput.current.click();
  27. React.useEffect(() => {
  28. if( SUPPORTED_FORMATS.includes(type) ){
  29. setValidType(true)
  30. }else{
  31. setValidType(false)
  32. }
  33. }, [type])
  34. return (
  35. <Modal size="lg" aria-labelledby="contained-modal-title-vcenter" centered show={visible} onHide={onClose}>
  36. <Modal.Header>
  37. <button onClick={onClose} type="button" className="close" data-dismiss="modal">&times;</button>
  38. <h4 className="modal-title">Agregar plaza</h4>
  39. </Modal.Header>
  40. <Modal.Body className="modal-body">
  41. <Formik
  42. initialValues={{
  43. nombre: '',
  44. description: '',
  45. salario: '',
  46. imagen: '',
  47. }}
  48. validationSchema={NewPlazaSchema}
  49. onSubmit={ (values) => {
  50. // console.log('VALUES >> ',values)
  51. success();
  52. props.setManual(false)
  53. }} >
  54. { ({ errors, touched, validateField, validateForm, setFieldValue }) => (
  55. <Form>
  56. <Row>
  57. <Col md="4">
  58. <div className="img-container">
  59. <img alt="agregar plaza manual" src={ validType ? file : NotFound}/>
  60. </div>
  61. </Col>
  62. <Col md="8">
  63. <input
  64. value={filename}
  65. type="text"
  66. className="file-upload-input"
  67. disabled=""
  68. placeholder="Ningún archivo seleccionado" readOnly
  69. />
  70. <Button className="btn_add_producto_confirm" style={{ marginLeft : 15 }} onClick={PickFile}>
  71. SUBIR FOTO
  72. </Button>
  73. {errors.imagen && touched.imagen && <div className="error_feedback">{errors.imagen}</div>}
  74. <input
  75. multiple={false}
  76. type="file"
  77. ref={hiddenFileInput}
  78. onChange={(event) => {
  79. const files = event.target.files;
  80. console.log('files crud ', files[0])
  81. let myFiles =Array.from(files);
  82. setFieldValue("imagen", myFiles);
  83. setFilename(myFiles[0].name)
  84. setType(myFiles[0].type)
  85. const objectUrl = URL.createObjectURL(files[0])
  86. setFile(objectUrl)
  87. }}
  88. style={{display: 'none'}}
  89. />
  90. </Col>
  91. </Row>
  92. <div className="data_product">
  93. <Row>
  94. <Col md="12">
  95. {errors.nombre && touched.nombre && <div className="error_feedback">{errors.nombre}</div>}
  96. <Field name="nombre" placeholder="Nombre de la plaza"/>
  97. {errors.description && touched.description && <div className="error_feedback">{errors.description}</div>}
  98. <Field name="description">
  99. {({ field, form, meta }) => {
  100. return(
  101. <textarea id="description" name="description" value={field.value} onChange={field.onChange} placeholder="Descripción general de la plaza"></textarea>
  102. )
  103. }}
  104. </Field>
  105. {errors.salario && touched.salario && <div className="error_feedback">{errors.salario}</div>}
  106. <Field name="salario" type="number" placeholder="Salario"/>
  107. </Col>
  108. <div className="add_producto_confirm">
  109. <button className="btn_add_producto_confirm" type="submit">Agregar plaza</button>
  110. </div>
  111. </Row>
  112. </div>
  113. </Form>
  114. )}
  115. </Formik>
  116. </Modal.Body>
  117. </Modal>
  118. )
  119. }