From 7a508b201aa464de33bbd57cd027f63d57303cd5 Mon Sep 17 00:00:00 2001 From: Robin Ward <robin.ward@gmail.com> Date: Fri, 6 Mar 2015 15:54:00 -0500 Subject: [PATCH] Support for plugins to add bulk operations --- .../controllers/topic-bulk-actions.js.es6 | 30 +++++++++++++++++++ .../templates/modal/bulk_actions_buttons.hbs | 17 +++++------ .../templates/modal/bulk_change_category.hbs | 11 +++---- .../discourse/views/topic-bulk-actions.js.es6 | 4 +++ .../views/topic_bulk_actions_view.js | 12 -------- config/locales/client.en.yml | 1 + lib/topics_bulk_action.rb | 7 ++++- 7 files changed, 52 insertions(+), 30 deletions(-) create mode 100644 app/assets/javascripts/discourse/views/topic-bulk-actions.js.es6 delete mode 100644 app/assets/javascripts/discourse/views/topic_bulk_actions_view.js diff --git a/app/assets/javascripts/discourse/controllers/topic-bulk-actions.js.es6 b/app/assets/javascripts/discourse/controllers/topic-bulk-actions.js.es6 index 4c0ddcfde..3d5285017 100644 --- a/app/assets/javascripts/discourse/controllers/topic-bulk-actions.js.es6 +++ b/app/assets/javascripts/discourse/controllers/topic-bulk-actions.js.es6 @@ -1,11 +1,39 @@ import ModalFunctionality from 'discourse/mixins/modal-functionality'; +const _buttons = []; + +function addBulkButton(action, key) { + _buttons.push({ action: action, label: "topics.bulk." + key }); +} + +// Default buttons +addBulkButton('showChangeCategory', 'change_category'); +addBulkButton('deleteTopics', 'delete'); +addBulkButton('closeTopics', 'close_topics'); +addBulkButton('archiveTopics', 'archive_topics'); +addBulkButton('showNotificationLevel', 'notification_level'); +addBulkButton('resetRead', 'reset_read'); + // Modal for performing bulk actions on topics export default Ember.ArrayController.extend(ModalFunctionality, { needs: ['discovery/topics'], + buttonRows: null, onShow: function() { this.set('controllers.modal.modalClass', 'topic-bulk-actions-modal small'); + + const buttonRows = []; + let row = []; + _buttons.forEach(function(b) { + row.push(b); + if (row.length === 4) { + buttonRows.push(row); + row = []; + } + }); + if (row.length) { buttonRows.push(row); } + + this.set('buttonRows', buttonRows); }, perform: function(operation) { @@ -89,3 +117,5 @@ export default Ember.ArrayController.extend(ModalFunctionality, { } } }); + +export { addBulkButton }; diff --git a/app/assets/javascripts/discourse/templates/modal/bulk_actions_buttons.hbs b/app/assets/javascripts/discourse/templates/modal/bulk_actions_buttons.hbs index 40ace4bc3..6cd4580a5 100644 --- a/app/assets/javascripts/discourse/templates/modal/bulk_actions_buttons.hbs +++ b/app/assets/javascripts/discourse/templates/modal/bulk_actions_buttons.hbs @@ -1,10 +1,7 @@ -<p> - <button class='btn' {{action "showChangeCategory"}}>{{i18n 'topics.bulk.change_category'}}</button> - <button class='btn' {{action "deleteTopics"}}>{{i18n 'topics.bulk.delete'}}</button> - <button class='btn' {{action "closeTopics"}}>{{i18n 'topics.bulk.close_topics'}}</button> - <button class='btn' {{action "archiveTopics"}}>{{i18n 'topics.bulk.archive_topics'}}</button> -</p> -<p> - <button class='btn' {{action "showNotificationLevel"}}>{{i18n 'topics.bulk.notification_level'}}</button> - <button class='btn' {{action "resetRead"}}>{{i18n 'topics.bulk.reset_read'}}</button> -</p> +{{#each row in buttonRows}} + <p> + {{#each button in row}} + {{d-button action=button.action label=button.label}} + {{/each}} + </p> +{{/each}} diff --git a/app/assets/javascripts/discourse/templates/modal/bulk_change_category.hbs b/app/assets/javascripts/discourse/templates/modal/bulk_change_category.hbs index e67173ff7..6239773fd 100644 --- a/app/assets/javascripts/discourse/templates/modal/bulk_change_category.hbs +++ b/app/assets/javascripts/discourse/templates/modal/bulk_change_category.hbs @@ -1,10 +1,7 @@ -<p>Choose the new category for the topics:</p> +<p>{{i18n "topics.bulk.choose_new_category"}}</p> <p>{{category-chooser value=newCategoryId}}</p> -{{#if loading}} - <div class='loading'>{{i18n 'loading'}}</div> -{{else}} - <button class='btn' {{action "changeCategory"}}>Change Category</button> -{{/if}} - +{{#loading-spinner condition=loading}} + {{d-button action="changeCategory" label="topics.bulk.change_category"}} +{{/loading-spinner}} diff --git a/app/assets/javascripts/discourse/views/topic-bulk-actions.js.es6 b/app/assets/javascripts/discourse/views/topic-bulk-actions.js.es6 new file mode 100644 index 000000000..dd6490a71 --- /dev/null +++ b/app/assets/javascripts/discourse/views/topic-bulk-actions.js.es6 @@ -0,0 +1,4 @@ +export default Discourse.ModalBodyView.extend({ + templateName: 'modal/topic-bulk-actions', + title: I18n.t('topics.bulk.actions') +}); diff --git a/app/assets/javascripts/discourse/views/topic_bulk_actions_view.js b/app/assets/javascripts/discourse/views/topic_bulk_actions_view.js deleted file mode 100644 index a72348415..000000000 --- a/app/assets/javascripts/discourse/views/topic_bulk_actions_view.js +++ /dev/null @@ -1,12 +0,0 @@ -/** - Handles the view for the topic bulk actions modal - - @class TopicBulkActionsView - @extends Discourse.ModalBodyView - @namespace Discourse - @module Discourse -**/ -Discourse.TopicBulkActionsView = Discourse.ModalBodyView.extend({ - templateName: 'modal/topic_bulk_actions', - title: I18n.t('topics.bulk.actions') -}); diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 04b0dd324..79e67bb94 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -814,6 +814,7 @@ en: close_topics: "Close Topics" archive_topics: "Archive Topics" notification_level: "Change Notification Level" + choose_new_category: "Choose the new category for the topics:" selected: one: "You have selected <b>1</b> topic." other: "You have selected <b>{{count}}</b> topics." diff --git a/lib/topics_bulk_action.rb b/lib/topics_bulk_action.rb index 71defb0e3..337c32eac 100644 --- a/lib/topics_bulk_action.rb +++ b/lib/topics_bulk_action.rb @@ -8,7 +8,12 @@ class TopicsBulkAction end def self.operations - %w(change_category close archive change_notification_level reset_read dismiss_posts delete) + @operations ||= %w(change_category close archive change_notification_level reset_read dismiss_posts delete) + end + + def self.register_operation(name, &block) + operations << name + define_method(name, &block) end def perform!