fix: determine indeterminate checkboxes

isekai-main
gasoved 4 years ago committed by Julian Lam
parent 1272da6539
commit 760ea9df1e

@ -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 () {

Loading…
Cancel
Save