17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
# File 'lib/active_admin/state_machine/dsl.rb', line 17
def state_action(action, options={}, &controller_action)
singular = config.resource_name.singular
plural = config.resource_name.plural
options[:permission] ||= controller.new.send(:action_to_permission, action)
confirmation = options.fetch(:confirm, false)
if confirmation == true
default = "Are you sure you want to #{action.to_s.humanize.downcase}?"
confirmation = ->{ I18n.t(:confirm, scope: "#{plural}.#{action}", default: default) }
end
http_verb = options.fetch :http_verb, :put
action_item_args = if ActiveAdmin::VERSION.start_with?('0.')
[{ only: :show }]
else
["state_action_#{action}", { only: :show }]
end
action_item(*action_item_args) do
if resource.send("can_#{action}?") && authorized?(options[:permission], resource)
attr = options[:attr] || resource.class.state_machines.keys.first || "state"
path = resource_path << "/#{action}?#{{attr: attr}.to_query}"
label = I18n.t("#{plural}.#{action}.label", default: action.to_s.titleize)
link_options = {}
if confirmation.is_a?(Proc)
link_options[:data] ||= {}
link_options[:data][:confirm] = instance_exec(&confirmation)
end
link_options[:class] = "btn btn-large"
link_options[:method] = http_verb
link_to label, path, link_options
end
end
unless block_given?
controller_action = -> do
events = resource.class.state_machines[params[:attr].to_sym].events
if resource.send(action)
flash[:notice] = t("#{plural}.#{action}.flash.success", default: t("active_admin-state_machine.flash.success", action: events[action].human_name, resource: resource.model_name.human))
else
flash[:error] = resource.errors.full_messages.join(", ")
end
redirect_back(fallback_location: smart_resource_url)
end
end
member_action action, method: http_verb, &controller_action
end
|