]> git.immae.eu Git - github/wallabag/wallabag.git/commitdiff
First draft for EntrySortType
authorNicolas Lœuillet <nicolas@loeuillet.org>
Sun, 12 Apr 2020 16:42:31 +0000 (18:42 +0200)
committerNicolas Lœuillet <nicolas@loeuillet.org>
Tue, 28 Apr 2020 08:13:58 +0000 (10:13 +0200)
src/Wallabag/CoreBundle/Controller/EntryController.php
src/Wallabag/CoreBundle/Form/Type/EntrySortType.php [new file with mode: 0644]
src/Wallabag/CoreBundle/Resources/config/services.yml
src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entries.html.twig

index 5157653c6480f05cbb106e34547eb5c350e678cd..85e711160c5a000de76969ce5e0633826c0cd43c 100644 (file)
@@ -15,6 +15,7 @@ use Wallabag\CoreBundle\Event\EntryDeletedEvent;
 use Wallabag\CoreBundle\Event\EntrySavedEvent;
 use Wallabag\CoreBundle\Form\Type\EditEntryType;
 use Wallabag\CoreBundle\Form\Type\EntryFilterType;
+use Wallabag\CoreBundle\Form\Type\EntrySortType;
 use Wallabag\CoreBundle\Form\Type\NewEntryType;
 use Wallabag\CoreBundle\Form\Type\SearchEntryType;
 
@@ -535,11 +536,11 @@ class EntryController extends Controller
         // defined as null by default because each repository method have the right field as default value too
         // like `getBuilderForStarredByUser` will have `starredAt` sort by default
         $sortBy = null;
-        if (\in_array($request->get('sort', 'createdAt'), ['id', 'title', 'createdAt', 'updatedAt', 'starredAt', 'archivedAt'], true)) {
-            $sortBy = $request->get('sort', null);
+        if (\in_array($request->get('entry_sort')['sortType'], ['id', 'title', 'createdAt', 'updatedAt', 'starredAt', 'archivedAt'], true)) {
+            $sortBy = $request->get('entry_sort')['sortType'];
         }
 
-        $direction = 'DESC' === $request->get('direction') ? 'DESC' : 'ASC';
+        $direction = isset($request->get('entry_sort')['sortOrder']) ? 'DESC' : 'ASC';
 
         switch ($type) {
             case 'search':
@@ -565,6 +566,7 @@ class EntryController extends Controller
         }
 
         $form = $this->createForm(EntryFilterType::class);
+        $sortForm = $this->createForm(EntrySortType::class);
 
         if ($request->query->has($form->getName())) {
             // manually bind values from the request
@@ -574,6 +576,11 @@ class EntryController extends Controller
             $this->get('lexik_form_filter.query_builder_updater')->addFilterConditions($form, $qb);
         }
 
+        if ($request->query->has($sortForm->getName())) {
+            // manually bind values from the request
+            $sortForm->submit($request->query->get($sortForm->getName()));
+        }
+
         $pagerAdapter = new DoctrineORMAdapter($qb->getQuery(), true, false);
 
         $entries = $this->get('wallabag_core.helper.prepare_pager_for_entries')->prepare($pagerAdapter);
@@ -592,6 +599,7 @@ class EntryController extends Controller
         return $this->render(
             'WallabagCoreBundle:Entry:entries.html.twig', [
                 'form' => $form->createView(),
+                'sortForm' => $sortForm->createView(),
                 'entries' => $entries,
                 'currentPage' => $page,
                 'searchTerm' => $searchTerm,
diff --git a/src/Wallabag/CoreBundle/Form/Type/EntrySortType.php b/src/Wallabag/CoreBundle/Form/Type/EntrySortType.php
new file mode 100644 (file)
index 0000000..2555f68
--- /dev/null
@@ -0,0 +1,53 @@
+<?php
+
+namespace Wallabag\CoreBundle\Form\Type;
+
+use Doctrine\ORM\EntityRepository;
+use Lexik\Bundle\FormFilterBundle\Filter\Form\Type\CheckboxFilterType;
+use Lexik\Bundle\FormFilterBundle\Filter\Form\Type\ChoiceFilterType;
+use Symfony\Component\Form\AbstractType;
+use Symfony\Component\Form\FormBuilderInterface;
+use Symfony\Component\OptionsResolver\OptionsResolver;
+use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
+
+class EntrySortType extends AbstractType
+{
+    private $user;
+
+    public function __construct(TokenStorageInterface $tokenStorage)
+    {
+        $this->user = $tokenStorage->getToken() ? $tokenStorage->getToken()->getUser() : null;
+
+        if (null === $this->user || !\is_object($this->user)) {
+            return;
+        }
+    }
+
+    public function buildForm(FormBuilderInterface $builder, array $options)
+    {
+        $builder
+            ->add('sortOrder', CheckboxFilterType::class)
+            ->add('sortType', ChoiceFilterType::class, [
+                'choices' => [
+                    'createdAt' => 'createdAt',
+                    'title' => 'title',
+                    'updatedAt' => 'updatedAt',
+                ],
+                'label' => 'entry.sort.status_label',
+            ])
+        ;
+    }
+
+    public function getBlockPrefix()
+    {
+        return 'entry_sort';
+    }
+
+    public function configureOptions(OptionsResolver $resolver)
+    {
+        $resolver->setDefaults([
+            'csrf_protection' => false,
+            'validation_groups' => ['sortering'],
+        ]);
+    }
+}
index 8417ac35c959ffb506bcd44767a6820155ffcb79..8867ec0c24700b86a5121217a4fa51e53d78e625 100644 (file)
@@ -22,6 +22,13 @@ services:
         tags:
             - { name: form.type }
 
+    wallabag_core.sort.type.entry:
+        class: Wallabag\CoreBundle\Form\Type\EntrySortType
+        arguments:
+            - "@security.token_storage"
+        tags:
+            - { name: form.type }
+
     wallabag_core.param_converter.username_feed_token_converter:
         class: Wallabag\CoreBundle\ParamConverter\UsernameFeedTokenConverter
         tags:
index e6497893649ee23c4aca93ec6b7dfd9d8b986f5e..7706896fd82e804b25a163dc65adbd170072dda3 100644 (file)
     {% endif %}
 
     <!-- Sort -->
+    {% if sortForm is not null %}
     <div id="sort" class="side-nav right-aligned">
+        <form action="{{ path('all') }}">
         <h4 class="center">{{ 'entry.sort.title'|trans }}</h4>
 
-        <div class="row">
-            <div class="col s12">
-                <label>{{ 'entry.sort.status_label'|trans }}</label>
-            </div>
+            <div class="row">
+                <div class="input-field col s6 with-checkbox">
+                    {{ form_widget(sortForm.sortType) }}
+                    {{ form_label(sortForm.sortType) }}
+                </div>
 
-            <div class="input-field col s12 with-checkbox">
-                <select>
-                    <option value="" disabled selected>Creation date</option>
-                    <option value="createdAt">{{ 'entry.sort.by.creation_date' | trans }}</option>
-                    <option value="title">{{ 'entry.sort.by.title' | trans }}</option>
-                    <option value="updatedAt">{{ 'entry.sort.by.last_updated' | trans }}</option>
-                </select>
-            </div>
+                <div class="col s12">
+                    <div class="switch">
+                        <label>Ascendant
+                        {{ form_widget(sortForm.sortOrder) }} <span class="lever"></span>
+                            Descendant
+                        </label>
+                    </div>
+                </div>
 
-            <div class="col s12">
-                <div class="switch">
-                    <label>
-                        Ascendant
-                        <input type="checkbox">
-                        <span class="lever"></span>
-                        Descendant
-                    </label>
+                <div class="col s12">
+                    <button class="btn waves-effect waves-light" type="submit" id="submit-filter" value="filter">{{ 'entry.filters.action.filter'|trans }}</button>
                 </div>
             </div>
-        </div>
+        </form>
     </div>
-
-    {# {% include "WallabagCoreBundle:Entry:pager.html.twig" with {'entries': entries} %} #}
+    {% endif %}
 
 {% endblock %}