module Datagrid::Ordering

Public Class Methods

included(base) click to toggle source

@!visibility private

# File lib/datagrid/ordering.rb, line 10
def self.included(base)
  base.extend         ClassMethods
  base.class_eval do
    include Datagrid::Columns

    datagrid_attribute :order do |value|
      if value.present?
        value.to_sym
      else
        nil
      end

    end

    datagrid_attribute :descending do |value|
      Datagrid::Utils.booleanize(value)
    end
    alias descending? descending

  end
end

Public Instance Methods

assets() click to toggle source

@!visibility private

Calls superclass method Datagrid::Columns#assets
# File lib/datagrid/ordering.rb, line 41
def assets
  check_order_valid!
  apply_order(super)
end
order_column() click to toggle source

@return [Datagrid::Columns::Column, nil] a column definition that is currently used to order assets @example

class MyGrid
  scope { Model }
  column(:id)
  column(:name)
end
MyGrid.new(order: "name").order_column # => #<Column name: "name", ...>
# File lib/datagrid/ordering.rb, line 54
def order_column
  order ? column_by_name(order) : nil
end
ordered_by?(column) click to toggle source

@param column [String, Datagrid::Columns::Column] @return [Boolean] true if given grid is ordered by given column.

# File lib/datagrid/ordering.rb, line 60
def ordered_by?(column)
  order_column == column_by_name(column)
end

Private Instance Methods

apply_asc_order(assets, order) click to toggle source
# File lib/datagrid/ordering.rb, line 97
def apply_asc_order(assets, order)
  if order.respond_to?(:call)
    apply_block_order(assets, order)
  else
    driver.asc(assets, order)
  end
end
apply_block_order(assets, order) click to toggle source
# File lib/datagrid/ordering.rb, line 119
def apply_block_order(assets, order)
  case order.arity
  when -1, 0
    assets.instance_eval(&order)
  when 1
    order.call(assets)
  else
    self.class.order_unsupported(order_column.name, "Order option proc can not handle more than one argument")
  end
end
apply_desc_order(assets, order) click to toggle source
# File lib/datagrid/ordering.rb, line 105
def apply_desc_order(assets, order)
  if order.respond_to?(:call)
    reverse_order(apply_asc_order(assets, order))
  else
    driver.desc(assets, order)
  end
end
apply_order(assets) click to toggle source
# File lib/datagrid/ordering.rb, line 66
def apply_order(assets)
  return assets unless order
  if order_column.order_by_value?
    assets = assets.sort_by do |asset|
      order_column.order_by_value(asset, self)
    end
    descending? ? assets.reverse : assets
  else
    if descending?
      if order_column.order_desc
        apply_asc_order(assets, order_column.order_desc)
      else
        apply_desc_order(assets, order_column.order)
      end
    else
      apply_asc_order(assets, order_column.order)
    end
  end
end
check_order_valid!() click to toggle source
# File lib/datagrid/ordering.rb, line 86
def check_order_valid!
  return unless order
  column = column_by_name(order)
  unless column
    self.class.order_unsupported(order, "no column #{order} in #{self.class}")
  end
  unless column.supports_order?
    self.class.order_unsupported(column.name, "column don't support order" )
  end
end
reverse_order(assets) click to toggle source
# File lib/datagrid/ordering.rb, line 113
def reverse_order(assets)
  driver.reverse_order(assets)
rescue NotImplementedError
  self.class.order_unsupported(order_column.name, "Your ORM do not support reverse order: please specify :order_desc option manually")
end