diff --git a/CHANGELOG.md b/CHANGELOG.md index a64af76b4f4f85bc8a04ef8b0a14908f9c96422a..96821a6c47e9fc0d64bb2168483c2cfb22d932ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,11 +3,35 @@ Toutes les modifications apportées au projet seront documentées dans ce fichier. Le format est basé sur le modèle [Keep a Changelog](http://keepachangelog.com/) et adhère aux principes du [Semantic Versioning](http://semver.org/). +[2.1.2] - 23-11-2021 +===== + +### Ajouts + +### Evolutions + +### Corrections +- [#629](https://gitlab.libriciel.fr/libriciel/pole-citoyens/web-DPO/web-DPO/-/issues/629) + Faute d'orthographe dans l'ongle AIPD. + +- [#628](https://gitlab.libriciel.fr/libriciel/pole-citoyens/web-DPO/web-DPO/-/issues/628) + Gestion des modèles de formulaire. + +- [#627](https://gitlab.libriciel.fr/libriciel/pole-citoyens/web-DPO/web-DPO/-/issues/627) + Gestion des droits sur l'action d'activation ou désactivation d'un formulaire. + +- [#626](https://gitlab.libriciel.fr/libriciel/pole-citoyens/web-DPO/web-DPO/-/issues/626) + Suppression de l'unicité des noms des fichiers pour les modèles en base de données. + +- [#625](https://gitlab.libriciel.fr/libriciel/pole-citoyens/web-DPO/web-DPO/-/issues/625) + De l'utilisation des filtres dans les formulaires + + [2.1.1] - 09-11-2021 ===== ### Ajouts --[#623](https://gitlab.libriciel.fr/libriciel/pole-citoyens/web-DPO/web-DPO/-/issues/623) +- [#623](https://gitlab.libriciel.fr/libriciel/pole-citoyens/web-DPO/web-DPO/-/issues/623) Création d'un référentiel avec fichier annexe. Mise à disposition du référentiel existante. Modification d'un référentiel. diff --git a/README.md b/README.md index eaacf005ef3f057c4f0ec5896c973227ce78535a..d8a6cb2b5dd502c979a2195721f31f9439811021 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ -# Application web-DPO v2.1.1 +# Application web-DPO v2.1.2 [](https://php.net/) [](http://www.cecill.info/licences/Licence_CeCILL_V2-fr.html) [](http://book.cakephp.org/3.0/fr/index.html) ## Présentation -Vous êtes en présence des sources de l'application **web-DPO** version 2.1.1 +Vous êtes en présence des sources de l'application **web-DPO** version 2.1.2 Avant toute nouvelle installation, veuillez faire une sauvegarde de la base de données ainsi que la version actuelle des sources. diff --git a/VERSION.txt b/VERSION.txt index 3e3c2f1e5edb083aab93646ac7b076daa38516dd..eca07e4c1a8cbc603e5d5c2885dc0f0f9b1eef8d 100755 --- a/VERSION.txt +++ b/VERSION.txt @@ -1 +1 @@ -2.1.1 +2.1.2 diff --git a/app/Config/Schema/CreationBase/patchs/2.0.1_to_2.1.0.sql b/app/Config/Schema/CreationBase/patchs/2.0.1_to_2.1.0.sql index 8e1532a786ce0b03151f45706171c200aec500a0..5bf49af30d74e26d788f88a85d8c63d7de5f5f62 100644 --- a/app/Config/Schema/CreationBase/patchs/2.0.1_to_2.1.0.sql +++ b/app/Config/Schema/CreationBase/patchs/2.0.1_to_2.1.0.sql @@ -41,7 +41,7 @@ CREATE UNIQUE INDEX formulaires_modeles_organisations_formulaire_id_modele_id_or CREATE UNIQUE INDEX formulaires_modeles_organisations_formulaire_id_organisation_id_idx ON formulaires_modeles_organisations (formulaire_id, organisation_id); ALTER TABLE modeles RENAME COLUMN formulaires_id TO formulaire_id ; -CREATE UNIQUE INDEX modeles_name_modele_idx ON modeles (name_modele); +--CREATE UNIQUE INDEX modeles_name_modele_idx ON modeles (name_modele); CREATE UNIQUE INDEX modeles_fichier_idx ON modeles (fichier); CREATE UNIQUE INDEX modeles_name_modele_fichier_idx ON modeles (name_modele, fichier); @@ -64,7 +64,7 @@ organisation_id ALTER TABLE modele_extrait_registres DROP COLUMN organisations_id ; CREATE UNIQUE INDEX modele_extrait_registres_name_modele_fichier_idx ON modele_extrait_registres (name_modele, fichier); -CREATE UNIQUE INDEX modele_extrait_registres_name_modele_idx ON modele_extrait_registres (name_modele); +-- CREATE UNIQUE INDEX modele_extrait_registres_name_modele_idx ON modele_extrait_registres (name_modele); CREATE UNIQUE INDEX modele_extrait_registres_fichier_idx ON modele_extrait_registres (fichier); ALTER TABLE organisations ALTER COLUMN usemodelepresentation SET DEFAULT TRUE; diff --git a/app/Controller/FormulairesController.php b/app/Controller/FormulairesController.php index 4ef80cd3eb713dcdff13571f25c90e2f995558c8..073624be848fcd4d3fd87ab9d0397a537ec92036 100644 --- a/app/Controller/FormulairesController.php +++ b/app/Controller/FormulairesController.php @@ -62,9 +62,47 @@ class FormulairesController extends AppController { $this->set('title', __d('formulaire', 'formulaire.titreListeFormulaire')); - if ($this->request->is('post')) { + $conditions = [ + 'Formulaire.archive' => 'false' + ]; + + $named = Hash::expand((array)Hash::get($this->request->params, 'named')); + if (false === empty($named)) { + $this->request->data = $named; + } + + if ($this->request->is('post') || false === empty($named)) { $data = $this->request->data; + // Applications des filtres + // Filtrer par entité associée + if (!empty($data['Filtre']['organisation'])) { + $conditions[] = $this->Formulaire->getFormulaireConditionOrganisation( + $data['Filtre']['organisation'] + ); + } + + // Filtrer par entité créatrice + $createdbyorganisation = (string)Hash::get($data, 'Filtre.createdbyorganisation'); + if ($createdbyorganisation !== '') { + $conditions['Formulaire.createdbyorganisation'] = $createdbyorganisation; + } + + // Filtrer par formulaire actif + if (!empty($data['Filtre']['actif'])) { + $conditions['Formulaire.active'] = $data['Filtre']['actif']; + } + + // Filtrer par formulaire RT externe + if (!empty($data['Filtre']['rt_externe'])) { + $conditions['Formulaire.rt_externe'] = $data['Filtre']['rt_externe']; + } + + // Filtrer par formulaire archive + if (!empty($data['Filtre']['archive'])) { + $conditions['Formulaire.archive'] = $data['Filtre']['archive']; + } + if (isset($data['FormulaireOrganisation']) && empty($data['FormulaireOrganisation']['organisation_id']) === false && empty($data['FormulaireOrganisation']['formulaire_id']) === false @@ -129,31 +167,34 @@ class FormulairesController extends AppController if ($success == true) { $this->Formulaire->FormulaireOrganisation->commit(); - $this->Session->setFlash(__d('formulaire', 'formulaire.flashsuccessFormulaireAffecterEnregistrer'), 'flashsuccess'); + $this->Session->setFlash( + __d('formulaire', 'formulaire.flashsuccessFormulaireAffecterEnregistrer'), + 'flashsuccess' + ); } else { $this->Formulaire->FormulaireOrganisation->rollback(); - $this->Session->setFlash(__d('formulaire', 'formulaire.flasherrorErreurEnregistrementFormulaireAffecter'), 'flasherror'); + $this->Session->setFlash( + __d('formulaire', 'formulaire.flasherrorErreurEnregistrementFormulaireAffecter'), + 'flasherror' + ); } } } unset($this->request->data['FormulaireOrganisation']); + } - if (empty($this->request->data)) { - $this->request->data = ['Filtre' => ['archive' => 'false']]; - } - } else { - $this->request->data = ['Filtre' => ['archive' => 'false'] ]; + if (empty($this->request->data['Filtre']['archive'])) { + $this->request->data['Filtre']['archive'] = 'false'; } $this->set([ 'mesOrganisations' => $this->WebcilUsers->mesOrganisations('list'), -// 'options' => $this->_optionsFiltre(), - 'formulaires' => $this->_getSearchResults(), + 'formulaires' => $this->_getSearchResults($conditions), ]); } - public function _getSearchResults() + public function _getSearchResults($conditions) { $paginate = [ 'contain' => [ @@ -165,7 +206,7 @@ class FormulairesController extends AppController ] ], ], - 'conditions' => [], + 'conditions' => $conditions, 'fields' => [ 'Formulaire.id', 'Formulaire.libelle', @@ -180,37 +221,6 @@ class FormulairesController extends AppController ] ]; - // Applications des filtres - if (($this->request->is('post') && $this->request->params['action'] === 'index') - || empty($this->request->data) === false - ) { - // Filtrer par entité associée - if (!empty($this->request->data['Filtre']['organisation'])) { - $paginate['conditions'][] = $this->Formulaire->getFormulaireConditionOrganisation($this->request->data['Filtre']['organisation']); - } - - // Filtrer par entité créatrice - $createdbyorganisation = (string)Hash::get($this->request->data, 'Filtre.createdbyorganisation'); - if ($createdbyorganisation !== '') { - $paginate['conditions'][] = ['Formulaire.createdbyorganisation' => $createdbyorganisation]; - } - - // Filtrer par formulaire actif - if (!empty($this->request->data['Filtre']['actif'])) { - $paginate['conditions'][] = ['Formulaire.active' => $this->request->data['Filtre']['actif']]; - } - - // Filtrer par formulaire RT externe - if (!empty($this->request->data['Filtre']['rt_externe'])) { - $paginate['conditions'][] = ['Formulaire.rt_externe' => $this->request->data['Filtre']['rt_externe']]; - } - - // Filtrer par formulaire archive - if (!empty($this->request->data['Filtre']['archive'])) { - $paginate['conditions'][] = ['Formulaire.archive' => $this->request->data['Filtre']['archive']]; - } - } - // Ajout de conditions suivant l'utilisateur connecté et l'action if ($this->request->params['action'] === 'index') { array_push($paginate['fields'], @@ -239,8 +249,12 @@ class FormulairesController extends AppController { $this->set('title', __d('formulaire', 'formulaire.titreMesFormulairesOrganisation')); + $conditions[] = $this->Formulaire->getFormulaireConditionOrganisation( + $this->Session->read('Organisation.id') + ); + $this->set([ - 'formulaires' => $this->_getSearchResults(), + 'formulaires' => $this->_getSearchResults($conditions), ]); } @@ -275,10 +289,16 @@ class FormulairesController extends AppController if ($success == true) { $this->Formulaire->commit(); - $this->Session->setFlash(__d('formulaire', 'formulaire.flashsuccessFormulaireDupliquer'), 'flashsuccess'); + $this->Session->setFlash( + __d('formulaire', 'formulaire.flashsuccessFormulaireDupliquer'), + 'flashsuccess' + ); } else { $this->Formulaire->rollback(); - $this->Session->setFlash(__d('default', 'default.flasherrorEnregistrementErreur'), 'flasherror'); + $this->Session->setFlash( + __d('default', 'default.flasherrorEnregistrementErreur'), + 'flasherror' + ); } $this->redirect($this->Referers->get()); @@ -309,10 +329,16 @@ class FormulairesController extends AppController if ($success == true) { $this->Formulaire->commit(); - $this->Session->setFlash(__d('formulaire', 'formulaire.flashsuccessFormulaireDupliquerOtherOrganisation'), 'flashsuccess'); + $this->Session->setFlash( + __d('formulaire', 'formulaire.flashsuccessFormulaireDupliquerOtherOrganisation'), + 'flashsuccess' + ); } else { $this->Formulaire->rollback(); - $this->Session->setFlash(__d('default', 'default.flasherrorEnregistrementErreur'), 'flasherror'); + $this->Session->setFlash( + __d('default', 'default.flasherrorEnregistrementErreur'), + 'flasherror' + ); } $this->redirect($this->Referers->get()); @@ -333,7 +359,6 @@ class FormulairesController extends AppController $success = true; $id = $data['Formulaire']['id']; -// $this->Droits->assertRecordAuthorized('Formulaire', $id); $formulaireToDuplicate = $this->Formulaire->find('first', [ 'conditions' => [ @@ -463,10 +488,16 @@ class FormulairesController extends AppController if ($success == true) { $this->Formulaire->commit(); - $this->Session->setFlash(__d('formulaire', 'formulaire.flashsuccessFormulaireSupprimer'), 'flashsuccess'); + $this->Session->setFlash( + __d('formulaire', 'formulaire.flashsuccessFormulaireSupprimer'), + 'flashsuccess' + ); } else { $this->Formulaire->rollback(); - $this->Session->setFlash(__d('default', 'default.flasherrorEnregistrementErreur'), 'flasherror'); + $this->Session->setFlash( + __d('default', 'default.flasherrorEnregistrementErreur'), + 'flasherror' + ); } } else { throw new ForbiddenException(__d('default', 'default.flasherrorPasDroitPage')); @@ -504,7 +535,10 @@ class FormulairesController extends AppController $this->Formulaire->getInsertId() ]); } else { - $this->Session->setFlash(__d('default', 'default.flasherrorEnregistrementErreur'), 'flasherror'); + $this->Session->setFlash( + __d('default', 'default.flasherrorEnregistrementErreur'), + 'flasherror' + ); } $this->redirect([ @@ -545,8 +579,6 @@ class FormulairesController extends AppController */ public function toggle($id, $state = null) { - $this->Droits->assertRecordAuthorized('Formulaire', $id); - $success = true; $this->Formulaire->begin(); @@ -567,12 +599,18 @@ class FormulairesController extends AppController if ($success == true) { $this->Formulaire->commit(); - $this->Session->setFlash(__d('formulaire', 'formulaire.flashsuccessFormulaireEnregistrer'), 'flashsuccess'); + $this->Session->setFlash( + __d('formulaire', 'formulaire.flashsuccessFormulaireEnregistrer'), + 'flashsuccess' + ); $this->redirect($this->Referers->get()); } else { $this->Formulaire->rollback(); - $this->Session->setFlash(__d('default', 'default.flasherrorEnregistrementErreur'), 'flasherror'); + $this->Session->setFlash( + __d('default', 'default.flasherrorEnregistrementErreur'), + 'flasherror' + ); } } @@ -631,12 +669,18 @@ class FormulairesController extends AppController if ($success == true) { $this->Formulaire->commit(); - $this->Session->setFlash(__d('formulaire', 'formulaire.flashsuccessFormulaireEnregistrer'), 'flashsuccess'); + $this->Session->setFlash( + __d('formulaire', 'formulaire.flashsuccessFormulaireEnregistrer'), + 'flashsuccess' + ); $this->redirect($this->Referers->get()); } else { $this->Formulaire->rollback(); - $this->Session->setFlash(__d('default', 'default.flasherrorEnregistrementErreur'), 'flasherror'); + $this->Session->setFlash( + __d('default', 'default.flasherrorEnregistrementErreur'), + 'flasherror' + ); } } @@ -649,12 +693,18 @@ class FormulairesController extends AppController if ($success == true) { $this->FormulaireOrganisation->commit(); - $this->Session->setFlash(__d('formulaire', 'formulaire.flashsuccessFormulaireEnregistrer'), 'flashsuccess'); + $this->Session->setFlash( + __d('formulaire', 'formulaire.flashsuccessFormulaireEnregistrer'), + 'flashsuccess' + ); $this->redirect($this->Referers->get()); } else { $this->FormulaireOrganisation->rollback(); - $this->Session->setFlash(__d('default', 'default.flasherrorEnregistrementErreur'), 'flasherror'); + $this->Session->setFlash( + __d('default', 'default.flasherrorEnregistrementErreur'), + 'flasherror' + ); } } @@ -681,10 +731,16 @@ class FormulairesController extends AppController if ($success == true) { $this->FormulaireOrganisation->commit(); - $this->Session->setFlash(__d('formulaire', 'formulaire.flashsuccessDissocier'), 'flashsuccess'); + $this->Session->setFlash( + __d('formulaire', 'formulaire.flashsuccessDissocier'), + 'flashsuccess' + ); } else { $this->TypageOrganisation->rollback(); - $this->Session->setFlash(__d('formulaire', 'formulaire.flasherrorErreurDissocier'), 'flasherror'); + $this->Session->setFlash( + __d('formulaire', 'formulaire.flasherrorErreurDissocier'), + 'flasherror' + ); } $this->redirect($this->Referers->get()); @@ -799,7 +855,10 @@ class FormulairesController extends AppController if ($success == true) { $this->Formulaire->commit(); - $this->Session->setFlash(__d('formulaire', 'formulaire.flashsuccessFormulaireEnregistrer'), 'flashsuccess'); + $this->Session->setFlash( + __d('formulaire', 'formulaire.flashsuccessFormulaireEnregistrer'), + 'flashsuccess' + ); $this->redirect([ 'controller' => 'formulaires', @@ -807,7 +866,10 @@ class FormulairesController extends AppController ]); } else { $this->Formulaire->rollback(); - $this->Session->setFlash(__d('default', 'default.flasherrorEnregistrementErreur'), 'flasherror'); + $this->Session->setFlash( + __d('default', 'default.flasherrorEnregistrementErreur'), + 'flasherror' + ); } } diff --git a/app/Controller/ModelesController.php b/app/Controller/ModelesController.php index 23a09efed15e4836c593e1d855005539051252b0..c7158afadb2d2e44dd79d3aebbf098b3ead05c2c 100644 --- a/app/Controller/ModelesController.php +++ b/app/Controller/ModelesController.php @@ -143,38 +143,21 @@ class ModelesController extends AppController { */ protected function _getFormulairesMyOrganisations($mesOrganisations) { - // Soit on n'a pas encore l'entrée (pour des formulaires associés) - $sqlOrganisationIsAssociatedToFormulaire = []; - $sqlOrganisationHasModelForFormulaire = []; - foreach (array_keys($mesOrganisations) as $organisation_id) { - $sqlOrganisationIsAssociatedToFormulaire[] = $this->Formulaire->FormulaireOrganisation->sql([ - 'alias' => 'formulaires_organisations', - 'fields' => [ - 'formulaires_organisations.formulaire_id' - ], - 'conditions' => [ - 'formulaires_organisations.formulaire_id = Formulaire.id', - 'formulaires_organisations.organisation_id' => $organisation_id - ] - ]); - - $sqlOrganisationHasModelForFormulaire[] = $this->Formulaire->FormulaireModeleOrganisation->sql([ - 'alias' => 'formulaires_modeles_organisations', - 'fields' => [ - 'formulaires_modeles_organisations.formulaire_id' - ], - 'conditions' => [ - 'formulaires_modeles_organisations.formulaire_id = Formulaire.id', - 'formulaires_modeles_organisations.organisation_id' => $organisation_id - ] - ]); - } + $sqlALeDroitUtiliseOrganisation = $this->Formulaire->FormulaireOrganisation->sql([ + 'alias' => 'formulaires_organisations', + 'fields' => [ + 'formulaires_organisations.formulaire_id' + ], + 'conditions' => [ + 'formulaires_organisations.formulaire_id = Formulaire.id', + 'formulaires_organisations.organisation_id' => array_keys($mesOrganisations) + ] + ]); - // Soit il est déjà utilisé dans un des mes traitements (pour des formulaires non associés) $sqlOrganisationAlreadyUsedFormulaire = $this->Fiche->sql([ 'alias' => 'fiches', 'fields' => [ - 'DISTINCT fiches.form_id' + 'fiches.form_id' ], 'conditions' => [ 'fiches.form_id = Formulaire.id', @@ -182,6 +165,17 @@ class ModelesController extends AppController { ] ]); + $sqlFormulaireLieOrganisation = $this->Formulaire->FormulaireModeleOrganisation->sql([ + 'alias' => 'formulaires_modeles_organisations', + 'fields' => [ + 'formulaires_modeles_organisations.formulaire_id' + ], + 'conditions' => [ + 'formulaires_modeles_organisations.formulaire_id = Formulaire.id', + 'formulaires_modeles_organisations.organisation_id' => array_keys($mesOrganisations) + ] + ]); + $query = [ 'fields' => [ 'Formulaire.id', @@ -189,17 +183,13 @@ class ModelesController extends AppController { ], 'conditions' => [ 'OR' => [ - // Mon entité est associée au formulaire - 'Formulaire.id IN ( '. implode(' UNION ', $sqlOrganisationIsAssociatedToFormulaire) .' )', - [ - // Mon entité n'est pas associée au formulaire - 'Formulaire.id NOT IN ( '. implode(' UNION ', $sqlOrganisationIsAssociatedToFormulaire) .' )', - // Mais le formulaire a déjà été utilisé dans mon entité - "Formulaire.id IN ( {$sqlOrganisationAlreadyUsedFormulaire} )", - ] + // Le formulaire a le droit d'être utilisé dans mon organisation + "Formulaire.id IN ( {$sqlALeDroitUtiliseOrganisation} )", + // le formulaire a déjà été utilisé dans une fiche de mon organisation + "Formulaire.id IN ( {$sqlOrganisationAlreadyUsedFormulaire} )" ], - // Il n'existe pas encore de modèle pour ce formulaire dans mon entité - 'Formulaire.id NOT IN ( '. implode(' INTERSECT ', $sqlOrganisationHasModelForFormulaire) .' )', + // le formulaire n'est pas encore utilisé dans mon organisation + "Formulaire.id NOT IN ( {$sqlFormulaireLieOrganisation} )" ], 'order' => [ 'Formulaire.libelle ASC' @@ -231,7 +221,7 @@ class ModelesController extends AppController { $this->Modele->FormulaireModeleOrganisation->join('Organisation') ], 'fields' => [ - 'DISTINCT Modele.id', + 'Modele.id', 'Modele.name_modele', 'Modele.fichier', 'Formulaire.id', @@ -239,7 +229,14 @@ class ModelesController extends AppController { ], 'order' => [ 'Formulaire.libelle ASC', - ] + ], + 'group' => [ + 'Modele.id', + 'Modele.name_modele', + 'Modele.fichier', + 'Formulaire.id', + 'Formulaire.libelle', + ], ]; if ($this->request->params['action'] === 'entite') { diff --git a/app/Model/Fiche.php b/app/Model/Fiche.php index 363f8b2ad904e0a54ffe42d0c226cedd2a2954e0..f4a0c3f1e43fea80d6e39d944f4b851f8d8ee930 100644 --- a/app/Model/Fiche.php +++ b/app/Model/Fiche.php @@ -280,7 +280,7 @@ class Fiche extends AppModel implements LinkedOrganisationInterface { "Évaluation/scoring" => "Évaluation/scoring (y compris le profilage)", "Décision automatique avec effet légal ou similaire" => "Décision automatique avec effet légal ou similaire", "Surveillance systématique" => "Surveillance systématique", - "Données sensibles ou hautement personnellles" => "Données sensibles ou hautement personnellles (santé, géolocalisation, etc.)", + "Données sensibles ou hautement personnellles" => "Données sensibles ou hautement personnelles (santé, géolocalisation, etc.)", "Collecte à large échelle" => "Collecte à large échelle", "Croisement de données" => "Croisement de données", "Personnes vulnérables" => "Personnes vulnérables (patients, personnes âgées, enfants, etc.)", diff --git a/app/View/Elements/Modele/modalAddModeleToFormulaireToEntity.ctp b/app/View/Elements/Modele/modalAddModeleToFormulaireToEntity.ctp index 4ce9d61963e2f68856d17ccf27926899aafaa815..07e995947086e48f82080e69547a7445b2964e0e 100644 --- a/app/View/Elements/Modele/modalAddModeleToFormulaireToEntity.ctp +++ b/app/View/Elements/Modele/modalAddModeleToFormulaireToEntity.ctp @@ -5,9 +5,10 @@ $body = '<div class="row top17">' 'addFormulaire_id' => [ 'id' => 'addFormulaire_id', 'options' => $mesFormulaires, + 'class' => 'usersDeroulant form-control', 'required' => true, 'empty' => true, - 'data-placeholder' => __d('registre', 'registre.placeholderSelectionnerUser'), + 'data-placeholder' => 'Sélectionnez un formulaire', ], 'addOrganisation_id' => [ 'id' => 'addOrganisation_id', diff --git a/app/View/Modeles/index.ctp b/app/View/Modeles/index.ctp index 56ab428cb6b7e8778076bebfe7e555c8a989234b..2a67fc29d26821dc898ed9df9d4a2211ad896cc6 100755 --- a/app/View/Modeles/index.ctp +++ b/app/View/Modeles/index.ctp @@ -2,7 +2,21 @@ $this->Breadcrumbs->breadcrumbs([ $title => [] ]); +?> + +<!--Bouton de création d'un modele --> +<div class="row text-left"> + <div class="col-md-12 text-left"> + <button id="btnAddModeleToForm" type="button" class="btn btn-outline-primary" data-toggle="modal" data-target="#modalAddModele"> + <span class="fa fa-plus fa-lg"></span> + <?php + echo __d('modele', 'modele.btnCreerModele'); + ?> + </button> + </div> +</div> +<?php $pagination = null; $this->Paginator->options([ @@ -10,9 +24,9 @@ $this->Paginator->options([ ]); $pagination = $this->element('pagination'); -echo $pagination; - if (!empty($modeles)) { + echo $pagination; + echo $this->element('Buttons/affecterEntite', [ 'titleBtn' => __d('modele', 'modele.popupTitreAffecterModeleFormulaire') ]); @@ -145,6 +159,7 @@ if (!empty($modeles)) { </tbody> </table> <?php + echo $pagination; } else { ?> <div class='text-center'> diff --git a/docker/app/Dockerfile b/docker/app/Dockerfile index 2b3f002a8b560896cb2d309c3ba6b22de147b7a5..0e48332f91a1cd6e41e1a8ca6e05633d08a39fac 100644 --- a/docker/app/Dockerfile +++ b/docker/app/Dockerfile @@ -67,9 +67,10 @@ RUN ( \ postgresql-client=12+* \ python3-pip=20.0* \ python3-setuptools=45.2.* \ + python3-software-properties=0.99.* \ rsyslog=8.* \ ssh=1:8.* \ - software-properties-common=0.98.* \ + software-properties-common=0.99.* \ sudo=1.8.* \ tzdata=* \ unzip=6.0-* \