lib/rails_admin/config/actions/base.rb
# frozen_string_literal: true
require 'rails_admin/config/proxyable'
require 'rails_admin/config/configurable'
require 'rails_admin/config/hideable'
module RailsAdmin
module Config
module Actions
class Base
include RailsAdmin::Config::Proxyable
include RailsAdmin::Config::Configurable
include RailsAdmin::Config::Hideable
register_instance_option :only do
nil
end
register_instance_option :except do
[]
end
register_instance_option :show_in_navigation do
root?
end
register_instance_option :show_in_sidebar do
!show_in_navigation
end
register_instance_option :show_in_menu do
true
end
register_instance_option :sidebar_label do
nil
end
# http://getbootstrap.com/2.3.2/base-css.html#icons
register_instance_option :link_icon do
'fas fa-question'
end
# Should the action be visible
register_instance_option :visible? do
authorized?
end
register_instance_option :enabled? do
bindings[:abstract_model].nil? || (
(only.nil? || [only].flatten.collect(&:to_s).include?(bindings[:abstract_model].to_s)) &&
![except].flatten.collect(&:to_s).include?(bindings[:abstract_model].to_s) &&
!bindings[:abstract_model].config.excluded?
) && (!respond_to?(:writable?) || writable?)
end
register_instance_option :authorized? do
enabled? && (
bindings[:controller].try(:authorization_adapter).nil? || bindings[:controller].authorization_adapter.authorized?(authorization_key, bindings[:abstract_model], bindings[:object])
)
end
# Is the action acting on the root level (Example: /admin/contact)
register_instance_option :root? do
false
end
# Is the action on a model scope (Example: /admin/team/export)
register_instance_option :collection? do
false
end
# Is the action on an object scope (Example: /admin/team/1/edit)
register_instance_option :member? do
false
end
# Target window [_self, _blank]
register_instance_option :link_target do
nil
end
# Determines whether to navigate via Turbo Drive or not
register_instance_option :turbo? do
true
end
# This block is evaluated in the context of the controller when action is called
# You can access:
# - @objects if you're on a model scope
# - @abstract_model & @model_config if you're on a model or object scope
# - @object if you're on an object scope
register_instance_option :controller do
proc do
render action: @action.template_name
end
end
# Model scoped actions only. You will need to handle params[:bulk_ids] in controller
register_instance_option :bulkable? do
false
end
# View partial name (called in default :controller block)
register_instance_option :template_name do
key.to_sym
end
# For CanCanCan and the like
register_instance_option :authorization_key do
key.to_sym
end
# List of methods allowed. Note that you are responsible for correctly handling them in :controller block
register_instance_option :http_methods do
[:get]
end
# Url fragment
register_instance_option :route_fragment do
custom_key.to_s
end
# Controller action name
register_instance_option :action_name do
custom_key.to_sym
end
# I18n key
register_instance_option :i18n_key do
key
end
# User should override only custom_key (action name and route fragment change, allows for duplicate actions)
register_instance_option :custom_key do
key
end
# Breadcrumb parent
register_instance_option :breadcrumb_parent do
if root?
[:dashboard]
elsif collection?
[:index, bindings[:abstract_model]]
elsif member?
[:show, bindings[:abstract_model], bindings[:object]]
end
end
# Off API.
def key
self.class.key
end
def self.key
name.to_s.demodulize.underscore.to_sym
end
end
end
end
end