Class: AdminIt::CollectionContext

Inherits:
Context
  • Object
show all
Extended by:
FiltersHolder
Defined in:
lib/admin_it/context/collection_context.rb

Direct Known Subclasses

ListContext, TableContext, TilesContext

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

This class inherits a constructor from AdminIt::Context

Instance Attribute Details

#entityObject

Returns the value of attribute entity.



59
60
61
# File 'lib/admin_it/context/collection_context.rb', line 59

def entity
  @entity
end

Class Method Details

.before_configureObject



18
19
20
21
22
23
24
25
26
27
# File 'lib/admin_it/context/collection_context.rb', line 18

def self.before_configure
  return if resource.nil?
  visible = fields(scope: :visible).map(&:field_name)
  @filters = Hash[
    resource.filters
      .select { |f| f <= FieldFilter }
      .select { |f| visible.include?(f.field.field_name) }
      .map { |f| [f.filter_name, f] }
  ]
end

.collection?Boolean

Returns:

  • (Boolean)


44
45
46
# File 'lib/admin_it/context/collection_context.rb', line 44

def self.collection?
  true
end

.entities_getterObject



40
41
42
# File 'lib/admin_it/context/collection_context.rb', line 40

def self.entities_getter
  @entities
end

.filter(name, filter_class: nil, &block) ⇒ Object



29
30
31
32
33
34
35
36
37
38
# File 'lib/admin_it/context/collection_context.rb', line 29

def self.filter(name, filter_class: nil, &block)
  assert_symbol(:name)
  if @filters.key?(name)
    filter = @filters[name] = Class.new(@filters[name]) if block_given?
  else
    filter_class = Filter if filter_class.nil? || !filter_class <= Filter
    filter = @filters[name] = filter_class.create(name, self)
  end
  filter.instance_eval(&block) if block_given?
end

.filters(scope: :all) ⇒ Object Originally defined in module FiltersHolder

.pathObject



48
49
50
# File 'lib/admin_it/context/collection_context.rb', line 48

def self.path
  AdminIt::Engine.routes.url_helpers.send("#{resource.plural}_path")
end

.sortable_fields(*names) ⇒ Object



52
53
54
55
56
57
# File 'lib/admin_it/context/collection_context.rb', line 52

def self.sortable_fields(*names)
  names = names.ensure_symbols
  fields.each do |_field|
    _field.sortable = names.include?(_field.field_name)
  end
end

Instance Method Details

#active_filterObject



153
154
155
# File 'lib/admin_it/context/collection_context.rb', line 153

def active_filter
  @active_filter ||= filters.empty? ? nil : filters.first
end

#active_filter=(value) ⇒ Object



157
158
159
160
161
162
163
164
165
166
# File 'lib/admin_it/context/collection_context.rb', line 157

def active_filter=(value)
  if value.nil?
    active_filter
  elsif value.is_a?(Class) && value <= Filter
    @active_filter = value
  elsif value.is_a?(String)
    value = value.to_sym
    @active_filter = filters.find { |f| f.name == value }
  end
end

#all_filtersObject



112
113
114
# File 'lib/admin_it/context/collection_context.rb', line 112

def all_filters
  self.class.filters
end

#countObject



211
212
213
214
215
216
217
# File 'lib/admin_it/context/collection_context.rb', line 211

def count
  return @count unless @count.nil?
  # apply filters and limits first
  entities if @enumerator.nil?
  # if @count is not setted yet - calculate it
  @count = entities.count
end

#entitiesObject



199
200
201
202
203
204
205
206
207
208
209
# File 'lib/admin_it/context/collection_context.rb', line 199

def entities
  self.entity = nil
  collection = self
  @enumerator ||= Enumerator.new do |yielder|
    @entities.each do |v|
      collection.entity = v
      yielder << v
    end
    collection.entity = nil
  end
end

#entities=(value) ⇒ Object



195
196
197
# File 'lib/admin_it/context/collection_context.rb', line 195

def entities=(value)
  @entities = value
end

#filtersObject



116
117
118
# File 'lib/admin_it/context/collection_context.rb', line 116

def filters
  (@filters ||= {}).values
end

#filters=(value) ⇒ Object



120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
# File 'lib/admin_it/context/collection_context.rb', line 120

def filters=(value)
  if value.is_a?(Array)
    @filters = Hash[
      value.select { |f| f.is_a?(Filter) }.map { |f| [f.name, f] }
    ]
  elsif value.is_a?(Hash)
    self.filters = value.values
  elsif value.is_a?(String)
    @filters ||= {}
    value.strip!
    @filters = {} if value.empty?
    value.split(/[;|]/).each do |str|
      str.strip!
      remove = str[0] == '-'
      str = str[1..-1] if remove
      m = Filter::REGEXP.match(str)
      next if m.nil?
      if remove
        @filters.delete(m[:name].to_sym)
      else
        name = m[:name].to_sym
        if @filters.key?(name)
          @filters[name].change(m[:params])
        else
          @filters[name] = Filter.load(str, self.class.filters)
        end
      end
    end
  else
    @filters = {}
  end
end

#load_contextObject



176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
# File 'lib/admin_it/context/collection_context.rb', line 176

def load_context
  collection =
    if entities_getter.nil?
      if controller.respond_to?("#{resource.name}_entities")
        controller.send("#{resource.name}_entities", name)
      elsif controller.respond_to?(:entities)
        controller.entities(entity_class, name)
      else
        load_entities
      end
    else
      entities_getter.call
    end
  filters.each do |filter|
    collection = filter.apply(collection)
  end
  self.entities = collection
end

#sortableObject



172
173
174
# File 'lib/admin_it/context/collection_context.rb', line 172

def sortable
  @sortable ||= sortable_fields.map(&:name)
end

#sortable_fieldsObject



168
169
170
# File 'lib/admin_it/context/collection_context.rb', line 168

def sortable_fields
  @sortable_fields ||= fields(scope: :sortable)
end

#sortingObject



81
82
83
84
# File 'lib/admin_it/context/collection_context.rb', line 81

def sorting
  return @sorting unless @sorting.nil?
  self.sorting = self.class.default_sorting
end

#sorting=(value) ⇒ Object



86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/admin_it/context/collection_context.rb', line 86

def sorting=(value)
  value = value.to_s if value.is_a?(Symbol)
  if value.is_a?(Array)
    @sorting = value
  elsif value.is_a?(String) && !value.empty?
    @sorting = [] unless /\W[+\-]\w/ =~ value
    @sorting ||= []
    sortable = self.class.fields(scope: :sortable).map(&:field_name)
    value.split(/[;,|]/).each do |sort|
      sort.strip!
      if sort[0] == '-'
        sort = sort[1..-1] + ':'
        @sorting.delete_if { |s| s.index(sort) == 0 }
      else
        sort = sort[1..-1] if sort[0] == '+'
        sort, order = sort.split(':')
        order = 'asc' if order != 'desc'
        sort = sort.to_sym
        @sorting << "#{sort}:#{order}" if sortable.include?(sort)
      end
    end
  else
    @sorting = []
  end
end