From f323cd8575e53eba390c9d7c45803823211c0a0a Mon Sep 17 00:00:00 2001 From: Viky-Gomez <20200999@uaz.edu.mx> Date: Fri, 13 Sep 2024 13:39:33 -0600 Subject: [PATCH] Validaciones para documentos de una modalidad --- .../src/components/FormsValidations.jsx | 85 +++++--- .../common/utility/HeaderSection.jsx | 2 +- .../components/common/utility/InputFile.jsx | 9 +- .../components/common/utility/InputMonto.jsx | 9 +- .../common/utility/StatusDocument.jsx | 4 +- .../src/components/modalidades/Modalidad.jsx | 199 +++++++++++++++--- 6 files changed, 239 insertions(+), 69 deletions(-) diff --git a/cosiap_frontend/src/components/FormsValidations.jsx b/cosiap_frontend/src/components/FormsValidations.jsx index 076e4e8..626e4d9 100644 --- a/cosiap_frontend/src/components/FormsValidations.jsx +++ b/cosiap_frontend/src/components/FormsValidations.jsx @@ -1,57 +1,72 @@ import * as Yup from "yup"; - // Variable de formato para validación de formato de CURP -const CURP_REGEX = /^[A-Z]{1}[AEIOU]{1}[A-Z]{2}[0-9]{2}(0[1-9]|1[0-2])(0[1-9]|1[0-9]|2[0-9]|3[0-1])[HM]{1}(AS|BC|BS|CC|CH|CL|CM|DF|DG|GT|GR|HG|JC|MC|MN|MS|NT|NL|OC|PL|QT|QR|SP|SL|SR|TC|TS|TL|VZ|YN|ZS|NE)[B-DF-HJ-NP-TV-Z]{3}[0-9A-Z]{1}[0-9]{1}$/; +const CURP_REGEX = + /^[A-Z]{1}[AEIOU]{1}[A-Z]{2}[0-9]{2}(0[1-9]|1[0-2])(0[1-9]|1[0-9]|2[0-9]|3[0-1])[HM]{1}(AS|BC|BS|CC|CH|CL|CM|DF|DG|GT|GR|HG|JC|MC|MN|MS|NT|NL|OC|PL|QT|QR|SP|SL|SR|TC|TS|TL|VZ|YN|ZS|NE)[B-DF-HJ-NP-TV-Z]{3}[0-9A-Z]{1}[0-9]{1}$/; // Validación de un campo CURP const CURP_VALIDATION = Yup.string() - .required("La CURP es requerida") - .matches(CURP_REGEX, "Formato de CURP inválido"); - + .required("La CURP es requerida") + .matches(CURP_REGEX, "Formato de CURP inválido"); const PASSWORD_CREATION_VALIDATION = Yup.string() - .required("La contraseña es requerida") - .min(8, 'La contraseña debe tener al menos 8 caracteres') - .max(20, 'La contraseña no puede tener más de 20 caracteres') - .matches(/\d/, 'Debe contener al menos un número') - .matches(/[a-z]/, 'Debe contener al menos una letra minúscula') - .matches(/[A-Z]/, 'Debe contener al menos una letra mayúscula') - .matches(/[@$#¡!%*¿?&]/, 'Debe contener al menos un carácter especial') - .matches(/^\S*$/, 'La contraseña no puede contener espacios'); + .required("La contraseña es requerida") + .min(8, "La contraseña debe tener al menos 8 caracteres") + .max(20, "La contraseña no puede tener más de 20 caracteres") + .matches(/\d/, "Debe contener al menos un número") + .matches(/[a-z]/, "Debe contener al menos una letra minúscula") + .matches(/[A-Z]/, "Debe contener al menos una letra mayúscula") + .matches(/[@$#¡!%*¿?&]/, "Debe contener al menos un carácter especial") + .matches(/^\S*$/, "La contraseña no puede contener espacios"); const CONFIRM_PASSWORD_VALIDATION = Yup.string() - .required("La confirmacion de la contraseña es requerida") - .oneOf([Yup.ref('password'), null], 'Las contraseñas no coinciden'); - - - + .required("La confirmacion de la contraseña es requerida") + .oneOf([Yup.ref("password"), null], "Las contraseñas no coinciden"); export const LoginValidationSchema = Yup.object().shape({ - curp: CURP_VALIDATION, - password: Yup.string() - .required("La contraseña es requerida") + curp: CURP_VALIDATION, + password: Yup.string().required("La contraseña es requerida"), }); export const RegisterValidationSchema = Yup.object({ - nombre: Yup.string() - .required('El nombre es requerido') - .min(3, 'El nombre debe tener al menos 3 caracteres'), - curp: CURP_VALIDATION, - email: Yup.string() - .required("El correo electronico es requerido") - .email("El correo electronico no es válido"), - password: PASSWORD_CREATION_VALIDATION, - confirmar_password: CONFIRM_PASSWORD_VALIDATION + nombre: Yup.string() + .required("El nombre es requerido") + .min(3, "El nombre debe tener al menos 3 caracteres"), + curp: CURP_VALIDATION, + email: Yup.string() + .required("El correo electronico es requerido") + .email("El correo electronico no es válido"), + password: PASSWORD_CREATION_VALIDATION, + confirmar_password: CONFIRM_PASSWORD_VALIDATION, }); export const ResetPasswordValidationSchema = Yup.object().shape({ - email: Yup.string() - .required("El correo electronico es requerido") - .email("El correo electronico no es válido") + email: Yup.string() + .required("El correo electronico es requerido") + .email("El correo electronico no es válido"), }); export const NewPasswordValidationSchema = Yup.object().shape({ - password: PASSWORD_CREATION_VALIDATION, - confirmar_password: CONFIRM_PASSWORD_VALIDATION + password: PASSWORD_CREATION_VALIDATION, + confirmar_password: CONFIRM_PASSWORD_VALIDATION, +}); + +const FILE_SIZE = 5 * 1024 * 1024; // Tamaño máximo de archivo en bytes (5MB) +const SUPPORTED_FORMATS = ['application/pdf']; + +export const PDF_FileValidation = Yup.mixed() + .required("Este campo es requerido") + .test("fileFormat", "Formato de archivo no soportado", (value) => value && SUPPORTED_FORMATS.includes(value.type) + ) + .test("fileSize", "El archivo supera el tamaño máximo", (value) => value && value.size <= FILE_SIZE); + +export const MontoValidation = Yup.number() + .typeError("El monto debe ser un número válido") + .required("El monto es requerido") + .positive("El monto debe ser mayor a 0") + .max(1000000, "El monto no puede ser muy grande"); + +export const FormValidationSchema = Yup.object({ + archivo: PDF_FileValidation, + monto: MontoValidation, }); diff --git a/cosiap_frontend/src/components/common/utility/HeaderSection.jsx b/cosiap_frontend/src/components/common/utility/HeaderSection.jsx index a372cca..130a977 100644 --- a/cosiap_frontend/src/components/common/utility/HeaderSection.jsx +++ b/cosiap_frontend/src/components/common/utility/HeaderSection.jsx @@ -1,6 +1,6 @@ export default function HeaderSection({ title }) { return ( -
+

diff --git a/cosiap_frontend/src/components/common/utility/InputFile.jsx b/cosiap_frontend/src/components/common/utility/InputFile.jsx index daf4db1..327c01e 100644 --- a/cosiap_frontend/src/components/common/utility/InputFile.jsx +++ b/cosiap_frontend/src/components/common/utility/InputFile.jsx @@ -1,14 +1,15 @@ -export default function InputFile({ titleBtn, descBtn }) { +export default function InputFile({ titleBtn, descBtn, onChange, hasError }) { return (