lib/lolita/configuration/column.rb in lolita-3.4.0 vs lib/lolita/configuration/column.rb in lolita-3.4.1
- old
+ new
@@ -1,146 +1,181 @@
module Lolita
module Configuration
+ # column in a list
+ #
+ # === Examples
+ # lolita do
+ # list do
+ # column :title, sortable: true
+ # column :full_name, sortable: 'first_name'
+ # column :is_public do
+ # formatter do |value, record, view|
+ # value ? 'Yes' : 'No'
+ # end
+ # end
+ #
+ # column do
+ # title "ID"
+ # name :id
+ # formatter do|value, record, view|
+ # view.link_to(value, view.url_for(action: 'edit', id: value))
+ # end
+ # end
+ #
+ # column :updated_at, title: 'Date', formatter: '%d.%m.%Y., %H:%M'
+ # end
+ # end
class Column < Lolita::Configuration::Base
-
- MAX_TEXT_SIZE=20
+ MAX_TEXT_SIZE = 20
attr_reader :list_association_name
- lolita_accessor :name,:title,:type,:options,:sortable, :association
-
- def initialize(dbi,*args,&block)
+ lolita_accessor :name, :title, :type, :options, :sortable, :association
+
+ def initialize(dbi, *args, &block)
set_and_validate_dbi(dbi)
- self.set_attributes(*args)
- self.instance_eval(&block) if block_given?
+ set_attributes(*args)
+ instance_eval(&block) if block_given?
validate
normalize_attributes
detect_association
end
- def list *args, &block
+ def list(*args, &block)
if args && args.any? || block_given?
detect_association
- list_association = args[0] && @dbi.associations[args[0].to_s.to_sym] || self.association
+ list_association = args[0] && @dbi.associations[args[0].to_s.to_sym] || association
list_dbi = list_association && Lolita::DBI::Base.create(list_association.klass)
- raise Lolita::UnknownDBPError.new("DBI is not specified for list in column #{self}") unless list_dbi
+ fail Lolita::UnknownDBPError.new("DBI is not specified for list in column #{self}") unless list_dbi
@list_association_name = list_association.name
- Lolita::LazyLoader.lazy_load(self,:@list,Lolita::Configuration::NestedList, list_dbi, self, :association_name => list_association.name, &block)
+ Lolita::LazyLoader.lazy_load(self, :@list, Lolita::Configuration::NestedList, list_dbi, self, association_name: list_association.name, &block)
else
@list
end
end
# Return value of column from given record. When record matches foreign key patter, then foreign key is used.
# In other cases it just ask for attribute with same name as column.
def value(record)
- if self.association
- if self.association.macro == :one && dbi.klass.respond_to?(:human_attribute_name)
+ if association
+ if association.macro == :one && dbi.klass.respond_to?(:human_attribute_name)
dbi.klass.human_attribute_name(association.name)
# dbi.record(record.send(association.name)).title
elsif dbi.klass.respond_to?(:human_attribute_name)
"#{dbi.klass.human_attribute_name(association.name)} (#{record.send(association.name).count})"
else
"#{association.name} (#{record.send(association.name).count})"
end
else
- record.send(self.name)
+ record.send(name)
end
end
- def formatted_value(record,view)
- self.formatter.with(self.value(record), record, view)
+ def formatted_value(record, view)
+ formatter.with(value(record), record, view)
end
# Set/Get title. Getter return title what was set or ask for human_attribute_name to model.
- def title(new_title=nil)
+ def title(new_title = nil)
if new_title
@title = new_title
end
- Lolita::Utils.dynamic_string(@title, :default => @name && @dbi.klass.human_attribute_name(@name))
+ Lolita::Utils.dynamic_string(@title, default: @name && @dbi.klass.human_attribute_name(@name))
end
def sortable?
@sortable
end
# Find if any of received sort options matches this column.
def current_sort_state(params)
- @sortable && sort_pairs(params).detect{|pair| pair[0]==self.name.to_s} || []
+ @sortable && sort_pairs(params).find { |pair| pair[0] == sort_by_name } || []
end
# Return string with sort options for column if column is sortable.
- def sort_params params
+ def sort_params(params)
if @sortable
pairs = sort_pairs(params)
found_pair = false
- pairs.each_with_index{|pair,index|
- if pair[0] == self.name.to_s
- pairs[index][1] = pair[1] == "asc" ? "desc" : "asc"
+ pairs.each_with_index{|pair, index|
+ if pair[0] == sort_by_name
+ pairs[index][1] = pair[1] == 'asc' ? 'desc' : 'asc'
found_pair = true
end
}
unless found_pair
- pairs << [self.name.to_s,"asc"]
+ pairs << [sort_by_name, 'asc']
end
- (pairs.map{|pair| pair.join(",")}).join("|")
+ (pairs.map { |pair| pair.join(',') }).join('|')
else
- ""
+ ''
end
end
+ # returns value to sort by
+ # in default it will be column name, but you can specify it
+ # in field configuration
+ #
+ # === Examples
+ # list do
+ # field :name, sortable: 'some_table.first_name'
+ # end
+ def sort_by_name
+ @sortable.is_a?(TrueClass) ? name.to_s : @sortable.to_s
+ end
+
# Create array of sort information from params.
- def sort_pairs params
- (params[:s] || "").split("|").map{|pair| pair.split(",")}
+ def sort_pairs(params)
+ (params[:s] || '').split('|').map { |pair| pair.split(',') }
end
# Define format, for details see Lolita::Support::Formatter and Lolita::Support::Formater::Rails
- def formatter(value=nil,&block)
+ def formatter(value = nil, &block)
if block_given?
- @formatter=Lolita::Support::Formatter.new(value,&block)
+ @formatter = Lolita::Support::Formatter.new(value, &block)
elsif value || !@formatter
if value.kind_of?(Lolita::Support::Formatter)
- @formatter=value
+ @formatter = value
else
- @formatter=Lolita::Support::Formatter::Rails.new(value)
+ @formatter = Lolita::Support::Formatter::Rails.new(value)
end
end
@formatter
end
def formatter=(value)
if value.kind_of?(Lolita::Support::Formatter)
- @formatter=value
+ @formatter = value
else
- @formatter=Lolita::Support::Formatter::Rails.new(value)
+ @formatter = Lolita::Support::Formatter::Rails.new(value)
end
end
def set_attributes(*args)
options = args ? args.extract_options! : {}
if args[0].respond_to?(:field)
- [:name,:type].each do |attr|
- self.send(:"#{attr}=",args[0].send(attr))
+ [:name, :type].each do |attr|
+ send(:"#{attr}=", args[0].send(attr))
end
elsif args[0]
self.name = args[0]
end
- options.each do |attr_name,value|
- self.send(:"#{attr_name}=",value)
+ options.each do |attr_name, value|
+ send(:"#{attr_name}=", value)
end
end
-
+
private
def detect_association
- @association ||= dbi.associations[self.name]
+ @association ||= dbi.associations[name]
end
def normalize_attributes
@name = @name.to_sym
end
def validate
- raise Lolita::UnknownDBIError.new("DBI is not specified for column #{self}") unless self.dbi
- raise ArgumentError.new("Column must have name.") unless self.name
+ fail Lolita::UnknownDBIError.new("DBI is not specified for column #{self}") unless dbi
+ fail ArgumentError.new('Column must have name.') unless name
end
end
end
end