Commit 404b35d8c618e44f6cd8c3f59817152f16fa857b

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

Refactorisations, vues index et view génériques

- Vue détaillée users (view) générique avec contenu enrichi
("(responsable)")

- Vue liste users (index) générique avec contenu enrichi
("(responsable)")
	- user->groupe_thematique_with_resp : groupe + (responsable) si c'est
le cas
	- user->groupe_metier_with_resp : groupe + (responsable) si c'est le
cas

v5.3.0-3.7.9
CHANGELOG
... ... @@ -359,6 +359,33 @@ Commencer à implémenter le nouveau workflow v5 :
359 359 ======= TODO =======
360 360  
361 361  
  362 + *) TESTS !!!!
  363 + *) Les tests doivent se faire avec la config par défaut (et non pas celle spécifique du labo)
  364 + *) Ajouter test Commande (avec devis joint !)
  365 +
  366 + *)
  367 + Relance auto lors de suivis périodiques
  368 +
  369 + *) Validation multiple ne marche plus
  370 +
  371 + *) DOMPDF : pb Qrcode absent sur fiche pdf (mais présent sur page web), alors que le QrCode est bien généré et que le chemin dans le pdf est OK !!!
  372 +Par contre, ok avec FPDF
  373 +
  374 + *) LDAP trou sécu (autres labos) : user se connecte avec bad mdp
  375 +
  376 + *)
  377 + Rendre modifiable la config via page web "Gérer les champs obligatoires"
  378 + - OFF_nom_du_champ : 'libellé'
  379 + - Restaurer la config par défaut
  380 + - Réactiver une variable : OFF_nom_du_champ => nom_du_champ
  381 +
  382 + *) => update matos lifecycle diag
  383 +
  384 +
  385 +
  386 +
  387 +
  388 +
362 389 *) Quand on supprime un matos de “ma liste”, il faut revenir à “ma liste”, pas à “tous les matos”
363 390  
364 391 *) TEST_WEB ne marche pas avec docker
... ... @@ -366,22 +393,11 @@ Commencer à implémenter le nouveau workflow v5 :
366 393 (update doc)
367 394 Mais ca serait mieux de faire localhost:8080 pour le site web et :8081 pour phpmyadmin (et non pas l’inverse !!)
368 395  
369   - *) LDAP trou sécu (autres labos) : user se connecte avec bad mdp
370   -
371   - *) DOMPDF : pb Qrcode absent sur fiche pdf (mais présent sur page web), alors que le QrCode est bien généré et que le chemin dans le pdf est OK !!!
372   -Par contre, ok avec FPDF
373   -
374 396 *) Check extension ldap dans page web installation
375 397  
376 398 *) Augmenter taille upload de mon labo
377 399  
378 400 *) Créer une page qui liste les gestionnaires
379   -
380   - *)
381   - Rendre modifiable la config via page web "Gérer les champs obligatoires"
382   - - OFF_nom_du_champ : 'libellé'
383   - - Restaurer la config par défaut
384   - - Réactiver une variable : OFF_nom_du_champ => nom_du_champ
385 401  
386 402 *) SUPERADMIN
387 403 => par défaut, au minimum, mêmes droits que ADMIN
... ... @@ -395,7 +411,6 @@ Par contre, ok avec FPDF
395 411 - numéro inventaire (hidden par défaut pour l'édition)
396 412 - ...
397 413  
398   - *) => update matos lifecycle diag
399 414  
400 415 *) Vincent :
401 416 - email pas trouvé (ancienne fiche de vincent)
... ... @@ -407,12 +422,8 @@ Par contre, ok avec FPDF
407 422  
408 423 *) qqsoit user : doit pouvoir voir sa fiche user (no modif)
409 424 => mais pas celle des autres...
410   -
411   - *) TESTS !!!!
412   - *) Les tests doivent se faire avec la config par défaut (et non pas celle spécifique du labo)
413   - *) Ajouter test Commande (avec devis joint !)
414 425  
415   - *) Validation multiple ne marche plus
  426 +
416 427  
417 428 *) Mail "[LabInvent] Ajout de matériel(s)" => c'est quoi ? ==> voir message de log associé
418 429 (quelle diff avec "[LabInvent] Ajout d'un matériel" ??)
... ... @@ -438,10 +449,7 @@ Par contre, ok avec FPDF
438 449 *)
439 450 Procédures pour les utilisateurs et les gestionnaires désormais configurable via le fichier de conf
440 451  
441   -
442   - *)
443   - Relance auto lors de suivis périodiques
444   -
  452 +
445 453 *)
446 454 Généraliser l'usage de Element/buttons_edit_del.ctp dans tous les formulaires de view
447 455  
... ... @@ -504,7 +512,6 @@ TODO :
504 512  
505 513 - fusionner elem/button_add_edit et MyHelper echoActionButton...
506 514 (ne garder que elem/)
507   -
508 515 - séparer elem/button_add, button_edit, button_delete, et button_tout_court (générique)
509 516  
510 517 - short_role AppController ligne 819 => généraliser
... ... @@ -537,17 +544,35 @@ TODO :
537 544 - fusionner groupe thematique et metier (et projet ?)
538 545  
539 546 - Utiliser les vues "index" des entités associées pour la vue "view" de materiel (et suivi) :
540   - => éviter la redondance, le contenu est pratiquement le meme
  547 + => éviter la redondance, le contenu est pratiquement le meme (???, sauf que les colonnes ne sont pas triables)
541 548  
542 549 ======= NEXT =======
543 550  
  551 +print etiquette pour les 2 serveurs + tester fin garantie orange
  552 +
544 553 view générique à utiliser pour plusieurs entités
545 554  
546   -print etiquette pour les 2 serveurs + tester fin garantie orange
  555 +Vues génériques (index et view) :
  556 + - savoir gérer les champs virtuels pour le tri
  557 + - new champs virtuels à implémenter :
  558 + - prets :
  559 + - intitulé = nom sinon id
  560 + - lieu_stockage = concat(site,lieu)
  561 + - users : vue "index" avec (responsable)
  562 +
  563 +- Suivis.statut => "en cours" ou "à terminer" => à calculer auto
547 564  
  565 +
548 566 ======= CHANGES =======
549 567  
550 568 -------
  569 +15/11/2021 v5.3.0-3.7.9
  570 + - (e) Refactorisation : Vue détaillée users (view) générique avec contenu enrichi ("(responsable)")
  571 + - (e) Refactorisation : Vue liste users (index) générique avec contenu enrichi ("(responsable)")
  572 + - user->groupe_thematique_with_resp : groupe + (responsable) si c'est le cas
  573 + - user->groupe_metier_with_resp : groupe + (responsable) si c'est le cas
  574 +
  575 +-------
551 576 12/11/2021 v5.2.30-3.7.9
552 577 - (e) Refactorisation : Vue liste projets (index) générique
553 578 - (e) Amélioration vue des Stats de connexion : le tri des colonnes est maintenant ok
... ... @@ -556,7 +581,7 @@ print etiquette pour les 2 serveurs + tester fin garantie orange
556 581 - tri par défaut amélioré
557 582 - bugfix label du champ 'nom'
558 583 - généralisation de l'affichage des booleens
559   -
  584 +
560 585 -------
561 586 12/11/2021 v5.2.29-3.7.9
562 587 - (b) Bugfix label (configurable) des groupes métier et thématique : maintenant ok dans toutes les vues
... ...
README.md
... ... @@ -52,8 +52,8 @@ Logiciel testé et validé sur les configurations suivantes :
52 52  
53 53 --------------------------------------------------------------------------------------------
54 54  
55   -Date: 12/11/2021
56   -Version: v5.2.30-3.7.9
  55 +Date: 15/11/2021
  56 +Version: v5.3.0-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)
... ...
src/Controller/AppController.php
... ... @@ -2148,7 +2148,8 @@ class AppController extends Controller
2148 2148 */
2149 2149 public function index_generic(
2150 2150 $entity_plural,
2151   - $fields_names=[], $contained_controllers=null,
  2151 + $fields_names=[],
  2152 + $contained_controllers=null,
2152 2153 $HAS_ADD_BUTTON=true,
2153 2154 $HAS_EDIT_DEL_BUTTONS=true,
2154 2155 $sortBy = null,
... ... @@ -2266,8 +2267,11 @@ class AppController extends Controller
2266 2267  
2267 2268 //public function view_generic($id, $associated_entity_types, $parent_entity_controller_name=[]) {
2268 2269 //public function view_generic($id, $associated_entity_types, $containavirer=[]) {
2269   - public function view_generic($id, $child_entity_types=[],
2270   - $sub_controller_class_name=null, $sub_controller=null, $sub_controller_singular=null) {
  2270 + public function view_generic(
  2271 + $id, $child_entity_types=[],
  2272 + $sub_controller_class_name=null, $sub_controller=null, $sub_controller_singular=null,
  2273 + $improved=[], $excluded=[]
  2274 + ) {
2271 2275  
2272 2276 //debug($contain_children);
2273 2277 // ex: SurCategories
... ... @@ -2393,6 +2397,9 @@ class AppController extends Controller
2393 2397 $parent_entity_infos['type_name'] = $parent_entity_type_name;
2394 2398 $parent_entity_infos['name'] = $parent_entity_name;
2395 2399 $parent_entity_infos['fk_contained_name'] = $parent_entity_contained_name;
  2400 + //if ($fk_name=='groupes_thematique_id') $parent_entity_infos['improved'] = 'groupe_thematique_with_resp';
  2401 + if ( isset($improved[$fk_name]) ) $parent_entity_infos['improved'] = $improved[$fk_name];
  2402 +
2396 2403 }
2397 2404 //debug($parent_entities_infos);
2398 2405 //exit;
... ... @@ -2568,7 +2575,8 @@ class AppController extends Controller
2568 2575 // Optionnel : sous-controleur pour pouvoir ajouter une sous-entité (ex: ajouter une sous-catégorie à une catégorie)
2569 2576 'sub_controller',
2570 2577 'sub_controller_singular',
2571   - 'CAN_ADD_SUB_ENTITY'
  2578 + 'CAN_ADD_SUB_ENTITY',
  2579 + 'excluded'
2572 2580  
2573 2581 ));
2574 2582 //debug($this->viewVars);exit;
... ...
src/Controller/UsersController.php
... ... @@ -573,11 +573,15 @@ class UsersController extends AppController {
573 573 'role' => [],
574 574 'groupes_thematique_id'=>[
575 575 //'nice_name'=>'Groupe Thématique',
576   - 'contained_entity_name'=>'groupes_thematique', 'controller_name'=>'GroupesThematiques',
  576 + 'contained_entity_name'=>'groupes_thematique',
  577 + 'controller_name'=>'GroupesThematiques',
  578 + 'improved' => 'groupe_thematique_with_resp',
577 579 ],
578 580 'groupes_metier_id'=>[
579 581 //'nice_name'=>'Groupe Métier',
580   - 'contained_entity_name'=>'groupes_metier', 'controller_name'=>'GroupesMetiers',
  582 + 'contained_entity_name'=>'groupes_metier',
  583 + 'controller_name'=>'GroupesMetiers',
  584 + 'improved' => 'groupe_metier_with_resp',
581 585 ],
582 586 'sur_categorie_id'=>[
583 587 //'nice_name'=>'Domaine',
... ... @@ -686,6 +690,28 @@ class UsersController extends AppController {
686 690 */
687 691 public function view($id = null)
688 692 {
  693 + /*
  694 + $child_entity_types = [
  695 + 'GroupesMetiers',
  696 + 'GroupesThematiques',
  697 + 'SurCategories',
  698 + ];
  699 + */
  700 + //return parent::view($id, $associated_entity_types);
  701 + //return $this->view_generic($id, $associated_entity_types, 'SurCategories');
  702 + //return $this->view_generic($id, $child_entity_types, ['SurCategories']);
  703 + //$this->view_generic($id, $child_entity_types);
  704 + $improved = [
  705 + 'groupes_thematique_id' => 'groupe_thematique_with_resp',
  706 + 'groupes_metier_id' => 'groupe_metier_with_resp',
  707 + ];
  708 + $excluded = [ 'is_resp_groupes_metier', 'is_resp_groupes_thematique', 'modified', ];
  709 + $this->view_generic($id, [], null, null, null,
  710 + $improved,
  711 + $excluded
  712 + );
  713 + return;
  714 +
689 715 $user = $this->Users->get($id, [
690 716 'contain' => [
691 717 'GroupesMetiers',
... ... @@ -693,11 +719,12 @@ class UsersController extends AppController {
693 719 'SurCategories'
694 720 ]
695 721 ]);
696   -
697 722 $this->set('user', $user);
  723 + /* (EP) inutile sauf json
698 724 $this->set('_serialize', [
699 725 'user'
700 726 ]);
  727 + */
701 728 }
702 729  
703 730  
... ...
src/Model/Entity/User.php
... ... @@ -87,6 +87,20 @@ class User extends Entity
87 87 //protected function _getIsAdminplus() { return $this->role == 'Administration Plus'; }
88 88 // $user->is_super
89 89 protected function _getIsSuper() { return $this->role == 'Super Administrateur'; }
  90 +
  91 + // $user->groupe_thematique_with_resp
  92 + protected function _getGroupeThematiqueWithResp() {
  93 + $group_with_resp = '';
  94 + if ($this->has('groupes_thematique')) $group_with_resp .= $this->groupes_thematique->nom;
  95 + if ($this->is_resp_groupes_thematique) $group_with_resp .= ' (responsable)';
  96 + return $group_with_resp;
  97 + }
  98 + protected function _getGroupeMetierWithResp() {
  99 + $group_with_resp = '';
  100 + if ($this->has('groupes_metier')) $group_with_resp .= $this->groupes_metier->nom;
  101 + if ($this->is_resp_groupes_metier) $group_with_resp .= ' (responsable)';
  102 + return $group_with_resp;
  103 + }
90 104  
91 105  
92 106 /*
... ...
src/Template/Common/index_gen.ctp
... ... @@ -127,6 +127,7 @@ if (empty($fields_names['nom'])) $fields_names['nom'] = ['nice_name'=>'Nom'];
127 127 //debug($fname);
128 128 //<td class="smallText"><?= $this->Html->link($e->nom, ['action' => 'view', $e->id]) ></td>
129 129 echo "<td class='smallText'>";
  130 +
130 131 // - S'il y a une fonction de transformation à appliquer, ben... on l'applique
131 132 //var_dump($fname);
132 133 if ( isset($fields_names[$fname]['f']) ) {
... ... @@ -135,9 +136,11 @@ if (empty($fields_names[&#39;nom&#39;])) $fields_names[&#39;nom&#39;] = [&#39;nice_name&#39;=&gt;&#39;Nom&#39;];
135 136 //var_dump("Y");
136 137 echo $this->MyHelper->$f($fval);
137 138 }
  139 +
138 140 // - Si c'est le champ "nom" ou "id", on l'affiche comme un lien
139 141 elseif ($fname == 'nom' || $fname == 'id')
140 142 echo $this->Html->link($fval, ['action' => 'view', $e->id]);
  143 +
141 144 // - Si le champ est boolean => on affiche oui/non
142 145 //elseif ( (substr($fname,0,3)=='is_') && ($fval===false || $fval===true) )
143 146 elseif (
... ... @@ -149,6 +152,7 @@ if (empty($fields_names[&#39;nom&#39;])) $fields_names[&#39;nom&#39;] = [&#39;nice_name&#39;=&gt;&#39;Nom&#39;];
149 152 //echo $fval ? "Oui" : "Non";
150 153 echo $fval ? $bool_values[0] : $bool_values[1];
151 154 }
  155 +
152 156 // - Si le champ est une FK => on récupère la valeur du 'contained'
153 157 //elseif ( strpos($fname,'_id') !== strlen($fname)-3 )
154 158 elseif ( substr($fname,-3) == '_id' ) {
... ... @@ -163,7 +167,16 @@ if (empty($fields_names[&#39;nom&#39;])) $fields_names[&#39;nom&#39;] = [&#39;nice_name&#39;=&gt;&#39;Nom&#39;];
163 167 $name_field_label = $infos['name_field_label']; // 'nom' ou 'designation' ou ...
164 168  
165 169 //$projet->has('chef_science_id') ? $this->Html->link($projet->chef_science->nom, ['controller' => 'Users', 'action' => 'view', $projet->chef_science_id]) : '' ></td>
166   - $linkval = $e->has($contained_entity_name) ? $e->$contained_entity_name->$name_field_label : $fval;
  170 + //$linkval = $e->has($contained_entity_name) ? $e->$contained_entity_name->$name_field_label : $fval;
  171 + if ($e->has($contained_entity_name)) {
  172 + if ( isset($fields_names[$fname]['improved']) ) {
  173 + $fk_field = $fields_names[$fname]['improved'];
  174 + $linkval = $e->$fk_field;
  175 + }
  176 + else
  177 + $linkval = $e->$contained_entity_name->$name_field_label;
  178 + }
  179 + else $linkval = $fval;
167 180 //echo $this->Html->link($fval, ['controller' => $controller_name, 'action' => 'view', $e->sur_category->id]);
168 181 echo $this->Html->link($linkval, ['controller' => $controller_name, 'action' => 'view', $fval]);
169 182 /*
... ...
src/Template/Common/view.ctp
... ... @@ -32,6 +32,9 @@ $entity = $entity;
32 32 //debug($entity);
33 33 //$parent_entity_infos=$parent_entity_infos;
34 34 $parent_entities_infos = $parent_entities_infos;
  35 +//$parent_entities_infos['groupes_thematique_id']['improved'] = 'groupe_thematique_with_resp';
  36 +//$parent_entities_infos['groupes_metier_id']['improved'] = 'groupe_metier_with_resp';
  37 +//debug($parent_entities_infos);
35 38 $fields_label = $fields_label;
36 39 /*
37 40 $parent_entity_controller_name = $parent_entity_controller_name;
... ... @@ -49,6 +52,7 @@ $entity_name = $entity_name;
49 52 // Liste des entités à afficher (en tant qu'entité associée) :
50 53 // En général, par défaut : "Matériels associés" et "Utilisateurs associés"
51 54 $child_entities_list = $child_entities_list;
  55 +$excluded = $excluded;
52 56  
53 57 // OPTIONNELS
54 58 if (isset($sub_controller)) {
... ... @@ -130,13 +134,15 @@ if (isset($sub_controller)) {
130 134 //debug($fields_label);
131 135 //debug($parent_entities_infos);
132 136 foreach ($entity->toArray() as $fname=>$fval) {
  137 + if (in_array($fname, $excluded)) continue;
133 138 if ( $fval!==null && $fname!='id' && $fname!='description' && !is_array($fval) ) {
134 139 //debug($fname);
135 140 //debug($fval);
136 141 $flabel = ucfirst($fields_label[$fname]);
137 142 $fvalue = $fval;
138 143 // Si le champ n'est pas une FK (terminant par '_id') => on l'affiche directement
139   - if ( strpos($fname,'_id') !== strlen($fname)-3 )
  144 + //if ( strpos($fname,'_id') !== strlen($fname)-3 )
  145 + if ( substr($fname,-3)!='_id' )
140 146 $this->MyHelper->displayTableRowLabelAndValue(__($flabel), h($fvalue));
141 147 // Si le champ est une FK => on récupère la valeur du 'contained'
142 148 else {
... ... @@ -146,7 +152,11 @@ if (isset($sub_controller)) {
146 152 $fk_contained_name = $parent_entity_infos['fk_contained_name'];
147 153 //debug($fk_contained_name);
148 154 //$fvalue = $associated_entity_infos['name'];
149   - $fvalue = $entity->$fk_contained_name->nom;
  155 +
  156 + //$fvalue = $entity->$fk_contained_name->nom;
  157 + $fk_field = isset($parent_entity_infos['improved']) ? $parent_entity_infos['improved'] : null;
  158 + $fvalue = $fk_field ? $entity->$fk_field : $entity->$fk_contained_name->nom;
  159 +
150 160 $this->MyHelper->displayTableRowLabelAndValue(
151 161 __(ucfirst($parent_entity_infos['type_name'])),
152 162 //$category->has('sur_category') ? $this->Html->link($category->sur_category->nom, [
... ...
src/Template/Users/view.ctp
1   -
2   -
3   -<div class="users view">
4   - <h2>Détail utilisateur</h2>
5   - <table style="margin-bottom: 30px;">
6   -
7   - <tr>
8   - <th style="width: 250px;"></th>
9   - <th></th>
10   - </tr>
11   -
12   - <?php
13   - if ($role == 'Super Administrateur') {
14   - echo $this->Html->link(__('<i class="icon-pencil"></i> Editer cet utilisateur'), [
15   - 'action' => 'edit',
16   - $user->id
17   - ], [
18   - 'style' => 'margin-right: 40px; display: inline-block',
19   - 'escape' => false,
20   - 'onclick' => 'return true;'
21   - ]);
22   - /*
23   - * (EP 3/6/19)
24   - * Voir ma remarque dans la vue edit.ctp
25   - * La table users n'est qu'un CACHE du LDAP ou du fake ldap (pas d'autre alternative).
26   - * On ne doit donc pas pouvoir supprimer un user de cette table, mais seulement depuis le LDAP (ou fake ldap, c'est à dire table fakeldapusers)
27   - */
28   - echo $this->Form->postLink(__('<i class="icon-trash"></i> Supprimer cet utilisateur'), [
29   - 'action' => 'delete',
30   - $user->id
31   - ], [
32   - 'style' => 'display: inline-block;',
33   - 'escape' => false,
34   - 'confirm' => __('Êtes-vous sur de vouloir supprimer ?', $user->nom)
35   - ]);
36   - }
37   -
38   - $displayElement(__('Nom'), h($user->nom));
39   - $displayElement(__('Login'), h($user->username));
40   - $displayElement(__('Email'), h($user->email));
41   - $displayElement(__('Rôle'), h($user->role));
42   -
43   - // Groupes métier et thématique
44   - foreach (['metier','thematique'] as $ftype) {
45   - //$ftype = 'thematique';
46   - $fname = 'groupes_'.$ftype;
47   - $fname_sing = 'groupe_'.$ftype;
48   - $fname_isresp = 'is_resp_'.$fname;
49   - $fname_conf = 'nom_'.$fname_sing;
50   - $control = 'Groupes'.ucfirst($ftype).'s';
51   - if ($user->has($fname)) {
52   - $group_name = $user->$fname->nom;
53   - if ($user->$fname_isresp) $group_name .= ' (responsable)';
54   - $displayElement(__($configuration->$fname_conf), $this->Html->link($group_name, [
55   - 'controller' => $control,
56   - 'action' => 'view',
57   - $user->$fname->id
58   - ]));
59   - }
60   - }
61   - /*
62   - if ($user->has('groupes_metier')) {
63   - $groupe_metier = $user->groupes_metier->nom;
64   - if ($user->is_resp_groupe_metier) $groupe_metier .= ' (responsable)';
65   - $displayElement(__($configuration->nom_groupe_metier), $this->Html->link($groupe_metier, [
66   - 'controller' => 'GroupesMetiers',
67   - 'action' => 'view',
68   - $user->groupes_metier->id
69   - ]));
70   - }
71   - $displayElement(__($configuration->nom_groupe_metier), $user->has('groupes_metier') ? $this->Html->link($user->groupes_metier->nom, [
72   - 'controller' => 'GroupesMetiers',
73   - 'action' => 'view',
74   - $user->groupes_metier->id
75   - ]) : '');
76   - $displayElement(__('Responsable groupe'), h($user->is_resp_groupe_metier));
77   - */
78   -
79   - if ( $user->has('sur_categorie_id') ) $displayElement(__('Domaine'),
80   - $this->Html->link($user->sur_category->nom, [
81   - 'controller' => 'SurCategories',
82   - 'action' => 'view',
83   - $user->sur_category->id
84   - ]));
85   -
86   - ?>
87   -
88   - </table>
89   -</div>
90   -
91   -<!--
92   -<div class="actions">
93   - <php echo $this->element('menu') ?>
94   - <php
95   -
96   -echo $this->element('menu_view', [
97   - 'pluralHumanName' => 'Utilisateurs',
98   - 'singularHumanName' => 'Utilisateur',
99   - 'lien' => $user->id
100   -])?>
101   - </div>
102   --->
103 1 \ No newline at end of file
  2 +<?php
  3 +$this->extend('/Common/view');
104 4 \ No newline at end of file
... ...