DEV: Allow specifying button class in reviewable action definitions (#8093)

DEV: Allow specifying button class in reviewable action definitions (#8093)

This avoids the need for using @extend in SCSS, which can be problematic in plugins

For context, see FIX: make compatible with 'debundled plugin css assets' feature.

diff --git a/app/assets/javascripts/discourse/templates/components/reviewable-bundled-action.hbs b/app/assets/javascripts/discourse/templates/components/reviewable-bundled-action.hbs
index 1c9736a..21bd7ef 100644
--- a/app/assets/javascripts/discourse/templates/components/reviewable-bundled-action.hbs
+++ b/app/assets/javascripts/discourse/templates/components/reviewable-bundled-action.hbs
@@ -9,7 +9,7 @@
     disabled=reviewableUpdating}}
 {{else}}
   {{d-button
-    class=(concat "reviewable-action " (dasherize first.id))
+    class=(concat "reviewable-action " (dasherize first.id) " " first.button_class)
     icon=first.icon
     action=(action "perform" first)
     translatedLabel=first.label
diff --git a/app/assets/stylesheets/common/base/reviewables.scss b/app/assets/stylesheets/common/base/reviewables.scss
index 0228f0c..e47cb52 100644
--- a/app/assets/stylesheets/common/base/reviewables.scss
+++ b/app/assets/stylesheets/common/base/reviewables.scss
@@ -262,10 +262,6 @@
     .reviewable-action,
     .reviewable-action-dropdown {
       margin-right: 0.5em;
-
-      &.delete-user {
-        @extend .btn-danger;
-      }
     }
   }
   padding-bottom: 1em;
diff --git a/app/models/reviewable_flagged_post.rb b/app/models/reviewable_flagged_post.rb
index e523ded..43622b1 100644
--- a/app/models/reviewable_flagged_post.rb
+++ b/app/models/reviewable_flagged_post.rb
@@ -269,10 +269,11 @@ protected
     end
   end
 
-  def build_action(actions, id, icon:, bundle: nil, client_action: nil, confirm: false)
+  def build_action(actions, id, icon:, button_class: nil, bundle: nil, client_action: nil, confirm: false)
     actions.add(id, bundle: bundle) do |action|
       prefix = "reviewables.actions.#{id}"
       action.icon = icon
+      action.button_class = button_class
       action.label = "#{prefix}.title"
       action.description = "#{prefix}.description"
       action.client_action = client_action
diff --git a/app/models/reviewable_queued_post.rb b/app/models/reviewable_queued_post.rb
index 7fc6bc1..8602a0f 100644
--- a/app/models/reviewable_queued_post.rb
+++ b/app/models/reviewable_queued_post.rb
@@ -38,6 +38,7 @@ class ReviewableQueuedPost < Reviewable
     if pending? && guardian.can_delete_user?(created_by)
       actions.add(:delete_user) do |action|
         action.icon = 'trash-alt'
+        action.button_class = 'btn-danger'
         action.label = 'reviewables.actions.delete_user.title'
         action.confirm_message = 'reviewables.actions.delete_user.confirm'
       end
diff --git a/app/serializers/reviewable_action_serializer.rb b/app/serializers/reviewable_action_serializer.rb
index 6fd1f88..50c5310 100644
--- a/app/serializers/reviewable_action_serializer.rb
+++ b/app/serializers/reviewable_action_serializer.rb
@@ -1,7 +1,7 @@
 # frozen_string_literal: true
 
 class ReviewableActionSerializer < ApplicationSerializer
-  attributes :id, :icon, :label, :confirm_message, :description, :client_action
+  attributes :id, :icon, :button_class, :label, :confirm_message, :description, :client_action
 
   def label
     I18n.t(object.label)
diff --git a/lib/reviewable/actions.rb b/lib/reviewable/actions.rb
index 5d584b5..f433a8c 100644
--- a/lib/reviewable/actions.rb
+++ b/lib/reviewable/actions.rb
@@ -33,11 +33,11 @@ class Reviewable < ActiveRecord::Base
     end
 
     class Action < Item
-      attr_accessor :icon, :label, :description, :confirm_message, :client_action
+      attr_accessor :icon, :button_class, :label, :description, :confirm_message, :client_action
 
-      def initialize(id, icon = nil, label = nil)
+      def initialize(id, icon = nil, button_class = nil, label = nil)
         super(id)
-        @icon, @label = icon, label
+        @icon, @button_class, @label = icon, button_class, label
       end
     end
 
diff --git a/spec/models/reviewable_queued_post_spec.rb b/spec/models/reviewable_queued_post_spec.rb
index 016a348..70842e3 100644
--- a/spec/models/reviewable_queued_post_spec.rb
+++ b/spec/models/reviewable_queued_post_spec.rb
@@ -118,6 +118,12 @@ RSpec.describe ReviewableQueuedPost, type: :model do
       end
 
       context "delete_user" do
+        it "has the correct button class" do
+          expect(reviewable.actions_for(Guardian.new(moderator)).to_a.
+            find { |a| a.id == :delete_user }.button_class).
+            to eq("btn-danger")
+        end
+
         it "deletes the user and rejects the post" do
           other_reviewable = Fabricate(:reviewable_queued_post, created_by: reviewable.created_by)

GitHub sha: 479fdaae