]> git.immae.eu Git - github/wallabag/wallabag.git/commitdiff
Merge pull request #1385 from wallabag/v2-status-filter
authorJeremy Benoist <j0k3r@users.noreply.github.com>
Fri, 21 Aug 2015 15:49:20 +0000 (17:49 +0200)
committerJeremy Benoist <j0k3r@users.noreply.github.com>
Fri, 21 Aug 2015 15:49:20 +0000 (17:49 +0200)
filters: implement status filter and a new view (to display all entries)

src/Wallabag/CoreBundle/Controller/EntryController.php
src/Wallabag/CoreBundle/Filter/EntryFilterType.php
src/Wallabag/CoreBundle/Repository/EntryRepository.php
src/Wallabag/CoreBundle/Resources/views/Entry/entries.html.twig
src/Wallabag/CoreBundle/Resources/views/base.html.twig
src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entries.html.twig
src/Wallabag/CoreBundle/Resources/views/themes/material/layout.html.twig
src/Wallabag/CoreBundle/Resources/views/themes/material/public/js/init.js
src/Wallabag/CoreBundle/Tests/Controller/EntryControllerTest.php

index b6a689633e1f89fd2671193151579bd6186d94df..b73e9eecd52e5aeb81e0c72e75fdf3a97f0c290a 100644 (file)
@@ -101,6 +101,21 @@ class EntryController extends Controller
         ));
     }
 
+    /**
+     * Shows all entries for current user.
+     *
+     * @param Request $request
+     * @param int     $page
+     *
+     * @Route("/all/list/{page}", name="all", defaults={"page" = "1"})
+     *
+     * @return \Symfony\Component\HttpFoundation\Response
+     */
+    public function showAllAction(Request $request, $page)
+    {
+        return $this->showEntries('all', $request, $page);
+    }
+
     /**
      * Shows unread entries for current user.
      *
@@ -173,6 +188,10 @@ class EntryController extends Controller
                 $qb = $repository->getBuilderForUnreadByUser($this->getUser()->getId());
                 break;
 
+            case 'all':
+                $qb = $repository->getBuilderForAllByUser($this->getUser()->getId());
+                break;
+
             default:
                 throw new \InvalidArgumentException(sprintf('Type "%s" is not implemented.', $type));
         }
index 771daef1799edb9c02637570a82b89877e93bbac..ff51785b8411ca733def9bdc0cdfe12b84fd902e 100644 (file)
@@ -39,7 +39,9 @@ class EntryFilterType extends AbstractType
 
                         return $filterQuery->createCondition($expression);
                     },
-            ));
+            ))
+            ->add('isArchived', 'filter_checkbox')
+            ->add('isStarred', 'filter_checkbox');
     }
 
     public function getName()
index 5538ae82b40081101d2482271a7b0b290039bfbf..e764e8f707e6566e2fcdec8914ae286904a930f6 100644 (file)
@@ -24,6 +24,20 @@ class EntryRepository extends EntityRepository
         ;
     }
 
+    /**
+     * Retrieves all entries for a user.
+     *
+     * @param int $userId
+     *
+     * @return QueryBuilder
+     */
+    public function getBuilderForAllByUser($userId)
+    {
+        return $this
+            ->getBuilderByUser($userId)
+        ;
+    }
+
     /**
      * Retrieves unread entries for a user.
      *
index a794df0e57e22e47a8898ef9f5c5aac96d77f688..118a2f4bedfa39c3f7b207b6d5ef98700a581f12 100644 (file)
@@ -21,7 +21,7 @@
     {% if entries is empty %}
         <div class="messages warning"><p>{% trans %}No articles found.{% endtrans %}</p></div>
     {% else %}
-        <div><form>{{ form_rest(form) }}<button class="btn waves-effect waves-light" type="submit" id="submit-filter" value="filter">Filter</button></form></div>
+        <div><form action="{{ path('all') }}">{{ form_rest(form) }}<button class="btn waves-effect waves-light" type="submit" id="submit-filter" value="filter">Filter</button></form></div>
         {% for entry in entries %}
             <div id="entry-{{ entry.id|e }}" class="entry">
                 <h2><a href="{{ path('view', { 'id': entry.id }) }}">{{ entry.title|raw }}</a></h2>
index ac5d2bf9c307778cc6f70319e0f1c939af70d93a..3ad776b99c3f8a8cae8d5423df9c2009b48a0f5e 100644 (file)
@@ -71,7 +71,8 @@
                     <li><a href="{{ path('unread') }}">{% trans %}unread{% endtrans %}</a></li>
                     <li><a href="{{ path('starred') }}">{% trans %}favorites{% endtrans %}</a></li>
                     <li><a href="{{ path('archive') }}"}>{% trans %}archive{% endtrans %}</a></li>
-                    <li><a href="{{ path('tag') }}">{% trans %}tags{% endtrans %}</a></li>
+                    <li><a href="{{ path('all') }}"}>{% trans %}all{% endtrans %}</a></li>
+                    <li><a href="{{ path ('tag') }}">{% trans %}tags{% endtrans %}</a></li>
                     <li><a href="{{ path('new') }}">{% trans %}save a link{% endtrans %}</a></li>
                     <li style="position: relative;"><a href="javascript: void(null);" id="search">{% trans %}search{% endtrans %}</a>
                         <div id="search-form" class="messages info popup-form">
index bd64067c567de99ab798ea61e62ae402070de1c9..b45552f2df8a00a79e90f04b11e425535b01b3a4 100644 (file)
@@ -7,6 +7,8 @@
     {% trans %}Starred{% endtrans %}
   {% elseif currentRoute == 'archive' %}
     {% trans %}Archive{% endtrans %}
+  {% elseif currentRoute == 'all' %}
+    {% trans %}Filtered{% endtrans %}
   {% else %}
     {% trans %}Unread{% endtrans %}
   {% endif %}
 
     <!-- Filters -->
     <div id="filters" class="side-nav fixed right-aligned">
-        <form>
+        <form action="{{ path('all') }}">
 
             <h4 class="center">{% trans %}Filters{% endtrans %}</h1>
 
             <div class="row">
 
+
+                <div class="col s12">
+                    <label>{% trans %}Status{% endtrans %}</label>
+                </div>
+                <div class="input-field col s6">
+                    {{ form_widget(form.isArchived) }}
+                    <label for="entry_filter_isArchived">{% trans %}Archived{% endtrans %}</label>
+                </div>
+
+                <div class="input-field col s6">
+                    {{ form_widget(form.isStarred) }}
+                    <label for="entry_filter_isStarred">{% trans %}Starred{% endtrans %}</label>
+                </div>
+
                 <div class="col s12">
                     <label>{% trans %}Reading time in minutes{% endtrans %}</label>
                 </div>
@@ -77,7 +93,6 @@
                     <label for="entry_filter_readingTime_right_number">{% trans %}to{% endtrans %}</label>
                 </div>
 
-
                 <div class="input-field col s6">
                     {{ form_widget(form.domainName, {'type': 'text', 'attr' : {'placeholder': 'website.com'} }) }}
                     <label for="entry_filter_domainName">{% trans %}Domain name{% endtrans %}</label>
index 1456d5dd620646d0544fae3555d4c7d05b9e8a3f..0ec2e082bdece743c06e79da174dd103ccf05881 100644 (file)
@@ -42,6 +42,7 @@
             <li class="bold {% if currentRoute == 'unread' or currentRoute == 'homepage' %}active{% endif %}"><a class="waves-effect" href="{{ path('unread') }}">{% trans %}unread{% endtrans %}</a></li>
             <li class="bold {% if currentRoute == 'starred' %}active{% endif %}"><a class="waves-effect" href="{{ path('starred') }}">{% trans %}starred{% endtrans %}</a></li>
             <li class="bold {% if currentRoute == 'archive' %}active{% endif %}"><a class="waves-effect" href="{{ path('archive') }}">{% trans %}archive{% endtrans %}</a></li>
+            <li class="bold {% if currentRoute == 'all' %}active{% endif %}"><a class="waves-effect" href="{{ path('all') }}">{% trans %}all{% endtrans %}</a></li>
             <li class="bold border-bottom {% if currentRoute == 'tags' %}active{% endif %}"><a class="waves-effect" href="{{ path('tag') }}">{% trans %}tags{% endtrans %}</a></li>
             <li class="bold {% if currentRoute == 'config' %}active{% endif %}"><a class="waves-effect" href="{{ path('config') }}">{% trans %}config{% endtrans %}</a></li>
             <li class="bold {% if currentRoute == 'howto' %}active{% endif %}"><a class="waves-effect" href="{{ path('howto') }}">{% trans %}howto{% endtrans %}</a></li>
index c0700c2cbbeac312c3716093de2f247999e487a9..d397f8e5cb27e31b5e5a2c25f62575303903bb1c 100755 (executable)
@@ -5,6 +5,7 @@ function init_filters() {
         $('.button-collapse-right').sideNav({ edge: 'right' });
         $('#clear_form_filters').on('click', function(){
             $('#filters input').val('');
+            $('#filters :checked').removeAttr('checked');
             return false;
         });
     }
index 86a19f616e351490be7e640ada6233e79d8afdf9..5f0a6076388535821460c9c5eb83f0561c11d032 100644 (file)
@@ -276,7 +276,7 @@ class EntryControllerTest extends WallabagCoreTestCase
 
         $crawler = $client->submit($form, $data);
 
-        $this->assertCount(4, $crawler->filter('div[class=entry]'));
+        $this->assertCount(5, $crawler->filter('div[class=entry]'));
 
         $data = array(
             'entry_filter[createdAt][left_date]' => '01/01/1970',
@@ -307,6 +307,14 @@ class EntryControllerTest extends WallabagCoreTestCase
         $crawler = $client->request('GET', 'unread/list'.$parameters);
 
         $this->assertContains($parameters, $client->getResponse()->getContent());
+
+        // reset pagination
+        $crawler = $client->request('GET', '/config');
+        $form = $crawler->filter('button[id=config_save]')->form();
+        $data = array(
+            'config[items_per_page]' => '12',
+        );
+        $client->submit($form, $data);
     }
 
     public function testFilterOnDomainName()
@@ -331,4 +339,25 @@ class EntryControllerTest extends WallabagCoreTestCase
         $crawler = $client->submit($form, $data);
         $this->assertCount(0, $crawler->filter('div[class=entry]'));
     }
+
+    public function testFilterOnStatus()
+    {
+        $this->logInAs('admin');
+        $client = $this->getClient();
+
+        $crawler = $client->request('GET', '/unread/list');
+        $form = $crawler->filter('button[id=submit-filter]')->form();
+        $form['entry_filter[isArchived]']->tick();
+        $form['entry_filter[isStarred]']->untick();
+
+        $crawler = $client->submit($form);
+        $this->assertCount(1, $crawler->filter('div[class=entry]'));
+
+        $form = $crawler->filter('button[id=submit-filter]')->form();
+        $form['entry_filter[isArchived]']->untick();
+        $form['entry_filter[isStarred]']->tick();
+
+        $crawler = $client->submit($form);
+        $this->assertCount(1, $crawler->filter('div[class=entry]'));
+    }
 }