diff --git a/webui/src/main/java/com/muwire/webui/TrustServlet.java b/webui/src/main/java/com/muwire/webui/TrustServlet.java index 8bdf9046..97c6f317 100644 --- a/webui/src/main/java/com/muwire/webui/TrustServlet.java +++ b/webui/src/main/java/com/muwire/webui/TrustServlet.java @@ -2,6 +2,9 @@ package com.muwire.webui; import java.io.ByteArrayInputStream; import java.io.IOException; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; import javax.servlet.ServletConfig; import javax.servlet.ServletException; @@ -40,23 +43,36 @@ public class TrustServlet extends HttpServlet { if (section.equals("revision")) { sb.append("").append(trustManager.getRevision()).append(""); - } else if (section.equals("users")) { + } else if (section.equals("trustedUsers")) { + List list = new ArrayList<>(); + for(TrustEntry te : core.getTrustService().getGood().values()) { + TrustUser trustUser = new TrustUser( + te.getPersona(), + te.getReason(), + core.getTrustSubscriber().isSubscribed(te.getPersona())); + list.add(trustUser); + } + + USER_COMPARATORS.sort(list, req); + sb.append(""); - - sb.append(""); - for (TrustEntry te : core.getTrustService().getGood().values()) { - TEtoXML(te,sb, core.getTrustSubscriber()); - } - sb.append(""); - - sb.append(""); - for (TrustEntry te : core.getTrustService().getBad().values()) { - TEtoXML(te, sb, core.getTrustSubscriber()); - } - sb.append(""); - + list.forEach(u -> u.toXML(sb)); sb.append(""); + } else if (section.equals("distrustedUsers")) { + List list = new ArrayList<>(); + for(TrustEntry te : core.getTrustService().getBad().values()) { + TrustUser trustUser = new TrustUser( + te.getPersona(), + te.getReason(), + false); + list.add(trustUser); + } + USER_COMPARATORS.sort(list, req); + + sb.append(""); + list.forEach(l -> l.toXML(sb)); + sb.append(""); } else if (section.equals("subscriptions")) { sb.append(""); @@ -174,18 +190,6 @@ public class TrustServlet extends HttpServlet { trustManager = (TrustManager) config.getServletContext().getAttribute("trustManager"); } - private static void TEtoXML(TrustEntry te, StringBuilder sb, TrustSubscriber trustSubscriber) { - sb.append(""); - sb.append("").append(Util.escapeHTMLinXML(te.getPersona().getHumanReadableName())).append(""); - sb.append("").append(te.getPersona().toBase64()).append(""); - String reason = ""; - if (te.getReason() != null) - reason = te.getReason(); - sb.append("").append(Util.escapeHTMLinXML(reason)).append(""); - sb.append("").append(trustSubscriber.isSubscribed(te.getPersona())).append(""); - sb.append(""); - } - private static void TEtoXML(TrustEntry te, StringBuilder sb, TrustService trustService) { sb.append(""); sb.append("").append(Util.escapeHTMLinXML(te.getPersona().getHumanReadableName())).append(""); @@ -197,4 +201,44 @@ public class TrustServlet extends HttpServlet { sb.append("").append(trustService.getLevel(te.getPersona().getDestination())).append(""); sb.append(""); } + + private static class TrustUser { + private final Persona persona; + private final String reason; + private final boolean subscribed; + TrustUser(Persona persona, String reason, boolean subscribed) { + this.persona = persona; + this.reason = reason; + this.subscribed = subscribed; + } + + void toXML(StringBuilder sb) { + sb.append(""); + sb.append("").append(Util.escapeHTMLinXML(persona.getHumanReadableName())).append(""); + sb.append("").append(persona.toBase64()).append(""); + sb.append("").append(Util.escapeHTMLinXML(reason)).append(""); + sb.append("").append(subscribed).append(""); + sb.append(""); + } + } + + private static final Comparator USER_BY_USER = (l, r) -> { + return l.persona.getHumanReadableName().compareTo(r.persona.getHumanReadableName()); + }; + + private static final Comparator USER_BY_REASON = (l, r) -> { + return l.reason.compareTo(r.reason); + }; + + private static final Comparator USER_BY_SUBSCRIBED = (l, r) -> { + return Boolean.compare(l.subscribed, r.subscribed); + }; + + private static final ColumnComparators USER_COMPARATORS = new ColumnComparators<>(); + static { + USER_COMPARATORS.add("User", USER_BY_USER); + USER_COMPARATORS.add("Reason", USER_BY_REASON); + USER_COMPARATORS.add("Subscribe", USER_BY_SUBSCRIBED); + } + } diff --git a/webui/src/main/js/trustUsers.js b/webui/src/main/js/trustUsers.js index cfe6c0dd..efc226e1 100644 --- a/webui/src/main/js/trustUsers.js +++ b/webui/src/main/js/trustUsers.js @@ -9,16 +9,46 @@ class Persona { } catch (ignore) {} } - getTrustedLink() { - return "" + _t("Mark Trusted") + "" + getMapping(trusted) { + var mapping = new Map() + var nameHtml = this.user + if (trusted) { + nameHtml += this.getNeutralLink() + nameHtml += this.getDistrustedBlock() + } else { + nameHtml += this.getTrustedBlock() + nameHtml += this.getNeutralLink() + } + + mapping.set("User", nameHtml) + mapping.set("Reason", this.reason) + + if (trusted) { + var subscribeHtml = _t("Subscribed") + if (this.subscribed != "true") + subscribeHtml = this.getSubscribeLink() + mapping.set("Subscribe", subscribeHtml) + } + + return mapping + } + + getTrustedBlock() { + var link = "" + _t("Mark Trusted") + "" + var block = "" + link + "" + block += "" + return block } getNeutralLink() { return "" + _t("Mark Neutral") + "" } - getDistrustedLink() { - return "" + _t("Mark Distrusted") + "" + getDistrustedBlock() { + var link = "" + _t("Mark Distrusted") + "" + var block = "" + link + "" + block += "" + return block } getSubscribeLink() { @@ -30,6 +60,11 @@ var trusted = new Map() var distrusted = new Map() var revision = -1 +var trustedUsersSortKey +var trustedUsersSortOrder +var distrustedUsersSortKey +var distrustedUsersSortOrder + function subscribe(host) { var xmlhttp = new XMLHttpRequest() xmlhttp.onreadystatechange = function() { @@ -117,69 +152,93 @@ function cancelDistrust(host) { linkSpan.innerHTML = html } -function updateTable(map, divId) { - var divElement = document.getElementById(divId) - var tableHtml = "" - - var isTrusted = (map == trusted) - for (var [ignored, user] of map) { - tableHtml += "" - tableHtml += "" - tableHtml += "" - - tableHtml += "" - - if (user.subscribed == "true") { - tableHtml += "" - } else if (isTrusted) { - tableHtml += "" - } - - - tableHtml += "" - } - tableHtml += "
" + _t("User") + "" + _t("Reason") + "" + _t("Actions") + "" + _t("Subscribe") + "
" + user.user + "" + user.reason + "" - if (isTrusted) { - tableHtml += user.getNeutralLink() + " " + user.getDistrustedLink() + "" + - "" - } else { - tableHtml += user.getNeutralLink() + " " + user.getTrustedLink() + "" + - "" - } - tableHtml += "" + _t("Subscribed") + "" + user.getSubscribeLink() + "
" - divElement.innerHTML = tableHtml +function sortTrustedUsers(key, order) { + trustedUsersSortKey = key + trustedUsersSortOrder = order + refreshTrustedUsers() } -function refreshUsers() { +function sortDistrustedUsers(key, order) { + distrustedUsersSortKey = key + distrustedUsersSortOrder = order + refreshDistrustedUsers() +} + +function refreshDistrustedUsers() { + var xmlhttp = new XMLHttpRequest() + xmlhttp.onreadystatechange = function() { + if (this.readyState == 4 && this.status == 200) { + distrusted.clear() + var distrustedList = [] + + var distrustedNodes = this.responseXML.getElementsByTagName("Persona") + var i + for (i = 0; i < distrustedNodes.length; i++) { + var persona = new Persona(distrustedNodes[i]) + distrusted.set(persona.user, persona) + distrustedList.push(persona) + } + + var newOrder + if (distrustedUsersSortOrder == "descending") + newOrder = "ascending" + else if (distrustedUsersSortOrder == "ascending") + newOrder = "descending" + var table = new Table(["User", "Reason"], "sortDistrustedUsers", distrustedUsersSortKey, newOrder) + + for (i = 0; i < distrustedList.length; i++) { + table.addRow(distrustedList[i].getMapping(false)) + } + + var tableDiv = document.getElementById("distrustedUsers") + tableDiv.innerHTML = table.render() + } + } + var sortParam = "&key=" + distrustedUsersSortKey + "&order=" + distrustedUsersSortOrder + xmlhttp.open("GET", "/MuWire/Trust?section=distrustedUsers" + sortParam) + xmlhttp.send() +} + +function refreshTrustedUsers() { var xmlhttp = new XMLHttpRequest() xmlhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { trusted.clear() - distrusted.clear() - var trustedElement = this.responseXML.getElementsByTagName("Trusted")[0] - var trustedUsers = trustedElement.getElementsByTagName("Persona") + var trustedList = [] + + var trustedNodes = this.responseXML.getElementsByTagName("Persona") var i - for (i = 0; i < trustedUsers.length; i++) { - var persona = new Persona(trustedUsers[i]) + for (i = 0; i < trustedNodes.length; i++) { + var persona = new Persona(trustedNodes[i]) trusted.set(persona.user, persona) + trustedList.push(persona) } - var distrustedElement = this.responseXML.getElementsByTagName("Distrusted")[0] - var distrustedUsers = distrustedElement.getElementsByTagName("Persona") - for (i = 0; i < distrustedUsers.length; i++) { - var persona = new Persona(distrustedUsers[i]) - distrusted.set(persona.user, persona) + var newOrder + if (trustedUsersSortOrder == "descending") + newOrder = "ascending" + else if (trustedUsersSortOrder == "ascending") + newOrder = "descending" + var table = new Table(["User" , "Reason", "Subscribe"], "sortTrustedUsers", trustedUsersSortKey, newOrder) + + for (i = 0; i < trustedList.length; i++) { + table.addRow(trustedList[i].getMapping(true)) } - - updateTable(trusted, "trustedUsers") - updateTable(distrusted, "distrustedUsers") - + + var tableDiv = document.getElementById("trustedUsers") + tableDiv.innerHTML = table.render() } } - xmlhttp.open("GET", "/MuWire/Trust?section=users", true) + var sortParam = "&key=" + trustedUsersSortKey + "&order=" + trustedUsersSortOrder + xmlhttp.open("GET", "/MuWire/Trust?section=trustedUsers" + sortParam) xmlhttp.send() } +function refreshUsers() { + refreshTrustedUsers() + refreshDistrustedUsers() +} + function fetchRevision() { var xmlhttp = new XMLHttpRequest() xmlhttp.onreadystatechange = function() { diff --git a/webui/src/main/webapp/TrustUsers.jsp b/webui/src/main/webapp/TrustUsers.jsp index eb2c82a8..674d2f5e 100644 --- a/webui/src/main/webapp/TrustUsers.jsp +++ b/webui/src/main/webapp/TrustUsers.jsp @@ -12,6 +12,7 @@ String pagetitle=Util._t("Trust Users"); <%@ include file="css.jsi"%> +