From ac5041f3ec2bc0d84574fdbdce4adccce58aa6f8 Mon Sep 17 00:00:00 2001
From: Yohann D'ANELLO <yohann.danello@gmail.com>
Date: Sun, 21 Jun 2020 22:27:32 +0200
Subject: [PATCH] Better club search bar

---
 apps/member/tables.py           |  3 +-
 apps/member/views.py            | 16 +++++++++
 templates/member/club_list.html | 59 ++++++++++++++-------------------
 templates/member/user_list.html | 14 +++++---
 4 files changed, 51 insertions(+), 41 deletions(-)

diff --git a/apps/member/tables.py b/apps/member/tables.py
index 515d7836..8f5ceb88 100644
--- a/apps/member/tables.py
+++ b/apps/member/tables.py
@@ -24,7 +24,8 @@ class ClubTable(tables.Table):
         }
         model = Club
         template_name = 'django_tables2/bootstrap4.html'
-        fields = ('id', 'name', 'email')
+        fields = ('name', 'email',)
+        order_by = ('name',)
         row_attrs = {
             'class': 'table-row',
             'id': lambda record: "row-" + str(record.pk),
diff --git a/apps/member/views.py b/apps/member/views.py
index 04742f32..c52522e2 100644
--- a/apps/member/views.py
+++ b/apps/member/views.py
@@ -299,6 +299,22 @@ class ClubListView(ProtectQuerysetMixin, LoginRequiredMixin, SingleTableView):
     model = Club
     table_class = ClubTable
 
+    def get_queryset(self, **kwargs):
+        """
+        Filter the user list with the given pattern.
+        """
+        qs = super().get_queryset().filter()
+        if "search" in self.request.GET:
+            pattern = self.request.GET["search"]
+
+            qs = qs.filter(
+                Q(name__iregex=pattern)
+                | Q(note__alias__name__iregex="^" + pattern)
+                | Q(note__alias__normalized_name__iregex=Alias.normalize("^" + pattern))
+            )
+
+        return qs
+
 
 class ClubDetailView(ProtectQuerysetMixin, LoginRequiredMixin, DetailView):
     """
diff --git a/templates/member/club_list.html b/templates/member/club_list.html
index 8ba0ef3b..b43a186c 100644
--- a/templates/member/club_list.html
+++ b/templates/member/club_list.html
@@ -7,7 +7,7 @@
         <h4>
             {% trans "search clubs" %}
         </h4>
-        <input class="form-control mx-auto w-25" type="text" onkeyup="search_field_moved();return(false);" id="search_field"/>
+        <input class="form-control mx-auto w-25" type="text" id="search_field"/>
         <hr>
         <a class="btn btn-primary text-center my-4" href="{% url 'member:club_create' %}">{% trans "Create club" %}</a>
     </div>
@@ -28,43 +28,32 @@
 {% endblock %}
 {% block extrajavascript %}
 <script type="text/javascript">
+    $(document).ready(function() {
+        let old_pattern = null;
+        let searchbar_obj = $("#search_field");
+        var timer_on = false;
+        var timer;
 
-function getInfo() {
-    var asked = $("#search_field").val();
-    /* on ne fait la requête que si on a au moins un caractère pour chercher */
-    var sel = $(".table-row");
-    if (asked.length >= 1) {
-        $.getJSON("/api/members/club/?format=json&search="+asked, function(buttons){
-            let selected_id = buttons.results.map((a => "#row-"+a.id));
-            $(".table-row,"+selected_id.join()).show();
-            $(".table-row").not(selected_id.join()).hide();
-            
+        function reloadTable() {
+            let pattern = searchbar_obj.val();
+            $("#club_table").load(location.href + "?search=" + pattern.replace(" ", "%20") + " #club_table", init);
+        }
+
+        searchbar_obj.keyup(function() {
+            if (timer_on)
+                clearTimeout(timer);
+            timer_on = true;
+            setTimeout(reloadTable, 0);
         });
-    }else{
-        // show everything
-        $('table tr').show();
-    }       
-}
-var timer;
-var timer_on;
-/* Fontion appelée quand le texte change (délenche le timer) */
-function search_field_moved(secondfield) {
-    if (timer_on) { // Si le timer a déjà été lancé, on réinitialise le compteur.
-        clearTimeout(timer);
-        timer = setTimeout("getInfo(" + secondfield + ")", 300);
-    }
-    else { // Sinon, on le lance et on enregistre le fait qu'il tourne.
-        timer = setTimeout("getInfo(" + secondfield + ")", 300);
-        timer_on = true;
-    }
-}
 
-// clickable row 
-$(document).ready(function($) {
-    $(".table-row").click(function() {
-        window.document.location = $(this).data("href");
-    });
-});
+        function init() {
+            $(".table-row").click(function() {
+                window.document.location = $(this).data("href");
+                timer_on = false;
+            });
+        }
 
+        init();
+    });
 </script>
 {% endblock %}
diff --git a/templates/member/user_list.html b/templates/member/user_list.html
index 018c479d..d7628882 100644
--- a/templates/member/user_list.html
+++ b/templates/member/user_list.html
@@ -25,6 +25,8 @@
     $(document).ready(function() {
         let old_pattern = null;
         let searchbar_obj = $("#searchbar");
+        var timer_on = false;
+        var timer;
 
         function reloadTable() {
             let pattern = searchbar_obj.val();
@@ -33,17 +35,19 @@
                 return;
 
             $("#user_table").load(location.href + "?search=" + pattern.replace(" ", "%20") + " #user_table", init);
-
-            $(".table-row").click(function() {
-                window.document.location = $(this).data("href");
-            });
         }
 
-        searchbar_obj.keyup(reloadTable);
+        searchbar_obj.keyup(function() {
+            if (timer_on)
+                clearTimeout(timer);
+            timer_on = true;
+            setTimeout(reloadTable, 0);
+        });
 
         function init() {
             $(".table-row").click(function() {
                 window.document.location = $(this).data("href");
+                timer_on = false;
             });
         }
 
-- 
GitLab