diff --git a/apps/api/views.py b/apps/api/views.py index f951ca0..9f7c56d 100644 --- a/apps/api/views.py +++ b/apps/api/views.py @@ -2,6 +2,7 @@ import logging from typing import Any +from functools import reduce from django.db.models import Q from django.http import HttpRequest @@ -41,7 +42,9 @@ class TicketListApiView(APIView): permission_classes = [permissions.IsAuthenticated] pagination_class = TicketPaginiation - ALLOWED_FILTERS = ("uuid__in", "priority__in", "tags__in", "author__department__in", "title__contains") + ALLOWED_FILTERS = ( + "uuid__in", "priority__in", "tags__in", "author__department__in", "search" + ) MATCHER_MAP = { "contains": lambda k, v: {k: v[0]}, "in": lambda k, v: {k: v} @@ -101,12 +104,19 @@ class TicketListApiView(APIView): if key not in self.ALLOWED_FILTERS: raise KeyError(key) - if "all" in values: - continue - if not key.endswith("__in"): values = values[0] + if key == "search": + queryset = queryset.filter( + Q(**{"title__contains": values}) | + Q(**{"description__contains": values}) + ) + continue + + if "all" in values: + continue + filter_kwargs = {key: values} queryset = queryset.filter(Q(**filter_kwargs)) diff --git a/apps/static/assets/js/tickets.js b/apps/static/assets/js/tickets.js index 8b65eea..9c0cb35 100644 --- a/apps/static/assets/js/tickets.js +++ b/apps/static/assets/js/tickets.js @@ -18,10 +18,6 @@ const formControls = [ ]; $(document).ready(function() { - // $(".email-list-item").on("click", function() { - // displayTicket(this); - // }); - ClassicEditor .create( document.getElementById("newDesc"), {}) .then( newEditor => { @@ -34,13 +30,17 @@ $(document).ready(function() { $("#searchTickets").keyup(() => { clearTimeout(searchTimeout); searchTimeout = setTimeout(() => { + console.debug("searching"); value = $("#searchTickets").val(); if (value === "") { - delete filters["title__contains"]; - return; + console.debug("deleted search filters"); + delete filters["search"]; + } + else { + console.debug("updated search filters"); + filters["search"] = value; } - filters["title__contains"] = value; loadAllTickets(); }, 500); }) @@ -59,12 +59,14 @@ function setupFilter(selector, key) { var uuid = input.val(); input.on("change", function () { + if (input.is(":checkbox")) { + if ($(this).is(":checked")) { filters[key] = filters[key] || []; filters[key].push(uuid); - } else { - // filters[key].splice(filters[key].indexOf(uuid), 1); + } + else { filters[key] = filters[key].filter(id => id !== uuid); if (filters[key].length === 0) { delete filters[key]; @@ -75,7 +77,7 @@ function setupFilter(selector, key) { filters[key] = [uuid]; } - console.log(JSON.stringify(filters, null, 4)); + console.debug(`Filter applied '${key}' as '${uuid}'`) loadAllTickets(); }); }); @@ -158,17 +160,14 @@ function loadFilterCounts() { url: URL_FilterCounts, type: "GET", success: function(data) { - console.log(JSON.stringify(data, null, 4)); - updateFilterCounts('priority', data); updateFilterCounts('tag', data); updateFilterCounts('department', data); $("#filterPriorityAll .badge").text(data.ticket_count); - $("#ticketCount").text(data.ticket_count) - + $("#ticketCounts .total").text(data.ticket_count) }, error: function(data) { - alert(JSON.stringify(data, null, 4)) + console.error(JSON.stringify(data, null, 4)) } }); } @@ -191,6 +190,8 @@ function loadAllTickets() { loadingTickets = false; console.log(JSON.stringify(data, null, 4)) + $("#ticketCounts .current").text(data.length); + data.forEach(function(ticket) { var timestamp = new Date(ticket.timestamp); var formattedTime; diff --git a/apps/templates/home/tickets.html b/apps/templates/home/tickets.html index c2adce1..c320de8 100644 --- a/apps/templates/home/tickets.html +++ b/apps/templates/home/tickets.html @@ -137,7 +137,7 @@
- Showing Results +