module ActiveAdmin
module Views
# = Index as a Table
#
# By default, the index page is a table with each of the models content columns and links to
# show, edit and delete the object. There are many ways to customize what gets
# displayed.
#
# == Defining Columns
#
# To display an attribute or a method on a resource, simply pass a symbol into the
# column method:
#
# index do
# selectable_column
# column :title
# end
#
# If the default title does not work for you, pass it as the first argument:
#
# index do
# selectable_column
# column "My Custom Title", :title
# end
#
# Sometimes calling methods just isn't enough and you need to write some view
# specific code. For example, say we wanted a colum called Title which holds a
# link to the posts admin screen.
#
# The column method accepts a block as an argument which will then be rendered
# within the context of the view for each of the objects in the collection.
#
# index do
# selectable_column
# column "Title" do |post|
# link_to post.title, admin_post_path(post)
# end
# end
#
# The block gets called once for each resource in the collection. The resource gets passed into
# the block as an argument.
#
# To setup links to View, Edit and Delete a resource, use the default_actions method:
#
# index do
# selectable_column
# column :title
# default_actions
# end
#
# Alternatively, you can create a column with custom links:
#
# index do
# selectable_column
# column :title
# column "Actions" do |post|
# link_to "View", admin_post_path(post)
# end
# end
#
#
# == Sorting
#
# When a column is generated from an Active Record attribute, the table is
# sortable by default. If you are creating a custom column, you may need to give
# Active Admin a hint for how to sort the table.
#
# If a column is defined using a block, you must pass the key to turn on sorting. The key
# is the attribute which gets used to sort objects using Active Record.
#
# By default, this is the column on the resource's table that the attribute corresponds to.
# Otherwise, any attribute that the resource collection responds to can be used.
#
# index do
# column "Title", :sortable => :title do |post|
# link_to post.title, admin_post_path(post)
# end
# end
#
# You can also sort using an attribute on another table by passing the table name
# and the attribute separated by a dot:
#
# index do
# column :title, :sortable => 'categories.name'
# end
#
# You can turn off sorting on any column by passing false:
#
# index do
# column :title, :sortable => false
# end
#
# == Showing and Hiding Columns
#
# The entire index block is rendered within the context of the view, so you can
# easily do things that show or hide columns based on the current context.
#
# For example, if you were using CanCan:
#
# index do
# column :title, :sortable => false
# if can? :manage, Post
# column :some_secret_data
# end
# end
#
class IndexAsTable < ActiveAdmin::Component
def build(page_presenter, collection)
table_options = {
:id => "index_table_#{active_admin_config.resource_name.plural}",
:sortable => true,
:class => "index_table index",
:i18n => active_admin_config.resource_class,
:paginator => page_presenter[:paginator] != false
}
table_for collection, table_options do |t|
table_config_block = page_presenter.block || default_table
instance_exec(t, &table_config_block)
end
end
def table_for(*args, &block)
insert_tag IndexTableFor, *args, &block
end
def default_table
proc do
id_column
resource_class.content_columns.each do |col|
column col.name.to_sym
end
default_actions
end
end
def self.index_name
"table"
end
#
# Extend the default ActiveAdmin::Views::TableFor with some
# methods for quickly displaying items on the index page
#
class IndexTableFor < ::ActiveAdmin::Views::TableFor
# Display a column for checkbox
def selectable_column
return unless active_admin_config.batch_actions.any?
column( resource_selection_toggle_cell, { :class => "selectable" } ) { |resource| resource_selection_cell( resource ) }
end
# Display a column for the id
def id_column
column(resource_class.human_attribute_name(resource_class.primary_key), :sortable => resource_class.primary_key) do |resource|
link_to resource.id, resource_path(resource), :class => "resource_id_link"
end
end
# Add links to perform actions.
#
# # Add default links.
# actions
#
# # Append some actions onto the end of the default actions.
# actions do |admin_user|
# link_to 'Grant Admin', grant_admin_admin_user_path(admin_user)
# end
#
# # Custom actions without the defaults.
# actions :defaults => false do |admin_user|
# link_to 'Grant Admin', grant_admin_admin_user_path(admin_user)
# end
def actions(options = {}, &block)
options = {
:name => "",
:defaults => true
}.merge(options)
column options[:name] do |resource|
text_node default_actions(resource) if options[:defaults]
text_node instance_exec(resource, &block) if block_given?
end
end
def default_actions(*args)
links = proc do |resource|
links = ''.html_safe
if controller.action_methods.include?('show') && authorized?(ActiveAdmin::Auth::READ, resource)
links << link_to(I18n.t('active_admin.view'), resource_path(resource), :class => "member_link view_link")
end
if controller.action_methods.include?('edit') && authorized?(ActiveAdmin::Auth::UPDATE, resource)
links << link_to(I18n.t('active_admin.edit'), edit_resource_path(resource), :class => "member_link edit_link")
end
if controller.action_methods.include?('destroy') && authorized?(ActiveAdmin::Auth::DESTROY, resource)
links << link_to(I18n.t('active_admin.delete'), resource_path(resource), :method => :delete, :data => {:confirm => I18n.t('active_admin.delete_confirmation')}, :class => "member_link delete_link")
end
links
end
options = args.extract_options!
if options.present? || args.empty?
actions options
else
links.call(args.first)
end
end
# Display A Status Tag Column
#
# index do |i|
# i.status_tag :state
# end
#
# index do |i|
# i.status_tag "State", :status_name
# end
#
# index do |i|
# i.status_tag do |post|
# post.published? ? 'published' : 'draft'
# end
# end
#
def status_tag(*args, &block)
col = Column.new(*args, &block)
data = col.data
col.data = proc do |resource|
status_tag call_method_or_proc_on(resource, data)
end
add_column col
end
end # TableBuilder
end # Table
end
end