Commit 0693869412df4c2f419e22db467b9d56fa61537e

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

Vue liste projets (index) générique + amélioration liste générique

Et aussi :
- Amélioration vue des Stats de connexion : le tri des colonnes est
maintenant ok
- Bugfix download doc attaché (sur vue index)
- 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

v5.2.30-3.7.9
CHANGELOG
... ... @@ -525,25 +525,22 @@ TODO :
525 525  
526 526  
527 527  
528   - *) Stats de connexion
529   - - le tri des autres colonnes ne marche plus
530 528  
531 529  
  530 +- emprunts/index generique
532 531 - documents/index generique
533   -- emprunts/index generic
534   -- projets/index generic
  532 +
535 533 - ProjetsController minimaliste, doit juste étendre AppController avec un minimum de changement
536 534  
537 535 - add_edit generic
538 536  
539 537 - fusionner groupe thematique et metier (et projet ?)
540 538  
541   -
  539 +- 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
542 541  
543 542 ======= NEXT =======
544 543  
545   -user : ne doit pas voir boutons edit/delete sur autres listes
546   -
547 544 view générique à utiliser pour plusieurs entités
548 545  
549 546 print etiquette pour les 2 serveurs + tester fin garantie orange
... ... @@ -551,6 +548,16 @@ print etiquette pour les 2 serveurs + tester fin garantie orange
551 548 ======= CHANGES =======
552 549  
553 550 -------
  551 +12/11/2021 v5.2.30-3.7.9
  552 + - (e) Refactorisation : Vue liste projets (index) générique
  553 + - (e) Amélioration vue des Stats de connexion : le tri des colonnes est maintenant ok
  554 + - (b) Bugfix download doc attaché (sur vue index)
  555 + - (e) Améliorations des listes génériques :
  556 + - tri par défaut amélioré
  557 + - bugfix label du champ 'nom'
  558 + - généralisation de l'affichage des booleens
  559 +
  560 +-------
554 561 12/11/2021 v5.2.29-3.7.9
555 562 - (b) Bugfix label (configurable) des groupes métier et thématique : maintenant ok dans toutes les vues
556 563 - (i) détermination automatique des noms de colonnes des FK dans les listes (index) génériques
... ...
README.md
... ... @@ -52,8 +52,8 @@ Logiciel testé et validé sur les configurations suivantes :
52 52  
53 53 --------------------------------------------------------------------------------------------
54 54  
55   -Date: 11/11/2021
56   -Version: v5.2.29-3.7.9
  55 +Date: 12/11/2021
  56 +Version: v5.2.30-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
... ... @@ -2163,8 +2163,10 @@ class AppController extends Controller
2163 2163 $fk_controller_name = $infos['controller_name'];
2164 2164 //$fk_controller_instance = new $fk_controller_name;
2165 2165 $fk_controller_instance = $this->getControllerInstanceForName($fk_controller_name);
2166   - $nice_name = ucwords($fk_controller_instance->getNiceNameSingularLowerCase());
2167   - $fields_names[$fname]['nice_name'] = $nice_name;
  2166 + if (!isset($fields_names[$fname]['nice_name'])) $fields_names[$fname]['nice_name'] = ucwords($fk_controller_instance->getNiceNameSingularLowerCase());
  2167 + $fields_names[$fname]['name_field_label'] = $fk_controller_instance->getNameFieldLabel();
  2168 +
  2169 + // getRealControllerNameForAlias
2168 2170 }
2169 2171 }
2170 2172 $controller_name = $this->getName();
... ... @@ -2189,7 +2191,8 @@ class AppController extends Controller
2189 2191 //'limit' => 20,
2190 2192 'limit' => $limit,
2191 2193 ];
2192   - if ($sortBy) $this->paginate['order'] = [$sortBy => 'asc'];
  2194 + //if ($sortBy) $this->paginate['order'] = [$sortBy => 'asc'];
  2195 + if ($sortBy) $this->paginate['order'] = is_array($sortBy) ? $sortBy : [$sortBy => 'asc'];
2193 2196 if ($sortWhitelist) $this->paginate['sortWhitelist'] = array_values($sortWhitelist);
2194 2197  
2195 2198 //$categories = $this->paginate($this->Categories);
... ... @@ -2213,7 +2216,8 @@ class AppController extends Controller
2213 2216 // Nb total entités total
2214 2217 $this->set('nb_entities', $this->$controller_name->find()->count());
2215 2218  
2216   - $CAN_ADD = $this->isAuthorizedActionForCurrentUser('add');
  2219 + $CAN_ADD = true;
  2220 + //$CAN_ADD = $this->isAuthorizedActionForCurrentUser('add');
2217 2221  
2218 2222 $this->set(compact(
2219 2223 'CAN_ADD',
... ...
src/Controller/EmpruntsController.php
... ... @@ -220,20 +220,53 @@ class EmpruntsController extends AppController
220 220 public function index()
221 221 {
222 222 /*
  223 + $contains = [
  224 + 'Materiels',
  225 + 'Sites'
  226 + ];
  227 +
  228 + $sortWhitelist = [
  229 + 'nom' => 'nom',
  230 + 'email' => 'email',
  231 + 'role' => 'role',
  232 + 'groupes_thematique_id' => 'GroupesThematiques.nom',
  233 + 'groupes_metier_id' => 'GroupesMetiers.nom',
  234 + 'sur_categorie_id' => 'SurCategories.nom',
  235 + ];
  236 +
223 237 $this->index_generic(
224 238 'prêts',
225 239 [
  240 + 'id'=>['nice_name'=>'intitulé'],
226 241 //'nom'=>['nice_name'=>'Nom'],
227 242 'materiel_id'=>[
228   - 'nice_name'=>'Materiel',
  243 + //'nice_name'=>'Materiel',
229 244 'contained_entity_name'=>'materiel',
230   - 'controller_name'=>'Materiels'
  245 + 'controller_name'=>'Materiels',
  246 + ],
  247 + 'emprunt_interne'=>[
  248 + 'nice_name'=>'type',
  249 + 'bool_values'=>['interne','externe'],
  250 + ],
  251 + 'date_emprunt'=>['nice_name'=>'date emprunt'],
  252 + 'date_retour_emprunt'=>['nice_name'=>'date retour'],
  253 + 'nom_emprunteur'=>['nice_name'=>'emprunteur'],
  254 + 'site_id'=>[
  255 + 'contained_entity_name'=>'site',
  256 + 'controller_name'=>'Sites',
231 257 ],
232 258 ],
233   - ['Materiels', 'Sites']
  259 + $contains,
  260 + false, true
  261 + /S
  262 + $orderby,
  263 + $conditions,
  264 + $sortWhitelist,
  265 + $limit
  266 + S/
234 267 );
235 268 */
236   -
  269 +
237 270 $this->paginate = [
238 271 'contain' => [
239 272 'Materiels',
... ... @@ -247,9 +280,11 @@ class EmpruntsController extends AppController
247 280 ->count());
248 281  
249 282 $this->set(compact('emprunts'));
  283 + /* (EP) utile seulement pour json
250 284 $this->set('_serialize', [
251 285 'emprunts'
252 286 ]);
  287 + */
253 288 }
254 289  
255 290 /*
... ...
src/Controller/ProjetsController.php
... ... @@ -43,30 +43,67 @@ class ProjetsController extends AppController {
43 43 */
44 44 public function index()
45 45 {
46   - /*
  46 + $lab_website_urls = ($this->confLabinvent->labNameShort != 'IRAP') ?
  47 + []
  48 + :
  49 + [
  50 + 'Projets Instrumentaux' => 'https://www.irap.omp.eu/sedoo-project-tag/projets_instrumentaux',
  51 + 'Projets Scientifiques' => 'https://www.irap.omp.eu/sedoo-project-tag/projets-scientifiques',
  52 + 'Projets R&T' => 'https://www.irap.omp.eu/sedoo-project-tag/rt',
  53 + 'Projets financés (ANR, Europe...)' => 'https://www.irap.omp.eu/observation-instrumentation/projets/projets-finances',
  54 + ];
  55 +
  56 + $this->set(compact('lab_website_urls'));
  57 +
  58 + $sortWhitelist = [
  59 + 'nom' => 'nom',
  60 + 'groupes_thematique_id' => 'GroupesThematiques.nom',
  61 + 'chef_science_id' => 'ChefSciences.nom',
  62 + 'chef_projet_id' => 'ChefProjets.nom',
  63 + 'date_start' => 'date_start',
  64 + 'date_stop' => 'date_stop',
  65 + ];
  66 +
  67 + $contains = ['GroupesThematiques', 'ChefSciences', 'ChefProjets'];
  68 +
47 69 $this->index_generic(
48 70 'projets',
49 71 [
50   - //'nom'=>['nice_name'=>'Nom'],
  72 + 'nom'=>[],
51 73 //'sur_categorie_id'=>['nice_name'=>'Domaine', 'contained_entity_name'=>'sur_category', 'controller_name'=>'SurCategories'],
52 74 'groupes_thematique_id'=>[
53   - 'nice_name'=>'Groupe thématique',
  75 + //'nice_name'=>'Groupe thématique',
54 76 'contained_entity_name'=>'groupes_thematique',
55 77 'controller_name'=>'GroupesThematiques',
56   - 'sort_name' => 'GroupesThematiques.nom'
  78 + //'sort_name' => 'GroupesThematiques.nom'
57 79 ],
58   - 'user_id'=>[
  80 + //'user_id'=>[
  81 + 'chef_science_id'=>[
59 82 'nice_name'=>'Responsable Scientifique',
60 83 'contained_entity_name'=>'chef_science',
61   - 'controller_name'=>'ChefSciences',
62   - 'sort_name' => 'ChefSciences.nom'
  84 + //'controller_name'=>'ChefSciences',
  85 + 'controller_name'=>'Users',
  86 + //'sort_name' => 'ChefSciences.nom'
  87 + ],
  88 + 'chef_projet_id'=>[
  89 + 'nice_name'=>'Chef Projet',
  90 + 'contained_entity_name'=>'chef_projet',
  91 + //'controller_name'=>'ChefSciences',
  92 + 'controller_name'=>'Users',
  93 + //'sort_name' => 'ChefProjets.nom'
63 94 ],
  95 + 'date_start'=>['nice_name'=>'Date début'],
  96 + 'date_stop'=>['nice_name'=>'Date fin'],
  97 +
64 98 ],
65   - ['GroupesThematiques', 'ChefSciences', 'ChefProjets']
  99 + $contains,
  100 + true, true,
  101 + 'nom',
  102 + [],
  103 + $sortWhitelist
66 104 );
67   - return;
68   - */
69   -
  105 +
  106 + /*
70 107 // https://book.cakephp.org/3/fr/controllers/components/pagination.html
71 108 $this->paginate = [
72 109 //'contain' => ['GroupesThematiques', 'Pis', 'Pms']
... ... @@ -81,11 +118,11 @@ class ProjetsController extends AppController {
81 118 'date_stop',
82 119 ],
83 120 'limit' => 20,
84   - /*
  121 + /S
85 122 'order' => [
86 123 'Users.nom' => 'asc'
87 124 ]
88   - */
  125 + S/
89 126 ];
90 127  
91 128 $projets = $this->paginate();
... ... @@ -94,20 +131,7 @@ class ProjetsController extends AppController {
94 131  
95 132 // Si on est sur l'instance de l'IRAP (InventIrap)
96 133 // on affiche l'url vers la page des Groupes métiers sur le site web de l'IRAP
97   - /*
98   - $lab_website_urls = ($this->confLabinvent->labNameShort != 'IRAP') ?
99   - []
100   - :
101   - */
102   - $lab_website_urls =
103   - [
104   - 'Projets Instrumentaux' => 'https://www.irap.omp.eu/sedoo-project-tag/projets_instrumentaux',
105   - 'Projets Scientifiques' => 'https://www.irap.omp.eu/sedoo-project-tag/projets-scientifiques',
106   - 'Projets R&T' => 'https://www.irap.omp.eu/sedoo-project-tag/rt',
107   - 'Projets financés (ANR, Europe...)' => 'https://www.irap.omp.eu/observation-instrumentation/projets/projets-finances',
108   - ];
109   -
110   - $this->set(compact('projets', 'lab_website_urls'));
  134 + */
111 135 }
112 136  
113 137 /**
... ...
src/Controller/StatsController.php
... ... @@ -35,6 +35,17 @@ class StatsController extends AppController
35 35 $connex_dur_tot_avg = round($connex_dur_tot_tot / $connex_nb_tot);
36 36 $this->set(compact('connex_nb_year_avg', 'connex_dur_tot_avg'));
37 37  
  38 + $sortWhitelist = [
  39 + 'year' => 'year',
  40 + 'user_id' => 'Users.nom',
  41 + 'last_login_time' => 'last_login_time',
  42 + 'last_connex_dur' => 'last_connex_dur',
  43 + 'last_logout_time' => 'last_logout_time',
  44 + 'connex_dur_tot' => 'connex_dur_tot',
  45 + 'connex_nb' => 'connex_nb',
  46 + //'connexDurAvg' => 'connexDurAvg',
  47 + ];
  48 +
38 49 $this->index_generic(
39 50 'statistiques de connexion',
40 51 [
... ... @@ -54,7 +65,9 @@ class StatsController extends AppController
54 65 ],
55 66 ['Users'],
56 67 false, false,
57   - 'last_login_time'
  68 + ['last_login_time' => 'desc'],
  69 + [],
  70 + $sortWhitelist
58 71 );
59 72  
60 73 /*
... ...
src/Controller/UsersController.php
... ... @@ -573,15 +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', 'controller_name'=>'GroupesThematiques',
577 577 ],
578 578 'groupes_metier_id'=>[
579 579 //'nice_name'=>'Groupe Métier',
580   - 'contained_entity_name'=>'groupes_metier', 'controller_name'=>'GroupesMetiers'
  580 + 'contained_entity_name'=>'groupes_metier', 'controller_name'=>'GroupesMetiers',
581 581 ],
582 582 'sur_categorie_id'=>[
583 583 //'nice_name'=>'Domaine',
584   - 'contained_entity_name'=>'sur_category', 'controller_name'=>'SurCategories'
  584 + 'contained_entity_name'=>'sur_category', 'controller_name'=>'SurCategories',
585 585 ],
586 586 ],
587 587 $contains,
... ...
src/Template/Common/index_gen.ctp
... ... @@ -74,10 +74,13 @@ if (empty($fields_names['nom'])) $fields_names['nom'] = ['nice_name'=>'Nom'];
74 74 // Joli nom pour le titre de la colonne (nice name)
75 75 $nice_name = isset($infos['nice_name']) ? $infos['nice_name'] : $fname;
76 76 if ( in_array($fname, array_keys($sortWhitelist)) ) $fname = $sortWhitelist[$fname];
77   - echo "<th>".$this->Paginator->sort($fname, ucfirst($nice_name))."</th>";
  77 + /*
  78 + $sort_name = isset($infos['sort_name']) ? $infos['sort_name'] : $fname;
  79 + echo "<th>".$this->Paginator->sort($sort_name, ucfirst($nice_name))."</th>";
  80 + */
  81 + echo "<th>".$this->Paginator->sort($fname, ucfirst($nice_name))."</th>";
78 82 }
79 83 ?>
80   -
81 84 </tr>
82 85 </thead>
83 86  
... ... @@ -132,21 +135,35 @@ if (empty($fields_names[&#39;nom&#39;])) $fields_names[&#39;nom&#39;] = [&#39;nice_name&#39;=&gt;&#39;Nom&#39;];
132 135 //var_dump("Y");
133 136 echo $this->MyHelper->$f($fval);
134 137 }
135   - // - Si c'est le champ "nom", on l'affiche comme un lien
136   - elseif ($fname == 'nom')
  138 + // - Si c'est le champ "nom" ou "id", on l'affiche comme un lien
  139 + elseif ($fname == 'nom' || $fname == 'id')
137 140 echo $this->Html->link($fval, ['action' => 'view', $e->id]);
138 141 // - Si le champ est boolean => on affiche oui/non
139   - elseif ( (substr($fname,0,3)=='is_') && ($fval===false || $fval===true) )
140   - echo $fval ? "Oui" : "Non";
141   - // - Si le champ n'est pas une FK (terminant par '_id') => on l'affiche directement
142   - elseif ( strpos($fname,'_id') !== strlen($fname)-3 )
143   - echo $fval;
144   - // Si le champ est une FK => on récupère la valeur du 'contained'
145   - else {
  142 + //elseif ( (substr($fname,0,3)=='is_') && ($fval===false || $fval===true) )
  143 + elseif (
  144 + ( substr($fname,0,3)=='is_' || isset($infos['bool_values']) )
  145 + &&
  146 + ( $fval==false || $fval==true )
  147 + ) {
  148 + $bool_values = isset($infos['bool_values']) ? $infos['bool_values'] : ['Oui','Non'];
  149 + //echo $fval ? "Oui" : "Non";
  150 + echo $fval ? $bool_values[0] : $bool_values[1];
  151 + }
  152 + // - Si le champ est une FK => on récupère la valeur du 'contained'
  153 + //elseif ( strpos($fname,'_id') !== strlen($fname)-3 )
  154 + elseif ( substr($fname,-3) == '_id' ) {
  155 +
  156 + //var_dump($fname);
146 157 //$fval = $e->has('sur_category') ? $e->sur_category->nom : $fval;
  158 + // ex: materiel
147 159 $contained_entity_name = $fields_names[$fname]['contained_entity_name'];
  160 + // ex: Materiels
148 161 $controller_name = $fields_names[$fname]['controller_name'];
149   - $linkval = $e->has($contained_entity_name) ? $e->$contained_entity_name->nom : $fval;
  162 + //$linkval = $e->has($contained_entity_name) ? $e->$contained_entity_name->nom : $fval;
  163 + $name_field_label = $infos['name_field_label']; // 'nom' ou 'designation' ou ...
  164 +
  165 + //$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;
150 167 //echo $this->Html->link($fval, ['controller' => $controller_name, 'action' => 'view', $e->sur_category->id]);
151 168 echo $this->Html->link($linkval, ['controller' => $controller_name, 'action' => 'view', $fval]);
152 169 /*
... ... @@ -170,7 +187,11 @@ if (empty($fields_names[&#39;nom&#39;])) $fields_names[&#39;nom&#39;] = [&#39;nice_name&#39;=&gt;&#39;Nom&#39;];
170 187 ])
171 188 );
172 189 */
173   - }
  190 + } // FK
  191 + // - Sinon, champ quelconque => on l'affiche directement
  192 + else
  193 + echo $fval;
  194 +
174 195 echo "</td>";
175 196 } // foreach entity fields
176 197 ?>
... ...
src/Template/Documents/index.ctp
1 1  
  2 +<?php
  3 +// Documents attachés photo
  4 +$photo_formats = ['png','jpg','jpeg'];
  5 +?>
  6 +
  7 +
2 8 <div class="documents index">
3 9 <?php echo '<h2><i class="icon-list"></i> Liste des documents</h2>'; ?>
4 10 <table style="border-collapse: separate; border-spacing: 0; width: 270px;">
... ... @@ -27,20 +33,41 @@ foreach ($documents as $document) :
27 33 <tr>
28 34 <td class="actions" style="padding: 6px 0; text-align: left;">
29 35 <?php
30   - if ($document->photo) {
31   - echo $this->Form->postLink(__('<i class="icon-download-alt"></i>'), '/webroot/img/photos/' . $document->id . '.' . $document->type_doc, [
  36 +
  37 + if (in_array($document->type_doc, $photo_formats)) {
  38 + // TODO: $echoActionButton()
  39 + //echo $this->Html->link(__('<i class="icon-download-alt"></i>'), '/webroot/img/photos/' . $document->materiel_id .'_' . $document->nom.'_'. $document->id . '.' . $document->type_doc, [
  40 + echo $this->Html->link(__('<i class="icon-download-alt"></i>'), '/img/photos/' . $document->materiel_id .'_' . $document->nom.'_'. $document->id . '.' . $document->type_doc, [
32 41 'title' => 'Télécharger',
33   - 'style' => 'margin: 0 2px',
  42 + 'style' => 'margin:0',
34 43 'escape' => false
35   - ]);
36   - } else {
37   - echo $this->Form->postLink(__('<i class="icon-download-alt"></i>'), '/webroot/files/' . $document->id . '.' . $document->type_doc, [
  44 + ]);
  45 + // - autre doc (pdf...) from files/
  46 + }
  47 + else {
  48 + //echo $this->Html->link(__('<i class="icon-download-alt"></i>'), '/webroot/files/' . $document->materiel_id .'_' . $document->nom.'_'. $document->id . '.' . $document->type_doc, [
  49 + echo $this->Html->link(__('<i class="icon-download-alt"></i>'), '/files/' . $document->materiel_id .'_' . $document->nom.'_'. $document->id . '.' . $document->type_doc, [
38 50 'title' => 'Télécharger',
39   - 'style' => 'margin: 0 2px',
  51 + 'style' => 'margin:0',
40 52 'escape' => false
41   - ]);
42   - }
43   - ?>
  53 + ]);
  54 + }
  55 + /*
  56 + if ($document->photo) {
  57 + echo $this->Form->postLink(__('<i class="icon-download-alt"></i>'), '/webroot/img/photos/' . $document->id . '.' . $document->type_doc, [
  58 + 'title' => 'Télécharger',
  59 + 'style' => 'margin: 0 2px',
  60 + 'escape' => false
  61 + ]);
  62 + } else {
  63 + echo $this->Form->postLink(__('<i class="icon-download-alt"></i>'), '/webroot/files/' . $document->id . '.' . $document->type_doc, [
  64 + 'title' => 'Télécharger',
  65 + 'style' => 'margin: 0 2px',
  66 + 'escape' => false
  67 + ]);
  68 + }
  69 + */
  70 + ?>
44 71 <?= $this->Html->link(__('<i class="icon-pencil"></i>'), ['action' => 'edit', $document->id], ['title' => 'Editer', 'style' => 'margin: 0 2px', 'escape' => false]) ?>
45 72  
46 73 <?= $this->Form->postLink(__('<i class="icon-trash"></i>'), ['action' => 'delete', $document->id], ['title' => 'Supprimer', 'style' => 'margin: 0 2px', 'escape' => false, 'confirm' => __('Êtes-vous sur de vouloir supprimer {0} ?', $document->nom)]) ?>
... ...
src/Template/Materiels/view.ctp
... ... @@ -1145,12 +1145,16 @@ $CAN_PRINT_LABEL = $IS_VALIDATED &amp;&amp; $configuration-&gt;hasPrinter &amp;&amp; $USER_IS_ADMIN
1145 1145 ?>
1146 1146  
1147 1147 <table>
  1148 +
  1149 + <!-- EN-TETES -->
1148 1150 <tr>
1149 1151 <th class="actions"><?=__('')?></th>
1150 1152 <th><?=__('Nom')?></th>
1151 1153 <th><?=__('Type')?></th>
1152 1154 <th><?=__('Miniature')?></th>
1153 1155 </tr>
  1156 +
  1157 + <!-- DATA -->
1154 1158 <?php
1155 1159 foreach ($entity->documents as $document) :
1156 1160 ?>
... ...
src/Template/Projets/index.ctp
1 1 <?php
2   -/**
3   - * @var \App\View\AppView $this
4   - * @var \App\Model\Entity\Projet[]|\Cake\Collection\CollectionInterface $projets
5   - */
6 2  
7   -// Variables définies par le controleur
8   -$projets = $projets;
9   -//debug($projets);
10   -$lab_website_urls = $lab_website_urls;
11   -?>
12   -
13   -<b><u><?= $this->Html->link(__('Nouveau Projet'), ['action' => 'add']) ?></li></u></b>
14   -<br />
15   -<br />
16   -<!--
17   -<nav class="large-3 medium-4 columns" id="actions-sidebar">
18   - <ul class="side-nav">
19   - <li class="heading"><S= __('Actions :') S></li>
20   - <li><S= $this->Html->link(__('New Projet'), ['action' => 'add']) ?></li>
21   - <li><S= $this->Html->link(__('List Groupes Thematiques'), ['controller' => 'GroupesThematiques', 'action' => 'index']) S></li>
22   - <li><S= $this->Html->link(__('New Groupes Thematique'), ['controller' => 'GroupesThematiques', 'action' => 'add']) S></li>
23   - <li><S= $this->Html->link(__('List Users'), ['controller' => 'Users', 'action' => 'index']) ?></li>
24   - <li><S= $this->Html->link(__('New User'), ['controller' => 'Users', 'action' => 'add']) ?></li>
25   - <li><S= $this->Html->link(__('List Materiels'), ['controller' => 'Materiels', 'action' => 'index']) ?></li>
26   - <li><S= $this->Html->link(__('New Materiel'), ['controller' => 'Materiels', 'action' => 'add']) ?></li>
27   - </ul>
28   -</nav>
29   --->
30   -
31   -<div class="projets index large-9 medium-8 columns content">
32   - <h3><?= __('Projets') ?></h3>
33   -
34   - <?php
35   - //$lab_website_urls = [];
36   - // 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
37   - if ($lab_website_urls) {
38   - foreach ($lab_website_urls as $type_projet=>$lab_website_url)
39   - echo "=> <a href=$lab_website_url>$type_projet sur le site web du laboratoire</a><br/>";
  3 +// Create the list_header block.
  4 +$this->start('list_header');
  5 +//$lab_website_urls = [];
  6 +// 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
  7 +if ($lab_website_urls) {
  8 + foreach ($lab_website_urls as $type_projet=>$lab_website_url)
  9 + echo "=> <a href=$lab_website_url>$type_projet sur le site web du laboratoire</a><br/>";
40 10 echo "<br/>";
41   - }
42   - ?>
43   -
44   - <!--
45   - <table cellpadding="0" cellspacing="0">
46   - -->
47   - <table style="border-collapse: separate; border-spacing: 0; width: 270px;">
  11 +}
  12 +// end of block list_header
  13 +$this->end();
48 14  
49   - <thead>
50   - <tr>
51   - <!--
52   - <th scope="col"><S= $this->Paginator->sort('id') ?></th>
53   - -->
54   - <th scope="col" class="actions"><?= __('') ?></th>
55   - <th scope="col"><?= $this->Paginator->sort('nom') ?></th>
56   - <th scope="col"><?= $this->Paginator->sort('GroupesThematiques.nom', 'Groupe thématique') ?></th>
57   - <th scope="col"><?= $this->Paginator->sort('ChefSciences.nom', 'Responsable scientifique') ?></th>
58   - <th scope="col"><?= $this->Paginator->sort('ChefProjets.nom', 'Chef de projet') ?></th>
59   - <th scope="col"><?= $this->Paginator->sort('date_start', 'Date début') ?></th>
60   - <th scope="col"><?= $this->Paginator->sort('date_stop', 'Date fin') ?></th>
61   - </tr>
62   - </thead>
63   -
64   - <tbody>
65   - <?php foreach ($projets as $projet): ?>
66   - <tr>
67   - <td class="actions" style="padding: 6px 0; text-align: left;">
68   - <?php
69   - //if (in_array($role, ['Administration Plus', 'Super Administrateur']))
70   - echo $this->Html->link(__('<i class="icon-pencil"></i>'), ['action' => 'edit', $projet->id], ['title' => 'Editer', 'style' => 'margin: 0 2px', 'escape' => false ]);
71   - //if (in_array($role, ['Super Administrateur']))
72   - echo $this->Form->postLink(__('<i class="icon-trash"></i>'), ['action' => 'delete', $projet->id], ['title' => 'Supprimer', 'style' => 'margin: 0 2px', 'escape' => false, 'confirm' => __('Êtes-vous sur de vouloir supprimer # {0}?', $projet->id)]);
73   - ?>
74   - </td>
75   - <td class="smallText"><?= $this->Html->link($projet->nom, ['action' => 'view', $projet->id]) ?></td>
76   - <!--
77   - <td><S= $this->Number->format($projet->id) ?></td>
78   - <td><S= $this->Number->format($projet->chef_science_id) ?></td>
79   - -->
80   - <td><?= $projet->has('groupes_thematique') ?
81   - $this->Html->link($projet->groupes_thematique->nom, ['controller' => 'GroupesThematiques', 'action' => 'view', $projet->groupes_thematique_id])
82   - : '' ?>
83   - </td>
84   - <td><?= $projet->has('chef_science_id') ? $this->Html->link($projet->chef_science->nom, ['controller' => 'Users', 'action' => 'view', $projet->chef_science_id]) : '' ?></td>
85   - <td><?= $projet->has('chef_projet_id') ? $this->Html->link($projet->chef_projet->nom, ['controller' => 'Users', 'action' => 'view', $projet->chef_projet_id]) : '' ?></td>
86   - <!--
87   - <td><= $projet->has('chef_science_id') ? $this->Html->link($projet->Pi->nom, ['controller' => 'Users', 'action' => 'view', $projet->chef_science_id]) : '' ?></td>
88   - <td><= $projet->has('chef_projet_id') ? $this->Html->link($projet->Pm->nom, ['controller' => 'Users', 'action' => 'view', $projet->chef_projet_id]) : '' ?></td>
89   - -->
90   - <td><?= h($projet->date_start) ?></td>
91   - <td><?= h($projet->date_stop) ?></td>
92   - </tr>
93   - <?php endforeach; ?>
94   - </tbody>
95   - </table>
96   - <div class="paginator">
97   - <ul class="pagination">
98   - <?= $this->Paginator->first('<< ' . __('first')) ?>
99   - <?= $this->Paginator->prev('< ' . __('previous')) ?>
100   - <?= $this->Paginator->numbers() ?>
101   - <?= $this->Paginator->next(__('next') . ' >') ?>
102   - <?= $this->Paginator->last(__('last') . ' >>') ?>
103   - </ul>
104   - <p><?= $this->Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?></p>
105   - </div>
106   -</div>
  15 +$this->extend('/Common/index_gen');
107 16 \ No newline at end of file
... ...
src/Template/Users/index.ctp
... ... @@ -23,6 +23,7 @@ echo $this-&gt;Html-&gt;link($link, [
23 23 ]);
24 24 echo "<br/><br/>";
25 25  
  26 +// end of block list_header
26 27 $this->end();
27 28  
28 29  
... ...