diff --git a/CHANGES.txt b/CHANGES.txt index 0eb8479..f8c20a8 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -13,11 +13,13 @@ CHANGEMENTS ------- -10/09/2020 NEWS#3 : +11/09/2020 NEWS#3 : - Nouvelle entité "Projet", à laquelle un matériel peut (ou pas) être associé -- Nouveau format étiquette 19mm avec QrCode pour la nouvelle étiqueteuse (Dymo MobileLabeler) +- Nouveau filtre de la liste des matériels (index) => par "Projet" + +- Nouveau format étiquette 19mm "avec le QrCode" pour la nouvelle étiqueteuse (Dymo MobileLabeler) ------- @@ -85,6 +87,11 @@ Outre ces changements, voici d'autres changements importants : ======= CHANGES ======= ------- +11/09/2020 v3.7.9.100 (EP) + - (e) Nouveau filtre de la liste des matériels (index) => par "projet" + - (i) Enorme refactorisation de tous les filtres (nb lignes, age, domaine, projet) de la page index (liste des matériels) + +------- 10-11/09/2020 v3.7.9.97-99 (EP) - (e) Ajout de l'entité (table) "Projet", à laquelle un matériel peut (ou pas) être associé - (b) Enorme bugfix sur le numéro d'inventaire qui se régénérait à chaque modif du matériel !!! diff --git a/README.md b/README.md index be97f2f..46898c6 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ Logiciel testé et validé sur les configurations suivantes : -------------------------------------------------------------------------------------------- Date: 11/09/2020 -Version: 3.7.9.99 +Version: 3.7.9.100 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 5fa86e1..3779a08 100755 --- a/src/Controller/MaterielsController.php +++ b/src/Controller/MaterielsController.php @@ -913,22 +913,28 @@ class MaterielsController extends AppController { } */ - // - FILTRE Domaine ? - $domain_id = $this->request->getQuery('domain'); + $domaine_id = $this->request->getQuery('domaine'); // Par défaut, TOUS les domaines (id=0) - if (is_null($domain_id)) $domain_id = 0; + if (is_null($domaine_id)) $domaine_id = 0; // Si $domain_id==0 on ne fait rien (car on prend TOUS les domaines) - if ($domain_id > 0) + if ($domaine_id > 0) // OK - $conditions['Materiels.sur_categorie_id'] = $domain_id; + $conditions['Materiels.sur_categorie_id'] = $domaine_id; // KO => Exception PDO ! //$conditions['sur_categorie_id'] = $domain_id; //debug($conditions); - - + + // - FILTRE Projet ? + $projet_id = $this->request->getQuery('projet'); + // Par défaut, TOUS les domaines (id=0) + if (is_null($projet_id)) $projet_id = 0; + // 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 ? - $limit = $this->request->getQuery('aff'); + //$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']; @@ -1093,15 +1099,63 @@ class MaterielsController extends AppController { $this->set(compact('materiels')); + // Liste des DOMAINES //$domain_options = $this->Materiels->SurCategories->find()->toArray(); - $domain_options = $this->Materiels->SurCategories->find('list', [ + $domaine_options = $this->Materiels->SurCategories->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', ])->toArray(); // Ajoute l'élément 0 => 'TOUS' en tête de tableau //$domain_options[0] = 'TOUS'; - array_unshift($domain_options, "Tous"); - $this->set(compact('domain_options', 'searchfor')); + //debug($domain_options); + array_unshift($domaine_options, "Tous"); + //debug($domain_options); + + // Liste des PROJETS + $projet_options = $this->Materiels->Projets->find('list', [ + 'keyField' => 'id', + 'valueField' => 'nom', + // implicite, pourquoi ??? + //'order' => 'Projets.nom' + ])->toArray(); + //debug($projet_options); + /* Ajoute l'élément 0 => 'TOUS' en tête de tableau + * SANS changer les clés !!! + */ + // 1) on ajoute un élément vide à la clé "0", + // et on trie le tableau sur les values (nom du projet) (en conservant les clés) + // => l'élément vide se retrouve donc en tête + $projet_options[0] = ''; + asort($projet_options); + // 2) on remplace l'élément vide (en tête) par 'Tous', qui est donc toujours en tête ! + $projet_options[0] = 'Tous'; + //debug($projet_options); + + // Liste des AGES (intervalles d'années) + $age_options = [ + '0' => 'Tous', + '5' => 'Récents (5 ans max)', + '10' => '5-10 ans', + '15' => '10-15 ans', + '20' => '15-20 ans', + //'20plus' => '+ 20 ans', + '21' => '+ 20 ans', + //'unknown' => 'inconnu', + '-1' => 'inconnu', + ]; + + // Liste des NBLINES (Nb de matériels affichés par page) + $nblines_options = [ + '20' => 20, + '30' => 30, + '50' => 50, + '100' => 100, + '150' => 150, + '200' => 200 + ]; + + + $this->set(compact('age_options', 'nblines_options', 'domaine_options', 'projet_options', 'searchfor')); // Pas bien..., mais pratique : // on passe le controleur de materiels à la vue index pour qu'elle diff --git a/src/Template/Materiels/index.ctp b/src/Template/Materiels/index.ctp index b5749ed..568e39b 100644 --- a/src/Template/Materiels/index.ctp +++ b/src/Template/Materiels/index.ctp @@ -8,15 +8,23 @@ use App\Controller\MaterielsController; // (EP 21/5/19) // --- Elements set by Controller for this view --- -/*TODO: $materiels doit etre enrichi avec des nouveaux attributs tels que (pour chaque materiel de la liste) : +/* + TODO: $materiels doit etre enrichi avec des nouveaux attributs tels que (pour chaque materiel de la liste) : - CAN_EDIT - CAN_DELETE - CAN_VALIDATE - CAN_TBA - CAN_ARCHIVE */ -$domain_options = $domain_options; + +// Options des filtres +$nblines_options = $nblines_options; +$age_options = $age_options; +$domaine_options = $domaine_options; +$projet_options = $projet_options; + //debug($domain_options); +//debug($projet_options); $nbMateriels = $nbMateriels; $controller=$controller; @@ -119,7 +127,8 @@ $displaySearchField = function($params, $searchfor, $html, $form) { ]); // (EP 202007) Ajouter un champ caché pour chaque paramètre passé dans l'url // afin de ne pas les perdre... - $parameters = ['aff', 'age', 'domain', 'status']; + //$parameters = ['aff', 'age', 'domaine', 'status', 'projet']; + $parameters = ['nblines', 'age', 'domaine', 'status', 'projet']; foreach ($parameters as $param) if (isset($params[$param])) echo $this->Form->hidden($param, [ @@ -295,28 +304,62 @@ $displayStatusButtons = function($SELECTED_STATUS, $params, $nbMateriels, $html) }; // displayStatusButtons() -$displaySelectors = function($form, $request, $displayNbLinesSelector, $displayAgeSelector, $displayDomaineSelector, $domain_options) { + +//$displaySelectors = function($form, $request, +$displayFilters = function($form, $request, + $df, + /* + $displayNbLinesSelector, + $displayAgeSelector, + */ + //$f1_func, + //$f1_func, + $f1_name, $f1_options, + //$f2_func, $f2_options, + $f2_name, $f2_options, + //$displayDomaineSelector, $domain_options, + //$displayProjetSelector, $projet_options + $f3_name, $f3_options, + $f4_name, $f4_options +) { //echo '
'; echo '
'; echo ''; + // Filtre 1 echo ''; + // Filtre 2 echo ''; + // Filtre 3 echo ''; + + // Filtre 4 + echo ''; echo '
'; - $displayNbLinesSelector($form, $request); + //$displayNbLinesSelector($form, $request); + //$f1_func($form, $request); + $df($f1_name, $form, $request, $f1_options); echo ''; - $displayAgeSelector($form, $request); + //$displayAgeSelector($form, $request); + //$f2_func($form, $request, $f2_options); + $df($f2_name, $form, $request, $f2_options); echo ''; - $displayDomaineSelector($form, $request, $domain_options); + //$displayDomaineSelector($form, $request, $domain_options); + //$df('domain', $form, $request, $domain_options); + $df($f3_name, $form, $request, $f3_options); + echo ''; + //$displayProjetSelector('projet', $form, $request, $projet_options); + //$df('projet', $form, $request, $projet_options); + $df($f4_name, $form, $request, $f4_options); echo '
'; echo '
'; }; -$displayNbLinesSelector = function($form, $request) { +/* +$displayNbLinesSelector = function($form, $request, $options) { //echo '
'; //echo $this->Form->create('materiels', [ // echo $this->Form->create('materiels', ['url' => '/materiels/execActions?page=index']); @@ -324,51 +367,101 @@ $displayNbLinesSelector = function($form, $request) { echo $form->control('aff_par_defaut', [ 'label' => 'Nombre lignes', 'onchange' => "updateUrlWithSelectedValue('aff-par-defaut', 'aff')", - 'options' => [ - '20' => 20, - '30' => 30, - '50' => 50, - '100' => 100, - '150' => 150, - '200' => 200 - ] + 'options' => $options, ]); //echo '
'; }; // displayNbLinesSelector() -$displayAgeSelector = function($form, $request) { +$age_options = [ + '0' => 'Tous', + '5' => 'Récents (5 ans max)', + '10' => '5-10 ans', + '15' => '10-15 ans', + '20' => '15-20 ans', + //'20plus' => '+ 20 ans', + '21' => '+ 20 ans', + //'unknown' => 'inconnu', + '-1' => 'inconnu', +]; + +$displayAgeSelector = function($form, $request, $options) { //echo '
'; echo $form->control('age_selector', [ 'label' => 'Age', 'onchange' => "updateUrlWithSelectedValue('age-selector', 'age')", - 'options' => [ - '0' => 'Tous', - '5' => 'Récents (5 ans max)', - '10' => '5-10 ans', - '15' => '10-15 ans', - '20' => '15-20 ans', - //'20plus' => '+ 20 ans', - '21' => '+ 20 ans', - //'unknown' => 'inconnu', - '-1' => 'inconnu', - ], + 'options' => $options, + 'default' => '0', // Inutile car géré via javascript //'default' => '5', ]); //echo '
'; -}; // displayNbLinesSelector() +}; // $displayAgeSelector() -$displayDomaineSelector = function($form, $request, $domain_options) { +$displayDomaineSelector = function($form, $request, $options) { //echo '
'; echo $form->control('domain_selector', [ 'label' => 'Domaine', 'onchange' => "updateUrlWithSelectedValue('domain-selector', 'domain')", - 'options' => $domain_options, + 'options' => $options, // Inutile car géré via javascript 'default' => 0, ]); //echo '
'; -}; // displayNbLinesSelector() +}; + +$displayProjetSelector = function($form, $request, $options) { + //echo '
'; + echo $form->control('projet_selector', [ + 'label' => 'Projet', + 'onchange' => "updateUrlWithSelectedValue('projet-selector', 'projet')", + 'options' => $options, + // Inutile car géré via javascript + 'default' => 0, + ]); + //echo '
'; +}; + +$displayProjetSelector = function($filter_name, // 'projet' + $form, $request, $options + ) { + //echo '
'; + $html_filter_name = $filter_name.'-selector'; + //echo $form->control('projet_selector', [ + echo $form->control($filter_name.'_selector', [ // 'projet_selector' + //'label' => 'Projet', + 'label' => ucfirst($filter_name), // 'Projet' + //'onchange' => "updateUrlWithSelectedValue('projet-selector', 'projet')", + //'onchange' => "updateUrlWithSelectedValue($filter_name.'-selector', $filter_name)", // ('projet-selector', 'projet') + 'onchange' => "updateUrlWithSelectedValue('$html_filter_name', '$filter_name')", // ('projet-selector', 'projet') + 'options' => $options, + // Inutile car géré via javascript + 'default' => 0, + ]); + //echo '
'; +}; +*/ + +$displayFilter = function($filter_name, // 'projet' + $form, $request, $options + ) { + //echo '
'; + $html_filter_name = $filter_name.'-selector'; + //echo $form->control('projet_selector', [ + echo $form->control($filter_name.'_selector', [ // 'projet_selector' + //'label' => 'Projet', + 'label' => ucfirst($filter_name), // 'Projet' + //'onchange' => "updateUrlWithSelectedValue('projet-selector', 'projet')", + //'onchange' => "updateUrlWithSelectedValue($filter_name.'-selector', $filter_name)", // ('projet-selector', 'projet') + 'onchange' => "updateUrlWithSelectedValue('$html_filter_name', '$filter_name')", // ('projet-selector', 'projet') + 'options' => $options, + // Inutile car géré via javascript + 'default' => 0, + ]); + //echo '
'; +}; + + + $displayActionButtonsForSelectedOrAllElements = function($form, $SELECTED_STATUS, $USER_IS_RESPONSABLE, $USER_IS_ADMIN_OR_MORE, $USER_IS_SUPERADMIN) { @@ -639,7 +732,19 @@ if ($USER_IS_ADMIN_OR_MORE) $displayStatusButtons($SELECTED_STATUS, $params, $nb // -$displaySelectors($this->Form, $this->request, $displayNbLinesSelector, $displayAgeSelector, $displayDomaineSelector, $domain_options); +//$displaySelectors( +$displayFilters( + $this->Form, $this->request, + $displayFilter, + //$displayNbLinesSelector, + 'nblines', $nblines_options, + //$displayAgeSelector, $age_options, + 'age', $age_options, + //$displayDomaineSelector, $domain_options, + //$displayProjetSelector, $projet_options + 'domaine', $domaine_options, + 'projet', $projet_options +); //$displayNbLinesSelector($this->Form, $this->request); @@ -989,7 +1094,12 @@ $(document).ready(function(){ selectNbLines(); // Actualiser le domaine sélectionné si passé en paramètre de l'url //$(document).ready(selectDomain); - selectDomain(); + //selectDomain(); + selectFilterItem('domaine'); + //selectProjet('projet'); + selectFilterItem('projet'); + + // Remplir le champ recherche général avec le texte de la dernière recherche effectuée //$(document).ready(setSearchField); //setSearchField(); @@ -1006,6 +1116,7 @@ function setSearchField() { } */ +/* function selectDomain() { var domain_id = parseInt($_GET('domain')); //console.log(domain_id); @@ -1016,15 +1127,36 @@ function selectDomain() { //$("#domain-selector").val(domain_id); //document.getElementById('domain-selector').value = domain; } +*/ + +//function selectProjet(filter_name) { +function selectFilterItem(filter_name) { + //var id = parseInt($_GET('projet')); + var id = parseInt($_GET(filter_name)); + var filter_selector_name = filter_name+'-selector'; + //console.log(domain_id); + // NotANumber + if (!isNaN(id)) + // PAS BON : sélectionne par l'INDEX + //$("#projet-selector")[0].selectedIndex = id; + // OK : sélectionne par la CLÉ + $('#'+filter_selector_name).val(id); + //$("#projet-selector").val(id); + //document.getElementById('domain-selector').selectedIndex = domain_id; + //$("#domain-selector").val(domain_id); + //document.getElementById('domain-selector').value = domain; +} //$(document).ready(function () { function selectNbLines() { - var nblines = parseInt($_GET('aff')); + //var nblines = parseInt($_GET('aff')); + var nblines = parseInt($_GET('nblines')); //document.getElementById('aff-par-defaut').value = affichage; if ( [20,30,50,100,200].includes(nblines) ) - $("#aff-par-defaut").val(nblines); + //$("#aff-par-defaut").val(nblines); + $("#nblines-selector").val(nblines); else - $("#aff-par-defaut").val(aff_par_defaut?>); + $("#nblines-selector").val(aff_par_defaut?>); /* switch(affichage) { case 20 : -- libgit2 0.21.2