Commit 9d3c5a68780d04019af061fa3af7acd554ae7610

Authored by Etienne Pallier
1 parent e961ca20
Exists in master and in 1 other branch dev

Nouveau filtre "age" sur page index des matériels (v3.7.9.57)

=> Affichage des matériels par tranche d'âge (0-5 ans, 5-10, ...)
@@ -18,5 +18,6 @@ @@ -18,5 +18,6 @@
18 </buildSpec> 18 </buildSpec>
19 <natures> 19 <natures>
20 <nature>org.eclipse.php.core.PHPNature</nature> 20 <nature>org.eclipse.php.core.PHPNature</nature>
  21 + <nature>org.eclipse.wst.jsdt.core.jsNature</nature>
21 </natures> 22 </natures>
22 </projectDescription> 23 </projectDescription>
@@ -45,18 +45,15 @@ Logiciel testé et validé sur les configurations suivantes : @@ -45,18 +45,15 @@ Logiciel testé et validé sur les configurations suivantes :
45 VERSION ACTUELLE 45 VERSION ACTUELLE
46 46
47 Date: 07/07/2020 47 Date: 07/07/2020
48 -Version: 3.7.9.56 48 +Version: 3.7.9.57
49 Author: EP 49 Author: EP
50 Commentaire: 50 Commentaire:
51 - - Materiel : technique ou/et inventoriable => trop compliqué et inutile => en fait c’est un OUX (exclusif)  
52 - => simplifier en ne gardant qu'UNE SEULE case à cocher qui s'appelle "materiel technique".  
53 - => Si cette case n'est pas cochée, le prix doit alors être supérieur à 1000E  
54 - => par contre, on garde quand même le champ ds la BD au cas où.  
55 - - Colorisation selon statut du matériel :  
56 - CREATED => bleu  
57 - VALIDATED => vert  
58 - TBA => orange  
59 - ARCHIVED => rouge 51 + - Nouveau filtre "age" sur page index des matériels : Affichage des matériels par tranche d'âge (0-5 ans, 5-10, ...)
  52 +
  53 +
  54 + - Nouvelle page web "Nouveautés" (/pages/changes)
  55 + - Changements migrés dans fichier CHANGES.txt et affichés proprement dans une nouvelle page web changes.ctp
  56 + - Nouvelle page web "Statistiques mensuelles" (/pages/stats)
60 57
61 IMPORTANT : 58 IMPORTANT :
62 - Pour connaitre la version actuelle, taper "./VERSION" 59 - Pour connaitre la version actuelle, taper "./VERSION"
@@ -94,6 +91,17 @@ La liste ci-dessous est aussi en ligne ici : https://tinyurl.com/labinvent#headi @@ -94,6 +91,17 @@ La liste ci-dessous est aussi en ligne ici : https://tinyurl.com/labinvent#headi
94 ----------------------------------------------------------------------------------------------------------- 91 -----------------------------------------------------------------------------------------------------------
95 VERSION ACTUELLE 92 VERSION ACTUELLE
96 93
  94 +07/07/2020 v3.7.9.56 (EP)
  95 + - Materiel : technique ou/et inventoriable => trop compliqué et inutile => en fait c’est un OUX (exclusif)
  96 + => simplifier en ne gardant qu'UNE SEULE case à cocher qui s'appelle "materiel technique".
  97 + => Si cette case n'est pas cochée, le prix doit alors être supérieur à 1000E
  98 + => par contre, on garde quand même le champ ds la BD au cas où.
  99 + - Colorisation selon statut du matériel :
  100 + CREATED => bleu
  101 + VALIDATED => vert
  102 + TBA => orange
  103 + ARCHIVED => rouge
  104 +
97 06/07/2020 v3.7.9.54-55 (EP) 105 06/07/2020 v3.7.9.54-55 (EP)
98 - Bugfix test SurCategories : marche maintenant sur php5 et php7 106 - Bugfix test SurCategories : marche maintenant sur php5 et php7
99 - Fichier LICENSE (AGPL) 107 - Fichier LICENSE (AGPL)
src/Controller/MaterielsController.php
@@ -8,6 +8,7 @@ use Cake\Mailer\Email; @@ -8,6 +8,7 @@ use Cake\Mailer\Email;
8 use Cake\Auth\FallbackPasswordHasher; 8 use Cake\Auth\FallbackPasswordHasher;
9 use App\Model\Entity\Materiel; 9 use App\Model\Entity\Materiel;
10 use App\Model\Entity\User; 10 use App\Model\Entity\User;
  11 +use Cake\I18n\FrozenDate;
11 12
12 //use App\Controller\DocumentsController; 13 //use App\Controller\DocumentsController;
13 //App::import('Controller', 'Documents'); 14 //App::import('Controller', 'Documents');
@@ -842,9 +843,51 @@ class MaterielsController extends AppController { @@ -842,9 +843,51 @@ class MaterielsController extends AppController {
842 ]; 843 ];
843 844
844 $config = $this->confLabinvent; 845 $config = $this->confLabinvent;
  846 +
  847 + /*
  848 + * Tranche d'age ?
  849 + *
  850 + * 5 = 0-5 ans
  851 + * 10 = 5-10 ans
  852 + * 15 = 10-15 ans
  853 + * 20 = 15-20 ans
  854 + * 21 = 20+
  855 + */
  856 + $age = $this->request->getQuery('age');
  857 + // Par défaut, TOUS les ages
  858 + if (is_null($age)) $age = 0;
  859 + if ($age>0) {
  860 + $today_year = (new FrozenDate('now'))->year;
  861 + // ex: si on est en 2020 :
  862 + // + de 20 ans => on cherche "<2000"
  863 + if ($age==21) {
  864 + $year_min = 0;
  865 + $year_max = $today_year - 20; // 2000
  866 + }
  867 + // - 20 ans
  868 + // ex: si $age = 10 et qu'on est en 2020 :
  869 + else {
  870 + $year_min = $today_year - $age; // 2010
  871 + $year_max = $year_min + 5; // 2015
  872 + }
  873 + //debug("$year_min a $year_max");
  874 + // $year_min <= year(date_acquisition) <= $year_max
  875 + //$condition['date_acquisition !='] = 'null'; // Date non nulle sinon ça plante !!!
  876 + //$condition['date_acquisition IS NOT'] = 'NULL'; // Date non nulle sinon ça plante !!!
  877 + // Pour faire NON EXCLUSIF, faire ceci :
  878 + $condition['year(date_acquisition) <='] = $year_max; // <= 2015
  879 + $condition['year(date_acquisition) >='] = $year_min; // >= 2010
  880 + /*
  881 + // Pour bien faire EXCLUSIF, faire ceci :
  882 + $condition['year(date_acquisition) <='] = $year_max; // <= 2015
  883 + $condition['year(date_acquisition) >'] = $year_min; // > 2010
  884 + */
  885 + }
  886 +
  887 + // Nb lignes par page
845 $limit = $this->request->getQuery('aff'); 888 $limit = $this->request->getQuery('aff');
846 - if ($limit === null)  
847 - $limit = $config['aff_par_defaut']; 889 + // Par défaut, nb lignes demandées dans config
  890 + if ($limit===null) $limit = $config['aff_par_defaut'];
848 891
849 $this->paginate = [ 892 $this->paginate = [
850 'limit' => $limit, 893 'limit' => $limit,
@@ -862,14 +905,17 @@ class MaterielsController extends AppController { @@ -862,14 +905,17 @@ class MaterielsController extends AppController {
862 'Materiels.numero_laboratoire' => 'desc' 905 'Materiels.numero_laboratoire' => 'desc'
863 ] 906 ]
864 ]; 907 ];
865 -  
866 - $materiels = $this->paginate($this->Materiels->find('all', [  
867 - 'conditions' => $condition  
868 - ]));  
869 - 908 +
  909 + // TOUS les materiels
870 $this->set('nbMateriels', $this->Materiels->find('all', [ 910 $this->set('nbMateriels', $this->Materiels->find('all', [
871 'conditions' => $condition 911 'conditions' => $condition
872 ])->count()); 912 ])->count());
  913 +
  914 + // Seulement le nombre de materiels demandés par paginate
  915 + //debug($condition);
  916 + $materiels = $this->paginate($this->Materiels->find('all', [
  917 + 'conditions' => $condition
  918 + ]));
873 $this->set(compact('materiels')); 919 $this->set(compact('materiels'));
874 920
875 // Pas bien..., mais pratique : 921 // Pas bien..., mais pratique :
src/Template/Materiels/index.ctp
@@ -163,18 +163,30 @@ $displayStatusButtons = function($SELECTED_STATUS, $nbMateriels, $html) { @@ -163,18 +163,30 @@ $displayStatusButtons = function($SELECTED_STATUS, $nbMateriels, $html) {
163 163
164 }; // displayStatusButtons() 164 }; // displayStatusButtons()
165 165
  166 +$displaySelectors = function($form, $request, $displayNbLinesSelector, $displayAgeSelector) {
  167 + //echo '<div>';
  168 + echo '<div class="col-lg-2 col-md-3 col-sm-4">';
  169 + echo '<table><tr>';
  170 +
  171 + echo '<td>';
  172 + $displayNbLinesSelector($form, $request);
  173 + echo '</td>';
  174 +
  175 + echo '<td>';
  176 + $displayAgeSelector($form, $request);
  177 + echo '</td>';
  178 +
  179 + echo '</tr></table>';
  180 + echo '</div>';
  181 +};
166 182
167 $displayNbLinesSelector = function($form, $request) { 183 $displayNbLinesSelector = function($form, $request) {
168 - echo '<div class="col-lg-2 col-md-3 col-sm-4">'; 184 + //echo '<div class="col-lg-2 col-md-3 col-sm-4">';
169 //echo $this->Form->create('materiels', [ 185 //echo $this->Form->create('materiels', [
170 - echo $form->create('materiels', [  
171 - //'url' => '/materiels/execActions?page=' . $this->request->getQuery('page')  
172 - 'url' => '/materiels/execActions?page=' . $request->getQuery('page')  
173 - ]);  
174 // echo $this->Form->create('materiels', ['url' => '/materiels/execActions?page=index']); 186 // echo $this->Form->create('materiels', ['url' => '/materiels/execActions?page=index']);
175 //echo $this->Form->control('aff_par_defaut', [ 187 //echo $this->Form->control('aff_par_defaut', [
176 echo $form->control('aff_par_defaut', [ 188 echo $form->control('aff_par_defaut', [
177 - 'label' => 'Afficher', 189 + 'label' => 'Nombre lignes',
178 'options' => [ 190 'options' => [
179 '20' => 20, 191 '20' => 20,
180 '30' => 30, 192 '30' => 30,
@@ -184,10 +196,28 @@ $displayNbLinesSelector = function($form, $request) { @@ -184,10 +196,28 @@ $displayNbLinesSelector = function($form, $request) {
184 '200' => 200 196 '200' => 200
185 ] 197 ]
186 ]); 198 ]);
187 - echo '</div>'; 199 + //echo '</div>';
188 }; // displayNbLinesSelector() 200 }; // displayNbLinesSelector()
189 201
190 202
  203 +$displayAgeSelector = function($form, $request) {
  204 + //echo '<div class="col-lg-2 col-md-3 col-sm-4">';
  205 + echo $form->control('age_selector', [
  206 + 'label' => 'Age',
  207 + 'options' => [
  208 + '0' => 'Tous',
  209 + '5' => '0-5 ans',
  210 + '10' => '5-10 ans',
  211 + '15' => '10-15 ans',
  212 + '20' => '15-20 ans',
  213 + '21' => '+ 20 ans',
  214 + ]
  215 + ]);
  216 + //echo '</div>';
  217 +}; // displayNbLinesSelector()
  218 +
  219 +
  220 +
191 $displayActionButtonsForSelectedOrAllElements = function($form, $SELECTED_STATUS, $USER_IS_RESPONSABLE, $USER_IS_ADMIN_OR_MORE, $USER_IS_SUPERADMIN) { 221 $displayActionButtonsForSelectedOrAllElements = function($form, $SELECTED_STATUS, $USER_IS_RESPONSABLE, $USER_IS_ADMIN_OR_MORE, $USER_IS_SUPERADMIN) {
192 222
193 //if (isset($SELECTED_STATUS)) { 223 //if (isset($SELECTED_STATUS)) {
@@ -440,12 +470,19 @@ if ($USER_IS_ADMIN_OR_MORE) $displayStatusButtons($SELECTED_STATUS, $nbMateriels @@ -440,12 +470,19 @@ if ($USER_IS_ADMIN_OR_MORE) $displayStatusButtons($SELECTED_STATUS, $nbMateriels
440 //</div> 470 //</div>
441 471
442 472
443 -// <!-- SELECTEUR NOMBRE LIGNES PAR PAGE -->  
444 -$displayNbLinesSelector($this->Form, $this->request); 473 +// <!-- SELECTEURS : NOMBRE LIGNES PAR PAGE et AGE -->
  474 +$displaySelectors($this->Form, $this->request, $displayNbLinesSelector, $displayAgeSelector);
  475 +//$displayNbLinesSelector($this->Form, $this->request);
  476 +
  477 +
  478 +echo $this->Form->create('materiels', [
  479 + 'url' => '/materiels/execActions?page=' . $this->request->getQuery('page')
  480 +]);
  481 +
445 482
446 // <!-- AFFICHAGE DES MATERIELS --> 483 // <!-- AFFICHAGE DES MATERIELS -->
447 -if ($nbMateriels == 0)  
448 - echo 'Aucun matériel'; 484 +
  485 +if ($nbMateriels == 0) echo 'Aucun matériel';
449 486
450 else { 487 else {
451 // $form2 = $this->Form; 488 // $form2 = $this->Form;
@@ -618,11 +655,13 @@ $(document).ready(function () { @@ -618,11 +655,13 @@ $(document).ready(function () {
618 var urlDecoupeeBis = new Array(); 655 var urlDecoupeeBis = new Array();
619 var param = 0; 656 var param = 0;
620 var bool = false; 657 var bool = false;
  658 + //console.log(nbr);
621 659
622 for(i=0; i<urlDecoupee.length; ++i) { 660 for(i=0; i<urlDecoupee.length; ++i) {
623 urlDecoupeeBis[i] = urlDecoupee[i].split("="); // On sépare les parametres de leurs valeurs 661 urlDecoupeeBis[i] = urlDecoupee[i].split("="); // On sépare les parametres de leurs valeurs
624 for(j=0; j<urlDecoupeeBis[i].length; ++j){ 662 for(j=0; j<urlDecoupeeBis[i].length; ++j){
625 if(urlDecoupeeBis[i][0] == "aff" || urlDecoupeeBis[i][0] == "?aff") { 663 if(urlDecoupeeBis[i][0] == "aff" || urlDecoupeeBis[i][0] == "?aff") {
  664 + //console.info('toto');
626 bool = true; 665 bool = true;
627 param = i; // Si le parametre "aff" est trouvé, on le récupère 666 param = i; // Si le parametre "aff" est trouvé, on le récupère
628 break; 667 break;
@@ -630,7 +669,8 @@ $(document).ready(function () { @@ -630,7 +669,8 @@ $(document).ready(function () {
630 } 669 }
631 } 670 }
632 671
633 - if(bool) { // Si le parametre recherche a ete trouve, ... 672 + if(bool) { // Si le parametre recherché a ete trouvé, ...
  673 + //console.log("coucouT");
634 urlDecoupeeBis[param][1] = nbr; //urlDecoupeeBis[i][0] c'est le nom du parametre, et urlDecoupeeBis[i][1] c'est la valeur associée 674 urlDecoupeeBis[param][1] = nbr; //urlDecoupeeBis[i][0] c'est le nom du parametre, et urlDecoupeeBis[i][1] c'est la valeur associée
635 var url = ""; 675 var url = "";
636 for(i=0; i<urlDecoupee.length; ++i) { //... on reconstruit une url propre ... 676 for(i=0; i<urlDecoupee.length; ++i) { //... on reconstruit une url propre ...
@@ -648,6 +688,49 @@ $(document).ready(function () { @@ -648,6 +688,49 @@ $(document).ready(function () {
648 }); 688 });
649 }); 689 });
650 690
  691 +
  692 +$(document).ready(function () {
  693 + $("#age-selector").bind("change", function (event) {
  694 + var nbr=$("#age-selector :selected").val();
  695 + var urlDeBase = window.location.href.split("?");
  696 + var urlDecoupee = window.location.search.split("&"), i, j; // On sépare la chaine des paramètres en fonction du &
  697 + var urlDecoupeeBis = new Array();
  698 + var param = 0;
  699 + var bool = false;
  700 + //console.log(nbr);
  701 +
  702 + for(i=0; i<urlDecoupee.length; ++i) {
  703 + urlDecoupeeBis[i] = urlDecoupee[i].split("="); // On sépare les parametres de leurs valeurs
  704 + for(j=0; j<urlDecoupeeBis[i].length; ++j){
  705 + if(urlDecoupeeBis[i][0] == "age" || urlDecoupeeBis[i][0] == "?age") {
  706 + //console.info('toto');
  707 + bool = true;
  708 + param = i; // Si le parametre "age" est trouvé, on le récupère
  709 + break;
  710 + }
  711 + }
  712 + }
  713 +
  714 + if(bool) { // Si le parametre recherché a ete trouvé, ...
  715 + //console.log("coucouT");
  716 + urlDecoupeeBis[param][1] = nbr; //urlDecoupeeBis[i][0] c'est le nom du parametre, et urlDecoupeeBis[i][1] c'est la valeur associée
  717 + var url = "";
  718 + for(i=0; i<urlDecoupee.length; ++i) { //... on reconstruit une url propre ...
  719 + if(/^\?[a-zA-A0-9]*/.test(urlDecoupeeBis[0][0])) {
  720 + if(i!=0) url += "&";
  721 + // Sauf pour le 1er parametre, qui lui commence par un "?"
  722 + } else url += "&";
  723 + url += urlDecoupeeBis[i][0]+"="+urlDecoupeeBis[i][1];
  724 + // On reforme les parametres "&nom=valeur" en les concatenant
  725 + }
  726 + window.location.href = urlDeBase[0]+url; // ... et on fait la redirection
  727 + } else if(urlDecoupee[0]=="") window.location.href = window.location.href + '?age=' + nbr; // Sinon on ajoute juste le parametre en fin d'url
  728 + else window.location.href = window.location.href + '&age=' + nbr;
  729 +
  730 + });
  731 +});
  732 +
  733 +
651 // Pour lire l'url et actualiser l'option sélectionnée 734 // Pour lire l'url et actualiser l'option sélectionnée
652 $(document).ready(function () { 735 $(document).ready(function () {
653 var affichage = parseInt($_GET('aff')); 736 var affichage = parseInt($_GET('aff'));
@@ -677,6 +760,38 @@ $(document).ready(function () { @@ -677,6 +760,38 @@ $(document).ready(function () {
677 } 760 }
678 }); 761 });
679 762
  763 +
  764 +//Pour lire l'url et actualiser l'option sélectionnée
  765 +$(document).ready(function () {
  766 + var affichage = parseInt($_GET('age'));
  767 + switch(affichage) {
  768 + case 0 :
  769 + document.getElementById('age-selector').selectedIndex = 0;
  770 + break;
  771 + case 5 :
  772 + document.getElementById('age-selector').selectedIndex = 1;
  773 + break;
  774 + case 10 :
  775 + document.getElementById('age-selector').selectedIndex = 2;
  776 + break;
  777 + case 15 :
  778 + document.getElementById('age-selector').selectedIndex = 3;
  779 + break;
  780 + case 20 :
  781 + document.getElementById('age-selector').selectedIndex = 4;
  782 + break;
  783 + case 21 :
  784 + document.getElementById('age-selector').selectedIndex = 5;
  785 + break;
  786 + default : // Par défaut, lorsque le parametre "aff" n'existe pas, au premier affichage
  787 + $("#age-selector").val(0);
  788 + // On récupère la valeur dans la BD directement, mais en PHP, faut pas déconner
  789 + break;
  790 + }
  791 +});
  792 +
  793 +
  794 +
680 // La fonction suivante permet de recuperer les parametres d’une URL 795 // La fonction suivante permet de recuperer les parametres d’une URL
681 function $_GET(param) { 796 function $_GET(param) {
682 var vars = {}; 797 var vars = {};