sortable tables on trust users page

This commit is contained in:
Zlatin Balevsky
2019-12-12 21:43:54 +00:00
parent 3a738f8f62
commit 3747f9a5d5
3 changed files with 181 additions and 77 deletions

View File

@ -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("<Revision>").append(trustManager.getRevision()).append("</Revision>");
} else if (section.equals("users")) {
} else if (section.equals("trustedUsers")) {
List<TrustUser> 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("<Users>");
sb.append("<Trusted>");
for (TrustEntry te : core.getTrustService().getGood().values()) {
TEtoXML(te,sb, core.getTrustSubscriber());
}
sb.append("</Trusted>");
sb.append("<Distrusted>");
for (TrustEntry te : core.getTrustService().getBad().values()) {
TEtoXML(te, sb, core.getTrustSubscriber());
}
sb.append("</Distrusted>");
list.forEach(u -> u.toXML(sb));
sb.append("</Users>");
} else if (section.equals("distrustedUsers")) {
List<TrustUser> 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("<Users>");
list.forEach(l -> l.toXML(sb));
sb.append("</Users>");
} else if (section.equals("subscriptions")) {
sb.append("<Subscriptions>");
@ -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("<Persona>");
sb.append("<User>").append(Util.escapeHTMLinXML(te.getPersona().getHumanReadableName())).append("</User>");
sb.append("<UserB64>").append(te.getPersona().toBase64()).append("</UserB64>");
String reason = "";
if (te.getReason() != null)
reason = te.getReason();
sb.append("<Reason>").append(Util.escapeHTMLinXML(reason)).append("</Reason>");
sb.append("<Subscribed>").append(trustSubscriber.isSubscribed(te.getPersona())).append("</Subscribed>");
sb.append("</Persona>");
}
private static void TEtoXML(TrustEntry te, StringBuilder sb, TrustService trustService) {
sb.append("<Persona>");
sb.append("<User>").append(Util.escapeHTMLinXML(te.getPersona().getHumanReadableName())).append("</User>");
@ -197,4 +201,44 @@ public class TrustServlet extends HttpServlet {
sb.append("<Status>").append(trustService.getLevel(te.getPersona().getDestination())).append("</Status>");
sb.append("</Persona>");
}
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("<Persona>");
sb.append("<User>").append(Util.escapeHTMLinXML(persona.getHumanReadableName())).append("</User>");
sb.append("<UserB64>").append(persona.toBase64()).append("</UserB64>");
sb.append("<Reason>").append(Util.escapeHTMLinXML(reason)).append("</Reason>");
sb.append("<Subscribed>").append(subscribed).append("</Subscribed>");
sb.append("</Persona>");
}
}
private static final Comparator<TrustUser> USER_BY_USER = (l, r) -> {
return l.persona.getHumanReadableName().compareTo(r.persona.getHumanReadableName());
};
private static final Comparator<TrustUser> USER_BY_REASON = (l, r) -> {
return l.reason.compareTo(r.reason);
};
private static final Comparator<TrustUser> USER_BY_SUBSCRIBED = (l, r) -> {
return Boolean.compare(l.subscribed, r.subscribed);
};
private static final ColumnComparators<TrustUser> 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);
}
}

View File

@ -9,16 +9,46 @@ class Persona {
} catch (ignore) {}
}
getTrustedLink() {
return "<a herf='#' onclick='window.markTrusted(\"" + this.userB64 + "\"); return false;'>" + _t("Mark Trusted") + "</a>"
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 = "<a herf='#' onclick='window.markTrusted(\"" + this.userB64 + "\"); return false;'>" + _t("Mark Trusted") + "</a>"
var block = "<span id='trusted-link-" + this.userB64 + "'>" + link + "</span>"
block += "<span id='trusted-" + this.userB64 + "'></span>"
return block
}
getNeutralLink() {
return "<a herf='#' onclick='window.markNeutral(\"" + this.userB64 + "\"); return false;'>" + _t("Mark Neutral") + "</a>"
}
getDistrustedLink() {
return "<a herf='#' onclick='window.markDistrusted(\"" + this.userB64 + "\"); return false;'>" + _t("Mark Distrusted") + "</a>"
getDistrustedBlock() {
var link = "<a herf='#' onclick='window.markDistrusted(\"" + this.userB64 + "\"); return false;'>" + _t("Mark Distrusted") + "</a>"
var block = "<span id='distrusted-link-" + this.userB64 + "'>" + link + "</span>"
block += "<span id='distrusted-" + this.userB64 + "'></span>"
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 = "<table><thead><tr><th>" + _t("User") + "</th><th>" + _t("Reason") + "</th><th>" + _t("Actions") + "</th><th>" + _t("Subscribe") + "</th></tr></thead><tbody>"
var isTrusted = (map == trusted)
for (var [ignored, user] of map) {
tableHtml += "<tr>"
tableHtml += "<td>" + user.user + "</td>"
tableHtml += "<td>" + user.reason + "</td>"
tableHtml += "<td>"
if (isTrusted) {
tableHtml += user.getNeutralLink() + " <span id='distrusted-link-" + user.userB64 + "'>" + user.getDistrustedLink() + "</span>" +
"<span id='distrusted-" + user.userB64 + "'></span>"
} else {
tableHtml += user.getNeutralLink() + " <span id='trusted-link-" + user.userB64 + "'>" + user.getTrustedLink() + "</span>" +
"<span id='trusted-" + user.userB64 + "'></span>"
}
tableHtml += "</td>"
if (user.subscribed == "true") {
tableHtml += "<td>" + _t("Subscribed") + "</td>"
} else if (isTrusted) {
tableHtml += "<td>" + user.getSubscribeLink() + "</td>"
}
tableHtml += "</tr>"
}
tableHtml += "</tbody></table>"
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() {

View File

@ -12,6 +12,7 @@ String pagetitle=Util._t("Trust Users");
<head>
<%@ include file="css.jsi"%>
<script src="js/util.js?<%=version%>" type="text/javascript"></script>
<script src="js/tables.js?<%=version%>" type="text/javascript"></script>
<script src="js/trustUsers.js?<%=version%>" type="text/javascript"></script>
</head>