Ajout (dé)sélection globale

Suppression de code inutile
Le numéro de reçu devient le numéro de membre

FossilOrigin-Name: 3c547eb17e551fff833728a9b3bf6deb4693b1e021c9d55685b054cab930c5cf
This commit is contained in:
engel 2022-01-25 19:18:00 +00:00
parent 41c93cf556
commit c72996befe
4 changed files with 54 additions and 111 deletions

View File

@ -1,41 +1,5 @@
{include file="admin/_head.tpl" title="%s"|args:$plugin.nom current="plugin_%s"|args:$plugin.id} {include file="admin/_head.tpl" title="%s"|args:$plugin.nom current="plugin_%s"|args:$plugin.id}
{* barre de navigation
<nav class="tabs noprint">
<ul>
<li><a>Page 1</a></li>
<li><a>Page 2</a></li>
<li><a>Page 3</a></li>
</ul>
</nav>
*}
{* TODO : Temporaire - à supprimer (?) *}
<h2>Liste des activités, cotisations et comptes associés</h2>
<table class="list">
<thead>
<tr>
<th>Nom</th>
<th>Description</th>
<th>Tarif</th>
<th>Description</th>
<th>N° Compte</th>
<th>Nom Compte</th>
</tr>
</thead>
<tbody>
{foreach from=$activitesTarifsComptes item="activite"}
<tr>
<td>{$activite.label}</td>
<td>{$activite.descService}</td>
<td>{$activite.tarif}</td>
<td>{$activite.descTarif}</td>
<td>{$activite.numero_cpt}</td>
<td>{$activite.nom_cpt}</td>
</tr>
{/foreach}
</tbody>
</table>
<h2>Liste des versements par activité et tarif</h2> <h2>Liste des versements par activité et tarif</h2>
{* TODO : vérifier le détail de ce div *} {* TODO : vérifier le détail de ce div *}
@ -46,6 +10,15 @@
<form method="post" action="action.php" class="memberList"> <form method="post" action="action.php" class="memberList">
<fieldset class="versements" id="versements_global">
<input
type="checkbox"
class="check_global"
id="check_global"
onclick="cocherDecocherTout(check_global)" />
<label for="check_global">Cliquer pour cocher toutes les lignes</label>
</fieldset>
{* Itération sur les activités *} {* Itération sur les activités *}
{foreach from=$listeParActiviteEtTarif item="activite"} {foreach from=$listeParActiviteEtTarif item="activite"}
@ -53,7 +26,7 @@
{foreach from=$activite->tarifs item="tarif"} {foreach from=$activite->tarifs item="tarif"}
<details open="open"> <details open="open">
<summary> <summary class="activite">
<h3>Activité « {$activite->label} »</h3> <h3>Activité « {$activite->label} »</h3>
{if !empty($activite->description)} {if !empty($activite->description)}
<h4>{$activite->description}</h4> <h4>{$activite->description}</h4>
@ -82,14 +55,14 @@
{/if} {/if}
{* Afficher les infos de la personne *} {* Afficher les infos de la personne *}
<?php $idVersements = $versement->idTarif."_".$versement->idUser; ?> <?php $idVersements = $versement->idTarif."_".$versement->idUser; ?>
<h3>Versements de {$versement.nom} : <span id="total_{$idVersements}">0,00 €</span></h3> <h3 class="personne">Versements de {$versement.nom} : <span id="total_{$idVersements}">0,00 €</span></h3>
<fieldset class="versements" id="versements_{$idVersements}"> <fieldset class="versements" id="versements_{$idVersements}">
<input <input
type="checkbox" type="checkbox"
class="check_{$idVersements}" class="check_{$idVersements}"
id="check_{$idVersements}" id="check_{$idVersements}"
onclick="cocherDecocherPersonne(check_{$idVersements}, total_{$idVersements})" /> onclick="cocherDecocherPersonne(check_{$idVersements}, total_{$idVersements})" />
<label for="check_{$idVersements}" style="font-weight:bold;">Cliquer pour cocher toutes les lignes</label> <label for="check_{$idVersements}">Cliquer pour cocher toutes les lignes</label>
<br /> <br />
<hr> <hr>
<?php $currentUser = $versement->idUser; ?> <?php $currentUser = $versement->idUser; ?>
@ -122,9 +95,6 @@
{literal} {literal}
<script type="text/javascript"> <script type="text/javascript">
// activer l'écouteur sur la première case de chaque table
// window.addEventListener("load", activerListener);
// ouvrir/fermer les détails // ouvrir/fermer les détails
document.querySelector('#open_details').onclick = () => { document.querySelector('#open_details').onclick = () => {
document.querySelectorAll('details').forEach((e) => { document.querySelectorAll('details').forEach((e) => {

View File

@ -14,20 +14,19 @@ $versementsSelectionnes = array();
foreach ($list as $indice => $ligne) { foreach ($list as $indice => $ligne) {
$versementsSelectionnes[] = $_SESSION['lesVersements'][$ligne]; $versementsSelectionnes[] = $_SESSION['lesVersements'][$ligne];
} }
// print_r($versementsSelectionnes);
// cumuler les versements d'une personne // cumuler les versements d'une personne
$totalPersonnes = cumulerVersements($versementsSelectionnes); $totalPersonnes = cumulerVersements($versementsSelectionnes);
// print_r($totalPersonnes);
// générer les reçus // générer les reçus
$nomAsso = Services::getNomAsso(); $nomAsso = Services::getNomAsso();
$adresseAsso = Services::getAdresseAsso(); $adresseAsso = Services::getAdresseAsso();
// TODO // TODO
// - mémoriser numéro reçu pour pouvoir générer des reçus en plusieurs sessions indépendantes // - mémoriser numéro reçu pour pouvoir générer des reçus en plusieurs sessions indépendantes
// - paramétrer l'année fiscale // - paramétrer l'année fiscale
// $num_recu = 1;
$annee_recu = "2021"; $annee_recu = "2021";
// récupérer le logo CERFA (bôf) et la signature // récupérer le logo CERFA (bôf) et la signature
// TODO : paramétrer le répertoire des images // TODO : paramétrer le répertoire des images
$logoCERFA = PLUGIN_ROOT . "/data/logoCerfa.png"; $logoCERFA = PLUGIN_ROOT . "/data/logoCerfa.png";
@ -58,7 +57,6 @@ foreach ($totalPersonnes as $idPersonne => $personne) {
$personne->ville, $personne->ville,
$personne->codePostal $personne->codePostal
); );
//++$num_recu;
// fabriquer le nom du fichier PDF // fabriquer le nom du fichier PDF
$nom = str_replace(' ', '_', $personne->nomPrenom); $nom = str_replace(' ', '_', $personne->nomPrenom);
$nom = str_replace("'", "", $nom); $nom = str_replace("'", "", $nom);

View File

@ -1,3 +1,36 @@
/**
* Fonction appelée quand on ()coche la case de sélection globale
* ()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 <activité, tarif>
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 ()coche la case d'une personne * Fonction appelée quand on ()coche la case d'une personne
* - ()sélectionner toutes les cases à cocher * - ()sélectionner toutes les cases à cocher
@ -84,67 +117,3 @@ function verifierChoix(formulaire)
} }
return ok; return ok;
} }
/**
* Cocher/décocher toutes les cases d'un tableau
* en fonction de l'état de la première (ligne d'entête)
* @param evt : événement déclencheur
* @remarks : est remplacé par la fonction cocherDecocherPersonne ci-dessus
*/
function cocherDecocher_old(evt) {
console.log("this = " + this.className);
console.log("currentTarget = " + evt.currentTarget.className);
console.log("evt.target = " + evt.target.className);
var composed = evt.composedPath();
console.log("composedPath = " + composed);
var firstInput = evt.target;
// voir si la case tousCochés est cochée
var tousCoches = firstInput.checked;
// chercher la table englobante
var laTable = firstInput.closest("table");
console.log("Table trouvée = " + laTable.id);
// et la liste des lignes
var rows = laTable.getElementsByTagName("tr");
// modifier les autres cases en fonction de celle-ci
for (let i = 1; i < rows.length; ++i) {
var input = rows[i].getElementsByTagName("input")[0];
input.checked = tousCoches;
}
}
/**
* 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);
}
}
}
/*
// ouvrir/fermer les détails
document.querySelector('#open_details').onclick = () => {
document.querySelectorAll('details').forEach((e) => {
e.setAttribute('open', 'open');
});
};
document.querySelector('#close_details').onclick = () => {
document.querySelectorAll('details').forEach((e) => {
e.removeAttribute('open');
});
};
*/

View File

@ -1,10 +1,10 @@
/* liste de versements */
div.pair { div.pair {
padding : 0.2em; padding : 0.2em;
background: rgba(var(--gSecondColor), 0.2); background: rgba(var(--gSecondColor), 0.2);
} }
div.impair { div.impair {
padding : 0.2em; padding : 0.2em;
/*background: #eeeeee; /*rgba(var(--gSecondColor), 0.5);*/
} }
fieldset { fieldset {
border:2px solid brown; border:2px solid brown;
@ -18,3 +18,9 @@ div span {
padding-left : 0.5em; padding-left : 0.5em;
padding-right : 0.5em; padding-right : 0.5em;
} }
summary.activite {
background: rgba(var(--gMainColor), 0.25);
}
h3.personne {
background: rgba(var(--gSecondColor), 0.35);
}