class ActiveScaffold::DataStructures::ActionColumns
A set of columns. These structures can be nested for organization.
Attributes
action[RW]
this lets us refer back to the action responsible for this link, if it exists. the immediate need here is to get the crud_type so we can dynamically filter columns from the set.
collapsed[RW]
Whether this column set is collapsed by default in contexts where collapsing is supported
label[W]
labels are useful for the Create/Update forms, when we display columns in a grouped fashion and want to name them separately
Public Instance Methods
action_name()
click to toggle source
# File lib/active_scaffold/data_structures/action_columns.rb, line 131 def action_name @action.class.name.demodulize.underscore end
add_subgroup(label, &proc)
click to toggle source
nests a subgroup in the column set
# File lib/active_scaffold/data_structures/action_columns.rb, line 38 def add_subgroup(label, &proc) columns = ActiveScaffold::DataStructures::ActionColumns.new columns.label = label columns.action = action columns.configure(&proc) exclude columns.collect_columns add columns end
collect_visible(options = {}) { |item| ... }
click to toggle source
# File lib/active_scaffold/data_structures/action_columns.rb, line 93 def collect_visible(options = {}, &proc) columns = [] options[:for] ||= @columns.active_record_class self.unauthorized_columns = [] @set.each do |item| unless item.is_a?(ActiveScaffold::DataStructures::ActionColumns) || @columns.nil? item = (@columns[item] || ActiveScaffold::DataStructures::Column.new(item.to_sym, @columns.active_record_class)) next if self.skip_column?(item, options) end if item.is_a?(ActiveScaffold::DataStructures::ActionColumns) && options.key?(:flatten) && options[:flatten] columns += item.collect_visible(options, &proc) else columns << (block_given? ? yield(item) : item) end end columns end
constraint_columns()
click to toggle source
# File lib/active_scaffold/data_structures/action_columns.rb, line 144 def constraint_columns constraints = Thread.current[:constraint_columns] (constraints[constraint_columns_key] if constraints) || [] end
constraint_columns=(columns)
click to toggle source
# File lib/active_scaffold/data_structures/action_columns.rb, line 139 def constraint_columns=(columns) Thread.current[:constraint_columns] ||= {} Thread.current[:constraint_columns][constraint_columns_key] = columns end
constraint_columns_key()
click to toggle source
# File lib/active_scaffold/data_structures/action_columns.rb, line 135 def constraint_columns_key "#{@action.core.model_id.to_s.underscore}-#{action_name}" end
css_class()
click to toggle source
# File lib/active_scaffold/data_structures/action_columns.rb, line 20 def css_class @label.to_s.underscore.gsub /[^-_0-9a-zA-Z]/, '-' end
each(options = {}) { |item| ... }
click to toggle source
Redefine the each method to yield actual Column objects. It will skip constrained and unauthorized columns.
Options:
* :flatten - whether to recursively iterate on nested sets. default is false. * :for - the record (or class) being iterated over. used for column-level security. default is the class.
# File lib/active_scaffold/data_structures/action_columns.rb, line 73 def each(options = {}, &proc) options[:for] ||= @columns.active_record_class unless @columns.nil? self.unauthorized_columns = [] @set.each do |item| unless item.is_a?(ActiveScaffold::DataStructures::ActionColumns) || @columns.nil? item = (@columns[item] || ActiveScaffold::DataStructures::Column.new(item.to_sym, @columns.active_record_class)) next if self.skip_column?(item, options) end if item.is_a? ActiveScaffold::DataStructures::ActionColumns if options[:flatten] item.each(options, &proc) elsif !options[:skip_groups] yield item end else yield item end end end
include?(item)
click to toggle source
# File lib/active_scaffold/data_structures/action_columns.rb, line 47 def include?(item) @set.each do |c| return true if !c.is_a?(Symbol) && c.include?(item) return true if c == item.to_sym end false end
label()
click to toggle source
# File lib/active_scaffold/data_structures/action_columns.rb, line 12 def label as_(@label) if @label end
length()
click to toggle source
# File lib/active_scaffold/data_structures/action_columns.rb, line 154 def length ((@set - constraint_columns) - unauthorized_columns).length end
name()
click to toggle source
# File lib/active_scaffold/data_structures/action_columns.rb, line 16 def name @label.to_s.underscore end
names()
click to toggle source
# File lib/active_scaffold/data_structures/action_columns.rb, line 55 def names if @columns collect_visible(:flatten => true) { |c| c.name } else names_without_auth_check end end
names_without_auth_check()
click to toggle source
# File lib/active_scaffold/data_structures/action_columns.rb, line 63 def names_without_auth_check Array(@set) end
set_columns(columns)
click to toggle source
registers a set of column objects (recursively, for all nested ActionColumns)
# File lib/active_scaffold/data_structures/action_columns.rb, line 123 def set_columns(columns) @columns = columns # iterate over @set instead of self to avoid dealing with security queries @set.each do |item| item.set_columns(columns) if item.respond_to? :set_columns end end
skip_column?(column, options)
click to toggle source
# File lib/active_scaffold/data_structures/action_columns.rb, line 111 def skip_column?(column, options) # skip if this matches a constrained column return true if constraint_columns.include?(column.name.to_sym) # skip this field if it's not authorized unless options[:for].authorized_for?(:action => options[:action], :crud_type => options[:crud_type] || action.try(:crud_type) || :read, :column => column.name) unauthorized_columns << column.name.to_sym return true end false end
Protected Instance Methods
collect_columns()
click to toggle source
# File lib/active_scaffold/data_structures/action_columns.rb, line 160 def collect_columns @set.collect { |col| col.is_a?(ActiveScaffold::DataStructures::ActionColumns) ? col.collect_columns : col } end
initialize_copy(from)
click to toggle source
called during clone or dup. makes the clone/dup deeper.
# File lib/active_scaffold/data_structures/action_columns.rb, line 165 def initialize_copy(from) @set = from.instance_variable_get('@set').clone end