Possibilité de saisir les notes par groupe (précisemment: plusieurs notes dans un groupe)
This commit is contained in:
parent
9c4000bb25
commit
2df2c85507
|
@ -228,7 +228,7 @@ td select > option{ padding: 0; }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.valider_action{
|
.confirm{
|
||||||
/* position */
|
/* position */
|
||||||
/*display: inline-block;*/ display: none;
|
/*display: inline-block;*/ display: none;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
|
@ -254,16 +254,26 @@ td select > option{ padding: 0; }
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* @all */
|
||||||
|
.confirm.all{ margin-top: -.7em; }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* @active */
|
/* @active */
|
||||||
input.active + .valider_action,
|
input.active + .confirm,
|
||||||
select.active + .valider_action{
|
select.active + .confirm,
|
||||||
|
.confirm.active{
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
background-image: url(../src/validate.svg);
|
background-image: url(../src/validate.svg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* tr@hover */
|
/* tr@hover */
|
||||||
body.trHoverActivated tr:hover td select.active + .valider_action,
|
body.trHoverActivated tr:hover td select.active + .confirm,
|
||||||
body.trHoverActivated tr:hover td input.active + .valider_action{
|
body.trHoverActivated tr:hover td input.active + .confirm,
|
||||||
|
body.trHoverActivated tr:hover td .confirm.active{
|
||||||
border-color: #fff;
|
border-color: #fff;
|
||||||
background-image: url(../src/validate@hover.svg);
|
background-image: url(../src/validate@hover.svg);
|
||||||
color: #fff;
|
color: #fff;
|
||||||
|
|
|
@ -65,6 +65,15 @@ var connected = !( DOM.AUTH.children[0].innerHTML == 'Connexion' );
|
||||||
/* initialisation du gestionnaire */
|
/* initialisation du gestionnaire */
|
||||||
pageM.setPage(null, 'page', DOM.CONTAINER, ['home', 'groups', 'modules', 'career', 'settings'] );
|
pageM.setPage(null, 'page', DOM.CONTAINER, ['home', 'groups', 'modules', 'career', 'settings'] );
|
||||||
|
|
||||||
|
/* ON REMPLACE "F5" par le rechargement manuel */
|
||||||
|
window.addEventListener('keydown', function(e){
|
||||||
|
if( e.keyCode == 116 ){ // F5
|
||||||
|
e.preventDefault();
|
||||||
|
reload();
|
||||||
|
}
|
||||||
|
}, false);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* [b] API.js
|
/* [b] API.js
|
||||||
==============================================================*/
|
==============================================================*/
|
||||||
|
|
|
@ -88,12 +88,19 @@ if( document.querySelector('#CONTAINER section[name=controlesenseignants]') ){ /
|
||||||
|
|
||||||
|
|
||||||
/* GESTION DE LA SAISIE DE NOTES */
|
/* GESTION DE LA SAISIE DE NOTES */
|
||||||
|
var nombreModification = 0; // contiendra le nombre de notes saisies
|
||||||
|
|
||||||
if( document.querySelector('#CONTAINER section[name=controlesenseignants]') != null ){ // si c'set l'admin
|
if( document.querySelector('#CONTAINER section[name=controlesenseignants]') != null ){ // si c'set l'admin
|
||||||
|
|
||||||
/* SAISIE A L'AIDE DES <INPUT> */
|
/* SAISIE A L'AIDE DES <INPUT> */
|
||||||
var saisieInput = document.querySelectorAll('#CONTAINER section[name=controlesenseignants] table tr td input[type=number][data-ctrl].saisie_note');
|
var saisieInput = document.querySelectorAll('#CONTAINER section[name=controlesenseignants] table tr td input[type=number][data-ctrl].saisie_note');
|
||||||
var saisieObj = [];
|
var saisieObj = [];
|
||||||
|
|
||||||
|
/* BOUTON "TOUT ENREGISTRER" */
|
||||||
|
var toutEnregistrerBtn = document.querySelector("#CONTAINER section[name=controlesenseignants] table tr td:last-child .confirm.all");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// on référencie tous les input dans un objet
|
// on référencie tous les input dans un objet
|
||||||
for( var i = 0 ; i < saisieInput.length ; i++ ){
|
for( var i = 0 ; i < saisieInput.length ; i++ ){
|
||||||
|
|
||||||
|
@ -101,7 +108,7 @@ if( document.querySelector('#CONTAINER section[name=controlesenseignants]') != n
|
||||||
|
|
||||||
saisieObj[i] = {
|
saisieObj[i] = {
|
||||||
inputEl: saisieInput[i], // le <input> en question
|
inputEl: saisieInput[i], // le <input> en question
|
||||||
initval: saisieInput[i].value, // la valeur initiale du <input>
|
initval: parseFloat( saisieInput[i].value.replace(',', '.') ), // la valeur initiale du <input>
|
||||||
button: saisieInput[i].parentNode.children[1], // le bouton de validation pour ce <input>
|
button: saisieInput[i].parentNode.children[1], // le bouton de validation pour ce <input>
|
||||||
ctrlid: saisieInput[i].dataset.ctrl, // on récupère l'id du contrôle
|
ctrlid: saisieInput[i].dataset.ctrl, // on récupère l'id du contrôle
|
||||||
userid: saisieInput[i].parentNode.parentNode.children[0].children[0].innerHTML // l'identifiant de l'utilisateur associé à ce <input>
|
userid: saisieInput[i].parentNode.parentNode.children[0].children[0].innerHTML // l'identifiant de l'utilisateur associé à ce <input>
|
||||||
|
@ -112,20 +119,37 @@ if( document.querySelector('#CONTAINER section[name=controlesenseignants]') != n
|
||||||
// on récupère le rang dans la liste et qu'il s'agit du même élément
|
// on récupère le rang dans la liste et qu'il s'agit du même élément
|
||||||
if( e.target.dataset.hasOwnProperty('i') && saisieObj[e.target.dataset.i].inputEl == e.target){
|
if( e.target.dataset.hasOwnProperty('i') && saisieObj[e.target.dataset.i].inputEl == e.target){
|
||||||
var obj = saisieObj[e.target.dataset.i];
|
var obj = saisieObj[e.target.dataset.i];
|
||||||
|
var isActive = /active/.test(obj.inputEl.className); // VRAI si l'élément est actif
|
||||||
|
|
||||||
if( obj.initval != obj.inputEl.value ) // si c'est une nouvelle valeur (nouveau groupe), on active le validateur (bouton)
|
|
||||||
|
// si c'est une nouvelle valeur (nouvelle note), on active le validateur (bouton)
|
||||||
|
if( obj.initval != parseFloat(obj.inputEl.value.replace(',', '.')) )
|
||||||
addClass( obj.inputEl, 'active' );
|
addClass( obj.inputEl, 'active' );
|
||||||
else
|
else
|
||||||
remClass( obj.inputEl, 'active' );
|
remClass( obj.inputEl, 'active' );
|
||||||
|
|
||||||
|
|
||||||
|
// si changement du caractère "actif", et plus particulièrement
|
||||||
|
if( /active/.test(obj.inputEl.className) != isActive )
|
||||||
|
if( !isActive ) // si activation
|
||||||
|
nombreModification += 1;
|
||||||
|
else
|
||||||
|
nombreModification -= 1;
|
||||||
|
|
||||||
|
// si plus d'une modification, on affiche le bouton 'tout enregistrer'
|
||||||
|
if( nombreModification > 1 )
|
||||||
|
addClass( toutEnregistrerBtn, 'active' );
|
||||||
|
else
|
||||||
|
remClass( toutEnregistrerBtn, 'active' );
|
||||||
|
|
||||||
}
|
}
|
||||||
}, false);
|
}, false);
|
||||||
|
|
||||||
|
|
||||||
// on créé l'évènement de confirmation du déplacement
|
// on créé l'évènement de confirmation de la saisie
|
||||||
saisieObj[i].button.addEventListener('click', function(e){
|
saisieObj[i].button.addEventListener('click', function(e){
|
||||||
// s'il s'agit bien d'un bouton de validation, que le <input> associé a data-i existante et que ça match correctement
|
// s'il s'agit bien d'un bouton de validation, que le <input> associé a data-i existante et que ça match correctement
|
||||||
if( /^valider_action/.test(e.target.className) && e.target.parentNode.children[0].dataset.hasOwnProperty('i') && saisieObj[e.target.parentNode.children[0].dataset.i].button == e.target ){
|
if( /confirm/.test(e.target.className) && e.target.parentNode.children[0].dataset.hasOwnProperty('i') && saisieObj[e.target.parentNode.children[0].dataset.i].button == e.target ){
|
||||||
var obj = saisieObj[e.target.parentNode.children[0].dataset.i];
|
var obj = saisieObj[e.target.parentNode.children[0].dataset.i];
|
||||||
|
|
||||||
var request = { // on définit la requête pour API
|
var request = { // on définit la requête pour API
|
||||||
|
@ -143,6 +167,38 @@ if( document.querySelector('#CONTAINER section[name=controlesenseignants]') != n
|
||||||
}
|
}
|
||||||
|
|
||||||
}, false);
|
}, false);
|
||||||
|
|
||||||
|
|
||||||
|
// on créé l'évènement de confirmation de la saisie de TOUTES les notes saisies ou modifiées
|
||||||
|
toutEnregistrerBtn.addEventListener('click', function(e){
|
||||||
|
|
||||||
|
var nbRequest = 0;
|
||||||
|
var nbSuccess = 0;
|
||||||
|
|
||||||
|
// on sélectionne toutes les valeurs contenues dans les lignes actives
|
||||||
|
for( var i = 0 ; i < saisieObj.length ; i++ ){ if( /active/.test(saisieObj[i].inputEl.className) ){
|
||||||
|
|
||||||
|
nbRequest += 1;
|
||||||
|
|
||||||
|
var request = { // on définit la requête pour API
|
||||||
|
level_0: 'career',
|
||||||
|
level_1: 'saisieNote',
|
||||||
|
etudiant: saisieObj[i].userid,
|
||||||
|
controle: saisieObj[i].ctrlid,
|
||||||
|
note: saisieObj[i].inputEl.value.replace(',', '.'), // par précaution, on replace les virgules par des points pour le php (is_numeric)
|
||||||
|
};
|
||||||
|
|
||||||
|
API.send(request, function(response){ // on gère la réponse de API
|
||||||
|
if( response.request == 'success' ) nbSuccess += 1; // si on a une réponse positive, on incrémente le nombre de succès
|
||||||
|
|
||||||
|
// si tout est validé, on recharge la page
|
||||||
|
if( nbSuccess == nbRequest) reload();
|
||||||
|
});
|
||||||
|
|
||||||
|
}}
|
||||||
|
|
||||||
|
}, false);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -74,7 +74,7 @@ if( document.querySelector('#CONTAINER section[name=movestudents]') != null ){ /
|
||||||
// on créé l'évènement de confirmation du déplacement
|
// on créé l'évènement de confirmation du déplacement
|
||||||
deplacementObj[i].button.addEventListener('click', function(e){
|
deplacementObj[i].button.addEventListener('click', function(e){
|
||||||
// s'il s'agit bien d'un bouton de validation, que le <select> associé a data-i existante et que ça match correctement
|
// s'il s'agit bien d'un bouton de validation, que le <select> associé a data-i existante et que ça match correctement
|
||||||
if( /^valider_action/.test(e.target.className) && e.target.parentNode.children[0].dataset.hasOwnProperty('i') && deplacementObj[e.target.parentNode.children[0].dataset.i].button == e.target ){
|
if( /^confirm/.test(e.target.className) && e.target.parentNode.children[0].dataset.hasOwnProperty('i') && deplacementObj[e.target.parentNode.children[0].dataset.i].button == e.target ){
|
||||||
var obj = deplacementObj[e.target.parentNode.children[0].dataset.i];
|
var obj = deplacementObj[e.target.parentNode.children[0].dataset.i];
|
||||||
|
|
||||||
var request = { // on définit la requête pour API
|
var request = { // on définit la requête pour API
|
||||||
|
|
|
@ -352,12 +352,19 @@ elseif( permission('teacher') ){ // si enseignant et qu'un contrôle est spécif
|
||||||
else // sinon on laisse le champ vide
|
else // sinon on laisse le champ vide
|
||||||
echo "<input class='saisie_note' data-ctrl='".$answer->controle['id']."' type='number' step='.25' min='0' max='".$answer->controle['base']."' placeholder='Note'>";
|
echo "<input class='saisie_note' data-ctrl='".$answer->controle['id']."' type='number' step='.25' min='0' max='".$answer->controle['base']."' placeholder='Note'>";
|
||||||
|
|
||||||
echo "<div class='valider_action'>enregistrer</div>";
|
echo "<div class='confirm'>enregistrer</div>";
|
||||||
echo "</td>";
|
echo "</td>";
|
||||||
|
|
||||||
echo "</tr>";
|
echo "</tr>";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
echo "<tr>";
|
||||||
|
echo "<td></td>";
|
||||||
|
echo "<td></td>";
|
||||||
|
echo "<td></td>";
|
||||||
|
echo "<td><div class='confirm all'>tout enregistrer</div></td>";
|
||||||
|
echo "</tr>";
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
echo '</tbody></table>';
|
echo '</tbody></table>';
|
||||||
|
|
|
@ -535,7 +535,7 @@ if( permission('admin') ){ // si l'utilisateur est connecté et que c'est un adm
|
||||||
else // s'il s'agit d'un autre groupe, c'est normal
|
else // s'il s'agit d'un autre groupe, c'est normal
|
||||||
echo "<option value='".$groupemodif['nom']."'>".$groupemodif['nom']."</option>";
|
echo "<option value='".$groupemodif['nom']."'>".$groupemodif['nom']."</option>";
|
||||||
echo '</select>';
|
echo '</select>';
|
||||||
echo "<div class='valider_action'>déplacer</div>";
|
echo "<div class='confirm'>déplacer</div>";
|
||||||
echo '</td>';
|
echo '</td>';
|
||||||
echo '</tr>';
|
echo '</tr>';
|
||||||
}
|
}
|
||||||
|
|
|
@ -183,13 +183,6 @@ if( permission('admin') ){ // si l'utilisateur est un admin
|
||||||
echo "<section name='allmodules' data-title='Tous les modules' class='basic'>";
|
echo "<section name='allmodules' data-title='Tous les modules' class='basic'>";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* ON RECUPERE UNE LISTE UNIQUE DES SEMESTRES */
|
|
||||||
// $ListeNomsSemestres = array();
|
|
||||||
// foreach($answer->UEs as $UE)
|
|
||||||
// array_push( $ListeNomsSemestres, $UE['semestre'] );
|
|
||||||
// $ListeNomsSemestres = array_unique($ListeNomsSemestres);
|
|
||||||
|
|
||||||
/* ON RECUPERE UNE LISTE UNIQUE DES UEs */
|
/* ON RECUPERE UNE LISTE UNIQUE DES UEs */
|
||||||
$ListeNomsUE = array();
|
$ListeNomsUE = array();
|
||||||
foreach($answer->UEs as $UE)
|
foreach($answer->UEs as $UE)
|
||||||
|
|
Loading…
Reference in New Issue