Skip to content
Snippets Groups Projects

Resolve "Filter by group n’apparait que sur la première page de la liste des capsules"

Merged Sebastien requested to merge 5-filter-by-group-sur-toutes-les-pages into RC-Rekall-v1.2
3 files
+ 70
25
Compare changes
  • Side-by-side
  • Inline

Files

+ 56
10
@@ -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;
}
}
Loading