class SmartListing::Base

Attributes

collection[R]
count[R]
name[R]
options[R]
page[R]
partial[R]
per_page[R]
sort[R]

Public Class Methods

new(name, collection, options = {}) click to toggle source
# File lib/smart_listing.rb, line 26
def initialize name, collection, options = {}
  @name = name

  config_profile = options.delete(:config_profile)

  @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(config_profile).global_options).merge(options)

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

Public Instance Methods

all_params(overrides = {}) click to toggle source
# File lib/smart_listing.rb, line 155
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_param() click to toggle source
# File lib/smart_listing.rb, line 171
def base_param
  "#{name}_smart_listing"
end
callback_href() click to toggle source
# File lib/smart_listing.rb, line 135
def callback_href
  @options[:callback_href]
end
href() click to toggle source
# File lib/smart_listing.rb, line 131
def href
  @options[:href]
end
kaminari_options() click to toggle source
# File lib/smart_listing.rb, line 147
def kaminari_options
  @options[:kaminari_options]
end
max_count() click to toggle source
# File lib/smart_listing.rb, line 127
def max_count
  @options[:max_count]
end
page_sizes() click to toggle source
# File lib/smart_listing.rb, line 143
def page_sizes
  @options[:page_sizes]
end
param_name(key) click to toggle source
# File lib/smart_listing.rb, line 119
def param_name key
  "#{base_param}[#{param_names[key]}]"
end
param_names() click to toggle source
# File lib/smart_listing.rb, line 115
def param_names
  @options[:param_names]
end
remote?() click to toggle source
# File lib/smart_listing.rb, line 139
def remote?
  @options[:remote]
end
setup(params, cookies) click to toggle source
# File lib/smart_listing.rb, line 47
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) || (unlimited_per_page? && @per_page == 0)

  @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
  if @per_page > 0
    no_pages = (@count.to_f / @per_page.to_f).ceil.to_i
    if @page.to_i > no_pages
      @page = no_pages
    end
  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_dirs() click to toggle source
# File lib/smart_listing.rb, line 151
def sort_dirs
  @options[:sort_dirs]
end
sort_order(attribute) click to toggle source
# File lib/smart_listing.rb, line 167
def sort_order attribute
  @sort && @sort[attribute].present? ? @sort[attribute] : nil
end
unlimited_per_page?() click to toggle source
# File lib/smart_listing.rb, line 123
def unlimited_per_page?
  !!@options[:unlimited_per_page]
end

Private Instance Methods

get_param(key, store = @params) click to toggle source
# File lib/smart_listing.rb, line 177
def get_param key, store = @params
  if store.is_a?(ActionDispatch::Cookies::CookieJar)
    store["#{base_param}_#{param_names[key]}"]
  else
    store[base_param].try(:[], param_names[key])
  end
end
parse_sort(sort_params) click to toggle source
# File lib/smart_listing.rb, line 194
def parse_sort sort_params
  sort = nil

  if @options[:sort_attributes] == :implicit
    sort = sort_params.dup if sort_params.present?
  elsif @options[:sort_attributes]
    @options[:sort_attributes].each do |a|
      k, v = a
      if sort_params && sort_params[k.to_s]
        dir = ["asc", "desc", ""].delete(sort_params[k.to_s])

        if dir
          sort ||= {}
          sort[k] = dir
        end
      end
    end
  end

  sort
end
set_param(key, value, store = @params) click to toggle source
# File lib/smart_listing.rb, line 185
def set_param key, value, store = @params
  if store.is_a?(ActionDispatch::Cookies::CookieJar)
    store["#{base_param}_#{param_names[key]}"] = value
  else
    store[base_param] ||= {}
    store[base_param][param_names[key]] = value
  end
end