diff --git a/src/Bundle/ChillActivityBundle/Controller/ActivityReasonController.php b/src/Bundle/ChillActivityBundle/Controller/ActivityReasonController.php index 0167273c5..7512b21ed 100644 --- a/src/Bundle/ChillActivityBundle/Controller/ActivityReasonController.php +++ b/src/Bundle/ChillActivityBundle/Controller/ActivityReasonController.php @@ -17,7 +17,6 @@ use Chill\ActivityBundle\Repository\ActivityReasonRepository; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\Form\Extension\Core\Type\SubmitType; use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; /** * ActivityReason controller. diff --git a/src/Bundle/ChillEventBundle/Controller/EventListController.php b/src/Bundle/ChillEventBundle/Controller/EventListController.php index 692611adc..dd1e26353 100644 --- a/src/Bundle/ChillEventBundle/Controller/EventListController.php +++ b/src/Bundle/ChillEventBundle/Controller/EventListController.php @@ -15,11 +15,15 @@ use Chill\EventBundle\Entity\Event; use Chill\EventBundle\Entity\EventType; use Chill\EventBundle\Repository\EventACLAwareRepositoryInterface; use Chill\EventBundle\Repository\EventTypeRepository; +use Chill\EventBundle\Security\EventVoter; +use Chill\MainBundle\Entity\Center; use Chill\MainBundle\Pagination\PaginatorFactoryInterface; +use Chill\MainBundle\Security\Authorization\AuthorizationHelper; use Chill\MainBundle\Templating\Listing\FilterOrderHelper; use Chill\MainBundle\Templating\Listing\FilterOrderHelperFactory; use Chill\MainBundle\Templating\TranslatableStringHelperInterface; use Chill\PersonBundle\Form\Type\PickPersonDynamicType; +use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\Form\Extension\Core\Type\FormType; use Symfony\Component\Form\Extension\Core\Type\HiddenType; use Symfony\Component\Form\FormFactoryInterface; @@ -29,17 +33,18 @@ use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Twig\Environment; -final readonly class EventListController +final class EventListController extends AbstractController { public function __construct( - private Environment $environment, - private EventACLAwareRepositoryInterface $eventACLAwareRepository, - private EventTypeRepository $eventTypeRepository, - private FilterOrderHelperFactory $filterOrderHelperFactory, - private FormFactoryInterface $formFactory, - private PaginatorFactoryInterface $paginatorFactory, - private TranslatableStringHelperInterface $translatableStringHelper, - private UrlGeneratorInterface $urlGenerator, + private readonly Environment $environment, + private readonly EventACLAwareRepositoryInterface $eventACLAwareRepository, + private readonly EventTypeRepository $eventTypeRepository, + private readonly FilterOrderHelperFactory $filterOrderHelperFactory, + private readonly FormFactoryInterface $formFactory, + private readonly PaginatorFactoryInterface $paginatorFactory, + private readonly TranslatableStringHelperInterface $translatableStringHelper, + private readonly UrlGeneratorInterface $urlGenerator, + private readonly AuthorizationHelper $authorizationHelper, ) {} #[Route(path: '{_locale}/event/event/list', name: 'chill_event_event_list')] @@ -50,6 +55,8 @@ final readonly class EventListController 'q' => (string) $filter->getQueryString(), 'dates' => $filter->getDateRangeData('dates'), 'event_types' => $filter->getEntityChoiceData('event_types'), + 'responsables' => $filter->getUserPickerData('responsables'), + 'centers' => $filter->getEntityChoiceData('centers'), ]; $total = $this->eventACLAwareRepository->countAllViewable($filterData); $pagination = $this->paginatorFactory->create($total); @@ -73,6 +80,7 @@ final readonly class EventListController private function buildFilterOrder(): FilterOrderHelper { $types = $this->eventTypeRepository->findAllActive(); + $centers = $this->authorizationHelper->getReachableCenters($this->getUser(), EventVoter::SEE); $builder = $this->filterOrderHelperFactory->create(__METHOD__); $builder @@ -80,6 +88,10 @@ final readonly class EventListController ->addSearchBox(['name']) ->addEntityChoice('event_types', 'event.filter.event_types', EventType::class, $types, [ 'choice_label' => fn (EventType $e) => $this->translatableStringHelper->localize($e->getName()), + ]) + ->addUserPicker('responsables', 'event.filter.pick_responsable', ['multiple' => true, 'required' => false]) + ->addEntityChoice('centers', 'event.filter.center', Center::class, $centers, [ + 'choice_label' => fn (Center $c) => $c->getName(), ]); return $builder->build(); diff --git a/src/Bundle/ChillEventBundle/Form/EventType.php b/src/Bundle/ChillEventBundle/Form/EventType.php index 00d456d26..a4048983e 100644 --- a/src/Bundle/ChillEventBundle/Form/EventType.php +++ b/src/Bundle/ChillEventBundle/Form/EventType.php @@ -15,7 +15,6 @@ use Chill\DocStoreBundle\Entity\StoredObject; use Chill\DocStoreBundle\Form\StoredObjectType; use Chill\EventBundle\Entity\BudgetTypeEnum; use Chill\EventBundle\Entity\Event; -use Chill\EventBundle\Form\Type\PickAnimatorType; use Chill\EventBundle\Form\Type\PickEventThemeType; use Chill\EventBundle\Form\Type\PickEventTypeType; use Chill\EventBundle\Repository\EventBudgetKindRepository; diff --git a/src/Bundle/ChillEventBundle/Repository/EventACLAwareRepository.php b/src/Bundle/ChillEventBundle/Repository/EventACLAwareRepository.php index 22141b536..2b8c7c01e 100644 --- a/src/Bundle/ChillEventBundle/Repository/EventACLAwareRepository.php +++ b/src/Bundle/ChillEventBundle/Repository/EventACLAwareRepository.php @@ -88,6 +88,16 @@ final readonly class EventACLAwareRepository implements EventACLAwareRepositoryI $qb->andWhere('event.type IN (:event_types)'); $qb->setParameter('event_types', $filters['event_types']); } + + if (0 < count($filters['centers'] ?? [])) { + $qb->andWhere('event.center IN (:centers)'); + $qb->setParameter('centers', $filters['centers']); + } + + if (0 < count($filters['responsables'] ?? [])) { + $qb->andWhere('event.moderator IN (:responsables)'); + $qb->setParameter('responsables', $filters['responsables']); + } } public function buildQueryByAllViewable(array $filters): QueryBuilder diff --git a/src/Bundle/ChillEventBundle/migrations/Version20250702144312.php b/src/Bundle/ChillEventBundle/migrations/Version20250702144312.php index 2f0f4a897..afb072ae9 100644 --- a/src/Bundle/ChillEventBundle/migrations/Version20250702144312.php +++ b/src/Bundle/ChillEventBundle/migrations/Version20250702144312.php @@ -2,6 +2,13 @@ declare(strict_types=1); +/* + * Chill is a software for social workers + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + namespace Chill\Migrations\Event; use Doctrine\DBAL\Schema\Schema; diff --git a/src/Bundle/ChillEventBundle/translations/messages.fr.yml b/src/Bundle/ChillEventBundle/translations/messages.fr.yml index 0ea69463c..2251dbd6c 100644 --- a/src/Bundle/ChillEventBundle/translations/messages.fr.yml +++ b/src/Bundle/ChillEventBundle/translations/messages.fr.yml @@ -151,6 +151,9 @@ event: filter: event_types: Par types d'événement event_dates: Par date d'événement + center: Par centre + by_responsable: Par responsable + pick_responsable: Filtrer par responsables budget: resources: Ressources charges: Charges