lib/lolita/configuration/column.rb in lolita-3.4.3 vs lib/lolita/configuration/column.rb in lolita-4.0.0

- old
+ new

@@ -1,181 +1,170 @@ -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 - attr_reader :list_association_name - lolita_accessor :name, :title, :type, :options, :sortable, :association - - def initialize(dbi, *args, &block) - set_and_validate_dbi(dbi) - set_attributes(*args) - instance_eval(&block) if block_given? - validate - normalize_attributes - detect_association - end - - def list(*args, &block) - if args && args.any? || block_given? - detect_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) - 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) - 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 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(name) - end - end - - 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) - if new_title - @title = new_title - end - 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).find { |pair| pair[0] == sort_by_name } || [] - end - - # Return string with sort options for column if column is sortable. - def sort_params(params) - if @sortable - pairs = sort_pairs(params) - found_pair = false - 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 << [sort_by_name, 'asc'] - end - (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(',') } - end - - # Define format, for details see Lolita::Support::Formatter and Lolita::Support::Formater::Rails - def formatter(value = nil, &block) - if block_given? - @formatter = Lolita::Support::Formatter.new(value, &block) - elsif value || !@formatter - if value.kind_of?(Lolita::Support::Formatter) - @formatter = value - else - @formatter = Lolita::Support::Formatter::Rails.new(value) - end - end - @formatter - end - - def formatter=(value) - if value.kind_of?(Lolita::Support::Formatter) - @formatter = value - else - @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| - send(:"#{attr}=", args[0].send(attr)) - end - elsif args[0] - self.name = args[0] - end - options.each do |attr_name, value| - send(:"#{attr_name}=", value) - end - end - - private - - def detect_association - @association ||= dbi.associations[name] - end - - def normalize_attributes - @name = @name.to_sym - end - - def validate - 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 +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 + attr_reader :list_association_name + lolita_accessor :name,:title,:type,:options,:sortable, :association + + def initialize(dbi,*args,&block) + set_and_validate_dbi(dbi) + set_attributes(*args) + instance_eval(&block) if block_given? + validate + normalize_attributes + detect_association + end + + 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_dbi = list_association && Lolita::DBI::Base.create(list_association.klass) + 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) + 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) + 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) + end + end + + def formatted_value(record,view) + self.formatter.with(self.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) + if new_title + @title = new_title + end + 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} || [] + end + + # Return string with sort options for column if column is sortable. + 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" + found_pair = true + end + } + unless found_pair + pairs << [self.name.to_s,"asc"] + end + (pairs.map{ |pair| pair.join(",") }).join("|") + else + "" + end + end + + # Create array of sort information from params. + 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) + if block_given? + @formatter = Lolita::Support::Formatter.new(value,&block) + elsif value || !@formatter + if value.kind_of?(Lolita::Support::Formatter) + @formatter = value + else + @formatter = Lolita::Support::Formatter::Rails.new(value) + end + end + @formatter + end + + def formatter=(value) + if value.kind_of?(Lolita::Support::Formatter) + @formatter = value + else + @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| + send(:"#{attr}=",args[0].send(attr)) + end + elsif args[0] + self.name = args[0] + end + options.each do |attr_name,value| + send(:"#{attr_name}=",value) + end + end + + private + + def detect_association + @association ||= dbi.associations[self.name] + end + + def normalize_attributes + @name = @name.to_sym + end + + def validate + fail Lolita::UnknownDBIError.new("DBI is not specified for column #{self}") unless self.dbi + fail ArgumentError.new("Column must have name.") unless self.name + end + end + end +end