diff --git a/webui/src/main/java/com/muwire/webui/CertificateServlet.java b/webui/src/main/java/com/muwire/webui/CertificateServlet.java index 3aec33c9..dd378925 100644 --- a/webui/src/main/java/com/muwire/webui/CertificateServlet.java +++ b/webui/src/main/java/com/muwire/webui/CertificateServlet.java @@ -3,6 +3,9 @@ package com.muwire.webui; import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; import javax.servlet.ServletConfig; import javax.servlet.ServletException; @@ -50,23 +53,29 @@ public class CertificateServlet extends HttpServlet { return; } + List entries = new ArrayList<>(); + for(Certificate certificate : request.getCertificates()) { + String comment = certificate.getComment() != null ? certificate.getComment().getName() : null; + CertificateEntry entry = new CertificateEntry( + certificate.getIssuer(), + certificate.toBase64(), + certificate.getName().getName(), + certificate.getTimestamp(), + comment, + core.getCertificateManager().isImported(certificate)); + entries.add(entry); + } + + COMPARATORS.sort(entries, req); + + StringBuilder sb = new StringBuilder(); sb.append(""); sb.append(""); sb.append("").append(request.getStatus().toString()).append(""); sb.append("").append(request.totalCertificates()).append(""); sb.append(""); - for (Certificate certificate : request.getCertificates()) { - sb.append(""); - sb.append("").append(certificate.getIssuer().getHumanReadableName()).append(""); - sb.append("").append(Util.escapeHTMLinXML(certificate.getName().getName())).append(""); - if (certificate.getComment() != null) - sb.append("").append(Util.escapeHTMLinXML(certificate.getComment().getName())).append(""); - sb.append("").append(DataHelper.formatTime(certificate.getTimestamp())).append(""); - sb.append("").append(certificate.toBase64()).append(""); - sb.append("").append(core.getCertificateManager().isImported(certificate)).append(""); - sb.append(""); - } + entries.forEach(entry -> entry.toXML(sb)); sb.append(""); sb.append(""); @@ -135,6 +144,57 @@ public class CertificateServlet extends HttpServlet { core = (Core) config.getServletContext().getAttribute("core"); } - + private static class CertificateEntry { + private final Persona persona; + private final String b64; + private final String name; + private final long timestamp; + private final String comment; + private final boolean imported; + + CertificateEntry(Persona persona, String b64, String name, long timestamp, String comment, boolean imported) { + this.persona = persona; + this.b64 = b64; + this.name = name; + this.timestamp = timestamp; + this.comment = comment; + this.imported = imported; + } + + void toXML(StringBuilder sb) { + sb.append(""); + sb.append("").append(Util.escapeHTMLinXML(persona.getHumanReadableName())).append(""); + sb.append("").append(Util.escapeHTMLinXML(name)).append(""); + if (comment != null) + sb.append("").append(Util.escapeHTMLinXML(comment)).append(""); + sb.append("").append(b64).append(""); + sb.append("").append(DataHelper.formatTime(timestamp)).append(""); + sb.append("").append(imported).append(""); + sb.append(""); + } + } + private static final Comparator BY_ISSUER = (l, r) -> { + return l.persona.getHumanReadableName().compareTo(r.persona.getHumanReadableName()); + }; + + private static final Comparator BY_NAME = (l, r) -> { + return l.name.compareTo(r.name); + }; + + private static final Comparator BY_TIMESTAMP = (l, r) -> { + return Long.compare(l.timestamp, r.timestamp); + }; + + private static final Comparator BY_IMPORTED = (l, r) -> { + return Boolean.compare(l.imported, r.imported); + }; + + private static final ColumnComparators COMPARATORS = new ColumnComparators<>(); + static { + COMPARATORS.add("Issuer", BY_ISSUER); + COMPARATORS.add("Name", BY_NAME); + COMPARATORS.add("Timestamp", BY_TIMESTAMP); + COMPARATORS.add("Import", BY_IMPORTED); + } } diff --git a/webui/src/main/js/certificates.js b/webui/src/main/js/certificates.js index 3beedc9e..012b6088 100644 --- a/webui/src/main/js/certificates.js +++ b/webui/src/main/js/certificates.js @@ -1,5 +1,13 @@ var certificateFetches = new Map() var expandedCertificateComments = new Map() +var sortParams = new Map() + +class SortParams { + constructor(key, order) { + this.key = key + this.order = order + } +} class Certificate { constructor(xmlNode, divId) { @@ -15,6 +23,18 @@ class Certificate { this.imported = xmlNode.getElementsByTagName("Imported")[0].childNodes[0].nodeValue } + getMapping() { + var mapping = new Map() + mapping.set("Issuer", this.issuer + this.getViewCommentBlock()) + mapping.set("Name", this.name) + mapping.set("Timestamp", this.timestamp) + if (this.imported == "true") + mapping.set("Import", _t("Imported")) + else + mapping.set("Import", this.getImportLink()) + return mapping + } + getViewCommentBlock() { if (this.comment == null) return "" @@ -42,25 +62,6 @@ class Certificate { var link = "" + linkText + "" return link } - - renderRow() { - var commentPresent = "false" - if (this.comment != null) - commentPresent = "true" - - var html = "" - html += "" + this.issuer + this.getViewCommentBlock() + "" - html += "" + this.name + "" - html += "" + this.timestamp + "" - - if (this.imported == "true") - html += "" + _t("Imported") + "" - else - html += "" + this.getImportLink() + "" - - html += "" - return html - } } class CertificateResponse { @@ -85,17 +86,28 @@ class CertificateResponse { if (this.certificates.length == 0) return html + var params = sortParams.get(this.divId) + if (params == null) { + params = new SortParams(null, null) + sortParams.set(this.divId, params) + } + + var newOrder + if (params.order == "descending") + newOrder = "ascending" + else if (params.order == "ascending") + newOrder = "descending" + var table = new Table(["Issuer", "Name", "Timestamp", "Import"], "sort", params.key, newOrder, this.divId) + + var i + for (i = 0; i < this.certificates.length; i++) { + table.addRow(this.certificates[i].getMapping()) + } + html += " " html += _t("Certificates") + " " + this.certificates.length + "/" + this.total - - var headers = [_t("Issuer"), _t("Name"), _t("Timestamp"), _t("Import")] html += "
" - html += "" - var i - for(i = 0; i < this.certificates.length; i++) { - html += this.certificates[i].renderRow() - } - html += "
" + headers.join("") + "
" + html += table.render() return html } @@ -126,11 +138,23 @@ class CertificateFetch { block.innerHTML = fetch.lastResponse.renderTable() } } - xmlhttp.open("GET", "/MuWire/Certificate?user=" + this.senderB64 + "&infoHash=" + this.fileInfoHash, true) + var queryParams = "" + var params = sortParams.get(this.divId) + if (params != null) { + queryParams = "&key=" + params.key + "&order=" + params.order + } + xmlhttp.open("GET", "/MuWire/Certificate?user=" + this.senderB64 + "&infoHash=" + this.fileInfoHash + queryParams, true) xmlhttp.send() } } +function sort(key, order, id) { + var params = sortParams.get(id) + params.key = key + params.order = order + refreshCertificates() +} + function importCertificate(b64) { var xmlhttp = new XMLHttpRequest() xmlhttp.onreadystatechange = function() { diff --git a/webui/src/main/js/download.js b/webui/src/main/js/download.js index 6fe4e0b5..1daf0f37 100644 --- a/webui/src/main/js/download.js +++ b/webui/src/main/js/download.js @@ -78,7 +78,7 @@ function refreshDownloader() { newOrder = "ascending" else if (downloadsSortOrder == "ascending") newOrder = "descending" - var table = new Table(["Name","State","Speed","ETA","Progress","Cancel"], "sortDownloads", downloadsSortKey, newOrder) + var table = new Table(["Name","State","Speed","ETA","Progress","Cancel"], "sortDownloads", downloadsSortKey, newOrder, null) for(i = 0; i < downloaderList.length; i++) { table.addRow(downloaderList[i].getMapping()) diff --git a/webui/src/main/js/filesTable.js b/webui/src/main/js/filesTable.js index 557ae084..9de82264 100644 --- a/webui/src/main/js/filesTable.js +++ b/webui/src/main/js/filesTable.js @@ -95,7 +95,7 @@ function refreshTable() { newOrder = "ascending" else if (sortOrder == "ascending") newOrder = "descending" - var table = new Table(["File","Size"], "sort", sortKey, newOrder) + var table = new Table(["File","Size"], "sort", sortKey, newOrder, null) for (i = 0; i < filesList.length; i++) { table.addRow(filesList[i].getMapping()) diff --git a/webui/src/main/js/search.js b/webui/src/main/js/search.js index f7ae0b65..84302428 100644 --- a/webui/src/main/js/search.js +++ b/webui/src/main/js/search.js @@ -93,7 +93,7 @@ class Senders { newOrder = "ascending" else if (sendersSortOrder == "ascending") newOrder = "descending" - var table = new Table(["Sender", "Browse", "Results", "Trust"], "sortSendersTable", sendersSortKey, newOrder) + var table = new Table(["Sender", "Browse", "Results", "Trust"], "sortSendersTable", sendersSortKey, newOrder, null) var i for (i = 0; i < this.senders.length; i++) { table.addRow(this.senders[i].getMapping()) @@ -191,7 +191,7 @@ class ResultsFromSender { newOrder = "ascending" else if (resultsFromSenderSortOrder == "ascending") newOrder = "descending" - var table = new Table(["Name","Size","Download"], "sortResultsFromSenderTable", resultsFromSenderSortKey, newOrder) + var table = new Table(["Name","Size","Download"], "sortResultsFromSenderTable", resultsFromSenderSortKey, newOrder, null) var i for (i = 0 ; i < this.resultsFromSender.length; i++) { table.addRow(this.resultsFromSender[i].getMapping()) @@ -247,7 +247,7 @@ class Results { newOrder = "ascending" else if (resultsSortOrder == "ascending") newOrder = "descending" - var table = new Table(["Name","Size","Download"], "sortResultsTable", resultsSortKey, newOrder) + var table = new Table(["Name","Size","Download"], "sortResultsTable", resultsSortKey, newOrder, null) var i for (i = 0; i < this.results.length; i++) { table.addRow(this.results[i].getMapping()) @@ -375,7 +375,7 @@ class SendersForResult { newOrder = "ascending" else if (sendersForResultSortOrder == "ascending") newOrder = "descending" - var table = new Table(["Sender", "Browse", "Trust"], "sortSendersForResultTable", sendersForResultSortKey, newOrder) + var table = new Table(["Sender", "Browse", "Trust"], "sortSendersForResultTable", sendersForResultSortKey, newOrder, null) var i for (i = 0; i < this.sendersForResult.length; i++) { table.addRow(this.sendersForResult[i].getMapping()) @@ -762,7 +762,7 @@ function refreshStatus() { newOrder = "ascending" else newOrder = "descending" - var table = new Table(["Query", "Senders", "Results"], "sortStatuses", statusKey, newOrder) + var table = new Table(["Query", "Senders", "Results"], "sortStatuses", statusKey, newOrder, null) for (i = 0; i < statuses.length; i++) { var status = statuses[i] diff --git a/webui/src/main/js/tables.js b/webui/src/main/js/tables.js index 8a33bcf0..d86e124e 100644 --- a/webui/src/main/js/tables.js +++ b/webui/src/main/js/tables.js @@ -11,22 +11,30 @@ class Link { } class Column { - constructor(key) { + + constructor(key, parameter) { this.key = key + this.parameter = parameter } render(descending, callback) { var html = "" var linkText = _t(this.key) - var link = new Link(linkText, callback, [this.key, descending]) + var parameters + if (this.parameter == null) + parameters = [this.key, descending] + else + parameters = [this.key, descending, this.parameter] + var link = new Link(linkText, callback, parameters) html += link.render() + "" return html } } class Table { - constructor(columns, callback, key, descending) { - this.columns = columns.map(x => new Column(x)) + + constructor(columns, callback, key, descending, parameter) { + this.columns = columns.map(x => new Column(x, parameter)) this.callback = callback this.rows = [] this.key = key diff --git a/webui/src/main/js/trustLists.js b/webui/src/main/js/trustLists.js index 4ee8a813..3482c345 100644 --- a/webui/src/main/js/trustLists.js +++ b/webui/src/main/js/trustLists.js @@ -224,7 +224,7 @@ function displayTrustedList(user) { else if (trustedSortOrder == "ascending") newOrder = "descending" - var table = new Table(["User", "Reason", "Your Trust"], "sortTrustedList", trustedSortKey, newOrder) + var table = new Table(["User", "Reason", "Your Trust"], "sortTrustedList", trustedSortKey, newOrder, null) var i for(i = 0; i < trusted.length; i++) { table.addRow(trusted[i].getMapping()) @@ -253,7 +253,7 @@ function displayDistrustedList(user) { else if (distrustedSortOrder == "ascending") newOrder = "descending" - var table = new Table(["User", "Reason", "Your Trust"], "sortDistrustedList", distrustedSortKey, newOrder) + var table = new Table(["User", "Reason", "Your Trust"], "sortDistrustedList", distrustedSortKey, newOrder, null) var i for(i = 0; i < distrusted.length; i++) { table.addRow(distrusted[i].getMapping()) @@ -300,7 +300,7 @@ function refreshLists() { newOrder = "ascending" else if (listsSortOrder == "ascending") newOrder = "descending" - var table = new Table(["Name","Trusted","Distrusted","Status","Last Updated"], "sortSubscriptions", listsSortKey, newOrder) + var table = new Table(["Name","Trusted","Distrusted","Status","Last Updated"], "sortSubscriptions", listsSortKey, newOrder, null) for (i = 0; i < listOfLists.length; i++) { table.addRow(listOfLists[i].getMapping()) diff --git a/webui/src/main/js/trustUsers.js b/webui/src/main/js/trustUsers.js index efc226e1..05c2ea15 100644 --- a/webui/src/main/js/trustUsers.js +++ b/webui/src/main/js/trustUsers.js @@ -184,7 +184,7 @@ function refreshDistrustedUsers() { newOrder = "ascending" else if (distrustedUsersSortOrder == "ascending") newOrder = "descending" - var table = new Table(["User", "Reason"], "sortDistrustedUsers", distrustedUsersSortKey, newOrder) + var table = new Table(["User", "Reason"], "sortDistrustedUsers", distrustedUsersSortKey, newOrder, null) for (i = 0; i < distrustedList.length; i++) { table.addRow(distrustedList[i].getMapping(false)) @@ -219,7 +219,7 @@ function refreshTrustedUsers() { newOrder = "ascending" else if (trustedUsersSortOrder == "ascending") newOrder = "descending" - var table = new Table(["User" , "Reason", "Subscribe"], "sortTrustedUsers", trustedUsersSortKey, newOrder) + var table = new Table(["User" , "Reason", "Subscribe"], "sortTrustedUsers", trustedUsersSortKey, newOrder, null) for (i = 0; i < trustedList.length; i++) { table.addRow(trustedList[i].getMapping(true))