]> git.immae.eu Git - github/wallabag/wallabag.git/blame - src/Wallabag/CoreBundle/Form/Type/EntryFilterType.php
Disable negative numbers in filters
[github/wallabag/wallabag.git] / src / Wallabag / CoreBundle / Form / Type / EntryFilterType.php
CommitLineData
26864574
NL
1<?php
2
b0b893ea 3namespace Wallabag\CoreBundle\Form\Type;
26864574 4
619cc453 5use Doctrine\ORM\EntityRepository;
1267905d 6use Lexik\Bundle\FormFilterBundle\Filter\FilterOperands;
619cc453 7use Lexik\Bundle\FormFilterBundle\Filter\Query\QueryInterface;
5c895a7f
JB
8use Lexik\Bundle\FormFilterBundle\Filter\Form\Type\NumberRangeFilterType;
9use Lexik\Bundle\FormFilterBundle\Filter\Form\Type\DateRangeFilterType;
10use Lexik\Bundle\FormFilterBundle\Filter\Form\Type\TextFilterType;
11use Lexik\Bundle\FormFilterBundle\Filter\Form\Type\CheckboxFilterType;
12use Lexik\Bundle\FormFilterBundle\Filter\Form\Type\ChoiceFilterType;
26864574
NL
13use Symfony\Component\Form\AbstractType;
14use Symfony\Component\Form\FormBuilderInterface;
d215273c 15use Symfony\Component\HttpFoundation\Response;
26864574 16use Symfony\Component\OptionsResolver\OptionsResolver;
2fe2e411 17use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
26864574
NL
18
19class EntryFilterType extends AbstractType
20{
d4ebe5c5
JB
21 private $user;
22 private $repository;
23
24 /**
cfb28c9d 25 * Repository & user are used to get a list of language entries for this user.
d4ebe5c5 26 *
94766a89
NL
27 * @param EntityRepository $entryRepository
28 * @param TokenStorageInterface $tokenStorage
d4ebe5c5 29 */
2fe2e411 30 public function __construct(EntityRepository $entryRepository, TokenStorageInterface $tokenStorage)
d4ebe5c5
JB
31 {
32 $this->repository = $entryRepository;
2fe2e411
NL
33
34 $this->user = $tokenStorage->getToken() ? $tokenStorage->getToken()->getUser() : null;
35
36 if (null === $this->user || !is_object($this->user)) {
37 return null;
38 }
d4ebe5c5
JB
39 }
40
26864574
NL
41 public function buildForm(FormBuilderInterface $builder, array $options)
42 {
3c5b025a 43 $builder
4094ea47 44 ->add('readingTime', NumberRangeFilterType::class, [
1267905d
MM
45 'left_number_options' => ['condition_operator' => FilterOperands::OPERATOR_GREATER_THAN_EQUAL, 'attr' => ['min' => 0]],
46 'right_number_options' => ['condition_operator' => FilterOperands::OPERATOR_LOWER_THAN_EQUAL, 'attr' => ['min' => 0]],
d8f8a590 47 'apply_filter' => function (QueryInterface $filterQuery, $field, $values) {
1bdbc39f
JB
48 $lower = $values['value']['left_number'][0];
49 $upper = $values['value']['right_number'][0];
d8f8a590 50
1bdbc39f
JB
51 $min = (int) ($lower * $this->user->getConfig()->getReadingSpeed());
52 $max = (int) ($upper * $this->user->getConfig()->getReadingSpeed());
53
54 if (null === $lower && null === $upper) {
55 // no value? no filter
d6a9e139 56 return;
2c00dddf 57 } elseif (null === $lower && null !== $upper) {
1bdbc39f
JB
58 // only lower value is defined: query all entries with reading LOWER THAN this value
59 $expression = $filterQuery->getExpr()->lte($field, $max);
2c00dddf 60 } elseif (null !== $lower && null === $upper) {
1bdbc39f
JB
61 // only upper value is defined: query all entries with reading GREATER THAN this value
62 $expression = $filterQuery->getExpr()->gte($field, $min);
63 } else {
64 // both value are defined, perform a between
65 $expression = $filterQuery->getExpr()->between($field, $min, $max);
d6a9e139
NL
66 }
67
d8f8a590
NL
68 return $filterQuery->createCondition($expression);
69 },
0d42217e 70 'label' => 'entry.filters.reading_time.label',
4094ea47
JB
71 ])
72 ->add('createdAt', DateRangeFilterType::class, [
73 'left_date_options' => [
74 'attr' => [
8ce32af6 75 'placeholder' => 'dd/mm/yyyy',
4094ea47 76 ],
3c5b025a 77 'format' => 'dd/MM/yyyy',
8ce32af6 78 'widget' => 'single_text',
4094ea47
JB
79 ],
80 'right_date_options' => [
81 'attr' => [
8ce32af6 82 'placeholder' => 'dd/mm/yyyy',
4094ea47 83 ],
3c5b025a 84 'format' => 'dd/MM/yyyy',
8ce32af6 85 'widget' => 'single_text',
4094ea47 86 ],
0d42217e 87 'label' => 'entry.filters.created_at.label',
4094ea47 88 ]
7d6c3edc 89 )
4094ea47 90 ->add('domainName', TextFilterType::class, [
8ce32af6 91 'apply_filter' => function (QueryInterface $filterQuery, $field, $values) {
1d76102a
JB
92 $value = $values['value'];
93 if (strlen($value) <= 2 || empty($value)) {
94 return;
95 }
00fc2b44 96 $expression = $filterQuery->getExpr()->like($field, $filterQuery->getExpr()->lower($filterQuery->getExpr()->literal('%'.$value.'%')));
8ce32af6 97
1d76102a 98 return $filterQuery->createCondition($expression);
a3bcd60a 99 },
0d42217e 100 'label' => 'entry.filters.domain_label',
4094ea47 101 ])
10b35097 102 ->add('httpStatus', TextFilterType::class, [
d215273c
NL
103 'apply_filter' => function (QueryInterface $filterQuery, $field, $values) {
104 $value = $values['value'];
105 if (false === array_key_exists($value, Response::$statusTexts)) {
106 return;
107 }
108
109 $paramName = sprintf('%s', str_replace('.', '_', $field));
110 $expression = $filterQuery->getExpr()->eq($field, ':'.$paramName);
111 $parameters = array($paramName => $value);
112
113 return $filterQuery->createCondition($expression, $parameters);
114 },
10b35097
NL
115 'label' => 'entry.filters.http_status_label',
116 ])
4094ea47 117 ->add('isArchived', CheckboxFilterType::class, [
0d42217e 118 'label' => 'entry.filters.archived_label',
4094ea47
JB
119 ])
120 ->add('isStarred', CheckboxFilterType::class, [
0d42217e 121 'label' => 'entry.filters.starred_label',
4094ea47 122 ])
733b2cf1
DB
123 ->add('isUnread', CheckboxFilterType::class, [
124 'label' => 'entry.filters.unread_label',
125 'apply_filter' => function (QueryInterface $filterQuery, $field, $values) {
126 if (false === $values['value']) {
127 return;
128 }
129
130 $expression = $filterQuery->getExpr()->eq('e.isArchived', 'false');
131
132 return $filterQuery->createCondition($expression);
133 },
134 ])
4094ea47 135 ->add('previewPicture', CheckboxFilterType::class, [
a3bcd60a 136 'apply_filter' => function (QueryInterface $filterQuery, $field, $values) {
497e0cad 137 if (false === $values['value']) {
616f9fea
NL
138 return;
139 }
140
a3bcd60a
NL
141 $expression = $filterQuery->getExpr()->isNotNull($field);
142
143 return $filterQuery->createCondition($expression);
144 },
0d42217e 145 'label' => 'entry.filters.preview_picture_label',
4094ea47
JB
146 ])
147 ->add('language', ChoiceFilterType::class, [
5c895a7f 148 'choices' => array_flip($this->repository->findDistinctLanguageByUser($this->user->getId())),
0d42217e 149 'label' => 'entry.filters.language_label',
4094ea47 150 ])
d4ebe5c5 151 ;
26864574
NL
152 }
153
619cc453 154 public function getBlockPrefix()
26864574
NL
155 {
156 return 'entry_filter';
157 }
158
159 public function configureOptions(OptionsResolver $resolver)
160 {
4094ea47 161 $resolver->setDefaults([
8ce32af6 162 'csrf_protection' => false,
4094ea47
JB
163 'validation_groups' => ['filtering'],
164 ]);
26864574
NL
165 }
166}