diff --git a/css/global.css b/css/global.css index 1bb72f2..1dda044 100755 --- a/css/global.css +++ b/css/global.css @@ -204,16 +204,10 @@ td select > option{ padding: 0; } -/* -select > option:nth-child(4n+0){ color: #e63c54; } -select > option:nth-child(4n+1){ color: #3c73e6; } -select > option:nth-child(4n+2){ color: #e6983c; } -select > option:nth-child(4n+3){ color: #2dcc70; }*/ - -.valider_deplacement{ +.valider_action{ /* position */ /*display: inline-block;*/ display: none; position: absolute; @@ -230,5 +224,27 @@ select > option:nth-child(4n+3){ color: #2dcc70; }*/ cursor: pointer; } -.valider_deplacement.active{ display: inline-block; background-image: url(../src/validate.svg); } -tr:hover td .valider_deplacement.active{ background-image: url(../src/validate@hover.svg); } \ No newline at end of file +/* bouton validation */ +select.active + .valider_action{ display: inline-block; background-image: url(../src/validate.svg); } +tr:hover td select.active + .valider_action{ background-image: url(../src/validate@hover.svg); } + + +/* saisie note */ +.saisie_note{ + /* position */ + margin: -.5em; + width: 4em; + padding: .5em 1em; + + /* border */ + border-radius: 3px; + border: 1px solid #bdbdbd; +} + +/* @focus */ +.saisie_note:focus{ border-color: #999; } + + +/* bouton validation */ +input.saisie_note.active + .valider_action{ display: inline-block; background-image: url(../src/validate.svg); } +tr:hover td input.saisie_note.active + .valider_action{ background-image: url(../src/validate@hover.svg); } diff --git a/manager/career.php b/manager/career.php index f88e206..a570978 100755 --- a/manager/career.php +++ b/manager/career.php @@ -123,6 +123,40 @@ require_once __ROOT__.'/manager/database.php'; + /****************************************************/ + /* saisie d'une note pour un étudiant à un contrôle */ + /****************************************************/ + case 'saisieNote': if( permission('teacher') ){ + + $areSetParam = isset($request->etudiant) && isset($request->controle); // les arguments existent + $typeOkParam = $areSetParam && is_string($request->enseignant); // si c'est des strings + $nEmptyParam = $typeOkParam && strlen($request->enseignant) > 0 && is_numeric($request->controle); // des bon types + $enseignantCheck = $nEmptyParam && preg_match('/^[\w -]{3,50}$/i', $request->enseignant); // nom bon format + + // paramètre optionnel + $optionalGroupe = isset($request->groupe) && is_string($request->groupe) && strlen($request->groupe) > 1 && preg_match('/^[a-z0-9 -]{1,10}$/i', $request->groupe); + + // définition (ou pas) du paramètre optionnel + if( $optionalGroupe ) $groupe = $request->groupe; + else $groupe = null; + + if( $enseignantCheck ){ // si tout les paramètres sont bons + $controle = DataBase::getInstance()->getNotesEnseignant($request->enseignant, $_SESSION['semestre_pair'], $_SESSION['annee'], $request->controle, $groupe); + + if( is_array($controle) ){ // si on a bien un tableau + $answer->controle = $controle; // on renvoie dans answer->controle + $answer->request = 'success'; // et on renvoie success + }else // sinon si c'est pas un tableau + $answer->request = $controle; // on retourne l'erreur + }else + $answer->request = 'param_error'; + + }else + $answer->request = 'permission_error'; + break; + + + /***********/ /* DEFAULT */ diff --git a/page/_JS/career.js b/page/_JS/career.js index da4285a..fc4e973 100644 --- a/page/_JS/career.js +++ b/page/_JS/career.js @@ -4,58 +4,6 @@ /* GESTION DE LE FILTRAGE POUR LES ENSEIGNANTS */ /***********************************************/ if( document.querySelector('#CONTAINER section[name=controlesenseignants]') ){ // on traite uniquement si la section est définie - // on récupère les liens - - // /**************************************************/ - // /* GESTION DES LIENS POUR LES CONTRÔLES & GROUPES */ - // /**************************************************/ - // var groupControlList = document.querySelectorAll('#CONTAINER section[name=controlesenseignants] table.basic table.basic tr td span.link.grp.ctrl'); - - // for( var i = 0 ; i < groupControlList.length ; i++ ) // on active un évènement pour le clic sur les nom de groupes - // groupControlList[i].addEventListener('click', function(e){ - - // if( e.target.className == 'link grp ctrl' && e.target.dataset.hasOwnProperty('grp') && e.target.dataset.hasOwnProperty('ctrl') ){ // s'il s'agit bien d'un nom de groupe - // pageM.vars[2] = e.target.dataset.grp; // le groupe en question - // pageM.vars[1] = e.target.dataset.ctrl; // le contrôle en question - // reload(); - // } - // }, false); - - - - // /****************************************/ - // /* GESTION DES LIENS POUR LES CONTRÔLES */ - // /****************************************/ - // // on récupère les liens - // var controleLinks = document.querySelectorAll('#CONTAINER section[name=controlesenseignants] table.basic span.link.ctrl'); - - // for( var i = 0 ; i < controleLinks.length ; i++ ) // on active un évènement pour le clic sur les nom de groupes - // controleLinks[i].addEventListener('click', function(e){ - - // if( e.target.className == 'link ctrl' && e.target.dataset.hasOwnProperty('ctrl') ){ // s'il s'agit bien d'un nom de groupe - // if( pageM.vars.length > 2 ) // si le groupe est défini, on le dé-défini - // pageM.vars.pop(); - - // pageM.vars[1] = e.target.dataset.ctrl; // le contrôle en question - // reload(); - // } - // }, false); - - // /**************************************/ - // /* GESTION DES LIENS POUR LES GROUPES */ - // /**************************************/ - // // on récupère les liens - // var groupList = document.querySelectorAll('#CONTAINER section[name=controlesenseignants] table.basic span.link.grp'); - - // for( var i = 0 ; i < groupList.length ; i++ ) // on active un évènement pour le clic sur les nom de groupes - // groupList[i].addEventListener('click', function(e){ - - // if( e.target.className == 'link grp' && e.target.dataset.hasOwnProperty('grp') ){ // s'il s'agit bien d'un nom de groupe - // pageM.vars[2] = e.target.dataset.grp; // le contrôle en question - // console.log( e.target.dataset.grp ); - // reload(); - // } - // }, false); controlesenseignantSection = document.querySelector('#CONTAINER section[name=controlesenseignants]'); if( controlesenseignantSection != null ){ // si la section enseignant est présente sur la page @@ -92,7 +40,66 @@ if( document.querySelector('#CONTAINER section[name=controlesenseignants]') ){ / } +/* GESTION DE LA SAISIE DE NOTES */ +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 = []; + + // on référencie tous les input dans un objet + for( var i = 0 ; i < saisieInput.length ; i++ ){ + + saisieInput[i].dataset.i = i; // le rang du dans la liste + + saisieObj[i] = { + inputEl: saisieInput[i], // le en question + initval: saisieInput[i].value, // 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 + }; + + // on créé l'évènement qui affiche le validateur dès le changement de valeur + saisieObj[i].inputEl.addEventListener('change', function(e){ + // 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]; + + if( obj.initval != obj.inputEl.value ) // si c'est une nouvelle valeur (nouveau groupe), on active le validateur (bouton) + addClass( obj.inputEl, 'active' ); + else + remClass( obj.inputEl, 'active' ); + + } + }, false); + + + // on créé l'évènement de confirmation du déplacement + 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 ){ + var obj = saisieObj[e.target.parentNode.children[0].dataset.i]; + + var request = { // on définit la requête pour API + level_0: 'career', + level_1: 'saisieNote', + etudiant: obj.userid, + controle: obj.ctrlid, + note: obj.inputEl.value, + }; + + API.send(request, function(response){ // on gère la réponse de API, si déplacement effectué, on recharge la page + if( response.request == 'success' ) reload(); + }); + + } + + }, false); + } + + +} diff --git a/page/_JS/groups.js b/page/_JS/groups.js index 49c60aa..86c6961 100755 --- a/page/_JS/groups.js +++ b/page/_JS/groups.js @@ -37,43 +37,9 @@ var afficherCacherGroupesDefined = true; -/* GESTION DU DRAG N DROP */ +/* GESTION DU DEPLACEMENT D'ELEVES */ if( document.querySelector('#CONTAINER section[name=movestudents]') != null ){ // si c'set l'admin - // var members = document.querySelectorAll('#CONTAINER section[name=movestudents] table tr td:not(.more)'); - // for( var i = 0 ; i < members.length ; i++ ) - // dnd.setDraggable(members[i]); - - // var groups = document.querySelectorAll('#CONTAINER section[name=movestudents] table thead th:first-child'); - // for( var i = 0 ; i < groups.length ; i++ ) - // dnd.setDroppable(groups[i]); - - // dnd.init(function(input, output){ // on demande un déplacement - // var id_etudiant = input.children[0].children[0].innerHTML; - // var nom_groupe = output.children[0].innerHTML; - - // var request = { // on définit la requête pour API - // level_0: 'groups', - // level_1: 'move', - // etudiant: id_etudiant, - // groupe: nom_groupe - // }; - - // // l'ordre n'est pas alphabétique mais va à la fin - - // API.send(request, function(response){ // on gère la réponse de API - // if( response.request == 'success' ){ - // input.parentNode.removeChild( input ); // on supprime le membre de l'ancien groupe - - // var tableauDestination = output.parentNode.parentNode.parentNode.children[1]; //
destination - // tableauDestination.appendChild( input ); // on ajoute le membre au nouveau groupe - - // // selectSection( document.querySelector('#MENU span[data-link=groups]') ); - // } - // }); - // }); - // - /* DEPLACEMENT A L'AIDE DES