199 lines
6.4 KiB
JavaScript
199 lines
6.4 KiB
JavaScript
function isValidEmail(email) {
|
|
const emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
return emailPattern.test(email);
|
|
}
|
|
|
|
function validateField(fieldId, showErrors = true) {
|
|
try {
|
|
const inputElement = document.getElementById(fieldId);
|
|
|
|
if (!inputElement) {
|
|
return true;
|
|
}
|
|
|
|
const rawValue = inputElement.value;
|
|
const value = typeof rawValue === 'string' ? rawValue.trim() : String(rawValue ?? '').trim();
|
|
const hasValidationRules = typeof validationRules !== 'undefined' && validationRules;
|
|
const rule = hasValidationRules ? validationRules[fieldId] : null; // Importé de js/json/json-verif-form.js
|
|
const errorElement = document.getElementById(`${fieldId}-error`);
|
|
|
|
if (!rule) {
|
|
if (showErrors && errorElement) {
|
|
errorElement.textContent = "";
|
|
errorElement.style.display = 'none';
|
|
}
|
|
return true;
|
|
}
|
|
|
|
let isValid = true;
|
|
let errorMessage = "";
|
|
|
|
// Vérifie si le champ est requis et vide
|
|
if (rule.required && (!value || value == '')) {
|
|
errorMessage = "Ce champ est obligatoire.";
|
|
isValid = false;
|
|
}
|
|
|
|
// Vérifie la longueur de la saisie si spécifié et nécessaire
|
|
if (isValid && value && rule.length && value.length !== rule.length) {
|
|
errorMessage = `Veuillez saisir ${rule.length} caractères, il y en a actuellement ${value.length}.`;
|
|
isValid = false;
|
|
}
|
|
|
|
// Vérifie si la saisie est un nombre sans décimale ou avec un maximum de deux chiffres après la virgule
|
|
if (isValid && value && rule.numberFormat) {
|
|
const isNumberFormatValid = /^(?:\d+|\d+\.\d{1,2})$/.test(value);
|
|
|
|
if (!isNumberFormatValid) {
|
|
errorMessage = "Le champ doit être nombre de deux décimal maximum '00.00' ou entier '00'";
|
|
isValid = false;
|
|
}
|
|
}
|
|
|
|
// Vérifie si la saisie est un taux sans décimale ou avec un maximum de trois chiffres après la virgule
|
|
if (isValid && value && rule.tauxFormat) {
|
|
const isTauxFormatValid = /^(?:\d+|\d+\.\d{1,3})$/.test(value);
|
|
|
|
if (!isTauxFormatValid) {
|
|
errorMessage = "Le champ doit être un nombre avec un maximum de trois décimales '00.000' ou entier '00'";
|
|
isValid = false;
|
|
}
|
|
}
|
|
|
|
// Vérifie si le champ doit être compris dans un certain intervalle
|
|
if (isValid && value && rule.range) {
|
|
const numberValue = parseFloat(value);
|
|
|
|
if (isNaN(numberValue) || numberValue < rule.range.min || numberValue > rule.range.max) {
|
|
errorMessage = rule.errorMsg;
|
|
isValid = false;
|
|
}
|
|
}
|
|
|
|
// Valide l'adresse e-mail seulement si le champ n'est pas vide
|
|
if (isValid && value && rule.email) {
|
|
if (!isValidEmail(value)) {
|
|
errorMessage = rule.errorMsg;
|
|
isValid = false;
|
|
}
|
|
}
|
|
|
|
// Vérifie la présence de caractères potentiellement problématiques
|
|
const specialCharsPattern = /[;">&<]/g;
|
|
let invalidChars = value.match(specialCharsPattern);
|
|
|
|
if (isValid && value && invalidChars) {
|
|
invalidChars = [...new Set(invalidChars)];
|
|
errorMessage = `Caractère(s) invalide(s) détecté(s) [ ${invalidChars.join(" ")} ].`;
|
|
isValid = false;
|
|
}
|
|
|
|
// Vérifie si le champ commence par le caractère spécifié
|
|
if (isValid && value && rule.startsWith && !value.startsWith(rule.startsWith)) {
|
|
errorMessage = `Le champ doit commencer par '${rule.startsWith}' majuscule.`;
|
|
isValid = false;
|
|
}
|
|
|
|
// Vérifie si le champ date est correct
|
|
if (isValid && value && rule.dateFormat) {
|
|
const isDateFormatValid = /^(0[1-9]|[12][0-9]|3[01])\/(0[1-9]|1[012])\/\d{4}$|^00\/00\/0000$/.test(value);
|
|
|
|
if (!isDateFormatValid) {
|
|
errorMessage = "Le champ doit être au format JJ//MM/AAAA ou 00/00/0000.";
|
|
isValid = false;
|
|
}
|
|
}
|
|
|
|
// Vérifie si la saisie ne contient pas d'espace
|
|
if (isValid && value && rule.noSpace) {
|
|
const isNoSpaceValid = /^\S*$/.test(value);
|
|
|
|
if (!isNoSpaceValid) {
|
|
errorMessage = "La saisie ne doit pas contenir d'espaces.";
|
|
isValid = false;
|
|
}
|
|
}
|
|
|
|
// Vérifie si le champ date est correct au format JJ/MM
|
|
if (isValid && value && rule.dateFormatShort) {
|
|
const isDateFormatShortValid = /^(0[1-9]|[12][0-9]|3[01])\/(0[1-9]|1[012])$|^00\/00$/.test(value);
|
|
|
|
if (!isDateFormatShortValid) {
|
|
errorMessage = "Le champ doit être au format JJ/MM ou 00/00.";
|
|
isValid = false;
|
|
}
|
|
}
|
|
|
|
// Vérifie la casse des caractères si spécifié
|
|
if (isValid && value && rule.case) {
|
|
if (rule.case === "upper" && value !== value.toUpperCase()) {
|
|
errorMessage = "Le champ doit être en majuscules.";
|
|
isValid = false;
|
|
} else if (rule.case === "lower" && value !== value.toLowerCase()) {
|
|
errorMessage = "Le champ doit être en minuscules.";
|
|
isValid = false;
|
|
}
|
|
}
|
|
|
|
// Vérifie si le champ doit être numérique
|
|
if (isValid && value && rule.digit) {
|
|
const isNumeric = /^\d+$/.test(value); // Vérifie si la chaîne est un nombre entier
|
|
|
|
if (!isNumeric) {
|
|
errorMessage = "Le champ doit contenir uniquement des chiffres.";
|
|
isValid = false;
|
|
}
|
|
}
|
|
|
|
// Affiche ou cache le message d'erreur selon la validité du champ
|
|
if (showErrors && errorElement) {
|
|
errorElement.textContent = errorMessage;
|
|
errorElement.style.display = isValid ? 'none' : 'block';
|
|
}
|
|
|
|
return isValid;
|
|
} catch (error) {
|
|
console.warn('Validation interrompue pour le champ:', fieldId, error);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
function updateSubmitButtonState(formId) {
|
|
|
|
let allFieldsValid = true;
|
|
const form = document.querySelector(`#${formId}`);
|
|
const hasValidationRules = typeof validationRules !== 'undefined' && validationRules;
|
|
|
|
if (!form) {
|
|
console.error('Formulaire non trouvé:', formId);
|
|
return;
|
|
}
|
|
|
|
if (!hasValidationRules) {
|
|
return;
|
|
}
|
|
|
|
for (const fieldId in validationRules) {
|
|
const inputElement = document.getElementById(fieldId);
|
|
|
|
if (inputElement && form.contains(inputElement)) {
|
|
try {
|
|
if (!validateField(fieldId, false)) {
|
|
allFieldsValid = false;
|
|
}
|
|
} catch (error) {
|
|
console.warn('Erreur pendant la validation du champ:', fieldId, error);
|
|
allFieldsValid = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
const submitButtons = form.querySelectorAll('button[type="submit"], input[type="submit"]');
|
|
|
|
if (submitButtons && submitButtons.length > 0) {
|
|
submitButtons.forEach((button) => {
|
|
button.disabled = !allFieldsValid;
|
|
})
|
|
}
|
|
}
|