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!