diff --git a/src/Bundle/ChillCalendarBundle/Controller/MyInvitationsController.php b/src/Bundle/ChillCalendarBundle/Controller/MyInvitationsController.php index a99a0abbe..7af5ac18f 100644 --- a/src/Bundle/ChillCalendarBundle/Controller/MyInvitationsController.php +++ b/src/Bundle/ChillCalendarBundle/Controller/MyInvitationsController.php @@ -47,16 +47,10 @@ class MyInvitationsController extends AbstractController $paginator->getCurrentPageFirstItemNumber() ); - $invitationsWaiting = count($this->inviteRepository->findBy([ - 'user' => $user, - 'status' => 'pending', - ])); - $view = '@ChillCalendar/Invitations/listByUser.html.twig'; return $this->render($view, [ 'invitations' => $invitations, - 'invitationsWaiting' => $invitationsWaiting, 'paginator' => $paginator, 'templates' => $this->docGeneratorTemplateRepository->findByEntity(Calendar::class), ]); diff --git a/src/Bundle/ChillCalendarBundle/Menu/UserMenuBuilder.php b/src/Bundle/ChillCalendarBundle/Menu/UserMenuBuilder.php index 672b53460..38cec3f6a 100644 --- a/src/Bundle/ChillCalendarBundle/Menu/UserMenuBuilder.php +++ b/src/Bundle/ChillCalendarBundle/Menu/UserMenuBuilder.php @@ -11,6 +11,7 @@ declare(strict_types=1); namespace Chill\CalendarBundle\Menu; +use Chill\CalendarBundle\Repository\InviteRepository; use Chill\MainBundle\Routing\LocalMenuBuilderInterface; use Knp\Menu\MenuItem; use Symfony\Component\Security\Core\Security; @@ -18,10 +19,12 @@ use Symfony\Contracts\Translation\TranslatorInterface; class UserMenuBuilder implements LocalMenuBuilderInterface { - public function __construct(private readonly Security $security, public TranslatorInterface $translator) {} + public function __construct(private readonly Security $security, public TranslatorInterface $translator, private readonly InviteRepository $inviteRepository) {} public function buildMenu($menuId, MenuItem $menu, array $parameters) { + $invitationsPending = $this->inviteRepository->countPendingInvitesByUser($this->security->getUser()); + if ($this->security->isGranted('ROLE_USER')) { $menu->addChild('My calendar list', [ 'route' => 'chill_calendar_calendar_list_my', @@ -30,12 +33,14 @@ class UserMenuBuilder implements LocalMenuBuilderInterface 'order' => 8, 'icon' => 'tasks', ]); - $menu->addChild('invite.list.title', [ - 'route' => 'chill_calendar_invitations_list_my', - ]) + $menu->addChild( + $this->translator->trans('invite.menu with counter', ['nb' => $invitationsPending]), + ['route' => 'chill_calendar_invitations_list_my'] + ) ->setExtras([ 'order' => 9, 'icon' => 'tasks', + 'counter' => 0 < $invitationsPending ? $invitationsPending : null, ]); } } diff --git a/src/Bundle/ChillCalendarBundle/Repository/InviteRepository.php b/src/Bundle/ChillCalendarBundle/Repository/InviteRepository.php index 8fe28f500..6ba967871 100644 --- a/src/Bundle/ChillCalendarBundle/Repository/InviteRepository.php +++ b/src/Bundle/ChillCalendarBundle/Repository/InviteRepository.php @@ -75,6 +75,25 @@ class InviteRepository implements ObjectRepository ->getSingleScalarResult(); } + public function countPendingInvitesByUser(User $user): int + { + $qb = $this->entityRepository->createQueryBuilder('i'); + + $qb->select('COUNT(i)') + ->where( + $qb->expr()->andX( + $qb->expr()->eq('i.user', ':user'), + $qb->expr()->eq('i.status', ':status') + ) + ) + ->setParameters([ + 'user' => $user, + 'status' => Invite::PENDING, + ]); + + return $qb->getQuery()->getSingleScalarResult(); + } + public function buildAcceptedInviteByUserAndDateRangeQuery(User $user, \DateTimeImmutable $from, \DateTimeImmutable $to) { $qb = $this->entityRepository->createQueryBuilder('i'); diff --git a/src/Bundle/ChillCalendarBundle/Resources/views/Invitations/listByUser.html.twig b/src/Bundle/ChillCalendarBundle/Resources/views/Invitations/listByUser.html.twig index c0b5ede25..c7b7ecc86 100644 --- a/src/Bundle/ChillCalendarBundle/Resources/views/Invitations/listByUser.html.twig +++ b/src/Bundle/ChillCalendarBundle/Resources/views/Invitations/listByUser.html.twig @@ -8,8 +8,6 @@
{{ 'invite.number of invitations waiting'|trans }}: {{ invitationsWaiting }}
- {% if invitations|length == 0 %}{{ "invite.list.none"|trans }} diff --git a/src/Bundle/ChillCalendarBundle/translations/messages+intl-icu.fr.yml b/src/Bundle/ChillCalendarBundle/translations/messages+intl-icu.fr.yml index 4bbc105b9..7c8e59231 100644 --- a/src/Bundle/ChillCalendarBundle/translations/messages+intl-icu.fr.yml +++ b/src/Bundle/ChillCalendarBundle/translations/messages+intl-icu.fr.yml @@ -6,3 +6,11 @@ chill_calendar: few {# rendez-vous sont ignorés par le filtre de date. Modifiez le filtre de date pour les voir apparaitre.} other {# rendez-vous sont ignorés par le filtre de date. Modifiez le filtre de date pour les voir apparaitre.} } +invite: + menu with counter: >- + {nb, plural, + =0 {Mes invitations} + one {# invitation} + few {# invitations} + other {# invitations} + }