Add advanced filtering support to AuditTrailSearchController and related views

- Introduced filters for date range, course number, and person number using `FilterOrderHelper`.
- Updated `AuditTrailSearchController` to build and process filtering criteria dynamically.
- Enhanced translations and updated templates to render the new filter options.
This commit is contained in:
2026-02-16 15:13:49 +01:00
parent 4e9846930b
commit fa38f7edaa
3 changed files with 45 additions and 1 deletions

View File

@@ -11,12 +11,15 @@ declare(strict_types=1);
namespace Chill\MainBundle\Controller;
use Chill\MainBundle\Audit\Subject;
use Chill\MainBundle\Repository\AuditTrailRepository;
use Chill\MainBundle\Templating\Listing\FilterOrderHelper;
use Chill\MainBundle\Templating\Listing\FilterOrderHelperFactoryInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\Translation\TranslatableMessage;
use Twig\Environment;
final class AuditTrailSearchController
@@ -31,10 +34,46 @@ final class AuditTrailSearchController
#[Route('/{_locale}/main/audit-trail/list', name: 'chill_main_audit_trail_list')]
public function list(Request $request): Response
{
$auditTrails = $this->auditTrailRepository->findByCriteria([]);
$filter = $this->buildFilter();
$criteria = $this->buildFilterCriteria($filter);
$auditTrails = $this->auditTrailRepository->findByCriteria($criteria);
return new Response($this->twig->render('@ChillMain/AuditTrail/list.html.twig', [
'auditTrails' => $auditTrails,
'filter' => $filter,
]));
}
private function buildFilter(): FilterOrderHelper
{
$filter = $this->filterOrderHelperFactory->create(self::class);
$filter
->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'))
;
return $filter->build();
}
private function buildFilterCriteria(FilterOrderHelper $filterOrderHelper): array
{
$criteria = [];
if (null !== $courseNumber = $filterOrderHelper->getIntegerField('course_number')) {
$criteria['subjects'][] = new Subject('accompanying_period', ['id' => $courseNumber]);
}
if (null !== $personNumber = $filterOrderHelper->getIntegerField('person_number')) {
$criteria['subjects'][] = new Subject('person', ['id' => $personNumber]);
}
if ($filterOrderHelper->hasDateRangeData('date_range')) {
$criteria['from_date'] = $filterOrderHelper->getDateRangeData('date_range')['from'];
$criteria['to_date'] = $filterOrderHelper->getDateRangeData('date_range')['to'];
}
return $criteria;
}
}

View File

@@ -5,6 +5,8 @@
{% block content %}
<h1>{{ block('title') }}</h1>
{{ filter|chill_render_filter_order_helper }}
<div class="audit-trail list flex-table">
{% for audit in auditTrails %}
{{ include('@ChillMain/AuditTrail/_list_item.html.twig') }}

View File

@@ -1021,3 +1021,6 @@ audit_trail:
list:
title: Liste des événements
associated_subject: Entités associées
date_range: Date de l'accès
course_number: Numéro du parcours
person_number: Identifiant usager