From 60abe99add3288a8612044f8614ce81c2c4b419a Mon Sep 17 00:00:00 2001 From: Sam Date: Fri, 18 Nov 2022 10:41:59 +1100 Subject: [PATCH] FIX: allow tl4 to bulk select (#19094) * FIX: allow tl4 to bulk select - Also allows tl4 to perform batch tagging --- Long term this needs to be rewritten to account for "bulk action" permission given from the server. Co-authored-by: Martin Brennan --- .../discourse/app/components/topic-list.js | 2 +- .../app/controllers/topic-bulk-actions.js | 6 +- .../app/mixins/bulk-topic-selection.js | 6 +- .../acceptance/topic-bulk-actions-test.js | 100 ++++++++++++++++++ 4 files changed, 109 insertions(+), 5 deletions(-) diff --git a/app/assets/javascripts/discourse/app/components/topic-list.js b/app/assets/javascripts/discourse/app/components/topic-list.js index 19fb1a283d8..6a1d1bd5198 100644 --- a/app/assets/javascripts/discourse/app/components/topic-list.js +++ b/app/assets/javascripts/discourse/app/components/topic-list.js @@ -12,7 +12,7 @@ export default Component.extend(LoadMore, { classNameBindings: ["bulkSelectEnabled:sticky-header"], showTopicPostBadges: true, listTitle: "topic.title", - canDoBulkActions: and("currentUser.staff", "selected.length"), + canDoBulkActions: and("currentUser.canManageTopic", "selected.length"), // Overwrite this to perform client side filtering of topics, if desired filteredTopics: alias("topics"), diff --git a/app/assets/javascripts/discourse/app/controllers/topic-bulk-actions.js b/app/assets/javascripts/discourse/app/controllers/topic-bulk-actions.js index 205cc147a44..cd5d2cef032 100644 --- a/app/assets/javascripts/discourse/app/controllers/topic-bulk-actions.js +++ b/app/assets/javascripts/discourse/app/controllers/topic-bulk-actions.js @@ -89,7 +89,7 @@ addBulkButton("showTagTopics", "change_tags", { class: "btn-default", enabledSetting: "tagging_enabled", buttonVisible() { - return this.currentUser.staff; + return this.currentUser.canManageTopic; }, }); addBulkButton("showAppendTagTopics", "append_tags", { @@ -97,7 +97,7 @@ addBulkButton("showAppendTagTopics", "append_tags", { class: "btn-default", enabledSetting: "tagging_enabled", buttonVisible() { - return this.currentUser.staff; + return this.currentUser.canManageTopic; }, }); addBulkButton("removeTags", "remove_tags", { @@ -105,7 +105,7 @@ addBulkButton("removeTags", "remove_tags", { class: "btn-default", enabledSetting: "tagging_enabled", buttonVisible() { - return this.currentUser.staff; + return this.currentUser.canManageTopic; }, }); addBulkButton("deleteTopics", "delete", { diff --git a/app/assets/javascripts/discourse/app/mixins/bulk-topic-selection.js b/app/assets/javascripts/discourse/app/mixins/bulk-topic-selection.js index 4703993b33d..fe1980ed824 100644 --- a/app/assets/javascripts/discourse/app/mixins/bulk-topic-selection.js +++ b/app/assets/javascripts/discourse/app/mixins/bulk-topic-selection.js @@ -13,7 +13,11 @@ export default Mixin.create({ selected: null, lastChecked: null, - canBulkSelect: or("currentUser.staff", "showDismissRead", "showResetNew"), + canBulkSelect: or( + "currentUser.canManageTopic", + "showDismissRead", + "showResetNew" + ), @on("init") resetSelected() { diff --git a/app/assets/javascripts/discourse/tests/acceptance/topic-bulk-actions-test.js b/app/assets/javascripts/discourse/tests/acceptance/topic-bulk-actions-test.js index e929567609d..9ff9d542dbc 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/topic-bulk-actions-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/topic-bulk-actions-test.js @@ -1,6 +1,7 @@ import { acceptance, count, + exists, invisible, query, queryAll, @@ -156,4 +157,103 @@ acceptance("Topic - Bulk Actions", function (needs) { "Bottom-up Shift click range selection works" ); }); + + test("bulk select is not available for users who are not staff or TL4", async function (assert) { + updateCurrentUser({ moderator: false, admin: false, trust_level: 1 }); + await visit("/latest"); + assert.notOk( + exists(".button.bulk-select"), + "non-staff and < TL4 users cannot bulk select" + ); + }); + + test("TL4 users can bulk select", async function (assert) { + updateCurrentUser({ moderator: false, admin: false, trust_level: 4 }); + await visit("/latest"); + await click("button.bulk-select"); + + await click(queryAll("input.bulk-select")[0]); + await click(queryAll("input.bulk-select")[1]); + + await click(".bulk-select-actions"); + assert.ok( + query("#discourse-modal-title").innerHTML.includes( + I18n.t("topics.bulk.actions") + ), + "it opens bulk-select modal" + ); + + assert.ok( + query(".bulk-buttons").innerHTML.includes( + I18n.t("topics.bulk.change_category") + ), + "it shows an option to change category" + ); + + assert.ok( + query(".bulk-buttons").innerHTML.includes( + I18n.t("topics.bulk.close_topics") + ), + "it shows an option to close topics" + ); + + assert.ok( + query(".bulk-buttons").innerHTML.includes( + I18n.t("topics.bulk.archive_topics") + ), + "it shows an option to archive topics" + ); + + assert.ok( + query(".bulk-buttons").innerHTML.includes( + I18n.t("topics.bulk.notification_level") + ), + "it shows an option to update notification level" + ); + + assert.notOk( + query(".bulk-buttons").innerHTML.includes(I18n.t("topics.bulk.defer")), + "it does not show an option to reset read" + ); + + assert.ok( + query(".bulk-buttons").innerHTML.includes( + I18n.t("topics.bulk.unlist_topics") + ), + "it shows an option to unlist topics" + ); + + assert.ok( + query(".bulk-buttons").innerHTML.includes( + I18n.t("topics.bulk.reset_bump_dates") + ), + "it shows an option to reset bump dates" + ); + + assert.ok( + query(".bulk-buttons").innerHTML.includes( + I18n.t("topics.bulk.change_tags") + ), + "it shows an option to replace tags" + ); + + assert.ok( + query(".bulk-buttons").innerHTML.includes( + I18n.t("topics.bulk.append_tags") + ), + "it shows an option to append tags" + ); + + assert.ok( + query(".bulk-buttons").innerHTML.includes( + I18n.t("topics.bulk.remove_tags") + ), + "it shows an option to remove all tags" + ); + + assert.notOk( + query(".bulk-buttons").innerHTML.includes(I18n.t("topics.bulk.delete")), + "it does not show an option to delete topics" + ); + }); });