From 30d4623db6422b48e7c14b8f998715707c20c188 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Tue, 17 Feb 2026 11:01:59 +0100 Subject: [PATCH] Add user-based filtering support to Audit Trail search functionality - Extended `AuditTrailRepository` to include user-based query filtering. - Updated `AuditTrailSearchController` to handle `by_users` filter criteria. - Modified translations and templates to support the new user picker field in the search form. - Injected required CSS and JS assets for the user picker functionality. --- .../Controller/AuditTrailSearchController.php | 5 +++++ .../Repository/AuditTrailRepository.php | 17 ++++++++++++++--- .../Resources/views/AuditTrail/list.html.twig | 10 ++++++++++ .../translations/messages.fr.yml | 1 + 4 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/Bundle/ChillMainBundle/Controller/AuditTrailSearchController.php b/src/Bundle/ChillMainBundle/Controller/AuditTrailSearchController.php index 9b5d585e4..23e77b17b 100644 --- a/src/Bundle/ChillMainBundle/Controller/AuditTrailSearchController.php +++ b/src/Bundle/ChillMainBundle/Controller/AuditTrailSearchController.php @@ -52,6 +52,7 @@ final class AuditTrailSearchController ->addDateRange('date_range', new TranslatableMessage('audit_trail.list.date_range')) ->addIntegerField('course_number', new TranslatableMessage('audit_trail.list.course_number')) ->addIntegerField('person_number', new TranslatableMessage('audit_trail.list.person_number')) + ->addUserPicker('user', new TranslatableMessage('audit_trail.list.by_users'), ['multiple' => true, 'required' => false]) ; return $filter->build(); @@ -74,6 +75,10 @@ final class AuditTrailSearchController $criteria['to_date'] = $filterOrderHelper->getDateRangeData('date_range')['to']; } + if ([] !== $byUsers = $filterOrderHelper->getUserPickerData('user')) { + $criteria['by_users'] = $byUsers; + } + return $criteria; } } diff --git a/src/Bundle/ChillMainBundle/Repository/AuditTrailRepository.php b/src/Bundle/ChillMainBundle/Repository/AuditTrailRepository.php index 79275686b..873c21130 100644 --- a/src/Bundle/ChillMainBundle/Repository/AuditTrailRepository.php +++ b/src/Bundle/ChillMainBundle/Repository/AuditTrailRepository.php @@ -13,6 +13,7 @@ namespace Chill\MainBundle\Repository; use Chill\MainBundle\Audit\Subject; use Chill\MainBundle\Entity\AuditTrail; +use Chill\MainBundle\Entity\User; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\DBAL\Types\Types; use Doctrine\ORM\QueryBuilder; @@ -61,7 +62,7 @@ class AuditTrailRepository extends ServiceEntityRepository } /** - * @param array{} $criteria + * @param array{subjects?: list, from_date?: \DateTimeImmutable, to_date?: \DateTimeImmutable, by_users?: list} $criteria * * @return array */ @@ -75,11 +76,12 @@ class AuditTrailRepository extends ServiceEntityRepository } /** - * @param array{subjects?: list, from_date?: \DateTimeImmutable, to_date?: \DateTimeImmutable} $criteria + * @param array{subjects?: list, from_date?: \DateTimeImmutable, to_date?: \DateTimeImmutable, by_users?: list} $criteria */ private function buildByCriteriaQuery(array $criteria): QueryBuilder { $qb = $this->createQueryBuilder('audit'); + $k = 0; if (null !== $fromDate = $criteria['from_date'] ?? null) { $qb->andWhere('audit.occurredAt >= :from_date'); @@ -93,7 +95,6 @@ class AuditTrailRepository extends ServiceEntityRepository if ([] !== $subjects = $criteria['subjects'] ?? []) { $orx = $qb->expr()->orX(); - $k = 0; foreach ($subjects as $subject) { $orx->add($qb->expr()->eq('audit.mainSubject', ':subject_'.$k)); $qb->setParameter('subject_'.$k, $subject->asArray(), Types::JSON); @@ -105,6 +106,16 @@ class AuditTrailRepository extends ServiceEntityRepository $qb->andWhere($orx); } + if ([] !== $users = $criteria['by_users'] ?? []) { + $orx = $qb->expr()->orX(); + foreach ($users as $user) { + $orx->add($qb->expr()->eq('audit.user', ':user_'.$k)); + $qb->setParameter('user_'.$k, $user); + ++$k; + } + $qb->andWhere($orx); + } + return $qb; } } diff --git a/src/Bundle/ChillMainBundle/Resources/views/AuditTrail/list.html.twig b/src/Bundle/ChillMainBundle/Resources/views/AuditTrail/list.html.twig index 41375a82a..6cbfe9aec 100644 --- a/src/Bundle/ChillMainBundle/Resources/views/AuditTrail/list.html.twig +++ b/src/Bundle/ChillMainBundle/Resources/views/AuditTrail/list.html.twig @@ -1,5 +1,15 @@ {% extends '@ChillMain/layout.html.twig' %} +{% block js %} + {{ parent() }} + {{ encore_entry_script_tags('mod_pickentity_type') }} +{% endblock %} + +{% block css %} + {{ parent() }} + {{ encore_entry_link_tags('mod_pickentity_type') }} +{% endblock %} + {% block title 'audit_trail.list.title'|trans %} {% block content %} diff --git a/src/Bundle/ChillMainBundle/translations/messages.fr.yml b/src/Bundle/ChillMainBundle/translations/messages.fr.yml index 12bd22b70..2ad007d5c 100644 --- a/src/Bundle/ChillMainBundle/translations/messages.fr.yml +++ b/src/Bundle/ChillMainBundle/translations/messages.fr.yml @@ -1024,3 +1024,4 @@ audit_trail: date_range: Date de l'accès course_number: Numéro du parcours person_number: Identifiant usager + by_users: Utilisateurs