class ActiveList::Definition::Table

Attributes

columns[R]
id[R]
model[R]
name[R]
options[R]
parameters[R]

Public Class Methods

new(name, model = nil, options = {}) click to toggle source
# File lib/active_list/definition/table.rb, line 6
def initialize(name, model = nil, options = {})
  @name    = name
  @model   = model || name.to_s.classify.constantize
  @options = options
  @paginate = !(@options[:pagination] == :none || @options[:paginate].is_a?(FalseClass))
  @options[:renderer] ||= :simple_renderer
  @options[:per_page] = 20 if @options[:per_page].to_i <= 0
  @options[:page] = 1 if @options[:page].to_i <= 0
  @columns = []
  @id = ActiveList.new_uid
end

Public Instance Methods

action(name, options = {}) click to toggle source

Add a new method in Table which permit to define action columns

# File lib/active_list/definition/table.rb, line 102
def action(name, options = {})
  add :action, name, options
end
action_columns() click to toggle source
# File lib/active_list/definition/table.rb, line 71
def action_columns
  @columns.select { |c| c.is_a? ActionColumn }
end
check_box(name, options = {}) click to toggle source

Add a new method in Table which permit to define check_box columns

# File lib/active_list/definition/table.rb, line 97
def check_box(name, options = {})
  add :check_box, name, options
end
children() click to toggle source
# File lib/active_list/definition/table.rb, line 37
def children
  @columns.map(&:child)
end
column(name, options = {}) click to toggle source

Add a new method in Table which permit to define data columns

# File lib/active_list/definition/table.rb, line 122
def column(name, options = {})
  if @model.reflect_on_association(name)
    options[:through] ||= name
    add :association, name, options
  elsif options[:through] && @model.reflect_on_association(options[:through])
    options[:label_method] ||= name
    add :association, name, options
  else
    add :attribute, name, options
  end
end
data_columns() click to toggle source
# File lib/active_list/definition/table.rb, line 67
def data_columns
  @columns.select { |c| c.is_a? DataColumn }
end
empty(name, options = {}) click to toggle source

Add a new method in Table which permit to define empty columns

# File lib/active_list/definition/table.rb, line 107
def empty(name, options = {})
  add :empty, name, options
end
exportable_columns() click to toggle source
# File lib/active_list/definition/table.rb, line 33
def exportable_columns
  @columns.select(&:exportable?)
end
global_action_columns() click to toggle source
# File lib/active_list/definition/table.rb, line 53
def global_action_columns
  action_columns.select(&:global?)
end
has_many_records_action?() click to toggle source
# File lib/active_list/definition/table.rb, line 45
def has_many_records_action?
  many_records_action_columns.any?
end
hidden_columns() click to toggle source
# File lib/active_list/definition/table.rb, line 75
def hidden_columns
  data_columns.select(&:hidden?)
end
load_default_columns() click to toggle source
# File lib/active_list/definition/table.rb, line 140
def load_default_columns
  for column in model_columns
    reflections = @model.reflect_on_all_associations(:belongs_to).select { |r| r.foreign_key.to_s == column.name.to_s }
    if reflections.size == 1
      reflection = reflections.first
      columns = reflection.class_name.constantize.columns.collect { |c| c.name.to_s }
      column(%i[label name code number].detect { |l| columns.include?(l.to_s) }, through: reflection.name, url: true)
    else
      column(column.name.to_sym)
    end
  end
  true
end
many_records_action_columns() click to toggle source
# File lib/active_list/definition/table.rb, line 49
def many_records_action_columns
  action_columns.select(&:use_many?)
end
model_columns() click to toggle source
# File lib/active_list/definition/table.rb, line 25
def model_columns
  @model.columns_hash.values
end
new_column_id() click to toggle source
# File lib/active_list/definition/table.rb, line 18
def new_column_id
  @current_column_id ||= 0
  id = @current_column_id.to_s # (36).to_sym
  @current_column_id += 1
  id
end
paginate?() click to toggle source
# File lib/active_list/definition/table.rb, line 41
def paginate?
  @paginate
end
reflections() click to toggle source

Compute includes Hash

# File lib/active_list/definition/table.rb, line 80
def reflections
  hash = []
  columns.each do |column|
    next unless column.respond_to?(:reflection)
    unless hash.detect { |r| r.name == column.reflection.name }
      hash << column.reflection
    end
  end
  hash
end
selectable?() click to toggle source
# File lib/active_list/definition/table.rb, line 57
def selectable?
  @options[:selectable] || action_columns.select(&:use_many?).any? || data_columns.any?(&:computable?)
end
sortable_columns() click to toggle source
# File lib/active_list/definition/table.rb, line 29
def sortable_columns
  @columns.select(&:sortable?)
end
status(*args) click to toggle source
# File lib/active_list/definition/table.rb, line 134
def status(*args)
  options = args.extract_options!
  name = args.shift || :status
  add :status, name, options
end
table_columns() click to toggle source

Retrieves all columns in database

# File lib/active_list/definition/table.rb, line 62
def table_columns
  cols = model_columns.map(&:name)
  @columns.select { |c| c.is_a?(DataColumn) && cols.include?(c.name.to_s) }
end
text_field(name, options = {}) click to toggle source

Add a new method in Table which permit to define text_field columns

# File lib/active_list/definition/table.rb, line 92
def text_field(name, options = {})
  add :text_field, name, options
end

Private Instance Methods

add(type, name, options = {}) click to toggle source

Checks and add column

# File lib/active_list/definition/table.rb, line 157
def add(type, name, options = {})
  klass = begin
            "ActiveList::Definition::#{type.to_s.camelcase}Column".constantize
          rescue
            nil
          end
  if klass && klass < AbstractColumn
    unless name.is_a?(Symbol)
      raise ArgumentError, "Name of a column must be a Symbol (got #{name.inspect})."
    end
    if @columns.detect { |c| c.name == name }
      raise ArgumentError, "Column name must be unique. #{name.inspect} is already used in #{self.name}"
    end
    @columns << klass.new(self, name, options)
  else
    raise ArgumentError, "Invalid column type: #{type.inspect}"
  end
end