Commit bbc46c5117b99175d31d6e6ce18b5f1e54cd4d77

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

Nouveau filtre dans la liste des matériels (index) => par "projet"

Mais aussi : Enorme refactorisation de tous les filtres (nb lignes, age,
domaine, projet) de la page index (liste des matériels) => une fonction
unique

v3.7.9.100
CHANGES.txt
... ... @@ -13,11 +13,13 @@ CHANGEMENTS
13 13  
14 14  
15 15 -------
16   -10/09/2020 NEWS#3 :
  16 +11/09/2020 NEWS#3 :
17 17  
18 18 - Nouvelle entité "Projet", à laquelle un matériel peut (ou pas) être associé
19 19  
20   -- Nouveau format étiquette 19mm avec QrCode pour la nouvelle étiqueteuse (Dymo MobileLabeler)
  20 +- Nouveau filtre de la liste des matériels (index) => par "Projet"
  21 +
  22 +- Nouveau format étiquette 19mm "avec le QrCode" pour la nouvelle étiqueteuse (Dymo MobileLabeler)
21 23  
22 24  
23 25 -------
... ... @@ -85,6 +87,11 @@ Outre ces changements, voici d'autres changements importants :
85 87 ======= CHANGES =======
86 88  
87 89 -------
  90 +11/09/2020 v3.7.9.100 (EP)
  91 + - (e) Nouveau filtre de la liste des matériels (index) => par "projet"
  92 + - (i) Enorme refactorisation de tous les filtres (nb lignes, age, domaine, projet) de la page index (liste des matériels)
  93 +
  94 +-------
88 95 10-11/09/2020 v3.7.9.97-99 (EP)
89 96 - (e) Ajout de l'entité (table) "Projet", à laquelle un matériel peut (ou pas) être associé
90 97 - (b) Enorme bugfix sur le numéro d'inventaire qui se régénérait à chaque modif du matériel !!!
... ...
README.md
... ... @@ -43,7 +43,7 @@ Logiciel testé et validé sur les configurations suivantes :
43 43 --------------------------------------------------------------------------------------------
44 44  
45 45 Date: 11/09/2020
46   -Version: 3.7.9.99
  46 +Version: 3.7.9.100
47 47  
48 48  
49 49 HISTORIQUE DES CHANGEMENTS DE VERSION : voir le fichier CHANGES.txt (ou la page web /pages/changes)
... ...
src/Controller/MaterielsController.php
... ... @@ -913,22 +913,28 @@ class MaterielsController extends AppController {
913 913 }
914 914 */
915 915  
916   -
917 916 // - FILTRE Domaine ?
918   - $domain_id = $this->request->getQuery('domain');
  917 + $domaine_id = $this->request->getQuery('domaine');
919 918 // Par défaut, TOUS les domaines (id=0)
920   - if (is_null($domain_id)) $domain_id = 0;
  919 + if (is_null($domaine_id)) $domaine_id = 0;
921 920 // Si $domain_id==0 on ne fait rien (car on prend TOUS les domaines)
922   - if ($domain_id > 0)
  921 + if ($domaine_id > 0)
923 922 // OK
924   - $conditions['Materiels.sur_categorie_id'] = $domain_id;
  923 + $conditions['Materiels.sur_categorie_id'] = $domaine_id;
925 924 // KO => Exception PDO !
926 925 //$conditions['sur_categorie_id'] = $domain_id;
927 926 //debug($conditions);
928   -
929   -
  927 +
  928 + // - FILTRE Projet ?
  929 + $projet_id = $this->request->getQuery('projet');
  930 + // Par défaut, TOUS les domaines (id=0)
  931 + if (is_null($projet_id)) $projet_id = 0;
  932 + // Si $domain_id==0 on ne fait rien (car on prend TOUS les domaines)
  933 + if ($projet_id > 0) $conditions['Materiels.projet_id'] = $projet_id;
  934 +
930 935 // - FILTRE Nb lignes par page ?
931   - $limit = $this->request->getQuery('aff');
  936 + //$limit = $this->request->getQuery('aff');
  937 + $limit = $this->request->getQuery('nblines');
932 938 // Par défaut, nb lignes demandées dans config
933 939 if ($limit===null) $limit = $config['aff_par_defaut'];
934 940  
... ... @@ -1093,15 +1099,63 @@ class MaterielsController extends AppController {
1093 1099  
1094 1100 $this->set(compact('materiels'));
1095 1101  
  1102 + // Liste des DOMAINES
1096 1103 //$domain_options = $this->Materiels->SurCategories->find()->toArray();
1097   - $domain_options = $this->Materiels->SurCategories->find('list', [
  1104 + $domaine_options = $this->Materiels->SurCategories->find('list', [
1098 1105 'keyField' => 'id',
1099 1106 'valueField' => 'nom',
1100 1107 ])->toArray();
1101 1108 // Ajoute l'élément 0 => 'TOUS' en tête de tableau
1102 1109 //$domain_options[0] = 'TOUS';
1103   - array_unshift($domain_options, "Tous");
1104   - $this->set(compact('domain_options', 'searchfor'));
  1110 + //debug($domain_options);
  1111 + array_unshift($domaine_options, "Tous");
  1112 + //debug($domain_options);
  1113 +
  1114 + // Liste des PROJETS
  1115 + $projet_options = $this->Materiels->Projets->find('list', [
  1116 + 'keyField' => 'id',
  1117 + 'valueField' => 'nom',
  1118 + // implicite, pourquoi ???
  1119 + //'order' => 'Projets.nom'
  1120 + ])->toArray();
  1121 + //debug($projet_options);
  1122 + /* Ajoute l'élément 0 => 'TOUS' en tête de tableau
  1123 + * SANS changer les clés !!!
  1124 + */
  1125 + // 1) on ajoute un élément vide à la clé "0",
  1126 + // et on trie le tableau sur les values (nom du projet) (en conservant les clés)
  1127 + // => l'élément vide se retrouve donc en tête
  1128 + $projet_options[0] = '';
  1129 + asort($projet_options);
  1130 + // 2) on remplace l'élément vide (en tête) par 'Tous', qui est donc toujours en tête !
  1131 + $projet_options[0] = 'Tous';
  1132 + //debug($projet_options);
  1133 +
  1134 + // Liste des AGES (intervalles d'années)
  1135 + $age_options = [
  1136 + '0' => 'Tous',
  1137 + '5' => 'Récents (5 ans max)',
  1138 + '10' => '5-10 ans',
  1139 + '15' => '10-15 ans',
  1140 + '20' => '15-20 ans',
  1141 + //'20plus' => '+ 20 ans',
  1142 + '21' => '+ 20 ans',
  1143 + //'unknown' => 'inconnu',
  1144 + '-1' => 'inconnu',
  1145 + ];
  1146 +
  1147 + // Liste des NBLINES (Nb de matériels affichés par page)
  1148 + $nblines_options = [
  1149 + '20' => 20,
  1150 + '30' => 30,
  1151 + '50' => 50,
  1152 + '100' => 100,
  1153 + '150' => 150,
  1154 + '200' => 200
  1155 + ];
  1156 +
  1157 +
  1158 + $this->set(compact('age_options', 'nblines_options', 'domaine_options', 'projet_options', 'searchfor'));
1105 1159  
1106 1160 // Pas bien..., mais pratique :
1107 1161 // on passe le controleur de materiels à la vue index pour qu'elle
... ...
src/Template/Materiels/index.ctp
... ... @@ -8,15 +8,23 @@ use App\Controller\MaterielsController;
8 8 // (EP 21/5/19)
9 9 // --- Elements set by Controller for this view ---
10 10  
11   -/*TODO: $materiels doit etre enrichi avec des nouveaux attributs tels que (pour chaque materiel de la liste) :
  11 +/*
  12 + TODO: $materiels doit etre enrichi avec des nouveaux attributs tels que (pour chaque materiel de la liste) :
12 13 - CAN_EDIT
13 14 - CAN_DELETE
14 15 - CAN_VALIDATE
15 16 - CAN_TBA
16 17 - CAN_ARCHIVE
17 18 */
18   -$domain_options = $domain_options;
  19 +
  20 +// Options des filtres
  21 +$nblines_options = $nblines_options;
  22 +$age_options = $age_options;
  23 +$domaine_options = $domaine_options;
  24 +$projet_options = $projet_options;
  25 +
19 26 //debug($domain_options);
  27 +//debug($projet_options);
20 28  
21 29 $nbMateriels = $nbMateriels;
22 30 $controller=$controller;
... ... @@ -119,7 +127,8 @@ $displaySearchField = function($params, $searchfor, $html, $form) {
119 127 ]);
120 128 // (EP 202007) Ajouter un champ caché pour chaque paramètre passé dans l'url
121 129 // afin de ne pas les perdre...
122   - $parameters = ['aff', 'age', 'domain', 'status'];
  130 + //$parameters = ['aff', 'age', 'domaine', 'status', 'projet'];
  131 + $parameters = ['nblines', 'age', 'domaine', 'status', 'projet'];
123 132 foreach ($parameters as $param)
124 133 if (isset($params[$param]))
125 134 echo $this->Form->hidden($param, [
... ... @@ -295,28 +304,62 @@ $displayStatusButtons = function($SELECTED_STATUS, $params, $nbMateriels, $html)
295 304  
296 305 }; // displayStatusButtons()
297 306  
298   -$displaySelectors = function($form, $request, $displayNbLinesSelector, $displayAgeSelector, $displayDomaineSelector, $domain_options) {
  307 +
  308 +//$displaySelectors = function($form, $request,
  309 +$displayFilters = function($form, $request,
  310 + $df,
  311 + /*
  312 + $displayNbLinesSelector,
  313 + $displayAgeSelector,
  314 + */
  315 + //$f1_func,
  316 + //$f1_func,
  317 + $f1_name, $f1_options,
  318 + //$f2_func, $f2_options,
  319 + $f2_name, $f2_options,
  320 + //$displayDomaineSelector, $domain_options,
  321 + //$displayProjetSelector, $projet_options
  322 + $f3_name, $f3_options,
  323 + $f4_name, $f4_options
  324 +) {
299 325 //echo '<div>';
300 326 echo '<div class="col-lg-2 col-md-3 col-sm-4">';
301 327 echo '<table><tr>';
302 328  
  329 + // Filtre 1
303 330 echo '<td>';
304   - $displayNbLinesSelector($form, $request);
  331 + //$displayNbLinesSelector($form, $request);
  332 + //$f1_func($form, $request);
  333 + $df($f1_name, $form, $request, $f1_options);
305 334 echo '</td>';
306 335  
  336 + // Filtre 2
307 337 echo '<td>';
308   - $displayAgeSelector($form, $request);
  338 + //$displayAgeSelector($form, $request);
  339 + //$f2_func($form, $request, $f2_options);
  340 + $df($f2_name, $form, $request, $f2_options);
309 341 echo '</td>';
310 342  
  343 + // Filtre 3
311 344 echo '<td>';
312   - $displayDomaineSelector($form, $request, $domain_options);
  345 + //$displayDomaineSelector($form, $request, $domain_options);
  346 + //$df('domain', $form, $request, $domain_options);
  347 + $df($f3_name, $form, $request, $f3_options);
  348 + echo '</td>';
  349 +
  350 + // Filtre 4
  351 + echo '<td>';
  352 + //$displayProjetSelector('projet', $form, $request, $projet_options);
  353 + //$df('projet', $form, $request, $projet_options);
  354 + $df($f4_name, $form, $request, $f4_options);
313 355 echo '</td>';
314 356  
315 357 echo '</tr></table>';
316 358 echo '</div>';
317 359 };
318 360  
319   -$displayNbLinesSelector = function($form, $request) {
  361 +/*
  362 +$displayNbLinesSelector = function($form, $request, $options) {
320 363 //echo '<div class="col-lg-2 col-md-3 col-sm-4">';
321 364 //echo $this->Form->create('materiels', [
322 365 // echo $this->Form->create('materiels', ['url' => '/materiels/execActions?page=index']);
... ... @@ -324,51 +367,101 @@ $displayNbLinesSelector = function($form, $request) {
324 367 echo $form->control('aff_par_defaut', [
325 368 'label' => 'Nombre lignes',
326 369 'onchange' => "updateUrlWithSelectedValue('aff-par-defaut', 'aff')",
327   - 'options' => [
328   - '20' => 20,
329   - '30' => 30,
330   - '50' => 50,
331   - '100' => 100,
332   - '150' => 150,
333   - '200' => 200
334   - ]
  370 + 'options' => $options,
335 371 ]);
336 372 //echo '</div>';
337 373 }; // displayNbLinesSelector()
338 374  
339   -$displayAgeSelector = function($form, $request) {
  375 +$age_options = [
  376 + '0' => 'Tous',
  377 + '5' => 'Récents (5 ans max)',
  378 + '10' => '5-10 ans',
  379 + '15' => '10-15 ans',
  380 + '20' => '15-20 ans',
  381 + //'20plus' => '+ 20 ans',
  382 + '21' => '+ 20 ans',
  383 + //'unknown' => 'inconnu',
  384 + '-1' => 'inconnu',
  385 +];
  386 +
  387 +$displayAgeSelector = function($form, $request, $options) {
340 388 //echo '<div class="col-lg-2 col-md-3 col-sm-4">';
341 389 echo $form->control('age_selector', [
342 390 'label' => 'Age',
343 391 'onchange' => "updateUrlWithSelectedValue('age-selector', 'age')",
344   - 'options' => [
345   - '0' => 'Tous',
346   - '5' => 'Récents (5 ans max)',
347   - '10' => '5-10 ans',
348   - '15' => '10-15 ans',
349   - '20' => '15-20 ans',
350   - //'20plus' => '+ 20 ans',
351   - '21' => '+ 20 ans',
352   - //'unknown' => 'inconnu',
353   - '-1' => 'inconnu',
354   - ],
  392 + 'options' => $options,
  393 + 'default' => '0',
355 394 // Inutile car géré via javascript
356 395 //'default' => '5',
357 396 ]);
358 397 //echo '</div>';
359   -}; // displayNbLinesSelector()
  398 +}; // $displayAgeSelector()
360 399  
361   -$displayDomaineSelector = function($form, $request, $domain_options) {
  400 +$displayDomaineSelector = function($form, $request, $options) {
362 401 //echo '<div class="col-lg-2 col-md-3 col-sm-4">';
363 402 echo $form->control('domain_selector', [
364 403 'label' => 'Domaine',
365 404 'onchange' => "updateUrlWithSelectedValue('domain-selector', 'domain')",
366   - 'options' => $domain_options,
  405 + 'options' => $options,
367 406 // Inutile car géré via javascript
368 407 'default' => 0,
369 408 ]);
370 409 //echo '</div>';
371   -}; // displayNbLinesSelector()
  410 +};
  411 +
  412 +$displayProjetSelector = function($form, $request, $options) {
  413 + //echo '<div class="col-lg-2 col-md-3 col-sm-4">';
  414 + echo $form->control('projet_selector', [
  415 + 'label' => 'Projet',
  416 + 'onchange' => "updateUrlWithSelectedValue('projet-selector', 'projet')",
  417 + 'options' => $options,
  418 + // Inutile car géré via javascript
  419 + 'default' => 0,
  420 + ]);
  421 + //echo '</div>';
  422 +};
  423 +
  424 +$displayProjetSelector = function($filter_name, // 'projet'
  425 + $form, $request, $options
  426 + ) {
  427 + //echo '<div class="col-lg-2 col-md-3 col-sm-4">';
  428 + $html_filter_name = $filter_name.'-selector';
  429 + //echo $form->control('projet_selector', [
  430 + echo $form->control($filter_name.'_selector', [ // 'projet_selector'
  431 + //'label' => 'Projet',
  432 + 'label' => ucfirst($filter_name), // 'Projet'
  433 + //'onchange' => "updateUrlWithSelectedValue('projet-selector', 'projet')",
  434 + //'onchange' => "updateUrlWithSelectedValue($filter_name.'-selector', $filter_name)", // ('projet-selector', 'projet')
  435 + 'onchange' => "updateUrlWithSelectedValue('$html_filter_name', '$filter_name')", // ('projet-selector', 'projet')
  436 + 'options' => $options,
  437 + // Inutile car géré via javascript
  438 + 'default' => 0,
  439 + ]);
  440 + //echo '</div>';
  441 +};
  442 +*/
  443 +
  444 +$displayFilter = function($filter_name, // 'projet'
  445 + $form, $request, $options
  446 + ) {
  447 + //echo '<div class="col-lg-2 col-md-3 col-sm-4">';
  448 + $html_filter_name = $filter_name.'-selector';
  449 + //echo $form->control('projet_selector', [
  450 + echo $form->control($filter_name.'_selector', [ // 'projet_selector'
  451 + //'label' => 'Projet',
  452 + 'label' => ucfirst($filter_name), // 'Projet'
  453 + //'onchange' => "updateUrlWithSelectedValue('projet-selector', 'projet')",
  454 + //'onchange' => "updateUrlWithSelectedValue($filter_name.'-selector', $filter_name)", // ('projet-selector', 'projet')
  455 + 'onchange' => "updateUrlWithSelectedValue('$html_filter_name', '$filter_name')", // ('projet-selector', 'projet')
  456 + 'options' => $options,
  457 + // Inutile car géré via javascript
  458 + 'default' => 0,
  459 + ]);
  460 + //echo '</div>';
  461 +};
  462 +
  463 +
  464 +
372 465  
373 466  
374 467 $displayActionButtonsForSelectedOrAllElements = function($form, $SELECTED_STATUS, $USER_IS_RESPONSABLE, $USER_IS_ADMIN_OR_MORE, $USER_IS_SUPERADMIN) {
... ... @@ -639,7 +732,19 @@ if ($USER_IS_ADMIN_OR_MORE) $displayStatusButtons($SELECTED_STATUS, $params, $nb
639 732  
640 733  
641 734 // <!-- SELECTEURS : NOMBRE LIGNES PAR PAGE et AGE -->
642   -$displaySelectors($this->Form, $this->request, $displayNbLinesSelector, $displayAgeSelector, $displayDomaineSelector, $domain_options);
  735 +//$displaySelectors(
  736 +$displayFilters(
  737 + $this->Form, $this->request,
  738 + $displayFilter,
  739 + //$displayNbLinesSelector,
  740 + 'nblines', $nblines_options,
  741 + //$displayAgeSelector, $age_options,
  742 + 'age', $age_options,
  743 + //$displayDomaineSelector, $domain_options,
  744 + //$displayProjetSelector, $projet_options
  745 + 'domaine', $domaine_options,
  746 + 'projet', $projet_options
  747 +);
643 748 //$displayNbLinesSelector($this->Form, $this->request);
644 749  
645 750  
... ... @@ -989,7 +1094,12 @@ $(document).ready(function(){
989 1094 selectNbLines();
990 1095 // Actualiser le domaine sélectionné si passé en paramètre de l'url
991 1096 //$(document).ready(selectDomain);
992   - selectDomain();
  1097 + //selectDomain();
  1098 + selectFilterItem('domaine');
  1099 + //selectProjet('projet');
  1100 + selectFilterItem('projet');
  1101 +
  1102 +
993 1103 // Remplir le champ recherche général avec le texte de la dernière recherche effectuée
994 1104 //$(document).ready(setSearchField);
995 1105 //setSearchField();
... ... @@ -1006,6 +1116,7 @@ function setSearchField() {
1006 1116 }
1007 1117 */
1008 1118  
  1119 +/*
1009 1120 function selectDomain() {
1010 1121 var domain_id = parseInt($_GET('domain'));
1011 1122 //console.log(domain_id);
... ... @@ -1016,15 +1127,36 @@ function selectDomain() {
1016 1127 //$("#domain-selector").val(domain_id);
1017 1128 //document.getElementById('domain-selector').value = domain;
1018 1129 }
  1130 +*/
  1131 +
  1132 +//function selectProjet(filter_name) {
  1133 +function selectFilterItem(filter_name) {
  1134 + //var id = parseInt($_GET('projet'));
  1135 + var id = parseInt($_GET(filter_name));
  1136 + var filter_selector_name = filter_name+'-selector';
  1137 + //console.log(domain_id);
  1138 + // NotANumber
  1139 + if (!isNaN(id))
  1140 + // PAS BON : sélectionne par l'INDEX
  1141 + //$("#projet-selector")[0].selectedIndex = id;
  1142 + // OK : sélectionne par la CLÉ
  1143 + $('#'+filter_selector_name).val(id);
  1144 + //$("#projet-selector").val(id);
  1145 + //document.getElementById('domain-selector').selectedIndex = domain_id;
  1146 + //$("#domain-selector").val(domain_id);
  1147 + //document.getElementById('domain-selector').value = domain;
  1148 +}
1019 1149  
1020 1150 //$(document).ready(function () {
1021 1151 function selectNbLines() {
1022   - var nblines = parseInt($_GET('aff'));
  1152 + //var nblines = parseInt($_GET('aff'));
  1153 + var nblines = parseInt($_GET('nblines'));
1023 1154 //document.getElementById('aff-par-defaut').value = affichage;
1024 1155 if ( [20,30,50,100,200].includes(nblines) )
1025   - $("#aff-par-defaut").val(nblines);
  1156 + //$("#aff-par-defaut").val(nblines);
  1157 + $("#nblines-selector").val(nblines);
1026 1158 else
1027   - $("#aff-par-defaut").val(<?=$configuration->aff_par_defaut?>);
  1159 + $("#nblines-selector").val(<?=$configuration->aff_par_defaut?>);
1028 1160 /*
1029 1161 switch(affichage) {
1030 1162 case 20 :
... ...