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

Class Attribute Summary collapse

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

This class inherits a constructor from AdminIt::Context

Class Attribute Details

.default_sortingObject (readonly)

Returns the value of attribute default_sorting.



13
14
15
# File 'lib/admin_it/context/collection_context.rb', line 13

def default_sorting
  @default_sorting
end

.entities_getterObject (readonly)

Returns the value of attribute entities_getter.



13
14
15
# File 'lib/admin_it/context/collection_context.rb', line 13

def entities_getter
  @entities_getter
end

Instance Attribute Details

#entitiesObject

def entities=(value) @entities = value end



177
178
179
180
181
182
183
184
185
186
187
# File 'lib/admin_it/context/collection_context.rb', line 177

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

#entityObject

Returns the value of attribute entity.



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

def entity
  @entity
end

Class Method Details

.before_configureObject



22
23
24
25
26
27
28
29
30
31
# File 'lib/admin_it/context/collection_context.rb', line 22

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)


37
38
39
# File 'lib/admin_it/context/collection_context.rb', line 37

def self.collection?
  true
end

.filter(name) ⇒ Object Originally defined in module FiltersHolder

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

.pathObject



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

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

.show_in_dialog?Boolean

Returns:

  • (Boolean)


33
34
35
# File 'lib/admin_it/context/collection_context.rb', line 33

def self.show_in_dialog?
  @show_in_dialog.nil? ? @show_in_dialog = true : @show_in_dialog == true
end

.sortable_fields(*names) ⇒ Object



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

def self.sortable_fields(*names)
  names = names.ensure_array(:flatten, :ensure_symbol, :compact, :uniq)
  fields.each do |_field|
    _field.sortable = names.include?(_field.field_name)
  end
end

Instance Method Details

#active_filterObject



131
132
133
# File 'lib/admin_it/context/collection_context.rb', line 131

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

#active_filter=(value) ⇒ Object



135
136
137
138
139
140
141
142
143
144
# File 'lib/admin_it/context/collection_context.rb', line 135

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_filters(scope: :all) ⇒ Object



106
107
108
# File 'lib/admin_it/context/collection_context.rb', line 106

def all_filters(scope: :all)
  self.class.filters(scope: scope)
end

#countObject



189
190
191
192
193
194
195
# File 'lib/admin_it/context/collection_context.rb', line 189

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

#filtersObject



110
111
112
# File 'lib/admin_it/context/collection_context.rb', line 110

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

#filters=(value) ⇒ Object



114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
# File 'lib/admin_it/context/collection_context.rb', line 114

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



154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
# File 'lib/admin_it/context/collection_context.rb', line 154

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



150
151
152
# File 'lib/admin_it/context/collection_context.rb', line 150

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

#sortable_fieldsObject



146
147
148
# File 'lib/admin_it/context/collection_context.rb', line 146

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

#sortingObject



75
76
77
78
# File 'lib/admin_it/context/collection_context.rb', line 75

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

#sorting=(value) ⇒ Object



80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# File 'lib/admin_it/context/collection_context.rb', line 80

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