Merge branch 'dev'
This commit is contained in:
commit
ec1b28b8cd
22 changed files with 754 additions and 447 deletions
|
|
@ -254,6 +254,7 @@
|
|||
<!-- Mine -->
|
||||
<script src="./assets/js/iourl.js"></script>
|
||||
<script src="./assets/js/data.js"></script>
|
||||
<script src="./assets/js/paginator.js"></script>
|
||||
<script src="./assets/js/util.js"></script>
|
||||
<script src="./assets/js/acp.js"></script>
|
||||
</body>
|
||||
|
|
|
|||
|
|
@ -154,7 +154,12 @@ html, body {
|
|||
border-left: 0;
|
||||
}
|
||||
|
||||
#messagebuffer div, #messagebuffer code, #filteredit code {
|
||||
#channeldata td {
|
||||
max-width: 200px;
|
||||
}
|
||||
|
||||
#messagebuffer div, #messagebuffer code, #filteredit code,
|
||||
#channeldata td, #currenttitle {
|
||||
white-space: pre-wrap; /* css-3 */
|
||||
white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
|
||||
white-space: -pre-wrap; /* Opera 4-6 */
|
||||
|
|
|
|||
|
|
@ -47,7 +47,25 @@ function tableResort(tbl, sortby) {
|
|||
tbl.data("sort_desc", !tbl.data("sort_desc"));
|
||||
else
|
||||
tbl.data("sortby", sortby)
|
||||
loadPage(tbl, 0);
|
||||
var sort_field = tbl.data("sortby");
|
||||
var sort_desc = tbl.data("sort_desc");
|
||||
var p = tbl.data("paginator");
|
||||
|
||||
if(sort_field) {
|
||||
p.items.sort(function(a, b) {
|
||||
var x = a[sort_field];
|
||||
if(typeof x == "string")
|
||||
x = x.toLowerCase();
|
||||
var y = b[sort_field];
|
||||
if(typeof y == "string")
|
||||
y = y.toLowerCase();
|
||||
var z = x == y ? 0 : (x < y ? -1 : 1);
|
||||
if(sort_desc)
|
||||
z = -z;
|
||||
return z;
|
||||
});
|
||||
}
|
||||
p.loadPage(0);
|
||||
}
|
||||
$("#userlookup_uid").click(function() {
|
||||
tableResort($("#userlookup table"), "id");
|
||||
|
|
@ -70,87 +88,33 @@ $("#listloaded_refresh").click(function() {
|
|||
socket.emit("acp-list-loaded");
|
||||
});
|
||||
menuHandler("#show_actionlog", "#actionlog");
|
||||
$("#show_actionlog").click(getActionLog);
|
||||
$("#actionlog_filter").click(function() {
|
||||
var tbl = $("#actionlog table");
|
||||
var actions = $(this).val();
|
||||
$("#actionlog tbody").remove();
|
||||
var entries = [];
|
||||
tbl.data("allentries").forEach(function(e) {
|
||||
if(actions.indexOf(e.action) == -1)
|
||||
return;
|
||||
entries.push(e);
|
||||
});
|
||||
$("#actionlog_pagination").remove();
|
||||
if(entries.length > 20) {
|
||||
var pag = $("<div/>").addClass("pagination")
|
||||
.attr("id", "actionlog_pagination")
|
||||
.insertAfter($("#actionlog table"));
|
||||
var btns = $("<ul/>").appendTo(pag);
|
||||
for(var i = 0; i < entries.length / 20; i++) {
|
||||
var li = $("<li/>").appendTo(btns);
|
||||
(function(i) {
|
||||
$("<a/>").attr("href", "javascript:void(0)")
|
||||
.text(i+1)
|
||||
.click(function() {
|
||||
loadPage(tbl, i);
|
||||
})
|
||||
.appendTo(li);
|
||||
})(i);
|
||||
}
|
||||
tbl.data("pagination", pag);
|
||||
}
|
||||
|
||||
$("#actionlog table").data("entries", entries);
|
||||
loadPage($("#actionlog table"), 0);
|
||||
$("#show_actionlog").click(function () {
|
||||
socket.emit("acp-actionlog-list");
|
||||
});
|
||||
$("#actionlog_filter").click(getActionLog);
|
||||
$("#actionlog_searchbtn").click(function() {
|
||||
var tbl = $("#actionlog table");
|
||||
$("#actionlog tbody").remove();
|
||||
var actions = $("#actionlog_filter").val();
|
||||
var sfield = $("#actionlog_sfield").val();
|
||||
var sval = $("#actionlog_search").val().toLowerCase();
|
||||
var sort = $("#actionlog_sort").val();
|
||||
var desc = $("#actionlog_sortorder").val() === "true";
|
||||
tbl.data("sort_desc", desc);
|
||||
tbl.data("sortby", sort);
|
||||
var entries = [];
|
||||
tbl.data("allentries").forEach(function(e) {
|
||||
if(actions.indexOf(e.action) == -1)
|
||||
return;
|
||||
entries.push(e);
|
||||
});
|
||||
var entries = tbl.data("allentries");
|
||||
entries = entries.filter(function (item, i, arr) {
|
||||
var f = item[sfield];
|
||||
if(sfield === "time")
|
||||
f = new Date(f).toString().toLowerCase();
|
||||
return f.indexOf(sval) > -1;
|
||||
});
|
||||
$("#actionlog_pagination").remove();
|
||||
if(entries.length > 20) {
|
||||
var pag = $("<div/>").addClass("pagination")
|
||||
.attr("id", "actionlog_pagination")
|
||||
.insertAfter($("#actionlog table"));
|
||||
var btns = $("<ul/>").appendTo(pag);
|
||||
for(var i = 0; i < entries.length / 20; i++) {
|
||||
var li = $("<li/>").appendTo(btns);
|
||||
(function(i) {
|
||||
$("<a/>").attr("href", "javascript:void(0)")
|
||||
.text(i+1)
|
||||
.click(function() {
|
||||
loadPage(tbl, i);
|
||||
})
|
||||
.appendTo(li);
|
||||
})(i);
|
||||
}
|
||||
tbl.data("pagination", pag);
|
||||
}
|
||||
|
||||
$("#actionlog table").data("entries", entries);
|
||||
loadPage($("#actionlog table"), 0);
|
||||
tbl.data("entries", entries);
|
||||
var p = tbl.data("paginator");
|
||||
p.items = entries;
|
||||
tableResort(tbl);
|
||||
});
|
||||
$("#actionlog_clear").click(function() {
|
||||
socket.emit("acp-actionlog-clear", $("#actionlog_filter").val());
|
||||
socket.emit("acp-actionlog-list");
|
||||
getActionLog();
|
||||
});
|
||||
$("#actionlog_refresh").click(function() {
|
||||
|
|
@ -193,47 +157,51 @@ function getErrlog() {
|
|||
}
|
||||
$("#errlog").click(getErrlog);
|
||||
function getActionLog() {
|
||||
$.getJSON(WEB_URL+"/api/json/readactionlog?"+AUTH+"&callback=?").done(function(data) {
|
||||
var entries = data;
|
||||
var actions = [];
|
||||
var types = "&actions=" + $("#actionlog_filter").val().join(",");
|
||||
$.getJSON(WEB_URL+"/api/json/readactionlog?"+AUTH+types+"&callback=?").done(function(entries) {
|
||||
var tbl = $("#actionlog table");
|
||||
entries.forEach(function (e) {
|
||||
if(actions.indexOf(e.action) == -1)
|
||||
actions.push(e.action);
|
||||
e.time = parseInt(e.time);
|
||||
});
|
||||
var tbl = $("#actionlog table");
|
||||
var p = tbl.data("paginator");
|
||||
if(p) {
|
||||
p.items = entries;
|
||||
}
|
||||
else {
|
||||
var opts = {
|
||||
preLoadPage: function () {
|
||||
$("#actionlog tbody").remove();
|
||||
},
|
||||
generator: function (e, page, index) {
|
||||
var tr = $("<tr/>").appendTo($("#actionlog table"));
|
||||
var rem = $("<td/>").appendTo(tr);
|
||||
$("<button/>").addClass("btn btn-mini btn-danger")
|
||||
.html("<i class='icon-trash'></i>")
|
||||
.appendTo(rem)
|
||||
.click(function () {
|
||||
socket.emit("acp-actionlog-clear-one", e);
|
||||
tr.hide("blind", function () {
|
||||
tr.remove();
|
||||
getActionLog();
|
||||
});
|
||||
});
|
||||
$("<td/>").text(e.ip).appendTo(tr);
|
||||
$("<td/>").text(e.name).appendTo(tr);
|
||||
$("<td/>").text(e.action).appendTo(tr);
|
||||
$("<td/>").text(e.args).appendTo(tr);
|
||||
$("<td/>").text(new Date(e.time).toString()).appendTo(tr);
|
||||
}
|
||||
};
|
||||
p = Paginate(entries, opts);
|
||||
p.paginator.insertBefore($("#actionlog table"));
|
||||
tbl.data("paginator", p);
|
||||
}
|
||||
|
||||
tbl.data("sortby", "time");
|
||||
tbl.data("sort_desc", true);
|
||||
tbl.data("entries", entries);
|
||||
tbl.data("allentries", entries);
|
||||
tbl.data("generator", function(e) {
|
||||
var tr = $("<tr/>").appendTo($("#actionlog table"));
|
||||
var rem = $("<td/>").appendTo(tr);
|
||||
$("<button/>").addClass("btn btn-mini btn-danger")
|
||||
.html("<i class='icon-trash'></i>")
|
||||
.appendTo(rem)
|
||||
.click(function () {
|
||||
socket.emit("acp-actionlog-clear-one", e);
|
||||
tr.hide("blind", function () {
|
||||
tr.remove();
|
||||
getActionLog();
|
||||
});
|
||||
});
|
||||
$("<td/>").text(e.ip).appendTo(tr);
|
||||
$("<td/>").text(e.name).appendTo(tr);
|
||||
$("<td/>").text(e.action).appendTo(tr);
|
||||
$("<td/>").text(e.args).appendTo(tr);
|
||||
$("<td/>").text(new Date(e.time).toString()).appendTo(tr);
|
||||
});
|
||||
$("#actionlog table").data("entries", entries);
|
||||
$("#actionlog_filter").html("");
|
||||
actions.sort(function(a, b) {
|
||||
return a == b ? 0 : (a < b ? -1 : 1);
|
||||
});
|
||||
actions.forEach(function(a) {
|
||||
$("<option/>").text(a).val(a).appendTo($("#actionlog_filter"));
|
||||
});
|
||||
tbl.find("tbody").remove();
|
||||
tableResort(tbl);
|
||||
});
|
||||
}
|
||||
function getChanlog() {
|
||||
|
|
@ -272,41 +240,6 @@ $("#userlookup_submit").click(function() {
|
|||
socket.emit("acp-lookup-user", $("#userlookup_name").val());
|
||||
});
|
||||
|
||||
function loadPage(tbl, page) {
|
||||
var sort_field = tbl.data("sortby");
|
||||
var sort_desc = tbl.data("sort_desc");
|
||||
var generator = tbl.data("generator");
|
||||
var pag = tbl.data("pagination");
|
||||
if(pag) {
|
||||
pag.find("li").each(function() {
|
||||
$(this).removeClass("active");
|
||||
});
|
||||
$(pag.find("li")[page]).addClass("active");
|
||||
}
|
||||
var e = tbl.data("entries");
|
||||
|
||||
tbl.find("tbody").remove();
|
||||
|
||||
if(sort_field) {
|
||||
e.sort(function(a, b) {
|
||||
var x = a[sort_field];
|
||||
if(typeof x == "string")
|
||||
x = x.toLowerCase();
|
||||
var y = b[sort_field];
|
||||
if(typeof y == "string")
|
||||
y = y.toLowerCase();
|
||||
var z = x == y ? 0 : (x < y ? -1 : 1);
|
||||
if(sort_desc)
|
||||
z = -z;
|
||||
return z;
|
||||
});
|
||||
}
|
||||
|
||||
for(var i = page * 20; i < page * 20 + 20 && i < e.length; i++) {
|
||||
generator(e[i]);
|
||||
}
|
||||
}
|
||||
|
||||
function setupCallbacks() {
|
||||
socket.on("connect", function() {
|
||||
if(NAME && SESSION) {
|
||||
|
|
@ -371,75 +304,70 @@ function setupCallbacks() {
|
|||
|
||||
socket.on("acp-userdata", function(data) {
|
||||
var tbl = $("#userlookup table");
|
||||
if(data.length > 20) {
|
||||
var pag = $("<div/>").addClass("pagination")
|
||||
.attr("id", "userlookup_pagination")
|
||||
.insertAfter($("#userlookup table"));
|
||||
var btns = $("<ul/>").appendTo(pag);
|
||||
for(var i = 0; i < data.length / 20; i++) {
|
||||
var li = $("<li/>").appendTo(btns);
|
||||
(function(i) {
|
||||
$("<a/>").attr("href", "javascript:void(0)")
|
||||
.text(i+1)
|
||||
.click(function() {
|
||||
loadPage(tbl, i);
|
||||
})
|
||||
.appendTo(li);
|
||||
})(i);
|
||||
}
|
||||
tbl.data("pagination", pag);
|
||||
var p = tbl.data("paginator");
|
||||
if(p) {
|
||||
p.items = data;
|
||||
}
|
||||
else {
|
||||
var opts = {
|
||||
preLoadPage: function () {
|
||||
tbl.find("tbody").remove();
|
||||
},
|
||||
generator: function (u, page, index) {
|
||||
var tr = $("<tr/>").appendTo(tbl);
|
||||
$("<td/>").text(u.id).appendTo(tr);
|
||||
$("<td/>").text(u.uname).appendTo(tr);
|
||||
var rank = $("<td/>").text(u.global_rank).appendTo(tr);
|
||||
$("<td/>").text(u.email).appendTo(tr);
|
||||
$("<button/>").addClass("btn btn-mini")
|
||||
.text("Reset password")
|
||||
.appendTo($("<td/>").appendTo(tr))
|
||||
.click(function() {
|
||||
var reset = confirm("Really reset password?");
|
||||
if(reset) {
|
||||
socket.emit("acp-reset-password", {
|
||||
name: u.uname,
|
||||
email: u.email
|
||||
});
|
||||
}
|
||||
});
|
||||
rank.click(function() {
|
||||
if(this.find(".rank-edit").length > 0)
|
||||
return;
|
||||
var r = this.text();
|
||||
this.text("");
|
||||
var edit = $("<input/>").attr("type", "text")
|
||||
.attr("placeholder", r)
|
||||
.addClass("rank-edit")
|
||||
.appendTo(this)
|
||||
.focus();
|
||||
|
||||
function save() {
|
||||
var r = this.val();
|
||||
var r2 = r;
|
||||
if(r.trim() == "")
|
||||
r = this.attr("placeholder");
|
||||
this.parent().text(this.attr("placeholder"));
|
||||
socket.emit("acp-set-rank", {
|
||||
name: u.uname,
|
||||
rank: parseInt(r)
|
||||
});
|
||||
}
|
||||
edit.blur(save.bind(edit));
|
||||
edit.keydown(function(ev) {
|
||||
if(ev.keyCode == 13)
|
||||
save.bind(edit)();
|
||||
});
|
||||
}.bind(rank));
|
||||
}
|
||||
};
|
||||
p = Paginate(data, opts);
|
||||
p.paginator.insertBefore(tbl);
|
||||
tbl.data("paginator", p);
|
||||
}
|
||||
tbl.data("entries", data);
|
||||
tbl.data("sortby", "uname");
|
||||
tbl.data("sort_desc", false);
|
||||
tbl.data("generator", function(u) {
|
||||
var tr = $("<tr/>").appendTo($("#userlookup table"));
|
||||
$("<td/>").text(u.id).appendTo(tr);
|
||||
$("<td/>").text(u.uname).appendTo(tr);
|
||||
var rank = $("<td/>").text(u.global_rank).appendTo(tr);
|
||||
$("<td/>").text(u.email).appendTo(tr);
|
||||
$("<button/>").addClass("btn btn-mini")
|
||||
.text("Reset password")
|
||||
.appendTo($("<td/>").appendTo(tr))
|
||||
.click(function() {
|
||||
var reset = confirm("Really reset password?");
|
||||
if(reset) {
|
||||
socket.emit("acp-reset-password", {
|
||||
name: u.uname,
|
||||
email: u.email
|
||||
});
|
||||
}
|
||||
});
|
||||
rank.click(function() {
|
||||
if(this.find(".rank-edit").length > 0)
|
||||
return;
|
||||
var r = this.text();
|
||||
this.text("");
|
||||
var edit = $("<input/>").attr("type", "text")
|
||||
.attr("placeholder", r)
|
||||
.addClass("rank-edit")
|
||||
.appendTo(this)
|
||||
.focus();
|
||||
|
||||
function save() {
|
||||
var r = this.val();
|
||||
var r2 = r;
|
||||
if(r.trim() == "")
|
||||
r = this.attr("placeholder");
|
||||
this.parent().text(this.attr("placeholder"));
|
||||
socket.emit("acp-set-rank", {
|
||||
name: u.uname,
|
||||
rank: parseInt(r)
|
||||
});
|
||||
}
|
||||
edit.blur(save.bind(edit));
|
||||
edit.keydown(function(ev) {
|
||||
if(ev.keyCode == 13)
|
||||
save.bind(edit)();
|
||||
});
|
||||
}.bind(rank));
|
||||
});
|
||||
loadPage($("#userlookup table"), 0);
|
||||
tableResort(tbl);
|
||||
});
|
||||
|
||||
socket.on("acp-set-rank", function(data) {
|
||||
|
|
@ -564,6 +492,16 @@ function setupCallbacks() {
|
|||
new Chart($("#stat_channels")[0].getContext("2d")).Line(chan_data);
|
||||
new Chart($("#stat_mem")[0].getContext("2d")).Line(mem_data);
|
||||
});
|
||||
|
||||
socket.on("acp-actionlog-list", function (alist) {
|
||||
$("#actionlog_filter").html("");
|
||||
alist.sort(function(a, b) {
|
||||
return a == b ? 0 : (a < b ? -1 : 1);
|
||||
});
|
||||
alist.forEach(function(a) {
|
||||
$("<option/>").text(a).val(a).appendTo($("#actionlog_filter"));
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/* cookie util */
|
||||
|
|
|
|||
|
|
@ -426,25 +426,61 @@ Callbacks = {
|
|||
if(tbl.children().length > 1) {
|
||||
$(tbl.children()[1]).remove();
|
||||
}
|
||||
$("#channelranks_pagination").remove();
|
||||
if(entries.length > 20) {
|
||||
var pag = $("<div/>").addClass("pagination span12")
|
||||
.attr("id", "channelranks_pagination")
|
||||
.prependTo($("#channelranks"));
|
||||
var btns = $("<ul/>").appendTo(pag);
|
||||
for(var i = 0; i < entries.length / 20; i++) {
|
||||
var li = $("<li/>").appendTo(btns);
|
||||
(function(i) {
|
||||
$("<a/>").attr("href", "javascript:void(0)")
|
||||
.text(i+1)
|
||||
.click(function() {
|
||||
loadChannelRanksPage(i);
|
||||
})
|
||||
.appendTo(li);
|
||||
})(i);
|
||||
}
|
||||
var p = tbl.data("paginator");
|
||||
if(p) {
|
||||
p.items = entries;
|
||||
p.loadPage(0);
|
||||
}
|
||||
else {
|
||||
var opts = {
|
||||
preLoadPage: function (p) {
|
||||
tbl.find("tbody").remove();
|
||||
tbl.data("page", p);
|
||||
},
|
||||
generator: function (item, page, index) {
|
||||
var tr = $("<tr/>").appendTo(tbl);
|
||||
var name = $("<td/>").text(item.name).appendTo(tr);
|
||||
name.addClass(getNameColor(item.rank));
|
||||
var rank = $("<td/>").text(item.rank)
|
||||
.css("min-width", "220px")
|
||||
.appendTo(tr);
|
||||
rank.click(function() {
|
||||
if(this.find(".rank-edit").length > 0)
|
||||
return;
|
||||
var r = this.text();
|
||||
this.text("");
|
||||
var edit = $("<input/>").attr("type", "text")
|
||||
.attr("placeholder", r)
|
||||
.addClass("rank-edit")
|
||||
.appendTo(this)
|
||||
.focus();
|
||||
if(parseInt(r) >= CLIENT.rank) {
|
||||
edit.attr("disabled", true);
|
||||
}
|
||||
function save() {
|
||||
var r = this.val();
|
||||
var r2 = r;
|
||||
if(r.trim() == "" || parseInt(r) >= CLIENT.rank || parseInt(r) < 1)
|
||||
r = this.attr("placeholder");
|
||||
r = parseInt(r) + "";
|
||||
this.parent().text(r);
|
||||
socket.emit("setChannelRank", {
|
||||
user: item.name,
|
||||
rank: parseInt(r)
|
||||
});
|
||||
}
|
||||
edit.blur(save.bind(edit));
|
||||
edit.keydown(function(ev) {
|
||||
if(ev.keyCode == 13)
|
||||
save.bind(edit)();
|
||||
});
|
||||
}.bind(rank));
|
||||
}
|
||||
};
|
||||
var p = Paginate(entries, opts);
|
||||
p.paginator.insertBefore($("#channelranks table"));
|
||||
tbl.data("paginator", p);
|
||||
}
|
||||
loadChannelRanksPage(0);
|
||||
},
|
||||
|
||||
setChannelRank: function(data) {
|
||||
|
|
@ -456,7 +492,9 @@ Callbacks = {
|
|||
}
|
||||
}
|
||||
$("#channelranks").data("entries", ents);
|
||||
loadChannelRanksPage($("#channelranks").data("page"));
|
||||
$("#channelranks table").data("paginator").loadPage(
|
||||
$("#channelranks table").data("page")
|
||||
);
|
||||
},
|
||||
|
||||
voteskip: function(data) {
|
||||
|
|
@ -842,23 +880,6 @@ Callbacks = {
|
|||
$("#search_clear").remove();
|
||||
clearSearchResults();
|
||||
$("#library").data("entries", data.results);
|
||||
if(data.results.length > 100) {
|
||||
var pag = $("<div/>").addClass("pagination")
|
||||
.attr("id", "search_pagination")
|
||||
.insertAfter($("#library"));
|
||||
var btns = $("<ul/>").appendTo(pag);
|
||||
for(var i = 0; i < data.results.length / 100; i++) {
|
||||
var li = $("<li/>").appendTo(btns);
|
||||
(function(i) {
|
||||
$("<a/>").attr("href", "javascript:void(0)")
|
||||
.text(i+1)
|
||||
.click(function() {
|
||||
loadSearchPage(i);
|
||||
})
|
||||
.appendTo(li);
|
||||
})(i);
|
||||
}
|
||||
}
|
||||
$("<button/>").addClass("btn btn-block")
|
||||
.addClass("span12")
|
||||
.css("margin-left", "0")
|
||||
|
|
@ -868,7 +889,38 @@ Callbacks = {
|
|||
clearSearchResults();
|
||||
})
|
||||
.insertBefore($("#library"));
|
||||
loadSearchPage(0);
|
||||
var p = $("#library").data("paginator");
|
||||
if(p) {
|
||||
p.items = data.results;
|
||||
p.loadPage(0);
|
||||
}
|
||||
else {
|
||||
var opts = {
|
||||
preLoadPage: function () {
|
||||
$("#library").html("");
|
||||
},
|
||||
|
||||
generator: function (item, page, index) {
|
||||
var li = makeSearchEntry(item, false);
|
||||
if(hasPermission("playlistadd")) {
|
||||
if(item.thumb) {
|
||||
addLibraryButtons(li, item.id, "yt");
|
||||
}
|
||||
else {
|
||||
addLibraryButtons(li, item.id);
|
||||
}
|
||||
}
|
||||
$(li).appendTo($("#library"));
|
||||
},
|
||||
|
||||
itemsPerPage: 100
|
||||
};
|
||||
|
||||
p = Paginate(data.results, opts);
|
||||
p.paginator.insertBefore($("#library"))
|
||||
.attr("id", "search_pagination");
|
||||
$("#library").data("paginator", p);
|
||||
}
|
||||
},
|
||||
|
||||
/* REGION Polls */
|
||||
|
|
|
|||
|
|
@ -69,7 +69,8 @@
|
|||
externaljs: $("#opt_externaljs").val(),
|
||||
chat_antiflood: $("#opt_chat_antiflood").prop("checked"),
|
||||
show_public: $("#opt_show_public").prop("checked"),
|
||||
enable_link_regex: $("#opt_enable_link_regex").prop("checked")
|
||||
enable_link_regex: $("#opt_enable_link_regex").prop("checked"),
|
||||
afk_timeout: parseInt($("#opt_afktimeout").val())
|
||||
});
|
||||
});
|
||||
|
||||
|
|
@ -141,4 +142,60 @@
|
|||
$("#newfilter_flags").val("g");
|
||||
$("#newfilter_replace").val("");
|
||||
});
|
||||
function splitreEntry(str) {
|
||||
var split = [];
|
||||
var current = [];
|
||||
for(var i = 0; i < str.length; i++) {
|
||||
if(str[i] == "\\" && i+1 < str.length && str[i+1].match(/\s/)) {
|
||||
current.push(str[i+1]);
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else if(str[i].match(/\s/)) {
|
||||
split.push(current.join(""));
|
||||
current = [];
|
||||
}
|
||||
else {
|
||||
current.push(str[i]);
|
||||
}
|
||||
}
|
||||
split.push(current.join(""));
|
||||
return split;
|
||||
}
|
||||
|
||||
$("#multifiltersubmit").click(function () {
|
||||
var lines = $("#multifiltereditor").val().split("\n");
|
||||
for(var i in lines) {
|
||||
var ln = lines[i];
|
||||
var fields = splitreEntry(ln);
|
||||
if(fields.length < 3 || fields.length > 4) {
|
||||
makeAlert("Error on line "+(parseInt(i)+1)+". Format: name regex flags replacement", "alert-error")
|
||||
.insertBefore($("#multifiltereditor"));
|
||||
return;
|
||||
}
|
||||
|
||||
var name = "", re = "", f = "", replace = "";
|
||||
if(fields.length == 3) {
|
||||
name = fields[0];
|
||||
re = fields[0];
|
||||
f = fields[1];
|
||||
replace = fields[2];
|
||||
}
|
||||
else if(fields.length == 4) {
|
||||
name = fields[0];
|
||||
re = fields[1];
|
||||
f = fields[2];
|
||||
replace = fields[3];
|
||||
}
|
||||
|
||||
socket.emit("updateFilter", {
|
||||
name: name,
|
||||
source: re,
|
||||
flags: f,
|
||||
replace: replace,
|
||||
filterlinks: false,
|
||||
active: true
|
||||
});
|
||||
}
|
||||
});
|
||||
})();
|
||||
|
|
|
|||
103
www/assets/js/paginator.js
Normal file
103
www/assets/js/paginator.js
Normal file
|
|
@ -0,0 +1,103 @@
|
|||
(function () {
|
||||
|
||||
var defaults = {
|
||||
preLoadPage: function () { },
|
||||
postLoadPage: function () { },
|
||||
generator: function () { },
|
||||
itemsPerPage: 20,
|
||||
maxPages: 5
|
||||
};
|
||||
|
||||
function P(items, opts) {
|
||||
this.items = items;
|
||||
this.opts = opts || {};
|
||||
for(var k in defaults)
|
||||
if(!this.opts[k])
|
||||
this.opts[k] = defaults[k];
|
||||
this.paginator = $("<div/>").addClass("pagination");
|
||||
this.loadPage(0);
|
||||
}
|
||||
|
||||
P.prototype.loadButtons = function (p) {
|
||||
var pages = parseInt(this.items.length / this.opts.itemsPerPage+0.5);
|
||||
var endcaps = pages > this.opts.maxPages;
|
||||
this.paginator.html("");
|
||||
if(this.items.length < this.opts.itemsPerPage)
|
||||
return;
|
||||
var ul = $("<ul/>").appendTo(this.paginator);
|
||||
var s = p - parseInt(this.opts.maxPages / 2);
|
||||
s = s < 0 ? 0 : s;
|
||||
s = s + this.opts.maxPages < pages ? s : pages - this.opts.maxPages;
|
||||
if(endcaps) {
|
||||
var li = $("<li/>").appendTo(ul);
|
||||
$("<a/>").attr("href", "javascript:void(0)")
|
||||
.html("«")
|
||||
.click(function () {
|
||||
this.loadPage(0);
|
||||
}.bind(this))
|
||||
.appendTo(li);
|
||||
|
||||
if(p == 0)
|
||||
li.addClass("disabled");
|
||||
|
||||
if(s > 0) {
|
||||
var sep = $("<li/>").addClass("disabled")
|
||||
.appendTo(ul);
|
||||
$("<a/>").attr("href", "javascript:void(0)")
|
||||
.html("…")
|
||||
.appendTo(sep);
|
||||
}
|
||||
}
|
||||
for(var i = s; i < s + this.opts.maxPages; i++) {
|
||||
(function (i) {
|
||||
var li = $("<li/>").appendTo(ul);
|
||||
if(i == p)
|
||||
li.addClass("active");
|
||||
$("<a/>").attr("href", "javascript:void(0)")
|
||||
.text(i + 1)
|
||||
.click(function () {
|
||||
this.loadPage(i);
|
||||
}.bind(this))
|
||||
.appendTo(li);
|
||||
}.bind(this))(i);
|
||||
}
|
||||
if(endcaps) {
|
||||
if(s + this.opts.maxPages < pages) {
|
||||
var sep = $("<li/>").addClass("disabled")
|
||||
.appendTo(ul);
|
||||
$("<a/>").attr("href", "javascript:void(0)")
|
||||
.html("…")
|
||||
.appendTo(sep);
|
||||
}
|
||||
|
||||
var li = $("<li/>").appendTo(ul);
|
||||
$("<a/>").attr("href", "javascript:void(0)")
|
||||
.html("»")
|
||||
.click(function () {
|
||||
this.loadPage(pages - 1);
|
||||
}.bind(this))
|
||||
.appendTo(li);
|
||||
|
||||
if(p == pages - 1)
|
||||
li.addClass("disabled");
|
||||
}
|
||||
}
|
||||
|
||||
P.prototype.loadPage = function (page) {
|
||||
this.opts.preLoadPage(page);
|
||||
this.loadButtons(page);
|
||||
var s = page * this.opts.itemsPerPage;
|
||||
var e = s + this.opts.itemsPerPage;
|
||||
if(e > this.items.length)
|
||||
e = this.items.length;
|
||||
for(var i = s; i < e; i++) {
|
||||
this.opts.generator(this.items[i], page, i);
|
||||
}
|
||||
this.opts.postLoadPage();
|
||||
}
|
||||
|
||||
window.Paginate = function (items, opts) {
|
||||
var p = new P(items, opts);
|
||||
return p;
|
||||
};
|
||||
})();
|
||||
|
|
@ -779,6 +779,7 @@ function handleModPermissions() {
|
|||
$("#opt_show_public").prop("checked", CHANNEL.opts.show_public);
|
||||
$("#opt_show_public").attr("disabled", CLIENT.rank < 3);
|
||||
$("#opt_enable_link_regex").prop("checked", CHANNEL.opts.enable_link_regex);
|
||||
$("#opt_afktimeout").val(CHANNEL.opts.afk_timeout);
|
||||
$("#opt_allow_voteskip").prop("checked", CHANNEL.opts.allow_voteskip);
|
||||
$("#opt_voteskip_ratio").val(CHANNEL.opts.voteskip_ratio);
|
||||
(function() {
|
||||
|
|
@ -836,7 +837,7 @@ function handlePermissionChange() {
|
|||
hasPermission("playlistjump") ||
|
||||
hasPermission("playlistdelete") ||
|
||||
hasPermission("settemp")) {
|
||||
if(USEROPTS.first_visit) {
|
||||
if(USEROPTS.first_visit && $("#plonotification").length == 0) {
|
||||
var al = makeAlert("Playlist Options", [
|
||||
"From the Options menu, you can choose to automatically",
|
||||
" hide the buttons on each entry (and show them when",
|
||||
|
|
@ -844,6 +845,7 @@ function handlePermissionChange() {
|
|||
" style of playlist buttons.",
|
||||
"<br>"].join(""))
|
||||
.addClass("span12")
|
||||
.attr("id", "plonotification")
|
||||
.insertBefore($("#queue"));
|
||||
|
||||
al.find(".close").remove();
|
||||
|
|
@ -906,30 +908,9 @@ function handlePermissionChange() {
|
|||
function clearSearchResults() {
|
||||
$("#library").html("");
|
||||
$("#search_clear").remove();
|
||||
$("#search_pagination").remove();
|
||||
}
|
||||
|
||||
function loadSearchPage(page) {
|
||||
$("#library").html("");
|
||||
var results = $("#library").data("entries");
|
||||
var start = page * 100;
|
||||
for(var i = start; i < start + 100 && i < results.length; i++) {
|
||||
var li = makeSearchEntry(results[i], false);
|
||||
if(hasPermission("playlistadd")) {
|
||||
if(results[i].thumb) {
|
||||
addLibraryButtons(li, results[i].id, "yt");
|
||||
}
|
||||
else {
|
||||
addLibraryButtons(li, results[i].id);
|
||||
}
|
||||
}
|
||||
$(li).appendTo($("#library"));
|
||||
}
|
||||
if($("#search_pagination").length > 0) {
|
||||
$("#search_pagination").find("li").each(function() {
|
||||
$(this).removeClass("active");
|
||||
});
|
||||
$($("#search_pagination").find("li")[page]).addClass("active");
|
||||
var p = $("#library").data("paginator");
|
||||
if(p) {
|
||||
p.paginator.html("");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1417,63 +1398,6 @@ function genPermissionsEditor() {
|
|||
});
|
||||
}
|
||||
|
||||
function loadChannelRanksPage(page) {
|
||||
var entries = $("#channelranks").data("entries");
|
||||
$("#channelranks").data("page", page);
|
||||
var start = page * 20;
|
||||
var tbl = $("#channelranks table");
|
||||
if(tbl.children().length > 1) {
|
||||
$(tbl.children()[1]).remove();
|
||||
}
|
||||
for(var i = start; i < start + 20 && i < entries.length; i++) {
|
||||
var tr = $("<tr/>").appendTo(tbl);
|
||||
var name = $("<td/>").text(entries[i].name).appendTo(tr);
|
||||
name.addClass(getNameColor(entries[i].rank));
|
||||
var rank = $("<td/>").text(entries[i].rank)
|
||||
.css("min-width", "220px")
|
||||
.appendTo(tr);
|
||||
(function(name) {
|
||||
rank.click(function() {
|
||||
if(this.find(".rank-edit").length > 0)
|
||||
return;
|
||||
var r = this.text();
|
||||
this.text("");
|
||||
var edit = $("<input/>").attr("type", "text")
|
||||
.attr("placeholder", r)
|
||||
.addClass("rank-edit")
|
||||
.appendTo(this)
|
||||
.focus();
|
||||
if(parseInt(r) >= CLIENT.rank) {
|
||||
edit.attr("disabled", true);
|
||||
}
|
||||
function save() {
|
||||
var r = this.val();
|
||||
var r2 = r;
|
||||
if(r.trim() == "" || parseInt(r) >= CLIENT.rank || parseInt(r) < 1)
|
||||
r = this.attr("placeholder");
|
||||
r = parseInt(r) + "";
|
||||
this.parent().text(r);
|
||||
socket.emit("setChannelRank", {
|
||||
user: name,
|
||||
rank: parseInt(r)
|
||||
});
|
||||
}
|
||||
edit.blur(save.bind(edit));
|
||||
edit.keydown(function(ev) {
|
||||
if(ev.keyCode == 13)
|
||||
save.bind(edit)();
|
||||
});
|
||||
}.bind(rank));
|
||||
})(entries[i].name);
|
||||
}
|
||||
if($("#channelranks_pagination").length > 0) {
|
||||
$("#channelranks_pagination").find("li").each(function() {
|
||||
$(this).removeClass("active");
|
||||
});
|
||||
$($("#channelranks_pagination").find("li")[page]).addClass("active");
|
||||
}
|
||||
}
|
||||
|
||||
function waitUntilDefined(obj, key, fn) {
|
||||
if(typeof obj[key] === "undefined") {
|
||||
setTimeout(function () {
|
||||
|
|
|
|||
|
|
@ -227,6 +227,7 @@
|
|||
<script src="./assets/js/iourl.js"></script>
|
||||
<script src="./assets/js/player.js"></script>
|
||||
<script src="./assets/js/notwebsocket.js"></script>
|
||||
<script src="./assets/js/paginator.js"></script>
|
||||
<script src="./assets/js/util.js"></script>
|
||||
<script src="./assets/js/ui.js"></script>
|
||||
<script src="./assets/js/callbacks.js"></script>
|
||||
|
|
|
|||
|
|
@ -56,6 +56,13 @@
|
|||
<input type="text" id="opt_maxlength" placeholder="HH:MM:SS">
|
||||
</div>
|
||||
</div>
|
||||
<!-- auto afk -->
|
||||
<div class="control-group">
|
||||
<label class="control-label" for="opt_afktimeout">Auto AFK Delay (0 to disable)</label>
|
||||
<div class="controls">
|
||||
<input type="text" id="opt_afktimeout" placeholder="0">
|
||||
</div>
|
||||
</div>
|
||||
<hr>
|
||||
<strong>Admin-Only Controls</strong>
|
||||
<!-- page title -->
|
||||
|
|
@ -107,19 +114,6 @@
|
|||
</div>
|
||||
<div id="filteredit" class="span12">
|
||||
<p>Filters will be processed in the order that they are listed here. Click and drag a row to rearrange the order. Click a regex, flags, or replacement field to edit a filter. Changes are automatically saved when you finish editing.</p>
|
||||
<table class="table table-striped table-condensed">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Delete</th>
|
||||
<th>Name</th>
|
||||
<th>Regex</th>
|
||||
<th>Flags</th>
|
||||
<th>Replacement</th>
|
||||
<th>Affects Links</th>
|
||||
<th>Active</th>
|
||||
</tr>
|
||||
</thead>
|
||||
</table>
|
||||
<strong>Add Filter</strong>
|
||||
<form class="form-horizontal" action="javascript:void(0)">
|
||||
<div class="control-group">
|
||||
|
|
@ -168,6 +162,22 @@
|
|||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<table class="table table-striped table-condensed">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Delete</th>
|
||||
<th>Name</th>
|
||||
<th>Regex</th>
|
||||
<th>Flags</th>
|
||||
<th>Replacement</th>
|
||||
<th>Affects Links</th>
|
||||
<th>Active</th>
|
||||
</tr>
|
||||
</thead>
|
||||
</table>
|
||||
<p>Multi-Filter Editor (format: name regex flags replacement). Only use this if you know what you are doing</p>
|
||||
<textarea id="multifiltereditor" class="input-block-level" rows="10"></textarea>
|
||||
<button class="btn btn-primary" id="multifiltersubmit">Add/Update</button>
|
||||
</div>
|
||||
<div id="cssedit" class="span12">
|
||||
<p>Max 20KB. If you need more space, host the file externally and use the External CSS option</p>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue