diff --git a/CHANGELOG b/CHANGELOG index f7eed22..b15cb48 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -353,10 +353,17 @@ Commencer à implémenter le nouveau workflow v5 : ======= TODO ======= PRIO : - - vincent (changer nom doc) - config via page web !!! - tests ok + *) Stats de connexion + - le tri des autres colonnes ne marche plus + + *) + Rendre modifiable la config via page web "Gérer les champs obligatoires" + - OFF_nom_du_champ : 'libellé' + - Restaurer la config par défaut + - Réactiver une variable : OFF_nom_du_champ => nom_du_champ *) SUPERADMIN => par défaut, au minimum, mêmes droits que ADMIN @@ -370,27 +377,23 @@ Commencer à implémenter le nouveau workflow v5 : - numéro inventaire (hidden par défaut pour l'édition) - ... + *) Terminer la vue index générique : + - AppController->index_generic() + - Template/Common/indexgen.ctp + *) => update matos lifecycle diag *) Vincent : - - (admin) supprimer photo d'un matos validé - - j'ai lié un mauvaise photo à un matériel déjà validé. - Je souhaiterais la supprimer mais le matériel étant validé, je n'ai pas l'autorisation. - email pas trouvé (ancienne fiche de vincent) - - photos : - - "nom" => "nom du doc" - - et doit être modifiable ! - - *) Gérer categ/s-categ plus facilement + - doc attaché : nom doit être modifiable - *) (b) Users list : tri alpha par défaut - *) Resp : - voir menus Outils & Autres (ou pas) ? - respb de qqch !!! *) qqsoit user : doit pouvoir voir sa fiche user (no modif) + => mais pas celle des autres... *) TESTS !!!! *) Les tests doivent se faire avec la config par défaut (et non pas celle spécifique du labo) @@ -402,10 +405,6 @@ Commencer à implémenter le nouveau workflow v5 : (quelle diff avec "[LabInvent] Ajout d'un matériel" ??) - - *) Stats de connexion - - le tri des autres colonnes ne marche plus - *) TBO ou ARCHIVED (= validated) : ne pas autoriser edit ou delete des docs attachés Autoriser certaines choses pour TBO : @@ -423,18 +422,8 @@ Commencer à implémenter le nouveau workflow v5 : Facture jointe (si > 10K) Détail lieu stockage + S/N demandé ssi > 10K€ - - - *) - Rendre modifiable la config via page web "Gérer les champs obligatoires" - - OFF_nom_du_champ : 'libellé' - - Restaurer la config par défaut - - Réactiver une variable : OFF_nom_du_champ => nom_du_champ - - - *) Procédures pour les utilisateurs et les gestionnaires désormais configurable via le fichier de conf @@ -465,6 +454,13 @@ Commencer à implémenter le nouveau workflow v5 : ======= CHANGES ======= ------- +02/11/2021 v5.2.22-3.7.9 + - (e) gestion plus simple des catégories, domaines, et sous-catégories + - (e) chaque utilisateur peut voir sa fiche profil + - (e) liste utilisateurs triée par le nom-pnom (par défaut) + - (e) doc attaché "nom" => "nom du doc" (plus explicite) + +------- 27/10/2021 v5.2.21-3.7.9 - (i) Amélioration du fichier de config des champs matériels (généralisation pour les docs attachés et champs recommandés) => on peut maintenant préciser, à chaque étape, TOUT type important de doc attaché (devis, BC, BL, facture) comme étant obligatoire ou non modifiable ni supprimable diff --git a/README.md b/README.md index 6bccb69..164e6f2 100644 --- a/README.md +++ b/README.md @@ -52,8 +52,8 @@ Logiciel testé et validé sur les configurations suivantes : -------------------------------------------------------------------------------------------- -Date: 27/10/2021 -Version: v5.2.21-3.7.9 +Date: 02/11/2021 +Version: v5.2.22-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 9925492..fe4c84c 100755 --- a/src/Controller/AppController.php +++ b/src/Controller/AppController.php @@ -2082,8 +2082,36 @@ class AppController extends Controller } // beforeFilter() + + /** + * Index method + * + * @return \Cake\Network\Response|null + * TODO: à terminer... + */ + public function index_generic($entity_plural, $fields_names) + { + $controller_name = $this->getName(); + //debug($controller_name); + + $this->paginate = [ + 'contain' => [ + 'SurCategories' + ] + ]; + //$categories = $this->paginate($this->Categories); + $entities = $this->paginate($this->$controller_name); + + $this->set(compact('entities', 'entity_plural', 'fields_names')); + + /* (EP) Pas nécessaire + $this->set('_serialize', [ + 'categories' + ]); + */ + } - public function index_generic($group_type1, $group_type2, $lab_website_url=null) { + public function index_groups($group_type1, $group_type2, $lab_website_url=null) { // https://book.cakephp.org/3/fr/controllers/components/pagination.html $groups = $this->paginate(); @@ -2108,7 +2136,7 @@ class AppController extends Controller //public function view_generic($id, $associated_entity_types, $parent_entity_controller_name=[]) { //public function view_generic($id, $associated_entity_types, $containavirer=[]) { - public function view_generic($id, $child_entity_types=[]) { + public function view_generic($id, $child_entity_types=[], $sub_controller=null, $sub_controller_singular=null) { //debug($contain_children); // ex: SurCategories @@ -2374,6 +2402,8 @@ class AppController extends Controller $entity_name = $entity->$entity_name_field_label; $this->set(compact( + 'id', + 'fields_label', // Infos sur l'entité courante @@ -2388,7 +2418,11 @@ class AppController extends Controller //'parent_entity_name','parent_entity_id', // Infos sur les entités associées - 'child_entities_list' + 'child_entities_list', + + // Optionnel : sous-controleur pour pouvoir ajouter une sous-entité (ex: ajouter une sous-catégorie à une catégorie) + 'sub_controller', + 'sub_controller_singular' )); //debug($this->viewVars);exit; @@ -2405,6 +2439,7 @@ class AppController extends Controller */ } // view_generic() + /** * Add or Edit generic method (do either add() or edit()) * => Factorisation de add() et edit() @@ -2907,7 +2942,10 @@ class AppController extends Controller // Pass this function to all views //function echoActionButton($html, $icon_class, $title, $action, $id, $tip='', $controller='materiels', $mat=NULL, $photo=NULL) { //$echoActionButton = function($html, $icon_class, $buttonStyle='', $title, $controller='', $action, $id, $other_args=[], $tip='', $confirmMessage='') { - $getActionButton = function($html, $icon_class, $buttonStyle, $title, $controller, $action, $id, $other_args=[], $tip='', $confirmMessage='', $moreButtonStyle='') { + $getActionButton = function( + $html, $icon_class, $buttonStyle, + $title, $controller, $action, $id, $other_args=[], $tip='', $confirmMessage='', $moreButtonStyle='' + ) { if ($controller=='') $controller='materiels'; $controllerArgs = []; $controllerArgs['controller'] = $controller; diff --git a/src/Controller/CategoriesController.php b/src/Controller/CategoriesController.php index e4a8b89..4e7e65c 100755 --- a/src/Controller/CategoriesController.php +++ b/src/Controller/CategoriesController.php @@ -101,6 +101,16 @@ class CategoriesController extends AppController */ public function index() { + + $this->index_generic( + 'catégories', + [ + 'nom'=>'Nom', + 'sur_categorie_id' => 'Domaine', + ] + ); + + /* $this->paginate = [ 'contain' => [ 'SurCategories' @@ -112,6 +122,7 @@ class CategoriesController extends AppController $this->set('_serialize', [ 'categories' ]); + */ } /** @@ -130,7 +141,7 @@ class CategoriesController extends AppController //return parent::view($id, $associated_entity_types); //return $this->view_generic($id, $associated_entity_types, 'SurCategories'); //return $this->view_generic($id, $child_entity_types, ['SurCategories']); - return $this->view_generic($id, $child_entity_types); + return $this->view_generic($id, $child_entity_types, 'sous-categories', ' une sous-catégorie'); /* $category = $this->Categories->get($id, [ @@ -160,8 +171,10 @@ class CategoriesController extends AppController * * @return \Cake\Network\Response|void Redirects on successful add, renders view otherwise. */ - public function add() + //public function add() + public function add($parent_id=null) { + //debug($parent_id); $category = $this->Categories->newEntity(); if ($this->request->is('post')) { $category = $this->Categories->patchEntity($category, $this->request->getData()); diff --git a/src/Controller/GroupesMetiersController.php b/src/Controller/GroupesMetiersController.php index b8a3049..da8a3db 100755 --- a/src/Controller/GroupesMetiersController.php +++ b/src/Controller/GroupesMetiersController.php @@ -78,7 +78,7 @@ class GroupesMetiersController extends AppController */ public function index() { - $this->index_generic( + $this->index_groups( 'metier', 'métier', "https://www.irap.omp.eu/homepage/organisation/groupes-metiers" ); diff --git a/src/Controller/GroupesThematiquesController.php b/src/Controller/GroupesThematiquesController.php index cac2875..d847b79 100755 --- a/src/Controller/GroupesThematiquesController.php +++ b/src/Controller/GroupesThematiquesController.php @@ -71,7 +71,7 @@ class GroupesThematiquesController extends AppController */ public function index() { - $this->index_generic( + $this->index_groups( 'thematique', 'thématique', "https://www.irap.omp.eu/homepage/organisation/groupes-thematiques" ); diff --git a/src/Controller/SousCategoriesController.php b/src/Controller/SousCategoriesController.php index 6d983b9..e1c8eab 100755 --- a/src/Controller/SousCategoriesController.php +++ b/src/Controller/SousCategoriesController.php @@ -146,7 +146,7 @@ class SousCategoriesController extends AppController * * @return \Cake\Network\Response|void Redirects on successful add, renders view otherwise. */ - public function add() + public function add($parent_id=null) { $sousCategory = $this->SousCategories->newEntity(); if ($this->request->is('post')) { diff --git a/src/Controller/SurCategoriesController.php b/src/Controller/SurCategoriesController.php index 052543c..d6b53c0 100755 --- a/src/Controller/SurCategoriesController.php +++ b/src/Controller/SurCategoriesController.php @@ -195,7 +195,8 @@ class SurCategoriesController extends AppController 'Materiels' ]; //return parent::view($id, $associated_entity_types); - return $this->view_generic($id, $child_entity_types); + return $this->view_generic($id, $child_entity_types, 'categories', ' une catégorie'); + } diff --git a/src/Template/Categories/add.ctp b/src/Template/Categories/add.ctp index 891deeb..e4fcbbe 100755 --- a/src/Template/Categories/add.ctp +++ b/src/Template/Categories/add.ctp @@ -1,3 +1,7 @@ +request->getParam('pass')[0]) ? $this->request->getParam('pass')[0] : null; +?>
Form->create($category) ?> @@ -9,7 +13,8 @@ echo $this->Form->control('nom'); echo $this->Form->control('sur_categorie_id', [ 'label' => 'Domaine', - 'options' => $surCategories + 'options' => $surCategories, + 'default' => $parent_id, ]); ?> diff --git a/src/Template/Categories/index.ctp b/src/Template/Categories/index.ctp index d169fc6..5f155f5 100755 --- a/src/Template/Categories/index.ctp +++ b/src/Template/Categories/index.ctp @@ -1,56 +1,2 @@ - -
- - Liste des catégories'; ?> - - element('button_add'); ?> - - - - - - - - - - - - - - - - - - - - - - - -
Paginator->sort('nom', 'Nom') ?>Paginator->sort('sur_categorie_id', 'Domaine') ?>
- - Html->link(__(''), ['action' => 'edit', $category->id], ['title' => 'Editer', 'style' => 'margin: 0 2px', 'escape' => false ]) ?> - - - - Form->postLink(__(''), ['action' => 'delete', $category->id], ['title' => 'Supprimer', 'style' => 'margin: 0 2px', 'escape' => false, 'confirm' => __('Êtes-vous sur de vouloir supprimer # {0}?', $category->id)]) ?> - - Html->link($category->nom, ['action' => 'view', $category->id]) ?>has('sur_category') ? $this->Html->link($category->sur_category->nom, ['controller' => 'SurCategories', 'action' => 'view', $category->sur_category->id]) : '' ?>
- - element('pagination_with_first_and_last'); ?> - - -
- - - +extend('/Common/index_gen'); \ No newline at end of file diff --git a/src/Template/Common/index.ctp b/src/Template/Common/index.ctp deleted file mode 100755 index fea87c2..0000000 --- a/src/Template/Common/index.ctp +++ /dev/null @@ -1,105 +0,0 @@ - - - -
- - Liste des '.$configuration->nom_groupe_thematique.'s'; - $group_type_name = $configuration->{'nom_groupe_'.$group_type1}; - $words = explode(' ',$group_type_name); - $group_type_name_plural = ''; - foreach($words as $word) $group_type_name_plural .= $word.'s '; - echo "

Liste des $group_type_name_plural

"; - - // Si une url est donnée vers la page des Groupes thématiques sur le site web du labo, on l'affiche - if ($lab_website_url) - echo "=> Groupes {$group_type2}s sur le site web du laboratoire

"; - - echo $this->element('button_add'); - ?> - - - - - - - - - - - - - - nom != 'N/A') { - if ($group->id) { - ?> - - - - - - - description = null; - $description_first_line = explode("\n", $group->description)[0]; - //debug($description_short); - //$description_short = $description_short[0]; - ?> - - - - - - -
NomDescription
- Html->link(__(''), ['action' => 'edit', $group->id], ['title' => 'Editer', 'style' => 'margin: 0 2px', 'escape' => false ]); - if (in_array($role, ['Super Administrateur'])) - echo $this->Form->postLink(__(''), ['action' => 'delete', $group->id], ['title' => 'Supprimer', 'style' => 'margin: 0 2px', 'escape' => false, 'confirm' => __('Êtes-vous sur de vouloir supprimer ce groupe ?', $group->id)]); - //echo $this->Form->postLink(__(''), ['action' => 'delete', $group->id], ['title' => 'Supprimer', 'style' => 'margin: 0 2px', 'escape' => false, 'confirm' => __('Êtes-vous sur de vouloir supprimer # {0}?', $group->id)]); - ?> - Html->link($group->nom, ['action' => 'view', $group->id]) ?>
- - element('pagination'); - ?> - -
- - \ No newline at end of file diff --git a/src/Template/Common/index_gen.ctp b/src/Template/Common/index_gen.ctp new file mode 100755 index 0000000..eb5246f --- /dev/null +++ b/src/Template/Common/index_gen.ctp @@ -0,0 +1,87 @@ + + +
+ + Liste des $entity_plural"; ?> + + element('button_add'); ?> + + + + + + + + $fnicename) + echo ""; + ?> + + + + + + + + + + + + + + toArray() as $fname=>$fval) { + } + */ + ?> + + + + + +
".$this->Paginator->sort($fname, $fnicename)."
+ + Html->link(__(''), ['action' => 'edit', $e->id], ['title' => 'Editer', 'style' => 'margin: 0 2px', 'escape' => false ]) ?> + + + + Form->postLink(__(''), ['action' => 'delete', $e->id], ['title' => 'Supprimer', 'style' => 'margin: 0 2px', 'escape' => false, 'confirm' => __('Êtes-vous sur de vouloir supprimer # {0}?', $e->id)]) ?> + + Html->link($e->nom, ['action' => 'view', $e->id]) ?>has('sur_category') ? $this->Html->link($e->sur_category->nom, ['controller' => 'SurCategories', 'action' => 'view', $e->sur_category->id]) : '' ?>
+ + element('pagination_with_first_and_last'); ?> + + +
+ + + diff --git a/src/Template/Common/index_groups.ctp b/src/Template/Common/index_groups.ctp new file mode 100755 index 0000000..fea87c2 --- /dev/null +++ b/src/Template/Common/index_groups.ctp @@ -0,0 +1,105 @@ + + + +
+ + Liste des '.$configuration->nom_groupe_thematique.'s'; + $group_type_name = $configuration->{'nom_groupe_'.$group_type1}; + $words = explode(' ',$group_type_name); + $group_type_name_plural = ''; + foreach($words as $word) $group_type_name_plural .= $word.'s '; + echo "

Liste des $group_type_name_plural

"; + + // Si une url est donnée vers la page des Groupes thématiques sur le site web du labo, on l'affiche + if ($lab_website_url) + echo "=> Groupes {$group_type2}s sur le site web du laboratoire

"; + + echo $this->element('button_add'); + ?> + + + + + + + + + + + + + + nom != 'N/A') { + if ($group->id) { + ?> + + + + + + + description = null; + $description_first_line = explode("\n", $group->description)[0]; + //debug($description_short); + //$description_short = $description_short[0]; + ?> + + + + + + +
NomDescription
+ Html->link(__(''), ['action' => 'edit', $group->id], ['title' => 'Editer', 'style' => 'margin: 0 2px', 'escape' => false ]); + if (in_array($role, ['Super Administrateur'])) + echo $this->Form->postLink(__(''), ['action' => 'delete', $group->id], ['title' => 'Supprimer', 'style' => 'margin: 0 2px', 'escape' => false, 'confirm' => __('Êtes-vous sur de vouloir supprimer ce groupe ?', $group->id)]); + //echo $this->Form->postLink(__(''), ['action' => 'delete', $group->id], ['title' => 'Supprimer', 'style' => 'margin: 0 2px', 'escape' => false, 'confirm' => __('Êtes-vous sur de vouloir supprimer # {0}?', $group->id)]); + ?> + Html->link($group->nom, ['action' => 'view', $group->id]) ?>
+ + element('pagination'); + ?> + +
+ + \ No newline at end of file diff --git a/src/Template/Common/view.ctp b/src/Template/Common/view.ctp index 7ca968e..80430fe 100755 --- a/src/Template/Common/view.ctp +++ b/src/Template/Common/view.ctp @@ -1,17 +1,20 @@ -Html->link(__(' Editer'), [ @@ -100,7 +110,7 @@ $child_entities_list = $child_entities_list; } /* - * I - Affichage des champs de l'entité (nom, description) + * I - Affichage des champs de l'entité (nom, description, ...) * * avec les entités associées "PARENTES" (groupes metier/thema, projet, user, ...) */ @@ -197,6 +207,26 @@ $child_entities_list = $child_entities_list; ?> + + element('button_add', compact( + 'id', + 'sub_controller', + 'sub_controller_singular' + )); + /* + echo $this->element('button_add', [ + 'id' => $id, + 'sub_controller' => $sub_controller, + 'sub_controller_singular' => $sub_controller_singular + ]); + */ + //echo "
"; + } + ?> + + Form->control('nom', ['readonly' => !$IS_ADD]); - + //echo $this->Form->control('nom', ['readonly' => !$IS_ADD]); + echo $this->Form->control('nom',[ + 'label' => 'Nom du doc attaché', + 'readonly' => !$IS_ADD + ]); + // - Type (hidden si photo) echo "(Si vous choisissez le type 'Photo', ce document sera affiché en tête de la fiche du $parent_type associé)"; $control = 'control'; diff --git a/src/Template/Element/button_add.ctp b/src/Template/Element/button_add.ctp index 8372f2b..504590f 100644 --- a/src/Template/Element/button_add.ctp +++ b/src/Template/Element/button_add.ctp @@ -1,7 +1,24 @@ + +
request->controller; + $entities_name = ''; + if (isset($sub_controller)) { + $controller = $sub_controller; + $entities_name = $sub_controller_singular; + } //echo $this->request->controller; //$entity = $this->request->controller; // controller name (Sites, Suivis, Organismes, ...) $bStyle = 'margin-right: 10px'; @@ -14,6 +31,6 @@ //in_array($singularHumanName, ['Matériel','Suivi','Emprunt','Fournisseur']) in_array($this->request->controller, ['Materiels','Suivis','Emprunts','Fournisseurs']) ); - if ($CAN_ADD) $echoActionButton($this->Html, 'icon-plus', $bStyle, ' Ajouter', $this->request->controller, 'add', null); + if ($CAN_ADD) $echoActionButton($this->Html, 'icon-plus', $bStyle, ' Ajouter'.$entities_name, $controller, 'add', $id); ?>
diff --git a/src/Template/GroupesMetiers/index.ctp b/src/Template/GroupesMetiers/index.ctp index 0fedea5..2ccae25 100755 --- a/src/Template/GroupesMetiers/index.ctp +++ b/src/Template/GroupesMetiers/index.ctp @@ -1,2 +1,2 @@ extend('/Common/index'); \ No newline at end of file +$this->extend('/Common/index_groups'); \ No newline at end of file diff --git a/src/Template/GroupesThematiques/index.ctp b/src/Template/GroupesThematiques/index.ctp index 0fedea5..2ccae25 100755 --- a/src/Template/GroupesThematiques/index.ctp +++ b/src/Template/GroupesThematiques/index.ctp @@ -1,2 +1,2 @@ extend('/Common/index'); \ No newline at end of file +$this->extend('/Common/index_groups'); \ No newline at end of file diff --git a/src/Template/Layout/default.ctp b/src/Template/Layout/default.ctp index 80facce..6bb4c46 100755 --- a/src/Template/Layout/default.ctp +++ b/src/Template/Layout/default.ctp @@ -1,5 +1,8 @@ viewVars); + /** Logiciel LabInvent - Inventaire des matériels d'un laboratoire @@ -203,8 +206,14 @@ $this->append('script', $this->Html->script(['script', 'DatepickerConfig', 'onTa
'; - echo $role . '
'; + //echo 'Bienvenue ' . $username . '
'; + echo 'Bienvenue '.$this->Html->link($username, [ + 'controller' => 'Users', + 'action' => 'view', + $priviledgedUser->id + //$user->id, + ]).'
'; + echo "(profil $role)" . '
'; echo $this->Html->link('Se déconnecter', [ 'controller' => 'Users', 'action' => 'logout' diff --git a/src/Template/Pages/tools.ctp b/src/Template/Pages/tools.ctp index bc10f61..dfd1eff 100755 --- a/src/Template/Pages/tools.ctp +++ b/src/Template/Pages/tools.ctp @@ -139,7 +139,7 @@ $no_limit_mode = $no_limit_mode; //if ($role == 'Super Administrateur') : if ($USER_IS_SUPERADMIN) : - $this->MyHelper->echoMenuItemWithIcon("user.jpg", "Gérer les utilisateurs", 'users'); + $this->MyHelper->echoMenuItemWithIcon("user.jpg", "Gérer les utilisateurs", 'users?sort=nom&direction=asc'); /* echo ''; //echo $this->Html->link('Gérer les utilisateurs privilégiés', [ diff --git a/src/Template/SousCategories/add.ctp b/src/Template/SousCategories/add.ctp index 7d3f912..9e7724c 100755 --- a/src/Template/SousCategories/add.ctp +++ b/src/Template/SousCategories/add.ctp @@ -1,3 +1,7 @@ +request->getParam('pass')[0]) ? $this->request->getParam('pass')[0] : null; +?>
Form->create($sousCategory) ?> @@ -9,7 +13,8 @@ echo $this->Form->control('nom'); echo $this->Form->control('categorie_id', [ 'label' => 'Catégorie', - 'options' => $categories + 'options' => $categories, + 'default' => $parent_id, ]); ?> diff --git a/src/Template/Users/index.ctp b/src/Template/Users/index.ctp index 62c148f..89e4139 100755 --- a/src/Template/Users/index.ctp +++ b/src/Template/Users/index.ctp @@ -30,7 +30,9 @@ $nbUsers = $this->Paginator->param('count'); //'controller' => 'users', //'action' => 'indexRecap', //'sort' => 'sur_categorie_id', - 'filtre' => $new_filtre + 'sort' => 'nom', + 'direction' => 'asc', + 'filtre' => $new_filtre, ]); echo "

"; ?> -- libgit2 0.21.2