Correction affichage notes étudiants, + saisie en cours
This commit is contained in:
parent
92435df362
commit
f5ae82feba
|
@ -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_action{
|
||||||
.valider_deplacement{
|
|
||||||
/* position */
|
/* position */
|
||||||
/*display: inline-block;*/ display: none;
|
/*display: inline-block;*/ display: none;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
|
@ -230,5 +224,27 @@ select > option:nth-child(4n+3){ color: #2dcc70; }*/
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
.valider_deplacement.active{ display: inline-block; background-image: url(../src/validate.svg); }
|
/* bouton validation */
|
||||||
tr:hover td .valider_deplacement.active{ background-image: url(../src/validate@hover.svg); }
|
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); }
|
||||||
|
|
|
@ -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 */
|
/* DEFAULT */
|
||||||
|
|
|
@ -4,58 +4,6 @@
|
||||||
/* GESTION DE LE FILTRAGE POUR LES ENSEIGNANTS */
|
/* GESTION DE LE FILTRAGE POUR LES ENSEIGNANTS */
|
||||||
/***********************************************/
|
/***********************************************/
|
||||||
if( document.querySelector('#CONTAINER section[name=controlesenseignants]') ){ // on traite uniquement si la section est définie
|
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]');
|
controlesenseignantSection = document.querySelector('#CONTAINER section[name=controlesenseignants]');
|
||||||
if( controlesenseignantSection != null ){ // si la section enseignant est présente sur la page
|
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 <INPUT> */
|
||||||
|
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 <input> dans la liste
|
||||||
|
|
||||||
|
saisieObj[i] = {
|
||||||
|
inputEl: saisieInput[i], // le <input> en question
|
||||||
|
initval: saisieInput[i].value, // la valeur initiale du <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
|
||||||
|
userid: saisieInput[i].parentNode.parentNode.children[0].children[0].innerHTML // l'identifiant de l'utilisateur associé à ce <input>
|
||||||
|
};
|
||||||
|
|
||||||
|
// 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 <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 ){
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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
|
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]; // <tbody> destination
|
|
||||||
// tableauDestination.appendChild( input ); // on ajoute le membre au nouveau groupe
|
|
||||||
|
|
||||||
// // selectSection( document.querySelector('#MENU span[data-link=groups]') );
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
// });
|
|
||||||
//
|
|
||||||
|
|
||||||
/* DEPLACEMENT A L'AIDE DES <SELECT> */
|
/* DEPLACEMENT A L'AIDE DES <SELECT> */
|
||||||
var deplacementElements = document.querySelectorAll('#CONTAINER section[name=movestudents] table tr td select');
|
var deplacementElements = document.querySelectorAll('#CONTAINER section[name=movestudents] table tr td select');
|
||||||
var deplacementObj = [];
|
var deplacementObj = [];
|
||||||
|
@ -97,9 +63,9 @@ if( document.querySelector('#CONTAINER section[name=movestudents]') != null ){ /
|
||||||
var obj = deplacementObj[e.target.dataset.i];
|
var obj = deplacementObj[e.target.dataset.i];
|
||||||
|
|
||||||
if( obj.initval != obj.select.value ) // si c'est une nouvelle valeur (nouveau groupe), on active le validateur (bouton)
|
if( obj.initval != obj.select.value ) // si c'est une nouvelle valeur (nouveau groupe), on active le validateur (bouton)
|
||||||
addClass( obj.button, 'active' );
|
addClass( obj.select, 'active' );
|
||||||
else
|
else
|
||||||
remClass( obj.button, 'active' );
|
remClass( obj.select, 'active' );
|
||||||
|
|
||||||
}
|
}
|
||||||
}, false);
|
}, false);
|
||||||
|
@ -108,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_deplacement/.test(e.target.className) && e.target.parentNode.children[0].dataset.hasOwnProperty('i') && deplacementObj[e.target.parentNode.children[0].dataset.i].button == e.target ){
|
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 ){
|
||||||
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
|
||||||
|
|
|
@ -309,12 +309,15 @@ elseif( permission('teacher') ){ // si enseignant et qu'un contrôle est spécif
|
||||||
echo "<td><span class='link etu' data-etu='".$user['identifiant']."' data-ctrl='".$answer->controle['id']."'>".$user['identifiant']."</span></td>";
|
echo "<td><span class='link etu' data-etu='".$user['identifiant']."' data-ctrl='".$answer->controle['id']."'>".$user['identifiant']."</span></td>";
|
||||||
echo "<td><span class='link grp' data-grp='".$user['groupe']."'>".$user['groupe']."</span></td>";
|
echo "<td><span class='link grp' data-grp='".$user['groupe']."'>".$user['groupe']."</span></td>";
|
||||||
|
|
||||||
if( $user['note'] == null ) // si pas de note
|
if( $user['note'] != null ) // si on a une note
|
||||||
echo "<td>".number_format($user['note'], 2)." <span class=unstressed>/</span> ".$answer->controle['base']."</td>";
|
echo "<td>".number_format($user['note'], 2)." <span class=unstressed>/</span> ".$answer->controle['base']."</td>";
|
||||||
else // si noté
|
else // si noté
|
||||||
echo "<td><span class=unstressed>Pas noté</span></td>";
|
echo "<td><span class=unstressed>Pas noté</span></td>";
|
||||||
|
|
||||||
echo "<td></td>";
|
echo "<td>";
|
||||||
|
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' data-info='cliquer pour valider'></div>";
|
||||||
|
echo "</td>";
|
||||||
|
|
||||||
echo "</tr>";
|
echo "</tr>";
|
||||||
}
|
}
|
||||||
|
|
|
@ -517,7 +517,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_deplacement' data-info='cliquer pour valider'></div>";
|
echo "<div class='valider_action' data-info='cliquer pour valider'></div>";
|
||||||
echo '</td>';
|
echo '</td>';
|
||||||
echo '</tr>';
|
echo '</tr>';
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue