]> git.immae.eu Git - github/wallabag/wallabag.git/commitdiff
Add filter to users management page
authorThomas Citharel <tcit@tcit.fr>
Thu, 27 Apr 2017 13:58:32 +0000 (15:58 +0200)
committerNicolas Lœuillet <nicolas@loeuillet.org>
Tue, 2 May 2017 13:28:39 +0000 (15:28 +0200)
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
17 files changed:
src/Wallabag/CoreBundle/Resources/translations/messages.da.yml
src/Wallabag/CoreBundle/Resources/translations/messages.de.yml
src/Wallabag/CoreBundle/Resources/translations/messages.en.yml
src/Wallabag/CoreBundle/Resources/translations/messages.es.yml
src/Wallabag/CoreBundle/Resources/translations/messages.fa.yml
src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml
src/Wallabag/CoreBundle/Resources/translations/messages.it.yml
src/Wallabag/CoreBundle/Resources/translations/messages.oc.yml
src/Wallabag/CoreBundle/Resources/translations/messages.pl.yml
src/Wallabag/CoreBundle/Resources/translations/messages.pt.yml
src/Wallabag/CoreBundle/Resources/translations/messages.ro.yml
src/Wallabag/CoreBundle/Resources/translations/messages.tr.yml
src/Wallabag/UserBundle/Controller/ManageController.php
src/Wallabag/UserBundle/Form/SearchUserType.php [new file with mode: 0644]
src/Wallabag/UserBundle/Repository/UserRepository.php
src/Wallabag/UserBundle/Resources/views/Manage/index.html.twig
src/Wallabag/UserBundle/Resources/views/Manage/search_form.html.twig [new file with mode: 0644]

index 72493fe39d41f09c762d5dc29f9b1b84a3ecdcb4..68fcec5c883c227465596a0f2a9149a753f822cf 100644 (file)
@@ -512,6 +512,9 @@ user:
         # delete: Delete
         # delete_confirm: Are you sure?
         # back_to_list: Back to list
+    search:
+        # label: Filter
+        # placeholder: Filter by username or email
 
 error:
     # page_title: An error occurred
index dbad8b16fabbf5edf596940aecc449fbdb70afce..be1172316be068ebcbf045356cc3a088c16b428b 100644 (file)
@@ -512,6 +512,9 @@ user:
         delete: Löschen
         delete_confirm: Bist du sicher?
         back_to_list: Zurück zur Liste
+    search:
+        # label: Filter
+        # placeholder: Filter by username or email
 
 error:
     page_title: Ein Fehler ist aufgetreten
index 42a12b2a7b5035f75f2159995bf61d63c0eb5554..b38508933934288d9120bdb0328f60426d78ebd1 100644 (file)
@@ -512,6 +512,9 @@ user:
         delete: Delete
         delete_confirm: Are you sure?
         back_to_list: Back to list
+    search:
+        label: Filter
+        placeholder: Filter by username or email
 
 error:
     page_title: An error occurred
index 6e21614e25cd7623f31f5fc54d6dfb2c5e4625fc..ebf6745a2564111230f70c0af6c2e8f7c96cc6a4 100644 (file)
@@ -512,6 +512,9 @@ user:
         delete: Eliminar
         delete_confirm: ¿Estás seguro?
         back_to_list: Volver a la lista
+    search:
+        # label: Filter
+        # placeholder: Filter by username or email
 
 error:
     page_title: Ha ocurrido un error
index b938c80aa7ad713f4963205d6e17ec04e83996ef..46460e130bc47761a608a7e727e79a063a580962 100644 (file)
@@ -512,6 +512,9 @@ user:
         # delete: Delete
         # delete_confirm: Are you sure?
         # back_to_list: Back to list
+    search:
+        # label: Filter
+        # placeholder: Filter by username or email
 
 error:
     # page_title: An error occurred
index 9abcda45cf9ba1ceab87c99a4eb567e85a1714aa..c968f7abf3111d6e3e24fd9a59e020a2b44bf47d 100644 (file)
@@ -512,6 +512,9 @@ user:
         delete: "Supprimer"
         delete_confirm: "Voulez-vous vraiment ?"
         back_to_list: "Revenir à la liste"
+    search:
+        label: Filtrer
+        placeholder: Filtrer par nom d'utilisateur ou email
 
 error:
     page_title: Une erreur est survenue
index 58d0962a0bc326cc2c6fb2de08aeb1cd0786b362..53b5e1b9e5526031f8eb40db28aa5e54574365a4 100644 (file)
@@ -512,6 +512,9 @@ user:
         # delete: Delete
         # delete_confirm: Are you sure?
         # back_to_list: Back to list
+    search:
+        # label: Filter
+        # placeholder: Filter by username or email
 
 error:
     # page_title: An error occurred
index 825a0efd14e862b57629c47823fc1ded816237f2..c6614a63b64ab215d60267f4bf92c3c36dc300fa 100644 (file)
@@ -512,6 +512,9 @@ user:
         delete: 'Suprimir'
         delete_confirm: 'Sètz segur ?'
         back_to_list: 'Tornar a la lista'
+    search:
+        # label: Filter
+        # placeholder: Filter by username or email
 
 error:
     page_title: Una error s'es produsida
index b02aa4ec491bea5a211b790890795392893a111b..b464d0f66acec3092c3e5c7d15fa5e7d47373986 100644 (file)
@@ -512,6 +512,9 @@ user:
         delete: Usuń
         delete_confirm: Jesteś pewien?
         back_to_list: Powrót do listy
+    search:
+        # label: Filter
+        # placeholder: Filter by username or email
 
 error:
     page_title: Wystąpił błąd
index 8aa7e5af87a0657e1bc92f0e15b95bc31fe2c03e..2b0b16868254cf596839da350c55bd32a683fd20 100644 (file)
@@ -512,6 +512,9 @@ user:
         delete: 'Apagar'
         delete_confirm: 'Tem certeza?'
         back_to_list: 'Voltar para a lista'
+    search:
+        # label: Filter
+        # placeholder: Filter by username or email
 
 error:
     # page_title: An error occurred
index ce8d8d52109c1e895de68f44461c7e179e0316ae..210978d03581398ffb374b2a8b4d58151adb0df2 100644 (file)
@@ -512,6 +512,9 @@ user:
         # delete: Delete
         # delete_confirm: Are you sure?
         # back_to_list: Back to list
+    search:
+        # label: Filter
+        # placeholder: Filter by username or email
 
 error:
     # page_title: An error occurred
index d890360862119681ca26058b1c78f9eba0641ee3..5ff5e012df1fdaf8ae3aba461d64795eb5c57d93 100644 (file)
@@ -512,6 +512,9 @@ user:
         # delete: Delete
         # delete_confirm: Are you sure?
         # back_to_list: Back to list
+    search:
+        # label: Filter
+        # placeholder: Filter by username or email
 
 error:
     # page_title: An error occurred
index 92ee2b4162649fad67e3158ca91c105d13e58ff4..f0e3d4dea8a183f2d8f2c06001da2f96872afc82 100644 (file)
@@ -10,6 +10,7 @@ use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
 use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
 use Wallabag\UserBundle\Entity\User;
 use Wallabag\CoreBundle\Entity\Config;
+use Wallabag\UserBundle\Form\SearchUserType;
 
 /**
  * User controller.
@@ -146,4 +147,45 @@ class ManageController extends Controller
             ->getForm()
         ;
     }
+
+    /**
+     * @param Request $request
+     * @param int     $page
+     *
+     * @Route("/search/{page}", name="user-search", defaults={"page" = 1})
+     *
+     * Default parameter for page is hardcoded (in duplication of the defaults from the Route)
+     * because this controller is also called inside the layout template without any page as argument
+     *
+     * @return \Symfony\Component\HttpFoundation\Response
+     */
+    public function searchFormAction(Request $request, $page = 1, $currentRoute = null)
+    {
+        // fallback to retrieve currentRoute from query parameter instead of injected one (when using inside a template)
+        if (null === $currentRoute && $request->query->has('currentRoute')) {
+            $currentRoute = $request->query->get('currentRoute');
+        }
+
+        $form = $this->createForm(SearchUserType::class);
+
+        $form->handleRequest($request);
+
+        if ($form->isSubmitted() && $form->isValid()) {
+            $this->get('logger')->info('searching users');
+            $em = $this->getDoctrine()->getManager();
+
+            $searchTerm = (isset($request->get('search_user')['term']) ? $request->get('search_user')['term'] : '');
+
+            $users = $em->getRepository('WallabagUserBundle:User')->getUsersForSearch($searchTerm);
+
+            return $this->render('WallabagUserBundle:Manage:index.html.twig', array(
+                'users' => $users,
+            ));
+        }
+
+        return $this->render('WallabagUserBundle:Manage:search_form.html.twig', [
+            'form' => $form->createView(),
+            'currentRoute' => $currentRoute,
+        ]);
+    }
 }
diff --git a/src/Wallabag/UserBundle/Form/SearchUserType.php b/src/Wallabag/UserBundle/Form/SearchUserType.php
new file mode 100644 (file)
index 0000000..9ce46ee
--- /dev/null
@@ -0,0 +1,29 @@
+<?php
+
+namespace Wallabag\UserBundle\Form;
+
+use Symfony\Component\Form\AbstractType;
+use Symfony\Component\Form\Extension\Core\Type\TextType;
+use Symfony\Component\Form\FormBuilderInterface;
+use Symfony\Component\OptionsResolver\OptionsResolver;
+
+class SearchUserType extends AbstractType
+{
+    public function buildForm(FormBuilderInterface $builder, array $options)
+    {
+        $builder
+            ->setMethod('GET')
+            ->add('term', TextType::class, [
+                'required' => true,
+                'label' => 'user.new.form_search.term_label',
+            ])
+        ;
+    }
+
+    public function configureOptions(OptionsResolver $resolver)
+    {
+        $resolver->setDefaults([
+            'csrf_protection' => false,
+        ]);
+    }
+}
index f913f52dd5beaf0fed96d38c940d230a98be07ba..66bbab39b819496cbe9246eb990a33d0f9528237 100644 (file)
@@ -52,4 +52,19 @@ class UserRepository extends EntityRepository
             ->getQuery()
             ->getSingleScalarResult();
     }
+
+    /**
+     * Retrieves users filtered with a search term.
+     *
+     * @param string $term
+     *
+     * @return QueryBuilder
+     */
+    public function getUsersForSearch($term)
+    {
+        return $this->createQueryBuilder('u')
+            ->andWhere('lower(u.username) LIKE lower(:term) OR lower(u.email) LIKE lower(:term) OR lower(u.name) LIKE lower(:term)')->setParameter('term', '%'.$term.'%')
+            ->getQuery()
+            ->getResult();
+    }
 }
index daba29e43ab54171d58b1c56654d074a45a30c7d..abc028521b12be4fea0303b1fe451b510491cbb8 100644 (file)
@@ -8,36 +8,41 @@
         <div class="col s12">
             <div class="card-panel">
                 <div class="row">
-                    <div class="input-field col s12">
+                    <div class="col s6">
                         <p class="help">{{ 'user.description'|trans|raw }}</p>
-
-                        <table class="bordered">
-                            <thead>
-                                <tr>
-                                    <th>{{ 'user.form.username_label'|trans }}</th>
-                                    <th>{{ 'user.form.email_label'|trans }}</th>
-                                    <th>{{ 'user.form.last_login_label'|trans }}</th>
-                                    <th>{{ 'user.list.actions'|trans }}</th>
-                                </tr>
-                            </thead>
-                            <tbody>
-                            {% for user in users %}
-                                <tr>
-                                    <td>{{ user.username }}</td>
-                                    <td>{{ user.email }}</td>
-                                    <td>{% if user.lastLogin %}{{ user.lastLogin|date('Y-m-d H:i:s') }}{% endif %}</td>
-                                    <td>
-                                        <a href="{{ path('user_edit', { 'id': user.id }) }}">{{ 'user.list.edit_action'|trans }}</a>
-                                    </td>
-                                </tr>
-                            {% endfor %}
-                            </tbody>
-                        </table>
-                        <br />
-                        <p>
-                            <a href="{{ path('user_new') }}" class="waves-effect waves-light btn">{{ 'user.list.create_new_one'|trans }}</a>
-                        </p>
                     </div>
+                    <div class="col s6">
+                        <div class="input-field">
+                            {{ render(controller("WallabagUserBundle:Manage:searchForm", {'currentRoute': app.request.attributes.get('_route')})) }}
+                        </div>
+                    </div>
+
+                    <table class="bordered">
+                        <thead>
+                            <tr>
+                                <th>{{ 'user.form.username_label'|trans }}</th>
+                                <th>{{ 'user.form.email_label'|trans }}</th>
+                                <th>{{ 'user.form2017-03-10 16:51:07.last_login_label'|trans }}</th>
+                                <th>{{ 'user.list.actions'|trans }}</th>
+                            </tr>
+                        </thead>
+                        <tbody>
+                        {% for user in users %}
+                            <tr>
+                                <td>{{ user.username }}</td>
+                                <td>{{ user.email }}</td>
+                                <td>{% if user.lastLogin %}{{ user.lastLogin|date('Y-m-d H:i:s') }}{% endif %}</td>
+                                <td>
+                                    <a href="{{ path('user_edit', { 'id': user.id }) }}">{{ 'user.list.edit_action'|trans }}</a>
+                                </td>
+                            </tr>
+                        {% endfor %}
+                        </tbody>
+                    </table>
+                    <br />
+                    <p>
+                        <a href="{{ path('user_new') }}" class="waves-effect waves-light btn">{{ 'user.list.create_new_one'|trans }}</a>
+                    </p>
                 </div>
             </div>
         </div>
diff --git a/src/Wallabag/UserBundle/Resources/views/Manage/search_form.html.twig b/src/Wallabag/UserBundle/Resources/views/Manage/search_form.html.twig
new file mode 100644 (file)
index 0000000..f59388d
--- /dev/null
@@ -0,0 +1,15 @@
+<form name="search" method="GET" action="{{ path('user-search')}}">
+    {% if form_errors(form) %}
+        <span class="black-text">{{ form_errors(form) }}</span>
+    {% endif %}
+
+    {% if form_errors(form.term) %}
+        <span class="black-text">{{ form_errors(form.term) }}</span>
+    {% endif %}
+
+    <i class="material-icons prefix">search</i>
+    {{ form_widget(form.term, { 'attr': {'autocomplete': 'off', 'placeholder': 'user.search.placeholder'} }) }}
+    <label for="search_user_term" class="active">{{ 'user.search.label' | trans }}</label>
+
+    {{ form_rest(form) }}
+</form>