diff --git a/webui/src/main/java/com/muwire/webui/SearchResults.java b/webui/src/main/java/com/muwire/webui/SearchResults.java index 0171a70a..02f1b896 100644 --- a/webui/src/main/java/com/muwire/webui/SearchResults.java +++ b/webui/src/main/java/com/muwire/webui/SearchResults.java @@ -63,6 +63,13 @@ public class SearchResults { } } + int getResultCount() { + int total = 0; + for (Set set : bySender.values()) + total += set.size(); + return total; + } + public UUID getUUID() { return uuid; } diff --git a/webui/src/main/java/com/muwire/webui/SearchServlet.java b/webui/src/main/java/com/muwire/webui/SearchServlet.java index 40d6c230..c181a91e 100644 --- a/webui/src/main/java/com/muwire/webui/SearchServlet.java +++ b/webui/src/main/java/com/muwire/webui/SearchServlet.java @@ -1,6 +1,10 @@ package com.muwire.webui; import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; import java.util.Map; import java.util.Set; import java.util.UUID; @@ -55,8 +59,16 @@ public class SearchServlet extends HttpServlet { return; } + String key = req.getParameter("key"); + String order = req.getParameter("order"); + Comparator comparator = SEARCH_COMPARATORS.get(key, order); + + List searchResults = new ArrayList<>(searchManager.getResults().values()); + if (comparator != null) + Collections.sort(searchResults, comparator); + sb.append(""); - for (SearchResults results : searchManager.getResults().values()) { + for (SearchResults results : searchResults) { sb.append(""); sb.append("").append(results.getRevision()).append(""); sb.append("").append(Util.escapeHTMLinXML(results.getSearch())).append(""); @@ -196,5 +208,24 @@ public class SearchServlet extends HttpServlet { browseManager = (BrowseManager) config.getServletContext().getAttribute("browseManager"); core = (Core) config.getServletContext().getAttribute("core"); } + + private static final Comparator SEARCH_BY_NAME = (k, v) -> { + return k.getSearch().compareTo(v.getSearch()); + }; + + private static final Comparator SEARCH_BY_SENDERS = (k, v) -> { + return Integer.compare(k.getSenderCount(), v.getSenderCount()); + }; + + private static final Comparator SEARCH_BY_RESULTS = (k, v) -> { + return Integer.compare(k.getResultCount(), v.getResultCount()); + }; + + private static final ColumnComparators SEARCH_COMPARATORS = new ColumnComparators<>(); + static { + SEARCH_COMPARATORS.add("Query", SEARCH_BY_NAME); + SEARCH_COMPARATORS.add("Senders", SEARCH_BY_SENDERS); + SEARCH_COMPARATORS.add("Results", SEARCH_BY_RESULTS); + } } diff --git a/webui/src/main/js/search.js b/webui/src/main/js/search.js index 14bf8a4c..62e4f0ff 100644 --- a/webui/src/main/js/search.js +++ b/webui/src/main/js/search.js @@ -187,6 +187,9 @@ var senderB64 = null var lastXML = null; var infoHash = null; +var statusKey = null +var statusOrder = null + function showCommentBySender(divId, spanId) { var split = divId.split("_"); var commentDiv = document.getElementById(divId); @@ -594,26 +597,35 @@ function refreshStatus() { currentSearch = statusByUUID.get(uuid) statusByUUID.clear() + var statuses = [] var activeSearches = this.responseXML.getElementsByTagName("Search") var i for(i = 0; i < activeSearches.length; i++) { var searchStatus = new SearchStatus(activeSearches[i]) statusByUUID.set(searchStatus.uuid, searchStatus) + statuses.push(searchStatus) } - var table = "" - for (var [searchUUID, status] of statusByUUID) { - table += "" - table += "" - table += "" - table += "" - table += "" + var newOrder + if (statusOrder == "descending") + newOrder = "ascending" + else + newOrder = "descending" + var table = new Table(["Query", "Senders", "Results"], "sortStatuses", statusKey, newOrder) + for (i = 0; i < statuses.length; i++) { + var status = statuses[i] + + var mappings = new Map() + var queryLink = "" + status.query + "" + mappings.set("Query", queryLink) + mappings.set("Senders", status.senders) + mappings.set("Results", status.results) + table.addRow(mappings) } - table += "
" + _t("Query") + "" + _t("Senders") + "" + _t("Results") + "
" + "" + status.query + "" + status.senders + "" + status.results + "
" var activeDiv = document.getElementById("activeSearches") - activeDiv.innerHTML = table + activeDiv.innerHTML = table.render() if (uuid != null) { var newStatus = statusByUUID.get(uuid) @@ -622,10 +634,17 @@ function refreshStatus() { } } } - xmlhttp.open("GET", "/MuWire/Search?section=status", true) + var params = "section=status&key=" + statusKey + "&order=" + statusOrder + xmlhttp.open("GET", "/MuWire/Search?" + params, true) xmlhttp.send() } +function sortStatuses(key, order) { + statusKey = key + statusOrder = order + refreshStatus() +} + var refreshFunction = null var refreshType = null diff --git a/webui/src/main/webapp/Home.jsp b/webui/src/main/webapp/Home.jsp index f5bedbb4..b6015ada 100644 --- a/webui/src/main/webapp/Home.jsp +++ b/webui/src/main/webapp/Home.jsp @@ -19,6 +19,7 @@ <%@include file="css.jsi"%> +