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.



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

def entity
  @entity
end

Class Method Details

.before_configureObject



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

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)


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

def self.collection?
  true
end

.entities_getterObject



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

def self.entities_getter
  @entities
end

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



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

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



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

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

.sortable_fields(*names) ⇒ Object



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

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



138
139
140
# File 'lib/admin_it/context/collection_context.rb', line 138

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

#active_filter=(value) ⇒ Object



142
143
144
145
146
147
148
149
150
151
# File 'lib/admin_it/context/collection_context.rb', line 142

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



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

def all_filters
  self.class.filters
end

#countObject



196
197
198
199
200
201
202
# File 'lib/admin_it/context/collection_context.rb', line 196

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



184
185
186
187
188
189
190
191
192
193
194
# File 'lib/admin_it/context/collection_context.rb', line 184

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



180
181
182
# File 'lib/admin_it/context/collection_context.rb', line 180

def entities=(value)
  @entities = value
end

#filtersObject



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

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

#filters=(value) ⇒ Object



121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# File 'lib/admin_it/context/collection_context.rb', line 121

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?
    Filter.apply(value, @filters, self.class.filters)
  else
    @filters = {}
  end
end

#load_contextObject



161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
# File 'lib/admin_it/context/collection_context.rb', line 161

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



157
158
159
# File 'lib/admin_it/context/collection_context.rb', line 157

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

#sortable_fieldsObject



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

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

#sortingObject



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

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

#sorting=(value) ⇒ Object



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

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