class Para::Markup::ResourcesTable

Attributes

actions[R]
component[R]
model[R]
orderable[R]

Public Class Methods

new(component, view) click to toggle source
Calls superclass method Para::Markup::Component::new
# File lib/para/markup/resources_table.rb, line 9
def initialize(component, view)
  @component = component
  super(view)
end

Public Instance Methods

actions_cell(resource) click to toggle source
# File lib/para/markup/resources_table.rb, line 137
def actions_cell(resource)
  buttons = ResourcesButtons.new(component, view)

  content_tag(:td, class: 'table-row-actions') do
    actions.map do |type|
      buttons.send(:"#{ type }_button", resource)
    end.compact.join.html_safe
  end
end
container(options = {}, &block) click to toggle source
# File lib/para/markup/resources_table.rb, line 14
def container(options = {}, &block)
  @model = options.delete(:model)

  if !options.key?(:orderable) || options.delete(:orderable)
    @orderable = model.orderable? && view.can?(:order, model)
  end

  @actions = build_actions(options.delete(:actions))

  merge_class!(options, 'table')
  merge_class!(options, 'para-component-relation-table')
  merge_class!(options, 'table-hover') if options.fetch(:hover, true)

  if orderable
    merge_class!(options, 'orderable')
    options[:data] ||= {}
    options[:data][:'order-url'] = component.relation_path(model.model_name.route_key, action: :order)
  end

  table = content_tag(:table, options) do
    capture { block.call(self) }
  end

  if options.fetch(:responsive, true)
    content_tag(:div, table, class: 'table-responsive')
  else
    table
  end
end
data_for(*args, &block) click to toggle source

Data for can accept 2 versions of arguments :

- resource, field_name, type : cell value will be retrieved from
    the field_value_for helper

- a single value : The value to display in the cell directly
    which will be processed to be shorter than 100 chars
# File lib/para/markup/resources_table.rb, line 113
def data_for(*args, &block)
  value = if args.length >= 2
    resource, field_name, type = args
    view.field_value_for(resource, field_name, type).to_s
  elsif block
    capture { block.call }
  else
    view.excerpt_value_for(args.first)
  end

  content_tag(:td) do
    value
  end
end
header(&block) click to toggle source
# File lib/para/markup/resources_table.rb, line 44
def header(&block)
  cells = []
  # Add orderable empty header
  cells << content_tag(:th, '') if orderable
  # Append cells
  cells << capture { block.call }
  # Append actions empty cell
  cells << content_tag(:th, '', class: 'table-row-actions') if actions

  # Output full header
  content_tag(:thead) do
    content_tag(:tr, cells.join("\n").html_safe)
  end
end
header_for(field_name = nil, options = {}, &block) click to toggle source
# File lib/para/markup/resources_table.rb, line 80
def header_for(field_name = nil, options = {}, &block)
  if Hash === field_name
    options = field_name
    field_name = nil
  end

  label = if Symbol === field_name
    model.human_attribute_name(field_name)
  elsif block
    capture { block.call }
  else
    field_name
  end

  content_tag(:th, options) do
    if search && (sort = options.delete(:sort))
      view.sort_link(search, *sort, label, hide_indicator: true)
    elsif search && searchable?(field_name)
      view.sort_link(search, field_name, label, hide_indicator: true)
    else
      label
    end
  end
end
order_cell(resource) click to toggle source
# File lib/para/markup/resources_table.rb, line 128
def order_cell(resource)
  order_cell = content_tag(:td) do
    view.reorder_anchor(
      value: resource.position,
      data: { id: resource.id }
    )
  end
end
row(resource, &block) click to toggle source
# File lib/para/markup/resources_table.rb, line 68
def row(resource, &block)
  cells = []
  # Add orderable cell with "move" thumb
  cells << order_cell(resource) if orderable
  # Add data cells
  cells << capture { block.call(resource) }
  # Add actions links to the last cell
  cells << actions_cell(resource) if actions

  cells.join("\n").html_safe
end
rows(resources, &block) click to toggle source
# File lib/para/markup/resources_table.rb, line 59
def rows(resources, &block)
  rows = resources.each_with_object(ActiveSupport::SafeBuffer.new('')) do |resource, buffer|
    buffer << content_tag(:tr, row(resource, &block))
  end

  # Output full header
  content_tag(:tbody, rows)
end

Private Instance Methods

build_actions(actions) click to toggle source
# File lib/para/markup/resources_table.rb, line 157
def build_actions(actions)
  if actions.in?([true, nil])
    default_actions
  else
    actions
  end
end
searchable?(field_name) click to toggle source
# File lib/para/markup/resources_table.rb, line 153
def searchable?(field_name)
  model.columns_hash.keys.include?(field_name.to_s)
end