sortable tables on trust users page
This commit is contained in:
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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() {
|
||||
|
@ -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>
|
||||
|
Reference in New Issue
Block a user