discourse/lib/reviewable/actions.rb
Gary Pendergast 7514dc810a
DEV: Unify reviewable action definition. (#34166)
This is a step towards unifying how reviewable types are defined.

In this change, we add a new `ReviewableActionBuilder` concern, which can be included by the various reviewable types to give them a standard helper for adding actions that can be performed on the reviewable.

The first feature for this concern takes the `build_action()` helper that some reviewables used, and makes it available to all reviewables. This is done in a backward compatible fashion, so it will work even whilst we transition to the new reviewable UI.
2025-08-11 15:05:37 +10:00

76 lines
2 KiB
Ruby

# frozen_string_literal: true
require "reviewable/collection"
class Reviewable < ActiveRecord::Base
class Actions < Reviewable::Collection
attr_reader :bundles, :reviewable
def initialize(reviewable, guardian, args = nil)
super(reviewable, guardian, args)
@bundles = []
end
# Add common actions here to make them easier for reviewables to re-use. If it's a
# one off, add it manually.
def self.common_actions
{
approve: Action.new(:approve, "thumbs-up", "reviewables.actions.approve.title"),
reject: Action.new(:reject, "thumbs-down", "reviewables.actions.reject.title"),
delete: Action.new(:delete, "trash-can", "reviewables.actions.delete.title"),
}
end
class Bundle < Item
attr_accessor :icon, :label, :actions
def initialize(id, icon: nil, label: nil)
super(id)
@icon = icon
@label = label
@actions = []
end
def empty?
@actions.empty?
end
end
class Action < Item
attr_accessor :icon,
:button_class,
:label,
:description,
:confirm_message,
:client_action,
:require_reject_reason,
:custom_modal,
:completed_message
def initialize(id, icon = nil, button_class = nil, label = nil)
super(id)
@icon, @button_class, @label = icon, button_class, label
end
def server_action
id.split("-").last
end
end
def add_bundle(id, icon: nil, label: nil)
bundle = Bundle.new(id, icon: icon, label: label)
@bundles << bundle
bundle
end
def add(id, bundle: nil)
id = [reviewable.target_type&.underscore, id].compact_blank.join("-")
action = Actions.common_actions[id] || Action.new(id)
yield action if block_given?
@content << action
bundle ||= add_bundle(id)
bundle.actions << action
end
end
end