UNPKG

@gdimx/ngx-input-validator

Version:

Libreriía de validaciones reutilizables para formularios en angular

127 lines (126 loc) 4.98 kB
export class NgxInputValidator { // Requiere que el campo no se encuentre vacío static required(control) { return control.value?.toString().trim() ? null : { required: true }; } // Valida si el campo es un correo electrónico static email(control) { const regex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/; return regex.test(control.value) ? null : { email: true }; } // Valida que solo haya letras static alpha(control) { const regex = /^[a-zA-ZÀ-ÿ\u00f1\u00d1\s]*$/; return regex.test(control.value) ? null : { alpha: true }; } // Valida alphanuméricos static alphaNumeric(control) { const regex = /^[a-zA-Z0-9]*$/; return regex.test(control.value) ? null : { alphaNumeric: true }; } // Valida solo números static numeric(control) { const regex = /^\d+$/; return regex.test(control.value) ? null : { numeric: true }; } // Valida mínima longitud static minLength(min) { return (control) => { return control.value?.length >= min ? null : { minLength: { requiredLength: min } }; }; } // Valida máxima longitud static maxLength(max) { return (control) => { return control.value?.length <= max ? null : { maxLength: { requiredLength: max } }; }; } // Valida caracteres permitidos personalizados static allowedCharacters(regex, errorKey = 'invalidCharacters') { return (control) => { return regex.test(control.value) ? null : { [errorKey]: true }; }; } static noSpaces(control) { const regex = /^\S*$/; return regex.test(control.value) ? null : { noSpaces: true }; } static onlyUppercase(control) { const regex = /^[A-Z0-9\s]*$/; return regex.test(control.value) ? null : { onlyUppercase: true }; } static onlyLowercase(control) { const regex = /^[a-z0-9\s]*$/; return regex.test(control.value) ? null : { onlyLowercase: true }; } static disallowedCharacters(regex, errorKey = 'forbiddenCharacters') { return (control) => { return regex.test(control.value) ? { [errorKey]: true } : null; }; } static decimal(control) { const regex = /^\d+(\.\d+)?$/; return regex.test(control.value) ? null : { decimal: true }; } static rfc(control) { const regex = /^[A-ZÑ&]{3,4}\d{6}[A-Z0-9]{3}$/; return regex.test(control.value?.toUpperCase()) ? null : { rfc: true }; } static curp(control) { const regex = /^[A-Z][AEIOUX][A-Z]{2}\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])[HM](AS|BC|BS|CC|CL|CM|CS|CH|DF|DG|GT|GR|HG|JC|MC|MN|MS|NT|NL|OC|PL|QT|QR|SP|SL|SR|TC|TS|TL|VZ|YN|ZS)[B-DF-HJ-NP-TV-Z]{3}[A-Z\d]\d$/; return regex.test(control.value?.toUpperCase()) ? null : { curp: true }; } // Mensajes de error centralizados static getErrorMessage(control) { if (!control || !control.errors) return ''; const errors = control.errors; if (errors.required) return 'Este campo es obligatorio'; if (errors.email) return 'Correo electrónico no válido'; if (errors.alpha) return 'Solo letras permitidas'; if (errors.alphaNumeric) return 'Solo caracteres alfanuméricos permitidos'; if (errors.numeric) return 'Solo números permitidos'; if (errors.minLength) return `Mínimo ${errors.minLength.requiredLength} caracteres`; if (errors.maxLength) return `Máximo ${errors.maxLength.requiredLength} caracteres`; if (errors.invalidCharacters) return 'Contiene caracteres no permitidos'; if (errors.noSpaces) return 'No se permiten espacios'; if (errors.onlyUppercase) return 'Solo mayúsculas permitidas'; if (errors.onlyLowercase) return 'Solo minúsculas permitidas'; if (errors.invalidCharacters) return 'Contiene caracteres no permitidos'; if (errors.forbiddenCharacters) return 'Contiene caracteres prohibidos'; if (errors.decimal) return 'Debe ser un número decimal'; if (errors.rfc) return 'RFC inválido'; if (errors.curp) return 'CURP inválido'; return 'Campo invalido'; } // Devuelve en un solo string todos los mensajes del error del formulario static getAllFormErrors(form) { if (!form || typeof form !== 'object') return ''; const messages = []; Object.keys(form.controls).forEach(key => { const control = form.get(key); const message = this.getErrorMessage(control); if (message) { messages.push(`• ${message}`); } }); return messages.join('\n'); } }