diff --git a/config/merged/validation-instance.config.php b/config/merged/validation-instance.config.php index 977985357d4676319631e88b31162fc23f7d7624..f893922ffb6a557fa2430714440b99ad808ac976 100644 --- a/config/merged/validation-instance.config.php +++ b/config/merged/validation-instance.config.php @@ -22,6 +22,13 @@ return [ 'bjyauthorize' => [ 'guards' => [ PrivilegeController::class => [ + [ + 'controller' => ValidationInstanceController::class, + 'action' => [ + 'rechercher-validateur', + ], + 'roles' => [], + ], [ 'controller' => ValidationInstanceController::class, 'action' => [ @@ -129,6 +136,16 @@ return [ ], ], ], + 'rechercher-validateur' => [ + 'type' => Literal::class, + 'options' => [ + 'route' => '/rechercher-validateur', + 'defaults' => [ + 'controller' => ValidationInstanceController::class, + 'action' => 'rechercher-validateur', + ], + ], + ], ], ], ], diff --git a/src/UnicaenValidation/Controller/ValidationInstanceController.php b/src/UnicaenValidation/Controller/ValidationInstanceController.php index f15817459c860351f1405049dd17333cbca337f3..dfd1775520fd2b774d6b3f5e5c0b9aef0ef328fa 100644 --- a/src/UnicaenValidation/Controller/ValidationInstanceController.php +++ b/src/UnicaenValidation/Controller/ValidationInstanceController.php @@ -3,6 +3,8 @@ namespace UnicaenValidation\Controller; use Laminas\Http\Response; +use Laminas\View\Model\JsonModel; +use UnicaenUtilisateur\Entity\Db\User; use UnicaenValidation\Entity\Db\ValidationInstance; use UnicaenValidation\Form\ValidationInstance\ValidationInstanceFormAwareTrait; use UnicaenValidation\Service\ValidationInstance\ValidationInstanceServiceAwareTrait; @@ -18,10 +20,15 @@ class ValidationInstanceController extends AbstractActionController { public function indexAction() : ViewModel { - $instances = $this->getValidationInstanceService()->getValidationsInstances(); + $params = $this->params()->fromQuery(); + + $instances = $this->getValidationInstanceService()->getValidationsInstancesWithFiltre($params); + $types = $this->getValidationTypeService()->getValidationsTypes(); return new ViewModel([ 'instances' => $instances, + 'types' => $types, + 'params' => $params, ]); } @@ -120,4 +127,23 @@ class ValidationInstanceController extends AbstractActionController { } return $vm; } + + public function rechercherValidateurAction() + { + if (($term = $this->params()->fromQuery('term'))) { + /** @var User $validateurs */ + $validateurs = $this->getValidationInstanceService()->findValidateurByTerm($term); + foreach ($validateurs as $validateur) { + $result[] = array( + 'id' => $validateur->getHistoCreateur()->getId(), + 'label' => $validateur->getHistoCreateur()->getDisplayName(), + ); + } + usort($result, function ($a, $b) { + return strcmp($a['label'], $b['label']); + }); + return new JsonModel($result); + } + exit; + } } diff --git a/src/UnicaenValidation/Entity/Db/Mapping/UnicaenValidation.Entity.Db.ValidationInstance.dcm.xml b/src/UnicaenValidation/Entity/Db/Mapping/UnicaenValidation.Entity.Db.ValidationInstance.dcm.xml index fb2b132303932d94e5f89e3d2f76ce17149d4ba5..f01390960ae01a0f50f3b3272e660345ec83a6ee 100644 --- a/src/UnicaenValidation/Entity/Db/Mapping/UnicaenValidation.Entity.Db.ValidationInstance.dcm.xml +++ b/src/UnicaenValidation/Entity/Db/Mapping/UnicaenValidation.Entity.Db.ValidationInstance.dcm.xml @@ -11,6 +11,7 @@ </many-to-one> <field name="valeur" type="string" column="valeur" nullable="true"/> + <field name="justification" type="string" column="justification" nullable="true"/> <field name="histoCreation" type="datetime" column="histo_creation" nullable="false"/> <field name="histoModification" type="datetime" column="histo_modification" nullable="false"/> diff --git a/src/UnicaenValidation/Entity/Db/ValidationInstance.php b/src/UnicaenValidation/Entity/Db/ValidationInstance.php index e03ea4e313a467a8a83b5c23fdebce25e450ee4c..9ce80a6fb7f83dcb159578a2346cc736da687d59 100644 --- a/src/UnicaenValidation/Entity/Db/ValidationInstance.php +++ b/src/UnicaenValidation/Entity/Db/ValidationInstance.php @@ -2,8 +2,8 @@ namespace UnicaenValidation\Entity\Db; -use UnicaenUtilisateur\Entity\HistoriqueAwareInterface; -use UnicaenUtilisateur\Entity\HistoriqueAwareTrait; +use UnicaenUtilisateur\Entity\Db\HistoriqueAwareInterface; +use UnicaenUtilisateur\Entity\Db\HistoriqueAwareTrait; class ValidationInstance implements HistoriqueAwareInterface { use HistoriqueAwareTrait; @@ -11,7 +11,8 @@ class ValidationInstance implements HistoriqueAwareInterface { private int $id; private ?ValidationType $type = null; private ?string $valeur = null; - + private ?string $justification = null; + /** * @return int */ @@ -56,6 +57,22 @@ class ValidationInstance implements HistoriqueAwareInterface { return $this; } + /** + * @return string|null + */ + public function getJustification(): ?string + { + return $this->justification; + } + + /** + * @param string|null $justification + */ + public function setJustification(?string $justification): void + { + $this->justification = $justification; + } + public function generateTooltipText() : string { $text = "Validation effectuée<br/>"; @@ -63,4 +80,28 @@ class ValidationInstance implements HistoriqueAwareInterface { $text .= "le <span class='date'>".$this->getHistoModification()->format('d/m/Y')."</span>"; return $text; } + + /** toString functions */ + + public function toStringDate() : string + { + return $this->getHistoCreation()->format('d/m/Y à H:i'); + } + + public function toStringJustification() : string + { + if ($this->getJustification() === null) return "Aucune justification associée à la validation"; + return $this->getJustification(); + } + + public function toStringValeur() : string + { + if ($this->getValeur() === null) return "Aucune valeur associée à la validation"; + return $this->getValeur(); + } + + public function toStringValidateur() : string + { + return $this->getHistoCreateur()->getDisplayName(); + } } \ No newline at end of file diff --git a/src/UnicaenValidation/Service/ValidationInstance/ValidationInstanceService.php b/src/UnicaenValidation/Service/ValidationInstance/ValidationInstanceService.php index 34901478e7542543699a321b4a38cb933904a19e..6fbba833014fbcebacd87cf13024f545d2554aef 100644 --- a/src/UnicaenValidation/Service/ValidationInstance/ValidationInstanceService.php +++ b/src/UnicaenValidation/Service/ValidationInstance/ValidationInstanceService.php @@ -8,6 +8,7 @@ use Doctrine\ORM\QueryBuilder; use Laminas\Mvc\Controller\AbstractActionController; use UnicaenApp\Exception\RuntimeException; use UnicaenApp\Service\EntityManagerAwareTrait; +use UnicaenUtilisateur\Entity\Db\User; use UnicaenValidation\Entity\Db\ValidationInstance; use UnicaenValidation\Service\ValidationType\ValidationTypeServiceAwareTrait; @@ -158,6 +159,47 @@ class ValidationInstanceService { return $result; } + /** + * @param ?string $term + * @return User[] + */ + public function findValidateurByTerm(?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 ValidationInstance[] + */ + public function getValidationsInstancesWithFiltre(array $params) : array + { + $qb = $this->createQueryBuilder(); + if (isset($params['reponse']) AND $params['reponse'] !== '') { + $qb = $qb->andWhere('vinstance.valeur = :reponse')->setParameter('reponse', $params['reponse']); + } + if (isset($params['type']) AND $params['type'] !== '') { + $qb = $qb->andWhere('vtype.code = :code')->setParameter('code', $params['type']); + } + if (isset($params['validateur']) AND isset($params['validateur']['id']) AND $params['validateur']['id'] !== '') { + $id = ((int) $params['validateur']['id']); + $qb = $qb->andWhere('createur.id = :id')->setParameter('id', $id); + } + + $result = $qb->getQuery()->getResult(); + return $result; + } + /** FACADE ********************************************************************************************************/ /** diff --git a/view/unicaen-validation/validation-instance/index.phtml b/view/unicaen-validation/validation-instance/index.phtml index 4b1c9df43b422be224930cdf06e97de692ac1858..123456cbdc575e9ac5cbd4a2d73cd5827a14fffe 100644 --- a/view/unicaen-validation/validation-instance/index.phtml +++ b/view/unicaen-validation/validation-instance/index.phtml @@ -3,9 +3,11 @@ /** * @see \UnicaenValidation\Controller\ValidationInstanceController::indexAction() * @var ValidationInstance[] $instances + * @var ValidationType[] $types */ use UnicaenValidation\Entity\Db\ValidationInstance; +use UnicaenValidation\Entity\Db\ValidationType; use UnicaenValidation\Provider\Privilege\ValidationinstancePrivileges; use UnicaenValidation\Provider\Privilege\ValidationtypePrivileges; @@ -22,12 +24,12 @@ $canAfficherType = $this->isAllowed(ValidationTypePrivileges::getResourceId(Vali ?> <div class="row"> - <div class="col-md-6"> + <div class="col-md-8"> <h1 class="page-header"> Instances de validation </h1> </div> - <div class="pull-right"> + <div class="col-md-4"> <?php if ($canAfficherType) : ?> <a href="<?php echo $this->url('validation/type', [], [], true); ?>" class="btn btn-primary action"> <span class="icon acceder"></span> @@ -37,7 +39,8 @@ $canAfficherType = $this->isAllowed(ValidationTypePrivileges::getResourceId(Vali </div> </div> -<span class="todo"> Faire un filtre </span> +<?php echo $this->partial('partial/filtre', ['types' => $types, 'params' => $params], [], true); ?> + <div class="main"> <?php if ($canAjouter): ?> @@ -58,25 +61,25 @@ $canAfficherType = $this->isAllowed(ValidationTypePrivileges::getResourceId(Vali <th> Refus </th> <th> Date </th> <th> Utilisateur </th> - <th> Action </th> + <th class="action"> Action </th> </tr> </thead> <tbody> <?php /** @var ValidationInstance $instance */ ?> <?php foreach ($instances as $instance) : ?> - <tr> + <tr class="<?php if ($instance->estHistorise()) echo "historise"; ?>"> <td> <?php echo $instance->getType()->getCode(); ?> </td> <td> <?php echo $instance->getValeur(); ?> </td> <td> <?php echo $instance->getHistoModification()->format('d/m/Y à H:i:s'); ?> </td> <td> <?php echo $instance->getHistoModificateur()->getDisplayName(); ?> </td> - <td> + <td class="action"> <?php if ($canModifier): ?> <a <?php /** @see \UnicaenValidation\Controller\ValidationInstanceController::modifierAction() */?> href="<?php echo $this->url('validation/instance/modifier', ['validation' => $instance->getId()], [], true); ?>" class="ajax-modal" data-event="modification" > - <span class="icon editer" title="Modifier l'instance de validation"></a> + <span class="icon icon-editer" title="Modifier l'instance de validation"></a> <?php endif; ?> <?php if ($canHistoriser): ?> @@ -85,24 +88,24 @@ $canAfficherType = $this->isAllowed(ValidationTypePrivileges::getResourceId(Vali <?php /** @see \UnicaenValidation\Controller\ValidationInstanceController::modifierAction() */?> href="<?php echo $this->url('validation/instance/historiser', ['validation' => $instance->getId()], [], true); ?>" > - <span class="icon historiser" title="Historiser l'instance de validation"></a> + <span class="icon icon-historiser" title="Historiser l'instance de validation"></a> <?php else : ?> <a <?php /** @see \UnicaenValidation\Controller\ValidationInstanceController::modifierAction() */?> href="<?php echo $this->url('validation/instance/restaurer', ['validation' => $instance->getId()], [], true); ?>" > - <span class="icon restaurer" title="Restaurer l'instance de validation"></a> + <span class="icon icon-restaurer" title="Restaurer l'instance de validation"></a> <?php endif; ?> <?php endif; ?> - <?php if ($canDetruire): ?> + <?php if ($canDetruire AND $instance->estHistorise()): ?> <a <?php /** @see \UnicaenValidation\Controller\ValidationInstanceController::detruireAction() */?> href="<?php echo $this->url('validation/instance/detruire', ['validation' => $instance->getId()], [], true); ?>" class="ajax-modal" data-event="modification" > - <span class="icon detruire" title="Supprimer définitivement l'instance de validation"></a> + <span class="icon icon-retirer text-danger" title="Supprimer définitivement l'instance de validation"></a> <?php endif; ?> </td> </tr> diff --git a/view/unicaen-validation/validation-instance/partial/filtre.phtml b/view/unicaen-validation/validation-instance/partial/filtre.phtml new file mode 100644 index 0000000000000000000000000000000000000000..369721c2764808dc8e15407c1b4bae59c547acd1 --- /dev/null +++ b/view/unicaen-validation/validation-instance/partial/filtre.phtml @@ -0,0 +1,86 @@ +<?php + +/** + * @var array $params + * @var \UnicaenValidation\Entity\Db\ValidationType[] $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-4"> + <label for="type">Type de validation : </label> + <select id="type" name="type" class="selectpicker" data-live-search="true"> + <option value="">Peu importe</option> + <?php foreach ($types as $vtype) : ?> + <option value="<?php echo $vtype->getCode(); ?>"><?php echo $vtype->getLibelle(); ?></option> + <?php endforeach; ?> + </select> + </div> + <div class="col-md-4"> + <?php + /** @see \UnicaenValidation\Controller\ValidationInstanceController::rechercherValidateurAction() */ + $agentF = new SearchAndSelect('validateur', ['label' => "Validateur·trice :"]); + $agentF + ->setAutocompleteSource($this->url('validation/instance/rechercher-validateur')) + ->setSelectionRequired(true) + ->setAttributes([ + 'id' => 'validateur', + 'placeholder' => "Nom du validateur·trice ...", + ]); + ?> + <?php echo $this->formControlGroup($agentF); ?> + </div> + <div class="col-md-4"> + <label for="reponse">Réponse :</label> + <select id="reponse" name="reponse" class="selectpicker"> + <option value="">Peu importe</option> + <option value="oui">Oui</option> + <option value="non">Non</option> + </select> + </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['validateur']['id'] !== "") :?> + $('input[name="validateur[label]').val(" <?php echo $params['validateur']['label']; ?> "); + $('input[name="validateur[id]').val("<?php echo $params['etudiant']['id']; ?>"); +<?php endif; ?> + +$('select#reponse option[value=<?php echo $params['reponse']; ?>]').prop('selected', true); +$('select#type option[value=<?php echo $params['type']; ?>]').prop('selected', true); +</script> \ No newline at end of file diff --git a/view/unicaen-validation/validation-type/index.phtml b/view/unicaen-validation/validation-type/index.phtml index f5eb631581cf3c9f37e59c3491d98d801ca5fe91..279d51a3f90c365c0b982e21d3aa496c6ce7ab6c 100644 --- a/view/unicaen-validation/validation-type/index.phtml +++ b/view/unicaen-validation/validation-type/index.phtml @@ -20,12 +20,12 @@ $canAfficherInstance = $this->isAllowed(ValidationInstancePrivileges::getResourc ?> <div class="row"> - <div class="col-md-6"> + <div class="col-md-8"> <h1 class="page-header"> Index des types de validations </h1> </div> - <div class="pull-right"> + <div class="col-md-4"> <?php if ($canAfficherInstance) : ?> <a href="<?php echo $this->url('validation/instance', [], [], true); ?>" class="btn btn-primary action"> <span class="icon acceder"></span> @@ -45,7 +45,7 @@ $canAfficherInstance = $this->isAllowed(ValidationInstancePrivileges::getResourc class="btn btn-primary action ajax-modal" data-event="modification" > - <span class="icon ajouter"> Ajouter un type</span> + <span class="icon icon-ajouter"> Ajouter un type</span> </a> <?php endif; ?> </div> @@ -83,7 +83,7 @@ $canAfficherInstance = $this->isAllowed(ValidationInstancePrivileges::getResourc href="<?php echo $this->url('validation/type/modifier', ['type' => $type->getId()], [], true); ?>" class="ajax-modal" data-event="modification" > - <span class="icon editer" title="Modifier le type de validation"></a> + <span class="icon icon-editer" title="Modifier le type de validation"></a> <?php endif; ?> <?php if ($canDetruire): ?> @@ -92,7 +92,7 @@ $canAfficherInstance = $this->isAllowed(ValidationInstancePrivileges::getResourc href="<?php echo $this->url('validation/type/detruire', ['type' => $type->getId()], [], true); ?>" class="ajax-modal" data-event="modification" > - <span class="icon detruire" title="Supprimer définitivement le type de validation"></a> + <span class="icon icon-retirer text-danger" title="Supprimer définitivement le type de validation"></a> <?php endif; ?> </td> </tr>