Class: SmartListing::Base

Inherits:
Object
  • Object
show all
Defined in:
lib/smart_listing.rb

Constant Summary collapse

DEFAULT_PAGE_SIZES =
[10, 20, 50, 100]

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name, collection, options = {}) ⇒ Base

Returns a new instance of Base.



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/smart_listing.rb', line 32

def initialize name, collection, options = {}
  @name = name

  @options = {
    :partial                        => @name,                       # SmartListing partial name
    :sort_attributes                => :implicit,                   # allow implicitly setting sort attributes
    :default_sort                   => {},                          # default sorting
    :href                           => nil,                         # set SmartListing target url (in case when different than current url)
    :remote                         => true,                        # SmartListing is remote by default
    :callback_href                  => nil,                         # set SmartListing callback url (in case when different than current url)
  }.merge(SmartListing.config.global_options).merge(options)

  if @options[:array]
    @collection = collection.to_a
  else 
    @collection = collection
  end
end

Instance Attribute Details

#collectionObject (readonly)

Returns the value of attribute collection.



30
31
32
# File 'lib/smart_listing.rb', line 30

def collection
  @collection
end

#countObject (readonly)

Returns the value of attribute count.



30
31
32
# File 'lib/smart_listing.rb', line 30

def count
  @count
end

#nameObject (readonly)

Returns the value of attribute name.



30
31
32
# File 'lib/smart_listing.rb', line 30

def name
  @name
end

#optionsObject (readonly)

Returns the value of attribute options.



30
31
32
# File 'lib/smart_listing.rb', line 30

def options
  @options
end

#pageObject (readonly)

Returns the value of attribute page.



30
31
32
# File 'lib/smart_listing.rb', line 30

def page
  @page
end

#partialObject (readonly)

Returns the value of attribute partial.



30
31
32
# File 'lib/smart_listing.rb', line 30

def partial
  @partial
end

#per_pageObject (readonly)

Returns the value of attribute per_page.



30
31
32
# File 'lib/smart_listing.rb', line 30

def per_page
  @per_page
end

#sortObject (readonly)

Returns the value of attribute sort.



30
31
32
# File 'lib/smart_listing.rb', line 30

def sort
  @sort
end

Instance Method Details

#all_params(overrides = {}) ⇒ Object



152
153
154
155
156
157
158
159
160
161
162
# File 'lib/smart_listing.rb', line 152

def all_params overrides = {}
  ap = {base_param => {}}
  @options[:param_names].each do |k, v|
    if overrides[k]
      ap[base_param][v] = overrides[k]
    else
      ap[base_param][v] = self.send(k)
    end
  end
  ap
end

#base_paramObject



168
169
170
# File 'lib/smart_listing.rb', line 168

def base_param
  "#{name}_smart_listing"
end

#callback_hrefObject



136
137
138
# File 'lib/smart_listing.rb', line 136

def callback_href
  @options[:callback_href]
end

#hrefObject



132
133
134
# File 'lib/smart_listing.rb', line 132

def href
  @options[:href]
end

#kaminari_optionsObject



148
149
150
# File 'lib/smart_listing.rb', line 148

def kaminari_options
  @options[:kaminari_options]
end

#max_countObject



128
129
130
# File 'lib/smart_listing.rb', line 128

def max_count
  @options[:max_count]
end

#page_sizesObject



144
145
146
# File 'lib/smart_listing.rb', line 144

def page_sizes
  @options[:page_sizes]
end

#param_name(key) ⇒ Object



120
121
122
# File 'lib/smart_listing.rb', line 120

def param_name key
  "#{base_param}[#{param_names[key]}]"
end

#param_namesObject



116
117
118
# File 'lib/smart_listing.rb', line 116

def param_names
  @options[:param_names]
end

#remote?Boolean

Returns:

  • (Boolean)


140
141
142
# File 'lib/smart_listing.rb', line 140

def remote?
  @options[:remote]
end

#setup(params, cookies) ⇒ Object



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
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
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/smart_listing.rb', line 51

def setup params, cookies
  @params = params

  @page = get_param :page
  @per_page = !get_param(:per_page) || get_param(:per_page).empty? ? (@options[:memorize_per_page] && get_param(:per_page, cookies).to_i > 0 ? get_param(:per_page, cookies).to_i : page_sizes.first) : get_param(:per_page).to_i
  @per_page = page_sizes.first unless page_sizes.include?(@per_page)

  @sort = parse_sort(get_param(:sort)) || @options[:default_sort]
  sort_keys = (@options[:sort_attributes] == :implicit ? @sort.keys.collect{|s| [s, s]} : @options[:sort_attributes])

  set_param(:per_page, @per_page, cookies) if @options[:memorize_per_page]

  @count = @collection.size
  @count = @count.length if @count.is_a?(Hash)

  # Reset @page if greater than total number of pages
  no_pages = (@count.to_f / @per_page.to_f).ceil.to_i
  if @page.to_i > no_pages
    @page = no_pages
  end

  if @options[:array]
    if @sort && @sort.any? # when array we sort only by first attribute
      i = sort_keys.index{|x| x[0] == @sort.first[0]}
      @collection = @collection.sort do |x, y|
        xval = x
        yval = y
        sort_keys[i][1].split(".").each do |m|
          xval = xval.try(m)
          yval = yval.try(m)
        end
        xval = xval.upcase if xval.is_a?(String)
        yval = yval.upcase if yval.is_a?(String)

        if xval.nil? || yval.nil?
          xval.nil? ? 1 : -1
        else
          if @sort.first[1] == "asc"
            (xval <=> yval) || (xval && !yval ? 1 : -1)
          else
            (yval <=> xval) || (yval && !xval ? 1 : -1)
          end
        end 
      end 
    end
    if @options[:paginate] && @per_page > 0
      @collection = ::Kaminari.paginate_array(@collection).page(@page).per(@per_page)
      if @collection.length == 0
        @collection = @collection.page(@collection.num_pages)
      end
    end
  else
    # let's sort by all attributes
    @collection = @collection.order(sort_keys.collect{|s| "#{s[1]} #{@sort[s[0]]}" if @sort[s[0]]}.compact) if @sort && @sort.any?

    if @options[:paginate] && @per_page > 0
      @collection = @collection.page(@page).per(@per_page)
    end
  end
end

#sort_order(attribute) ⇒ Object



164
165
166
# File 'lib/smart_listing.rb', line 164

def sort_order attribute
  @sort && @sort[attribute].present? ? @sort[attribute] : nil
end

#unlimited_per_page?Boolean

Returns:

  • (Boolean)


124
125
126
# File 'lib/smart_listing.rb', line 124

def unlimited_per_page?
  !!@options[:unlimited_per_page]
end