diff --git a/src/Controller/CapsuleController.php b/src/Controller/CapsuleController.php index cb9eecf490e83eb68ec4947e64c2177561f075e6..6fbd799131d62149fc04229d95a78c87bf046a69 100755 --- a/src/Controller/CapsuleController.php +++ b/src/Controller/CapsuleController.php @@ -13,6 +13,7 @@ use App\Repository\CapsuleRepository; use App\Builder\CapsuleBuilder; use App\Form\CreateCapsuleFormType; use Doctrine\ORM\EntityManagerInterface; +use Knp\Bundle\PaginatorBundle\Pagination\SlidingPagination; use Knp\Component\Pager\PaginatorInterface; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\Filesystem\Filesystem; @@ -75,29 +76,53 @@ class CapsuleController extends AbstractController $all_capsules = $current_user->getCapsules()->toArray(); $groups = $this->prependGroupAllToUserGroups($current_user); - $form = $this->createForm(FilterByGroupFormType::class, ['groups' => $groups]); - $form->handleRequest($request); + $group_id = $request->query->getInt('group', Group::$GROUP_ALL_ID); + $group = $this->getGroupByIdOrNull($groups, $group_id, $groups[0]); - if ($form->isSubmitted() && $form->isValid()) { - $group = $form->getData()['name']; + $filter_by_group_form = $this->createForm( + FilterByGroupFormType::class, + ['groups' => $groups, 'method' => 'GET', 'selected_group' => $group] + ); + + $filter_by_group_form->handleRequest($request); + if ($filter_by_group_form->isSubmitted() && $filter_by_group_form->isValid()) { + $group = $filter_by_group_form->getData()['name']; if (! $group instanceof Group) { throw new \Exception('Group not found'); } + } - if ($group->getId() !== Group::$GROUP_ALL_ID) { - $all_capsules = $group->getCapsules()->toArray(); - } + if ($group instanceof Group && $group->getId() !== Group::$GROUP_ALL_ID) { + $all_capsules = $group->getCapsules()->toArray(); } + $nb_elements_per_page = 5; + + // Fix the current page. + // For example, the user is on the page 5 without filter and apply a filter that reduce the number of pages. + // We display the last page. + $current_page = min( + [ + intval((count($all_capsules) / $nb_elements_per_page) + 1), + $request->query->getInt('page', 1) + ] + ); + $request->query->set('page', $current_page); + + // Pass group param to the paginator (it will be sent as GET data) $capsules = $paginator->paginate( $all_capsules, - $request->query->getInt('page', 1), - 5 + $current_page, + $nb_elements_per_page ); + if ($capsules instanceof SlidingPagination) { + $capsules->setParam('group', $group->getId()); + } + return $this->renderForm('capsule/index.html.twig', [ - 'filterByGroupForm' => $form, + 'filterByGroupForm' => $filter_by_group_form, 'capsules' => $capsules, 'current_user' => $current_user, 'legacy_url' => $this->getParameter('app.legacy_external_prefix'), @@ -371,4 +396,25 @@ class CapsuleController extends AbstractController return $groups; } + + /** + * @param array<Group> $groups + * @param int|null $id + * @param Group $defaultGroup The returned group if current groups isn't found + * @return Group + */ + private function getGroupByIdOrNull(array $groups, ?int $id, Group $defaultGroup): Group + { + if (null === $id) { + return $defaultGroup; + } + + foreach ($groups as $g) { + if ($g->getId() === $id) { + return $g; + } + } + + return $defaultGroup; + } } diff --git a/src/Form/FilterByGroupFormType.php b/src/Form/FilterByGroupFormType.php index e2f8087a1df2c0d3783d688355eb9bbb7a59cefc..2e19fb28a02e40526267e017b6fd1c95ede51a4e 100644 --- a/src/Form/FilterByGroupFormType.php +++ b/src/Form/FilterByGroupFormType.php @@ -15,7 +15,7 @@ class FilterByGroupFormType extends AbstractType public function buildForm(FormBuilderInterface $builder, array $options): void { $groups = $options['data']['groups']; - + $selected_group = $options['data']['selected_group']; $builder ->add('name', ChoiceType::class, [ 'choices' => $groups, @@ -24,9 +24,10 @@ class FilterByGroupFormType extends AbstractType 'choice_label' => function (?Group $entity) { return $entity ? $entity->getName() : ''; }, - 'choice_value' => 'name', - 'choice_name' => 'name', - 'expanded' => false + 'choice_value' => 'id', + 'choice_name' => 'id', + 'expanded' => false, + 'data' => $selected_group ]); } diff --git a/templates/capsule/index.html.twig b/templates/capsule/index.html.twig index 3bc0322a7a997bf3f38dd9fa719c11deee34f18d..70edbdd9a903756aa6e7c0360e6c1adcba48dbd8 100644 --- a/templates/capsule/index.html.twig +++ b/templates/capsule/index.html.twig @@ -13,17 +13,15 @@ {{ 'capsule.title'|trans }} </h2> - {% if app.request.query.get('page')|default(1) == 1 %} - {% if current_user.getGroups()|length > 1 %} - {{ form_start(filterByGroupForm, {'attr': {novalidate: 'novalidate', 'class': 'd-flex flex-column flex-nowrap'}}) }} - {{ form_widget(filterByGroupForm._token) }} - <div class="input-group"> - {{ form_label(filterByGroupForm.name, 'groups.filter.label', { 'label_attr' : { 'class' : 'input-group-text mb-0'}}) }} - {{ form(filterByGroupForm.name, {'attr': {'class': 'choice-auto-submit' }}) }} - </div> - {{ form_end(filterByGroupForm) }} - {% endif %} - {% endif %} + {% if current_user.getGroups()|length > 1 %} + {{ form_start(filterByGroupForm, {'attr': {novalidate: 'novalidate', 'class': 'd-flex flex-column flex-nowrap'}}) }} + {{ form_widget(filterByGroupForm._token) }} + <div class="input-group"> + {{ form_label(filterByGroupForm.name, 'groups.filter.label', { 'label_attr' : { 'class' : 'input-group-text mb-0'}}) }} + {{ form(filterByGroupForm.name, {'attr': {'class': 'choice-auto-submit' }}) }} + </div> + {{ form_end(filterByGroupForm) }} + {% endif %} <form class="d-flex mb-4 mb-lg-0"> <button class="btn btn-orange text-uppercase" formaction="{{ path('create_capsule') }}">