Changement structure code html et javascript

FossilOrigin-Name: 5d8368da9ebcec86dbee43bd4b7bf7282afe71cf1b2b28ffa332d935f32411e8
This commit is contained in:
engel 2022-01-14 17:59:18 +00:00
parent 81a5bfb8a9
commit 358becfca7
2 changed files with 189 additions and 154 deletions

View File

@ -1,183 +1,128 @@
{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 *} {* barre de navigation
<nav class="tabs noprint"> <nav class="tabs noprint">
<ul> <ul>
<li><a>Page 1</a></li> <li><a>Page 1</a></li>
<li><a>Page 2</a></li> <li><a>Page 2</a></li>
<li><a>Page 3</a></li> <li><a>Page 3</a></li>
</ul> </ul>
</nav> </nav>
*}
{* TODO : Temporaire - à supprimer (?) *} {* TODO : Temporaire - à supprimer (?) *}
<h2>Liste des activités, cotisations et comptes associés</h2> <h2>Liste des activités, cotisations et comptes associés</h2>
<table class="list"> <table class="list">
<thead> <thead>
<tr> <tr>
<th>Nom</th> <th>Nom</th>
<th>Description</th> <th>Description</th>
<th>Tarif</th> <th>Tarif</th>
<th>Description</th> <th>Description</th>
<th>N° Compte</th> <th>N° Compte</th>
<th>Nom Compte</th> <th>Nom Compte</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{foreach from=$activitesTarifsComptes item="activite"} {foreach from=$activitesTarifsComptes item="activite"}
<tr> <tr>
<td>{$activite.label}</td> <td>{$activite.label}</td>
<td>{$activite.descService}</td> <td>{$activite.descService}</td>
<td>{$activite.Tarif}</td> <td>{$activite.Tarif}</td>
<td>{$activite.descTarif}</td> <td>{$activite.descTarif}</td>
<td>{$activite.numero_cpt}</td> <td>{$activite.numero_cpt}</td>
<td>{$activite.nom_cpt}</td> <td>{$activite.nom_cpt}</td>
</tr> </tr>
{/foreach} {/foreach}
</tbody> </tbody>
</table> </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 *}
<div class="year-header noprint"> <div class="year-header noprint">
<button type="button" data-icon="↓" class="icn-btn" id="open_details">Déplier toutes les activités</button> <button type="button" data-icon="↓" class="icn-btn" id="open_details">Déplier toutes les activités</button>
<button type="button" data-icon="↑" class="icn-btn" id="close_details">Replier toutes les activités</button> <button type="button" data-icon="↑" class="icn-btn" id="close_details">Replier toutes les activités</button>
</div> </div>
<form method="post" action="action.php" class="memberList"> <form method="post" action="action.php" class="memberList">
{* Itération sur les activités *} {* Itération sur les activités *}
{foreach from=$listeParActiviteEtTarif item="activite"} {foreach from=$listeParActiviteEtTarif item="activite"}
{* Itération sur les tarifs de l'activité *} {* Itération sur les tarifs de l'activité *}
{foreach from=$activite->tarifs item="tarif"} {foreach from=$activite->tarifs item="tarif"}
{* TODO : s'inspirer du fonctionnement de <details pour (dé)sélectionner les lignes d'une table *} <details open="open">
<details open="open"> <summary>
<summary> <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> {/if}
{/if} <h4>tarif « {$tarif->titreTarif} », montant : {if $tarif->montantTarif > 0}{$tarif->montantTarif}
<h4>tarif « {$tarif->titreTarif} », montant : {if $tarif->montantTarif > 0}{$tarif->montantTarif} {else}libre
{else}libre {/if}
{/if} </h4>
</h4> </summary>
</summary>
{* {*
Itération sur les versements d'un tarif d'une activité Itération sur les versements d'un tarif d'une activité
présentation : une table pour les versements d'une personne présentation : une table pour les versements d'une personne
TODO : régler la fermeture de table lors du changement de personne *}
*} <?php $currentUser = -1; $firstUser = true; ?>
<?php $currentUser = -1; $firstLine = true; ?> {foreach from=$lesVersements key="rang" item="versement"}
{foreach from=$lesVersements key="rang" item="versement"} {if $versement.idActivite == $activite->id &&
{if $versement.idActivite == $activite->id && $versement.idTarif == $tarif->idTarif}
$versement.idTarif == $tarif->idTarif} {if $versement.idUser != $currentUser}
{if $versement.idUser != $currentUser} {* changement de personne *}
{* changement de personne *} {if $firstUser}
{if $firstLine} <?php $firstUser = false; ?>
<?php $firstLine = false; ?> {else}
{else} {* fermer le tableau précédent *}
{* fermer le tableau précédent *} </fieldset>
</tbody> {/if}
</table> {* Afficher les infos de la personne *}
<?php $firstLine = true; ?> <?php $idVersements = $versement->idTarif."_".$versement->idUser; ?>
{/if} <h3>Versements de {$versement.Nom} : <span id="total_{$idVersements}">0,00 €</span></h3>
<h3>Versements de {$versement.Nom}</h3> <fieldset class="versements" id="versements_{$idVersements}">
<table class="myList" id="versements_{$versement->idUser}"> <input class="check_{$idVersements}" type="checkbox" id="check_{$idVersements}" onclick="cocherDecocherPersonne(check_{$idVersements}, total_{$idVersements})" />
{* on ne met pas thead pour éviter l'écouteur prédéfini ... *} <label for="check_{$idVersements}" style="font-weight:bold;">Cliquer ici pour sélectionner toutes les lignes</label><br />
{* mais du coup, il faut mettre le mien ... *} <hr>
{* <thead> *} <?php $currentUser = $versement->idUser; ?>
<tbody> {/if}
<tr style="background: rgba(var(--gSecondColor), 0.5);"> {* afficher les infos du versement de la personne*}
{* TODO : voir common/dynamic_list_head.tpl *} <input class="check_{$idVersements}" type="checkbox" name="selected[]" value={$rang}>
<?php $tableau = "check_" . $versement->idUser; ?> <label for={$rang}></label>
<th class="check"><input class="{$tableau}" type="checkbox" title="Tout cocher / décocher" id="f_all" /><label <span class="montant">{$versement.Versement}</span>
for="f_all"></label> <span>{$versement.Date|date_format:"%d/%m/%Y"}</span><br />
</th> {/if}
<th>Versement</th> {/foreach} {* Itération sur les versements *}
<th>Date</th> </fieldset>
</tr> </details>
{* </thead> *} {/foreach} {* Itération sur les tarifs de l'activité *}
{* <tbody> *} {/foreach} {* Itération sur les activités *}
<?php $currentUser = $versement->idUser; ?>
{/if}
<tr>
{* TODO : voir admin/membres/index.tpl *}
<td class="check">{input class=$tableau type="checkbox" name="selected[]" value=$rang}</td>
<td>{$versement.Versement}</td>
<td>{$versement.Date|date_format:"%d/%m/%Y"}</td>
</tr>
{/if}
{/foreach} {* Itération sur les versements *}
</tbody>
</table>
</details>
{/foreach} {* Itération sur les tarifs de l'activité *}
{/foreach} {* Itération sur les activités *}
</form> </form>
{* scripts pour cases à cocher *}
<script src="script.js"></script>
{literal} {literal}
<script type="text/javascript"> <script type="text/javascript">
/** // activer l'écouteur sur la première case de chaque table
* Cocher/décocher toutes les cases d'un tableau // window.addEventListener("load", activerListener);
* en fonction de l'état de la première (ligne d'entête)
* @param evt : événement déclencheur
*/
function cocherDecocher(evt) {
var input = evt.target;
console.log("Input = " + input.className);
// voir si la case tousCochés est cochée
var tousCoches = input.checked;
// chercher la table englobante
var laTable = input.closest("table");
console.log("Table trouvée = " + laTable.id);
// et la liste des lignes
var rows = laTable.getElementsByTagName("tr");
// et 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;
}
}
// 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');
});
};
/**
* Associer un écouteur à la première case à cocher de chaque table
*/
const lesTables = document.querySelectorAll("table.myList");
console.log("Associer un écouteur à la première case à cocher de chaque table");
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;
console.log("id de la table = " + id);
const re = /^versements_[0-9]+/;
if (re.test(id)) {
// chercher le premier élément input
const premierInput = lesTables[i].querySelector("input");
console.log("input trouvé = " + premierInput.className);
// supprimer l'écouteur précédent
//premierInput.removeAttribute('onchange'); // marche pas
// associer un écouteur à la première case à cocher
premierInput.addEventListener('change', cocherDecocher); // ok
}
}
// 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');
});
};
</script> </script>
{/literal} {/literal}
<!-- footer --> <!-- footer -->
{include file="admin/_foot.tpl"} {include file="admin/_foot.tpl"}

90
www/admin/script.js Normal file
View File

@ -0,0 +1,90 @@
/**
* Fonction appelée quand on ()coche la case d'une personne
* - ()sélectionner toutes les cases à cocher
* - faire le total des cases cochées
*
* @param id de la case qui a été cochée
* @param id de l'élément afficher le total
*/
function cocherDecocherPersonne(idCase, idTotal) {
// chercher le fieldset englobant
var fieldset = idCase.closest("fieldset");
var listeCheck = fieldset.getElementsByTagName("input");
var listeMontants = fieldset.querySelectorAll("span.montant");
var total = 0;
for (var i = 1; i < listeCheck.length; ++i)
{
listeCheck[i].checked = listeCheck[0].checked;
if (listeCheck[i].checked) {
total += Number(listeMontants[i-1].textContent);
}
}
// "afficher" le total
idTotal.innerHTML =
total.toLocaleString('fr-FR', {style: 'currency', currency: 'EUR',
minimumFractionDigits: 2});
}
/**
* 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 foncion cocherDecocher 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');
});
};
*/