diff --git a/CHANGES.txt b/CHANGES.txt index 1871273..02008e8 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -13,7 +13,9 @@ CHANGEMENTS ------- -30/09/2020 NEWS#4 (v4.103.18-3.7.9) : +02/10/2020 NEWS#4 (v4.103.25-3.7.9) : + +Nouveau bouton "Exporter la liste courante" sur la vue liste des matériels (materiels/index) Remaniement complet du système de notification : => 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 : ------- -02/10/2020 v4.103.24-3.7.9 (EP) - - (i) Bugfix nom du serveur dans les mails +02/10/2020 v4.103.25-3.7.9 (EP) + - (e) Nouveau bouton "Exporter la liste courante" sur la vue liste des matériels (materiels/index) + - (b) Bugfix nom du serveur dans les mails ------- 01/10/2020 v4.103.23-3.7.9 (EP) diff --git a/README.md b/README.md index 213f609..0cb37d3 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ Logiciel testé et validé sur les configurations suivantes : -------------------------------------------------------------------------------------------- Date: 02/10/2020 -Version: 4.103.24-3.7.9 +Version: 4.103.25-3.7.9 HISTORIQUE DES CHANGEMENTS DE VERSION : voir le fichier CHANGES.txt (ou la page web /pages/changes) diff --git a/src/Controller/MaterielsController.php b/src/Controller/MaterielsController.php index 81bc94c..f849939 100755 --- a/src/Controller/MaterielsController.php +++ b/src/Controller/MaterielsController.php @@ -873,7 +873,9 @@ class MaterielsController extends AppController { $this->myDebug("step 3: MaterielsController.index()"); $conditions = []; - $contain = []; + //$contain = []; + $contain = ['Fournisseurs', 'Categories', 'Organismes', 'Projets', 'Users']; + // - FILTRE Statut ? (status=CREATED, status=VALIDATED, ...) // (EP 202007 OLD way pour gérer les statuts : /materiels/index/VALIDATED) @@ -995,10 +997,6 @@ class MaterielsController extends AppController { $config = $this->confLabinvent; - $export_current = $this->request->getQuery('exportcurrent'); - if ($export_current == 1) { - debug("export current list"); - } /* * - FILTRE age (tranche d'âge) ? @@ -1047,6 +1045,7 @@ class MaterielsController extends AppController { } */ + // - FILTRE Domaine ? $domaine_id = $this->request->getQuery('domaine'); // Par défaut, TOUS les domaines (id=0) @@ -1059,6 +1058,7 @@ class MaterielsController extends AppController { //$conditions['sur_categorie_id'] = $domain_id; //debug($conditions); + // - FILTRE Projet ? $projet_id = $this->request->getQuery('projet'); // Par défaut, TOUS les domaines (id=0) @@ -1066,12 +1066,14 @@ class MaterielsController extends AppController { // Si $domain_id==0 on ne fait rien (car on prend TOUS les domaines) if ($projet_id > 0) $conditions['Materiels.projet_id'] = $projet_id; - // - FILTRE Nb lignes par page ? + + // - FILTRE (pas vraiment un filtre) Nb lignes par page ? //$limit = $this->request->getQuery('aff'); $limit = $this->request->getQuery('nblines'); // Par défaut, nb lignes demandées dans config if ($limit===null) $limit = $config['aff_par_defaut']; + /* SERT À RIEN $this->paginate = [ 'limit' => $limit, 'maxLimit' => 1000, @@ -1088,6 +1090,7 @@ class MaterielsController extends AppController { 'Materiels.numero_laboratoire' => 'desc' ] ]; + */ /* @@ -1147,9 +1150,10 @@ class MaterielsController extends AppController { ] ]; */ - $contain = ['Fournisseurs', 'Categories', 'Organismes', 'Projets']; + //$contain = ['Fournisseurs', 'Categories', 'Organismes', 'Projets']; + //$contain = ['Fournisseurs', 'Categories', 'Organismes', 'Projets', 'Users']; //debug($conditions); - } + } // searchfor // EXEC REQUETE SQL find() @@ -1184,6 +1188,19 @@ class MaterielsController extends AppController { debug("Mauvais format de requete SQL (1), Exception PDO générée !"); exit; } + + + // EXPORT DE LA LISTE EN COURS (selon le filtrage en cours) + // Attention, l'appel à export() terminera l'action par un EXIT + // Donc, cette action stoppe le processus en cours, et la vue ne sera pas réaffichée + $export_current = $this->request->getQuery('exportcurrent'); + if ($export_current == 1) { + //debug("export current list"); + $this->export($materiels); + } + // STOP + + //debug("age=$age, nbMateriels = $nbMateriels"); $this->set(compact('nbMateriels')); @@ -1225,7 +1242,14 @@ class MaterielsController extends AppController { ); */ try { - $materiels = $this->paginate($materiels); + //$materiels = $this->paginate($materiels); + $materiels = $this->paginate($materiels, [ + 'limit' => $limit, + 'maxLimit' => 1000, + 'order' => [ + 'Materiels.numero_laboratoire' => 'desc' + ] + ]); } catch (\PDOException $e) { debug("Mauvais format de requete SQL (2), Exception PDO générée !"); exit; @@ -1303,6 +1327,8 @@ class MaterielsController extends AppController { */ } // index() + + //@Override // Pour le MaterielsController, le materiel associé est simplement lui-même :-) protected function getRelatedMaterielForId($id, $action=null) { @@ -3315,7 +3341,7 @@ class MaterielsController extends AppController { * Optional parameter "what:value" may be passed when calling this action, and is read from $this->getAttribute('params')['named']['what'] * ex : materiels/export/what:toValidate */ - public function export() + public function export($materiels_list = null) { function getElementFromList($listName, $materiel, $fkName) { @@ -3428,47 +3454,17 @@ class MaterielsController extends AppController { } - /* - // CAS 2 - EXPORT liste courante - else if ($this->request->getData('exportCurrent') !== null) { - + // CAS 2 - EXPORT liste courante + // (cette fonction export() a été appelée par index()) + //else if ($this->request->getData('exportcurrent') !== null) { + else if ($materiels_list) { $CAS = 2; $this->myDebug("IN exportCurrent"); - $what = $this->request->getData('what'); - //debug($what); - - $selectedMateriels = []; - $i = 0; - //$data = $this->request->getData(); - $data = $this->request->getData(); - //debug($data);exit; - foreach ($data as $val) { - if ($val == 1) { - $selectedMateriels[$i] = key($data); - $i ++; - } - next($data); - } - - $this->myDebug($selectedMateriels); - - //if (sizeof($selectedMateriels) > 0) { - if (! empty($selectedMateriels)) { - //$materielsTable = TableRegistry::getTableLocator()->get('Materiels'); - //$materiels = $materielsTable->find() - $materiels = $this->Materiels->find() - ->contain($contain) - ->where(['Materiels.id' => $selectedMateriels[0]]); - for ($j = 0; $j < sizeof($selectedMateriels); $j ++) - $materiels->orWhere( ['Materiels.id' => $selectedMateriels[$j]] ); - $materiels->order($order); - } - $materiels = $this->Materiels->find() - ->contain($contain) - ->where(['Materiels.id' => 12003]); - } - */ + $materiels = $materiels_list; + //debug($materiels->toArray()); exit; + } // CAS 2 + // CAS 3 - EXPORT TOUS les matériels de la BD else if ($this->request->getData('exportAll') !== null) { $CAS = 3; @@ -3619,12 +3615,17 @@ class MaterielsController extends AppController { "Email responsable" ]; - ini_set('max_execution_time', 600); + + // DEBUG = true => n'envoie pas le fichier, l'affiche seulement + $DEBUG=false; + //$DEBUG=true; + + !$DEBUG && ini_set('max_execution_time', 600); $filename = 'export_' . date("Y-m-d") . '.csv'; - $csv_file = fopen('php://output', 'w'); + !$DEBUG && $csv_file = fopen('php://output', 'w'); - $this->response->header([ + !$DEBUG && $this->response->header([ // CRAL: //'Content-Type: text/csv' 'Content-Type: application/csv', @@ -3632,10 +3633,10 @@ class MaterielsController extends AppController { //"Content-disposition: attachment; filename=Demande_bureaux_" . date("Ymd").".csv"); 'Content-Disposition: attachment; filename="' . $filename . '"' ]); - $this->response->sendHeaders(); + !$DEBUG && $this->response->sendHeaders(); // 1) Write HEADER row - fputcsv($csv_file, $header_row, ';'); + !$DEBUG && fputcsv($csv_file, $header_row, ';'); // 2) Write DATA rows, 1 by 1 foreach ($materiels as $result) { @@ -3759,10 +3760,13 @@ class MaterielsController extends AppController { array_push($row, $result->nom_responsable); array_push($row, $result->email_responsable); - fputcsv($csv_file, $row, ';', '"'); + $DEBUG && debug($row); + //$DEBUG && exit; + + !$DEBUG && fputcsv($csv_file, $row, ';', '"'); } sleep(3); - fclose($csv_file); + !$DEBUG && fclose($csv_file); exit(); // 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() diff --git a/src/Template/Materiels/index.ctp b/src/Template/Materiels/index.ctp index d14e13d..5f2fd31 100644 --- a/src/Template/Materiels/index.ctp +++ b/src/Template/Materiels/index.ctp @@ -162,30 +162,25 @@ $displaySearchField = function($params, $searchfor, $html, $form) { -$displayExportCurrentButton = function($SELECTED_STATUS, $params, $nbMateriels, $html) { - ?> - <div class="actions" style="width: 100%; float: none; padding: 0 0;"> - <?php - echo $html->link(''.' '.'exportCurrent', [ +$displayExportCurrentButton = function($params, $html) { + echo $html->link( + 'Exporter toute la liste courante (filtrage en cours)', + // URL + [ //'action' => 'index', - //'CREATED', - //'?' => ['height' => 400, 'width' => 500] - //'?' => $params + ['status'=>'CREATED'] - //'?' => $params - '?' => array_merge($params, ['exportcurrent'=>1]) + '?' => array_merge($params, ['exportcurrent'=>1]), //'?' => null - //[$args], - //"http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'] - ], [ - 'title' => 'Exporter la liste courante', - 'style' => 'margin-right: 5px', - 'escape' => false - ]); - - echo '</p>'; - - echo "</div>"; - + //'_full' => true // pour des URLs absolues + ], + // Style et tooltip + [ + //'class' => 'button', + 'class' => "btn btn-outline-success btn-default", + 'title' => 'Exporter la liste courante (avec les paramètres sélectionnés en cours)', + //'style' => 'margin-right: 0px', + //'escape' => false + ] + ); }; // displayExportCurrentButton() @@ -499,7 +494,11 @@ $displayFilter = function($filter_name, $filter_label,// 'projet' -$displayActionButtonsForSelectedOrAllElements = function($form, $SELECTED_STATUS, $USER_IS_RESPONSABLE, $USER_IS_ADMIN_OR_MORE, $USER_IS_SUPERADMIN) { +$displayActionButtonsForSelectedOrAllElements = function( + $form, + $SELECTED_STATUS, + $USER_IS_RESPONSABLE, $USER_IS_ADMIN_OR_MORE, $USER_IS_SUPERADMIN, + $displayExportCurrentButton, $params) { //if (isset($SELECTED_STATUS)) { if ($SELECTED_STATUS) { @@ -544,8 +543,8 @@ $displayActionButtonsForSelectedOrAllElements = function($form, $SELECTED_STATUS // 'style' => 'margin: 0px;' //]); - //echo $form->button('Exporter la liste actuelle', ['class'=>'btn btn-outline-success', 'type'=>'submit', 'name' => 'exportCurrent', 'id' => 'exportCurrent', 'style' => 'margin: 0px;']); - //echo "<br /><br />"; + $displayExportCurrentButton($params, $this->Html); + echo '<br/><br/>'; 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;']); } @@ -767,7 +766,7 @@ echo $this->Html->link('<i class="icon-plus"></i> Nouveau Matériel', [ 'escape' => false ]); echo '</p>';*/ -if ($USER_IS_ADMIN_OR_MORE) $displayExportCurrentButton($SELECTED_STATUS, $params, $nbMateriels, $this->Html); +//if ($USER_IS_ADMIN_OR_MORE) $displayExportCurrentButton($SELECTED_STATUS, $params, $nbMateriels, $this->Html); if ($USER_IS_ADMIN_OR_MORE) $displayStatusButtons($SELECTED_STATUS, $params, $nbMateriels, $this->Html); //</div> @@ -934,7 +933,12 @@ if ($SELECTED_STATUS) echo $this->Form->hidden('what', ['value'=>$SELECTED_STATU $displayColorLegend(); - $displayActionButtonsForSelectedOrAllElements($this->Form, $SELECTED_STATUS, $USER_IS_RESPONSABLE, $USER_IS_ADMIN_OR_MORE, $USER_IS_SUPERADMIN); + $displayActionButtonsForSelectedOrAllElements( + $this->Form, + $SELECTED_STATUS, + $USER_IS_RESPONSABLE, $USER_IS_ADMIN_OR_MORE, $USER_IS_SUPERADMIN, + $displayExportCurrentButton, $params, $nbMateriels + ); echo $this->element('pagination_with_first_and_last'); diff --git a/webroot/css/inventirap.css b/webroot/css/inventirap.css index 7d08ab8..d551974 100755 --- a/webroot/css/inventirap.css +++ b/webroot/css/inventirap.css @@ -18,6 +18,19 @@ a { text-decoration: underline; font-weight: bold; } + +/* +(EP202010) +Ce style, c'est uniquement pour le "faux" bouton (c'est un lien) "Exporter toute la liste courante" de la vue 'materiels/index' +Attention : +a .btn => signifie 'a' OU 'la classe btn' +c'est différent de +a.btn => signifie 'a' ET 'la classe btn' +*/ +a.btn { + text-decoration: none; +} + a:hover { color: #367889; text-decoration:none; -- libgit2 0.21.2