]> git.immae.eu Git - github/wallabag/wallabag.git/blame - src/Wallabag/CoreBundle/Form/Type/EntryFilterType.php
Add a real configuration for CS-Fixer
[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;
5c895a7f
JB
7use Lexik\Bundle\FormFilterBundle\Filter\Form\Type\CheckboxFilterType;
8use Lexik\Bundle\FormFilterBundle\Filter\Form\Type\ChoiceFilterType;
f808b016
JB
9use Lexik\Bundle\FormFilterBundle\Filter\Form\Type\DateRangeFilterType;
10use Lexik\Bundle\FormFilterBundle\Filter\Form\Type\NumberRangeFilterType;
11use Lexik\Bundle\FormFilterBundle\Filter\Form\Type\TextFilterType;
12use Lexik\Bundle\FormFilterBundle\Filter\Query\QueryInterface;
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)) {
1b164717 37 return;
2fe2e411 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, [
1b164717
JB
45 'left_number_options' => [
46 'condition_operator' => FilterOperands::OPERATOR_GREATER_THAN_EQUAL,
47 'attr' => ['min' => 0],
48 ],
49 'right_number_options' => [
50 'condition_operator' => FilterOperands::OPERATOR_LOWER_THAN_EQUAL,
51 'attr' => ['min' => 0],
52 ],
d8f8a590 53 'apply_filter' => function (QueryInterface $filterQuery, $field, $values) {
1bdbc39f
JB
54 $lower = $values['value']['left_number'][0];
55 $upper = $values['value']['right_number'][0];
d8f8a590 56
1bdbc39f
JB
57 $min = (int) ($lower * $this->user->getConfig()->getReadingSpeed());
58 $max = (int) ($upper * $this->user->getConfig()->getReadingSpeed());
59
60 if (null === $lower && null === $upper) {
61 // no value? no filter
d6a9e139 62 return;
2c00dddf 63 } elseif (null === $lower && null !== $upper) {
1bdbc39f
JB
64 // only lower value is defined: query all entries with reading LOWER THAN this value
65 $expression = $filterQuery->getExpr()->lte($field, $max);
2c00dddf 66 } elseif (null !== $lower && null === $upper) {
1bdbc39f
JB
67 // only upper value is defined: query all entries with reading GREATER THAN this value
68 $expression = $filterQuery->getExpr()->gte($field, $min);
69 } else {
70 // both value are defined, perform a between
71 $expression = $filterQuery->getExpr()->between($field, $min, $max);
d6a9e139
NL
72 }
73
d8f8a590
NL
74 return $filterQuery->createCondition($expression);
75 },
0d42217e 76 'label' => 'entry.filters.reading_time.label',
4094ea47
JB
77 ])
78 ->add('createdAt', DateRangeFilterType::class, [
79 'left_date_options' => [
80 'attr' => [
8ce32af6 81 'placeholder' => 'dd/mm/yyyy',
4094ea47 82 ],
3c5b025a 83 'format' => 'dd/MM/yyyy',
8ce32af6 84 'widget' => 'single_text',
4094ea47
JB
85 ],
86 'right_date_options' => [
87 'attr' => [
8ce32af6 88 'placeholder' => 'dd/mm/yyyy',
4094ea47 89 ],
3c5b025a 90 'format' => 'dd/MM/yyyy',
8ce32af6 91 'widget' => 'single_text',
4094ea47 92 ],
0d42217e 93 'label' => 'entry.filters.created_at.label',
4094ea47 94 ]
7d6c3edc 95 )
4094ea47 96 ->add('domainName', TextFilterType::class, [
8ce32af6 97 'apply_filter' => function (QueryInterface $filterQuery, $field, $values) {
1d76102a
JB
98 $value = $values['value'];
99 if (strlen($value) <= 2 || empty($value)) {
100 return;
101 }
f808b016 102 $expression = $filterQuery->getExpr()->like($field, $filterQuery->getExpr()->lower($filterQuery->getExpr()->literal('%' . $value . '%')));
8ce32af6 103
1d76102a 104 return $filterQuery->createCondition($expression);
a3bcd60a 105 },
0d42217e 106 'label' => 'entry.filters.domain_label',
4094ea47 107 ])
10b35097 108 ->add('httpStatus', TextFilterType::class, [
d215273c
NL
109 'apply_filter' => function (QueryInterface $filterQuery, $field, $values) {
110 $value = $values['value'];
111 if (false === array_key_exists($value, Response::$statusTexts)) {
112 return;
113 }
114
115 $paramName = sprintf('%s', str_replace('.', '_', $field));
f808b016
JB
116 $expression = $filterQuery->getExpr()->eq($field, ':' . $paramName);
117 $parameters = [$paramName => $value];
d215273c
NL
118
119 return $filterQuery->createCondition($expression, $parameters);
120 },
10b35097
NL
121 'label' => 'entry.filters.http_status_label',
122 ])
4094ea47 123 ->add('isArchived', CheckboxFilterType::class, [
0d42217e 124 'label' => 'entry.filters.archived_label',
4094ea47
JB
125 ])
126 ->add('isStarred', CheckboxFilterType::class, [
0d42217e 127 'label' => 'entry.filters.starred_label',
4094ea47 128 ])
733b2cf1
DB
129 ->add('isUnread', CheckboxFilterType::class, [
130 'label' => 'entry.filters.unread_label',
131 'apply_filter' => function (QueryInterface $filterQuery, $field, $values) {
132 if (false === $values['value']) {
133 return;
134 }
135
136 $expression = $filterQuery->getExpr()->eq('e.isArchived', 'false');
137
138 return $filterQuery->createCondition($expression);
139 },
140 ])
4094ea47 141 ->add('previewPicture', CheckboxFilterType::class, [
a3bcd60a 142 'apply_filter' => function (QueryInterface $filterQuery, $field, $values) {
497e0cad 143 if (false === $values['value']) {
616f9fea
NL
144 return;
145 }
146
a3bcd60a
NL
147 $expression = $filterQuery->getExpr()->isNotNull($field);
148
149 return $filterQuery->createCondition($expression);
150 },
0d42217e 151 'label' => 'entry.filters.preview_picture_label',
4094ea47 152 ])
e8911f7c
JB
153 ->add('isPublic', CheckboxFilterType::class, [
154 'apply_filter' => function (QueryInterface $filterQuery, $field, $values) {
155 if (false === $values['value']) {
156 return;
157 }
158
159 // is_public isn't a real field
160 // we should use the "uid" field to determine if the entry has been made public
f808b016 161 $expression = $filterQuery->getExpr()->isNotNull($values['alias'] . '.uid');
e8911f7c
JB
162
163 return $filterQuery->createCondition($expression);
164 },
165 'label' => 'entry.filters.is_public_label',
166 ])
4094ea47 167 ->add('language', ChoiceFilterType::class, [
5c895a7f 168 'choices' => array_flip($this->repository->findDistinctLanguageByUser($this->user->getId())),
0d42217e 169 'label' => 'entry.filters.language_label',
4094ea47 170 ])
d4ebe5c5 171 ;
26864574
NL
172 }
173
619cc453 174 public function getBlockPrefix()
26864574
NL
175 {
176 return 'entry_filter';
177 }
178
179 public function configureOptions(OptionsResolver $resolver)
180 {
4094ea47 181 $resolver->setDefaults([
8ce32af6 182 'csrf_protection' => false,
4094ea47
JB
183 'validation_groups' => ['filtering'],
184 ]);
26864574
NL
185 }
186}