sid/page/_JS/career.js

785 lines
24 KiB
JavaScript
Executable File

<!--
/********************************/
/* GESTION DE L'AFFINAGE PAR UE */
/********************************/
var selectList = document.querySelectorAll("#CONTAINER > section[name] > .p > select[name=annee]");
var partList = document.querySelectorAll("#CONTAINER > section[name] > table.partlist[name=UE], "+
"#CONTAINER > section[name] > table.partlist[name=semestre], "+
"#CONTAINER > section[name] > table.partlist[name=formation], "+
"#CONTAINER > section[name] > .p > div.partlist[name=semestre] > span[data-stre]");
for( var i = 0 ; i < partList.length ; i++ ){
partList[i].addEventListener('click', function(e){
var tableauParent = e.target.parentNode.parentNode.parentNode;
if( tableauParent.tagName == 'TABLE' && e.target.dataset.hasOwnProperty('value') ){
/* SI c'est une affinage par FORMATION */
if( tableauParent.getAttribute('name') == 'formation' ){
pageM.vars[1] = 'f:'+e.target.dataset.value;
if( pageM.vars.length > 2 ) // si un deuxième affinage existe, on le supprime lors du choix de la formation
pageM.vars.pop();
}
/* SI c'est une affinage par SEMESTRE */
if( tableauParent.getAttribute('name') == 'semestre' )
pageM.vars[2] = 's:'+e.target.dataset.value;
/* SI c'est un affinage par UE */
if( tableauParent.getAttribute('name') == 'UE' )
pageM.vars[2] = 'u:'+e.target.dataset.value;
// si la formation n'est pas définie, on l'active
if( !/^f:/.test(pageM.vars[1]) )
if( document.querySelector('#CONTAINER > section[name] > table.partlist[name=formation] td[data-value].active') != null )
pageM.vars[1] = 'f:'+document.querySelector('#CONTAINER > section[name] > table.partlist[name=formation] td[data-value].active').dataset.value;
// si on a '*' comme valeur, on l'enlève
if( /\*$/.test(pageM.vars[2]) )
pageM.vars.pop();
reload();
// import/export affinage par semestre
}else if( e.target.parentNode.getAttribute('name') == 'semestre' && e.target.dataset.hasOwnProperty('stre') && e.target.dataset.hasOwnProperty('year') ){
pageM.vars[1] = 'a:'+e.target.dataset.year;
pageM.vars[2] = 's:'+e.target.dataset.stre;
reload();
}
}, false);
}
// GESTION DE L'AFFINAGE PAR ANNEE //
for( var i = 0 ; i < selectList.length ; i++ ){
selectList[i].addEventListener('change', function(e){
if( e.target.tagName == 'SELECT' ){
if( e.target.getAttribute('name') == 'annee' )
pageM.vars[1] = 'a:'+e.target.value;
// si la formation n'est pas définie, on l'active
if( !/^[fa]:/.test(pageM.vars[1]) )
if( document.querySelector('#CONTAINER > section[name] > table.partlist[name=formation] td[data-value].active') != null )
pageM.vars[1] = 'f:'+document.querySelector('#CONTAINER > section[name] > table.partlist[name=formation] td[data-value].active').dataset.value;
// si on a '*' comme valeur, on l'enlève
while( /\*$/.test(pageM.vars[pageM.vars.length-1]) )
pageM.vars.pop();
reload();
}
}, false);
}
/**************************************************/
/* GESTION DU FILTRAGE POUR LES ENSEIGNANTS/ADMIN */
/**************************************************/
var canSeeStudent = document.querySelector('#CONTAINER > section[name=allcontroles]') != null;
if( document.querySelectorAll('#CONTAINER section[data-controles]').length > 0 ){ // on traite uniquement si la section est définie
allControleSections = document.querySelectorAll('#CONTAINER section[data-controles]');
for( var i = 0 ; i < allControleSections.length ; i++ ){// si la section enseignant/ou admin est présente sur la page
currentSection = allControleSections[i];
currentSection.addEventListener('click', function(e){ // on créé l'évènement
/* LIENS POUR LES GROUPES ET CONTRÔLES */
if( e.target.className == 'link grp ctrl' && e.target.dataset.hasOwnProperty('grp') && e.target.dataset.hasOwnProperty('ctrl') ){
pageM.vars[1] = 'c:'+e.target.dataset.ctrl;
pageM.vars[2] = 'g:'+e.target.dataset.grp;
reload();
}
/* LIENS POUR LES GROUPES */
if( e.target.className == 'link grp' && e.target.dataset.hasOwnProperty('grp') ){
pageM.vars[2] = 'g:'+e.target.dataset.grp;
reload();
}
/* LIENS POUR LES CONTRÔLES */
if( e.target.className == 'link ctrl' && e.target.dataset.hasOwnProperty('ctrl') ){
pageM.vars[1] = 'c:'+e.target.dataset.ctrl;
if( pageM.vars[2] != null )
pageM.vars.pop();
reload();
}
/* LIENS POUR LES DOSSIER ETUDIANT */
if( canSeeStudent && e.target.className == 'link etu' && e.target.dataset.hasOwnProperty('etu') ){
pageM.vars[1] = 'e:'+e.target.dataset.etu;
if( pageM.vars[2] != null )
pageM.vars.pop();
pageM.vars[0] = 'studentcase'; // on redirige vers la page dossier étudiant
reload();
}
}, false);
}
}
/*******************************************************/
/* GESTION DE LA SAISIE DE NOTES (version enseignants) */
/*******************************************************/
if( document.querySelector('#CONTAINER section[name=controlesenseignants]') != null ){ // si c'est un enseignant
var nombreModificationEnseignant = 0; // contiendra le nombre de notes saisies
/* SAISIE A L'AIDE DES <INPUT> */
var saisieInputEnseignant = document.querySelectorAll('#CONTAINER section[name=controlesenseignants] table tr td input[type=text][data-ctrl].saisie_note');
var saisieObjEnseignant = [];
/* BOUTON "TOUT ENREGISTRER" */
var toutEnregistrerBtnEnseignant = document.querySelector("#CONTAINER section[name=controlesenseignants] table tr td:last-child .confirm.all");
if( toutEnregistrerBtnEnseignant != null ){
// on référencie tous les input dans un objet
for( var i = 0 ; i < saisieInputEnseignant.length ; i++ ){
saisieInputEnseignant[i].dataset.i = i; // le rang du <input> dans la liste
saisieObjEnseignant[i] = {
inputEl: saisieInputEnseignant[i], // le <input> en question
initval: parseFloat( saisieInputEnseignant[i].value.replace(',', '.') ), // la valeur initiale du <input>
button: saisieInputEnseignant[i].parentNode.children[1], // le bouton de validation pour ce <input>
ctrlid: saisieInputEnseignant[i].dataset.ctrl, // on récupère l'id du contrôle
userid: saisieInputEnseignant[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
saisieObjEnseignant[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') && saisieObjEnseignant[e.target.dataset.i].inputEl == e.target){
var obj = saisieObjEnseignant[e.target.dataset.i];
var isActive = /active/.test(obj.inputEl.className); // VRAI si l'élément est actif
// si c'est une nouvelle valeur (nouvelle note), on active le validateur (bouton)
if( obj.initval != parseFloat(obj.inputEl.value.replace(',', '.')) )
addClass( obj.inputEl, 'active' );
else
remClass( obj.inputEl, 'active' );
// si changement du caractère "actif", et plus particulièrement
if( /active/.test(obj.inputEl.className) != isActive )
if( !isActive ) // si activation
nombreModificationEnseignant += 1;
else
nombreModificationEnseignant -= 1;
// si plus d'une modification, on affiche le bouton 'tout enregistrer'
if( nombreModificationEnseignant > 1 )
addClass( toutEnregistrerBtnEnseignant, 'active' );
else
remClass( toutEnregistrerBtnEnseignant, 'active' );
}
}, false);
// on créé l'évènement de confirmation de la saisie
saisieObjEnseignant[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( /confirm/.test(e.target.className) && e.target.parentNode.children[0].dataset.hasOwnProperty('i') && saisieObjEnseignant[e.target.parentNode.children[0].dataset.i].button == e.target ){
var obj = saisieObjEnseignant[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.replace(',', '.'), // par précaution, on replace les virgules par des points pour le php (is_numeric)
};
addClass( obj.button, 'loading' );
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();
// si réponse erreur, on le signale physiquement
else makeBounce(obj.button);
});
}
}, false);
}
// on créé l'évènement de confirmation de la saisie de TOUTES les notes saisies ou modifiées
toutEnregistrerBtnEnseignant.addEventListener('click', function(e){
addClass( toutEnregistrerBtnEnseignant, 'loading' );
var toutesNotes = [];
var controleUID = null;
// on sélectionne toutes les valeurs contenues dans les lignes actives
for( var i = 0 ; i < saisieObjEnseignant.length ; i++ ){ if( /active/.test(saisieObjEnseignant[i].inputEl.className) ){
if( controleUID == null ) controleUID = saisieObjEnseignant[i].ctrlid;
toutesNotes.push({
etudiant: saisieObjEnseignant[i].userid,
valeur: parseFloat( saisieObjEnseignant[i].inputEl.value.replace(',', '.') ) // par précaution, on replace les virgules par des points pour le php (is_numeric)
});
}}
var request = { // on définit la requête pour API
level_0: 'career',
level_1: 'saisieNoteMultiple',
controle: controleUID,
notes: toutesNotes // on donne toutes les notes
};
API.send(request, function(response){ // on gère la réponse de API
if( response.request == 'success' ) // si on a une réponse positive, on incrémente le nombre de succès
reload();
else makeBounce(e.target);
});
}, false);
}
}
/*************************************************/
/* GESTION DE LA SAISIE DE NOTES (version admin) */
/*************************************************/
if( document.querySelector('#CONTAINER section[name=allcontroles]') != null ){ // si c'est un enseignant
var nombreModificationAdmin = 0; // contiendra le nombre de notes saisies
/* SAISIE A L'AIDE DES <INPUT> */
var saisieInputAdmin = document.querySelectorAll('#CONTAINER section[name=allcontroles] table tr td input[type=text][data-ctrl].saisie_note');
var saisieObjAdmin = [];
/* BOUTON "TOUT ENREGISTRER" */
var toutEnregistrerBtnAdmin = document.querySelector("#CONTAINER section[name=allcontroles] table tr td:last-child .confirm.all");
if( toutEnregistrerBtnAdmin != null ){
// on référencie tous les input dans un objet
for( var i = 0 ; i < saisieInputAdmin.length ; i++ ){
saisieInputAdmin[i].dataset.i = i; // le rang du <input> dans la liste
saisieObjAdmin[i] = {
inputEl: saisieInputAdmin[i], // le <input> en question
initval: parseFloat( saisieInputAdmin[i].value.replace(',', '.') ), // la valeur initiale du <input>
button: saisieInputAdmin[i].parentNode.children[1], // le bouton de validation pour ce <input>
ctrlid: saisieInputAdmin[i].dataset.ctrl, // on récupère l'id du contrôle
userid: saisieInputAdmin[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
saisieObjAdmin[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') && saisieObjAdmin[e.target.dataset.i].inputEl == e.target){
var obj = saisieObjAdmin[e.target.dataset.i];
var isActive = /active/.test(obj.inputEl.className); // VRAI si l'élément est actif
// si c'est une nouvelle valeur (nouvelle note), on active le validateur (bouton)
if( obj.initval != parseFloat(obj.inputEl.value.replace(',', '.')) )
addClass( obj.inputEl, 'active' );
else
remClass( obj.inputEl, 'active' );
// si changement du caractère "actif", et plus particulièrement
if( /active/.test(obj.inputEl.className) != isActive )
if( !isActive ) // si activation
nombreModificationAdmin += 1;
else
nombreModificationAdmin -= 1;
// si plus d'une modification, on affiche le bouton 'tout enregistrer'
if( nombreModificationAdmin > 1 )
addClass( toutEnregistrerBtnAdmin, 'active' );
else
remClass( toutEnregistrerBtnAdmin, 'active' );
}
}, false);
// on créé l'évènement de confirmation de la saisie
saisieObjAdmin[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( /confirm/.test(e.target.className) && e.target.parentNode.children[0].dataset.hasOwnProperty('i') && saisieObjAdmin[e.target.parentNode.children[0].dataset.i].button == e.target ){
var obj = saisieObjAdmin[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.replace(',', '.'), // par précaution, on replace les virgules par des points pour le php (is_numeric)
};
addClass( obj.button, 'loading' );
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();
// si réponse erreur, on le signale physiquement
else makeBounce(obj.button);
});
}
}, false);
}
// on créé l'évènement de confirmation de la saisie de TOUTES les notes saisies ou modifiées
toutEnregistrerBtnAdmin.addEventListener('click', function(e){
addClass( toutEnregistrerBtnAdmin, 'loading' );
var toutesNotes = [];
var controleUID = null;
// on sélectionne toutes les valeurs contenues dans les lignes actives
for( var i = 0 ; i < saisieObjAdmin.length ; i++ ){ if( /active/.test(saisieObjAdmin[i].inputEl.className) ){
if( controleUID == null ) controleUID = saisieObjAdmin[i].ctrlid;
toutesNotes.push({
etudiant: saisieObjAdmin[i].userid,
valeur: saisieObjAdmin[i].inputEl.value.replace(',', '.') // par précaution, on replace les virgules par des points pour le php (is_numeric)
});
}}
var request = { // on définit la requête pour API
level_0: 'career',
level_1: 'saisieNoteMultiple',
controle: controleUID,
notes: toutesNotes // on donne toutes les notes
};
API.send(request, function(response){ // on gère la réponse de API
if( response.request == 'success' ) // si on a une réponse positive, on incrémente le nombre de succès
reload();
// si réponse erreur, on le signale physiquement
else makeBounce(e.target);
});
}, false);
}
}
/*******************************/
/* GESTION DE L'EXPORT DE JURY */
/*******************************/
var exportJury = document.getElementById('export_jury');
if( exportJury != null ){
exportJury.addEventListener('click', function(e){
var selectedSemestre = document.querySelector("#CONTAINER > section[name] > .p > div.partlist[name] > span[data-stre][data-year].active");
// on récupère l'année et le semestre selectionnés
var fSemestre = (selectedSemestre!=null) ? selectedSemestre.dataset.stre : null;
var fAnnee = (selectedSemestre!=null) ? selectedSemestre.dataset.year : null;
console.log(fSemestre);
console.log(fAnnee);
/* [1] On récupère la liste des groupes en question (groupManager)
===================================================================*/
/* (1) Tous les semestres */
var request1;
if( fSemestre == '*' ){
request1 = {
level_0: 'groups',
level_1: 'grouplistForYear',
annee: fAnnee,
};
}else{
request1 = {
level_0: 'groups',
level_1: 'grouplist',
semestre: fSemestre,
};
}
API.send(request1, function(answer1){
// si on a bien récupéré les étudiants
if( answer1.request == 'success' ){
console.log( answer1.grouplist );
/* [2] On génère le fichier associé (excelManager)
===================================================================*/
var request2 = {
level_0: 'excel',
level_1: 'export_jury',
grouplist: answer1.grouplist // on envoie la liste qu'on vient de récupérer
};
API.send(request2, function(answer2){
if( answer2.request == 'success' ){ // le fichier a bien été généré, on lance le téléchargement
document.location = answer2.pathfile;
reload();
}else makeBounce(e.target);
});
}else makeBounce(e.target);
});
}, false);
}
/*******************************/
/* GESTION DE L'IMPORT DE JURY */
/*******************************/
var importJury = document.querySelector('#import_jury[data-stre]');
if( importJury != null ){
importJury.addEventListener('change', function(e){
var fileInput = importJury.children[0];
var semestre = parseInt( importJury.dataset.stre );
console.log(semestre);
addClass( importJury, 'loading' );
var file = fileInput.files[0];
/* [1] IMPORTATION DU FICHIER
=======================================*/
var fd = new FormData();
fd.append('filename', 'import_jury');
fd.append('file', file, file.name);
var xhr = new XMLHttpRequest();
xhr.open('POST', 'manager/import.php', true);
xhr.onreadystatechange = function(){
if( xhr.readyState == 4 && [0, 200].indexOf(xhr.status) > -1 )
console.log('[1] IMPORT=> '+xhr.responseText);
if( xhr.responseText == 'success' ){
/* [2] LECTURE DU FICHIER
=======================================*/
var request = { level_0: 'excel', level_1: 'import_jury' };
API.send(request, function(e){
console.log('[2] PARSE=>'+e.request);
if( e.request == 'success' ){
/* [3] INTÉGRATION À LA BDD
=======================================*/
requestIntegration = { level_0: 'career', level_1: 'applyJurySemestre', jury: e.jury, semestre: semestre };
API.send( requestIntegration, function(f){
console.log('[3] INTEGRATION=>'+f.request);
if( f.request == 'success' ){
console.log('liste intégrée');
reload();
}else{
console.log('integration error');
makeBounce(e.target);
}
});
}else{
console.log('import error');
makeBounce(e.target);
}
});
}else makeBounce(e.target);
}
xhr.send(fd);
}, false);
}
/* GESTION DE PUBLICATION DES NOTES D'UN CONTRÔLE */
var publicationControles = document.querySelectorAll('#CONTAINER > section[name=allcontroles] .confirm.center.active[data-ctrl][data-publication]');
// si des boutons existent sur la page (au moins 1)
if( publicationControles.length > 0 ){
// pour chaque bouton, on créé l'évènement
for( var i = 0 ; i < publicationControles.length ; i++ ){
publicationControles[i].addEventListener('click', function(e){
// si l'élément est correct (contient les informations nécessaires)
if( e.target.dataset.hasOwnProperty('ctrl') && e.target.dataset.hasOwnProperty('publication') ){
// on prépare la requête
var request = {
level_0: 'career',
level_1: 'publicationcontrole',
controle: e.target.dataset.ctrl,
publication: (e.target.dataset.publication=='0') ? false : true
};
// on envoie la requête vers l'API
API.send(request, function(answer){
if( answer.request == 'success' ) reload();
else makeBounce(e.target);
});
}
}, false);
}
}
/*******************************/
/* GESTION DU DOSSIER ETUDIANT */
/*******************************/
var studentCase = document.querySelector('#CONTAINER > section[name=studentcase]');
if( studentCase != null ){
// liens vers les contrôles
var controleLinks = document.querySelectorAll('#CONTAINER > section[name=studentcase] td span.link.ctrl[data-ctrl]');
// pour chaque lien, on créé l'évènement qui redirige sur le contrôle
for( var i = 0 ; i < controleLinks.length ; i++ ){
controleLinks[i].addEventListener('click', function(e){
pageM.vars = ['allcontroles', 'c:'+e.target.dataset.ctrl];
reload();
}, false);
}
// liens vers les semestres
var semestreLinks = document.querySelectorAll('#CONTAINER > section[name=studentcase] .semestre_circle');
// pour chaque semestre, on créé l'évènement
for( var i = 0 ; i < semestreLinks.length ; i++ ){
semestreLinks[i].addEventListener('click', function(e){
if( e.target.getAttribute('class') == 'semestre_circle' && e.target.getAttribute('data-stre') != null ){
console.log(e.target);
pageM.vars[2] = 's:'+e.target.getAttribute('data-stre');
reload();
}
}, false);
}
}
/*******************/
/* IMPORT DE NOTES */
/*******************/
var importNotes = document.querySelectorAll('#import_notes[data-ctrl]');
if( importNotes.length > 0 ){
for( var i = 0 ; i < importNotes.length ; i++ ){
// on récupère l'input de fichier
var fileInput = importNotes[i].children[0];
fileInput.addEventListener('change', function(e){
var boutonImport = e.target.parentNode;
// on récupère le contrôle en question
var controle = boutonImport.dataset.ctrl;
console.log('controle: '+controle);
// on récupère le fichier
var file = boutonImport.children[0].files[0];
/* [1] IMPORTATION DU FICHIER
=======================================*/
var fd = new FormData();
fd.append('filename', 'import_notes');
fd.append('file', file, file.name);
var xhr = new XMLHttpRequest();
xhr.open('POST', 'manager/import.php', true);
xhr.onreadystatechange = function(){
if( xhr.readyState == 4 && [0, 200].indexOf(xhr.status) > -1 )
console.log('[1] IMPORT=> '+xhr.responseText);
if( xhr.responseText == 'success' ){
/* [2] LECTURE DU FICHIER
=======================================*/
var request = { level_0: 'excel', level_1: 'import_notes' };
API.send(request, function(e){
console.log('[2] PARSE=>'+e.request);
if( e.request == 'success' ){
/* [3] INTÉGRATION À LA BDD
=======================================*/
requestIntegration = { level_0: 'career', level_1: 'saisieNoteMultiple', controle: controle, notes: e.notes };
API.send( requestIntegration, function(f){
console.log('[3] INTEGRATION=>'+f.request);
if( f.request == 'success' ){
console.log('liste intégrée');
reload();
}else{
console.log('integration error');
makeBounce(boutonImport);
}
});
}else{
console.log('import error');
makeBounce(boutonImport);
}
});
}else makeBounce(boutonImport);
}
xhr.send(fd);
}, false);
}
}
/****************************************/
/* GESTION DE LA CAPITALISATION D'UN UE */
/****************************************/
var capitalisationUE = document.querySelectorAll('.capitalisation_ue[data-stre][data-ue][data-etu]');
// si il y en a sur la page
if( capitalisationUE.length > 0 ){
for( var i = 0 ; i < capitalisationUE.length ; i++ ){
capitalisationUE[i].addEventListener('click', function(e){
// on créé la requête
request = {
level_0: 'career',
level_1: 'capitaliser',
semestre: e.target.dataset.stre,
ue: e.target.dataset.ue,
etudiant: e.target.dataset.etu
};
// on envoie la requête
API.send(request, function(answer){
if( answer.request == 'success' ) reload();
else makeBounce(e.target);
});
}, false);
}
}
-->