Skip to content
Snippets Groups Projects
Commit f02e14d8 authored by Camille Simiand's avatar Camille Simiand
Browse files

Add a filter menu

parent 3683fb86
No related branches found
No related tags found
2 merge requests!55demo version for Clarisse workshop,!53tuleap-131-filter-my-capsules-by-groups
Pipeline #803 passed
......@@ -123,11 +123,16 @@ button[type=submit]{
float: left;
color: rgba(255,255,255,.75) !important;
line-height: 60px;
margin-bottom: 0;
background: -webkit-linear-gradient(top left, #FA772E, #FC4326);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.h2 {
margin-bottom: 0;
}
.button-cancel {
border: none;
border-radius: 3px;
......
......@@ -3,9 +3,11 @@
namespace App\Controller;
use App\Entity\Capsule;
use App\Entity\Group;
use App\Entity\User;
use App\Form\DeleteCapsuleFormType;
use App\Form\DuplicateCapsuleFormType;
use App\Form\FilterByGroupFormType;
use App\Helper\StringHelper;
use App\Repository\CapsuleRepository;
use App\Builder\CapsuleBuilder;
......@@ -49,6 +51,19 @@ class CapsuleController extends AbstractController
$all_capsules = $current_user->getCapsules();
$form = $this->createForm(FilterByGroupFormType::class, ['groups' => $current_user->getGroups()]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$group = $form->getData()['name'];
if (! $group instanceof Group) {
throw new \Exception('Group not found');
}
$all_capsules = $current_user->getCapsulesFilteredByGroup($group);
}
$capsules = $paginator->paginate(
$all_capsules,
$request->query->getInt('page', 1),
......@@ -56,6 +71,7 @@ class CapsuleController extends AbstractController
);
return $this->render('capsule/index.html.twig', [
'filterByGroupForm' => $form->createView(),
'capsules' => $capsules,
'current_user' => $current_user,
'legacy_url' => $this->getParameter('app.legacy_external_prefix')
......
......@@ -233,33 +233,14 @@ class CapsuleGroupController extends AbstractController
return $group;
}
/**
* @return array<Group>
*/
private function getExistingGroupsForCurrentEditor(User $current_user): array
{
$editor_capsules = $current_user->getCapsules();
$existing_groups_for_current_editor = [];
foreach ($editor_capsules as $editor_capsule) {
$existing_groups_for_current_editor = array_merge(
$existing_groups_for_current_editor,
$editor_capsule->getGroups()->toArray()
);
}
return $existing_groups_for_current_editor;
}
/**
* @param Collection<Group> $groups
* @return array<Group>
*/
private function getEditorGroupsNotAdded(User $current_user, Collection $groups): array
{
$editor_existing_groups = $this->getExistingGroupsForCurrentEditor($current_user);
return array_udiff(
$editor_existing_groups,
$current_user->getGroups(),
$groups->toArray(),
function ($obj_a, $obj_b) {
return $obj_a->getId() - $obj_b->getId();
......
......@@ -12,7 +12,6 @@ use Symfony\Component\Uid\Uuid;
class CapsuleFixtures extends Fixture implements DependentFixtureInterface
{
public function load(ObjectManager $manager): void
{
$user_repository = $manager->getRepository(User::class);
......
......@@ -299,4 +299,35 @@ class User implements UserInterface, LegacyPasswordAuthenticatedUserInterface
{
$this->is_subscribed_news_letter = $is_subscribed_news_letter;
}
/**
* @return array<Group>
*/
public function getGroups(): array
{
$editor_capsules = $this->getCapsules();
$existing_groups_for_current_editor = [];
foreach ($editor_capsules as $editor_capsule) {
$existing_groups_for_current_editor = array_merge(
$existing_groups_for_current_editor,
$editor_capsule->getGroups()->toArray()
);
}
return $existing_groups_for_current_editor;
}
/**
* @return array<Capsule>
*/
public function getCapsulesFilteredByGroup(Group $group): array
{
return array_uintersect(
$this->getCapsules()->toArray(),
$group->getCapsules()->toArray(),
function ($obj_a, $obj_b) {
return $obj_a->getId() - $obj_b->getId();
}
);
}
}
......@@ -4,5 +4,4 @@ namespace App\Exception;
class CapsuleNotFoundException extends \Exception
{
}
<?php
namespace App\Form;
use App\Entity\Group;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class FilterByGroupFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$groups = $options['data']['groups'];
$builder
->add('name', ChoiceType::class, [
'choices' => $groups,
'choice_translation_domain' => false,
'label' => false,
'choice_label' => function (?Group $entity) {
return $entity ? $entity->getName() : '';
},
'choice_value' => 'name',
'choice_name' => 'name',
'expanded' => false
])
->add(
'filter',
SubmitType::class,
['label' => 'groups.filter.button']
);
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([]);
}
}
......@@ -8,23 +8,26 @@
{% block body %}
<div class="row gx-0">
<div class="row-title-box d-flex justify-content-between align-items-center">
<div class="row-title-box d-flex flex-column flex-lg-row justify-content-between align-items-center">
<h2 class="row-title">
{{ 'capsule.title'|trans }}
</h2>
<form class="d-none d-md-flex">
<button id="btn-orange" formaction="/create">
+ {{ 'capsule.create_capsule'|trans }}
</button>
</form>
</div>
<div class="mb-3 mb-sm-0">
{{ form_start(filterByGroupForm, {'attr': {novalidate: 'novalidate', 'class': 'd-flex flex-column flex-sm-row mb-0 align-items-center pt-3'}}) }}
{{ form_row(filterByGroupForm.name, {'attr': {'class': ''}}) }}
{{ form_row(filterByGroupForm.filter, {'attr': {'class': 'ms-2'}}) }}
{{ form_end(filterByGroupForm) }}
</div>
<form class="d-md-none d-flex justify-content-center align-items-center">
<form class="d-flex mb-4 mb-lg-0">
<button id="btn-orange" formaction="/create">
+ {{ 'capsule.create_capsule'|trans }}
</button>
</form>
</div>
</div>
{% for flashWarning in app.flashes('warning') %}
<div class="text-center alert alert-warning col-5 mx-auto my-5" role="alert">
......@@ -41,7 +44,7 @@
<div class="d-flex flex-column align-items-center mt-4 mb-4">
{% for capsule in capsules %}
<div class="capsule-item pb-4 col-12 col-sm-11 col-md-10 col-xxl-8">
<div class="d-flex flex-column justify-content-center align-items-center mt-sm-4">
<div class="d-flex flex-column flex-md-row justify-content-center align-items-center mt-sm-4">
<div class="list-item">
<a href="/capsule/preview/{{ capsule.getLinkPath() }}" class="capsule-title">
{{ capsule.getName() }}
......
......@@ -180,3 +180,5 @@ groups:
text: Do you really want to remove group %group_name% ?
title: Remove group
success: Group group_name removed successfully
filter:
button: Filter by group
\ No newline at end of file
......@@ -179,3 +179,5 @@ groups:
text: Souhaitez-vous vraiment supprimer le groupe %group_name% ?
title: Supprimer le groupe
success: Le groupe group_name a bien été supprimé
filter:
button: Filtrer par groupe
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment