mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-10-26 08:36:12 +01:00
fix: determine indeterminate checkboxes
This commit is contained in:
@@ -42,6 +42,7 @@ define('admin/manage/privileges', [
|
||||
$('.privilege-table-container').on('change', 'input[type="checkbox"]:not(.checkbox-helper)', function () {
|
||||
const checkboxEl = $(this);
|
||||
const wrapperEl = checkboxEl.parent();
|
||||
const columnNo = wrapperEl.index() + 1;
|
||||
const privilege = wrapperEl.attr('data-privilege');
|
||||
const state = checkboxEl.prop('checked');
|
||||
const rowEl = checkboxEl.parents('tr');
|
||||
@@ -49,6 +50,7 @@ define('admin/manage/privileges', [
|
||||
const isPrivate = parseInt(rowEl.attr('data-private') || 0, 10);
|
||||
const isGroup = rowEl.attr('data-group-name') !== undefined;
|
||||
const isBanned = (isGroup && rowEl.attr('data-group-name') === 'banned-users') || rowEl.attr('data-banned') !== undefined;
|
||||
const sourceGroupName = isBanned ? 'banned-users' : 'registered-users';
|
||||
const delta = checkboxEl.prop('checked') === (wrapperEl.attr('data-value') === 'true') ? null : state;
|
||||
|
||||
if (member) {
|
||||
@@ -56,7 +58,7 @@ define('admin/manage/privileges', [
|
||||
bootbox.confirm('[[admin/manage/privileges:alert.confirm-moderate]]', function (confirm) {
|
||||
if (confirm) {
|
||||
wrapperEl.attr('data-delta', delta);
|
||||
Privileges.exposeAssumedPrivileges(isBanned);
|
||||
Privileges.exposeSingleAssumedPriv(columnNo, sourceGroupName);
|
||||
} else {
|
||||
checkboxEl.prop('checked', !checkboxEl.prop('checked'));
|
||||
}
|
||||
@@ -65,14 +67,14 @@ define('admin/manage/privileges', [
|
||||
bootbox.confirm('[[admin/manage/privileges:alert.confirm-admins-mods]]', function (confirm) {
|
||||
if (confirm) {
|
||||
wrapperEl.attr('data-delta', delta);
|
||||
Privileges.exposeAssumedPrivileges();
|
||||
Privileges.exposeSingleAssumedPriv(columnNo, sourceGroupName);
|
||||
} else {
|
||||
checkboxEl.prop('checked', !checkboxEl.prop('checked'));
|
||||
}
|
||||
});
|
||||
} else {
|
||||
wrapperEl.attr('data-delta', delta);
|
||||
Privileges.exposeAssumedPrivileges(isBanned);
|
||||
Privileges.exposeSingleAssumedPriv(columnNo, sourceGroupName);
|
||||
}
|
||||
checkboxRowSelector.updateState(checkboxEl);
|
||||
} else {
|
||||
@@ -198,7 +200,7 @@ define('admin/manage/privileges', [
|
||||
}).catch(app.alertError);
|
||||
};
|
||||
|
||||
Privileges.exposeAssumedPrivileges = function (isBanned) {
|
||||
Privileges.exposeAssumedPrivileges = function () {
|
||||
/*
|
||||
If registered-users has a privilege enabled, then all users and groups of that privilege
|
||||
should be assumed to have that privilege as well, even if not set in the db, so reflect
|
||||
@@ -206,21 +208,30 @@ define('admin/manage/privileges', [
|
||||
*/
|
||||
|
||||
// As such, individual banned users inherits privileges from banned-users group
|
||||
// Running this block only when needed
|
||||
if (isBanned === undefined || isBanned === true) {
|
||||
const getBannedUsersInputSelector = (privs, i) => `.privilege-table tr[data-banned] td[data-privilege="${privs[i]}"] input`;
|
||||
const bannedUsersPrivs = getPrivilegesFromRow('banned-users');
|
||||
applyPrivileges(bannedUsersPrivs, getBannedUsersInputSelector);
|
||||
if (isBanned === true) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
const getBannedUsersInputSelector = (privs, i) => `.privilege-table tr[data-banned] td[data-privilege="${privs[i]}"] input`;
|
||||
const bannedUsersPrivs = getPrivilegesFromRow('banned-users');
|
||||
applyPrivileges(bannedUsersPrivs, getBannedUsersInputSelector);
|
||||
|
||||
// For rest that inherits from registered-users
|
||||
const getRegisteredUsersInputSelector = (privs, i) => `.privilege-table tr[data-group-name]:not([data-group-name="registered-users"],[data-group-name="banned-users"],[data-group-name="guests"],[data-group-name="spiders"]) td[data-privilege="${privs[i]}"] input, .privilege-table tr[data-uid]:not([data-banned]) td[data-privilege="${privs[i]}"] input`;
|
||||
const registeredUsersPrivs = getPrivilegesFromRow('registered-users');
|
||||
applyPrivileges(registeredUsersPrivs, getRegisteredUsersInputSelector);
|
||||
};
|
||||
|
||||
Privileges.exposeSingleAssumedPriv = function (columnNo, sourceGroupName) {
|
||||
let inputSelectorFn;
|
||||
switch (sourceGroupName) {
|
||||
case 'banned-users':
|
||||
inputSelectorFn = () => `.privilege-table tr[data-banned] td[data-privilege]:nth-child(${columnNo}) input`;
|
||||
break;
|
||||
default:
|
||||
inputSelectorFn = () => `.privilege-table tr[data-group-name]:not([data-group-name="registered-users"],[data-group-name="banned-users"],[data-group-name="guests"],[data-group-name="spiders"]) td[data-privilege]:nth-child(${columnNo}) input, .privilege-table tr[data-uid]:not([data-banned]) td[data-privilege]:nth-child(${columnNo}) input`;
|
||||
}
|
||||
|
||||
const sourceChecked = getPrivilegeFromColumn(sourceGroupName, columnNo);
|
||||
applyPrivilegesToColumn(inputSelectorFn, sourceChecked);
|
||||
};
|
||||
|
||||
Privileges.setPrivilege = (member, privilege, state) => api[state ? 'put' : 'delete'](`/categories/${isNaN(cid) ? 0 : cid}/privileges/${privilege}`, { member });
|
||||
|
||||
Privileges.addUserToPrivilegeTable = function () {
|
||||
@@ -334,6 +345,10 @@ define('admin/manage/privileges', [
|
||||
})).filter(Boolean);
|
||||
}
|
||||
|
||||
function getPrivilegeFromColumn(sourceGroupName, columnNo) {
|
||||
return $(`.privilege-table tr[data-group-name="${sourceGroupName}"] td:nth-child(${columnNo}) input[type="checkbox"]`)[0].checked;
|
||||
}
|
||||
|
||||
function applyPrivileges(privs, inputSelectorFn) {
|
||||
for (let x = 0, numPrivs = privs.length; x < numPrivs; x += 1) {
|
||||
const inputs = $(inputSelectorFn(privs, x));
|
||||
@@ -345,6 +360,13 @@ define('admin/manage/privileges', [
|
||||
}
|
||||
}
|
||||
|
||||
function applyPrivilegesToColumn(inputSelectorFn, sourceChecked) {
|
||||
const $inputs = $(inputSelectorFn());
|
||||
$inputs.each((idx, el) => {
|
||||
el.indeterminate = el.checked ? false : sourceChecked;
|
||||
});
|
||||
}
|
||||
|
||||
function hightlightRowByDataAttr(attrName, attrValue) {
|
||||
if (attrValue) {
|
||||
const el = $('[' + attrName + ']').filter(function () {
|
||||
|
||||
Reference in New Issue
Block a user