diff --git a/API.js b/API.js
index 4111cce..a272c54 100755
--- a/API.js
+++ b/API.js
@@ -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 */
diff --git a/css/layout.css b/css/layout.css
index b7204fb..ef8cc85 100755
--- a/css/layout.css
+++ b/css/layout.css
@@ -62,31 +62,6 @@ body{
}
-#LOADER{
- /* position */
- display: block;
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 2px;
-
- /* background */
- background-color: #22d135;
-
- /* z axis */
- z-index: 100;
-
-
- /* animation */
- transition: all .2s ease-in-out;
- -moz-transition: all .2s ease-in-out;
- -webkit-transition: all .2s ease-in-out;
- -ms-transition: all .2s ease-in-out;
- -o-transition: all .2s ease-in-out;
-}
-
-
#WRAPPER{
/* position */
display: block;
diff --git a/index.php b/index.php
index dd4e940..885b2c4 100755
--- a/index.php
+++ b/index.php
@@ -28,25 +28,14 @@ $notifNotifNum = 5;
-
-
-
-
+
+
+
+
- ";
- echo "";
- echo "";
- }
- ?>
-
-
-
-
diff --git a/js/actionScript.js b/js/actionScript.js
index 02201f8..3114da1 100755
--- a/js/actionScript.js
+++ b/js/actionScript.js
@@ -30,9 +30,8 @@
/* [0] VARIABLES
==============================================================*/
-/* Loader */
-var l = Loader.prototype.getInstance( document.getElementById('LOADER') );
-
+/* shortcut-manager */
+var sm = new ShortcutManager();
/* pageManager */
var pageM;
@@ -203,7 +202,7 @@ var connected = !( DOM.AUTH.children[0].innerHTML == 'Connexion' );
// si la subSection est une string, on essaie de trouver l'élémnent associé
if( typeof subSection == 'string' )
- subSection = document.querySelector('#HEADER > nav.subsection > span[data-sectname='+subSection+']');
+ subSection = document.querySelector('#HEADER > nav.subsections > span[data-sectname='+subSection+']');
// si @subSection est un de type HGROUP [ET]
if( subSection instanceof Element && subSection.tagName == 'SPAN' && subSection.dataset.hasOwnProperty('sectname') ){
@@ -365,25 +364,76 @@ initForm( // initialisation du formulaire de connection
*
* ctrl+alt+n ouvre les notifications
*
-* ctrl+alt+l ouvre l'interface de connection/déconnection
-*
-*
+* ctrl+alt+e ouvre l'interface de connection/déconnection
*
+* ctrl+NUM ouvre la section numéro "NUM"
*
+* ctrl+droite ouvre la sous-section suivante
+*
+* ctrl+gauche ouvre la sous-section précédente
*
*
*
*
*/
-// Shortcut('ctrl+alt+n', function(){
-// pageM.vars[0] = 'notifications';
-// selectSection( document.querySelector('#MENU > span[data-link=home]') );
-// });
+sm.append('ctrl+alt+n', function(){
+ pageM.vars[0] = 'notifications';
+ selectSection( document.querySelector('#MENU > span[data-link=home]') );
+});
-Shortcut('ctrl+alt+e', function(){
+sm.append('ctrl+alt+e', function(){
addClass(DOM.WRAPPER, 'blurred');
});
+sm.append('ctrl+1', function(){
+ selectSection( document.querySelector('#MENU span[data-link]:nth-child(2)') );
+});
+
+sm.append('ctrl+2', function(){
+ selectSection( document.querySelector('#MENU span[data-link]:nth-child(3)') );
+});
+
+sm.append('ctrl+3', function(){
+ selectSection( document.querySelector('#MENU span[data-link]:nth-child(4)') );
+});
+
+sm.append('ctrl+4', function(){
+ selectSection( document.querySelector('#MENU span[data-link]:nth-child(5)') );
+});
+
+sm.append('ctrl+5', function(){
+ selectSection( document.querySelector('#MENU span[data-link]:nth-child(6)') );
+});
+
+sm.append('ctrl+right', function(){
+ // on récupère la sous-section courante
+ var cSubSection = document.querySelector('#HEADER > nav.subsections > span[data-sectname='+pageM.vars[0]+']');
+ if( cSubSection != null ){ // si on a trouvé la sous-section
+ var parentChildren = cSubSection.parentNode.children;
+ var nextIndex = parentChildren.indexOf( cSubSection ) + 1;
+
+ // si il y a une section après, on la charge
+ if( nextIndex < parentChildren.length )
+ selectSubSection( parentChildren[nextIndex] );
+ }
+});
+
+sm.append('ctrl+left', function(){
+ // on récupère la sous-section courante
+ var cSubSection = document.querySelector('#HEADER > nav.subsections > span[data-sectname='+pageM.vars[0]+']');
+ if( cSubSection != null ){ // si on a trouvé la sous-section
+ var parentChildren = cSubSection.parentNode.children;
+ var prevIndex = parentChildren.indexOf( cSubSection ) - 1;
+
+ // si il y a une section avant, on la charge
+ if( prevIndex >= 0 )
+ selectSubSection( parentChildren[prevIndex] );
+ }
+});
+
+// on active les raccourcis
+sm.listen();
+
/* [6] GESTION DES LIENS SPÉCIFIQUES
==============================================================*/
diff --git a/js/adjust.js b/js/adjust.js
new file mode 100644
index 0000000..81f3a9b
--- /dev/null
+++ b/js/adjust.js
@@ -0,0 +1,9 @@
+// on définit le "indexOf" pour et
+NodeList.prototype.indexOf = HTMLCollection.prototype.indexOf = function(searchedElement){
+ for( var i = 0 ; i < this.length ; i++ ) // on parcours la collection
+ // si on trouve l'élement, on retourne son rang
+ if( this[i] == searchedElement ) return i;
+
+ // si on a rien trouvé, on retourne -1
+ return -1;
+};
\ No newline at end of file
diff --git a/js/loader.js b/js/loader.js
deleted file mode 100755
index e0eb97e..0000000
--- a/js/loader.js
+++ /dev/null
@@ -1,20 +0,0 @@
-function Loader(element){ this.element = element; };
-
-Loader.prototype = {
- instance: null, // instance Singleton
- element: this.element, // contiendra l'élément loader
- value: 0, // contiendra le pourcentage de chargement
-
- update: function(){ this.value = (this.value>=100)?100:this.value; this.element.style.width = this.value+'%'; },
-
- start: function(){ this.value = 0; this.update(); },
- inc: function(v){ this.value += (v)?v:10; this.update(); },
- stop: function(){ this.value = 100; this.update(); },
-
- getInstance: function(element){
- if( Loader.prototype.instance == null ) Loader.prototype.instance = new Loader(element);
-
- return Loader.prototype.instance;
- }
-
-};
diff --git a/js/shortcut-manager.js b/js/shortcut-manager.js
new file mode 100755
index 0000000..b77923e
--- /dev/null
+++ b/js/shortcut-manager.js
@@ -0,0 +1,126 @@
+/**************/
+/* PRÉ-REQUIS */
+/**************/
+/* Retourne le keyCode correspondant à la chaîne donnée
+*
+* @param str enchaînement de touches sous forme de string
+*
+*
+* return keyCode le code de la touche correspondante
+
+*/
+function strToKeyCode(keyString){
+ // on enregistre le keyCode du premier caractère
+ var keyCode = keyString.toUpperCase().charCodeAt(0);
+
+ // s'il s'agit d'un caractère uniquement (entre "a" et "z" ou entre "0" et "9")
+ if( keyString.length == 1 && ((keyCode >= 65 && keyCode <= 90) || (keyCode >= 49 && keyCode <= 57)) )
+ return keyCode; // on retourne le keyCode associé
+ else
+ switch( keyString ){ // sinon, on récupère l'ascii spécifiquement
+ case 'ctrl': return 17; break;
+ case 'maj': return 16; break;
+ case 'alt': return 18; break;
+ case 'tab': return 9; break;
+ case 'left': return 37; break;
+ case 'top': return 38; break;
+ case 'right': return 39; break;
+ case 'down': return 40; break;
+ }
+
+ return null;
+}
+
+
+
+
+
+
+
+/**********/
+/* CLASSE */
+/**********/
+function ShortcutManager(){};
+
+ShortcutManager.prototype = {
+ shortcuts: [], // contiendra tous les raccourcis
+ progress: [], // contiendra l'avancée des raccourcis
+ handlers: [], // contiendra tous les handlers (fonctions à éxécuter)
+ /* tmp */
+ lastKeyCode: [], // contiendra des "reminder" pour les évènements
+
+ /* ajout d'un nouveau raccourcis clavier */
+ append: function(keyRow, handler){
+ /* [1] On découpe la chaîne (en minuscule) par "+"
+ =======================================================*/
+ var keyStore = keyRow.toLowerCase().split('+');
+
+ /* [2] On récupère les keyCodes correspondant aux codes/lettres
+ =======================================================*/
+ for( var i = 0 ; i < keyStore.length ; i++ ){
+ keyStore[i] = strToKeyCode( keyStore[i] );
+
+ // si on a une erreur, on retourne NULL
+ if( keyStore[i] == null ) return null;
+ }
+
+ /* [3] On enregistre dans l'objet (shortcuts, progress, handler)
+ =======================================================*/
+ var index = this.shortcuts.push( keyStore ) - 1;
+ this.progress[index] = 0; // le progrès est l'index d'avancement
+ this.handlers[index] = handler; // handler (function qui s'éxécutera lors de l'activation)
+ this.lastKeyCode[index] = null; //
+ },
+
+
+
+ /* remet à zéro tous les progrès */
+ resetProgress: function(keyCode){
+ for( var i = 0 ; i < this.progress.length ; i++ )
+ if( this.lastKeyCode[i] != keyCode )
+ this.progress[i] = 0;
+ },
+
+
+ /* démarre l'écoute (active les évènements) */
+ listen: function(){
+
+ /* [1] On créé l'évènement d'appui de touche pour chaque élément
+ =======================================================*/
+ var pointer = this;
+
+ // on initialise/créer l'évènement
+ window.addEventListener('keydown', function(e){
+
+ for( var i = 0 ; i < pointer.shortcuts.length ; i++ ){
+
+ // si on a la bonne touche, on incrémente l'avancement / sinon si on c'est une touche différente, on remet à 0
+ if( e.keyCode == pointer.shortcuts[i][pointer.progress[i]] )
+ pointer.progress[i] += 1;
+ else if( e.keyCode != pointer.lastKeyCode[i] )
+ pointer.progress[i] = 0;
+
+ pointer.lastKeyCode[i] == e.keyCode;
+
+ // si on a terminé la combinaison de touches, on remet le compteur à 0 + on exécute le handler
+ if( pointer.progress[i] == pointer.shortcuts[i].length ){
+ pointer.progress[i] = 0;
+ pointer.handlers[i](e);
+ }
+
+ }
+
+ }, false);
+
+
+
+
+ // si on lâche une touche, on remet à zéro
+ window.addEventListener('keyup', function(e){
+ pointer.resetProgress( e.keyCode );
+ }, false);
+ }
+};
+
+
+
diff --git a/js/shortcut.js b/js/shortcut.js
deleted file mode 100755
index 99bfbdc..0000000
--- a/js/shortcut.js
+++ /dev/null
@@ -1,146 +0,0 @@
-/* Retourne le keyCode correspondant à la chaîne
-*
-* @param keyStore enchaînement de touches sous forme de string
-* @param handler function qui s'éxécute lors du raccourci
-*
-* return keyCode le code de la touche correspondante
-*/
-function strToKeyCode(str){
- // on enregistre le keyCode du premier caractère
- var keyCode = str.toUpperCase().charCodeAt(0);
-
- // s'il s'agit d'un caractère uniquement (entre "a" et "z")
- if( str.length == 1 && keyCode >= 65 && keyCode <= 90 )
- return keyCode; // on retourne le keyCode associé
- else
- switch( str ){
- case 'ctrl': return 17; break;
- case 'maj': return 16; break;
- case 'alt': return 18; break;
- case 'tab': return 9; break;
- }
-
- return null;
-}
-
-
-
-
-var shortcutList = []; // contient les combinaisons de touches
-var shortcutStep = []; // contient l'avancée d'un raccourcis
-
-/* Gestion des raccourcis claviers
-*
-* @param keyStore enchaînement de touches sous forme de string
-* @param handler function qui s'éxécute lors du raccourci
-*
-*/
-function Shortcut(keyStore, handler){
-
- var splittedString = keyStore.toLowerCase().split('+'), // découpe la chaîne (en minuscule) par "+"
- splittedKeyCode = new Array(); // contiendra les keyCode de chaque touche
-
-
- // pour chaque touche, on récupère le keyCode
- for( var i = 0 ; i < splittedString.length ; i++ )
- splittedKeyCode[i] = strToKeyCode( splittedString[i] ); // on enregistre le keyCode correspondant
-
-
- // on ajout à la liste globale
- eventIndex = shortcutList.length;
- shortcutList.push( splittedKeyCode );
-
- // on initialise l'avancement
- shortcutStep[eventIndex] = 0;
-
-
-
- // creation de la fonction d'évènement
- shortcutList[eventIndex].push( function(e, k, f, h){ /* k ; f ; h */
- // console.log(f);
- // on cherche l'avancée
- var step = shortcutStep[f];
-
- // on regarde si la touche est bonne
- if( shortcutList[f][step] == k ){ // si c'est la touche suivante
-
- if( step >= shortcutList[f].length-2 ){ // si c'était la dernière touche
-
- // on initialise le tableau
- for( var i = 0 ; i < shortcutStep[f].length ; i++ )
- shortcutStep[f][i] = 0;
-
- // console.log('ok');
- e.preventDefault();
- h(); // EXECUTION DE : handler();
-
- }else // sinon on incrémente l'avancée
- shortcutStep[f]++;
-
- }else // si c'est pas la bonne touche, on réinitialise le tableau
- shortcutStep[f] = 0;
-
- });
-
- // création de l'évènement
- window.addEventListener(
- 'keydown',
- function(e){ shortcutList[eventIndex][shortcutList[eventIndex].length-1](e, e.keyCode, eventIndex, handler); },
- false
- );
-
-}
-
-/* quand on lâche une touche, tout les raccourcis s'effacent */
-window.addEventListener('keyup', function(){
- for( var i = 0 ; i < shortcutStep.length ; i++ )
- shortcutStep[i] = 0;
-}, false);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-/*** UTILISATION ***/
-
-// Shortcut(
-// 'ctrl+s',
-// function(){ alert('sauvegardé'); }
-// );
-//
\ No newline at end of file
diff --git a/manager/database.php b/manager/database.php
index a635afa..efca747 100755
--- a/manager/database.php
+++ b/manager/database.php
@@ -929,6 +929,9 @@ class DataBase{
/***********************************************************/
public function getNotesForControleEnseignant($enseignant, $annee, $controle, $groupe=null){ // [OPTIONNEL] $groupe
+ // on vérifie que le semestre existe et que l'enseignant y enseigne
+ if( !($enseignantUID=userRepo::UID($enseignant)) ) return 'unknown_teacher';
+
// on récupère les informations du contrôle
if( !($controlObj=controleRepo::info($controle, $enseignant, $groupe)) ) return 'unknown_controle';
@@ -971,9 +974,6 @@ class DataBase{
/*******************************************/
public function getNotesForControle($annee, $controle, $groupe=null){ // [OPTIONNEL] $groupe
- // on vérifie que le semestre existe et que l'enseignant y enseigne
- if( !($enseignantUID=userRepo::UID($enseignant)) ) return 'unknown_teacher';
-
// on récupère les informations du contrôle
if( ! ($controlObj=controleRepo::info($controle)) ) return 'unknown_controle';
@@ -997,7 +997,6 @@ class DataBase{
=======================================*/
}else{
$controlObj['grouplist'] = groupRepo::forControle($controle);
- var_dump( $controlObj['grouplist'] );
foreach($controlObj['grouplist'] as $iter=>$grpe)
if( $controleNotes = noteRepo::forGroupe($controle, $grpe['id_groupe']) ) // si le groupe a des notes, on les ajoutes
diff --git a/manager/repo/note.php b/manager/repo/note.php
index 9e25fef..5fe6472 100755
--- a/manager/repo/note.php
+++ b/manager/repo/note.php
@@ -76,6 +76,7 @@ class noteRepo extends DBAccess{
AND mcc_ue.id_mcc_ue = mcc_m.id_mcc_ue
AND mcc_m.id_mcc_module = ctrl.id_mcc_module
AND n.id_controle = ctrl.id_controle
+ AND n.id_note in (SELECT max(id_note) FROM note GROUP BY id_controle, id_appartenance)
AND app.id_etudiant = :etudiant
AND ctrl.id_controle = :controle
@@ -175,6 +176,8 @@ class noteRepo extends DBAccess{
AND mcc_ue.id_mcc_ue = mcc_m.id_mcc_ue
AND mcc_m.id_mcc_module = ctrl.id_mcc_module
AND n.id_controle = ctrl.id_controle
+
+ AND n.id_note in (SELECT max(id_note) FROM note GROUP BY id_controle, id_appartenance)
AND ctrl.id_controle = :controle
AND app.id_groupe = :groupe
@@ -202,6 +205,7 @@ class noteRepo extends DBAccess{
FROM controle as ctrl, note as n
WHERE ctrl.id_controle = n.id_controle
AND ctrl.id_controle = :controle
+ AND n.id_note in (SELECT max(id_note) FROM note GROUP BY id_controle, id_appartenance)
GROUP BY ctrl.id_controle");
$getMoyenne->execute(array( ':controle' => $controle ));
@@ -235,6 +239,7 @@ class noteRepo extends DBAccess{
AND app.id_etudiant = :etudiant
AND mcc_m.id_module = :module
AND app.id_semestre = :semestre
+ AND note.id_note in (SELECT max(id_note) FROM note GROUP BY id_controle, id_appartenance)
GROUP BY mcc_m.id_mcc_module");
$getMoyenneModule->execute(array( ':etudiant' => $etudiant, ':module' => $module, ':semestre' => $semestre ));
@@ -258,7 +263,8 @@ class noteRepo extends DBAccess{
public static function creer($etudiant, $controle, $semestre, $valeur){
/* [1] Premier cas : il faut créer la note de cet étudiant pour ce contrôle
============================================================================*/
- if( !($noteUID=noteRepo::UID($etudiant, $controle)) ){
+ /* [MAJ] On créé toujours une note, même si une existe déjà afin de garder toutes les modifications */
+ if( true ){ // !($noteUID=noteRepo::UID($etudiant, $controle))
$creationNote = DataBase::getPDO()->prepare("INSERT INTO note(id_note, id_appartenance, id_controle, valeur)
VALUES(
@@ -281,15 +287,15 @@ class noteRepo extends DBAccess{
/* [3] On vérifie que la note a bien été créé pour cet étudiant et ce contrôle
=================================================================================*/
- if( !($noteUID=noteRepo::UID($etudiant, $controle)) ) return false;
-
+ $verifNote = DataBase::getPDO()->prepare("SELECT n.id_note as id
+ FROM note as n, appartenance as app
+ WHERE n.id_appartenance = app.id_appartenance
+ AND app.id_etudiant = :etudiant
+ AND n.id_controle = :controle
+ AND n.valeur = :valeur");
+ $verifNote->execute(array( ':etudiant' => $etudiant, ':controle' => $controle, ':valeur' => $valeur ));
- /* [4] On vérifie que la note créée a bien la valeur qu'on a attribuée
- =================================================================================*/
- $verificationValeur = DataBase::getPDO()->prepare("SELECT valeur FROM note WHERE id_note = :noteUID");
- $verificationValeur->execute(array( ':noteUID' => $noteUID ));
-
- return ( $verificationValeur->fetch()['valeur'] == $valeur );
+ return is_array( $verifNote->fetch() );
}
@@ -319,7 +325,8 @@ class noteRepo extends DBAccess{
/* [1] Premier cas : il faut créer la note de cet étudiant pour ce contrôle
============================================================================*/
- if( !($noteUID=noteRepo::UID($cEtudiant, $controle)) ){
+ /* [MAJ] On créé toujours une note, même si une existe déjà afin de garder toutes les modifications */
+ if( true ){ // !($noteUID=noteRepo::UID($cEtudiant, $controle))
$creationNote = DataBase::getPDO()->prepare("INSERT INTO note(id_note, id_appartenance, id_controle, valeur)
VALUES(
diff --git a/page/modules.php b/page/modules.php
index 9c74d6f..8f86bc2 100755
--- a/page/modules.php
+++ b/page/modules.php
@@ -95,10 +95,10 @@ if( permission('student') ){ // si l'utilisateur est connecté et que c'est un
echo '';
foreach($UE['modules'] as $MODULE){
echo '
';
- echo '
'.$MODULE['nom'].' - '.$MODULE['libelle'].'
';
- echo '
Coefficient '.$MODULE['coefficient'].'
';
- echo '
'.$UE['nom'].' - '.$UE['libelle'].'
';
- echo '
Coefficient '.$UE['coefficient'].'
';
+ echo "
".$MODULE['nom']." - ".$MODULE['libelle']."
";
+ echo "
Coefficient ".$MODULE['coefficient']."
";
+ echo "
".$UE['nom']." - ".$UE['libelle']."
";
+ echo "
Coefficient ".$UE['coefficient']."
";
echo '
';
}
@@ -261,10 +261,10 @@ if( permission('teacher') ){ // si l'utilisateur est un prof
echo '';
foreach($UE['modules'] as $MODULE){
echo '
';
- echo '
'.$MODULE['nom'].' - '.$MODULE['libelle'].'
';
- echo '
Coefficient '.$MODULE['coefficient'].'
';
- echo '
'.$UE['nom'].' - '.$UE['libelle'].'
';
- echo '
Coefficient '.$UE['coefficient'].'
';
+ echo "
".$MODULE['nom']." - ".$MODULE['libelle']."
";
+ echo "
Coefficient ".$MODULE['coefficient']."
";
+ echo "
".$UE['nom']." - ".$UE['libelle']."
";
+ echo "
Coefficient ".$UE['coefficient']."
";
echo '
';
}
@@ -440,10 +440,10 @@ if( permission('master') || permission('admin') ){ // si l'utilisateur est un ad
echo '';
foreach($UE['modules'] as $MODULE){
echo '