lib/ransack/helpers/form_helper.rb in ransack-1.6.6 vs lib/ransack/helpers/form_helper.rb in ransack-1.7.0

- old
+ new

@@ -13,26 +13,21 @@ search.klass, format: options.delete(:format) ) elsif record.is_a?(Array) && (search = record.detect { |o| o.is_a?(Ransack::Search) }) options[:url] ||= polymorphic_path( - record.map { |o| o.is_a?(Ransack::Search) ? o.klass : o }, - format: options.delete(:format) + options_for(record), format: options.delete(:format) ) else raise ArgumentError, 'No Ransack::Search object was provided to search_form_for!' end options[:html] ||= {} html_options = { - :class => options[:class].present? ? - "#{options[:class]}" : - "#{search.klass.to_s.underscore}_search", - :id => options[:id].present? ? - "#{options[:id]}" : - "#{search.klass.to_s.underscore}_search", - :method => :get + class: html_option_for(options[:class], search), + id: html_option_for(options[:id], search), + method: :get } options[:as] ||= Ransack.options[:search_key] options[:html].reverse_merge!(html_options) options[:builder] ||= FormBuilder @@ -52,10 +47,30 @@ link_to(s.name, url(routing_proxy, s.url_options), s.html_options(args)) end private + def options_for(record) + record.map &method(:parse_record) + end + + def parse_record(object) + if object.is_a?(Ransack::Search) + object.klass + else + object + end + end + + def html_option_for(option, search) + if option.present? + option.to_s + else + "#{search.klass.to_s.underscore}_search" + end + end + def extract_search_and_routing_proxy(search) if search.is_a? Array [search.second, search.first] else [search, nil] @@ -73,18 +88,16 @@ class SortLink def initialize(search, attribute, args, params) @search = search @params = params @field = attribute.to_s - sort_fields = extract_sort_fields_and_mutate_args!(args).compact + @sort_fields = extract_sort_fields_and_mutate_args!(args).compact @current_dir = existing_sort_direction @label_text = extract_label_and_mutate_args!(args) @options = extract_options_and_mutate_args!(args) @hide_indicator = @options.delete :hide_indicator @default_order = @options.delete :default_order - @sort_params = build_sort(sort_fields) - @sort_params = @sort_params.first if @sort_params.size == 1 end def name [ERB::Util.h(@label_text), order_indicator] .compact @@ -98,14 +111,14 @@ @search.context.search_key => search_and_sort_params)) end def html_options(args) html_options = extract_options_and_mutate_args!(args) - html_options.merge(class: - [[Constants::SORT_LINK, @current_dir], html_options[:class]] - .compact.join(Constants::SPACE) - ) + html_options.merge( + class: [[Constants::SORT_LINK, @current_dir], html_options[:class]] + .compact.join(Constants::SPACE) + ) end private def extract_sort_fields_and_mutate_args!(args) @@ -118,11 +131,11 @@ def extract_label_and_mutate_args!(args) if args.first.is_a? String args.shift else - Translate.attribute(@field, :context => @search.context) + Translate.attribute(@field, context: @search.context) end end def extract_options_and_mutate_args!(args) if args.first.is_a? Hash @@ -131,20 +144,29 @@ {} end end def search_and_sort_params - search_params.merge(:s => @sort_params) + search_params.merge(s: sort_params) end def search_params @params[@search.context.search_key].presence || {} end - def build_sort(fields) + def sort_params + sort_array = recursive_sort_params_build(@sort_fields) + if sort_array.size == 1 + sort_array.first + else + sort_array + end + end + + def recursive_sort_params_build(fields) return [] if fields.empty? - [parse_sort(fields[0])] + build_sort(fields.drop(1)) + [parse_sort(fields[0])] + recursive_sort_params_build(fields.drop 1) end def parse_sort(field) attr_name, new_dir = field.to_s.split(/\s+/) if no_sort_direction_specified?(new_dir) @@ -152,12 +174,11 @@ end "#{attr_name} #{new_dir}" end def detect_previous_sort_direction_and_invert_it(attr_name) - sort_dir = existing_sort_direction(attr_name) - if sort_dir + if sort_dir = existing_sort_direction(attr_name) direction_text(sort_dir) else default_sort_order(attr_name) || Constants::ASC end end @@ -167,10 +188,14 @@ sort.dir end end def default_sort_order(attr_name) - Hash === @default_order ? @default_order[attr_name] : @default_order + if Hash === @default_order + @default_order[attr_name] + else + @default_order + end end def order_indicator if @hide_indicator || no_sort_direction_specified? nil