Commit 6f05b56d02ddb2d539e1f1b0dc6f651a76c21ba5

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

Nouveau bouton "Exporter la liste courante"

(sur la vue liste des matériels : materiels/index)

v4.103.25-3.7.9
CHANGES.txt
... ... @@ -13,7 +13,9 @@ CHANGEMENTS
13 13  
14 14  
15 15 -------
16   -30/09/2020 NEWS#4 (v4.103.18-3.7.9) :
  16 +02/10/2020 NEWS#4 (v4.103.25-3.7.9) :
  17 +
  18 +Nouveau bouton "Exporter la liste courante" sur la vue liste des matériels (materiels/index)
17 19  
18 20 Remaniement complet du système de notification :
19 21 => toute action (création, modification, suppression...) faite sur toute entité (Materiel, Document, Suivi, Emprunt, ...)
... ... @@ -119,8 +121,9 @@ Outre ces changements, voici d'autres changements importants :
119 121  
120 122  
121 123 -------
122   -02/10/2020 v4.103.24-3.7.9 (EP)
123   - - (i) Bugfix nom du serveur dans les mails
  124 +02/10/2020 v4.103.25-3.7.9 (EP)
  125 + - (e) Nouveau bouton "Exporter la liste courante" sur la vue liste des matériels (materiels/index)
  126 + - (b) Bugfix nom du serveur dans les mails
124 127  
125 128 -------
126 129 01/10/2020 v4.103.23-3.7.9 (EP)
... ...
README.md
... ... @@ -43,7 +43,7 @@ Logiciel testé et validé sur les configurations suivantes :
43 43 --------------------------------------------------------------------------------------------
44 44  
45 45 Date: 02/10/2020
46   -Version: 4.103.24-3.7.9
  46 +Version: 4.103.25-3.7.9
47 47  
48 48  
49 49 HISTORIQUE DES CHANGEMENTS DE VERSION : voir le fichier CHANGES.txt (ou la page web /pages/changes)
... ...
src/Controller/MaterielsController.php
... ... @@ -873,7 +873,9 @@ class MaterielsController extends AppController {
873 873 $this->myDebug("step 3: MaterielsController.index()");
874 874  
875 875 $conditions = [];
876   - $contain = [];
  876 + //$contain = [];
  877 + $contain = ['Fournisseurs', 'Categories', 'Organismes', 'Projets', 'Users'];
  878 +
877 879  
878 880 // - FILTRE Statut ? (status=CREATED, status=VALIDATED, ...)
879 881 // (EP 202007 OLD way pour gérer les statuts : /materiels/index/VALIDATED)
... ... @@ -995,10 +997,6 @@ class MaterielsController extends AppController {
995 997  
996 998 $config = $this->confLabinvent;
997 999  
998   - $export_current = $this->request->getQuery('exportcurrent');
999   - if ($export_current == 1) {
1000   - debug("export current list");
1001   - }
1002 1000  
1003 1001 /*
1004 1002 * - FILTRE age (tranche d'âge) ?
... ... @@ -1047,6 +1045,7 @@ class MaterielsController extends AppController {
1047 1045 }
1048 1046 */
1049 1047  
  1048 +
1050 1049 // - FILTRE Domaine ?
1051 1050 $domaine_id = $this->request->getQuery('domaine');
1052 1051 // Par défaut, TOUS les domaines (id=0)
... ... @@ -1059,6 +1058,7 @@ class MaterielsController extends AppController {
1059 1058 //$conditions['sur_categorie_id'] = $domain_id;
1060 1059 //debug($conditions);
1061 1060  
  1061 +
1062 1062 // - FILTRE Projet ?
1063 1063 $projet_id = $this->request->getQuery('projet');
1064 1064 // Par défaut, TOUS les domaines (id=0)
... ... @@ -1066,12 +1066,14 @@ class MaterielsController extends AppController {
1066 1066 // Si $domain_id==0 on ne fait rien (car on prend TOUS les domaines)
1067 1067 if ($projet_id > 0) $conditions['Materiels.projet_id'] = $projet_id;
1068 1068  
1069   - // - FILTRE Nb lignes par page ?
  1069 +
  1070 + // - FILTRE (pas vraiment un filtre) Nb lignes par page ?
1070 1071 //$limit = $this->request->getQuery('aff');
1071 1072 $limit = $this->request->getQuery('nblines');
1072 1073 // Par défaut, nb lignes demandées dans config
1073 1074 if ($limit===null) $limit = $config['aff_par_defaut'];
1074 1075  
  1076 + /* SERT À RIEN
1075 1077 $this->paginate = [
1076 1078 'limit' => $limit,
1077 1079 'maxLimit' => 1000,
... ... @@ -1088,6 +1090,7 @@ class MaterielsController extends AppController {
1088 1090 'Materiels.numero_laboratoire' => 'desc'
1089 1091 ]
1090 1092 ];
  1093 + */
1091 1094  
1092 1095  
1093 1096 /*
... ... @@ -1147,9 +1150,10 @@ class MaterielsController extends AppController {
1147 1150 ]
1148 1151 ];
1149 1152 */
1150   - $contain = ['Fournisseurs', 'Categories', 'Organismes', 'Projets'];
  1153 + //$contain = ['Fournisseurs', 'Categories', 'Organismes', 'Projets'];
  1154 + //$contain = ['Fournisseurs', 'Categories', 'Organismes', 'Projets', 'Users'];
1151 1155 //debug($conditions);
1152   - }
  1156 + } // searchfor
1153 1157  
1154 1158  
1155 1159 // EXEC REQUETE SQL find()
... ... @@ -1184,6 +1188,19 @@ class MaterielsController extends AppController {
1184 1188 debug("Mauvais format de requete SQL (1), Exception PDO générée !");
1185 1189 exit;
1186 1190 }
  1191 +
  1192 +
  1193 + // EXPORT DE LA LISTE EN COURS (selon le filtrage en cours)
  1194 + // Attention, l'appel à export() terminera l'action par un EXIT
  1195 + // Donc, cette action stoppe le processus en cours, et la vue ne sera pas réaffichée
  1196 + $export_current = $this->request->getQuery('exportcurrent');
  1197 + if ($export_current == 1) {
  1198 + //debug("export current list");
  1199 + $this->export($materiels);
  1200 + }
  1201 + // STOP
  1202 +
  1203 +
1187 1204 //debug("age=$age, nbMateriels = $nbMateriels");
1188 1205 $this->set(compact('nbMateriels'));
1189 1206  
... ... @@ -1225,7 +1242,14 @@ class MaterielsController extends AppController {
1225 1242 );
1226 1243 */
1227 1244 try {
1228   - $materiels = $this->paginate($materiels);
  1245 + //$materiels = $this->paginate($materiels);
  1246 + $materiels = $this->paginate($materiels, [
  1247 + 'limit' => $limit,
  1248 + 'maxLimit' => 1000,
  1249 + 'order' => [
  1250 + 'Materiels.numero_laboratoire' => 'desc'
  1251 + ]
  1252 + ]);
1229 1253 } catch (\PDOException $e) {
1230 1254 debug("Mauvais format de requete SQL (2), Exception PDO générée !");
1231 1255 exit;
... ... @@ -1303,6 +1327,8 @@ class MaterielsController extends AppController {
1303 1327 */
1304 1328 } // index()
1305 1329  
  1330 +
  1331 +
1306 1332 //@Override
1307 1333 // Pour le MaterielsController, le materiel associé est simplement lui-même :-)
1308 1334 protected function getRelatedMaterielForId($id, $action=null) {
... ... @@ -3315,7 +3341,7 @@ class MaterielsController extends AppController {
3315 3341 * Optional parameter "what:value" may be passed when calling this action, and is read from $this->getAttribute('params')['named']['what']
3316 3342 * ex : materiels/export/what:toValidate
3317 3343 */
3318   - public function export()
  3344 + public function export($materiels_list = null)
3319 3345 {
3320 3346  
3321 3347 function getElementFromList($listName, $materiel, $fkName) {
... ... @@ -3428,47 +3454,17 @@ class MaterielsController extends AppController {
3428 3454  
3429 3455 }
3430 3456  
3431   - /*
3432   - // CAS 2 - EXPORT liste courante
3433   - else if ($this->request->getData('exportCurrent') !== null) {
3434   -
  3457 + // CAS 2 - EXPORT liste courante
  3458 + // (cette fonction export() a été appelée par index())
  3459 + //else if ($this->request->getData('exportcurrent') !== null) {
  3460 + else if ($materiels_list) {
3435 3461 $CAS = 2;
3436 3462 $this->myDebug("IN exportCurrent");
3437   - $what = $this->request->getData('what');
3438   - //debug($what);
3439   -
3440   - $selectedMateriels = [];
3441   - $i = 0;
3442   - //$data = $this->request->getData();
3443   - $data = $this->request->getData();
3444   - //debug($data);exit;
3445   - foreach ($data as $val) {
3446   - if ($val == 1) {
3447   - $selectedMateriels[$i] = key($data);
3448   - $i ++;
3449   - }
3450   - next($data);
3451   - }
3452   -
3453   - $this->myDebug($selectedMateriels);
3454   -
3455   - //if (sizeof($selectedMateriels) > 0) {
3456   - if (! empty($selectedMateriels)) {
3457   - //$materielsTable = TableRegistry::getTableLocator()->get('Materiels');
3458   - //$materiels = $materielsTable->find()
3459   - $materiels = $this->Materiels->find()
3460   - ->contain($contain)
3461   - ->where(['Materiels.id' => $selectedMateriels[0]]);
3462   - for ($j = 0; $j < sizeof($selectedMateriels); $j ++)
3463   - $materiels->orWhere( ['Materiels.id' => $selectedMateriels[$j]] );
3464   - $materiels->order($order);
3465   - }
3466   - $materiels = $this->Materiels->find()
3467   - ->contain($contain)
3468   - ->where(['Materiels.id' => 12003]);
3469   - }
3470   - */
  3463 + $materiels = $materiels_list;
  3464 + //debug($materiels->toArray()); exit;
  3465 + } // CAS 2
3471 3466  
  3467 +
3472 3468 // CAS 3 - EXPORT TOUS les matériels de la BD
3473 3469 else if ($this->request->getData('exportAll') !== null) {
3474 3470 $CAS = 3;
... ... @@ -3619,12 +3615,17 @@ class MaterielsController extends AppController {
3619 3615 "Email responsable"
3620 3616 ];
3621 3617  
3622   - ini_set('max_execution_time', 600);
  3618 +
  3619 + // DEBUG = true => n'envoie pas le fichier, l'affiche seulement
  3620 + $DEBUG=false;
  3621 + //$DEBUG=true;
  3622 +
  3623 + !$DEBUG && ini_set('max_execution_time', 600);
3623 3624  
3624 3625 $filename = 'export_' . date("Y-m-d") . '.csv';
3625   - $csv_file = fopen('php://output', 'w');
  3626 + !$DEBUG && $csv_file = fopen('php://output', 'w');
3626 3627  
3627   - $this->response->header([
  3628 + !$DEBUG && $this->response->header([
3628 3629 // CRAL:
3629 3630 //'Content-Type: text/csv'
3630 3631 'Content-Type: application/csv',
... ... @@ -3632,10 +3633,10 @@ class MaterielsController extends AppController {
3632 3633 //"Content-disposition: attachment; filename=Demande_bureaux_" . date("Ymd").".csv");
3633 3634 'Content-Disposition: attachment; filename="' . $filename . '"'
3634 3635 ]);
3635   - $this->response->sendHeaders();
  3636 + !$DEBUG && $this->response->sendHeaders();
3636 3637  
3637 3638 // 1) Write HEADER row
3638   - fputcsv($csv_file, $header_row, ';');
  3639 + !$DEBUG && fputcsv($csv_file, $header_row, ';');
3639 3640  
3640 3641 // 2) Write DATA rows, 1 by 1
3641 3642 foreach ($materiels as $result) {
... ... @@ -3759,10 +3760,13 @@ class MaterielsController extends AppController {
3759 3760 array_push($row, $result->nom_responsable);
3760 3761 array_push($row, $result->email_responsable);
3761 3762  
3762   - fputcsv($csv_file, $row, ';', '"');
  3763 + $DEBUG && debug($row);
  3764 + //$DEBUG && exit;
  3765 +
  3766 + !$DEBUG && fputcsv($csv_file, $row, ';', '"');
3763 3767 }
3764 3768 sleep(3);
3765   - fclose($csv_file);
  3769 + !$DEBUG && fclose($csv_file);
3766 3770  
3767 3771 exit();
3768 3772 // Sans le exit() ça ne fonctionne pas pour des petites listes, et dans tout les cas une ligne en javascript est écrite si il n'y a pas exit()
... ...
src/Template/Materiels/index.ctp
... ... @@ -162,30 +162,25 @@ $displaySearchField = function($params, $searchfor, $html, $form) {
162 162  
163 163  
164 164  
165   -$displayExportCurrentButton = function($SELECTED_STATUS, $params, $nbMateriels, $html) {
166   - ?>
167   - <div class="actions" style="width: 100%; float: none; padding: 0 0;">
168   - <?php
169   - echo $html->link(''.' '.'exportCurrent', [
  165 +$displayExportCurrentButton = function($params, $html) {
  166 + echo $html->link(
  167 + 'Exporter toute la liste courante (filtrage en cours)',
  168 + // URL
  169 + [
170 170 //'action' => 'index',
171   - //'CREATED',
172   - //'?' => ['height' => 400, 'width' => 500]
173   - //'?' => $params + ['status'=>'CREATED']
174   - //'?' => $params
175   - '?' => array_merge($params, ['exportcurrent'=>1])
  171 + '?' => array_merge($params, ['exportcurrent'=>1]),
176 172 //'?' => null
177   - //[$args],
178   - //"http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']
179   - ], [
180   - 'title' => 'Exporter la liste courante',
181   - 'style' => 'margin-right: 5px',
182   - 'escape' => false
183   - ]);
184   -
185   - echo '</p>';
186   -
187   - echo "</div>";
188   -
  173 + //'_full' => true // pour des URLs absolues
  174 + ],
  175 + // Style et tooltip
  176 + [
  177 + //'class' => 'button',
  178 + 'class' => "btn btn-outline-success btn-default",
  179 + 'title' => 'Exporter la liste courante (avec les paramètres sélectionnés en cours)',
  180 + //'style' => 'margin-right: 0px',
  181 + //'escape' => false
  182 + ]
  183 + );
189 184 }; // displayExportCurrentButton()
190 185  
191 186  
... ... @@ -499,7 +494,11 @@ $displayFilter = function($filter_name, $filter_label,// &#39;projet&#39;
499 494  
500 495  
501 496  
502   -$displayActionButtonsForSelectedOrAllElements = function($form, $SELECTED_STATUS, $USER_IS_RESPONSABLE, $USER_IS_ADMIN_OR_MORE, $USER_IS_SUPERADMIN) {
  497 +$displayActionButtonsForSelectedOrAllElements = function(
  498 + $form,
  499 + $SELECTED_STATUS,
  500 + $USER_IS_RESPONSABLE, $USER_IS_ADMIN_OR_MORE, $USER_IS_SUPERADMIN,
  501 + $displayExportCurrentButton, $params) {
503 502  
504 503 //if (isset($SELECTED_STATUS)) {
505 504 if ($SELECTED_STATUS) {
... ... @@ -544,8 +543,8 @@ $displayActionButtonsForSelectedOrAllElements = function($form, $SELECTED_STATUS
544 543 // 'style' => 'margin: 0px;'
545 544 //]);
546 545  
547   - //echo $form->button('Exporter la liste actuelle', ['class'=>'btn btn-outline-success', 'type'=>'submit', 'name' => 'exportCurrent', 'id' => 'exportCurrent', 'style' => 'margin: 0px;']);
548   - //echo "<br /><br />";
  546 + $displayExportCurrentButton($params, $this->Html);
  547 + echo '<br/><br/>';
549 548  
550 549 echo $form->button('Exporter la liste complète (tous les matériels)', ['class'=>'btn btn-outline-success', 'type'=>'submit', 'name' => 'exportAll', 'id' => 'exportAll', 'style' => 'margin: 0px;']);
551 550 }
... ... @@ -767,7 +766,7 @@ echo $this-&gt;Html-&gt;link(&#39;&lt;i class=&quot;icon-plus&quot;&gt;&lt;/i&gt; Nouveau Matériel&#39;, [
767 766 'escape' => false
768 767 ]);
769 768 echo '</p>';*/
770   -if ($USER_IS_ADMIN_OR_MORE) $displayExportCurrentButton($SELECTED_STATUS, $params, $nbMateriels, $this->Html);
  769 +//if ($USER_IS_ADMIN_OR_MORE) $displayExportCurrentButton($SELECTED_STATUS, $params, $nbMateriels, $this->Html);
771 770  
772 771 if ($USER_IS_ADMIN_OR_MORE) $displayStatusButtons($SELECTED_STATUS, $params, $nbMateriels, $this->Html);
773 772 //</div>
... ... @@ -934,7 +933,12 @@ if ($SELECTED_STATUS) echo $this-&gt;Form-&gt;hidden(&#39;what&#39;, [&#39;value&#39;=&gt;$SELECTED_STATU
934 933  
935 934 $displayColorLegend();
936 935  
937   - $displayActionButtonsForSelectedOrAllElements($this->Form, $SELECTED_STATUS, $USER_IS_RESPONSABLE, $USER_IS_ADMIN_OR_MORE, $USER_IS_SUPERADMIN);
  936 + $displayActionButtonsForSelectedOrAllElements(
  937 + $this->Form,
  938 + $SELECTED_STATUS,
  939 + $USER_IS_RESPONSABLE, $USER_IS_ADMIN_OR_MORE, $USER_IS_SUPERADMIN,
  940 + $displayExportCurrentButton, $params, $nbMateriels
  941 + );
938 942  
939 943 echo $this->element('pagination_with_first_and_last');
940 944  
... ...
webroot/css/inventirap.css
... ... @@ -18,6 +18,19 @@ a {
18 18 text-decoration: underline;
19 19 font-weight: bold;
20 20 }
  21 +
  22 +/*
  23 +(EP202010)
  24 +Ce style, c'est uniquement pour le "faux" bouton (c'est un lien) "Exporter toute la liste courante" de la vue 'materiels/index'
  25 +Attention :
  26 +a .btn => signifie 'a' OU 'la classe btn'
  27 +c'est différent de
  28 +a.btn => signifie 'a' ET 'la classe btn'
  29 +*/
  30 +a.btn {
  31 + text-decoration: none;
  32 +}
  33 +
21 34 a:hover {
22 35 color: #367889;
23 36 text-decoration:none;
... ...