sortable trust list tables

This commit is contained in:
Zlatin Balevsky
2019-12-13 02:23:42 +00:00
parent 38fcdfc97a
commit 8ae0a16b8a
2 changed files with 161 additions and 54 deletions

View File

@ -92,7 +92,7 @@ public class TrustServlet extends HttpServlet {
subs.forEach(sub -> sub.toXML(sb));
sb.append("</Subscriptions>");
} else if (section.equals("list")) {
} else if (section.equals("listTrusted")) {
String userB64 = req.getParameter("user");
Persona p;
try {
@ -106,20 +106,49 @@ public class TrustServlet extends HttpServlet {
if (list == null)
return;
List<TrustListEntry> entries = new ArrayList<>();
list.getGood().forEach(good -> {
String reason = good.getReason() == null ? "" : good.getReason();
TrustListEntry entry = new TrustListEntry(
good.getPersona(),
reason,
core.getTrustService().getLevel(good.getPersona().getDestination()));
entries.add(entry);
});
TRUST_LIST_ENTRY_COMPARATORS.sort(entries, req);
sb.append("<List>");
sb.append("<Trusted>");
for (TrustEntry te : list.getGood()) {
TEtoXML(te, sb, core.getTrustService());
entries.forEach(entry -> entry.toXML(sb));
sb.append("</List>");
} else if (section.equals("listDistrusted")) {
String userB64 = req.getParameter("user");
Persona p;
try {
p = new Persona(new ByteArrayInputStream(Base64.decode(userB64)));
} catch (Exception bad) {
resp.sendError(403, "Bad param");
return;
}
sb.append("</Trusted>");
sb.append("<Distrusted>");
for (TrustEntry te : list.getBad()) {
TEtoXML(te, sb, core.getTrustService());
}
sb.append("</Distrusted>");
RemoteTrustList list = core.getTrustSubscriber().getRemoteTrustLists().get(p.getDestination());
if (list == null)
return;
List<TrustListEntry> entries = new ArrayList<>();
list.getBad().forEach(bad -> {
String reason = bad.getReason() == null ? "" : bad.getReason();
TrustListEntry entry = new TrustListEntry(
bad.getPersona(),
reason,
core.getTrustService().getLevel(bad.getPersona().getDestination()));
entries.add(entry);
});
TRUST_LIST_ENTRY_COMPARATORS.sort(entries, req);
sb.append("<List>");
entries.forEach(entry -> entry.toXML(sb));
sb.append("</List>");
}
@ -190,18 +219,6 @@ public class TrustServlet extends HttpServlet {
trustManager = (TrustManager) config.getServletContext().getAttribute("trustManager");
}
private static void TEtoXML(TrustEntry te, StringBuilder sb, TrustService trustService) {
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("<Status>").append(trustService.getLevel(te.getPersona().getDestination())).append("</Status>");
sb.append("</Persona>");
}
private static class TrustUser {
private final Persona persona;
private final String reason;
@ -299,4 +316,45 @@ public class TrustServlet extends HttpServlet {
SUBSCRIPTION_COMPARATORS.add("Trusted", SUBSCRIPTION_BY_TRUSTED);
SUBSCRIPTION_COMPARATORS.add("Distrusted", SUBSCRIPTION_BY_DISTRUSTED);
}
private static class TrustListEntry {
private final Persona persona;
private final String reason;
private final TrustLevel status;
TrustListEntry(Persona persona, String reason, TrustLevel status) {
this.persona = persona;
this.reason = reason;
this.status = status;
}
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("<Status>").append(status).append("</Status>");
sb.append("</Persona>");
}
}
private static final Comparator<TrustListEntry> TRUST_LIST_ENTRY_BY_USER = (l, r) -> {
return l.persona.getHumanReadableName().compareTo(r.persona.getHumanReadableName());
};
private static final Comparator<TrustListEntry> TRUST_LIST_ENTRY_BY_REASON = (l, r) -> {
return l.reason.compareTo(r.reason);
};
private static final Comparator<TrustListEntry> TRUST_LIST_ENTRY_BY_STATUS = (l, r) -> {
return l.status.toString().compareTo(r.status.toString());
};
private static final ColumnComparators<TrustListEntry> TRUST_LIST_ENTRY_COMPARATORS = new ColumnComparators<>();
static {
TRUST_LIST_ENTRY_COMPARATORS.add("User", TRUST_LIST_ENTRY_BY_USER);
TRUST_LIST_ENTRY_COMPARATORS.add("Reason", TRUST_LIST_ENTRY_BY_REASON);
TRUST_LIST_ENTRY_COMPARATORS.add("Your Trust", TRUST_LIST_ENTRY_BY_STATUS);
}
}

View File

@ -37,6 +37,17 @@ class Persona {
this.status = xmlNode.getElementsByTagName("Status")[0].childNodes[0].nodeValue
}
getMapping() {
var mapping = new Map()
var userHtml = this.user + this.getTrustActions().join(" ")
mapping.set("User", userHtml)
mapping.set("Reason", this.reason)
mapping.set("Your Trust", this.status)
return mapping
}
getTrustBlock() {
return "<span id='trusted-link-" + this.userB64 + "'>" + this.getTrustLink() + "</span>" +
"<span id='trusted-" + this.userB64 + "'></span>"
@ -77,6 +88,11 @@ var currentUser = null
var listsSortKey
var listsSortOrder
var trustedSortKey
var trustedSortOrder
var distrustedSortKey
var distrustedSortOrder
function markTrusted(user) {
var linkSpan = document.getElementById("trusted-link-" + user)
linkSpan.innerHTML = ""
@ -175,21 +191,16 @@ function forceUpdate(user) {
xmlhttp.send("action=subscribe&persona=" + user)
}
function updateDiv(name, list) {
var html = "<table><thead><tr><th>" + _t("User") + "</th><th>" + _t("Reason") + "</th><th>" + _t("Your Trust") + "</th><th>" + _t("Actions") + "</th></tr></thead><tbody>"
var i
for (i = 0; i < list.length; i++) {
html += "<tr>"
html += "<td>" + list[i].user + "</td>"
html += "<td>" + list[i].reason + "</td>" // maybe in <pre>
html += "<td>" + list[i].status + "</td>"
html += "<td>" + list[i].getTrustActions().join(" ") + "</td>"
html += "</tr>"
}
document.getElementById(name).innerHTML = html
function sortTrustedList(key, order) {
trustedSortKey = key
trustedSortOrder = order
displayTrustedList(currentUser)
}
function sortDistrustedList(key, order) {
distrustedSortKey = key
distrustedSortOrder = order
displayDistrustedList(currentUser)
}
function parse(xmlNode, list) {
@ -199,33 +210,71 @@ function parse(xmlNode, list) {
list.push(new Persona(users[i]))
}
function displayList(user) {
currentUser = user
var currentList = lists.get(currentUser)
function displayTrustedList(user) {
var b64 = lists.get(currentUser).userB64
var xmlhttp = new XMLHttpRequest()
xmlhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
var trusted = []
var distrusted = []
parse(this.responseXML, trusted)
var xmlNode = this.responseXML.getElementsByTagName("Trusted")[0]
parse(xmlNode, trusted)
xmlNode = this.responseXML.getElementsByTagName("Distrusted")[0]
parse(xmlNode, distrusted)
var newOrder
if (trustedSortOrder == "descending")
newOrder = "ascending"
else if (trustedSortOrder == "ascending")
newOrder = "descending"
var table = new Table(["User", "Reason", "Your Trust"], "sortTrustedList", trustedSortKey, newOrder)
var i
for(i = 0; i < trusted.length; i++) {
table.addRow(trusted[i].getMapping())
}
var currentListDiv = document.getElementById("currentList")
currentListDiv.innerHTML = "Trust List Of " + user
updateDiv("trusted", trusted)
updateDiv("distrusted", distrusted)
var trustedDiv = document.getElementById("trusted")
trustedDiv.innerHTML = table.render()
}
}
xmlhttp.open("GET", "/MuWire/Trust?section=list&user=" + currentList.userB64)
var sortParam = "&key=" + trustedSortKey + "&order=" + trustedSortOrder
xmlhttp.open("GET", encodeURI("/MuWire/Trust?section=listTrusted&user=" + b64 + sortParam))
xmlhttp.send()
}
function displayDistrustedList(user) {
var b64 = lists.get(currentUser).userB64
var xmlhttp = new XMLHttpRequest()
xmlhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
var distrusted = []
parse(this.responseXML, distrusted)
var newOrder
if (distrustedSortOrder == "descending")
newOrder = "ascending"
else if (distrustedSortOrder == "ascending")
newOrder = "descending"
var table = new Table(["User", "Reason", "Your Trust"], "sortDistrustedList", distrustedSortKey, newOrder)
var i
for(i = 0; i < distrusted.length; i++) {
table.addRow(distrusted[i].getMapping())
}
var distrustedDiv = document.getElementById("distrusted")
distrustedDiv.innerHTML = table.render()
}
}
var sortParam = "&key=" + distrustedSortKey + "&order=" + distrustedSortOrder
xmlhttp.open("GET", encodeURI("/MuWire/Trust?section=listDistrusted&user=" + b64 + sortParam))
xmlhttp.send()
}
function displayList(user) {
currentUser = user
displayTrustedList(user)
displayDistrustedList(user)
}
function sortSubscriptions(key, order) {
listsSortKey = key
listsSortOrder = order