module Datagrid::Ordering
Module adds support for ordering by defined columns for Datagrid
.
Public Class Methods
Source
# File lib/datagrid/ordering.rb, line 13 def self.included(base) base.extend ClassMethods base.class_eval do include Datagrid::Columns datagrid_attribute :order do |value| value.to_sym if value.present? end datagrid_attribute :descending do |value| Datagrid::Utils.booleanize(value) end alias_method :descending?, :descending end end
@!visibility private
Public Instance Methods
Source
# File lib/datagrid/ordering.rb, line 66 def assets check_order_valid! apply_order(super) end
@!visibility private
Calls superclass method
Datagrid::Columns#assets
Source
# File lib/datagrid/ordering.rb, line 79 def order_column order ? column_by_name(order) : nil end
@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", ...>
Source
# File lib/datagrid/ordering.rb, line 86 def ordered_by?(column, desc = nil) order_column == column_by_name(column) && (desc.nil? || (desc ? descending? : !descending?)) end
@param column [String, Datagrid::Columns::Column
] @param desc [nil, Boolean] confirm order direction as well if specified @return [Boolean] true if given grid is ordered by given column.
Private Instance Methods
Source
# File lib/datagrid/ordering.rb, line 122 def apply_asc_order(assets, order) if order.respond_to?(:call) apply_block_order(assets, order) else driver.asc(assets, order) end end
Source
# File lib/datagrid/ordering.rb, line 145 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
Source
# File lib/datagrid/ordering.rb, line 130 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
Source
# File lib/datagrid/ordering.rb, line 93 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 elsif 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
Source
# File lib/datagrid/ordering.rb, line 112 def check_order_valid! return unless order column = column_by_name(order) self.class.order_unsupported(order, "no column #{order} in #{self.class}") unless column return if column.supports_order? self.class.order_unsupported(column.name, "column don't support order") end
Source
# File lib/datagrid/ordering.rb, line 138 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