2011-03-30 20:31:39 -04:00
|
|
|
module Ransack
|
|
|
|
module Helpers
|
|
|
|
module FormHelper
|
2011-08-13 16:36:40 -04:00
|
|
|
|
2011-03-30 20:31:39 -04:00
|
|
|
def search_form_for(record, options = {}, &proc)
|
|
|
|
if record.is_a?(Ransack::Search)
|
|
|
|
search = record
|
2014-04-18 04:49:38 -04:00
|
|
|
options[:url] ||= polymorphic_path(
|
|
|
|
search.klass, format: options.delete(:format)
|
|
|
|
)
|
2013-12-10 13:18:17 -05:00
|
|
|
elsif record.is_a?(Array) &&
|
|
|
|
(search = record.detect { |o| o.is_a?(Ransack::Search) })
|
2013-08-04 09:13:41 -04:00
|
|
|
options[:url] ||= polymorphic_path(
|
2014-04-18 04:49:38 -04:00
|
|
|
record.map { |o| o.is_a?(Ransack::Search) ? o.klass : o },
|
|
|
|
format: options.delete(:format)
|
2013-12-10 13:18:17 -05:00
|
|
|
)
|
2011-03-30 20:31:39 -04:00
|
|
|
else
|
2013-08-04 09:13:41 -04:00
|
|
|
raise ArgumentError,
|
|
|
|
"No Ransack::Search object was provided to search_form_for!"
|
2011-03-30 20:31:39 -04:00
|
|
|
end
|
|
|
|
options[:html] ||= {}
|
|
|
|
html_options = {
|
2014-05-01 09:55:39 -04:00
|
|
|
:class => options[:class].present? ?
|
2013-12-10 13:18:17 -05:00
|
|
|
"#{options[:class]}" :
|
|
|
|
"#{search.klass.to_s.underscore}_search",
|
2014-05-01 09:55:39 -04:00
|
|
|
:id => options[:id].present? ?
|
2013-12-10 13:18:17 -05:00
|
|
|
"#{options[:id]}" :
|
|
|
|
"#{search.klass.to_s.underscore}_search",
|
2014-05-01 09:55:39 -04:00
|
|
|
:method => :get
|
2011-03-30 20:31:39 -04:00
|
|
|
}
|
2014-10-09 17:48:38 -04:00
|
|
|
options[:as] ||= Ransack::Constants::DEFAULT_SEARCH_KEY
|
2011-03-30 20:31:39 -04:00
|
|
|
options[:html].reverse_merge!(html_options)
|
|
|
|
options[:builder] ||= FormBuilder
|
|
|
|
|
|
|
|
form_for(record, options, &proc)
|
|
|
|
end
|
|
|
|
|
Add multiple sort field support in sort_link
This patch allows users to sort on multiple fields with the sort_link
helper.
To specify sorting on multiple fields:
sort_link(:kind, [:kind, 'name asc'])
This will create a sort link that sorts first by kind, and then by
name. The first `:kind` parameter ensures that the link generated
shows the sort status of the `kind` field.
When you specify a sort direction in the sort fields array, the
direction is locked to that direction. In the above example, clicking
the resulting link would toggle sorting of the kind field, but the name
field would always sort ascending.
Also added was the ability to specify multiple default_order fields
with a hash:
sort_link(:kind, [:kind, :name],
:default_order => { :name => 'asc', :kind => 'desc' })
Clicking the resulting link will toggle the sort directions of both
`name` and `kind`, sorting the `name` field by default ascending, and
the `kind` field descending.
2014-09-30 18:58:33 -04:00
|
|
|
# sort_link @q, :name, [:name, 'kind ASC'], 'Player Name'
|
2011-08-13 16:36:40 -04:00
|
|
|
def sort_link(search, attribute, *args)
|
2012-03-28 15:00:19 -04:00
|
|
|
# Extract out a routing proxy for url_for scoping later
|
|
|
|
if search.is_a?(Array)
|
|
|
|
routing_proxy = search.shift
|
|
|
|
search = search.first
|
|
|
|
end
|
|
|
|
|
2013-12-10 13:18:17 -05:00
|
|
|
raise TypeError, "First argument must be a Ransack::Search!" unless
|
|
|
|
Search === search
|
2011-08-13 16:36:40 -04:00
|
|
|
|
Add multiple sort field support in sort_link
This patch allows users to sort on multiple fields with the sort_link
helper.
To specify sorting on multiple fields:
sort_link(:kind, [:kind, 'name asc'])
This will create a sort link that sorts first by kind, and then by
name. The first `:kind` parameter ensures that the link generated
shows the sort status of the `kind` field.
When you specify a sort direction in the sort fields array, the
direction is locked to that direction. In the above example, clicking
the resulting link would toggle sorting of the kind field, but the name
field would always sort ascending.
Also added was the ability to specify multiple default_order fields
with a hash:
sort_link(:kind, [:kind, :name],
:default_order => { :name => 'asc', :kind => 'desc' })
Clicking the resulting link will toggle the sort directions of both
`name` and `kind`, sorting the `name` field by default ascending, and
the `kind` field descending.
2014-09-30 18:58:33 -04:00
|
|
|
# This is the field that this link represents. The direction of the sort icon (up/down arrow) will
|
|
|
|
# depend on the sort status of this field
|
|
|
|
field_name = attribute.to_s
|
|
|
|
|
|
|
|
# Determine the fields we want to sort on
|
|
|
|
sort_fields = if Array === args.first
|
|
|
|
args.shift
|
|
|
|
else
|
|
|
|
Array(field_name)
|
|
|
|
end
|
|
|
|
|
2014-10-03 14:54:20 -04:00
|
|
|
label_text =
|
2014-10-06 23:25:21 -04:00
|
|
|
if String === args.first
|
|
|
|
args.shift.to_s
|
|
|
|
else
|
|
|
|
Translate.attribute(field_name, :context => search.context)
|
|
|
|
end
|
Add multiple sort field support in sort_link
This patch allows users to sort on multiple fields with the sort_link
helper.
To specify sorting on multiple fields:
sort_link(:kind, [:kind, 'name asc'])
This will create a sort link that sorts first by kind, and then by
name. The first `:kind` parameter ensures that the link generated
shows the sort status of the `kind` field.
When you specify a sort direction in the sort fields array, the
direction is locked to that direction. In the above example, clicking
the resulting link would toggle sorting of the kind field, but the name
field would always sort ascending.
Also added was the ability to specify multiple default_order fields
with a hash:
sort_link(:kind, [:kind, :name],
:default_order => { :name => 'asc', :kind => 'desc' })
Clicking the resulting link will toggle the sort directions of both
`name` and `kind`, sorting the `name` field by default ascending, and
the `kind` field descending.
2014-09-30 18:58:33 -04:00
|
|
|
|
|
|
|
options = args.first.is_a?(Hash) ? args.shift.dup : {}
|
|
|
|
default_order = options.delete :default_order
|
2014-10-03 14:58:22 -04:00
|
|
|
default_order_is_a_hash = Hash === default_order
|
2014-10-03 14:54:20 -04:00
|
|
|
|
Add multiple sort field support in sort_link
This patch allows users to sort on multiple fields with the sort_link
helper.
To specify sorting on multiple fields:
sort_link(:kind, [:kind, 'name asc'])
This will create a sort link that sorts first by kind, and then by
name. The first `:kind` parameter ensures that the link generated
shows the sort status of the `kind` field.
When you specify a sort direction in the sort fields array, the
direction is locked to that direction. In the above example, clicking
the resulting link would toggle sorting of the kind field, but the name
field would always sort ascending.
Also added was the ability to specify multiple default_order fields
with a hash:
sort_link(:kind, [:kind, :name],
:default_order => { :name => 'asc', :kind => 'desc' })
Clicking the resulting link will toggle the sort directions of both
`name` and `kind`, sorting the `name` field by default ascending, and
the `kind` field descending.
2014-09-30 18:58:33 -04:00
|
|
|
# If the default order is a hash of fields, duplicate it and let us access it with strings or symbols
|
2014-10-03 14:54:20 -04:00
|
|
|
default_order = default_order.dup.with_indifferent_access if
|
2014-10-03 14:58:22 -04:00
|
|
|
default_order_is_a_hash
|
Add multiple sort field support in sort_link
This patch allows users to sort on multiple fields with the sort_link
helper.
To specify sorting on multiple fields:
sort_link(:kind, [:kind, 'name asc'])
This will create a sort link that sorts first by kind, and then by
name. The first `:kind` parameter ensures that the link generated
shows the sort status of the `kind` field.
When you specify a sort direction in the sort fields array, the
direction is locked to that direction. In the above example, clicking
the resulting link would toggle sorting of the kind field, but the name
field would always sort ascending.
Also added was the ability to specify multiple default_order fields
with a hash:
sort_link(:kind, [:kind, :name],
:default_order => { :name => 'asc', :kind => 'desc' })
Clicking the resulting link will toggle the sort directions of both
`name` and `kind`, sorting the `name` field by default ascending, and
the `kind` field descending.
2014-09-30 18:58:33 -04:00
|
|
|
|
2014-05-13 01:06:53 -04:00
|
|
|
search_params = params[search.context.search_key].presence ||
|
2013-12-10 13:18:17 -05:00
|
|
|
{}.with_indifferent_access
|
2011-08-13 16:36:40 -04:00
|
|
|
|
Add multiple sort field support in sort_link
This patch allows users to sort on multiple fields with the sort_link
helper.
To specify sorting on multiple fields:
sort_link(:kind, [:kind, 'name asc'])
This will create a sort link that sorts first by kind, and then by
name. The first `:kind` parameter ensures that the link generated
shows the sort status of the `kind` field.
When you specify a sort direction in the sort fields array, the
direction is locked to that direction. In the above example, clicking
the resulting link would toggle sorting of the kind field, but the name
field would always sort ascending.
Also added was the ability to specify multiple default_order fields
with a hash:
sort_link(:kind, [:kind, :name],
:default_order => { :name => 'asc', :kind => 'desc' })
Clicking the resulting link will toggle the sort directions of both
`name` and `kind`, sorting the `name` field by default ascending, and
the `kind` field descending.
2014-09-30 18:58:33 -04:00
|
|
|
# Find the current direction (if there is one) of the primary sort field
|
|
|
|
if existing_sort = search.sorts.detect { |s| s.name == field_name }
|
|
|
|
field_current_dir = existing_sort.dir
|
|
|
|
end
|
2011-08-13 16:36:40 -04:00
|
|
|
|
Add multiple sort field support in sort_link
This patch allows users to sort on multiple fields with the sort_link
helper.
To specify sorting on multiple fields:
sort_link(:kind, [:kind, 'name asc'])
This will create a sort link that sorts first by kind, and then by
name. The first `:kind` parameter ensures that the link generated
shows the sort status of the `kind` field.
When you specify a sort direction in the sort fields array, the
direction is locked to that direction. In the above example, clicking
the resulting link would toggle sorting of the kind field, but the name
field would always sort ascending.
Also added was the ability to specify multiple default_order fields
with a hash:
sort_link(:kind, [:kind, :name],
:default_order => { :name => 'asc', :kind => 'desc' })
Clicking the resulting link will toggle the sort directions of both
`name` and `kind`, sorting the `name` field by default ascending, and
the `kind` field descending.
2014-09-30 18:58:33 -04:00
|
|
|
sort_params = []
|
|
|
|
|
|
|
|
Array(sort_fields).each do |sort_field|
|
|
|
|
attr_name, new_dir = sort_field.to_s.downcase.split(/\s+/)
|
|
|
|
current_dir = nil
|
|
|
|
|
|
|
|
# if the user didn't specify the sort direction, detect the previous
|
|
|
|
# sort direction on this field and reverse it
|
2014-10-09 17:48:38 -04:00
|
|
|
if Ransack::Constants::ASC_DESC.none? { |d| d == new_dir }
|
Add multiple sort field support in sort_link
This patch allows users to sort on multiple fields with the sort_link
helper.
To specify sorting on multiple fields:
sort_link(:kind, [:kind, 'name asc'])
This will create a sort link that sorts first by kind, and then by
name. The first `:kind` parameter ensures that the link generated
shows the sort status of the `kind` field.
When you specify a sort direction in the sort fields array, the
direction is locked to that direction. In the above example, clicking
the resulting link would toggle sorting of the kind field, but the name
field would always sort ascending.
Also added was the ability to specify multiple default_order fields
with a hash:
sort_link(:kind, [:kind, :name],
:default_order => { :name => 'asc', :kind => 'desc' })
Clicking the resulting link will toggle the sort directions of both
`name` and `kind`, sorting the `name` field by default ascending, and
the `kind` field descending.
2014-09-30 18:58:33 -04:00
|
|
|
if existing_sort = search.sorts.detect { |s| s.name == attr_name }
|
|
|
|
current_dir = existing_sort.dir
|
|
|
|
end
|
|
|
|
|
2014-10-03 14:54:20 -04:00
|
|
|
new_dir =
|
2014-10-09 17:48:38 -04:00
|
|
|
if current_dir
|
|
|
|
if current_dir == Ransack::Constants::DESC
|
|
|
|
Ransack::Constants::ASC
|
|
|
|
else
|
|
|
|
Ransack::Constants::DESC
|
|
|
|
end
|
|
|
|
elsif default_order_is_a_hash
|
|
|
|
default_order[attr_name] || Ransack::Constants::ASC
|
|
|
|
else
|
|
|
|
default_order || Ransack::Constants::ASC
|
|
|
|
end
|
2013-12-10 13:18:17 -05:00
|
|
|
end
|
2011-08-13 16:36:40 -04:00
|
|
|
|
Add multiple sort field support in sort_link
This patch allows users to sort on multiple fields with the sort_link
helper.
To specify sorting on multiple fields:
sort_link(:kind, [:kind, 'name asc'])
This will create a sort link that sorts first by kind, and then by
name. The first `:kind` parameter ensures that the link generated
shows the sort status of the `kind` field.
When you specify a sort direction in the sort fields array, the
direction is locked to that direction. In the above example, clicking
the resulting link would toggle sorting of the kind field, but the name
field would always sort ascending.
Also added was the ability to specify multiple default_order fields
with a hash:
sort_link(:kind, [:kind, :name],
:default_order => { :name => 'asc', :kind => 'desc' })
Clicking the resulting link will toggle the sort directions of both
`name` and `kind`, sorting the `name` field by default ascending, and
the `kind` field descending.
2014-09-30 18:58:33 -04:00
|
|
|
sort_params << "#{attr_name} #{new_dir}"
|
2011-08-13 16:36:40 -04:00
|
|
|
end
|
|
|
|
|
Add multiple sort field support in sort_link
This patch allows users to sort on multiple fields with the sort_link
helper.
To specify sorting on multiple fields:
sort_link(:kind, [:kind, 'name asc'])
This will create a sort link that sorts first by kind, and then by
name. The first `:kind` parameter ensures that the link generated
shows the sort status of the `kind` field.
When you specify a sort direction in the sort fields array, the
direction is locked to that direction. In the above example, clicking
the resulting link would toggle sorting of the kind field, but the name
field would always sort ascending.
Also added was the ability to specify multiple default_order fields
with a hash:
sort_link(:kind, [:kind, :name],
:default_order => { :name => 'asc', :kind => 'desc' })
Clicking the resulting link will toggle the sort directions of both
`name` and `kind`, sorting the `name` field by default ascending, and
the `kind` field descending.
2014-09-30 18:58:33 -04:00
|
|
|
# if there is only one sort parameter, remove it from the array and just
|
|
|
|
# use the string as the parameter
|
2014-10-03 14:54:20 -04:00
|
|
|
sort_params = sort_params.first if sort_params.size == 1
|
2011-08-13 16:36:40 -04:00
|
|
|
|
|
|
|
html_options = args.first.is_a?(Hash) ? args.shift.dup : {}
|
2014-10-09 17:48:38 -04:00
|
|
|
css = [Ransack::Constants::SORT_LINK, field_current_dir]
|
|
|
|
.compact.join(Ransack::Constants::SPACE)
|
|
|
|
html_options[:class] = [css, html_options[:class]]
|
|
|
|
.compact.join(Ransack::Constants::SPACE)
|
2014-10-03 14:54:20 -04:00
|
|
|
|
2012-04-11 11:58:27 -04:00
|
|
|
query_hash = {}
|
2013-12-10 13:18:17 -05:00
|
|
|
query_hash[search.context.search_key] = search_params
|
Add multiple sort field support in sort_link
This patch allows users to sort on multiple fields with the sort_link
helper.
To specify sorting on multiple fields:
sort_link(:kind, [:kind, 'name asc'])
This will create a sort link that sorts first by kind, and then by
name. The first `:kind` parameter ensures that the link generated
shows the sort status of the `kind` field.
When you specify a sort direction in the sort fields array, the
direction is locked to that direction. In the above example, clicking
the resulting link would toggle sorting of the kind field, but the name
field would always sort ascending.
Also added was the ability to specify multiple default_order fields
with a hash:
sort_link(:kind, [:kind, :name],
:default_order => { :name => 'asc', :kind => 'desc' })
Clicking the resulting link will toggle the sort directions of both
`name` and `kind`, sorting the `name` field by default ascending, and
the `kind` field descending.
2014-09-30 18:58:33 -04:00
|
|
|
.merge(:s => sort_params)
|
2012-04-11 11:58:27 -04:00
|
|
|
options.merge!(query_hash)
|
2014-10-03 18:44:28 -04:00
|
|
|
options_for_url = params.merge(options)
|
2012-03-07 14:31:13 -05:00
|
|
|
|
2014-10-03 14:54:20 -04:00
|
|
|
url =
|
|
|
|
if routing_proxy && respond_to?(routing_proxy)
|
2013-07-22 09:23:39 -04:00
|
|
|
send(routing_proxy).url_for(options_for_url)
|
2012-04-02 16:13:35 -04:00
|
|
|
else
|
2013-07-22 09:23:39 -04:00
|
|
|
url_for(options_for_url)
|
2012-04-02 16:13:35 -04:00
|
|
|
end
|
2012-03-28 15:00:19 -04:00
|
|
|
|
2014-10-03 14:54:20 -04:00
|
|
|
name = link_name(label_text, field_current_dir)
|
|
|
|
|
|
|
|
link_to(name, url, html_options)
|
2011-08-13 16:36:40 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
|
2014-10-03 14:54:20 -04:00
|
|
|
def link_name(label_text, dir)
|
|
|
|
[ERB::Util.h(label_text), order_indicator_for(dir)]
|
|
|
|
.compact
|
2014-10-09 17:48:38 -04:00
|
|
|
.join(Ransack::Constants::NON_BREAKING_SPACE)
|
2014-10-03 14:54:20 -04:00
|
|
|
.html_safe
|
|
|
|
end
|
|
|
|
|
|
|
|
def order_indicator_for(dir)
|
2014-10-09 17:48:38 -04:00
|
|
|
if dir == Ransack::Constants::ASC
|
|
|
|
Ransack::Constants::ASC_ARROW
|
|
|
|
elsif dir == Ransack::Constants::DESC
|
|
|
|
Ransack::Constants::DESC_ARROW
|
2011-08-13 16:36:40 -04:00
|
|
|
else
|
|
|
|
nil
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2011-03-30 20:31:39 -04:00
|
|
|
end
|
|
|
|
end
|
2012-04-11 11:58:27 -04:00
|
|
|
end
|