/** * Fonction appelée quand on (dé)coche la case de sélection globale * (dé)sélectionner toutes les cases à cocher de toutes les activités * @param id de la case globale */ function cocherDecocherTout(idCaseGlobale) { // chercher le formulaire englobant var formulaire = idCaseGlobale.closest("form"); // itérer sur la liste des éléments détails : 1 par couple var lesDetails = formulaire.querySelectorAll("details"); for (var i = 0; i < lesDetails.length; ++i) { // itérer sur les personnes var lesH3 = lesDetails[i].querySelectorAll("h3.personne"); for (var j = 0; j < lesH3.length; ++j) { // trouver l'élément total de la personne var idTotal = lesH3[j].querySelector("span"); // puis la case à cocher var fieldset = lesH3[j].nextElementSibling; var idCase = fieldset.querySelector("input"); idCase.checked = idCaseGlobale.checked; // puis traiter toutes les cases de la personne cocherDecocherPersonne(idCase, idTotal); } } // changer le message var message = idCaseGlobale.nextElementSibling; if (idCase.checked) { message.innerHTML = "Cliquer pour dé-cocher toutes les lignes"; } else { message.innerHTML = "Cliquer pour cocher toutes les lignes"; } } /** * Fonction appelée quand on (dé)coche la case d'une personne * - (dé)sélectionner toutes les cases à cocher * - faire le total des cases cochées et l'afficher * * @param id de la case qui a été cochée * @param id de l'élément où afficher le total */ function cocherDecocherPersonne(idCase, idTotal) { // chercher le fieldset englobant var fieldset = idCase.closest("fieldset"); var listeCases = fieldset.querySelectorAll("input[type=checkbox]"); for (var i = 1; i < listeCases.length; ++i) { listeCases[i].checked = idCase.checked; } // changer le message var message = idCase.nextElementSibling; if (idCase.checked) { message.innerHTML = "Cliquer pour dé-cocher toutes les lignes"; } else { message.innerHTML = "Cliquer pour cocher toutes les lignes"; } // calculer et afficher le total var listeMontants = fieldset.querySelectorAll("span.montant"); calculerTotal(listeCases, listeMontants, idTotal); } /** * Fonction appelée quand on (dé)coche la case d'un versement * - (dé)sélectionner cette case (?) * - faire le total des cases cochées et l'afficher * * @param id de la case qui a été cochée * @param id de l'élément où afficher le total */ function cocherDecocherVersement(idCase, idTotal) { var fieldset = idCase.closest("fieldset"); var listeCases = fieldset.querySelectorAll("input[type=checkbox]"); var listeMontants = fieldset.querySelectorAll("span.montant"); calculerTotal(listeCases, listeMontants, idTotal); } /** * Faire le total des cases cochées et l'afficher * @param listes des cases * @param listes des montants associés * @param id de l'élément où afficher le total */ function calculerTotal(listeCases, listeMontants, idTotal) { var total = 0; for (var i = 1; i < listeCases.length; ++i) { if (listeCases[i].checked) { total += parseFloat(listeMontants[i-1].textContent.replace(/\s/g, "")); } } // "afficher" le total idTotal.innerHTML = total.toLocaleString('fr-FR', {style: 'currency', currency: 'EUR', minimumFractionDigits: 2}); } /** * fonction appelée lors de la validation du formulaire * @return vrai si au moins un choix a été fait * @param : formulaire */ function verifierChoix(formulaire) { var listeCheck = formulaire.getElementsByTagName("input"); var ok = false; for (var i = 1; i < listeCheck.length; ++i) { if (listeCheck[i].checked) { ok = true; break; } } if (! ok) { alert("Erreur : il faut sélectionner au moins un versement"); } return ok; } /** * fonction appelée pour afficher et masquer des portions de formulaire */ function afficherMasquer(formulaire, nomClasse1, nomClasse2) { for (var elem of formulaire.querySelectorAll(nomClasse1)) { elem.classList.remove('hidden'); } for (var elem of formulaire.querySelectorAll(nomClasse2)) { elem.classList.add('hidden'); } } // vérifier // - qu'au moins une activité/tarif est sélectionnée // - qu'un radio de chaque activité/tarif sélectionné a été sélectionné :) function verifierCases(idElem) { var div = document.getElementById(idElem); var nbChoix = 0; // parcourir les cases à cocher for (var idCase of div.querySelectorAll("input[type=checkbox]")) { if (idCase.checked) { ++nbChoix; // vérifier qu'un radio de la même ligne est sélectionné var ligneCorrecte = false; // trouver la ligne englobante var ligne = idCase.closest("tr"); for (var idRadio of ligne.querySelectorAll('input[type=radio]')) { if (idRadio.checked) { ligneCorrecte = true; break; } } if (! ligneCorrecte) { alert("Erreur : il faut sélectionner un taux de réduction dans chaque ligne cochée"); return false; } } } if (nbChoix == 0) { alert("Erreur : il faut sélectionner au moins une activité/tarif"); } return nbChoix != 0; } // vérifier qu'un radio a été sélectionné dans la div paramètre function verifierRadio(idElem) { var div = document.getElementById(idElem); for (var idRadio of div.querySelectorAll('input[type=radio]')) { if (idRadio.checked) { return true; } } alert("Erreur : il faut sélectionner un taux de réduction"); return false; } // inutilisé function activerDesactiverRadio(evt) { var idCase = evt.target; // checher la ligne englobante ( ) var ligne = idCase.closest("tr"); // itérer sur les radio de cette ligne var lesRadios = ligne.querySelectorAll('input[type=radio]'); for (var idRadio of lesRadios) { if (idCase.checked) { idRadio.disabled = ''; } else { idRadio.disabled = 'disabled'; } } } /** * Associer un écouteur à la première case à cocher de chaque table * @remarks : n'est plus utile */ function activerListener() { // parcourir les tables const lesTables = document.querySelectorAll("table.list"); for (let i = 0; i < lesTables.length; ++i) { // vérifier si c'est l'une des tables qui nous intéresse // l'id est du genre : versements_xx où xx est un entier const id = lesTables[i].id; const re = /^versements_[0-9]+/; console.log("id = " + id + " => " + re.test(id)); if (re.test(id)) { // chercher le premier élément input const premierInput = lesTables[i].querySelector("input"); // associer un écouteur à la première case à cocher premierInput.addEventListener('change', cocherDecocher); } } }