diff --git a/lib/web/jade.js b/lib/web/jade.js
index 391eb108..f8080936 100644
--- a/lib/web/jade.js
+++ b/lib/web/jade.js
@@ -48,7 +48,10 @@ function sendJade(res, view, locals) {
});
cache[view] = fn;
}
+ var start = Date.now();
var html = cache[view](merge(locals));
+ var end = Date.now();
+ console.log(view + " " + (end - start) + "ms");
res.send(html);
}
diff --git a/www/assets/js/callbacks.js b/www/assets/js/callbacks.js
index 7d524e6d..fca5a7a4 100644
--- a/www/assets/js/callbacks.js
+++ b/www/assets/js/callbacks.js
@@ -444,27 +444,8 @@ Callbacks = {
banlist: function(entries) {
var tbl = $("#cs-banlist table");
- tbl.find("tbody").remove();
- for(var i = 0; i < entries.length; i++) {
- var tr = $("
");
- var remove = $("").addClass("btn btn-xs btn-danger")
- .appendTo($(" | ").appendTo(tr));
- $("").addClass("glyphicon glyphicon-remove-circle").appendTo(remove);
- var ip = $(" | ").text(entries[i].ip).appendTo(tr);
- var name = $(" | ").text(entries[i].name).appendTo(tr);
- var bannedby = $(" | ").text(entries[i].bannedby).appendTo(tr);
-
- (function (reason) {
- reason = "Kept spamming links";
- tr.popover({
- title: "Ban Reason",
- content: reason,
- placement: "left",
- trigger: "hover"
- });
- })(entries[i].reason);
- tr.appendTo(tbl);
- }
+ tbl.data("entries", entries);
+ formatCSBanlist();
},
recentLogins: function(entries) {
diff --git a/www/assets/js/util.js b/www/assets/js/util.js
index 43f1cb15..09234501 100644
--- a/www/assets/js/util.js
+++ b/www/assets/js/util.js
@@ -1763,3 +1763,78 @@ function formatCSModList() {
tr.appendTo(tbl);
});
}
+
+function formatCSBanlist() {
+ var tbl = $("#cs-banlist table");
+ tbl.find("tbody").remove();
+ var entries = tbl.data("entries") || [];
+ var sparse = {};
+ for (var i = 0; i < entries.length; i++) {
+ if (!(entries[i].name in sparse)) {
+ sparse[entries[i].name] = [];
+ }
+ sparse[entries[i].name].push(entries[i]);
+ }
+
+ var flat = [];
+ for (var name in sparse) {
+ flat.push({
+ name: name,
+ bans: sparse[name]
+ });
+ }
+ flat.sort(function (a, b) {
+ var x = a.name.toLowerCase(),
+ y = b.name.toLowerCase();
+ return x === y ? 0 : (x > y ? 1 : -1);
+ });
+
+ var addBanRow = function (entry, after) {
+ var tr = $("
");
+ if (after) {
+ tr.insertAfter(after);
+ } else {
+ tr.appendTo(tbl);
+ }
+ var unban = $("").addClass("btn btn-xs btn-danger")
+ .appendTo($(" | ").appendTo(tr));
+ $("").addClass("glyphicon glyphicon-remove-circle").appendTo(unban);
+ $(" | ").text(entry.ip).appendTo(tr);
+ $(" | ").text(entry.name).appendTo(tr);
+ $(" | ").text(entry.bannedby).appendTo(tr);
+ tr.popover({
+ title: "Ban Reason",
+ content: entry.reason,
+ placement: "left",
+ trigger: "hover"
+ });
+ return tr;
+ };
+
+ flat.forEach(function (person) {
+ var bans = person.bans;
+ var name = person.name;
+ var first = addBanRow(bans.shift());
+
+ if (bans.length > 0) {
+ var showmore = $("").addClass("btn btn-xs btn-default pull-right");
+ $("").addClass("glyphicon glyphicon-list").appendTo(showmore);
+ showmore.appendTo(first.find("td")[1]);
+
+ showmore.click(function () {
+ if (showmore.data("elems")) {
+ showmore.data("elems").forEach(function (e) {
+ e.remove();
+ });
+ showmore.data("elems", null);
+ } else {
+ var elems = [];
+ bans.forEach(function (b) {
+ elems.push(addBanRow(b, first));
+ });
+ showmore.data("elems", elems);
+ }
+ });
+ }
+ });
+}