diff --git a/config/merged/etat-instance.config.php b/config/merged/etat-instance.config.php index 40146420164fc4c82dd849f559f197a7708c4971..d5835b68fc8d8dc382494bacf89a99a4abab12ad 100644 --- a/config/merged/etat-instance.config.php +++ b/config/merged/etat-instance.config.php @@ -16,6 +16,13 @@ return [ 'bjyauthorize' => [ 'guards' => [ PrivilegeController::class => [ + [ + 'controller' => EtatInstanceController::class, + 'action' => [ + 'rechercher-utilisateur', + ], + 'roles' => [], + ], [ 'controller' => EtatInstanceController::class, 'action' => [ @@ -53,8 +60,18 @@ return [ ], 'may_terminate' => true, 'child_routes' => [ - 'supprimer' => [ + 'rechercher-utilisateur' => [ 'type' => Literal::class, + 'options' => [ + 'route' => '/rechercher-utilisateur', + 'defaults' => [ + 'controller' => EtatInstanceController::class, + 'action' => 'rechercher-utilisateur', + ], + ], + ], + 'supprimer' => [ + 'type' => Segment::class, 'options' => [ 'route' => '/supprimer/:instance', 'defaults' => [ diff --git a/src/UnicaenEtat/Controller/EtatInstanceController.php b/src/UnicaenEtat/Controller/EtatInstanceController.php index a37414f3a88798afa5e96005cf07ea81f80504ab..80cbded180ad095adaacc73d0e6442e683afc517 100644 --- a/src/UnicaenEtat/Controller/EtatInstanceController.php +++ b/src/UnicaenEtat/Controller/EtatInstanceController.php @@ -4,18 +4,26 @@ namespace UnicaenEtat\Controller; use Laminas\Http\Request; use Laminas\Mvc\Controller\AbstractActionController; +use Laminas\View\Model\JsonModel; use Laminas\View\Model\ViewModel; use UnicaenEtat\Service\EtatInstance\EtatInstanceServiceAwareTrait; +use UnicaenEtat\Service\EtatType\EtatTypeServiceAwareTrait; +use UnicaenUtilisateur\Entity\Db\User; class EtatInstanceController extends AbstractActionController { use EtatInstanceServiceAwareTrait; + use EtatTypeServiceAwareTrait; public function indexAction() : ViewModel { - $instances = $this->getEtatInstanceService()->getEtatsInstances(); + $params = $this->params()->fromQuery(); + $instances = $this->getEtatInstanceService()->getEtatsInstancesWithFiltre($params); + $types = $this->getEtatTypeService()->getEtatsTypes(); return new ViewModel([ + 'params' => $params, 'instances' => $instances, + 'types' => $types, ]); } @@ -42,4 +50,22 @@ class EtatInstanceController extends AbstractActionController { } return $vm; } + public function rechercherUtilisateurAction() + { + if (($term = $this->params()->fromQuery('term'))) { + /** @var User $utilisateurs */ + $utilisateurs = $this->getEtatInstanceService()->findUtilisateurByTerm($term); + foreach ($utilisateurs as $utilisateur) { + $result[] = array( + 'id' => $utilisateur->getHistoCreateur()->getId(), + 'label' => $utilisateur->getHistoCreateur()->getDisplayName(), + ); + } + usort($result, function ($a, $b) { + return strcmp($a['label'], $b['label']); + }); + return new JsonModel($result); + } + exit; + } } \ No newline at end of file diff --git a/src/UnicaenEtat/Controller/EtatInstanceControllerFactory.php b/src/UnicaenEtat/Controller/EtatInstanceControllerFactory.php index b1bb6bb32813a8d260eb105d75ab099fc6c742f0..702724ab093d8c3709167f93759a76a555e7f98e 100644 --- a/src/UnicaenEtat/Controller/EtatInstanceControllerFactory.php +++ b/src/UnicaenEtat/Controller/EtatInstanceControllerFactory.php @@ -4,6 +4,7 @@ namespace UnicaenEtat\Controller; use Interop\Container\ContainerInterface; use UnicaenEtat\Service\EtatInstance\EtatInstanceService; +use UnicaenEtat\Service\EtatType\EtatTypeService; class EtatInstanceControllerFactory { @@ -17,11 +18,14 @@ class EtatInstanceControllerFactory { { /** * @var EtatInstanceService $instanceService + * @var EtatTypeService $typeService */ $instanceService = $container->get(EtatInstanceService::class); + $typeService = $container->get(EtatTypeService::class); $controller = new EtatInstanceController(); $controller->setEtatInstanceService($instanceService); + $controller->setEtatTypeService($typeService); return $controller; } } \ No newline at end of file diff --git a/src/UnicaenEtat/Service/EtatInstance/EtatInstanceService.php b/src/UnicaenEtat/Service/EtatInstance/EtatInstanceService.php index cf800063a1301662820fa7ddc4db5091c3e811e4..37b85d8686c7d239a79e6a0b1941f1b81639f87a 100644 --- a/src/UnicaenEtat/Service/EtatInstance/EtatInstanceService.php +++ b/src/UnicaenEtat/Service/EtatInstance/EtatInstanceService.php @@ -10,6 +10,7 @@ use UnicaenApp\Exception\RuntimeException; use UnicaenApp\Service\EntityManagerAwareTrait; use UnicaenEtat\Entity\Db\EtatInstance; use UnicaenEtat\Service\EtatType\EtatTypeServiceAwareTrait; +use UnicaenUtilisateur\Entity\Db\User; class EtatInstanceService { use EntityManagerAwareTrait; @@ -79,6 +80,8 @@ class EtatInstanceService { public function createQueryBuilder() : QueryBuilder { $qb = $this->getEntityManager()->getRepository(EtatInstance::class)->createQueryBuilder('einstance') + ->addSelect('createur')->join('einstance.histoCreateur', 'createur') + ->addSelect('modificateur')->join('einstance.histoModificateur', 'modificateur') ->join('einstance.type', 'etype')->addSelect('etype') ->leftJoin('etype.categorie', 'ecategorie')->addSelect('ecategorie') ; @@ -128,6 +131,43 @@ class EtatInstanceService { return $result; } + /** + * @param ?string $term + * @return User[] + */ + public function findUtilisateurByTerm(?string $term) : array + { + $qb = $this->createQueryBuilder() + ->andWhere("LOWER(createur.displayName) like :search") + ->setParameter('search', '%'.strtolower($term).'%'); + $result = $qb->getQuery()->getResult(); + + $validateurs = []; + /** @var $item */ + foreach ($result as $item) { + $validateurs[$item->getHistoCreateur()->getId()] = $item; + } + return $validateurs; + } + + /** + * @param array $params + * @return EtatInstance[] + */ + public function getEtatsInstancesWithFiltre(array $params) : array + { + $qb = $this->createQueryBuilder(); + if (isset($params['type']) AND $params['type'] !== '') { + $qb = $qb->andWhere('etype.code = :code')->setParameter('code', $params['type']); + } + if (isset($params['utilisateur']) AND isset($params['utilisateur']['id']) AND $params['utilisateur']['id'] !== '') { + $id = ((int) $params['utilisateur']['id']); + $qb = $qb->andWhere('createur.id = :id')->setParameter('id', $id); + } + + $result = $qb->getQuery()->getResult(); + return $result; + } /** FACADE ********************************************************************************************************/ public function createWithCode(string $code) : EtatInstance diff --git a/view/unicaen-etat/etat-categorie/index.phtml b/view/unicaen-etat/etat-categorie/index.phtml index ac0c155a3ec85a9b198f8661bf4d49577c531141..f77b0aef65d8fbca9a31d88dea5abb598e50dc5d 100644 --- a/view/unicaen-etat/etat-categorie/index.phtml +++ b/view/unicaen-etat/etat-categorie/index.phtml @@ -23,8 +23,7 @@ $this->headTitle("Catégories d'état"); Ajouter une catégorie d'état </a> </div> - <div class="pull-right"> - + <div class="col-md-4"> <?php /** @see \UnicaenEtat\Controller\EtatTypeController::indexAction() */ ?> <a href="<?php echo $this->url('unicaen-etat/etat-type', [], [], true); ?>" class="btn btn-primary action"> @@ -32,10 +31,10 @@ $this->headTitle("Catégories d'état"); Accéder aux types </a> <br/> - <a href="<?php echo $this->url('unicaen-etat/etat-type/ajouter', [], [], true); ?>" - class="btn btn-primary action disabled"> + <a href="<?php echo $this->url('unicaen-etat/etat-instance', [], [], true); ?>" + class="btn btn-primary action"> <span class="icon acceder"></span> - Accéder aux instances TODO + Accéder aux instances </a> </div> </div> diff --git a/view/unicaen-etat/etat-instance/index.phtml b/view/unicaen-etat/etat-instance/index.phtml index 855e8b84e25f8372e9f7cba44edc15555dd239d2..391c5848a6035152094f4969e6c3a11721270d6e 100644 --- a/view/unicaen-etat/etat-instance/index.phtml +++ b/view/unicaen-etat/etat-instance/index.phtml @@ -3,6 +3,7 @@ /** * @see \UnicaenEtat\Controller\EtatCategorieController::indexAction() * @var EtatInstance[] $instances + * @var array $params */ use UnicaenEtat\Entity\Db\EtatInstance; @@ -16,14 +17,8 @@ $this->headTitle("Catégories d'état"); Instances d'état <span class="badge"><?php echo count($instances); ?></span> </h1> -<!-- --><?php ///** @see \UnicaenEtat\Controller\EtatCategorieController::ajouterAction() */ ?> -<!-- <a href="--><?php //echo $this->url('unicaen-etat/etat-instance/ajouter', [], [], true); ?><!--"--> -<!-- class="btn btn-primary action ajax-modal" data-event="modification">--> -<!-- <span class="icon ajouter"></span>--> -<!-- Ajouter une catégorie d'état--> -<!-- </a>--> </div> - <div class="pull-right"> + <div class="col-md-4"> <?php /** @see \UnicaenEtat\Controller\EtatTypeController::indexAction() */ ?> <a href="<?php echo $this->url('unicaen-etat/etat-type', [], [], true); ?>" @@ -40,7 +35,7 @@ $this->headTitle("Catégories d'état"); </div> </div> -<span class="todo"> filtre</span> <br><br> +<?php echo $this->partial('partial/filtre', ["params" => $params, "categories" => $categories, "types" => $types], [], true); ?> <table class="table table-condensed table-hover"> <thead> diff --git a/view/unicaen-etat/etat-instance/partial/filtre.phtml b/view/unicaen-etat/etat-instance/partial/filtre.phtml new file mode 100644 index 0000000000000000000000000000000000000000..2aaf0752ac1058fc1db0d1ce84629f7454c6e93e --- /dev/null +++ b/view/unicaen-etat/etat-instance/partial/filtre.phtml @@ -0,0 +1,81 @@ +<?php + +/** + * @var array $params + * @var \UnicaenValidation\Entity\Db\EtatType[] $types + */ + +use UnicaenApp\Form\Element\SearchAndSelect; + +?> + +<div class="card card-default"> + <div class="card-header"> + <span class="icon icon-filtrer"></span> + Filtrer les instances de validations + </div> + <div class="card-body"> + <form id="filter" method="get" action="<?php echo $this->url(); ?>"> + <div class="row"> + <div class="col-md-8"> + <div class="row"> + <div class="col-md-6"> + <label for="type">Type d'état : </label> + <select id="type" name="type" class="selectpicker" data-live-search="true"> + <option value="">Peu importe</option> + <?php foreach ($types as $etype) : ?> + <option value="<?php echo $etype->getCode(); ?>"> + <?php echo ($etype->getCategorie())?$etype->getCategorie()->getLibelle():"Sans catégorie"; ?> + > + <?php echo $etype->getLibelle(); ?> + </option> + <?php endforeach; ?> + </select> + </div> + <div class="col-md-6"> + <?php + /** @see \UnicaenEtat\Controller\EtatInstanceController::rechercherUtilisateurAction() */ + $agentF = new SearchAndSelect('utilisateur', ['label' => "Utilisateur·trice :"]); + $agentF + ->setAutocompleteSource($this->url('unicaen-etat/etat-instance/rechercher-utilisateur')) + ->setSelectionRequired(true) + ->setAttributes([ + 'id' => 'utilisateur', + 'placeholder' => "Nom de l'utilisateur·trice ...", + ]); + ?> + <?php echo $this->formControlGroup($agentF); ?> + </div> + </div> + </div> + <div class="col-md-4"> + <button type="button" id="filter" class="btn btn-primary filter-action"> + <span class="icon filtrer" aria-hidden="true"></span> Filtrer + </button> + <br/> + <button type="button" id="reset" class="btn btn-primary filter-action"> + <span class="icon effacer" aria-hidden="true"></span> R.A.Z. + </button> + </div> + </div> + </form> + </div> +</div> + + +<script> + $('button#reset').click(function (e) { + e.preventDefault(); + window.location = '?'; + }); + $('button#filter').click(function () { + $('form#filter').submit(); + }); + +<?php if ($params['utilisateur']['id'] !== "") :?> + $('input[name="utilisateur[label]').val(" <?php echo $params['utilisateur']['label']; ?> "); + $('input[name="utilisateur[id]').val("<?php echo $params['utilisateur']['id']; ?>"); +<?php endif; ?> + +$('select#type option[value=<?php echo $params['type']; ?>]').prop('selected', true); +</script> \ No newline at end of file diff --git a/view/unicaen-etat/etat-type/index.phtml b/view/unicaen-etat/etat-type/index.phtml index 828ae510414d507f6b23aab336cdb6264ef4bcde..76f4afbb88c36bd3656e8ca661cbe42ef2e32a96 100644 --- a/view/unicaen-etat/etat-type/index.phtml +++ b/view/unicaen-etat/etat-type/index.phtml @@ -23,7 +23,7 @@ $this->headTitle("Types d'état") Ajouter un type d'état </a> </div> - <div class="pull-right"> + <div class="col-md-4"> <?php /** @see \UnicaenEtat\Controller\EtatCategorieController::indexAction() */ ?> <a href="<?php echo $this->url('unicaen-etat/etat-categorie', [], [], true); ?>" class="btn btn-primary action">