Déplacement d'étudiants multiple + affichage des noms de groupes par taille puis alpha

This commit is contained in:
xdrm-brackets 2015-12-06 15:05:22 +01:00
parent 4e240478d8
commit 7a4c2e7f87
13 changed files with 91 additions and 91 deletions

View File

@ -40,9 +40,6 @@ body{
/* background */ /* background */
background: #ecf0f1; background: #ecf0f1;
background: url(../src/wallpaper.jpg) top left no-repeat;
background-size: cover;
background-attachment: fixed;
/* scroll */ /* scroll */
overflow: auto; overflow: auto;
@ -74,7 +71,9 @@ body{
box-shadow: 0 0 5px #555; box-shadow: 0 0 5px #555;
/* background */ /* background */
background-color: #ecf0f1; background: #ecf0f1 url(../src/loader.svg) center center no-repeat;
background-size: 5em auto;
background-attachment: fixed;
/* scroll */ /* scroll */
overflow: hidden; overflow: hidden;

View File

@ -130,9 +130,6 @@ var connected = !( DOM.AUTH.children[0].innerHTML == 'Connexion' );
pageM.setPage( section.dataset.link ); pageM.setPage( section.dataset.link );
/* on active les sous-parties */ /* on active les sous-parties */
pageM.container.innerHTML = '';
pageM.container.style.background= 'url(../src/loader.gif) center center no-repeat';
pageM.container.style.backgroundSize= '2em auto';
pageM.xhr[pageM.xhr.length-1].addEventListener('load', function(){ pageM.xhr[pageM.xhr.length-1].addEventListener('load', function(){
// on récupère les sections du document // on récupère les sections du document

View File

@ -51,7 +51,7 @@ APIClass.prototype = {
if( ptrAPI.xhr[i].readyState == 4 ){ // si la requête est terminée if( ptrAPI.xhr[i].readyState == 4 ){ // si la requête est terminée
/* DEBUG : affiche la réponse BRUTE de API.php */ /* DEBUG : affiche la réponse BRUTE de API.php */
// console.log('API.php => '+ptrAPI.xhr[i].responseText); console.log('API.php => '+ptrAPI.xhr[i].responseText);
console.log( JSON.parse(ptrAPI.xhr[i].responseText) ); console.log( JSON.parse(ptrAPI.xhr[i].responseText) );
/* si success de requête */ /* si success de requête */

0
js/lib/adjust.js Normal file → Executable file
View File

View File

@ -546,21 +546,20 @@ class DataBase{
} }
/****************************************************************/
/******************************************************/ /***** déplace une liste d'étudiants d'un groupe à un autre *****/
/***** déplace un étudiant d'un groupe à un autre *****/ /****************************************************************/
/******************************************************/ public function deplacerEtudiantMultiple($etudiants, $groupe, $semestre){
public function deplacerEtudiant($etudiant, $groupe, $semestre){
// on vérifie que le semestre et que le groupe de destination existent // on vérifie que le semestre et que le groupe de destination existent
if( !($semestreInfo=semestreRepo::info($semestre)) ) return 'unknown_semestre'; if( !($semestreInfo=semestreRepo::info($semestre)) ) return 'unknown_semestre';
if( !($destGroupeInfo=groupRepo::info($groupe)) ) return 'unknown_newgroup'; if( !($destGroupeInfo=groupRepo::info($groupe)) ) return 'unknown_newgroup';
if( groupRepo::ajouterMembre($etudiant, $destGroupeInfo['id'], $semestreInfo['id']) ) foreach($etudiants as $etu)
return 'success'; if( !(groupRepo::ajouterMembre($etu, $destGroupeInfo['id'], $semestreInfo['id'])) )
else return 'error';
return 'error';
return 'success';
} }

View File

@ -225,18 +225,19 @@ require_once __ROOT__.'/manager/database.php';
$answer->request = 'permission_error'; $answer->request = 'permission_error';
break; break;
/************************************************/
/* déplace un étudiant de son groupe à un autre */
/************************************************/
case 'move': if( permission('admin') && $_SESSION['annee'] >= getCurrentYear() ){
$areSetParam = isset($request->etudiant) && isset($request->groupe) && isset($request->semestre); // les arguments existent /************************************************************/
$typeOkParam = $areSetParam && is_string($request->etudiant) && is_numeric($request->groupe); // si c'est des strings /* déplace une liste d'étudiants de leurs groupe à un autre */
$nEmptyParam = $typeOkParam && strlen($request->etudiant) > 0 && is_numeric($request->semestre); // d'au moins 1 caractère /************************************************************/
$etudiantCheck = $nEmptyParam && preg_match('/^[\w -]{3,50}$/i', $request->etudiant); // etudiant (username) bon format case 'move_multiple': if( permission('admin') && $_SESSION['annee'] >= getCurrentYear() ){
if( $etudiantCheck ){ // si param ok $areSetParam = isset($request->etudiants) && isset($request->groupe) && isset($request->semestre); // les arguments existent
$answer->request = DataBase::getInstance()->deplacerEtudiant($request->etudiant, $request->groupe, $request->semestre); $typeOkParam = $areSetParam && is_array($request->etudiants) && is_numeric($request->groupe); // si c'est des strings
$nEmptyParam = $typeOkParam && count($request->etudiants) > 0 && is_numeric($request->semestre); // d'au moins 1 caractère
if( $nEmptyParam ){ // si param ok
$answer->request = DataBase::getInstance()->deplacerEtudiantMultiple($request->etudiants, $request->groupe, $request->semestre);
}else }else
$answer->request = 'param_error'; $answer->request = 'param_error';

View File

@ -91,8 +91,8 @@ class groupRepo extends DBAccess{
public static function creer($nom){ public static function creer($nom){
/* [1] On vérifie l'existence d'un groupe avec ce nom /* [1] On vérifie l'existence d'un groupe avec ce nom
======================================================*/ ======================================================*/
if( groupRepo::UID($nom) ) // si le groupe existe déjà if( $groupeUID=groupRepo::UID($nom) ) // si le groupe existe déjà
return false; // on retourne FAUX return $groupeUID; // on retourne FAUX
/* [2] On créé le groupe /* [2] On créé le groupe
=========================*/ =========================*/
@ -337,7 +337,7 @@ class groupRepo extends DBAccess{
* *
*/ */
public static function getAllGroups(){ public static function getAllGroups(){
$getGroupList = DataBase::getPDO()->query("SELECT DISTINCT id_groupe as id, nom FROM groupe ORDER BY nom ASC"); $getGroupList = DataBase::getPDO()->query("SELECT DISTINCT id_groupe as id, nom FROM groupe ORDER BY LENGTH(nom), nom ASC");
// $getGroupList = DataBase::getPDO()->query("SELECT id_groupe as id, nom FROM groupe WHERE length(nom) <= 6 ORDER BY nom ASC"); // $getGroupList = DataBase::getPDO()->query("SELECT id_groupe as id, nom FROM groupe WHERE length(nom) <= 6 ORDER BY nom ASC");
return DataBase::delNumeric( $getGroupList->fetchAll() ); return DataBase::delNumeric( $getGroupList->fetchAll() );

View File

@ -27,63 +27,58 @@ if( canSeeStudent ){
/* GESTION DU DEPLACEMENT D'ELEVES */ /* 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
/* DEPLACEMENT A L'AIDE DES <SELECT> */ var deplacementEtudiants = document.querySelectorAll('#CONTAINER section[name=movestudents] table tr td input.deplacer_etu[data-usr]');
var deplacementElements = document.querySelectorAll('#CONTAINER section[name=movestudents] table tr td select'); var choixGroupeDestination = document.querySelectorAll('#CONTAINER section[name=movestudents] table tr td .deplacement_groupe[data-stre]');
var deplacementObj = []; var validerDeplacement = document.querySelectorAll('#CONTAINER section[name=movestudents] table tr td .valider_deplacement');
// on référencie tous les select dans un objet // contiendra les étudiants selectionnés
for( var i = 0 ; i < deplacementElements.length ; i++ ){ var etudiantsADeplacer = [];
// contiendra le groupe de destination
var destGroupe = document.querySelector('#CONTAINER section[name=movestudents] table tr td .deplacement_groupe[data-stre]').value;
var destSemestre = document.querySelector('#CONTAINER section[name=movestudents] table tr td .deplacement_groupe[data-stre]').dataset.stre;
deplacementElements[i].dataset.i = i; // le rang du <select> dans la liste /* LORSQU'ON "CHECK" UN ETUDIANT ON LE RAJOUTE A LA LISTE */
for( var i = 0 ; i < deplacementEtudiants.length ; i++ )
deplacementObj[i] = { deplacementEtudiants[i].addEventListener('click', function(e){
select: deplacementElements[i], // le <select> en question var index = etudiantsADeplacer.indexOf(e.target.dataset.usr);
initval: deplacementElements[i].value, // la valeur initiale du <select> if( e.target.checked ) // si on active
button: deplacementElements[i].parentNode.children[1], // le bouton de validation pour ce <select> etudiantsADeplacer.push( e.target.dataset.usr );
streid: deplacementElements[i].dataset.stre, // l'UID du semestre associé au groupe
userid: deplacementElements[i].parentNode.parentNode.children[0].children[0].innerHTML // l'identifiant de l'utilisateur associé à ce <select>
};
// on créé l'évènement qui affiche le validateur dès le changement de valeur
deplacementObj[i].select.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') && deplacementObj[e.target.dataset.i].select == e.target ){
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)
addClass( obj.select, 'active' );
else
remClass( obj.select, 'active' );
} else if( index > -1 ) // sinon on enlève (si dans la liste)
etudiantsADeplacer = etudiantsADeplacer.slice(0, index).concat( etudiantsADeplacer.slice(index+1) );
}, false);
/* ON SYNCHRONISE TOUS LES SELECT */
for( var g = 0 ; g < choixGroupeDestination.length ; g++ )
choixGroupeDestination[g].addEventListener('change', function(e){
destGroupe = e.target.value;
destSemestre = e.target.dataset.stre;
for( var i = 0 ; i < choixGroupeDestination.length ; i++ )
choixGroupeDestination[i].value = e.target.value;
}, false); }, false);
// on créé l'évènement de confirmation du déplacement /* VALIDATION DE DEPLACEMENT */
deplacementObj[i].button.addEventListener('click', function(e){ for( var i = 0 ; i < validerDeplacement.length ; i++ )
// s'il s'agit bien d'un bouton de validation, que le <select> associé a data-i existante et que ça match correctement validerDeplacement[i].addEventListener('click', function(e){
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 ){ // on créé la requête
var obj = deplacementObj[e.target.parentNode.children[0].dataset.i]; var request = {
level_0: 'groups',
level_1: 'move_multiple',
semestre: destSemestre,
etudiants: etudiantsADeplacer,
groupe: destGroupe
};
addClass( obj.button, 'loading' ); console.log( request );
// on envoie la requête
var request = { // on définit la requête pour API API.send(request, function(answer){
level_0: 'groups', if( answer.request == 'success' ) reload();
level_1: 'move', });
etudiant: obj.userid,
groupe: obj.select.value,
semestre: obj.streid
};
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); }, false);
}
} }

View File

@ -846,7 +846,7 @@ elseif( permission('master') || permission('admin') ){ // si enseignant et qu'un
* *
*/ */
if( (permission('master') || permission('admin')) && $etudiantOpt != null ){ if( (permission('master') || permission('admin')) && $etudiantOpt != null ){
include __ROOT__.'src/svg.php'; include __ROOT__.'/src/svg.php';

View File

@ -165,8 +165,6 @@ if( permission('student') ){ // si l'utilisateur est connecté et que c'est un
echo '</tr>'; echo '</tr>';
}} }}
// echo '<tr><td colspan=5 class=more></td></tr>';
echo '</tbody></table>'; echo '</tbody></table>';
@ -505,22 +503,29 @@ if( permission('admin') || permission('master') ){ // si l'utilisateur est conne
// l'admin uniquement peut déplacer les étudiants // l'admin uniquement peut déplacer les étudiants
/**/ if( permission('admin') ){ /**/ if( permission('admin') ){
/* CHANGEMENT DE GROUPE */ /* CHANGEMENT DE GROUPE */
echo "<select data-stre='".$group['id_semestre']."' class='deplacement_groupe'>"; echo "<input data-usr='".$user['identifiant']."' class='deplacer_etu' type='checkbox' id='".$user['identifiant']."deplacer'><label for='".$user['identifiant']."deplacer'></label> déplacer";
// on affiche le groupe courant
echo "<option value='".$group['id']."' selected>".$group['nom']."</option>";
foreach($answerAllGroups->grouplist as $groupemodif) // pour tous les groupes
if( $groupemodif['rang'] == $group['rang'] && $groupemodif['id'] != $group['id'] ) // si c'est un groupe du même rang et pas le groupe actuel
echo "<option value='".$groupemodif['id']."'>".$groupemodif['nom']."</option>";
echo '</select>';
echo "<div class='confirm'>déplacer</div>";
} }
echo '</td>'; echo '</td>';
echo '</tr>'; echo '</tr>';
} }
/* après chaque groupe on propose de déplacer les élèves cochés */
echo "<tr>";
echo "<td colspan=2>Déplacer les élèves selectionnés vers: </td>";
echo "<td colspan=3>";
echo "<select data-stre='".$group['id_semestre']."' class='deplacement_groupe'>";
echo "<option value='".$group['id']."' selected>".$group['nom']."</option>";
foreach($answerAllGroups->grouplist as $groupemodif) // pour tous les groupes
if( $groupemodif['rang'] == $group['rang'] && $groupemodif['id'] != $group['id'] ) // si c'est un groupe du même rang et pas le groupe actuel
echo "<option value='".$groupemodif['id']."'>".$groupemodif['nom']."</option>";
echo '</select>';
echo "<div class='confirm active valider_deplacement'>déplacer les étudiants</div>";
echo "</td>";
echo "</tr>";
// echo '<tr><td colspan=5 class=more></td></tr>'; // echo '<tr><td colspan=5 class=more></td></tr>';
echo '</tbody>'; echo '</tbody>';

Binary file not shown.

Before

Width:  |  Height:  |  Size: 847 B

1
src/loader.svg Executable file
View File

@ -0,0 +1 @@
<?xml version="1.0" encoding="utf-8"?><svg width='126px' height='126px' xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" preserveAspectRatio="xMidYMid" class="uil-ripple"><rect x="0" y="0" width="100" height="100" fill="none" class="bk"></rect><g> <animate attributeName="opacity" dur="2s" repeatCount="indefinite" begin="0s" keyTimes="0;0.33;1" values="1;1;0"></animate><circle cx="50" cy="50" r="40" stroke="#2dcc70" fill="none" stroke-width="5" stroke-linecap="round"><animate attributeName="r" dur="2s" repeatCount="indefinite" begin="0s" keyTimes="0;0.33;1" values="0;22;44"></animate></circle></g><g><animate attributeName="opacity" dur="2s" repeatCount="indefinite" begin="1s" keyTimes="0;0.33;1" values="1;1;0"></animate><circle cx="50" cy="50" r="40" stroke="#ffffff" fill="none" stroke-width="5" stroke-linecap="round"><animate attributeName="r" dur="2s" repeatCount="indefinite" begin="1s" keyTimes="0;0.33;1" values="0;22;44"></animate></circle></g></svg>

After

Width:  |  Height:  |  Size: 975 B

View File

@ -46,6 +46,9 @@ require_once __ROOT__.'/manager/security.php';
debug(); debug();
var_dump( $_SESSION ); var_dump( $_SESSION );
// $_SESSION['annee'] = 2015; // $_SESSION['annee'] = 2015;
// require_once __ROOT__.'/manager/phpExcel.php'; // require_once __ROOT__.'/manager/phpExcel.php';