Module: SampleFilter::ActionViewExtension

Defined in:
lib/sample_filter/action_view_extension.rb

Constant Summary collapse

FORM_DEFAULT_AS =
:sample_filter
TRANSLATE_PREFIX =
'sample_filter'

Instance Method Summary collapse

Instance Method Details

#form_for_filter(filter_class, options = {}, &block) ⇒ Object



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/sample_filter/action_view_extension.rb', line 6

def form_for_filter(filter_class, options = {}, &block)
  options[:as] ||= FORM_DEFAULT_AS
  options[:block] ||= :after
  options[:html] ||= {}
  options[:html][:method] ||= :get
  options[:html][:id] ||= :sample_filter
  options[:url] ||= url_for(
    :controller => controller.controller_name,
    :action => controller.action_name
  )

  filter_params_set = filter_class.filter_params_set
  filter_params_set.update_attributes(params[options[:as]])

  prefix = filter_class.to_s.underscore
   :div, id: 'sample-filter__wrap' do
    form_for(filter_params_set, options) do |form|
      buffer = ActiveSupport::SafeBuffer.new
      buffer << capture(&block) if block_given? && options[:block].eql?(:before)
      filter_params_set.fields.each do |field|
        buffer <<
          if filter_params_set.hidden_input?(field)
            form.hidden_field field
          else
            type = filter_params_set.type_of(field)
            (:div, class: "sample-filter__form-item #{field}") do
              (:div, form.label(field, sft(prefix, :fields, field)), class: 'sample-filter__form-label') +
              (:div, send("#{type}_tag", form, prefix, filter_params_set, field), class: 'sample-filter__form-input-wrap')
            end
          end
      end
      buffer << capture(&block) if block_given? && options[:block].eql?(:after)
      buffer + action_buttons(prefix)
    end
  end
end


43
44
45
46
47
48
49
50
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
# File 'lib/sample_filter/action_view_extension.rb', line 43

def sort_link(filter_class, sorting_field, form_as = FORM_DEFAULT_AS)
  sorting_field = sorting_field.to_s
  filter_params_set = filter_class.filter_params_set
  sorting_key = filter_params_set.sorting_key
  values = filter_params_set.values_for(sorting_key)
  return unless values.include?(sorting_field)

  default_value = filter_params_set.default_value_for(sorting_key)
  query_param = params[form_as]
  if query_param && query_param[sorting_key]
    query_param_sort_key = query_param[sorting_key][/\A(.*)_(asc|desc)\z/, 1]
    param_set = params.require(form_as).permit!
    if query_param_sort_key == sorting_field
      sort_direction = query_param[sorting_key][/\A(.*)_(asc|desc)\z/, 2]
      if sort_direction == 'asc'
        link_to('', url_for(form_as => param_set.merge({sorting_key => "#{sorting_field}_desc"})), class: 'sample_filter__sort_link asc')
      else
        link_to('', url_for(form_as => param_set.merge({sorting_key => "#{sorting_field}_asc"})), class: 'sample_filter__sort_link desc')
      end
    else
      link_to('', url_for(form_as => param_set.merge({sorting_key => "#{sorting_field}_desc"})), class: 'sample_filter__sort_link neutral')
    end
  else
    default_field = default_value[/\A(.*)_(asc|desc)\z/, 1] if default_value
    if sorting_field == default_field
      sort_direction = default_value[/\A(.*)_(asc|desc)\z/, 2]
      if sort_direction == 'asc'
        link_to('', url_for(form_as => {sorting_key => "#{sorting_field}_desc"}), class: 'sample_filter__sort_link asc')
      else
        link_to('', url_for(form_as => {sorting_key => "#{sorting_field}_asc"}), class: 'sample_filter__sort_link desc')
      end
    else
      link_to('', url_for(form_as => {sorting_key => "#{sorting_field}_desc"}), class: 'sample_filter__sort_link neutral')
    end
  end
end