Skip to content
Snippets Groups Projects
Commit dc35f6c4 authored by Jean-Philippe Metivier's avatar Jean-Philippe Metivier
Browse files

Gestion de base + privilege

parent 7da1c0ad
No related branches found
No related tags found
No related merge requests found
Pipeline #17319 passed
Showing
with 432 additions and 14 deletions
......@@ -21,6 +21,11 @@ return [
'controller' => TableauDeBordController::class,
'action' => [
'index',
'ajouter',
'modifier',
'ajouter-indicateur',
'retirer-indicateur',
'supprimer',
'afficher',
],
'privileges' => [
......@@ -45,6 +50,16 @@ return [
],
'may_terminate' => true,
'child_routes' => [
'ajouter' => [
'type' => Literal::class,
'options' => [
'route' => '/ajouter',
'defaults' => [
'controller' => TableauDeBordController::class,
'action' => 'ajouter',
],
],
],
'afficher' => [
'type' => Segment::class,
'options' => [
......@@ -54,8 +69,48 @@ return [
'action' => 'afficher',
],
],
'may_terminate' => true,
],
'modifier' => [
'type' => Segment::class,
'options' => [
'route' => '/modifier/:tableau-de-bord',
'defaults' => [
'controller' => TableauDeBordController::class,
'action' => 'modifier',
],
],
],
'supprimer' => [
'type' => Segment::class,
'options' => [
'route' => '/supprimer/:tableau-de-bord',
'defaults' => [
'controller' => TableauDeBordController::class,
'action' => 'supprimer',
],
],
],
'ajouter-indicateur' => [
'type' => Segment::class,
'options' => [
'route' => '/ajouter-indicateur/:tableau-de-bord',
'defaults' => [
'controller' => TableauDeBordController::class,
'action' => 'ajouter-indicateur',
],
],
],
'retirer-indicateur' => [
'type' => Segment::class,
'options' => [
'route' => '/retirer-indicateur/:tableau-de-bord/:indicateur',
'defaults' => [
'controller' => TableauDeBordController::class,
'action' => 'retirer-indicateur',
],
],
],
],
],
],
......
......@@ -21,3 +21,16 @@ WITH d(code, lib, ordre) AS (
SELECT cp.id, d.code, d.lib, d.ordre
FROM d
JOIN unicaen_privilege_categorie cp ON cp.CODE = 'abonnement';
INSERT INTO unicaen_privilege_categorie (code, libelle, ordre, namespace)
VALUES ('tableaudebord', 'Gestions des abonnement', 810, 'UnicaenIndicateur\Provider\Privilege');
INSERT INTO unicaen_privilege_privilege(CATEGORIE_ID, CODE, LIBELLE, ORDRE)
WITH d(code, lib, ordre) AS (
SELECT 'afficher-tableaudebord', 'Afficher un tableau de bord', 4 UNION
SELECT 'editer-tableaudebord', 'Éditer un tableau de bord', 5 UNION
SELECT 'detruire-tableaudebord', 'Effacer un tableau de bord', 6
)
SELECT cp.id, d.code, d.lib, d.ordre
FROM d
JOIN unicaen_privilege_categorie cp ON cp.CODE = 'tableaudebord';
\ No newline at end of file
......@@ -57,6 +57,9 @@ class IndicateurController extends AbstractActionController {
{
$indicateur = $this->getIndicateurService()->getRequestedIndicateur($this);
$this->getIndicateurService()->refresh($indicateur);
$retour = $this->params()->fromQuery('retour');
if ($retour) return $this->redirect()->toUrl($retour);
return $this->redirect()->toRoute('indicateur/afficher', ['indicateur' => $indicateur->getId()], [], true);
}
......
......@@ -2,13 +2,19 @@
namespace UnicaenIndicateur\Controller;
use Laminas\Http\Response;
use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\View\Model\ViewModel;
use UnicaenIndicateur\Entity\Db\TableauDeBord;
use UnicaenIndicateur\Form\TableauDeBord\TableauDeBordFormAwareTrait;
use UnicaenIndicateur\Service\Indicateur\IndicateurServiceAwareTrait;
use UnicaenIndicateur\Service\TableauDeBord\TableauDeBordServiceAwareTrait;
class TableauDeBordController extends AbstractActionController
{
use IndicateurServiceAwareTrait;
use TableauDeBordServiceAwareTrait;
use TableauDeBordFormAwareTrait;
public function indexAction() : ViewModel
{
......@@ -27,4 +33,114 @@ class TableauDeBordController extends AbstractActionController
'tableau' => $tableau,
]);
}
public function ajouterAction() : ViewModel
{
$tableau = new TableauDeBord();
$form = $this->getTableauDeBordForm();
$form->setAttribute('action', $this->url()->fromRoute('tableau-de-bord/ajouter', [], [], true));
$form->bind($tableau);
$request = $this->getRequest();
if ($request->isPost()) {
$data = $request->getPost();
$form->setData($data);
if ($form->isValid()) {
$this->getTableauDeBordService()->create($tableau);
}
}
$vm = new ViewModel([
'title' => "Création d'un tableau de bord",
'form' => $form,
]);
$vm->setTemplate('unicaen-indicateur/default/default-form');
return $vm;
}
public function modifierAction() : ViewModel
{
$tableau = $this->getTableauDeBordService()->getRequestedTableauDeBord($this);
$form = $this->getTableauDeBordForm();
$form->setAttribute('action', $this->url()->fromRoute('tableau-de-bord/modifier', ['tableau-de-bord' => $tableau->getId()], [], true));
$form->bind($tableau);
$request = $this->getRequest();
if ($request->isPost()) {
$data = $request->getPost();
$form->setData($data);
if ($form->isValid()) {
$this->getTableauDeBordService()->update($tableau);
}
}
$vm = new ViewModel([
'title' => "Modification des informations du tableau de bord",
'form' => $form,
]);
$vm->setTemplate('unicaen-indicateur/default/default-form');
return $vm;
}
public function supprimerAction() : ViewModel
{
$tableau = $this->getTableauDeBordService()->getRequestedTableauDeBord($this);
$request = $this->getRequest();
if ($request->isPost()) {
$data = $request->getPost();
if ($data["reponse"] === "oui") $this->getTableauDeBordService()->delete($tableau);
exit();
}
$vm = new ViewModel();
if ($tableau !== null) {
$vm->setTemplate('application/default/confirmation');
$vm->setVariables([
'title' => "Suppression du tableau de bord [" . $tableau->getTitre() . "]",
'text' => "La suppression est définitive êtes-vous sûr·e de vouloir continuer ?",
'action' => $this->url()->fromRoute('tableau-de-bord/supprimer', ["tableau-de-bord" => $tableau->getId()], [], true),
]);
}
return $vm;
}
/** Gestion des indicateurs ****************************************************************/
public function ajouterIndicateurAction() : ViewModel
{
$tableau = $this->getTableauDeBordService()->getRequestedTableauDeBord($this);
$indicateurs = $this->getIndicateurService()->getIndicateurs();
$request = $this->getRequest();
if ($request->isPost()) {
$data = $request->getPost();
$indicateur = $this->getIndicateurService()->getIndicateur($data['indicateur']);
if ($indicateur) {
$tableau->addIndicateur($indicateur);
$this->getTableauDeBordService()->update($tableau);
}
}
return new ViewModel([
'title' => "Ajout d'un indicateur au tableau de bord",
'tableau' => $tableau,
'indicateurs' => $indicateurs,
]);
}
public function retirerIndicateurAction() : Response
{
$tableau = $this->getTableauDeBordService()->getRequestedTableauDeBord($this);
$indicateur = $this->getIndicateurService()->getRequestedIndicateur($this);
$tableau->removeIndicateur($indicateur);
$this->getTableauDeBordService()->update($tableau);
return $this->redirect()->toRoute('tableau-de-bord/afficher', ['tableau-de-bord' => $tableau->getId()], [], true);
}
}
\ No newline at end of file
......@@ -6,6 +6,8 @@ use Psr\Container\ContainerExceptionInterface;
use Psr\Container\ContainerInterface;
use Psr\Container\NotFoundExceptionInterface;
use UnicaenIndicateur\Entity\Db\TableauDeBord;
use UnicaenIndicateur\Form\TableauDeBord\TableauDeBordForm;
use UnicaenIndicateur\Service\Indicateur\IndicateurService;
use UnicaenIndicateur\Service\TableauDeBord\TableauDeBordService;
class TableauDeBordControllerFactory {
......@@ -19,11 +21,18 @@ class TableauDeBordControllerFactory {
public function __invoke(ContainerInterface $container) : TableauDeBordController
{
/**
* @var IndicateurService $indicateurService
* @var TableauDeBordService $tableauService
* @var TableauDeBordForm $tableauForm
*/
$indicateurService = $container->get(IndicateurService::class);
$tableauService = $container->get(TableauDeBordService::class);
$tableauForm = $container->get('FormElementManager')->get(TableauDeBordForm::class);
$controller = new TableauDeBordController();
$controller->setIndicateurService($indicateurService);
$controller->setTableauDeBordForm($tableauForm);
$controller->setTableauDeBordService($tableauService);
return $controller;
}
}
\ No newline at end of file
......@@ -16,7 +16,7 @@
<join-column name="tableau_id" referenced-column-name="id"/>
</join-columns>
<inverse-join-columns>
<join-column name="indicateur_id" referenced-column-name="ID"/>
<join-column name="indicateur_id" referenced-column-name="id"/>
</inverse-join-columns>
</join-table>
</many-to-many>
......
......@@ -72,4 +72,9 @@ class TableauDeBord {
{
$this->indicateurs->removeElement($indicateur);
}
public function hasIndicateur(Indicateur $indicateur) : bool
{
return $this->indicateurs->contains($indicateur);
}
}
\ No newline at end of file
......@@ -15,8 +15,8 @@ class TableauDeBordHydrator implements HydratorInterface {
{
$data = [
'libelle' => $object->getTitre(),
'description' => $object->getTitre(),
'nb_colonne' => $object->getTitre(),
'description' => $object->getDescription(),
'nb_colonne' => $object->getNbColumn(),
];
return $data;
}
......
<?php
namespace UnicaenIndicateur\Provider\Privilege;
use UnicaenPrivilege\Provider\Privilege\Privileges;
class TableaudebordPrivileges extends Privileges
{
const AFFICHER = 'tableaudebord-afficher';
const EDITER = 'tableaudebord-editer';
const DETRUIRE = 'tableaudebord-detruire';
}
\ No newline at end of file
......@@ -8,15 +8,31 @@
use UnicaenIndicateur\Entity\Db\Abonnement;
use UnicaenIndicateur\Entity\Db\Indicateur;
use UnicaenIndicateur\Provider\Privilege\IndicateurPrivileges;
use UnicaenIndicateur\Provider\Privilege\TableaudebordPrivileges;
$canVoir = $this->isAllowed(IndicateurPrivileges::getResourceId(IndicateurPrivileges::AFFICHER));
$canEditer = $this->isAllowed(IndicateurPrivileges::getResourceId(IndicateurPrivileges::EDITER));
$canDetruire = $this->isAllowed(IndicateurPrivileges::getResourceId(IndicateurPrivileges::DETRUIRE));
$canTableaux = $this->isAllowed(TableaudebordPrivileges::getResourceId(TableaudebordPrivileges::EDITER));
?>
<div class="row">
<div class="col-md-9">
<h1 class="page-header">
Indicateurs
</h1>
</div>
<div class="col-md-3">
<?php if ($canTableaux) : ?>
<?php /** @see \UnicaenIndicateur\Controller\TableauDeBordController::indexAction() */ ?>
<a href="<?php echo $this->url('tableau-de-bord',[], [], true); ?>" class="btn btn-secondary">
<span class="icon icon-lister"></span>
Accéder aux tableaux de bord
</a>
<?php endif; ?>
</div>
</div>
<div class="main">
......
<?php
use UnicaenIndicateur\Entity\Db\TableauDeBord;
use UnicaenIndicateur\Provider\Privilege\IndicateurPrivileges;
use UnicaenIndicateur\Provider\Privilege\TableaudebordPrivileges;
/**
* @see \UnicaenIndicateur\Controller\TableauDeBordController::afficherAction()
* @var TableauDeBord $tableau
*/
$this->headTitle($tableau?$tableau->getTitre():"Tableau de bord supprimé");
$canIndex = $this->isAllowed(TableaudebordPrivileges::getResourceId(TableaudebordPrivileges::EDITER));
$canGerer = $this->isAllowed(TableaudebordPrivileges::getResourceId(TableaudebordPrivileges::EDITER));
$canSupprimer = $this->isAllowed(TableaudebordPrivileges::getResourceId(TableaudebordPrivileges::DETRUIRE));
$canAfficherIndicateur = $this->isAllowed(IndicateurPrivileges::getResourceId(IndicateurPrivileges::AFFICHER));
$width = 12 / ((int) ($tableau?$tableau->getNbColumn():1));
?>
<?php if ($tableau === null) : ?>
<div class="alert alert-danger">
Tableau de bord supprimé
</div>
<?php else : ?>
<div class="row">
<div class="col-md-9">
<h1 class="page-header">
<?php echo $tableau->getTitre(); ?>
<?php if ($tableau->getDescription()) : ?>
<span class="icon icon-information" title="<?php echo $tableau->getDescription(); ?>"
data-bs-toggle="tooltip" data-bs-html="true"></span>
<?php endif; ?>
</h1>
</div>
<div class="col-md-3">
<?php if ($canIndex) : ?>
<?php /** @see \UnicaenIndicateur\Controller\TableauDeBordController::indexAction() */ ?>
<a href="<?php echo $this->url('tableau-de-bord', [], [], true); ?>"
class="btn btn-secondary">
<span class="icon icon-lister"></span>
Accéder aux tableaux de bord
</a>
<?php endif;?>
</div>
</div>
<?php if ($canGerer) : ?>
<?php /** @see \UnicaenIndicateur\Controller\TableauDeBordController::modifierAction() */?>
<a href="<?php echo $this->url('tableau-de-bord/modifier', ['tableau-de-bord' => $tableau->getId()], [], true); ?>" class="btn btn-primary ajax-modal" data-event="modification">
<span class="icon icon-modifier"></span>
Modifier les informations
</a>
<?php /** @see \UnicaenIndicateur\Controller\TableauDeBordController::ajouterIndicateurAction() */?>
<a href="<?php echo $this->url('tableau-de-bord/ajouter-indicateur', ['tableau-de-bord' => $tableau->getId()], [], true); ?>" class="btn btn-primary ajax-modal" data-event="modification">
<span class="icon icon-ajouter"></span>
Ajouter un indicateur
</a>
<?php endif; ?>
<?php if ($canSupprimer) : ?>
<a href="<?php echo $this->url("tableau-de-bord/supprimer", ['tableau-de-bord' => $tableau->getId()], [], true); ?>" class="btn btn-danger ajax-modal" data-event="modification">
<span class="icon icon-unchecked"></span>
Supprimer le tableau de bord
</a>
<?php endif; ?>
<div class="row">
<?php foreach ($tableau->getIndicateurs() as $indicateur) : ?>
<div class="col-md-<?php echo $width; ?>">
<div class="row">
<div class="col-md-8">
<?php echo $indicateur->getTitre(); ?>
</div>
<div class="col-md-4">
<?php if ($canAfficherIndicateur) : ?>
<?php /** @see \UnicaenIndicateur\Controller\IndicateurController::rafraichirAction() */?>
<a href="<?php echo $this->url('indicateur/rafraichir', ['indicateur' => $indicateur->getId()],
["query" => ["retour" => $this->url("tableau-de-bord/afficher", ["tableau-de-bord" => $tableau->getId()], ["force_canonical" => true], true)]], true); ?>" title="Rafraichir l'indicateur">
<span class="icon icon-synchroniser"></span></a>
<?php /** @see \UnicaenIndicateur\Controller\IndicateurController::afficherAction() */?>
<a href="<?php echo $this->url('indicateur/afficher', ['indicateur' => $indicateur->getId()], [], true); ?>" title="Afficher l'indicateur">
<span class="icon icon-voir"></span></a>
<?php /** @see \UnicaenIndicateur\Controller\IndicateurController::exporterAction() */?>
<a href="<?php echo $this->url('indicateur/exporter', ['indicateur' => $indicateur->getId()], [], true); ?>" title="Exporter l'indicateur">
<span class="icon icon-csv"></span></a>
<?php endif; ?>
<?php if ($canGerer) : ?>
<?php /** @see \UnicaenIndicateur\Controller\TableauDeBordController::retirerIndicateurAction() */ ?>
<a href="<?php echo $this->url("tableau-de-bord/retirer-indicateur",["tableau-de-bord" => $tableau->getId(), "indicateur" => $indicateur->getId()],[], true); ?>" title="Retirer cet indicateur du tableau de bord">
<span class="icon icon-unchecked text-danger"></span></a>
<?php endif; ?>
</div>
</div>
<span class="todo">Faire le view helper des données des indicateurs </span>
</div>
<?php endforeach; ?>
</div>
<?php endif; ?>
<script>
$(function() {
$("body").on("modification", function (event) {
event.div.modal('hide');
window.location.reload();
});
});
</script>
\ No newline at end of file
<?php
use UnicaenIndicateur\Entity\Db\Indicateur;
use UnicaenIndicateur\Entity\Db\TableauDeBord;
/**
* @see \UnicaenIndicateur\Controller\TableauDeBordController::ajouterIndicateurAction()
* @var TableauDeBord $tableau
* @var Indicateur[] $indicateurs
*/
$in = []; $out = [];
foreach ($indicateurs as $indicateur) {
if ($tableau->hasIndicateur($indicateur)) {
$in[] = $indicateur;
} else {
$out[] = $indicateur;
}
}
?>
<?php if (!empty($in)) : ?>
<div class="alert alert-info">
<span class="icon icon-information"></span>
Liste des indicateurs déjà présents dans le tableau de bord :
<?php
$liste = array_map(function (Indicateur $a) { return $a->getTitre();}, $in);
echo implode(", ",$liste).".";
?>
</div>
<?php endif; ?>
<form method="post" action="<?php echo $this->url('tableau-de-bord/ajouter-indicateur', ["tableu-de-bord" => $tableau->getId()], [], true); ?>">
<label for="indicateur">Liste des indicateurs disponibles : </label><br>
<select id="indicateur" name="indicateur" class="selectpicker" data-live-search="true">
<?php foreach ($out as $indicateur) : ?>
<option value="<?php echo $indicateur->getId(); ?>">
<?php echo $indicateur->getTitre(); ?>
</option>
<?php endforeach; ?>
</select>
<br>
<input type="submit" class="btn btn-primary" value="Ajouter l'indicateur">
</form>
<script>
$('select.selectpicker').selectpicker();
</script>
\ No newline at end of file
<?php
use UnicaenIndicateur\Entity\Db\TableauDeBord;
use UnicaenIndicateur\Provider\Privilege\IndicateurPrivileges;
use UnicaenIndicateur\Provider\Privilege\TableaudebordPrivileges;
/**
* @see \UnicaenIndicateur\Controller\TableauDeBordController::afficherAction()
* @see \UnicaenIndicateur\Controller\TableauDeBordController::indexAction()
* @var TableauDeBord[] $tableaux
*/
$this->headTitle("Index des tableaux de bords");
$canAfficher = $this->isAllowed(TableaudebordPrivileges::getResourceId(TableaudebordPrivileges::AFFICHER));
$canModifier = $this->isAllowed(TableaudebordPrivileges::getResourceId(TableaudebordPrivileges::EDITER));
$canGerer = $this->isAllowed(TableaudebordPrivileges::getResourceId(TableaudebordPrivileges::EDITER));;
$canSupprimer = $this->isAllowed(TableaudebordPrivileges::getResourceId(TableaudebordPrivileges::DETRUIRE));;
$canIndicateurs = $this->isAllowed(IndicateurPrivileges::getResourceId(IndicateurPrivileges::EDITER));
?>
<div class="row">
......@@ -26,8 +34,9 @@ $this->headTitle("Index des tableaux de bords");
</div>
</div>
<a href=""
class="ajax-modal btn btn-primary">
<?php /** @see \UnicaenIndicateur\Controller\TableauDeBordController::ajouterAction() */ ?>
<a href="<?php echo $this->url("tableau-de-bord/ajouter", [], [], true); ?>"
class="ajax-modal btn btn-primary" data-event="modification">
<span class="icon icon-ajouter"></span>
Créer un tableau de bord
</a>
......@@ -60,12 +69,33 @@ $this->headTitle("Index des tableaux de bords");
<?php echo count($tableau->getIndicateurs()); ?>
</td>
<td>
<span class="icon icon-voir"></span>
<span class="icon icon-editer"></span>
<span class="icon icon-unchecked text-danger"></span>
<?php if ($canAfficher) : ?>
<a href="<?php echo $this->url('tableau-de-bord/afficher', ['tableau-de-bord' => $tableau->getId()], [], true); ?>">
<span class="icon icon-voir" title="Afficher le tableau de bord"></span></a>
<?php endif; ?>
<?php if ($canModifier) : ?>
<a href="<?php echo $this->url('tableau-de-bord/modifier', ['tableau-de-bord' => $tableau->getId()], [], true); ?>"
class="ajax-modal" data-event="modification">
<span class="icon icon-editer" title="Modifier le tableau de bord"></span></a>
<?php endif; ?>
<?php if ($canSupprimer) : ?>
<a href="<?php echo $this->url('tableau-de-bord/supprimer', ['tableau-de-bord' => $tableau->getId()], [], true); ?>"
class="ajax-modal" data-event="modification">
<span class="icon icon-unchecked text-danger"></span></a>
<?php endif; ?>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<?php endif; ?>
<script>
$(function() {
$("body").on("modification", function (event) {
event.div.modal('hide');
window.location.reload();
});
});
</script>
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment