From 0693869412df4c2f419e22db467b9d56fa61537e Mon Sep 17 00:00:00 2001 From: Etienne Pallier Date: Fri, 12 Nov 2021 19:49:17 +0100 Subject: [PATCH] Vue liste projets (index) générique + amélioration liste générique --- CHANGELOG | 21 ++++++++++++++------- README.md | 4 ++-- src/Controller/AppController.php | 12 ++++++++---- src/Controller/EmpruntsController.php | 43 +++++++++++++++++++++++++++++++++++++++---- src/Controller/ProjetsController.php | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++--------------------------- src/Controller/StatsController.php | 15 ++++++++++++++- src/Controller/UsersController.php | 6 +++--- src/Template/Common/index_gen.ctp | 47 ++++++++++++++++++++++++++++++++++------------- src/Template/Documents/index.ctp | 47 +++++++++++++++++++++++++++++++++++++---------- src/Template/Materiels/view.ctp | 4 ++++ src/Template/Projets/index.ctp | 113 +++++++++++------------------------------------------------------------------------------------------------------ src/Template/Users/index.ctp | 1 + 12 files changed, 218 insertions(+), 173 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index fa39bd3..f6ab3a4 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -525,25 +525,22 @@ TODO : - *) Stats de connexion - - le tri des autres colonnes ne marche plus +- emprunts/index generique - documents/index generique -- emprunts/index generic -- projets/index generic + - ProjetsController minimaliste, doit juste étendre AppController avec un minimum de changement - add_edit generic - 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 ======= NEXT ======= -user : ne doit pas voir boutons edit/delete sur autres listes - view générique à utiliser pour plusieurs entités print etiquette pour les 2 serveurs + tester fin garantie orange @@ -551,6 +548,16 @@ print etiquette pour les 2 serveurs + tester fin garantie orange ======= CHANGES ======= ------- +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 + - (b) Bugfix download doc attaché (sur vue index) + - (e) Améliorations des listes génériques : + - 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 - (i) détermination automatique des noms de colonnes des FK dans les listes (index) génériques diff --git a/README.md b/README.md index bcacea3..ff62ae9 100644 --- a/README.md +++ b/README.md @@ -52,8 +52,8 @@ Logiciel testé et validé sur les configurations suivantes : -------------------------------------------------------------------------------------------- -Date: 11/11/2021 -Version: v5.2.29-3.7.9 +Date: 12/11/2021 +Version: v5.2.30-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 4e6351c..15e08fa 100755 --- a/src/Controller/AppController.php +++ b/src/Controller/AppController.php @@ -2163,8 +2163,10 @@ class AppController extends Controller $fk_controller_name = $infos['controller_name']; //$fk_controller_instance = new $fk_controller_name; $fk_controller_instance = $this->getControllerInstanceForName($fk_controller_name); - $nice_name = ucwords($fk_controller_instance->getNiceNameSingularLowerCase()); - $fields_names[$fname]['nice_name'] = $nice_name; + if (!isset($fields_names[$fname]['nice_name'])) $fields_names[$fname]['nice_name'] = ucwords($fk_controller_instance->getNiceNameSingularLowerCase()); + $fields_names[$fname]['name_field_label'] = $fk_controller_instance->getNameFieldLabel(); + + // getRealControllerNameForAlias } } $controller_name = $this->getName(); @@ -2189,7 +2191,8 @@ class AppController extends Controller //'limit' => 20, 'limit' => $limit, ]; - if ($sortBy) $this->paginate['order'] = [$sortBy => 'asc']; + //if ($sortBy) $this->paginate['order'] = [$sortBy => 'asc']; + if ($sortBy) $this->paginate['order'] = is_array($sortBy) ? $sortBy : [$sortBy => 'asc']; if ($sortWhitelist) $this->paginate['sortWhitelist'] = array_values($sortWhitelist); //$categories = $this->paginate($this->Categories); @@ -2213,7 +2216,8 @@ class AppController extends Controller // Nb total entités total $this->set('nb_entities', $this->$controller_name->find()->count()); - $CAN_ADD = $this->isAuthorizedActionForCurrentUser('add'); + $CAN_ADD = true; + //$CAN_ADD = $this->isAuthorizedActionForCurrentUser('add'); $this->set(compact( 'CAN_ADD', diff --git a/src/Controller/EmpruntsController.php b/src/Controller/EmpruntsController.php index ed70412..784d8bd 100755 --- a/src/Controller/EmpruntsController.php +++ b/src/Controller/EmpruntsController.php @@ -220,20 +220,53 @@ class EmpruntsController extends AppController public function index() { /* + $contains = [ + 'Materiels', + 'Sites' + ]; + + $sortWhitelist = [ + 'nom' => 'nom', + 'email' => 'email', + 'role' => 'role', + 'groupes_thematique_id' => 'GroupesThematiques.nom', + 'groupes_metier_id' => 'GroupesMetiers.nom', + 'sur_categorie_id' => 'SurCategories.nom', + ]; + $this->index_generic( 'prêts', [ + 'id'=>['nice_name'=>'intitulé'], //'nom'=>['nice_name'=>'Nom'], 'materiel_id'=>[ - 'nice_name'=>'Materiel', + //'nice_name'=>'Materiel', 'contained_entity_name'=>'materiel', - 'controller_name'=>'Materiels' + 'controller_name'=>'Materiels', + ], + 'emprunt_interne'=>[ + 'nice_name'=>'type', + 'bool_values'=>['interne','externe'], + ], + 'date_emprunt'=>['nice_name'=>'date emprunt'], + 'date_retour_emprunt'=>['nice_name'=>'date retour'], + 'nom_emprunteur'=>['nice_name'=>'emprunteur'], + 'site_id'=>[ + 'contained_entity_name'=>'site', + 'controller_name'=>'Sites', ], ], - ['Materiels', 'Sites'] + $contains, + false, true + /S + $orderby, + $conditions, + $sortWhitelist, + $limit + S/ ); */ - + $this->paginate = [ 'contain' => [ 'Materiels', @@ -247,9 +280,11 @@ class EmpruntsController extends AppController ->count()); $this->set(compact('emprunts')); + /* (EP) utile seulement pour json $this->set('_serialize', [ 'emprunts' ]); + */ } /* diff --git a/src/Controller/ProjetsController.php b/src/Controller/ProjetsController.php index 9edc364..cb6e209 100644 --- a/src/Controller/ProjetsController.php +++ b/src/Controller/ProjetsController.php @@ -43,30 +43,67 @@ class ProjetsController extends AppController { */ public function index() { - /* + $lab_website_urls = ($this->confLabinvent->labNameShort != 'IRAP') ? + [] + : + [ + 'Projets Instrumentaux' => 'https://www.irap.omp.eu/sedoo-project-tag/projets_instrumentaux', + 'Projets Scientifiques' => 'https://www.irap.omp.eu/sedoo-project-tag/projets-scientifiques', + 'Projets R&T' => 'https://www.irap.omp.eu/sedoo-project-tag/rt', + 'Projets financés (ANR, Europe...)' => 'https://www.irap.omp.eu/observation-instrumentation/projets/projets-finances', + ]; + + $this->set(compact('lab_website_urls')); + + $sortWhitelist = [ + 'nom' => 'nom', + 'groupes_thematique_id' => 'GroupesThematiques.nom', + 'chef_science_id' => 'ChefSciences.nom', + 'chef_projet_id' => 'ChefProjets.nom', + 'date_start' => 'date_start', + 'date_stop' => 'date_stop', + ]; + + $contains = ['GroupesThematiques', 'ChefSciences', 'ChefProjets']; + $this->index_generic( 'projets', [ - //'nom'=>['nice_name'=>'Nom'], + 'nom'=>[], //'sur_categorie_id'=>['nice_name'=>'Domaine', 'contained_entity_name'=>'sur_category', 'controller_name'=>'SurCategories'], 'groupes_thematique_id'=>[ - 'nice_name'=>'Groupe thématique', + //'nice_name'=>'Groupe thématique', 'contained_entity_name'=>'groupes_thematique', 'controller_name'=>'GroupesThematiques', - 'sort_name' => 'GroupesThematiques.nom' + //'sort_name' => 'GroupesThematiques.nom' ], - 'user_id'=>[ + //'user_id'=>[ + 'chef_science_id'=>[ 'nice_name'=>'Responsable Scientifique', 'contained_entity_name'=>'chef_science', - 'controller_name'=>'ChefSciences', - 'sort_name' => 'ChefSciences.nom' + //'controller_name'=>'ChefSciences', + 'controller_name'=>'Users', + //'sort_name' => 'ChefSciences.nom' + ], + 'chef_projet_id'=>[ + 'nice_name'=>'Chef Projet', + 'contained_entity_name'=>'chef_projet', + //'controller_name'=>'ChefSciences', + 'controller_name'=>'Users', + //'sort_name' => 'ChefProjets.nom' ], + 'date_start'=>['nice_name'=>'Date début'], + 'date_stop'=>['nice_name'=>'Date fin'], + ], - ['GroupesThematiques', 'ChefSciences', 'ChefProjets'] + $contains, + true, true, + 'nom', + [], + $sortWhitelist ); - return; - */ - + + /* // https://book.cakephp.org/3/fr/controllers/components/pagination.html $this->paginate = [ //'contain' => ['GroupesThematiques', 'Pis', 'Pms'] @@ -81,11 +118,11 @@ class ProjetsController extends AppController { 'date_stop', ], 'limit' => 20, - /* + /S 'order' => [ 'Users.nom' => 'asc' ] - */ + S/ ]; $projets = $this->paginate(); @@ -94,20 +131,7 @@ class ProjetsController extends AppController { // Si on est sur l'instance de l'IRAP (InventIrap) // on affiche l'url vers la page des Groupes métiers sur le site web de l'IRAP - /* - $lab_website_urls = ($this->confLabinvent->labNameShort != 'IRAP') ? - [] - : - */ - $lab_website_urls = - [ - 'Projets Instrumentaux' => 'https://www.irap.omp.eu/sedoo-project-tag/projets_instrumentaux', - 'Projets Scientifiques' => 'https://www.irap.omp.eu/sedoo-project-tag/projets-scientifiques', - 'Projets R&T' => 'https://www.irap.omp.eu/sedoo-project-tag/rt', - 'Projets financés (ANR, Europe...)' => 'https://www.irap.omp.eu/observation-instrumentation/projets/projets-finances', - ]; - - $this->set(compact('projets', 'lab_website_urls')); + */ } /** diff --git a/src/Controller/StatsController.php b/src/Controller/StatsController.php index cda0715..8df56a9 100644 --- a/src/Controller/StatsController.php +++ b/src/Controller/StatsController.php @@ -35,6 +35,17 @@ class StatsController extends AppController $connex_dur_tot_avg = round($connex_dur_tot_tot / $connex_nb_tot); $this->set(compact('connex_nb_year_avg', 'connex_dur_tot_avg')); + $sortWhitelist = [ + 'year' => 'year', + 'user_id' => 'Users.nom', + 'last_login_time' => 'last_login_time', + 'last_connex_dur' => 'last_connex_dur', + 'last_logout_time' => 'last_logout_time', + 'connex_dur_tot' => 'connex_dur_tot', + 'connex_nb' => 'connex_nb', + //'connexDurAvg' => 'connexDurAvg', + ]; + $this->index_generic( 'statistiques de connexion', [ @@ -54,7 +65,9 @@ class StatsController extends AppController ], ['Users'], false, false, - 'last_login_time' + ['last_login_time' => 'desc'], + [], + $sortWhitelist ); /* diff --git a/src/Controller/UsersController.php b/src/Controller/UsersController.php index 303501f..346ff60 100755 --- a/src/Controller/UsersController.php +++ b/src/Controller/UsersController.php @@ -573,15 +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', ], 'groupes_metier_id'=>[ //'nice_name'=>'Groupe Métier', - 'contained_entity_name'=>'groupes_metier', 'controller_name'=>'GroupesMetiers' + 'contained_entity_name'=>'groupes_metier', 'controller_name'=>'GroupesMetiers', ], 'sur_categorie_id'=>[ //'nice_name'=>'Domaine', - 'contained_entity_name'=>'sur_category', 'controller_name'=>'SurCategories' + 'contained_entity_name'=>'sur_category', 'controller_name'=>'SurCategories', ], ], $contains, diff --git a/src/Template/Common/index_gen.ctp b/src/Template/Common/index_gen.ctp index fcfb56a..a690576 100755 --- a/src/Template/Common/index_gen.ctp +++ b/src/Template/Common/index_gen.ctp @@ -74,10 +74,13 @@ if (empty($fields_names['nom'])) $fields_names['nom'] = ['nice_name'=>'Nom']; // Joli nom pour le titre de la colonne (nice name) $nice_name = isset($infos['nice_name']) ? $infos['nice_name'] : $fname; if ( in_array($fname, array_keys($sortWhitelist)) ) $fname = $sortWhitelist[$fname]; - echo "".$this->Paginator->sort($fname, ucfirst($nice_name)).""; + /* + $sort_name = isset($infos['sort_name']) ? $infos['sort_name'] : $fname; + echo "".$this->Paginator->sort($sort_name, ucfirst($nice_name)).""; + */ + echo "".$this->Paginator->sort($fname, ucfirst($nice_name)).""; } ?> - @@ -132,21 +135,35 @@ 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", on l'affiche comme un lien - elseif ($fname == 'nom') + // - 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) ) - echo $fval ? "Oui" : "Non"; - // - Si le champ n'est pas une FK (terminant par '_id') => on l'affiche directement - elseif ( strpos($fname,'_id') !== strlen($fname)-3 ) - echo $fval; - // Si le champ est une FK => on récupère la valeur du 'contained' - else { + //elseif ( (substr($fname,0,3)=='is_') && ($fval===false || $fval===true) ) + elseif ( + ( substr($fname,0,3)=='is_' || isset($infos['bool_values']) ) + && + ( $fval==false || $fval==true ) + ) { + $bool_values = isset($infos['bool_values']) ? $infos['bool_values'] : ['Oui','Non']; + //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' ) { + + //var_dump($fname); //$fval = $e->has('sur_category') ? $e->sur_category->nom : $fval; + // ex: materiel $contained_entity_name = $fields_names[$fname]['contained_entity_name']; + // ex: Materiels $controller_name = $fields_names[$fname]['controller_name']; - $linkval = $e->has($contained_entity_name) ? $e->$contained_entity_name->nom : $fval; + //$linkval = $e->has($contained_entity_name) ? $e->$contained_entity_name->nom : $fval; + $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; //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]); /* @@ -170,7 +187,11 @@ if (empty($fields_names['nom'])) $fields_names['nom'] = ['nice_name'=>'Nom']; ]) ); */ - } + } // FK + // - Sinon, champ quelconque => on l'affiche directement + else + echo $fval; + echo ""; } // foreach entity fields ?> diff --git a/src/Template/Documents/index.ctp b/src/Template/Documents/index.ctp index 8921474..e320b6f 100755 --- a/src/Template/Documents/index.ctp +++ b/src/Template/Documents/index.ctp @@ -1,4 +1,10 @@ + + +
Liste des documents'; ?> @@ -27,20 +33,41 @@ foreach ($documents as $document) :
photo) { - echo $this->Form->postLink(__(''), '/webroot/img/photos/' . $document->id . '.' . $document->type_doc, [ + + if (in_array($document->type_doc, $photo_formats)) { + // TODO: $echoActionButton() + //echo $this->Html->link(__(''), '/webroot/img/photos/' . $document->materiel_id .'_' . $document->nom.'_'. $document->id . '.' . $document->type_doc, [ + echo $this->Html->link(__(''), '/img/photos/' . $document->materiel_id .'_' . $document->nom.'_'. $document->id . '.' . $document->type_doc, [ 'title' => 'Télécharger', - 'style' => 'margin: 0 2px', + 'style' => 'margin:0', 'escape' => false - ]); - } else { - echo $this->Form->postLink(__(''), '/webroot/files/' . $document->id . '.' . $document->type_doc, [ + ]); + // - autre doc (pdf...) from files/ + } + else { + //echo $this->Html->link(__(''), '/webroot/files/' . $document->materiel_id .'_' . $document->nom.'_'. $document->id . '.' . $document->type_doc, [ + echo $this->Html->link(__(''), '/files/' . $document->materiel_id .'_' . $document->nom.'_'. $document->id . '.' . $document->type_doc, [ 'title' => 'Télécharger', - 'style' => 'margin: 0 2px', + 'style' => 'margin:0', 'escape' => false - ]); - } - ?> + ]); + } + /* + if ($document->photo) { + echo $this->Form->postLink(__(''), '/webroot/img/photos/' . $document->id . '.' . $document->type_doc, [ + 'title' => 'Télécharger', + 'style' => 'margin: 0 2px', + 'escape' => false + ]); + } else { + echo $this->Form->postLink(__(''), '/webroot/files/' . $document->id . '.' . $document->type_doc, [ + 'title' => 'Télécharger', + 'style' => 'margin: 0 2px', + 'escape' => false + ]); + } + */ + ?> Html->link(__(''), ['action' => 'edit', $document->id], ['title' => 'Editer', 'style' => 'margin: 0 2px', 'escape' => false]) ?> Form->postLink(__(''), ['action' => 'delete', $document->id], ['title' => 'Supprimer', 'style' => 'margin: 0 2px', 'escape' => false, 'confirm' => __('Êtes-vous sur de vouloir supprimer {0} ?', $document->nom)]) ?> diff --git a/src/Template/Materiels/view.ctp b/src/Template/Materiels/view.ctp index 6f32660..1767ed6 100755 --- a/src/Template/Materiels/view.ctp +++ b/src/Template/Materiels/view.ctp @@ -1145,12 +1145,16 @@ $CAN_PRINT_LABEL = $IS_VALIDATED && $configuration->hasPrinter && $USER_IS_ADMIN ?> + + + + documents as $document) : ?> diff --git a/src/Template/Projets/index.ctp b/src/Template/Projets/index.ctp index 6779188..6f526cc 100644 --- a/src/Template/Projets/index.ctp +++ b/src/Template/Projets/index.ctp @@ -1,106 +1,15 @@ - -Html->link(__('Nouveau Projet'), ['action' => 'add']) ?> -
-
- - -
-

- - $lab_website_url) - echo "=> $type_projet sur le site web du laboratoire
"; +// Create the list_header block. +$this->start('list_header'); +//$lab_website_urls = []; +// Si une url (ou liste d'urls) est donnée vers la/les page(s) des Projets sur le site web du labo, on l'affiche +if ($lab_website_urls) { + foreach ($lab_website_urls as $type_projet=>$lab_website_url) + echo "=> $type_projet sur le site web du laboratoire
"; echo "
"; - } - ?> - - -
+} +// end of block list_header +$this->end(); - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Paginator->sort('nom') ?>Paginator->sort('GroupesThematiques.nom', 'Groupe thématique') ?>Paginator->sort('ChefSciences.nom', 'Responsable scientifique') ?>Paginator->sort('ChefProjets.nom', 'Chef de projet') ?>Paginator->sort('date_start', 'Date début') ?>Paginator->sort('date_stop', 'Date fin') ?>
- Html->link(__(''), ['action' => 'edit', $projet->id], ['title' => 'Editer', 'style' => 'margin: 0 2px', 'escape' => false ]); - //if (in_array($role, ['Super Administrateur'])) - echo $this->Form->postLink(__(''), ['action' => 'delete', $projet->id], ['title' => 'Supprimer', 'style' => 'margin: 0 2px', 'escape' => false, 'confirm' => __('Êtes-vous sur de vouloir supprimer # {0}?', $projet->id)]); - ?> - Html->link($projet->nom, ['action' => 'view', $projet->id]) ?>has('groupes_thematique') ? - $this->Html->link($projet->groupes_thematique->nom, ['controller' => 'GroupesThematiques', 'action' => 'view', $projet->groupes_thematique_id]) - : '' ?> - has('chef_science_id') ? $this->Html->link($projet->chef_science->nom, ['controller' => 'Users', 'action' => 'view', $projet->chef_science_id]) : '' ?>has('chef_projet_id') ? $this->Html->link($projet->chef_projet->nom, ['controller' => 'Users', 'action' => 'view', $projet->chef_projet_id]) : '' ?>date_start) ?>date_stop) ?>
-
-
    - Paginator->first('<< ' . __('first')) ?> - Paginator->prev('< ' . __('previous')) ?> - Paginator->numbers() ?> - Paginator->next(__('next') . ' >') ?> - Paginator->last(__('last') . ' >>') ?> -
-

Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

-
- +$this->extend('/Common/index_gen'); \ No newline at end of file diff --git a/src/Template/Users/index.ctp b/src/Template/Users/index.ctp index 00f3a5f..51b3d6c 100755 --- a/src/Template/Users/index.ctp +++ b/src/Template/Users/index.ctp @@ -23,6 +23,7 @@ echo $this->Html->link($link, [ ]); echo "

"; +// end of block list_header $this->end(); -- libgit2 0.21.2