diff --git a/install/package.json b/install/package.json index 72681d6be3..aa1d61f8b5 100644 --- a/install/package.json +++ b/install/package.json @@ -100,7 +100,7 @@ "nodebb-plugin-ntfy": "1.0.15", "nodebb-plugin-spam-be-gone": "2.0.6", "nodebb-rewards-essentials": "0.2.2", - "nodebb-theme-harmony": "1.0.0-beta.80", + "nodebb-theme-harmony": "1.0.0-beta.81", "nodebb-theme-lavender": "7.0.9", "nodebb-theme-peace": "2.0.19", "nodebb-theme-persona": "13.0.51", diff --git a/public/language/en-GB/post-queue.json b/public/language/en-GB/post-queue.json index b04a2722d5..c750bfae93 100644 --- a/public/language/en-GB/post-queue.json +++ b/public/language/en-GB/post-queue.json @@ -6,6 +6,7 @@ "enabling-help": "To enable this feature, go to Settings → Post → Post Queue and enable Post Queue.", "back-to-list": "Back to Post Queue", "user": "User", + "when": "When", "category": "Category", "title": "Title", "content": "Content", diff --git a/public/src/client/post-queue.js b/public/src/client/post-queue.js index b1aa3f65f5..9378faa662 100644 --- a/public/src/client/post-queue.js +++ b/public/src/client/post-queue.js @@ -3,7 +3,11 @@ define('forum/post-queue', [ 'categoryFilter', 'categorySelector', 'api', 'alerts', 'bootbox', -], function (categoryFilter, categorySelector, api, alerts, bootbox) { + 'accounts/moderate', 'accounts/delete', +], function ( + categoryFilter, categorySelector, api, alerts, bootbox, + AccountModerate, AccountsDelete +) { const PostQueue = {}; PostQueue.init = function () { @@ -13,61 +17,8 @@ define('forum/post-queue', [ privilege: 'moderate', }); + handleActions(); handleBulkActions(); - - $('.posts-list').on('click', '[data-action]', async function () { - function getMessage() { - return new Promise((resolve) => { - const modal = bootbox.dialog({ - title: '[[post-queue:notify-user]]', - message: '', - buttons: { - OK: { - label: '[[modules:bootbox.send]]', - callback: function () { - const val = modal.find('textarea').val(); - if (val) { - resolve(val); - } - }, - }, - }, - }); - }); - } - - const parent = $(this).parents('[data-id]'); - const action = $(this).attr('data-action'); - const id = parent.attr('data-id'); - const listContainer = parent.get(0).parentNode; - - if ((!['accept', 'reject', 'notify'].includes(action)) || - (action === 'reject' && !await confirmReject(ajaxify.data.canAccept ? '[[post-queue:confirm-reject]]' : '[[post-queue:confirm-remove]]'))) { - return; - } - - socket.emit('posts.' + action, { - id: id, - message: action === 'notify' ? await getMessage() : undefined, - }, function (err) { - if (err) { - return alerts.error(err); - } - if (action === 'accept' || action === 'reject') { - parent.remove(); - } - - if (listContainer.childElementCount === 0) { - if (ajaxify.data.singlePost) { - ajaxify.go('/post-queue' + window.location.search); - } else { - ajaxify.refresh(); - } - } - }); - return false; - }); - handleContentEdit('.post-content', '.post-content-editable', 'textarea'); handleContentEdit('.topic-title', '.topic-title-editable', 'input'); @@ -152,6 +103,106 @@ define('forum/post-queue', [ }); } + function handleActions() { + const listEl = document.querySelector('.posts-list'); + if (listEl) { + listEl.addEventListener('click', (e) => { + const subselector = e.target.closest('[data-action]'); + if (subselector) { + const action = subselector.getAttribute('data-action'); + const uid = subselector.closest('[data-uid]').getAttribute('data-uid'); + + switch (action) { + case 'ban': + AccountModerate.banAccount(uid, ajaxify.refresh); + break; + + case 'unban': + AccountModerate.unbanAccount(uid); + break; + + case 'mute': + AccountModerate.muteAccount(uid, ajaxify.refresh); + break; + + case 'unmute': + AccountModerate.unmuteAccount(uid); + break; + + case 'delete-account': + AccountsDelete.account(uid, ajaxify.refresh); + break; + + case 'delete-content': + AccountsDelete.content(uid, ajaxify.refresh); + break; + + case 'delete-all': + AccountsDelete.purge(uid, ajaxify.refresh); + break; + + default: + handleQueueActions.call(e.target); + break; + } + } + }); + } + } + + async function handleQueueActions() { + function getMessage() { + return new Promise((resolve) => { + const modal = bootbox.dialog({ + title: '[[post-queue:notify-user]]', + message: '', + buttons: { + OK: { + label: '[[modules:bootbox.send]]', + callback: function () { + const val = modal.find('textarea').val(); + if (val) { + resolve(val); + } + }, + }, + }, + }); + }); + } + + const parent = $(this).parents('[data-id]'); + const action = $(this).attr('data-action'); + const id = parent.attr('data-id'); + const listContainer = parent.get(0).parentNode; + + if ((!['accept', 'reject', 'notify'].includes(action)) || + (action === 'reject' && !await confirmReject(ajaxify.data.canAccept ? '[[post-queue:confirm-reject]]' : '[[post-queue:confirm-remove]]'))) { + return; + } + + socket.emit('posts.' + action, { + id: id, + message: action === 'notify' ? await getMessage() : undefined, + }, function (err) { + if (err) { + return alerts.error(err); + } + if (action === 'accept' || action === 'reject') { + parent.remove(); + } + + if (listContainer.childElementCount === 0) { + if (ajaxify.data.singlePost) { + ajaxify.go('/post-queue' + window.location.search); + } else { + ajaxify.refresh(); + } + } + }); + return false; + } + function handleBulkActions() { $('[component="post-queue/bulk-actions"]').on('click', '[data-action]', async function () { const bulkAction = $(this).attr('data-action'); diff --git a/src/controllers/mods.js b/src/controllers/mods.js index 7db3151e42..560162f901 100644 --- a/src/controllers/mods.js +++ b/src/controllers/mods.js @@ -203,12 +203,14 @@ modsController.postQueue = async function (req, res, next) { const postsPerPage = 20; let postData = await posts.getQueuedPosts({ id: id }); - const [isAdmin, isGlobalMod, moderatedCids, categoriesData] = await Promise.all([ + let [isAdmin, isGlobalMod, moderatedCids, categoriesData, _privileges] = await Promise.all([ user.isAdministrator(req.uid), user.isGlobalModerator(req.uid), user.getModeratedCids(req.uid), helpers.getSelectedCategory(cid), + Promise.all(['global', 'admin'].map(async type => privileges[type].get(req.uid))), ]); + _privileges = { ..._privileges[0], ..._privileges[1] }; postData = postData .filter(p => p && @@ -245,5 +247,6 @@ modsController.postQueue = async function (req, res, next) { breadcrumbs: helpers.buildBreadcrumbs(crumbs), enabled: meta.config.postQueue, singlePost: !!id, + privileges: _privileges, }); };