From 6927f5fbb6feb682ea99317acc991a4e83094f39 Mon Sep 17 00:00:00 2001
From: Yohann D'ANELLO <yohann.danello@gmail.com>
Date: Sat, 15 Aug 2020 19:47:29 +0200
Subject: [PATCH] Search buttons by category or description, highlight matched
 words

---
 .../note/transactiontemplate_list.html        | 21 +++++++++++++++----
 apps/note/views.py                            |  7 ++++++-
 2 files changed, 23 insertions(+), 5 deletions(-)

diff --git a/apps/note/templates/note/transactiontemplate_list.html b/apps/note/templates/note/transactiontemplate_list.html
index dc1f9d0c..ec95313e 100644
--- a/apps/note/templates/note/transactiontemplate_list.html
+++ b/apps/note/templates/note/transactiontemplate_list.html
@@ -5,7 +5,7 @@
 {% block content %}
 <div class="row justify-content-center mb-4">
     <div class="col-md-10 text-center">
-        <input class="form-control mx-auto w-25" type="text" id="search_field" placeholder="{% trans "Name of the button..." %}">
+        <input class="form-control mx-auto w-25" type="text" id="search_field" placeholder="{% trans "Name of the button..." %}" value="{{ request.GET.search }}">
         <hr>
         <a class="btn btn-primary text-center my-1" href="{% url 'note:template_create' %}" data-turbolinks="false">{% trans "New button" %}</a>
     </div>
@@ -28,12 +28,25 @@
 <script type="text/javascript">
     $(document).ready(function() {
         let searchbar_obj = $("#search_field");
-        var timer_on = false;
-        var timer;
+        let timer_on = false;
+        let timer;
+
+        function refreshMatchedWords() {
+            $("tr").each(function() {
+                let pattern = searchbar_obj.val();
+                if (pattern) {
+                    $(this).find("td:eq(0), td:eq(1), td:eq(3), td:eq(6)").each(function () {
+                        $(this).html($(this).text().replace(new RegExp(pattern, 'i'), "<mark>$&</mark>"));
+                    });
+                }
+            });
+        }
+
+        refreshMatchedWords();
 
         function reloadTable() {
             let pattern = searchbar_obj.val();
-            $("#buttons_table").load(location.pathname + "?search=" + pattern.replace(" ", "%20") + " #buttons_table");
+            $("#buttons_table").load(location.pathname + "?search=" + pattern.replace(" ", "%20") + " #buttons_table", refreshMatchedWords);
         }
 
         searchbar_obj.keyup(function() {
diff --git a/apps/note/views.py b/apps/note/views.py
index 4af91420..17efdc3e 100644
--- a/apps/note/views.py
+++ b/apps/note/views.py
@@ -91,7 +91,12 @@ class TransactionTemplateListView(ProtectQuerysetMixin, LoginRequiredMixin, Sing
         qs = super().get_queryset().distinct()
         if "search" in self.request.GET:
             pattern = self.request.GET["search"]
-            qs = qs.filter(Q(name__iregex="^" + pattern) | Q(destination__club__name__iregex="^" + pattern))
+            qs = qs.filter(
+                Q(name__iregex="^" + pattern)
+                | Q(destination__club__name__iregex="^" + pattern)
+                | Q(category__name__iregex="^" + pattern)
+                | Q(description__iregex=pattern)
+            )
 
         qs = qs.order_by('-display', 'category__name', 'destination__club__name', 'name')
 
-- 
GitLab