From 404b35d8c618e44f6cd8c3f59817152f16fa857b Mon Sep 17 00:00:00 2001 From: Etienne Pallier Date: Mon, 15 Nov 2021 09:51:20 +0100 Subject: [PATCH] Refactorisations, vues index et view génériques --- CHANGELOG | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++------------------------- README.md | 4 ++-- src/Controller/AppController.php | 16 ++++++++++++---- src/Controller/UsersController.php | 33 ++++++++++++++++++++++++++++++--- src/Model/Entity/User.php | 14 ++++++++++++++ src/Template/Common/index_gen.ctp | 15 ++++++++++++++- src/Template/Common/view.ctp | 14 ++++++++++++-- src/Template/Users/view.ctp | 104 ++------------------------------------------------------------------------------------------------------ 8 files changed, 136 insertions(+), 139 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index f6ab3a4..0ab629b 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -359,6 +359,33 @@ Commencer à implémenter le nouveau workflow v5 : ======= TODO ======= + *) TESTS !!!! + *) Les tests doivent se faire avec la config par défaut (et non pas celle spécifique du labo) + *) Ajouter test Commande (avec devis joint !) + + *) + Relance auto lors de suivis périodiques + + *) Validation multiple ne marche plus + + *) 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 !!! +Par contre, ok avec FPDF + + *) LDAP trou sécu (autres labos) : user se connecte avec bad mdp + + *) + Rendre modifiable la config via page web "Gérer les champs obligatoires" + - OFF_nom_du_champ : 'libellé' + - Restaurer la config par défaut + - Réactiver une variable : OFF_nom_du_champ => nom_du_champ + + *) => update matos lifecycle diag + + + + + + *) Quand on supprime un matos de “ma liste”, il faut revenir à “ma liste”, pas à “tous les matos” *) TEST_WEB ne marche pas avec docker @@ -366,22 +393,11 @@ Commencer à implémenter le nouveau workflow v5 : (update doc) Mais ca serait mieux de faire localhost:8080 pour le site web et :8081 pour phpmyadmin (et non pas l’inverse !!) - *) LDAP trou sécu (autres labos) : user se connecte avec bad mdp - - *) 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 !!! -Par contre, ok avec FPDF - *) Check extension ldap dans page web installation *) Augmenter taille upload de mon labo *) Créer une page qui liste les gestionnaires - - *) - Rendre modifiable la config via page web "Gérer les champs obligatoires" - - OFF_nom_du_champ : 'libellé' - - Restaurer la config par défaut - - Réactiver une variable : OFF_nom_du_champ => nom_du_champ *) SUPERADMIN => par défaut, au minimum, mêmes droits que ADMIN @@ -395,7 +411,6 @@ Par contre, ok avec FPDF - numéro inventaire (hidden par défaut pour l'édition) - ... - *) => update matos lifecycle diag *) Vincent : - email pas trouvé (ancienne fiche de vincent) @@ -407,12 +422,8 @@ Par contre, ok avec FPDF *) qqsoit user : doit pouvoir voir sa fiche user (no modif) => mais pas celle des autres... - - *) TESTS !!!! - *) Les tests doivent se faire avec la config par défaut (et non pas celle spécifique du labo) - *) Ajouter test Commande (avec devis joint !) - *) Validation multiple ne marche plus + *) Mail "[LabInvent] Ajout de matériel(s)" => c'est quoi ? ==> voir message de log associé (quelle diff avec "[LabInvent] Ajout d'un matériel" ??) @@ -438,10 +449,7 @@ Par contre, ok avec FPDF *) Procédures pour les utilisateurs et les gestionnaires désormais configurable via le fichier de conf - - *) - Relance auto lors de suivis périodiques - + *) Généraliser l'usage de Element/buttons_edit_del.ctp dans tous les formulaires de view @@ -504,7 +512,6 @@ TODO : - fusionner elem/button_add_edit et MyHelper echoActionButton... (ne garder que elem/) - - séparer elem/button_add, button_edit, button_delete, et button_tout_court (générique) - short_role AppController ligne 819 => généraliser @@ -537,17 +544,35 @@ TODO : - fusionner groupe thematique et metier (et projet ?) - Utiliser les vues "index" des entités associées pour la vue "view" de materiel (et suivi) : - => éviter la redondance, le contenu est pratiquement le meme + => éviter la redondance, le contenu est pratiquement le meme (???, sauf que les colonnes ne sont pas triables) ======= NEXT ======= +print etiquette pour les 2 serveurs + tester fin garantie orange + view générique à utiliser pour plusieurs entités -print etiquette pour les 2 serveurs + tester fin garantie orange +Vues génériques (index et view) : + - savoir gérer les champs virtuels pour le tri + - new champs virtuels à implémenter : + - prets : + - intitulé = nom sinon id + - lieu_stockage = concat(site,lieu) + - users : vue "index" avec (responsable) + +- Suivis.statut => "en cours" ou "à terminer" => à calculer auto + ======= CHANGES ======= ------- +15/11/2021 v5.3.0-3.7.9 + - (e) Refactorisation : Vue détaillée users (view) générique avec contenu enrichi ("(responsable)") + - (e) Refactorisation : 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 + +------- 12/11/2021 v5.2.30-3.7.9 - (e) Refactorisation : Vue liste projets (index) générique - (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 - tri par défaut amélioré - bugfix label du champ 'nom' - généralisation de l'affichage des booleens - + ------- 12/11/2021 v5.2.29-3.7.9 - (b) Bugfix label (configurable) des groupes métier et thématique : maintenant ok dans toutes les vues diff --git a/README.md b/README.md index ff62ae9..4ed61ae 100644 --- a/README.md +++ b/README.md @@ -52,8 +52,8 @@ Logiciel testé et validé sur les configurations suivantes : -------------------------------------------------------------------------------------------- -Date: 12/11/2021 -Version: v5.2.30-3.7.9 +Date: 15/11/2021 +Version: v5.3.0-3.7.9 HISTORIQUE DES CHANGEMENTS DE VERSION : voir le fichier CHANGES.txt (ou la page web /pages/changes) diff --git a/src/Controller/AppController.php b/src/Controller/AppController.php index 15e08fa..dc5a362 100755 --- a/src/Controller/AppController.php +++ b/src/Controller/AppController.php @@ -2148,7 +2148,8 @@ class AppController extends Controller */ public function index_generic( $entity_plural, - $fields_names=[], $contained_controllers=null, + $fields_names=[], + $contained_controllers=null, $HAS_ADD_BUTTON=true, $HAS_EDIT_DEL_BUTTONS=true, $sortBy = null, @@ -2266,8 +2267,11 @@ class AppController extends Controller //public function view_generic($id, $associated_entity_types, $parent_entity_controller_name=[]) { //public function view_generic($id, $associated_entity_types, $containavirer=[]) { - public function view_generic($id, $child_entity_types=[], - $sub_controller_class_name=null, $sub_controller=null, $sub_controller_singular=null) { + public function view_generic( + $id, $child_entity_types=[], + $sub_controller_class_name=null, $sub_controller=null, $sub_controller_singular=null, + $improved=[], $excluded=[] + ) { //debug($contain_children); // ex: SurCategories @@ -2393,6 +2397,9 @@ class AppController extends Controller $parent_entity_infos['type_name'] = $parent_entity_type_name; $parent_entity_infos['name'] = $parent_entity_name; $parent_entity_infos['fk_contained_name'] = $parent_entity_contained_name; + //if ($fk_name=='groupes_thematique_id') $parent_entity_infos['improved'] = 'groupe_thematique_with_resp'; + if ( isset($improved[$fk_name]) ) $parent_entity_infos['improved'] = $improved[$fk_name]; + } //debug($parent_entities_infos); //exit; @@ -2568,7 +2575,8 @@ class AppController extends Controller // Optionnel : sous-controleur pour pouvoir ajouter une sous-entité (ex: ajouter une sous-catégorie à une catégorie) 'sub_controller', 'sub_controller_singular', - 'CAN_ADD_SUB_ENTITY' + 'CAN_ADD_SUB_ENTITY', + 'excluded' )); //debug($this->viewVars);exit; diff --git a/src/Controller/UsersController.php b/src/Controller/UsersController.php index 346ff60..e3eb7b1 100755 --- a/src/Controller/UsersController.php +++ b/src/Controller/UsersController.php @@ -573,11 +573,15 @@ class UsersController extends AppController { 'role' => [], 'groupes_thematique_id'=>[ //'nice_name'=>'Groupe Thématique', - 'contained_entity_name'=>'groupes_thematique', 'controller_name'=>'GroupesThematiques', + 'contained_entity_name'=>'groupes_thematique', + 'controller_name'=>'GroupesThematiques', + 'improved' => 'groupe_thematique_with_resp', ], 'groupes_metier_id'=>[ //'nice_name'=>'Groupe Métier', - 'contained_entity_name'=>'groupes_metier', 'controller_name'=>'GroupesMetiers', + 'contained_entity_name'=>'groupes_metier', + 'controller_name'=>'GroupesMetiers', + 'improved' => 'groupe_metier_with_resp', ], 'sur_categorie_id'=>[ //'nice_name'=>'Domaine', @@ -686,6 +690,28 @@ class UsersController extends AppController { */ public function view($id = null) { + /* + $child_entity_types = [ + 'GroupesMetiers', + 'GroupesThematiques', + 'SurCategories', + ]; + */ + //return parent::view($id, $associated_entity_types); + //return $this->view_generic($id, $associated_entity_types, 'SurCategories'); + //return $this->view_generic($id, $child_entity_types, ['SurCategories']); + //$this->view_generic($id, $child_entity_types); + $improved = [ + 'groupes_thematique_id' => 'groupe_thematique_with_resp', + 'groupes_metier_id' => 'groupe_metier_with_resp', + ]; + $excluded = [ 'is_resp_groupes_metier', 'is_resp_groupes_thematique', 'modified', ]; + $this->view_generic($id, [], null, null, null, + $improved, + $excluded + ); + return; + $user = $this->Users->get($id, [ 'contain' => [ 'GroupesMetiers', @@ -693,11 +719,12 @@ class UsersController extends AppController { 'SurCategories' ] ]); - $this->set('user', $user); + /* (EP) inutile sauf json $this->set('_serialize', [ 'user' ]); + */ } diff --git a/src/Model/Entity/User.php b/src/Model/Entity/User.php index aa99b28..b2fc573 100755 --- a/src/Model/Entity/User.php +++ b/src/Model/Entity/User.php @@ -87,6 +87,20 @@ class User extends Entity //protected function _getIsAdminplus() { return $this->role == 'Administration Plus'; } // $user->is_super protected function _getIsSuper() { return $this->role == 'Super Administrateur'; } + + // $user->groupe_thematique_with_resp + protected function _getGroupeThematiqueWithResp() { + $group_with_resp = ''; + if ($this->has('groupes_thematique')) $group_with_resp .= $this->groupes_thematique->nom; + if ($this->is_resp_groupes_thematique) $group_with_resp .= ' (responsable)'; + return $group_with_resp; + } + protected function _getGroupeMetierWithResp() { + $group_with_resp = ''; + if ($this->has('groupes_metier')) $group_with_resp .= $this->groupes_metier->nom; + if ($this->is_resp_groupes_metier) $group_with_resp .= ' (responsable)'; + return $group_with_resp; + } /* diff --git a/src/Template/Common/index_gen.ctp b/src/Template/Common/index_gen.ctp index a690576..f083d38 100755 --- a/src/Template/Common/index_gen.ctp +++ b/src/Template/Common/index_gen.ctp @@ -127,6 +127,7 @@ if (empty($fields_names['nom'])) $fields_names['nom'] = ['nice_name'=>'Nom']; //debug($fname); //Html->link($e->nom, ['action' => 'view', $e->id]) > echo ""; + // - S'il y a une fonction de transformation à appliquer, ben... on l'applique //var_dump($fname); if ( isset($fields_names[$fname]['f']) ) { @@ -135,9 +136,11 @@ if (empty($fields_names['nom'])) $fields_names['nom'] = ['nice_name'=>'Nom']; //var_dump("Y"); echo $this->MyHelper->$f($fval); } + // - Si c'est le champ "nom" ou "id", on l'affiche comme un lien elseif ($fname == 'nom' || $fname == 'id') echo $this->Html->link($fval, ['action' => 'view', $e->id]); + // - Si le champ est boolean => on affiche oui/non //elseif ( (substr($fname,0,3)=='is_') && ($fval===false || $fval===true) ) elseif ( @@ -149,6 +152,7 @@ if (empty($fields_names['nom'])) $fields_names['nom'] = ['nice_name'=>'Nom']; //echo $fval ? "Oui" : "Non"; echo $fval ? $bool_values[0] : $bool_values[1]; } + // - Si le champ est une FK => on récupère la valeur du 'contained' //elseif ( strpos($fname,'_id') !== strlen($fname)-3 ) elseif ( substr($fname,-3) == '_id' ) { @@ -163,7 +167,16 @@ if (empty($fields_names['nom'])) $fields_names['nom'] = ['nice_name'=>'Nom']; $name_field_label = $infos['name_field_label']; // 'nom' ou 'designation' ou ... //$projet->has('chef_science_id') ? $this->Html->link($projet->chef_science->nom, ['controller' => 'Users', 'action' => 'view', $projet->chef_science_id]) : '' > - $linkval = $e->has($contained_entity_name) ? $e->$contained_entity_name->$name_field_label : $fval; + //$linkval = $e->has($contained_entity_name) ? $e->$contained_entity_name->$name_field_label : $fval; + if ($e->has($contained_entity_name)) { + if ( isset($fields_names[$fname]['improved']) ) { + $fk_field = $fields_names[$fname]['improved']; + $linkval = $e->$fk_field; + } + else + $linkval = $e->$contained_entity_name->$name_field_label; + } + else $linkval = $fval; //echo $this->Html->link($fval, ['controller' => $controller_name, 'action' => 'view', $e->sur_category->id]); echo $this->Html->link($linkval, ['controller' => $controller_name, 'action' => 'view', $fval]); /* diff --git a/src/Template/Common/view.ctp b/src/Template/Common/view.ctp index 0feb0c1..4eed7b7 100755 --- a/src/Template/Common/view.ctp +++ b/src/Template/Common/view.ctp @@ -32,6 +32,9 @@ $entity = $entity; //debug($entity); //$parent_entity_infos=$parent_entity_infos; $parent_entities_infos = $parent_entities_infos; +//$parent_entities_infos['groupes_thematique_id']['improved'] = 'groupe_thematique_with_resp'; +//$parent_entities_infos['groupes_metier_id']['improved'] = 'groupe_metier_with_resp'; +//debug($parent_entities_infos); $fields_label = $fields_label; /* $parent_entity_controller_name = $parent_entity_controller_name; @@ -49,6 +52,7 @@ $entity_name = $entity_name; // Liste des entités à afficher (en tant qu'entité associée) : // En général, par défaut : "Matériels associés" et "Utilisateurs associés" $child_entities_list = $child_entities_list; +$excluded = $excluded; // OPTIONNELS if (isset($sub_controller)) { @@ -130,13 +134,15 @@ if (isset($sub_controller)) { //debug($fields_label); //debug($parent_entities_infos); foreach ($entity->toArray() as $fname=>$fval) { + if (in_array($fname, $excluded)) continue; if ( $fval!==null && $fname!='id' && $fname!='description' && !is_array($fval) ) { //debug($fname); //debug($fval); $flabel = ucfirst($fields_label[$fname]); $fvalue = $fval; // Si le champ n'est pas une FK (terminant par '_id') => on l'affiche directement - if ( strpos($fname,'_id') !== strlen($fname)-3 ) + //if ( strpos($fname,'_id') !== strlen($fname)-3 ) + if ( substr($fname,-3)!='_id' ) $this->MyHelper->displayTableRowLabelAndValue(__($flabel), h($fvalue)); // Si le champ est une FK => on récupère la valeur du 'contained' else { @@ -146,7 +152,11 @@ if (isset($sub_controller)) { $fk_contained_name = $parent_entity_infos['fk_contained_name']; //debug($fk_contained_name); //$fvalue = $associated_entity_infos['name']; - $fvalue = $entity->$fk_contained_name->nom; + + //$fvalue = $entity->$fk_contained_name->nom; + $fk_field = isset($parent_entity_infos['improved']) ? $parent_entity_infos['improved'] : null; + $fvalue = $fk_field ? $entity->$fk_field : $entity->$fk_contained_name->nom; + $this->MyHelper->displayTableRowLabelAndValue( __(ucfirst($parent_entity_infos['type_name'])), //$category->has('sur_category') ? $this->Html->link($category->sur_category->nom, [ diff --git a/src/Template/Users/view.ctp b/src/Template/Users/view.ctp index e4337a4..237bcff 100755 --- a/src/Template/Users/view.ctp +++ b/src/Template/Users/view.ctp @@ -1,102 +1,2 @@ - - -
-

Détail utilisateur

- - - - - - - - Html->link(__(' Editer cet utilisateur'), [ - 'action' => 'edit', - $user->id - ], [ - 'style' => 'margin-right: 40px; display: inline-block', - 'escape' => false, - 'onclick' => 'return true;' - ]); - /* - * (EP 3/6/19) - * Voir ma remarque dans la vue edit.ctp - * La table users n'est qu'un CACHE du LDAP ou du fake ldap (pas d'autre alternative). - * 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) - */ - echo $this->Form->postLink(__(' Supprimer cet utilisateur'), [ - 'action' => 'delete', - $user->id - ], [ - 'style' => 'display: inline-block;', - 'escape' => false, - 'confirm' => __('Êtes-vous sur de vouloir supprimer ?', $user->nom) - ]); - } - - $displayElement(__('Nom'), h($user->nom)); - $displayElement(__('Login'), h($user->username)); - $displayElement(__('Email'), h($user->email)); - $displayElement(__('Rôle'), h($user->role)); - - // Groupes métier et thématique - foreach (['metier','thematique'] as $ftype) { - //$ftype = 'thematique'; - $fname = 'groupes_'.$ftype; - $fname_sing = 'groupe_'.$ftype; - $fname_isresp = 'is_resp_'.$fname; - $fname_conf = 'nom_'.$fname_sing; - $control = 'Groupes'.ucfirst($ftype).'s'; - if ($user->has($fname)) { - $group_name = $user->$fname->nom; - if ($user->$fname_isresp) $group_name .= ' (responsable)'; - $displayElement(__($configuration->$fname_conf), $this->Html->link($group_name, [ - 'controller' => $control, - 'action' => 'view', - $user->$fname->id - ])); - } - } - /* - if ($user->has('groupes_metier')) { - $groupe_metier = $user->groupes_metier->nom; - if ($user->is_resp_groupe_metier) $groupe_metier .= ' (responsable)'; - $displayElement(__($configuration->nom_groupe_metier), $this->Html->link($groupe_metier, [ - 'controller' => 'GroupesMetiers', - 'action' => 'view', - $user->groupes_metier->id - ])); - } - $displayElement(__($configuration->nom_groupe_metier), $user->has('groupes_metier') ? $this->Html->link($user->groupes_metier->nom, [ - 'controller' => 'GroupesMetiers', - 'action' => 'view', - $user->groupes_metier->id - ]) : ''); - $displayElement(__('Responsable groupe'), h($user->is_resp_groupe_metier)); - */ - - if ( $user->has('sur_categorie_id') ) $displayElement(__('Domaine'), - $this->Html->link($user->sur_category->nom, [ - 'controller' => 'SurCategories', - 'action' => 'view', - $user->sur_category->id - ])); - - ?> - -
-
- - \ No newline at end of file +extend('/Common/view'); \ No newline at end of file -- libgit2 0.21.2