function isValidEmail(email) { const emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; return emailPattern.test(email); } function validateField(fieldId, showErrors = true) { const inputElement = document.getElementById(fieldId); if (!inputElement) { return true; } const value = document.getElementById(fieldId).value.trim(); const rule = validationRules[fieldId]; // Importé de js/json/json-verif-form.js const errorElement = document.getElementById(`${fieldId}-error`); 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.textContent = errorMessage; errorElement.style.display = isValid ? 'none' : 'block'; } return isValid; } function updateSubmitButtonState(formId) { let allFieldsValid = true; const form = document.querySelector(`#${formId}`); if (!form) { console.error('Formulaire non trouvé:', formId); return; } for (const fieldId in validationRules) { const inputElement = form.querySelector(`#${fieldId}`); if (inputElement && !validateField(fieldId, false)) { allFieldsValid = false; } } const submitButtons = form.querySelectorAll('button[type="submit"], input[type="submit"]'); if (submitButtons && submitButtons.length > 0) { submitButtons.forEach((button) => { button.disabled = !allFieldsValid; }) } }