personnal/ecole/public copy/js/verif-form.js

172 lines
5.4 KiB
JavaScript

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;
})
}
}