diff --git a/lib/database/channels.js b/lib/database/channels.js
index 21db8ac1..5f72da51 100644
--- a/lib/database/channels.js
+++ b/lib/database/channels.js
@@ -419,6 +419,11 @@ module.exports = {
callback = blackHole;
}
+ if (rank < 2) {
+ module.exports.deleteRank(chan, name, callback);
+ return;
+ }
+
if (!valid(chan)) {
callback("Invalid channel name", null);
return;
diff --git a/templates/channeloptions.jade b/templates/channeloptions.jade
index 14e518b1..708df4e3 100644
--- a/templates/channeloptions.jade
+++ b/templates/channeloptions.jade
@@ -92,12 +92,14 @@ mixin recentjoins
mixin chanranks
#cs-chanranks.tab-pane
+ h4 Moderator List
form.form-inline(action="javascript:void(0)", role="form")
.input-group
input#cs-chanranks-name.form-control(type="text", placeholder="Name")
span.input-group-btn
button#cs-chanranks-mod.btn.btn-success +Mod
button#cs-chanranks-adm.btn.btn-info +Admin
+ button#cs-chanranks-owner.btn.btn-info +Owner
table.table.table-striped
thead
tr
diff --git a/www/assets/js/callbacks.js b/www/assets/js/callbacks.js
index 32a7aa7a..7d524e6d 100644
--- a/www/assets/js/callbacks.js
+++ b/www/assets/js/callbacks.js
@@ -493,85 +493,12 @@ Callbacks = {
channelRanks: function(entries) {
var tbl = $("#cs-chanranks table");
- tbl.find("tbody").remove();
- entries.sort(function(a, b) {
- if (a.rank === b.rank) {
- var x = a.name.toLowerCase();
- var y = b.name.toLowerCase();
- return y == x ? 0 : (x < y ? -1 : 1);
- }
-
- return b.rank - a.rank;
- });
-
- entries.forEach(function (entry) {
- var tr = $("
").addClass("cs-chanrank-tr-" + entry.name);
- var name = $(" | ").text(entry.name).appendTo(tr);
- name.addClass(getNameColor(entry.rank));
- var rankwrap = $(" | ");
- var rank = $("").text(entry.rank).appendTo(rankwrap);
- var rankedit = $("")
- .addClass("btn btn-xs btn-default")
- .css("margin-right", "10px")
- .text("Edit")
- .prependTo(rankwrap);
- if (entry.rank >= CLIENT.rank) {
- rankedit.addClass("disabled");
- } else {
- var editbox = null;
- rankedit.click(function () {
- rankedit.hide();
- rank.hide();
- editbox = $("").addClass("form-control")
- .attr("type", "text")
- .attr("placeholder", entry.rank)
- .appendTo(rankwrap)
- .focus();
-
- var finish = function () {
- if (editbox != null) {
- socket.emit("setChannelRank", {
- user: entry.name,
- rank: parseInt(editbox.val())
- });
- editbox.remove();
- }
-
- rankedit.show();
- rank.show();
- };
-
- editbox.blur(finish);
- editbox.keydown(function (ev) {
- if (ev.keyCode === 13) {
- finish();
- }
- });
- });
- }
- rankwrap.appendTo(tr);
- tr.appendTo(tbl);
- });
+ tbl.data("entries", entries);
+ formatCSModList();
},
channelRankFail: function (data) {
- makeAlert("Error", data.msg, "alert-danger").prependTo($("#cs-chanranks"));
- },
-
- setChannelRank: function(data) {
- var ents = $("#channelranks").data("entries");
- if(typeof ents === "undefined" || ents === null)
- return;
- for(var i = 0; i < ents.length; i++) {
- if(ents[i].name == data.user) {
- ents[i].rank = data.rank;
- break;
- }
- }
- $("#channelranks").data("entries", ents);
- $("#channelranks table").data("paginator").loadPage(
- $("#channelranks table").data("page")
- );
+ makeAlert("Error", data.msg, "alert-danger").insertAfter($("#cs-chanranks h4"));
},
readChanLog: function (data) {
@@ -757,10 +684,21 @@ Callbacks = {
},
setUserRank: function (data) {
- var tr = $(".cs-chanrank-tr-" + data.name);
- var tds = tr.find("td");
- $(tds[0]).removeClass().addClass(getNameColor(data.rank));
- $(tds[1]).find("span").text(data.rank);
+ var entries = $("#cs-chanranks table").data("entries");
+ var found = false;
+ for (var i = 0; i < entries.length; i++) {
+ if (entries[i].name === data.name) {
+ entries[i].rank = data.rank;
+ found = i;
+ break;
+ }
+ }
+ if (found === false) {
+ entries.push(data);
+ } else if (entries[found].rank < 2) {
+ entries.splice(found, 1);
+ }
+ formatCSModList();
var user = findUserlistItem(data.name);
if (user === null) {
diff --git a/www/assets/js/ui.js b/www/assets/js/ui.js
index 15682fe1..7f6cd3c4 100644
--- a/www/assets/js/ui.js
+++ b/www/assets/js/ui.js
@@ -492,20 +492,13 @@ if (location.protocol === "https:") {
}
/* channel ranks stuff */
-$("#cs-chanranks-mod").click(function () {
+function chanrankSubmit(rank) {
var name = $("#cs-chanranks-name").val();
- var rank = 2;
socket.emit("setChannelRank", {
user: name,
rank: rank
});
-});
-
-$("#cs-chanranks-adm").click(function () {
- var name = $("#cs-chanranks-name").val();
- var rank = 3;
- socket.emit("setChannelRank", {
- user: name,
- rank: rank
- });
-});
+}
+$("#cs-chanranks-mod").click(chanrankSubmit.bind(this, 2));
+$("#cs-chanranks-adm").click(chanrankSubmit.bind(this, 3));
+$("#cs-chanranks-owner").click(chanrankSubmit.bind(this, 4));
diff --git a/www/assets/js/util.js b/www/assets/js/util.js
index 83b4c273..43f1cb15 100644
--- a/www/assets/js/util.js
+++ b/www/assets/js/util.js
@@ -754,6 +754,8 @@ function setVisible(selector, bool) {
}
function handleModPermissions() {
+ $("#cs-chanranks-adm").attr("disabled", CLIENT.rank < 4);
+ $("#cs-chanranks-owner").attr("disabled", CLIENT.rank < 4);
/* update channel controls */
$("#opt_pagetitle").val(CHANNEL.opts.pagetitle);
$("#opt_pagetitle").attr("disabled", CLIENT.rank < 3);
@@ -1689,3 +1691,75 @@ function makeModal() {
});
return wrap;
}
+
+function formatCSModList() {
+ var tbl = $("#cs-chanranks table");
+ tbl.find("tbody").remove();
+ var entries = tbl.data("entries") || [];
+ entries.sort(function(a, b) {
+ if (a.rank === b.rank) {
+ var x = a.name.toLowerCase();
+ var y = b.name.toLowerCase();
+ return y == x ? 0 : (x < y ? -1 : 1);
+ }
+
+ return b.rank - a.rank;
+ });
+
+ entries.forEach(function (entry) {
+ var tr = $("
").addClass("cs-chanrank-tr-" + entry.name);
+ var name = $(" | ").text(entry.name).appendTo(tr);
+ name.addClass(getNameColor(entry.rank));
+ var rankwrap = $(" | ");
+ var rank = $("").text(entry.rank).appendTo(rankwrap);
+ var dd = $("").addClass("btn-group");
+ var toggle = $("")
+ .addClass("btn btn-xs btn-default dropdown-toggle")
+ .attr("data-toggle", "dropdown")
+ .html("Edit ")
+ .appendTo(dd);
+ if (CLIENT.rank <= entry.rank) {
+ toggle.addClass("disabled");
+ }
+
+ var menu = $("").addClass("dropdown-menu")
+ .attr("role", "menu")
+ .appendTo(dd);
+
+ var ranks = [
+ { name: "Remove Moderator", rank: 1 },
+ { name: "Moderator", rank: 2 },
+ { name: "Channel Admin", rank: 3 },
+ { name: "Channel Owner", rank: 4 }
+ ];
+
+ ranks.forEach(function (r) {
+ var li = $("").appendTo(menu);
+ var a = $("")
+ .addClass(getNameColor(r.rank))
+ .attr("href", "javascript:void(0)")
+ .text(r.name)
+ .appendTo(li);
+ if (r.rank !== entry.rank) {
+ a.click(function () {
+ socket.emit("setChannelRank", {
+ user: entry.name,
+ rank: r.rank
+ });
+ });
+ } else {
+ $("").addClass("glyphicon glyphicon-ok pull-right")
+ .appendTo(a);
+ li.addClass("disabled");
+ }
+
+ if (r.rank > CLIENT.rank || (CLIENT.rank < 4 && r.rank === CLIENT.rank)) {
+ li.addClass("disabled");
+ }
+ });
+
+ dd.css("margin-right", "10px").prependTo(rankwrap);
+ rankwrap.appendTo(tr);
+ tr.appendTo(tbl);
+ });
+}
diff --git a/www/css/cytube.css b/www/css/cytube.css
index 4f6c3dcb..57f2477c 100644
--- a/www/css/cytube.css
+++ b/www/css/cytube.css
@@ -337,21 +337,21 @@
}
.userlist_siteadmin {
- color: #cc0000;
- font-weight: bold;
+ color: #cc0000!important;
+ font-weight: bold!important;
}
.userlist_owner {
- color: #0000cc;
- font-weight: bold;
+ color: #0000cc!important;
+ font-weight: bold!important;
}
.userlist_op {
- color: #00aa00;
+ color: #00aa00!important;
}
.userlist_guest {
- color: #888888;
+ color: #888888!important;
}
.action {