diff --git a/css/global.css b/css/global.css index d16eb59..fe219f9 100755 --- a/css/global.css +++ b/css/global.css @@ -228,7 +228,7 @@ td select > option{ padding: 0; } -.valider_action{ +.confirm{ /* position */ /*display: inline-block;*/ display: none; position: absolute; @@ -254,16 +254,26 @@ td select > option{ padding: 0; } cursor: pointer; } + + +/* @all */ +.confirm.all{ margin-top: -.7em; } + + + /* @active */ -input.active + .valider_action, -select.active + .valider_action{ +input.active + .confirm, +select.active + .confirm, +.confirm.active{ display: inline-block; background-image: url(../src/validate.svg); } + /* tr@hover */ -body.trHoverActivated tr:hover td select.active + .valider_action, -body.trHoverActivated tr:hover td input.active + .valider_action{ +body.trHoverActivated tr:hover td select.active + .confirm, +body.trHoverActivated tr:hover td input.active + .confirm, +body.trHoverActivated tr:hover td .confirm.active{ border-color: #fff; background-image: url(../src/validate@hover.svg); color: #fff; diff --git a/js/actionScript.js b/js/actionScript.js index e8812a1..448008a 100755 --- a/js/actionScript.js +++ b/js/actionScript.js @@ -64,6 +64,15 @@ var connected = !( DOM.AUTH.children[0].innerHTML == 'Connexion' ); /* initialisation du gestionnaire */ 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 diff --git a/page/_JS/career.js b/page/_JS/career.js index d3e9b5a..1bd63b7 100644 --- a/page/_JS/career.js +++ b/page/_JS/career.js @@ -88,12 +88,19 @@ if( document.querySelector('#CONTAINER section[name=controlesenseignants]') ){ / /* 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 /* SAISIE A L'AIDE DES */ var saisieInput = document.querySelectorAll('#CONTAINER section[name=controlesenseignants] table tr td input[type=number][data-ctrl].saisie_note'); 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 for( var i = 0 ; i < saisieInput.length ; i++ ){ @@ -101,7 +108,7 @@ if( document.querySelector('#CONTAINER section[name=controlesenseignants]') != n saisieObj[i] = { inputEl: saisieInput[i], // le en question - initval: saisieInput[i].value, // la valeur initiale du + initval: parseFloat( saisieInput[i].value.replace(',', '.') ), // la valeur initiale du button: saisieInput[i].parentNode.children[1], // le bouton de validation pour ce 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 @@ -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 if( e.target.dataset.hasOwnProperty('i') && saisieObj[e.target.dataset.i].inputEl == e.target){ 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' ); else 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); - // 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){ // s'il s'agit bien d'un bouton de validation, que le 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 request = { // on définit la requête pour API @@ -143,6 +167,38 @@ if( document.querySelector('#CONTAINER section[name=controlesenseignants]') != n } }, 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); + } diff --git a/page/_JS/groups.js b/page/_JS/groups.js index 161bccc..3e65502 100755 --- a/page/_JS/groups.js +++ b/page/_JS/groups.js @@ -74,7 +74,7 @@ if( document.querySelector('#CONTAINER section[name=movestudents]') != null ){ / // on créé l'évènement de confirmation du déplacement deplacementObj[i].button.addEventListener('click', function(e){ // s'il s'agit bien d'un bouton de validation, que le "; - echo "
enregistrer
"; + echo "
enregistrer
"; echo ""; echo ""; } + echo ""; + echo ""; + echo ""; + echo ""; + echo "
tout enregistrer
"; + echo ""; + } echo ''; diff --git a/page/groups.php b/page/groups.php index cff6cd9..87f5532 100755 --- a/page/groups.php +++ b/page/groups.php @@ -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 echo ""; echo ''; - echo "
déplacer
"; + echo "
déplacer
"; echo ''; echo ''; } diff --git a/page/modules.php b/page/modules.php index 038dbfe..f786a7b 100755 --- a/page/modules.php +++ b/page/modules.php @@ -181,14 +181,7 @@ if( permission('admin') ){ // si l'utilisateur est un admin if( $answer->request == 'success' ){ // si on a bien récupéré les membres du groupe //////////////////////////////////////////////////////////////////////////////// echo "
"; - - - - /* 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 */ $ListeNomsUE = array();