Module: PhiltreRails::PhiltreViewHelpers

Defined in:
lib/philtre-rails/philtre_view_helpers.rb

Instance Method Summary collapse

Instance Method Details

can be overridden



15
16
17
# File 'lib/philtre-rails/philtre_view_helpers.rb', line 15

def default_order_link_class
  OrderLink
end

#order_by(filter, *fields, label: fields.first.to_s.titleize, order_link_class: default_order_link_class) ⇒ Object

Heavily modified from SearchLogic.



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/philtre-rails/philtre_view_helpers.rb', line 20

def order_by( filter, *fields, label: fields.first.to_s.titleize, order_link_class: default_order_link_class )
  return label if filter.nil?

  # current ordering from the filter
  # each expr is a Sequel::SQL::Expression
  exprs = Hash[ filter.order_expressions ]

  # Invert each ordering for the generated link. Current sort order will be displayed.
  order_links = fields.map do |field|
    if exprs[field]
      order_link_class.new exprs[field].invert, active: true
    else
      order_link_class.new Sequel.asc(field)
    end
  end

  # filter params must have order in the right format
  filter_params = filter.filter_parameters.dup
  filter_params[:order] = unify_array( order_links.map( &:name ) )

  params_hash = {filter.class::Model.model_name.param_key.to_sym => filter_params}
  link_text = raw( [label, order_links.first.andand.icon].compact.join(' ') )
  link_to link_text, params_hash, {class: order_links.first.andand.css_class}
end

#unify_array(ary) ⇒ Object

There is a nicer way to do this, but it means monkey-patching Array. Which upsets some folks.



6
7
8
9
10
11
12
# File 'lib/philtre-rails/philtre_view_helpers.rb', line 6

def unify_array( ary )
  case ary.size
  when 0; nil
  when 1; ary.first
  else; ary
  end
end