Commit 3f9becf80cdeeafc12b1c20e6e7de16209f9e61b

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

Refactorisation : vue users/index generique...

- et amélioration des tris par colonne pour toutes les listes
- et la plupart des listes sont désormais triées par défaut par le nom

v5.2.28-3.7.9
CHANGELOG
... ... @@ -523,25 +523,40 @@ TODO :
523 523  
524 524  
525 525  
526   - - un champ OBLIGATOIRE mais VIDE doit pouvoir être renseigné !
527 526  
528 527  
529 528 *) Stats de connexion
530 529 - le tri des autres colonnes ne marche plus
531 530  
532   - - saisir pweb2 + extension garantie (bc+fact+bl)
533 531  
  532 +- documents/index generique
  533 +- emprunts/index generic
  534 +- projets/index generic
534 535 - ProjetsController minimaliste, doit juste étendre AppController avec un minimum de changement
535 536  
536   -- projets/index generic
537   -- emprunts/index generic
538   -- stats/index generic
539   -- users/index generic
  537 +- add_edit generic
  538 +
  539 +- fusionner groupe thematique et metier (et projet ?)
  540 +
  541 +
  542 +
  543 +======= NEXT =======
  544 +
  545 +index view : groupe metier et thematique => recup nom selon config
  546 +
  547 +garantie jqa 8/11/22 pour les 2 serveurs
540 548  
541 549 ======= CHANGES =======
542 550  
543 551 -------
  552 +11/11/2021 v5.2.28-3.7.9
  553 + - (i) Refactorisation : vue users/index generique
  554 + - (e) amélioration des tris par colonne pour toutes les listes
  555 + - (e) la plupart des listes sont désormais triées par défaut par le nom
  556 +
  557 +-------
544 558 10/11/2021 v5.2.27-3.7.9
  559 + - un champ OBLIGATOIRE mais VIDE doit pouvoir être renseigné !
545 560 - (e) date fin garantie : date en orange quand < 1 an, rouge quand expirée (et mieux calculée qu'avant)
546 561  
547 562 -------
... ...
README.md
... ... @@ -52,8 +52,8 @@ Logiciel testé et validé sur les configurations suivantes :
52 52  
53 53 --------------------------------------------------------------------------------------------
54 54  
55   -Date: 10/11/2021
56   -Version: v5.2.27-3.7.9
  55 +Date: 11/11/2021
  56 +Version: v5.2.28-3.7.9
57 57  
58 58  
59 59 HISTORIQUE DES CHANGEMENTS DE VERSION : voir le fichier CHANGES.txt (ou la page web /pages/changes)
... ...
config/app_labinvent_mandatory_fields.default.yml
... ... @@ -451,7 +451,7 @@ MANDATORY_FIELDS_FOR_LOT2:
451 451 numero_commande: 'Num. BC'
452 452  
453 453 # Docs attachés obligatoires pour valider
454   - #DOC_DEVIS: 'Devis'
  454 + DOC_DEVIS: 'Devis'
455 455 #DOC_BC: "Bon de Commande"
456 456 #DOC_BL: "Bon de Livraison"
457 457 #DOC_FACTURE: "Facture"
... ...
src/Controller/AppController.php
... ... @@ -33,7 +33,7 @@ use Cake\Http\Exception\NotImplementedException;
33 33 use Cake\Controller\Component\AuthComponent;
34 34 use Cake\ORM\Entity;
35 35 use Cake\Utility\Inflector;
36   -
  36 +use Cake\Collection\Collection;
37 37  
38 38  
39 39 /**
... ... @@ -2146,20 +2146,50 @@ class AppController extends Controller
2146 2146 $entity_plural,
2147 2147 $fields_names=[], $contained_controllers=null,
2148 2148 $HAS_ADD_BUTTON=true,
2149   - $HAS_EDIT_DEL_BUTTONS=true ,
2150   - $sortBy = null
  2149 + $HAS_EDIT_DEL_BUTTONS=true,
  2150 + $sortBy = null,
  2151 + $conditions = [],
  2152 + $sortWhitelist = [],
  2153 + $limit = 20
2151 2154 )
2152 2155 {
2153 2156 $controller_name = $this->getName();
2154 2157 //debug($controller_name);
2155 2158  
2156 2159 $this->paginate = [
2157   - 'contain' => $contained_controllers
  2160 + 'contain' => $contained_controllers,
2158 2161 //'contain' => ['SurCategories']
  2162 + 'conditions' => $conditions,
  2163 + //'order' => ['nom' => 'asc'],
  2164 + //'sortWhitelist' => $sortWhitelist,
  2165 + /*
  2166 + 'sortWhitelist' => [
  2167 + 'nom',
  2168 + 'email',
  2169 + 'role',
  2170 + 'GroupesThematiques.nom',
  2171 + 'GroupesMetiers.nom',
  2172 + 'SurCategories.nom',
  2173 + ],
  2174 + */
  2175 + //'limit' => 20,
  2176 + 'limit' => $limit,
2159 2177 ];
  2178 + if ($sortBy) $this->paginate['order'] = [$sortBy => 'asc'];
  2179 + if ($sortWhitelist) $this->paginate['sortWhitelist'] = array_values($sortWhitelist);
  2180 +
2160 2181 //$categories = $this->paginate($this->Categories);
2161 2182 $entities = $this->paginate($this->$controller_name);
2162   - if ($sortBy) $entities = $entities->sortBy($sortBy);
  2183 + //debug($entities->first());
  2184 + //debug($entities->toArray());
  2185 + //debug($entities->toArray());
  2186 + //foreach ($entities as $e) debug($e->nom);
  2187 + /*
  2188 + $collection = new Collection($entities);
  2189 + $sorted = $collection->sortBy($sortBy);
  2190 + foreach ($sorted as $e) debug($e->nom);
  2191 + */
  2192 +
2163 2193 // 'order' => array('Tapplicant.AppID' => 'desc'),
2164 2194 // $this->Paginator->sort('Hobby.name', 'Hobby');
2165 2195  
... ... @@ -2174,7 +2204,8 @@ class AppController extends Controller
2174 2204 $this->set(compact(
2175 2205 'CAN_ADD',
2176 2206 'entities', 'entity_plural', 'fields_names',
2177   - 'HAS_EDIT_DEL_BUTTONS', 'HAS_ADD_BUTTON'
  2207 + 'HAS_EDIT_DEL_BUTTONS', 'HAS_ADD_BUTTON',
  2208 + 'sortWhitelist'
2178 2209 ));
2179 2210  
2180 2211 // Pas bien..., mais pratique :
... ...
src/Controller/CategoriesController.php
... ... @@ -109,7 +109,14 @@ class CategoriesController extends AppController
109 109 'nom'=>[],
110 110 'sur_categorie_id'=>['nice_name'=>'Domaine', 'contained_entity_name'=>'sur_category', 'controller_name'=>'SurCategories'],
111 111 ],
112   - ['SurCategories']
  112 + ['SurCategories'],
  113 + true, true,
  114 + 'nom',
  115 + [],
  116 + [
  117 + 'nom' => 'nom',
  118 + 'sur_categorie_id'=>'SurCategories.nom'
  119 + ]
113 120 );
114 121  
115 122 /*
... ... @@ -143,7 +150,7 @@ class CategoriesController extends AppController
143 150 //return parent::view($id, $associated_entity_types);
144 151 //return $this->view_generic($id, $associated_entity_types, 'SurCategories');
145 152 //return $this->view_generic($id, $child_entity_types, ['SurCategories']);
146   - return $this->view_generic($id, $child_entity_types, 'SousCategories', 'sous-categories', ' une sous-catégorie');
  153 + $this->view_generic($id, $child_entity_types, 'SousCategories', 'sous-categories', ' une sous-catégorie');
147 154  
148 155 /*
149 156 $category = $this->Categories->get($id, [
... ...
src/Controller/SousCategoriesController.php
... ... @@ -101,7 +101,14 @@ class SousCategoriesController extends AppController
101 101 'nom'=>[],
102 102 'categorie_id'=>['nice_name'=>'Catégorie', 'contained_entity_name'=>'category', 'controller_name'=>'Categories'],
103 103 ],
104   - ['Categories']
  104 + ['Categories'],
  105 + true, true,
  106 + 'nom',
  107 + [],
  108 + [
  109 + 'nom' => 'nom',
  110 + 'categorie_id'=>'Categories.nom'
  111 + ]
105 112 );
106 113  
107 114 /*
... ...
src/Controller/SurCategoriesController.php
... ... @@ -175,8 +175,11 @@ class SurCategoriesController extends AppController
175 175 'nom'=>[],
176 176 //'nom'=>['nice_name'=>'Nom'],
177 177 //'sur_categorie_id'=>['nice_name'=>'Domaine', 'contained_entity_name'=>'sur_category', 'controller_name'=>'SurCategories'],
178   - ]
  178 + ],
179 179 //['SurCategories']
  180 + [],
  181 + true, true,
  182 + 'nom'
180 183 );
181 184  
182 185 /*
... ...
src/Controller/UsersController.php
... ... @@ -514,32 +514,85 @@ class UsersController extends AppController {
514 514 */
515 515 public function index() {
516 516  
517   - $filtre = $this->request->getQuery('filtre');
518 517 //debug($this->viewVars);
519 518  
  519 + //$priviledgedUsers = $this->Users->find()->where(['role !=' => 'Utilisateur']);
  520 +
  521 + // ALL users
  522 + //$entities = $this->paginate();
  523 + // ce qui revient au même que :
  524 + //$users = $this->paginate($this->Users);
  525 + // Only priviledged users
  526 + //$users = $this->paginate($priviledgedUsers);
  527 +
  528 + // Affichage informations disponible pour l'utilisateur connecté
  529 + $this->myDebug($this->LdapAuth->user());
  530 +
  531 + $filtre = $this->request->getQuery('filtre');
  532 +
520 533 // Si on est sur l'instance de l'IRAP (InventIrap),
521 534 // on affiche l'url vers la page de l'ANNUAIRE du site web du labo
522   - $lab_website_urls = ($this->confLabinvent->labNameShort != 'IRAP') ? [] : [
523   - "Annuaire IRAP" => 'https://www.irap.omp.eu/annuaire',
524   - "Annuaire IRAP (OMP)" => 'http://ezomp2.omp.obs-mip.fr/annuaire/annuaire-irap2',
525   - ];
  535 + $lab_website_urls =
  536 + $this->confLabinvent->labNameShort != 'IRAP' ? [] :
  537 + [
  538 + "Annuaire IRAP" => 'https://www.irap.omp.eu/annuaire',
  539 + "Annuaire IRAP (OMP)" => 'http://ezomp2.omp.obs-mip.fr/annuaire/annuaire-irap2',
  540 + ];
526 541  
527   - //$priviledgedUsers = $this->Users->find()->where(['role !=' => 'Utilisateur']);
  542 + $this->set(compact('lab_website_urls', 'filtre'));
528 543  
  544 + $conditions = $filtre ? ['role =' => 'Responsable'] : [];
529 545 /*
530   - $this->paginate = [
531   - 'contain' => [
532   - 'GroupesMetiers',
533   - 'GroupesThematiques',
534   - 'SurCategories'
535   - ],
536   - 'limit' => 12,
537   - 'order' => [
538   - 'Users.nom' => 'asc'
539   - ]
540   - ];
  546 + $entities = $this->paginate($this->Users->find('all', [
  547 + 'conditions' => $conditions
  548 + ]));
541 549 */
542 550  
  551 + $contains = [
  552 + 'GroupesThematiques',
  553 + 'GroupesMetiers',
  554 + 'SurCategories'
  555 + ];
  556 +
  557 + $sortWhitelist = [
  558 + 'nom' => 'nom',
  559 + 'email' => 'email',
  560 + 'role' => 'role',
  561 + 'groupes_thematique_id' => 'GroupesThematiques.nom',
  562 + 'groupes_metier_id' => 'GroupesMetiers.nom',
  563 + 'sur_categorie_id' => 'SurCategories.nom',
  564 + ];
  565 + $orderby = 'nom';
  566 + $limit = 20;
  567 +
  568 + $this->index_generic(
  569 + 'utilisateurs',
  570 + [
  571 + 'nom' => [],
  572 + 'email' => [],
  573 + 'role' => [],
  574 + 'groupes_thematique_id'=>[
  575 + 'nice_name'=>'Groupe Thématique',
  576 + 'contained_entity_name'=>'groupes_thematique', 'controller_name'=>'GroupesThematiques'
  577 + ],
  578 + 'groupes_metier_id'=>[
  579 + 'nice_name'=>'Groupe Métier',
  580 + 'contained_entity_name'=>'groupes_metier', 'controller_name'=>'GroupesMetiers'
  581 + ],
  582 + 'sur_categorie_id'=>[
  583 + 'nice_name'=>'Domaine',
  584 + 'contained_entity_name'=>'sur_category', 'controller_name'=>'SurCategories'
  585 + ],
  586 + ],
  587 + $contains,
  588 + false, true,
  589 + $orderby,
  590 + $conditions,
  591 + $sortWhitelist,
  592 + $limit
  593 + );
  594 +
  595 + /*
543 596 $this->paginate = [
544 597 'contain' => [
545 598 'GroupesMetiers',
... ... @@ -555,32 +608,14 @@ class UsersController extends AppController {
555 608 'SurCategories.nom',
556 609 ],
557 610 'limit' => 20,
558   - /*
  611 + /S
559 612 'order' => [
560 613 'Users.nom' => 'asc'
561 614 ]
562   - */
  615 + S/
563 616 ];
  617 + */
564 618  
565   - $conditions = $filtre ? ['role =' => 'Responsable'] : [];
566   - $entities = $this->paginate($this->Users->find('all', [
567   - 'conditions' => $conditions
568   - ]));
569   - // ALL users
570   - //$entities = $this->paginate();
571   - // ce qui revient au même que :
572   - //$users = $this->paginate($this->Users);
573   - // Only priviledged users
574   - //$users = $this->paginate($priviledgedUsers);
575   -
576   - // Affichage informations disponible pour l'utilisateur connecté
577   - $this->myDebug($this->LdapAuth->user());
578   -
579   - //////$this->set('nbUsers', $this->Users->find()->count());
580   - //$this->set('nbUsers', $this->Users->find('all')->count());
581   - //$this->set('nbUsers', $priviledgedUsers->count());
582   -
583   - $this->set(compact('entities', 'lab_website_urls', 'filtre'));
584 619 /* Inutile si pas de JSON
585 620 $this->set('_serialize', [
586 621 'users'
... ...
src/Template/Common/index_gen.ctp
... ... @@ -23,6 +23,8 @@ $entity_plural = $entity_plural;
23 23 $fields_names = $fields_names;
24 24 $HAS_ADD_BUTTON = $HAS_ADD_BUTTON;
25 25 $HAS_EDIT_DEL_BUTTONS = $HAS_EDIT_DEL_BUTTONS;
  26 +$sortWhitelist = $sortWhitelist;
  27 +
26 28  
27 29 /*
28 30 // Ajout du champ "nom" automatique
... ... @@ -70,8 +72,9 @@ if (empty($fields_names[&#39;nom&#39;])) $fields_names[&#39;nom&#39;] = [&#39;nice_name&#39;=&gt;&#39;Nom&#39;];
70 72 //foreach ($fields_names as $fname=>$infos) {
71 73 foreach ($fields_names as $fname=>$infos) {
72 74 $nice_name = isset($infos['nice_name']) ? $infos['nice_name'] : $fname;
73   - echo "<th>".$this->Paginator->sort($fname, ucfirst($nice_name))."</th>";
74   - }
  75 + if ( in_array($fname, array_keys($sortWhitelist)) ) $fname = $sortWhitelist[$fname];
  76 + echo "<th>".$this->Paginator->sort($fname, ucfirst($nice_name))."</th>";
  77 + }
75 78 ?>
76 79  
77 80 </tr>
... ... @@ -79,7 +82,9 @@ if (empty($fields_names[&#39;nom&#39;])) $fields_names[&#39;nom&#39;] = [&#39;nice_name&#39;=&gt;&#39;Nom&#39;];
79 82  
80 83 <!-- DATA -->
81 84 <tbody>
82   - <?php foreach ($entities as $e): ?>
  85 + <?php foreach ($entities as $e):
  86 + //debug($e);
  87 + ?>
83 88 <tr>
84 89  
85 90 <!--
... ...
src/Template/Users/index.ctp
1 1 <?php
2   -// Variables passées par le contrôleur
3   -$entities = $entities;
4   -$lab_website_urls = $lab_website_urls;
5   -$filtre = $filtre;
6   -//$nbUsers = $nbUsers;
7 2  
8   -// Nombre total d'entités
9   -$nbUsers = $this->Paginator->param('count');
  3 +// Create the list_header block.
  4 +$this->start('list_header');
10 5  
11   -?>
12   -
13   -<div class="users index">
14   - <?php
15   - $title = $filtre ? 'Liste des Responsables' : 'Liste des utilisateurs';
16   - $title .= " ($nbUsers)";
17   - echo "<h2><i class='icon-list'></i> $title</h2>";
18   -
19   - // Si des urls sont données vers des pages web du labo, on les affiche
20   - //$lab_website_urls = [];
21   - if ($lab_website_urls) {
22   - foreach ($lab_website_urls as $type_projet=>$lab_website_url)
23   - echo "=> <a href=$lab_website_url>$type_projet sur le site web du laboratoire</a><br/>";
  6 +// Si des urls sont données vers des pages web du labo, on les affiche
  7 +//$lab_website_urls = [];
  8 +if ($lab_website_urls) {
  9 + foreach ($lab_website_urls as $type_projet=>$lab_website_url)
  10 + echo "=> <a href=$lab_website_url>$type_projet sur le site web du laboratoire</a><br/>";
24 11 echo "<br/>";
25   - }
26   -
27   - $new_filtre = $filtre ? null : 'responsable';
28   - $link = $filtre ? 'Voir tous les utilisateurs' : 'Voir uniquement les responsables de groupes';
29   - echo $this->Html->link($link, [
30   - //'controller' => 'users',
31   - //'action' => 'indexRecap',
32   - //'sort' => 'sur_categorie_id',
33   - 'sort' => 'nom',
34   - 'direction' => 'asc',
35   - 'filtre' => $new_filtre,
36   - ]);
37   - echo "<br/><br/>";
38   - ?>
  12 +}
39 13  
40   - <table style="border-collapse: separate; border-spacing: 0;">
41   - <thead>
42   - <tr>
43   - <th class="actions"><?= __('') ?></th>
44   - <th><?= $this->Paginator->sort('nom') ?></th>
45   - <th><?= $this->Paginator->sort('email') ?></th>
46   -
47   - <!-- Seulement si pas de filtre -->
48   - <?php if (! $filtre) {?>
49   - <th><?= $this->Paginator->sort('role') ?></th>
50   - <?php }?>
51   -
52   - <th><?= $this->Paginator->sort('GroupesThematiques.nom', $configuration->nom_groupe_thematique) ?></th>
53   - <th><?= $this->Paginator->sort('GroupesMetiers.nom', $configuration->nom_groupe_metier) ?></th>
54   - <th><?= $this->Paginator->sort('SurCategories.nom', 'Domaine') ?></th>
55   -
56   - <th class="actions"><?= __('') ?></th>
57   - </tr>
58   - </thead>
59   - <tbody>
60   - <?php foreach ($entities as $user): ?>
61   - <tr>
62   - <td class="actions" style="padding: 6px 0; text-align: left;">
63   - <?php
64   - if($role == 'Super Administrateur') {
65   - echo $this->Html->link(__('<i class="icon-pencil"></i>'), ['action' => 'edit', $user->id], ['title' => 'Editer', 'style' => 'margin: 0 2px', 'escape' => false ]);
66   - //echo $this->Form->postLink(__('<i class="icon-trash"></i>'), ['action' => 'delete', $user->id], ['title' => 'Supprimer', 'style' => 'margin: 0 2px', 'escape' => false, 'confirm' => __('Êtes-vous sur de vouloir supprimer l\'utilisateur {0} ?', $user->nom)]);
67   - }
68   - ?>
69   - </td>
70   -
71   - <td class="smallText"><?= $this->Html->link($user->nom, ['action' => 'view', $user->id]) ?></td>
72   - <td class="smallText"><?= h($user->email) ?></td>
73   -
74   - <!-- Seulement si pas de filtre -->
75   - <?php if (! $filtre) {?>
76   - <td class="smallText"><?= h($user->role) ?></td>
77   - <?php }?>
78   -
79   - <td class="smallText"><?= $user->has('groupes_thematique') ? h($user->groupes_thematique->nom) : '' ?></td>
80   - <td class="smallText"><?= $user->has('groupes_metier') ? h($user->groupes_metier->nom) : '' ?></td>
81   - <td class="smallText"><?= $user->has('sur_categorie_id') ? h($user->sur_category->nom) : '' ?></td>
  14 +$new_filtre = $filtre ? null : 'responsable';
  15 +$link = $filtre ? 'Voir tous les utilisateurs' : 'Voir uniquement les responsables de groupes';
  16 +echo $this->Html->link($link, [
  17 + //'controller' => 'users',
  18 + //'action' => 'indexRecap',
  19 + //'sort' => 'sur_categorie_id',
  20 + 'sort' => 'nom',
  21 + 'direction' => 'asc',
  22 + 'filtre' => $new_filtre,
  23 +]);
  24 +echo "<br/><br/>";
82 25  
83   - </tr>
84   - <?php endforeach; ?>
85   - </tbody>
86   - </table>
  26 +$this->end();
87 27  
88   - <?php
89   - //echo $this->element('pagination');
90   - echo $this->element('pagination_with_first_and_last');
91   - ?>
92   -</div>
93 28  
94   -<!--
95   -<div class="actions">
96   - <php echo $this->element('menu') ?>
97   - <php
98 29  
99   -echo $this->element('menu_index', [
100   - 'pluralHumanName' => 'Utilisateurs',
101   - 'singularHumanName' => 'Utilisateur'
102   -])?>
103   - </div>
104   --->
105 30 \ No newline at end of file
  31 +$this->extend('/Common/index_gen');
  32 +//$this->extend('index.orig');
106 33 \ No newline at end of file
... ...