searchgasm 0.9.10 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +2 -0
- data/Manifest +10 -3
- data/README.rdoc +13 -9
- data/lib/searchgasm/config.rb +1 -78
- data/lib/searchgasm/helpers/control_types/link.rb +198 -0
- data/lib/searchgasm/helpers/control_types/links.rb +149 -0
- data/lib/searchgasm/helpers/control_types/remote_link.rb +86 -0
- data/lib/searchgasm/helpers/control_types/remote_links.rb +69 -0
- data/lib/searchgasm/helpers/control_types/remote_select.rb +33 -0
- data/lib/searchgasm/helpers/control_types/select.rb +78 -0
- data/lib/searchgasm/helpers/control_types.rb +41 -0
- data/lib/searchgasm/helpers/{form_helper.rb → form.rb} +51 -16
- data/lib/searchgasm/helpers/utilities.rb +59 -0
- data/lib/searchgasm/helpers.rb +3 -0
- data/lib/searchgasm/search/ordering.rb +1 -1
- data/lib/searchgasm/version.rb +3 -3
- data/lib/searchgasm.rb +8 -3
- data/searchgasm.gemspec +23 -9
- metadata +22 -8
- data/lib/searchgasm/helpers/search_helper.rb +0 -192
- data/lib/searchgasm/helpers/utilities_helper.rb +0 -125
data/CHANGELOG
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
v1.0.0. Major changes in the helpers, they were completely re-engineered. Much nicer and cleaner now. I established a pattern between all helpers giving you complete flexibility as to how they are used. All helpers are called differently now (see documentation).
|
2
|
+
|
1
3
|
v0.9.10. Hardened more tests, fixed bug with setting the per_page configuration to only take effect on protected searches, thus staying out of the way of normal searching.
|
2
4
|
|
3
5
|
v0.9.9. Fixed setting per_page to nil, false, or ''. This is done to "show all" results.
|
data/Manifest
CHANGED
@@ -22,9 +22,16 @@ lib/searchgasm/condition/tree.rb
|
|
22
22
|
lib/searchgasm/conditions/base.rb
|
23
23
|
lib/searchgasm/conditions/protection.rb
|
24
24
|
lib/searchgasm/config.rb
|
25
|
-
lib/searchgasm/helpers/
|
26
|
-
lib/searchgasm/helpers/
|
27
|
-
lib/searchgasm/helpers/
|
25
|
+
lib/searchgasm/helpers/control_types/link.rb
|
26
|
+
lib/searchgasm/helpers/control_types/links.rb
|
27
|
+
lib/searchgasm/helpers/control_types/remote_link.rb
|
28
|
+
lib/searchgasm/helpers/control_types/remote_links.rb
|
29
|
+
lib/searchgasm/helpers/control_types/remote_select.rb
|
30
|
+
lib/searchgasm/helpers/control_types/select.rb
|
31
|
+
lib/searchgasm/helpers/control_types.rb
|
32
|
+
lib/searchgasm/helpers/form.rb
|
33
|
+
lib/searchgasm/helpers/utilities.rb
|
34
|
+
lib/searchgasm/helpers.rb
|
28
35
|
lib/searchgasm/search/base.rb
|
29
36
|
lib/searchgasm/search/conditions.rb
|
30
37
|
lib/searchgasm/search/ordering.rb
|
data/README.rdoc
CHANGED
@@ -84,19 +84,21 @@ Your view:
|
|
84
84
|
|
85
85
|
%table
|
86
86
|
%tr
|
87
|
-
%th=
|
88
|
-
%th=
|
89
|
-
%th=
|
87
|
+
%th= order_by_link :account => :name
|
88
|
+
%th= order_by_link :first_name
|
89
|
+
%th= order_by_link :last_name
|
90
|
+
%th= order_by_link :email
|
90
91
|
- @users.each do |user|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
92
|
+
%tr
|
93
|
+
%td= user.account? ? user.account.name : "-"
|
94
|
+
%td= user.first_name
|
95
|
+
%td= user.last_name
|
96
|
+
%td= user.email
|
95
97
|
|
96
98
|
Per page:
|
97
|
-
=
|
99
|
+
= per_page_select
|
98
100
|
Page:
|
99
|
-
=
|
101
|
+
= page_select
|
100
102
|
|
101
103
|
<b>{See my tutorial on this example}(http://www.binarylogic.com/2008/9/7/tutorial-pagination-ordering-and-searching-with-searchgasm)</b>
|
102
104
|
|
@@ -253,6 +255,8 @@ If there is one thing we all know, it's to always use protection against SQL inj
|
|
253
255
|
search = Account.new_search!(params[:search])
|
254
256
|
conditions = Account.new_conditions!(params[:conditions])
|
255
257
|
|
258
|
+
I'm sure you already knew this, but it's tempting to do this when you can pass the params hash right into these methods.
|
259
|
+
|
256
260
|
Lesson learned: use new\_search and new\_conditions when passing in params as *ANY* of the options.
|
257
261
|
|
258
262
|
== Available Conditions
|
data/lib/searchgasm/config.rb
CHANGED
@@ -43,31 +43,6 @@ module Searchgasm
|
|
43
43
|
@desc_indicator = value
|
44
44
|
end
|
45
45
|
|
46
|
-
def pages_text # :nodoc:
|
47
|
-
@set_pages_text ? @pages_text : "Page %p"
|
48
|
-
end
|
49
|
-
|
50
|
-
# The default value for the :text options in the pages helper.
|
51
|
-
#
|
52
|
-
# * <tt>Default:</tt> "Page %p"
|
53
|
-
# * <tt>Accepts:</tt> "Your string %p": where %p is replaced by the page number, or a block: Proc.new { |p| "Page #{p}" }
|
54
|
-
def pages_text=(value)
|
55
|
-
@set_pages_text = true
|
56
|
-
@pages_text
|
57
|
-
end
|
58
|
-
|
59
|
-
def pages_type # :nodoc:
|
60
|
-
@pages_type ||= :select
|
61
|
-
end
|
62
|
-
|
63
|
-
# The default value for the :type option in the pages helper.
|
64
|
-
#
|
65
|
-
# * <tt>Default:</tt> :select
|
66
|
-
# * <tt>Accepts:</tt> :select, :links
|
67
|
-
def pages_type=(value)
|
68
|
-
@pages_type = value.to_sym
|
69
|
-
end
|
70
|
-
|
71
46
|
def per_page # :nodoc:
|
72
47
|
@per_page
|
73
48
|
end
|
@@ -95,69 +70,17 @@ module Searchgasm
|
|
95
70
|
@per_page_choices = value
|
96
71
|
end
|
97
72
|
|
98
|
-
def per_page_type # :nodoc:
|
99
|
-
@per_page_type ||= :select
|
100
|
-
end
|
101
|
-
|
102
|
-
# The default value for the :type option in the per_page helper.
|
103
|
-
#
|
104
|
-
# * <tt>Default:</tt> :select
|
105
|
-
# * <tt>Accepts:</tt> :select, :links
|
106
|
-
def per_page_type=(value)
|
107
|
-
@per_page_type = value.to_sym
|
108
|
-
end
|
109
|
-
|
110
73
|
def hidden_fields # :nodoc:
|
111
74
|
@hidden_fields ||= (Search::Base::SPECIAL_FIND_OPTIONS - [:page])
|
112
75
|
end
|
113
76
|
|
114
|
-
# Which hidden fields to automatically include when creating a form with a Searchgasm object. See Searchgasm::Helpers::
|
77
|
+
# Which hidden fields to automatically include when creating a form with a Searchgasm object. See Searchgasm::Helpers::Form for more info.
|
115
78
|
#
|
116
79
|
# * <tt>Default:</tt> [:order_by, :order_as, :per_page]
|
117
80
|
# * <tt>Accepts:</tt> Array, nil, false
|
118
81
|
def hidden_fields=(value)
|
119
82
|
@hidden_fields = value
|
120
83
|
end
|
121
|
-
|
122
|
-
def remote_helpers # :nodoc:
|
123
|
-
@remote_helpers ||= false
|
124
|
-
end
|
125
|
-
|
126
|
-
# Tells all helpers to default to using remote links (AJAX) instead of normal links.
|
127
|
-
#
|
128
|
-
# * <tt>Default:</tt> false
|
129
|
-
# * <tt>Accepts:</tt> Boolean
|
130
|
-
#
|
131
|
-
# nil means "Show all"
|
132
|
-
def remote_helpers=(value)
|
133
|
-
@remote_helpers = value
|
134
|
-
end
|
135
|
-
|
136
|
-
def remote_helpers? # :nodoc:
|
137
|
-
remote_helpers == true
|
138
|
-
end
|
139
|
-
|
140
|
-
def search_scope # :nodoc:
|
141
|
-
|
142
|
-
end
|
143
|
-
|
144
|
-
def search_obj_name # :nodoc:
|
145
|
-
@search_obj_name ||= :@search
|
146
|
-
end
|
147
|
-
|
148
|
-
# The instance variable name you use to assign your search to. This allows the helpers to grab your Searchgasm object without having
|
149
|
-
# to specify it everywhere.
|
150
|
-
#
|
151
|
-
# * <tt>Default:</tt> :@search
|
152
|
-
# * <tt>Accepts:</tt> String or Symbol.
|
153
|
-
#
|
154
|
-
# === Examples
|
155
|
-
#
|
156
|
-
# config.search_obj_name = :@search
|
157
|
-
# config.search_obj_name = "@search"
|
158
|
-
def search_obj_name=(value)
|
159
|
-
@search_obj_name = value
|
160
|
-
end
|
161
84
|
end
|
162
85
|
end
|
163
86
|
end
|
@@ -0,0 +1,198 @@
|
|
1
|
+
module Searchgasm
|
2
|
+
module Helpers
|
3
|
+
module ControlTypes
|
4
|
+
# = Link Control Types
|
5
|
+
#
|
6
|
+
# These helpers make ordering and paginating your data a breeze in your view. They only produce links.
|
7
|
+
module Link
|
8
|
+
# Creates a link for ordering data by a column or columns
|
9
|
+
#
|
10
|
+
# === Example uses for a User class that has many orders
|
11
|
+
#
|
12
|
+
# order_by_link(:first_name)
|
13
|
+
# order_by_link([:first_name, :last_name])
|
14
|
+
# order_by_link({:orders => :total})
|
15
|
+
# order_by_link([{:orders => :total}, :first_name])
|
16
|
+
# order_by_link(:id, :text => "Order Number", :html => {:class => "order_number"})
|
17
|
+
#
|
18
|
+
# What's nifty about this is that the value gets "serialized", if it is not a string or a symbol, so that it can be passed via a param in the url. Searchgasm will automatically try to "unserializes" this value and use it. This allows you
|
19
|
+
# to pass complex objects besides strings and symbols, such as arrays and hashes. All of the hard work is done for you.
|
20
|
+
#
|
21
|
+
# Another thing to keep in mind is that this will alternate between "asc" and "desc" each time it is clicked.
|
22
|
+
#
|
23
|
+
# === Options
|
24
|
+
# * <tt>:text</tt> -- default: column_name.to_s.humanize, text for the link
|
25
|
+
# * <tt>:desc_indicator</tt> -- default: ▼, the indicator that this column is descending
|
26
|
+
# * <tt>:asc_indicator</tt> -- default: ▲, the indicator that this column is ascending
|
27
|
+
# * <tt>:html</tt> -- html arrtributes for the <a> tag.
|
28
|
+
#
|
29
|
+
# === Advanced Options
|
30
|
+
# * <tt>:params_scope</tt> -- default: :search, this is the scope in which your search params will be preserved (params[:search]). If you don't want a scope and want your options to be at base leve in params such as params[:page], params[:per_page], etc, then set this to nil.
|
31
|
+
# * <tt>:search_obj</tt> -- default: @#{params_scope}, this is your search object, everything revolves around this. It will try to infer the name from your params_scope. If your params_scope is :search it will try to get @search, etc. If it can not be inferred by this, you need to pass the object itself.
|
32
|
+
def order_by_link(order_by, options = {})
|
33
|
+
order_by = deep_stringify(order_by)
|
34
|
+
add_order_by_link_defaults!(order_by, options)
|
35
|
+
html = searchgasm_state_for(:order_by, options) + searchgasm_state_for(:order_as, options)
|
36
|
+
|
37
|
+
if !options[:is_remote]
|
38
|
+
html += link_to(options[:text], options[:url], options[:html])
|
39
|
+
else
|
40
|
+
html += link_to_remote(options[:text], options[:remote].merge(:url => options[:url]), options[:html])
|
41
|
+
end
|
42
|
+
|
43
|
+
html
|
44
|
+
end
|
45
|
+
|
46
|
+
# Creates a link for ascending or descending data, pretty self e
|
47
|
+
#
|
48
|
+
# === Example uses
|
49
|
+
#
|
50
|
+
# order_as_link("asc")
|
51
|
+
# order_as_link("desc")
|
52
|
+
# order_as_link("asc", :text => "Ascending", :html => {:class => "ascending"})
|
53
|
+
#
|
54
|
+
# === Options
|
55
|
+
# * <tt>:text</tt> -- default: column_name.to_s.humanize, text for the link
|
56
|
+
# * <tt>:html</tt> -- html arrtributes for the <a> tag.
|
57
|
+
#
|
58
|
+
# === Advanced Options
|
59
|
+
# * <tt>:params_scope</tt> -- default: :search, this is the scope in which your search params will be preserved (params[:search]). If you don't want a scope and want your options to be at base leve in params such as params[:page], params[:per_page], etc, then set this to nil.
|
60
|
+
# * <tt>:search_obj</tt> -- default: @#{params_scope}, this is your search object, everything revolves around this. It will try to infer the name from your params_scope. If your params_scope is :search it will try to get @search, etc. If it can not be inferred by this, you need to pass the object itself.
|
61
|
+
def order_as_link(order_as, options = {})
|
62
|
+
add_order_as_link_defaults!(order_as, options)
|
63
|
+
html = searchgasm_state_for(:order_as, options)
|
64
|
+
|
65
|
+
if !options[:is_remote]
|
66
|
+
html += link_to(options[:text], options[:url], options[:html])
|
67
|
+
else
|
68
|
+
html += link_to_remote(options[:text], options[:remote].merge(:url => options[:url]), options[:html])
|
69
|
+
end
|
70
|
+
|
71
|
+
html
|
72
|
+
end
|
73
|
+
|
74
|
+
# Creates a link for limiting how many items are on each page
|
75
|
+
#
|
76
|
+
# === Example uses
|
77
|
+
#
|
78
|
+
# per_page_link(200)
|
79
|
+
# per_page_link(nil) # => Show all
|
80
|
+
# per_page_link(nil, :text => "All", :html => {:class => "show_all"})
|
81
|
+
#
|
82
|
+
# As you can see above, passing nil means "show all" and the text will automatically revert to "show all"
|
83
|
+
#
|
84
|
+
# === Options
|
85
|
+
# * <tt>:text</tt> -- default: column_name.to_s.humanize, text for the link
|
86
|
+
# * <tt>:html</tt> -- html arrtributes for the <a> tag.
|
87
|
+
#
|
88
|
+
# === Advanced Options
|
89
|
+
# * <tt>:params_scope</tt> -- default: :search, this is the scope in which your search params will be preserved (params[:search]). If you don't want a scope and want your options to be at base leve in params such as params[:page], params[:per_page], etc, then set this to nil.
|
90
|
+
# * <tt>:search_obj</tt> -- default: @#{params_scope}, this is your search object, everything revolves around this. It will try to infer the name from your params_scope. If your params_scope is :search it will try to get @search, etc. If it can not be inferred by this, you need to pass the object itself.
|
91
|
+
def per_page_link(per_page, options = {})
|
92
|
+
add_per_page_link_defaults!(per_page, options)
|
93
|
+
html = searchgasm_state_for(:per_page, options)
|
94
|
+
|
95
|
+
if !options[:is_remote]
|
96
|
+
html += link_to(options[:text], options[:url], options[:html])
|
97
|
+
else
|
98
|
+
html += link_to_remote(options[:text], options[:remote].merge(:url => options[:url]), options[:html])
|
99
|
+
end
|
100
|
+
|
101
|
+
html
|
102
|
+
end
|
103
|
+
|
104
|
+
# Creates a link for changing to a sepcific page of your data
|
105
|
+
#
|
106
|
+
# === Example uses
|
107
|
+
#
|
108
|
+
# page_link(2)
|
109
|
+
# page_link(1)
|
110
|
+
# page_link(5, :text => "Fifth page", :html => {:class => "fifth_page"})
|
111
|
+
#
|
112
|
+
# === Options
|
113
|
+
# * <tt>:text</tt> -- default: column_name.to_s.humanize, text for the link
|
114
|
+
# * <tt>:html</tt> -- html arrtributes for the <a> tag.
|
115
|
+
#
|
116
|
+
# === Advanced Options
|
117
|
+
# * <tt>:params_scope</tt> -- default: :search, this is the scope in which your search params will be preserved (params[:search]). If you don't want a scope and want your options to be at base leve in params such as params[:page], params[:per_page], etc, then set this to nil.
|
118
|
+
# * <tt>:search_obj</tt> -- default: @#{params_scope}, this is your search object, everything revolves around this. It will try to infer the name from your params_scope. If your params_scope is :search it will try to get @search, etc. If it can not be inferred by this, you need to pass the object itself.
|
119
|
+
def page_link(page, options = {})
|
120
|
+
add_page_link_defaults!(page, options)
|
121
|
+
html = searchgasm_state_for(:page, options)
|
122
|
+
|
123
|
+
if !options[:is_remote]
|
124
|
+
html += link_to(options[:text], options[:url], options[:html])
|
125
|
+
else
|
126
|
+
html += link_to_remote(options[:text], options[:remote].merge(:url => options[:url]), options[:html])
|
127
|
+
end
|
128
|
+
|
129
|
+
html
|
130
|
+
end
|
131
|
+
|
132
|
+
private
|
133
|
+
def add_order_by_link_defaults!(order_by, options = {})
|
134
|
+
add_searchgasm_helper_defaults!(:order_by, options)
|
135
|
+
options[:text] ||= determine_order_by_text(order_by)
|
136
|
+
options[:asc_indicator] ||= Config.asc_indicator
|
137
|
+
options[:desc_indicator] ||= Config.desc_indicator
|
138
|
+
options[:text] += options[:search_obj].desc? ? options[:desc_indicator] : options[:asc_indicator] if options[:search_obj].order_by == order_by
|
139
|
+
url_hash = searchgasm_url_hash(:order_by, order_by, options)
|
140
|
+
url_hash[:order_as] = (options[:search_obj].order_by == order_by && options[:search_obj].asc?) ? "DESC" : "ASC"
|
141
|
+
options[:url] = searchgasm_url(url_hash, options)
|
142
|
+
options
|
143
|
+
end
|
144
|
+
|
145
|
+
def add_order_as_link_defaults!(order_as, options = {})
|
146
|
+
add_searchgasm_helper_defaults!(:order_as, options)
|
147
|
+
options[:text] ||= order_as.to_s
|
148
|
+
options[:url] = searchgasm_url(searchgasm_url_hash(:order_as, order_as, options), options)
|
149
|
+
options
|
150
|
+
end
|
151
|
+
|
152
|
+
def add_per_page_link_defaults!(per_page, options = {})
|
153
|
+
add_searchgasm_helper_defaults!(:per_page, options)
|
154
|
+
options[:text] ||= per_page.blank? ? "Show all" : "#{per_page} per page"
|
155
|
+
options[:url] = searchgasm_url(searchgasm_url_hash(:per_page, per_page, options), options)
|
156
|
+
options
|
157
|
+
end
|
158
|
+
|
159
|
+
def add_page_link_defaults!(page, options = {})
|
160
|
+
add_searchgasm_helper_defaults!(:page, options)
|
161
|
+
options[:text] ||= page.to_s
|
162
|
+
options[:url] = searchgasm_url(searchgasm_url_hash(:page, page, options), options)
|
163
|
+
options
|
164
|
+
end
|
165
|
+
|
166
|
+
def determine_order_by_text(column_name, relationship_name = nil)
|
167
|
+
case column_name
|
168
|
+
when String, Symbol
|
169
|
+
relationship_name.blank? ? column_name.to_s.titleize : "#{relationship_name.to_s.titleize} #{column_name.to_s.titleize}"
|
170
|
+
when Array
|
171
|
+
determine_order_by_text(column_name.first)
|
172
|
+
when Hash
|
173
|
+
k = column_name.keys.first
|
174
|
+
v = column_name.values.first
|
175
|
+
determine_order_by_text(v, k)
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
def deep_stringify(obj)
|
180
|
+
case obj
|
181
|
+
when String
|
182
|
+
obj
|
183
|
+
when Symbol
|
184
|
+
obj = obj.to_s
|
185
|
+
when Array
|
186
|
+
obj = obj.collect { |item| deep_stringify(item) }
|
187
|
+
when Hash
|
188
|
+
new_obj = {}
|
189
|
+
obj.each { |key, value| new_obj[key.to_s] = deep_stringify(value) }
|
190
|
+
new_obj
|
191
|
+
end
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
ActionController::Base.helper Searchgasm::Helpers::ControlTypes::Link if defined?(ActionController)
|
@@ -0,0 +1,149 @@
|
|
1
|
+
module Searchgasm
|
2
|
+
module Helpers
|
3
|
+
module ControlTypes
|
4
|
+
module Links
|
5
|
+
# Creates a group of links that order the data by a column or columns. All that this does is loop through the :choices option and call order_by_link and then glue it all together.
|
6
|
+
#
|
7
|
+
# === Examples
|
8
|
+
#
|
9
|
+
# order_by_links
|
10
|
+
# order_by_links(:choices => [:name, {:orders => {:line_items => :total}}, :email])
|
11
|
+
#
|
12
|
+
# === Options
|
13
|
+
#
|
14
|
+
# Please look at order_by_link. All options there are applicable here and are passed onto each option.
|
15
|
+
#
|
16
|
+
# * <tt>:choices</tt> -- default: the models column names, the choices to loop through when calling order_by_link
|
17
|
+
def order_by_links(options = {})
|
18
|
+
add_order_by_links_defaults!(options)
|
19
|
+
link_options = options.dup
|
20
|
+
link_options.delete(:choices)
|
21
|
+
html = ""
|
22
|
+
options[:choices].each { |choice| html += order_by_link(choice, link_options.dup) }
|
23
|
+
html
|
24
|
+
end
|
25
|
+
|
26
|
+
# Creates a group of links that ascend or descend the data. All that this does is loop through the :choices option and call order_as_link and then glue it all together.
|
27
|
+
#
|
28
|
+
# === Examples
|
29
|
+
#
|
30
|
+
# order_as_links
|
31
|
+
# order_as_links(:choices => [:ascending, :descending])
|
32
|
+
#
|
33
|
+
# === Options
|
34
|
+
#
|
35
|
+
# Please look at order_as_link. All options there are applicable here and are passed onto each option.
|
36
|
+
#
|
37
|
+
# * <tt>:choices</tt> -- default: ["asc", "desc"], the choices to loop through when calling order_as_link
|
38
|
+
def order_as_links(options = {})
|
39
|
+
add_order_as_links_defaults!(options)
|
40
|
+
link_options = options.dup
|
41
|
+
link_options.delete(:choices)
|
42
|
+
html = ""
|
43
|
+
options[:choices].each { |choice| html += order_as_link(choice, link_options.dup) }
|
44
|
+
html
|
45
|
+
end
|
46
|
+
|
47
|
+
# Creates a group of links that limit how many items are on each page. All that this does is loop through the :choices option and call per_page_link and then glue it all together.
|
48
|
+
#
|
49
|
+
# === Examples
|
50
|
+
#
|
51
|
+
# per_page_links
|
52
|
+
# per_page_links(:choices => [25, 50, nil])
|
53
|
+
#
|
54
|
+
# === Options
|
55
|
+
#
|
56
|
+
# Please look at per_page_link. All options there are applicable here and are passed onto each option.
|
57
|
+
#
|
58
|
+
# * <tt>:choices</tt> -- default: [10, 25, 50, 100, 150, 200, nil], the choices to loop through when calling per_page_link.
|
59
|
+
def per_page_links(options = {})
|
60
|
+
add_per_page_links_defaults!(options)
|
61
|
+
link_options = options.dup
|
62
|
+
link_options.delete(:choices)
|
63
|
+
html = ""
|
64
|
+
options[:choices].each { |choice| html += per_page_link(choice, link_options.dup) }
|
65
|
+
html
|
66
|
+
end
|
67
|
+
|
68
|
+
# Creates a group of links that paginate through the data. Kind of like a flickr page navigation. This one has some nifty options.
|
69
|
+
#
|
70
|
+
# === Examples
|
71
|
+
#
|
72
|
+
# page_links
|
73
|
+
# page_links(:choices => [25, 50, nil])
|
74
|
+
#
|
75
|
+
# === Options
|
76
|
+
#
|
77
|
+
# Please look at per_page_link. All options there are applicable here and are passed onto each option.
|
78
|
+
#
|
79
|
+
# * <tt>:spread</tt> -- default: 3, how many choices available on each side of the current page
|
80
|
+
# * <tt>:prev</tt> -- default: <, set to nil to omit. This is an extra link on the left side of the page links that will go to the previous page
|
81
|
+
# * <tt>:next</tt> -- default: >, set to nil to omit. This is an extra link on the right side of the page links that will go to the next page
|
82
|
+
# * <tt>:first</tt> -- default: <<, set to nil to omit. This is an extra link on thefar left side of the page links that will go to the first page
|
83
|
+
# * <tt>:last</tt> -- default: >>, set to nil to omit. This is an extra link on the far right side of the page links that will go to the last page
|
84
|
+
def page_links(options = {})
|
85
|
+
add_page_links_defaults!(options)
|
86
|
+
|
87
|
+
current_page = options[:search_obj].page
|
88
|
+
page_start = 0
|
89
|
+
page_end = 0
|
90
|
+
if !options[:spread].blank?
|
91
|
+
page_start = current_page - options[:spread]
|
92
|
+
page_start = options[:choices].first unless options[:choices].include?(page_start)
|
93
|
+
page_end = current_page + options[:spread]
|
94
|
+
page_end = options[:choices].last unless options[:choices].include?(page_end)
|
95
|
+
else
|
96
|
+
page_start = options[:choices].first
|
97
|
+
page_end = options[:choices].last
|
98
|
+
end
|
99
|
+
|
100
|
+
|
101
|
+
link_options = options.dup
|
102
|
+
[:choices, :spread, :prev, :next, :first, :last].each { |option| link_options.delete(option) }
|
103
|
+
html = ""
|
104
|
+
(page_start..page_end).each { |choice| html += page_link(choice, link_options.dup) }
|
105
|
+
html
|
106
|
+
end
|
107
|
+
|
108
|
+
private
|
109
|
+
def add_order_by_links_defaults!(options)
|
110
|
+
add_searchgasm_helper_defaults!(:order_by, options)
|
111
|
+
options[:choices] ||= options[:search_obj].klass.column_names.map(&:humanize)
|
112
|
+
options
|
113
|
+
end
|
114
|
+
|
115
|
+
def add_order_as_links_defaults!(options)
|
116
|
+
add_searchgasm_helper_defaults!(:order_as, options)
|
117
|
+
options[:choices] = [:asc, :desc]
|
118
|
+
options
|
119
|
+
end
|
120
|
+
|
121
|
+
def add_per_page_links_defaults!(options)
|
122
|
+
add_searchgasm_helper_defaults!(:per_page, options)
|
123
|
+
options[:choices] ||= Config.per_page_choices.dup
|
124
|
+
if !options[:search_obj].per_page.blank? && !options[:choices].include?(options[:search_obj].per_page)
|
125
|
+
options[:choices] << options[:search_obj].per_page
|
126
|
+
has_nil = options[:choices].include?(nil)
|
127
|
+
options[:choices].compact!
|
128
|
+
options[:choices].sort!
|
129
|
+
options[:choices] << nil if has_nil
|
130
|
+
end
|
131
|
+
options
|
132
|
+
end
|
133
|
+
|
134
|
+
def add_page_links_defaults!(options)
|
135
|
+
add_searchgasm_helper_defaults!(:page, options)
|
136
|
+
options[:choices] ||= (1..options[:search_obj].page_count)
|
137
|
+
options[:spead] ||= 3
|
138
|
+
options[:prev] ||= "<"
|
139
|
+
options[:next] ||= ">"
|
140
|
+
options[:first] ||= "<<"
|
141
|
+
options[:last] ||= ">>"
|
142
|
+
options
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
ActionController::Base.helper Searchgasm::Helpers::ControlTypes::Links if defined?(ActionController)
|
@@ -0,0 +1,86 @@
|
|
1
|
+
module Searchgasm
|
2
|
+
module Helpers
|
3
|
+
module ControlTypes
|
4
|
+
# = Remote Link Control Types
|
5
|
+
#
|
6
|
+
# These helpers use rails built in remote_function as links.
|
7
|
+
module RemoteLink
|
8
|
+
# The same thing as order_by_link but instead of using rails link_to it uses link_to_remote
|
9
|
+
#
|
10
|
+
# === Examples
|
11
|
+
#
|
12
|
+
# remote_order_by_link
|
13
|
+
# remote_order_by_link(:remote => {:update => "users"})
|
14
|
+
#
|
15
|
+
# === Options
|
16
|
+
#
|
17
|
+
# Please look at order_by_link, this accepts the same options with the following addition:
|
18
|
+
#
|
19
|
+
# * <tt>:remote</tt> -- default: {}, the options to pass into link_to_remote remote options. Such as :update => {:success => "alert('success')"}
|
20
|
+
def remote_order_by_link(order_by, options = {})
|
21
|
+
add_remote_defaults!(options)
|
22
|
+
order_by_link(order_by, options)
|
23
|
+
end
|
24
|
+
|
25
|
+
# The same thing as order_as_link but instead of using rails link_to it uses link_to_remote
|
26
|
+
#
|
27
|
+
# === Examples
|
28
|
+
#
|
29
|
+
# remote_order_as_link
|
30
|
+
# remote_order_as_link(:remote => {:update => "users"})
|
31
|
+
#
|
32
|
+
# === Options
|
33
|
+
#
|
34
|
+
# Please look at order_as_link, this accepts the same options with the following addition:
|
35
|
+
#
|
36
|
+
# * <tt>:remote</tt> -- default: {}, the options to pass into link_to_remote remote options. Such as :update => {:success => "alert('success')"}
|
37
|
+
def remote_order_as_link(order_as, options = {})
|
38
|
+
add_remote_defaults!(options)
|
39
|
+
order_as_link(order_as, options)
|
40
|
+
end
|
41
|
+
|
42
|
+
# The same thing as per_page_link but instead of using rails link_to it uses link_to_remote
|
43
|
+
#
|
44
|
+
# === Examples
|
45
|
+
#
|
46
|
+
# remote_per_page_link
|
47
|
+
# remote_per_page_link(:remote => {:update => "users"})
|
48
|
+
#
|
49
|
+
# === Options
|
50
|
+
#
|
51
|
+
# Please look at per_page_link, this accepts the same options with the following addition:
|
52
|
+
#
|
53
|
+
# * <tt>:remote</tt> -- default: {}, the options to pass into link_to_remote remote options. Such as :update => {:success => "alert('success')"}
|
54
|
+
def remote_per_page_link(per_page, options = {})
|
55
|
+
add_remote_defaults!(options)
|
56
|
+
per_page_link(per_page, options)
|
57
|
+
end
|
58
|
+
|
59
|
+
# The same thing as page_link but instead of using rails link_to it uses link_to_remote
|
60
|
+
#
|
61
|
+
# === Examples
|
62
|
+
#
|
63
|
+
# remote_page_link
|
64
|
+
# remote_page_link(:remote => {:update => "users"})
|
65
|
+
#
|
66
|
+
# === Options
|
67
|
+
#
|
68
|
+
# Please look at page_link, this accepts the same options with the following addition:
|
69
|
+
#
|
70
|
+
# * <tt>:remote</tt> -- default: {}, the options to pass into link_to_remote remote options. Such as :update => {:success => "alert('success')"}
|
71
|
+
def remote_page_link(page, options = {})
|
72
|
+
add_remote_defaults!(options)
|
73
|
+
page_link(page, options)
|
74
|
+
end
|
75
|
+
|
76
|
+
private
|
77
|
+
def add_remote_defaults!(options)
|
78
|
+
options[:remote] ||= {}
|
79
|
+
options[:is_remote] = true
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
ActionController::Base.helper Searchgasm::Helpers::ControlTypes::RemoteLink if defined?(ActionController)
|
@@ -0,0 +1,69 @@
|
|
1
|
+
module Searchgasm
|
2
|
+
module Helpers
|
3
|
+
module ControlTypes
|
4
|
+
module RemoteLinks
|
5
|
+
# Same as order_by_links, but uses link_to_remote instead of remote.
|
6
|
+
#
|
7
|
+
# === Examples
|
8
|
+
#
|
9
|
+
# remote_order_by_links
|
10
|
+
# remote_order_by_links(:remote => {:update => "users"})
|
11
|
+
#
|
12
|
+
# === Options
|
13
|
+
#
|
14
|
+
# Please look at remote_order_by_link and order_by_links. All options there are applicable here. This is just a wrapper method for those 2 methods.
|
15
|
+
def remote_order_by_links(options = {})
|
16
|
+
add_remote_defaults!(options)
|
17
|
+
order_by_links(options)
|
18
|
+
end
|
19
|
+
|
20
|
+
# Same as order_as_links, but uses link_to_remote instead of remote.
|
21
|
+
#
|
22
|
+
# === Examples
|
23
|
+
#
|
24
|
+
# remote_order_as_links
|
25
|
+
# remote_order_as_links(:remote => {:update => "users"})
|
26
|
+
#
|
27
|
+
# === Options
|
28
|
+
#
|
29
|
+
# Please look at remote_order_as_link and order_as_links. All options there are applicable here. This is just a wrapper method for those 2 methods.
|
30
|
+
def remote_order_as_links(options = {})
|
31
|
+
add_remote_defaults!(options)
|
32
|
+
order_as_link(options)
|
33
|
+
end
|
34
|
+
|
35
|
+
# Same as per_page_links, but uses link_to_remote instead of remote.
|
36
|
+
#
|
37
|
+
# === Examples
|
38
|
+
#
|
39
|
+
# remote_per_page_links
|
40
|
+
# remote_per_page_links(:remote => {:update => "users"})
|
41
|
+
#
|
42
|
+
# === Options
|
43
|
+
#
|
44
|
+
# Please look at remote_per_page_link and per_page_links. All options there are applicable here. This is just a wrapper method for those 2 methods.
|
45
|
+
def remote_per_page_links(options = {})
|
46
|
+
add_remote_defaults!(options)
|
47
|
+
per_page_links(options)
|
48
|
+
end
|
49
|
+
|
50
|
+
# Same as page_links, but uses link_to_remote instead of remote.
|
51
|
+
#
|
52
|
+
# === Examples
|
53
|
+
#
|
54
|
+
# remote_page_links
|
55
|
+
# remote_page_links(:remote => {:update => "users"})
|
56
|
+
#
|
57
|
+
# === Options
|
58
|
+
#
|
59
|
+
# Please look at remote_page_link and page_links. All options there are applicable here. This is just a wrapper method for those 2 methods.
|
60
|
+
def remote_page_links(options = {})
|
61
|
+
add_remote_defaults!(options)
|
62
|
+
page_links(options)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
ActionController::Base.helper Searchgasm::Helpers::ControlTypes::RemoteLinks if defined?(ActionController)
|