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

View File

@ -130,9 +130,6 @@ var connected = !( DOM.AUTH.children[0].innerHTML == 'Connexion' );
pageM.setPage( section.dataset.link );
/* 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(){
// 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
/* 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) );
/* 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 un étudiant d'un groupe à un autre *****/
/******************************************************/
public function deplacerEtudiant($etudiant, $groupe, $semestre){
/****************************************************************/
/***** déplace une liste d'étudiants d'un groupe à un autre *****/
/****************************************************************/
public function deplacerEtudiantMultiple($etudiants, $groupe, $semestre){
// on vérifie que le semestre et que le groupe de destination existent
if( !($semestreInfo=semestreRepo::info($semestre)) ) return 'unknown_semestre';
if( !($destGroupeInfo=groupRepo::info($groupe)) ) return 'unknown_newgroup';
if( groupRepo::ajouterMembre($etudiant, $destGroupeInfo['id'], $semestreInfo['id']) )
return 'success';
else
return 'error';
foreach($etudiants as $etu)
if( !(groupRepo::ajouterMembre($etu, $destGroupeInfo['id'], $semestreInfo['id'])) )
return 'error';
return 'success';
}

View File

@ -225,18 +225,19 @@ require_once __ROOT__.'/manager/database.php';
$answer->request = 'permission_error';
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
$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
/************************************************************/
/* déplace une liste d'étudiants de leurs groupe à un autre */
/************************************************************/
case 'move_multiple': if( permission('admin') && $_SESSION['annee'] >= getCurrentYear() ){
if( $etudiantCheck ){ // si param ok
$answer->request = DataBase::getInstance()->deplacerEtudiant($request->etudiant, $request->groupe, $request->semestre);
$areSetParam = isset($request->etudiants) && isset($request->groupe) && isset($request->semestre); // les arguments existent
$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
$answer->request = 'param_error';

View File

@ -91,8 +91,8 @@ class groupRepo extends DBAccess{
public static function creer($nom){
/* [1] On vérifie l'existence d'un groupe avec ce nom
======================================================*/
if( groupRepo::UID($nom) ) // si le groupe existe déjà
return false; // on retourne FAUX
if( $groupeUID=groupRepo::UID($nom) ) // si le groupe existe déjà
return $groupeUID; // on retourne FAUX
/* [2] On créé le groupe
=========================*/
@ -337,7 +337,7 @@ class groupRepo extends DBAccess{
*
*/
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");
return DataBase::delNumeric( $getGroupList->fetchAll() );

View File

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

View File

@ -846,7 +846,7 @@ elseif( permission('master') || permission('admin') ){ // si enseignant et qu'un
*
*/
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><td colspan=5 class=more></td></tr>';
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
/**/ if( permission('admin') ){
/* CHANGEMENT DE GROUPE */
echo "<select data-stre='".$group['id_semestre']."' class='deplacement_groupe'>";
// 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 "<input data-usr='".$user['identifiant']."' class='deplacer_etu' type='checkbox' id='".$user['identifiant']."deplacer'><label for='".$user['identifiant']."deplacer'></label> déplacer";
}
echo '</td>';
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 '</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();
var_dump( $_SESSION );
// $_SESSION['annee'] = 2015;
// require_once __ROOT__.'/manager/phpExcel.php';