activerecord-hackery--ransack/lib/ransack/helpers/form_helper.rb

103 lines
3.1 KiB
Ruby
Raw Normal View History

2011-03-31 00:31:39 +00:00
module Ransack
module Helpers
module FormHelper
2011-03-31 00:31:39 +00:00
def search_form_for(record, options = {}, &proc)
if record.is_a?(Ransack::Search)
search = record
options[:url] ||= polymorphic_path(search.klass)
2013-08-04 13:13:41 +00:00
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 }
)
2011-03-31 00:31:39 +00:00
else
2013-08-04 13:13:41 +00:00
raise ArgumentError,
"No Ransack::Search object was provided to search_form_for!"
2011-03-31 00:31:39 +00:00
end
options[:html] ||= {}
html_options = {
2013-08-04 13:13:41 +00:00
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
2011-03-31 00:31:39 +00:00
}
options[:as] ||= 'q'
2011-03-31 00:31:39 +00:00
options[:html].reverse_merge!(html_options)
options[:builder] ||= FormBuilder
form_for(record, options, &proc)
end
def sort_link(search, attribute, *args)
# Extract out a routing proxy for url_for scoping later
if search.is_a?(Array)
routing_proxy = search.shift
search = search.first
end
2013-08-04 13:13:41 +00:00
raise TypeError,
"First argument must be a Ransack::Search!" unless Search === search
2013-08-04 13:13:41 +00:00
search_params = params[search.context.
search_key] || {}.with_indifferent_access
attr_name = attribute.to_s
2013-08-04 13:13:41 +00:00
name = (args.size > 0 && !args.first.is_a?(Hash)
) ? args.shift.to_s : Translate.
attribute(attr_name, context: search.context)
2013-08-04 13:13:41 +00:00
if existing_sort = search.sorts.detect { |s| s.name == attr_name }
prev_attr, prev_dir = existing_sort.name, existing_sort.dir
end
options = args.first.is_a?(Hash) ? args.shift.dup : {}
default_order = options.delete :default_order
current_dir = prev_attr == attr_name ? prev_dir : nil
if current_dir
new_dir = current_dir == 'desc' ? 'asc' : 'desc'
else
new_dir = default_order || 'asc'
end
html_options = args.first.is_a?(Hash) ? args.shift.dup : {}
css = ['sort_link', current_dir].compact.join(' ')
html_options[:class] = [css, html_options[:class]].compact.join(' ')
query_hash = {}
2013-08-04 13:13:41 +00:00
query_hash[search.context.search_key] = search_params.
merge(s: "#{attr_name} #{new_dir}")
options.merge!(query_hash)
2013-07-22 13:23:39 +00:00
options_for_url = params.merge options
url = if routing_proxy && respond_to?(routing_proxy)
2013-07-22 13:23:39 +00:00
send(routing_proxy).url_for(options_for_url)
else
2013-07-22 13:23:39 +00:00
url_for(options_for_url)
end
2013-08-04 13:13:41 +00:00
link_to [ERB::Util.h(name),
order_indicator_for(current_dir)].compact.join(' ').html_safe,
url,
html_options
end
private
def order_indicator_for(order)
if order == 'asc'
'▲'
elsif order == 'desc'
'▼'
else
nil
end
end
2011-03-31 00:31:39 +00:00
end
end
end