From 38fcdfc97a3ca193e38015bff8a52c59485d95e2 Mon Sep 17 00:00:00 2001 From: Zlatin Balevsky Date: Fri, 13 Dec 2019 00:04:10 +0000 Subject: [PATCH] sorting of trust subscriptions table --- .../java/com/muwire/webui/TrustServlet.java | 82 ++++++++++++++++--- webui/src/main/js/trustLists.js | 55 +++++++++---- webui/src/main/webapp/TrustLists.jsp | 1 + 3 files changed, 110 insertions(+), 28 deletions(-) diff --git a/webui/src/main/java/com/muwire/webui/TrustServlet.java b/webui/src/main/java/com/muwire/webui/TrustServlet.java index 97c6f317..4564ff20 100644 --- a/webui/src/main/java/com/muwire/webui/TrustServlet.java +++ b/webui/src/main/java/com/muwire/webui/TrustServlet.java @@ -74,22 +74,22 @@ public class TrustServlet extends HttpServlet { list.forEach(l -> l.toXML(sb)); sb.append(""); } else if (section.equals("subscriptions")) { - sb.append(""); + + List subs = new ArrayList<>(); for (RemoteTrustList list : core.getTrustSubscriber().getRemoteTrustLists().values()) { - sb.append(""); - sb.append("").append(Util.escapeHTMLinXML(list.getPersona().getHumanReadableName())).append(""); - sb.append("").append(list.getPersona().toBase64()).append(""); - sb.append("").append(list.getStatus()).append(""); - String timestamp = Util._t("Never"); - if (list.getTimestamp() > 0) - timestamp = DataHelper.formatTime(list.getTimestamp()); - sb.append("").append(timestamp).append(""); - sb.append("").append(list.getGood().size()).append(""); - sb.append("").append(list.getBad().size()).append(""); - sb.append(""); + Subscription sub = new Subscription(list.getPersona(), + list.getStatus(), + list.getTimestamp(), + list.getGood().size(), + list.getBad().size()); + subs.add(sub); } + SUBSCRIPTION_COMPARATORS.sort(subs, req); + + sb.append(""); + subs.forEach(sub -> sub.toXML(sb)); sb.append(""); } else if (section.equals("list")) { @@ -241,4 +241,62 @@ public class TrustServlet extends HttpServlet { USER_COMPARATORS.add("Subscribe", USER_BY_SUBSCRIBED); } + private static class Subscription { + private final Persona persona; + private final RemoteTrustList.Status status; + private final long timestamp; + private final int trusted, distrusted; + + Subscription(Persona persona, RemoteTrustList.Status status, long timestamp, + int trusted, int distrusted) { + this.persona = persona; + this.status = status; + this.timestamp = timestamp; + this.trusted = trusted; + this.distrusted = distrusted; + } + + void toXML(StringBuilder sb) { + sb.append(""); + sb.append("").append(Util.escapeHTMLinXML(persona.getHumanReadableName())).append(""); + sb.append("").append(persona.toBase64()).append(""); + sb.append("").append(status).append(""); + String timestampString = Util._t("Never"); + if (timestamp > 0) + timestampString = DataHelper.formatTime(timestamp); + sb.append("").append(timestampString).append(""); + sb.append("").append(trusted).append(""); + sb.append("").append(distrusted).append(""); + sb.append(""); + } + } + + private static final Comparator SUBSCRIPTION_BY_USER = (l, r) -> { + return l.persona.getHumanReadableName().compareTo(r.persona.getHumanReadableName()); + }; + + private static final Comparator SUBSCRIPTION_BY_STATUS = (l, r) -> { + return l.status.toString().compareTo(r.status.toString()); + }; + + private static final Comparator SUBSCRIPTION_BY_TIMESTAMP = (l, r) -> { + return Long.compare(l.timestamp, r.timestamp); + }; + + private static final Comparator SUBSCRIPTION_BY_TRUSTED = (l, r) -> { + return Integer.compare(l.trusted, r.trusted); + }; + + private static final Comparator SUBSCRIPTION_BY_DISTRUSTED = (l, r) -> { + return Integer.compare(l.distrusted, r.distrusted); + }; + + private static final ColumnComparators SUBSCRIPTION_COMPARATORS = new ColumnComparators<>(); + static { + SUBSCRIPTION_COMPARATORS.add("Name", SUBSCRIPTION_BY_USER); + SUBSCRIPTION_COMPARATORS.add("Status", SUBSCRIPTION_BY_STATUS); + SUBSCRIPTION_COMPARATORS.add("Last Updated", SUBSCRIPTION_BY_TIMESTAMP); + SUBSCRIPTION_COMPARATORS.add("Trusted", SUBSCRIPTION_BY_TRUSTED); + SUBSCRIPTION_COMPARATORS.add("Distrusted", SUBSCRIPTION_BY_DISTRUSTED); + } } diff --git a/webui/src/main/js/trustLists.js b/webui/src/main/js/trustLists.js index d268ea4b..6654a184 100644 --- a/webui/src/main/js/trustLists.js +++ b/webui/src/main/js/trustLists.js @@ -7,6 +7,22 @@ class TrustList { this.trusted = xmlNode.getElementsByTagName("Trusted")[0].childNodes[0].nodeValue this.distrusted = xmlNode.getElementsByTagName("Distrusted")[0].childNodes[0].nodeValue } + + getMapping() { + var mapping = new Map() + + var userLink = new Link(this.user, "displayList", [this.user]) + var unsubscribeLink = new Link(_t("Unsubscribe"), "unsubscribe", [this.userB64]) + var refreshLink = new Link(_t("Refresh"), "forceUpdate", [this.userB64]) + + mapping.set("Name", userLink.render() + unsubscribeLink.render() + refreshLink.render()) + mapping.set("Status", this.status) + mapping.set("Last Updated", this.timestamp) + mapping.set("Trusted", this.trusted) + mapping.set("Distrusted", this.distrusted) + + return mapping + } } class Persona { @@ -58,6 +74,9 @@ var lists = new Map() var revision = -1 var currentUser = null +var listsSortKey +var listsSortOrder + function markTrusted(user) { var linkSpan = document.getElementById("trusted-link-" + user) linkSpan.innerHTML = "" @@ -207,41 +226,45 @@ function displayList(user) { xmlhttp.send() } +function sortSubscriptions(key, order) { + listsSortKey = key + listsSortOrder = order + refreshLists() +} + function refreshLists() { var xmlhttp = new XMLHttpRequest() xmlhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { lists.clear() + var listOfLists = [] var subs = this.responseXML.getElementsByTagName("Subscription") var i for (i = 0; i < subs.length; i++) { var trustList = new TrustList(subs[i]) - lists.set(trustList.user, trustList) + lists.set(trustList.user, trustList) + listOfLists.push(trustList) } + var newOrder + if (listsSortOrder == "descending") + newOrder = "ascending" + else if (listsSortOrder == "ascending") + newOrder = "descending" + var table = new Table(["Name","Trusted","Distrusted","Status","Last Updated"], "sortSubscriptions", listsSortKey, newOrder) - var html = "" - for (var [user, list] of lists) { - html += "" - html += "" - html += "" - html += "" - html += "" - html += "" - html += "" - html += "" + for (i = 0; i < listOfLists.length; i++) { + table.addRow(listOfLists[i].getMapping()) } - html += "
" + _t("Name") + "" + _t("Trusted") + "" + _t("Distrusted") + "" + _t("Status") + "" + _t("Last Updated") + "" + _t("Actions") + "
" + "" + list.user + "" + list.trusted + "" + list.distrusted +"" + list.status + "" + list.timestamp + "" + "" + _t("Unsubscribe") + "" + - " " + _t("Refresh") + "" + - "
" - document.getElementById("trustLists").innerHTML = html + document.getElementById("trustLists").innerHTML = table.render() if (currentUser != null) displayList(currentUser) } } - xmlhttp.open("GET", "/MuWire/Trust?section=subscriptions", true) + var sortParam = "&key=" + listsSortKey + "&order=" + listsSortOrder + xmlhttp.open("GET", encodeURI("/MuWire/Trust?section=subscriptions" + sortParam), true) xmlhttp.send() } diff --git a/webui/src/main/webapp/TrustLists.jsp b/webui/src/main/webapp/TrustLists.jsp index f771f4ba..90e3e04e 100644 --- a/webui/src/main/webapp/TrustLists.jsp +++ b/webui/src/main/webapp/TrustLists.jsp @@ -12,6 +12,7 @@ String pagetitle=Util._t("Trust Lists"); <%@ include file="css.jsi"%> +