Déplacement d'étudiants multiple + affichage des noms de groupes par taille puis alpha
This commit is contained in:
parent
4e240478d8
commit
7a4c2e7f87
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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';
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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';
|
||||
|
||||
|
|
|
@ -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() );
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -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';
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -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>';
|
||||
|
|
BIN
src/loader.gif
BIN
src/loader.gif
Binary file not shown.
Before Width: | Height: | Size: 847 B |
|
@ -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 |
Loading…
Reference in New Issue