From b24b81866bc517ca89e7999944ec05d9727a3626 Mon Sep 17 00:00:00 2001 From: xdrm-brackets Date: Wed, 2 Dec 2015 20:12:34 +0100 Subject: [PATCH] =?UTF-8?q?Ajout=20des=20raccourcis=20clavier=20et=20suppr?= =?UTF-8?q?ession=20de=20donn=C3=A9es=20inutiles=20(loader+php=20vars=20da?= =?UTF-8?q?ns=20)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- API.js | 2 +- css/layout.css | 25 ------- index.php | 19 ++---- js/actionScript.js | 74 +++++++++++++++++---- js/adjust.js | 9 +++ js/loader.js | 20 ------ js/shortcut-manager.js | 126 +++++++++++++++++++++++++++++++++++ js/shortcut.js | 146 ----------------------------------------- manager/database.php | 7 +- manager/repo/note.php | 27 +++++--- page/modules.php | 24 +++---- 11 files changed, 234 insertions(+), 245 deletions(-) create mode 100644 js/adjust.js delete mode 100755 js/loader.js create mode 100755 js/shortcut-manager.js delete mode 100755 js/shortcut.js 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 ''; - 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 ''; }