Class: AdminIt::CollectionContext

Inherits:
Context 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.



9
10
11
# File 'lib/admin_it/context/collection_context.rb', line 9

def default_sorting
  @default_sorting
end

.entities_getterObject (readonly)

Returns the value of attribute entities_getter.



9
10
11
# File 'lib/admin_it/context/collection_context.rb', line 9

def entities_getter
  @entities_getter
end

Instance Attribute Details

#entityObject

Returns the value of attribute entity.



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

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)


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

def self.collection?
  true
end

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

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

.pathObject



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

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

.show_in_dialog?Boolean

Returns:

  • (Boolean)


29
30
31
# File 'lib/admin_it/context/collection_context.rb', line 29

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

.sortable_fields(*names) ⇒ Object



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

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



126
127
128
# File 'lib/admin_it/context/collection_context.rb', line 126

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

#active_filter=(value) ⇒ Object



130
131
132
133
134
135
136
137
138
139
# File 'lib/admin_it/context/collection_context.rb', line 130

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



101
102
103
# File 'lib/admin_it/context/collection_context.rb', line 101

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

#countObject



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

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



172
173
174
175
176
177
178
179
180
181
182
# File 'lib/admin_it/context/collection_context.rb', line 172

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



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

def entities=(value)
  @entities = value
end

#filtersObject



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

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

#filters=(value) ⇒ Object



109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# File 'lib/admin_it/context/collection_context.rb', line 109

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



149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
# File 'lib/admin_it/context/collection_context.rb', line 149

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



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

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

#sortable_fieldsObject



141
142
143
# File 'lib/admin_it/context/collection_context.rb', line 141

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

#sortingObject



70
71
72
73
# File 'lib/admin_it/context/collection_context.rb', line 70

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

#sorting=(value) ⇒ Object



75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/admin_it/context/collection_context.rb', line 75

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