Class: ActiveScaffold::DataStructures::ActionColumns

Inherits:
Set
  • Object
show all
Includes:
Configurable
Defined in:
lib/active_scaffold/data_structures/action_columns.rb

Overview

A set of columns. These structures can be nested for organization.

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Configurable

#configure, #method_missing, #respond_to_missing?

Methods inherited from Set

#+, #each, #exclude, #find_by_name, #find_by_names, #initialize, #initialize_dup

Constructor Details

This class inherits a constructor from ActiveScaffold::DataStructures::Set

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class ActiveScaffold::Configurable

Instance Attribute Details

#actionObject

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.



10
11
12
# File 'lib/active_scaffold/data_structures/action_columns.rb', line 10

def action
  @action
end

#collapsedObject

Whether this column set is collapsed by default in contexts where collapsing is supported



42
43
44
# File 'lib/active_scaffold/data_structures/action_columns.rb', line 42

def collapsed
  @collapsed
end

#labelObject



19
20
21
# File 'lib/active_scaffold/data_structures/action_columns.rb', line 19

def label
  as_(@label) if @label
end

#layoutObject

Layout mode: nil/:single for flat columns, :multiple for column groups



45
46
47
# File 'lib/active_scaffold/data_structures/action_columns.rb', line 45

def layout
  @layout
end

#tabbed_byObject

a common column in the association columns included in the group, used to group the records from the association columns and split them in tabs



17
18
19
# File 'lib/active_scaffold/data_structures/action_columns.rb', line 17

def tabbed_by
  @tabbed_by
end

Instance Method Details

#==(other) ⇒ Object

this is so that array.delete and array.include?, etc., will work by column name



32
33
34
35
36
37
38
39
# File 'lib/active_scaffold/data_structures/action_columns.rb', line 32

def ==(other) # :nodoc:
  # another ActionColumns
  if other.class == self.class
    label == other.label
  else
    @label.to_s == other.to_s
  end
end

#[](arg) ⇒ Object



87
88
89
90
91
92
93
# File 'lib/active_scaffold/data_structures/action_columns.rb', line 87

def [](arg)
  if @layout == :multiple && arg.is_a?(Integer)
    @set[arg]
  else
    find_by_name(arg)
  end
end

#[]=(index, val) ⇒ Object

Raises:

  • (ArgumentError)


95
96
97
98
99
100
101
102
103
104
105
106
# File 'lib/active_scaffold/data_structures/action_columns.rb', line 95

def []=(index, val)
  raise '[]= is only supported when layout is :multiple' unless @layout == :multiple
  raise ArgumentError, "index #{index} is out of range, max is #{@set.length}" if index > @set.length

  if index == @set.length
    group = ActiveScaffold::DataStructures::ActionColumns.new(*val)
    group.action = action
    @set << group
  else
    @set[index].set_values(*val)
  end
end

#action_nameObject



176
177
178
# File 'lib/active_scaffold/data_structures/action_columns.rb', line 176

def action_name
  @action.
end

#addObject Also known as: <<



76
77
78
79
80
81
82
83
84
# File 'lib/active_scaffold/data_structures/action_columns.rb', line 76

def add(*)
  if @layout == :multiple
    group = ActiveScaffold::DataStructures::ActionColumns.new(*)
    group.action = action
    @set << group
  else
    super
  end
end

#add_subgroup(label) ⇒ Object

nests a subgroup in the column set



109
110
111
112
113
114
115
116
117
118
# File 'lib/active_scaffold/data_structures/action_columns.rb', line 109

def add_subgroup(label, &)
  raise 'add_subgroup is not supported when layout is :multiple' if @layout == :multiple

  columns = ActiveScaffold::DataStructures::ActionColumns.new
  columns.label = label
  columns.action = action
  columns.configure(&)
  exclude columns.collect_columns
  add columns
end

#columns_keyObject



180
181
182
# File 'lib/active_scaffold/data_structures/action_columns.rb', line 180

def columns_key
  "#{@action.core.model_id.to_s.underscore}-#{action_name}"
end

#constraint_columnsObject



188
189
190
# File 'lib/active_scaffold/data_structures/action_columns.rb', line 188

def constraint_columns
  ActiveScaffold::Registry.constraint_columns[columns_key]
end

#constraint_columns=(columns) ⇒ Object



184
185
186
# File 'lib/active_scaffold/data_structures/action_columns.rb', line 184

def constraint_columns=(columns)
  ActiveScaffold::Registry.constraint_columns[columns_key] = columns
end

#css_classObject



27
28
29
# File 'lib/active_scaffold/data_structures/action_columns.rb', line 27

def css_class
  @label.to_s.underscore.gsub(/[^-_0-9a-zA-Z]/, '-')
end

#each_column(options = {}, &proc) ⇒ Object



144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
# File 'lib/active_scaffold/data_structures/action_columns.rb', line 144

def each_column(options = {}, &proc)
  columns = options[:core_columns] || (action.core.user || action.core).columns
  self.unauthorized_columns = []
  options[:for] ||= columns.active_record_class

  each do |item|
    if item.is_a? ActiveScaffold::DataStructures::ActionColumns
      if options[:flatten]
        item.each_column(options, &proc)
      elsif !options[:skip_groups]
        yield item
      end
    else
      next if !options[:skip_authorization] && skip_column?(item, options)

      yield columns[item] || ActiveScaffold::DataStructures::Column.new(item.to_sym, columns.active_record_class)
    end
  end
end

#include?(item) ⇒ Boolean

Returns:

  • (Boolean)


120
121
122
123
124
125
126
# File 'lib/active_scaffold/data_structures/action_columns.rb', line 120

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

#lengthObject



200
201
202
# File 'lib/active_scaffold/data_structures/action_columns.rb', line 200

def length
  ((@set - constraint_columns) - unauthorized_columns).length
end

#nameObject



23
24
25
# File 'lib/active_scaffold/data_structures/action_columns.rb', line 23

def name
  @label.to_s.underscore
end

#set_valuesObject



71
72
73
74
# File 'lib/active_scaffold/data_structures/action_columns.rb', line 71

def set_values(*)
  @layout = nil
  super
end

#skip_column?(column_name, options) ⇒ Boolean

Returns:

  • (Boolean)


132
133
134
135
136
137
138
139
140
141
142
# File 'lib/active_scaffold/data_structures/action_columns.rb', line 132

def skip_column?(column_name, 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&.crud_type || :read, column: column_name)
    unauthorized_columns << column_name.to_sym
    return true
  end
  false
end

#to_aObject



128
129
130
# File 'lib/active_scaffold/data_structures/action_columns.rb', line 128

def to_a
  Array(@set)
end

#unauthorized_columnsObject



196
197
198
# File 'lib/active_scaffold/data_structures/action_columns.rb', line 196

def unauthorized_columns
  ActiveScaffold::Registry.unauthorized_columns[columns_key]
end

#unauthorized_columns=(columns) ⇒ Object



192
193
194
# File 'lib/active_scaffold/data_structures/action_columns.rb', line 192

def unauthorized_columns=(columns)
  ActiveScaffold::Registry.unauthorized_columns[columns_key] = columns
end

#visible_columns(options = {}) ⇒ Object



164
165
166
167
168
169
170
# File 'lib/active_scaffold/data_structures/action_columns.rb', line 164

def visible_columns(options = {})
  columns = []
  each_column(options) do |column|
    columns << column
  end
  columns
end

#visible_columns_names(options = {}) ⇒ Object



172
173
174
# File 'lib/active_scaffold/data_structures/action_columns.rb', line 172

def visible_columns_names(options = {})
  visible_columns(options.reverse_merge(flatten: true)).map(&:name)
end