ransack 1.6.6 → 2.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.gitignore +3 -0
- data/.travis.yml +35 -53
- data/CHANGELOG.md +530 -9
- data/CONTRIBUTING.md +63 -26
- data/Gemfile +24 -24
- data/README.md +371 -96
- data/Rakefile +6 -29
- data/lib/polyamorous/activerecord_5.2_ruby_2/join_association.rb +24 -0
- data/lib/polyamorous/activerecord_5.2_ruby_2/join_dependency.rb +79 -0
- data/lib/polyamorous/activerecord_5.2_ruby_2/reflection.rb +11 -0
- data/lib/polyamorous/activerecord_6.0_ruby_2/join_association.rb +1 -0
- data/lib/polyamorous/activerecord_6.0_ruby_2/join_dependency.rb +80 -0
- data/lib/polyamorous/activerecord_6.0_ruby_2/reflection.rb +1 -0
- data/lib/polyamorous/activerecord_6.1_ruby_2/join_association.rb +74 -0
- data/lib/polyamorous/activerecord_6.1_ruby_2/join_dependency.rb +93 -0
- data/lib/polyamorous/activerecord_6.1_ruby_2/reflection.rb +1 -0
- data/lib/polyamorous/join.rb +70 -0
- data/lib/polyamorous/polyamorous.rb +24 -0
- data/lib/polyamorous/swapping_reflection_class.rb +11 -0
- data/lib/polyamorous/tree_node.rb +7 -0
- data/lib/ransack/adapters/active_record/base.rb +23 -2
- data/lib/ransack/adapters/active_record/context.rb +206 -139
- data/lib/ransack/adapters/active_record/ransack/constants.rb +70 -55
- data/lib/ransack/adapters/active_record/ransack/context.rb +10 -18
- data/lib/ransack/adapters/active_record/ransack/nodes/condition.rb +43 -36
- data/lib/ransack/adapters/active_record/ransack/translate.rb +1 -5
- data/lib/ransack/adapters/active_record/ransack/visitor.rb +23 -0
- data/lib/ransack/adapters/active_record.rb +11 -10
- data/lib/ransack/adapters.rb +64 -0
- data/lib/ransack/configuration.rb +91 -4
- data/lib/ransack/constants.rb +13 -26
- data/lib/ransack/context.rb +45 -40
- data/lib/ransack/helpers/form_builder.rb +21 -12
- data/lib/ransack/helpers/form_helper.rb +99 -69
- data/lib/ransack/locale/ar.yml +70 -0
- data/lib/ransack/locale/az.yml +70 -0
- data/lib/ransack/locale/bg.yml +70 -0
- data/lib/ransack/locale/ca.yml +70 -0
- data/lib/ransack/locale/da.yml +70 -0
- data/lib/ransack/locale/de.yml +70 -0
- data/lib/ransack/locale/el.yml +70 -0
- data/lib/ransack/locale/es.yml +22 -22
- data/lib/ransack/locale/fa.yml +70 -0
- data/lib/ransack/locale/fi.yml +71 -0
- data/lib/ransack/locale/id.yml +70 -0
- data/lib/ransack/locale/it.yml +70 -0
- data/lib/ransack/locale/ja.yml +70 -0
- data/lib/ransack/locale/nl.yml +4 -4
- data/lib/ransack/locale/pt-BR.yml +70 -0
- data/lib/ransack/locale/ru.yml +70 -0
- data/lib/ransack/locale/sk.yml +70 -0
- data/lib/ransack/locale/tr.yml +70 -0
- data/lib/ransack/locale/{zh.yml → zh-CN.yml} +13 -13
- data/lib/ransack/locale/zh-TW.yml +70 -0
- data/lib/ransack/nodes/attribute.rb +6 -3
- data/lib/ransack/nodes/bindable.rb +18 -6
- data/lib/ransack/nodes/condition.rb +85 -24
- data/lib/ransack/nodes/grouping.rb +17 -11
- data/lib/ransack/nodes/sort.rb +9 -5
- data/lib/ransack/nodes/value.rb +74 -68
- data/lib/ransack/nodes.rb +2 -3
- data/lib/ransack/predicate.rb +17 -20
- data/lib/ransack/search.rb +15 -15
- data/lib/ransack/translate.rb +115 -115
- data/lib/ransack/version.rb +1 -1
- data/lib/ransack/visitor.rb +1 -12
- data/lib/ransack.rb +11 -17
- data/logo/ransack-h.png +0 -0
- data/logo/ransack-h.svg +34 -0
- data/logo/ransack-v.png +0 -0
- data/logo/ransack-v.svg +34 -0
- data/logo/ransack.png +0 -0
- data/logo/ransack.svg +21 -0
- data/ransack.gemspec +9 -27
- data/spec/console.rb +4 -0
- data/spec/helpers/polyamorous_helper.rb +19 -0
- data/spec/polyamorous/join_association_spec.rb +35 -0
- data/spec/polyamorous/join_dependency_spec.rb +97 -0
- data/spec/polyamorous/join_spec.rb +19 -0
- data/spec/ransack/adapters/active_record/base_spec.rb +380 -91
- data/spec/ransack/adapters/active_record/context_spec.rb +72 -33
- data/spec/ransack/configuration_spec.rb +87 -14
- data/spec/ransack/helpers/form_builder_spec.rb +2 -11
- data/spec/ransack/helpers/form_helper_spec.rb +481 -113
- data/spec/ransack/nodes/condition_spec.rb +25 -1
- data/spec/ransack/nodes/grouping_spec.rb +62 -6
- data/spec/ransack/predicate_spec.rb +79 -5
- data/spec/ransack/search_spec.rb +159 -79
- data/spec/spec_helper.rb +8 -0
- data/spec/support/schema.rb +99 -37
- metadata +57 -184
- data/lib/ransack/adapters/active_record/3.0/compat.rb +0 -179
- data/lib/ransack/adapters/active_record/3.0/context.rb +0 -205
- data/lib/ransack/adapters/active_record/3.1/context.rb +0 -219
- data/lib/ransack/adapters/active_record/3.2/context.rb +0 -44
- data/lib/ransack/adapters/active_record/compat.rb +0 -14
- data/lib/ransack/adapters/mongoid/3.2/.gitkeep +0 -0
- data/lib/ransack/adapters/mongoid/attributes/attribute.rb +0 -37
- data/lib/ransack/adapters/mongoid/attributes/order_predications.rb +0 -17
- data/lib/ransack/adapters/mongoid/attributes/predications.rb +0 -141
- data/lib/ransack/adapters/mongoid/base.rb +0 -126
- data/lib/ransack/adapters/mongoid/context.rb +0 -208
- data/lib/ransack/adapters/mongoid/inquiry_hash.rb +0 -23
- data/lib/ransack/adapters/mongoid/ransack/constants.rb +0 -88
- data/lib/ransack/adapters/mongoid/ransack/context.rb +0 -60
- data/lib/ransack/adapters/mongoid/ransack/nodes/condition.rb +0 -27
- data/lib/ransack/adapters/mongoid/ransack/translate.rb +0 -13
- data/lib/ransack/adapters/mongoid/ransack/visitor.rb +0 -24
- data/lib/ransack/adapters/mongoid/table.rb +0 -35
- data/lib/ransack/adapters/mongoid.rb +0 -13
- data/spec/mongoid/adapters/mongoid/base_spec.rb +0 -276
- data/spec/mongoid/adapters/mongoid/context_spec.rb +0 -56
- data/spec/mongoid/configuration_spec.rb +0 -102
- data/spec/mongoid/dependencies_spec.rb +0 -8
- data/spec/mongoid/helpers/ransack_helper.rb +0 -11
- data/spec/mongoid/nodes/condition_spec.rb +0 -34
- data/spec/mongoid/nodes/grouping_spec.rb +0 -13
- data/spec/mongoid/predicate_spec.rb +0 -155
- data/spec/mongoid/search_spec.rb +0 -446
- data/spec/mongoid/support/mongoid.yml +0 -6
- data/spec/mongoid/support/schema.rb +0 -128
- data/spec/mongoid/translate_spec.rb +0 -14
- data/spec/mongoid_spec_helper.rb +0 -59
- data/spec/ransack/dependencies_spec.rb +0 -10
@@ -10,7 +10,6 @@ module Ransack
|
|
10
10
|
namespace :admin do
|
11
11
|
resources :comments
|
12
12
|
end
|
13
|
-
get ':controller(/:action(/:id(.:format)))'
|
14
13
|
end
|
15
14
|
|
16
15
|
include router.url_helpers
|
@@ -19,109 +18,124 @@ module Ransack
|
|
19
18
|
before do
|
20
19
|
@controller = ActionView::TestCase::TestController.new
|
21
20
|
@controller.instance_variable_set(:@_routes, router)
|
22
|
-
@controller.class_eval
|
23
|
-
|
24
|
-
end
|
25
|
-
|
26
|
-
@controller.view_context_class.class_eval do
|
27
|
-
include router.url_helpers
|
28
|
-
end
|
21
|
+
@controller.class_eval { include router.url_helpers }
|
22
|
+
@controller.view_context_class.class_eval { include router.url_helpers }
|
29
23
|
end
|
30
24
|
|
31
25
|
describe '#sort_link with default search_key' do
|
32
26
|
subject { @controller.view_context
|
33
27
|
.sort_link(
|
34
|
-
[:main_app, Person.
|
28
|
+
[:main_app, Person.ransack(sorts: ['name desc'])],
|
35
29
|
:name,
|
36
30
|
controller: 'people'
|
37
31
|
)
|
38
32
|
}
|
39
|
-
it {
|
40
|
-
should match(
|
41
|
-
if ActiveRecord::VERSION::STRING =~ /^3\.[1-2]\./
|
42
|
-
/people\?q%5Bs%5D=name\+asc/
|
43
|
-
else
|
44
|
-
/people\?q(%5B|\[)s(%5D|\])=name\+asc/
|
45
|
-
end
|
46
|
-
)
|
47
|
-
}
|
33
|
+
it { should match /people\?q(%5B|\[)s(%5D|\])=name\+asc/ }
|
48
34
|
it { should match /sort_link desc/ }
|
49
35
|
it { should match /Full Name ▼/ }
|
50
36
|
end
|
51
37
|
|
52
|
-
describe '#
|
38
|
+
describe '#sort_url with default search_key' do
|
53
39
|
subject { @controller.view_context
|
54
|
-
.
|
55
|
-
Person.
|
56
|
-
{ sorts: ['name desc'] }, search_key: :people_search
|
57
|
-
),
|
40
|
+
.sort_url(
|
41
|
+
[:main_app, Person.ransack(sorts: ['name desc'])],
|
58
42
|
:name,
|
59
43
|
controller: 'people'
|
60
44
|
)
|
61
45
|
}
|
62
|
-
it {
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
46
|
+
it { should match /people\?q(%5B|\[)s(%5D|\])=name\+asc/ }
|
47
|
+
end
|
48
|
+
|
49
|
+
describe '#sort_link with default search_key defined as symbol' do
|
50
|
+
subject { @controller.view_context
|
51
|
+
.sort_link(
|
52
|
+
Person.ransack({ sorts: ['name desc'] }, search_key: :people_search),
|
53
|
+
:name, controller: 'people'
|
69
54
|
)
|
70
55
|
}
|
56
|
+
it { should match /people\?people_search(%5B|\[)s(%5D|\])=name\+asc/ }
|
71
57
|
end
|
72
58
|
|
73
|
-
describe '#
|
59
|
+
describe '#sort_url with default search_key defined as symbol' do
|
60
|
+
subject { @controller.view_context
|
61
|
+
.sort_url(
|
62
|
+
Person.ransack({ sorts: ['name desc'] }, search_key: :people_search),
|
63
|
+
:name, controller: 'people'
|
64
|
+
)
|
65
|
+
}
|
66
|
+
it { should match /people\?people_search(%5B|\[)s(%5D|\])=name\+asc/ }
|
67
|
+
end
|
68
|
+
|
69
|
+
describe '#sort_link desc through association table defined as symbol' do
|
74
70
|
subject { @controller.view_context
|
75
71
|
.sort_link(
|
76
|
-
Person.
|
72
|
+
Person.ransack({ sorts: 'comments_body asc' }),
|
77
73
|
:comments_body,
|
78
74
|
controller: 'people'
|
79
75
|
)
|
80
76
|
}
|
81
|
-
it {
|
82
|
-
should match(
|
83
|
-
if ActiveRecord::VERSION::STRING =~ /^3\.[1-2]\./
|
84
|
-
/people\?q%5Bs%5D=comments.body\+desc/
|
85
|
-
else
|
86
|
-
/people\?q(%5B|\[)s(%5D|\])=comments.body\+desc/
|
87
|
-
end
|
88
|
-
)
|
89
|
-
}
|
77
|
+
it { should match /people\?q(%5B|\[)s(%5D|\])=comments.body\+desc/ }
|
90
78
|
it { should match /sort_link asc/ }
|
91
79
|
it { should match /Body ▲/ }
|
92
80
|
end
|
93
81
|
|
82
|
+
describe '#sort_url desc through association table defined as symbol' do
|
83
|
+
subject { @controller.view_context
|
84
|
+
.sort_url(
|
85
|
+
Person.ransack({ sorts: 'comments_body asc' }),
|
86
|
+
:comments_body,
|
87
|
+
controller: 'people'
|
88
|
+
)
|
89
|
+
}
|
90
|
+
it { should match /people\?q(%5B|\[)s(%5D|\])=comments.body\+desc/ }
|
91
|
+
end
|
92
|
+
|
94
93
|
describe '#sort_link through association table defined as a string' do
|
95
94
|
subject { @controller.view_context
|
96
95
|
.sort_link(
|
97
|
-
Person.
|
96
|
+
Person.ransack({ sorts: 'comments.body desc' }),
|
98
97
|
'comments.body',
|
99
98
|
controller: 'people'
|
100
99
|
)
|
101
100
|
}
|
102
|
-
it {
|
103
|
-
should match(
|
104
|
-
if ActiveRecord::VERSION::STRING =~ /^3\.[1-2]\./
|
105
|
-
/people\?q%5Bs%5D=comments.body\+asc/
|
106
|
-
else
|
107
|
-
/people\?q(%5B|\[)s(%5D|\])=comments.body\+asc/
|
108
|
-
end
|
109
|
-
)
|
110
|
-
}
|
101
|
+
it { should match /people\?q(%5B|\[)s(%5D|\])=comments.body\+asc/ }
|
111
102
|
it { should match /sort_link desc/ }
|
112
103
|
it { should match /Comments.body ▼/ }
|
113
104
|
end
|
114
105
|
|
106
|
+
describe '#sort_url through association table defined as a string' do
|
107
|
+
subject { @controller.view_context
|
108
|
+
.sort_url(
|
109
|
+
Person.ransack({ sorts: 'comments.body desc' }),
|
110
|
+
'comments.body',
|
111
|
+
controller: 'people'
|
112
|
+
)
|
113
|
+
}
|
114
|
+
it { should match /people\?q(%5B|\[)s(%5D|\])=comments.body\+asc/ }
|
115
|
+
end
|
116
|
+
|
115
117
|
describe '#sort_link works even if search params are a blank string' do
|
116
118
|
before { @controller.view_context.params[:q] = '' }
|
117
119
|
specify {
|
118
120
|
expect { @controller.view_context
|
119
121
|
.sort_link(
|
120
|
-
Person.
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
122
|
+
Person.ransack(@controller.view_context.params[:q]),
|
123
|
+
:name,
|
124
|
+
controller: 'people'
|
125
|
+
)
|
126
|
+
}.not_to raise_error
|
127
|
+
}
|
128
|
+
end
|
129
|
+
|
130
|
+
describe '#sort_url works even if search params are a blank string' do
|
131
|
+
before { @controller.view_context.params[:q] = '' }
|
132
|
+
specify {
|
133
|
+
expect { @controller.view_context
|
134
|
+
.sort_url(
|
135
|
+
Person.ransack(@controller.view_context.params[:q]),
|
136
|
+
:name,
|
137
|
+
controller: 'people'
|
138
|
+
)
|
125
139
|
}.not_to raise_error
|
126
140
|
}
|
127
141
|
end
|
@@ -129,28 +143,32 @@ module Ransack
|
|
129
143
|
describe '#sort_link with search_key defined as a string' do
|
130
144
|
subject { @controller.view_context
|
131
145
|
.sort_link(
|
132
|
-
Person.
|
146
|
+
Person.ransack(
|
133
147
|
{ sorts: ['name desc'] }, search_key: 'people_search'
|
134
148
|
),
|
135
149
|
:name,
|
136
150
|
controller: 'people'
|
137
151
|
)
|
138
152
|
}
|
139
|
-
it {
|
140
|
-
should match(
|
141
|
-
if ActiveRecord::VERSION::STRING =~ /^3\.[1-2]\./
|
142
|
-
/people\?people_search%5Bs%5D=name\+asc/
|
143
|
-
else
|
144
|
-
/people\?people_search(%5B|\[)s(%5D|\])=name\+asc/
|
145
|
-
end
|
146
|
-
)
|
147
|
-
}
|
153
|
+
it { should match /people\?people_search(%5B|\[)s(%5D|\])=name\+asc/ }
|
148
154
|
end
|
149
155
|
|
150
156
|
describe '#sort_link with default_order defined with a string key' do
|
151
157
|
subject { @controller.view_context
|
152
158
|
.sort_link(
|
153
|
-
[:main_app, Person.
|
159
|
+
[:main_app, Person.ransack()],
|
160
|
+
:name,
|
161
|
+
controller: 'people',
|
162
|
+
default_order: 'desc'
|
163
|
+
)
|
164
|
+
}
|
165
|
+
it { should_not match /default_order/ }
|
166
|
+
end
|
167
|
+
|
168
|
+
describe '#sort_url with default_order defined with a string key' do
|
169
|
+
subject { @controller.view_context
|
170
|
+
.sort_url(
|
171
|
+
[:main_app, Person.ransack()],
|
154
172
|
:name,
|
155
173
|
controller: 'people',
|
156
174
|
default_order: 'desc'
|
@@ -162,41 +180,67 @@ module Ransack
|
|
162
180
|
describe '#sort_link with multiple search_keys defined as an array' do
|
163
181
|
subject { @controller.view_context
|
164
182
|
.sort_link(
|
165
|
-
[:main_app, Person.
|
183
|
+
[:main_app, Person.ransack(sorts: ['name desc', 'email asc'])],
|
166
184
|
:name, [:name, 'email DESC'],
|
167
185
|
controller: 'people'
|
168
186
|
)
|
169
187
|
}
|
170
188
|
it {
|
171
|
-
should match(
|
172
|
-
/people\?q(%5B|\[)s(%5D|\])(%5B|\[)(%5D|\])=name\+asc&q(%5B|\[)s(%5D|\])(%5B|\[)(%5D|\])=email\+desc/
|
189
|
+
should match( /people\?q(%5B|\[)s(%5D|\])(%5B|\[)(%5D|\])=name\+asc&q(%5B|\[)s(%5D|\])(%5B|\[)(%5D|\])=email\+desc/
|
173
190
|
)
|
174
191
|
}
|
175
192
|
it { should match /sort_link desc/ }
|
176
193
|
it { should match /Full Name ▼/ }
|
177
194
|
end
|
178
195
|
|
196
|
+
describe '#sort_url with multiple search_keys defined as an array' do
|
197
|
+
subject { @controller.view_context
|
198
|
+
.sort_url(
|
199
|
+
[:main_app, Person.ransack(sorts: ['name desc', 'email asc'])],
|
200
|
+
:name, [:name, 'email DESC'],
|
201
|
+
controller: 'people'
|
202
|
+
)
|
203
|
+
}
|
204
|
+
it {
|
205
|
+
should match( /people\?q(%5B|\[)s(%5D|\])(%5B|\[)(%5D|\])=name\+asc&q(%5B|\[)s(%5D|\])(%5B|\[)(%5D|\])=email\+desc/
|
206
|
+
)
|
207
|
+
}
|
208
|
+
end
|
209
|
+
|
179
210
|
describe '#sort_link with multiple search_keys does not break on nil values & ignores them' do
|
180
211
|
subject { @controller.view_context
|
181
212
|
.sort_link(
|
182
|
-
[:main_app, Person.
|
213
|
+
[:main_app, Person.ransack(sorts: ['name desc', nil, 'email', nil])],
|
183
214
|
:name, [nil, :name, nil, 'email DESC', nil],
|
184
215
|
controller: 'people'
|
185
216
|
)
|
186
217
|
}
|
187
218
|
it {
|
188
|
-
should match(
|
189
|
-
/people\?q(%5B|\[)s(%5D|\])(%5B|\[)(%5D|\])=name\+asc&q(%5B|\[)s(%5D|\])(%5B|\[)(%5D|\])=email\+desc/
|
219
|
+
should match( /people\?q(%5B|\[)s(%5D|\])(%5B|\[)(%5D|\])=name\+asc&q(%5B|\[)s(%5D|\])(%5B|\[)(%5D|\])=email\+desc/
|
190
220
|
)
|
191
221
|
}
|
192
222
|
it { should match /sort_link desc/ }
|
193
223
|
it { should match /Full Name ▼/ }
|
194
224
|
end
|
195
225
|
|
226
|
+
describe '#sort_url with multiple search_keys does not break on nil values & ignores them' do
|
227
|
+
subject { @controller.view_context
|
228
|
+
.sort_url(
|
229
|
+
[:main_app, Person.ransack(sorts: ['name desc', nil, 'email', nil])],
|
230
|
+
:name, [nil, :name, nil, 'email DESC', nil],
|
231
|
+
controller: 'people'
|
232
|
+
)
|
233
|
+
}
|
234
|
+
it {
|
235
|
+
should match( /people\?q(%5B|\[)s(%5D|\])(%5B|\[)(%5D|\])=name\+asc&q(%5B|\[)s(%5D|\])(%5B|\[)(%5D|\])=email\+desc/
|
236
|
+
)
|
237
|
+
}
|
238
|
+
end
|
239
|
+
|
196
240
|
describe '#sort_link with multiple search_keys should allow a label to be specified' do
|
197
241
|
subject { @controller.view_context
|
198
242
|
.sort_link(
|
199
|
-
[:main_app, Person.
|
243
|
+
[:main_app, Person.ransack(sorts: ['name desc', 'email asc'])],
|
200
244
|
:name, [:name, 'email DESC'],
|
201
245
|
'Property Name',
|
202
246
|
controller: 'people'
|
@@ -208,121 +252,194 @@ module Ransack
|
|
208
252
|
describe '#sort_link with multiple search_keys should flip multiple fields specified without a direction' do
|
209
253
|
subject { @controller.view_context
|
210
254
|
.sort_link(
|
211
|
-
[:main_app, Person.
|
255
|
+
[:main_app, Person.ransack(sorts: ['name desc', 'email asc'])],
|
212
256
|
:name, [:name, :email],
|
213
257
|
controller: 'people'
|
214
258
|
)
|
215
259
|
}
|
216
260
|
it {
|
217
|
-
should match(
|
218
|
-
/people\?q(%5B|\[)s(%5D|\])(%5B|\[)(%5D|\])=name\+asc&q(%5B|\[)s(%5D|\])(%5B|\[)(%5D|\])=email\+desc/
|
261
|
+
should match( /people\?q(%5B|\[)s(%5D|\])(%5B|\[)(%5D|\])=name\+asc&q(%5B|\[)s(%5D|\])(%5B|\[)(%5D|\])=email\+desc/
|
219
262
|
)
|
220
263
|
}
|
221
264
|
it { should match /sort_link desc/ }
|
222
265
|
it { should match /Full Name ▼/ }
|
223
266
|
end
|
224
267
|
|
268
|
+
describe '#sort_url with multiple search_keys should flip multiple fields specified without a direction' do
|
269
|
+
subject { @controller.view_context
|
270
|
+
.sort_url(
|
271
|
+
[:main_app, Person.ransack(sorts: ['name desc', 'email asc'])],
|
272
|
+
:name, [:name, :email],
|
273
|
+
controller: 'people'
|
274
|
+
)
|
275
|
+
}
|
276
|
+
it {
|
277
|
+
should match( /people\?q(%5B|\[)s(%5D|\])(%5B|\[)(%5D|\])=name\+asc&q(%5B|\[)s(%5D|\])(%5B|\[)(%5D|\])=email\+desc/
|
278
|
+
)
|
279
|
+
}
|
280
|
+
end
|
281
|
+
|
225
282
|
describe '#sort_link with multiple search_keys and default_order specified as a string' do
|
226
283
|
subject { @controller.view_context
|
227
284
|
.sort_link(
|
228
|
-
[:main_app, Person.
|
285
|
+
[:main_app, Person.ransack()],
|
229
286
|
:name, [:name, :email],
|
230
287
|
controller: 'people',
|
231
288
|
default_order: 'desc'
|
232
289
|
)
|
233
290
|
}
|
234
291
|
it {
|
235
|
-
should match(
|
236
|
-
/people\?q(%5B|\[)s(%5D|\])(%5B|\[)(%5D|\])=name\+desc&q(%5B|\[)s(%5D|\])(%5B|\[)(%5D|\])=email\+desc/
|
292
|
+
should match( /people\?q(%5B|\[)s(%5D|\])(%5B|\[)(%5D|\])=name\+desc&q(%5B|\[)s(%5D|\])(%5B|\[)(%5D|\])=email\+desc/
|
237
293
|
)
|
238
294
|
}
|
239
295
|
it { should match /sort_link/ }
|
240
296
|
it { should match /Full Name/ }
|
241
297
|
end
|
242
298
|
|
299
|
+
describe '#sort_url with multiple search_keys and default_order specified as a string' do
|
300
|
+
subject { @controller.view_context
|
301
|
+
.sort_url(
|
302
|
+
[:main_app, Person.ransack()],
|
303
|
+
:name, [:name, :email],
|
304
|
+
controller: 'people',
|
305
|
+
default_order: 'desc'
|
306
|
+
)
|
307
|
+
}
|
308
|
+
it {
|
309
|
+
should match( /people\?q(%5B|\[)s(%5D|\])(%5B|\[)(%5D|\])=name\+desc&q(%5B|\[)s(%5D|\])(%5B|\[)(%5D|\])=email\+desc/
|
310
|
+
)
|
311
|
+
}
|
312
|
+
end
|
313
|
+
|
243
314
|
describe '#sort_link with multiple search_keys and default_order specified as a symbol' do
|
244
315
|
subject { @controller.view_context
|
245
316
|
.sort_link(
|
246
|
-
[:main_app, Person.
|
317
|
+
[:main_app, Person.ransack()],
|
247
318
|
:name, [:name, :email],
|
248
319
|
controller: 'people',
|
249
320
|
default_order: :desc
|
250
321
|
)
|
251
322
|
}
|
252
323
|
it {
|
253
|
-
should match(
|
254
|
-
/people\?q(%5B|\[)s(%5D|\])(%5B|\[)(%5D|\])=name\+desc&q(%5B|\[)s(%5D|\])(%5B|\[)(%5D|\])=email\+desc/
|
324
|
+
should match( /people\?q(%5B|\[)s(%5D|\])(%5B|\[)(%5D|\])=name\+desc&q(%5B|\[)s(%5D|\])(%5B|\[)(%5D|\])=email\+desc/
|
255
325
|
)
|
256
326
|
}
|
257
327
|
it { should match /sort_link/ }
|
258
328
|
it { should match /Full Name/ }
|
259
329
|
end
|
260
330
|
|
331
|
+
describe '#sort_url with multiple search_keys and default_order specified as a symbol' do
|
332
|
+
subject { @controller.view_context
|
333
|
+
.sort_url(
|
334
|
+
[:main_app, Person.ransack],
|
335
|
+
:name, [:name, :email],
|
336
|
+
controller: 'people',
|
337
|
+
default_order: :desc
|
338
|
+
)
|
339
|
+
}
|
340
|
+
it {
|
341
|
+
should match( /people\?q(%5B|\[)s(%5D|\])(%5B|\[)(%5D|\])=name\+desc&q(%5B|\[)s(%5D|\])(%5B|\[)(%5D|\])=email\+desc/
|
342
|
+
)
|
343
|
+
}
|
344
|
+
end
|
345
|
+
|
261
346
|
describe '#sort_link with multiple search_keys should allow multiple default_orders to be specified' do
|
262
347
|
subject { @controller.view_context
|
263
348
|
.sort_link(
|
264
|
-
[:main_app, Person.
|
349
|
+
[:main_app, Person.ransack],
|
265
350
|
:name, [:name, :email],
|
266
351
|
controller: 'people',
|
267
352
|
default_order: { name: 'desc', email: 'asc' }
|
268
353
|
)
|
269
354
|
}
|
270
355
|
it {
|
271
|
-
should match(
|
272
|
-
/people\?q(%5B|\[)s(%5D|\])(%5B|\[)(%5D|\])=name\+desc&q(%5B|\[)s(%5D|\])(%5B|\[)(%5D|\])=email\+asc/
|
356
|
+
should match( /people\?q(%5B|\[)s(%5D|\])(%5B|\[)(%5D|\])=name\+desc&q(%5B|\[)s(%5D|\])(%5B|\[)(%5D|\])=email\+asc/
|
273
357
|
)
|
274
358
|
}
|
275
359
|
it { should match /sort_link/ }
|
276
360
|
it { should match /Full Name/ }
|
277
361
|
end
|
278
362
|
|
363
|
+
describe '#sort_url with multiple search_keys should allow multiple default_orders to be specified' do
|
364
|
+
subject { @controller.view_context
|
365
|
+
.sort_url(
|
366
|
+
[:main_app, Person.ransack],
|
367
|
+
:name, [:name, :email],
|
368
|
+
controller: 'people',
|
369
|
+
default_order: { name: 'desc', email: 'asc' }
|
370
|
+
)
|
371
|
+
}
|
372
|
+
it {
|
373
|
+
should match( /people\?q(%5B|\[)s(%5D|\])(%5B|\[)(%5D|\])=name\+desc&q(%5B|\[)s(%5D|\])(%5B|\[)(%5D|\])=email\+asc/
|
374
|
+
)
|
375
|
+
}
|
376
|
+
end
|
377
|
+
|
279
378
|
describe '#sort_link with multiple search_keys with multiple default_orders should not override a specified order' do
|
280
379
|
subject { @controller.view_context
|
281
380
|
.sort_link(
|
282
|
-
[:main_app, Person.
|
381
|
+
[:main_app, Person.ransack],
|
283
382
|
:name, [:name, 'email desc'],
|
284
383
|
controller: 'people',
|
285
384
|
default_order: { name: 'desc', email: 'asc' }
|
286
385
|
)
|
287
386
|
}
|
288
387
|
it {
|
289
|
-
should match(
|
290
|
-
/people\?q(%5B|\[)s(%5D|\])(%5B|\[)(%5D|\])=name\+desc&q(%5B|\[)s(%5D|\])(%5B|\[)(%5D|\])=email\+desc/
|
388
|
+
should match( /people\?q(%5B|\[)s(%5D|\])(%5B|\[)(%5D|\])=name\+desc&q(%5B|\[)s(%5D|\])(%5B|\[)(%5D|\])=email\+desc/
|
291
389
|
)
|
292
390
|
}
|
293
391
|
it { should match /sort_link/ }
|
294
392
|
it { should match /Full Name/ }
|
295
393
|
end
|
296
394
|
|
395
|
+
describe '#sort_url with multiple search_keys with multiple default_orders should not override a specified order' do
|
396
|
+
subject { @controller.view_context
|
397
|
+
.sort_url(
|
398
|
+
[:main_app, Person.ransack],
|
399
|
+
:name, [:name, 'email desc'],
|
400
|
+
controller: 'people',
|
401
|
+
default_order: { name: 'desc', email: 'asc' }
|
402
|
+
)
|
403
|
+
}
|
404
|
+
it {
|
405
|
+
should match( /people\?q(%5B|\[)s(%5D|\])(%5B|\[)(%5D|\])=name\+desc&q(%5B|\[)s(%5D|\])(%5B|\[)(%5D|\])=email\+desc/
|
406
|
+
)
|
407
|
+
}
|
408
|
+
end
|
409
|
+
|
297
410
|
describe "#sort_link on polymorphic association should preserve association model name case" do
|
298
411
|
subject { @controller.view_context
|
299
412
|
.sort_link(
|
300
|
-
[:main_app, Note.
|
413
|
+
[:main_app, Note.ransack],
|
301
414
|
:notable_of_Person_type_name, "Notable",
|
302
415
|
controller: 'notes'
|
303
416
|
)
|
304
417
|
}
|
305
|
-
it {
|
306
|
-
should match(
|
307
|
-
if ActiveRecord::VERSION::STRING =~ /^3\.[1-2]\./
|
308
|
-
/notes\?q%5Bs%5D=notable_of_Person_type_name\+asc/
|
309
|
-
else
|
310
|
-
/notes\?q(%5B|\[)s(%5D|\])=notable_of_Person_type_name\+asc/
|
311
|
-
end
|
312
|
-
)
|
313
|
-
}
|
418
|
+
it { should match /notes\?q(%5B|\[)s(%5D|\])=notable_of_Person_type_name\+asc/ }
|
314
419
|
it { should match /sort_link/ }
|
315
420
|
it { should match /Notable/ }
|
316
421
|
end
|
317
422
|
|
423
|
+
describe "#sort_url on polymorphic association should preserve association model name case" do
|
424
|
+
subject { @controller.view_context
|
425
|
+
.sort_link(
|
426
|
+
[:main_app, Note.ransack],
|
427
|
+
:notable_of_Person_type_name, "Notable",
|
428
|
+
controller: 'notes'
|
429
|
+
)
|
430
|
+
}
|
431
|
+
it { should match /notes\?q(%5B|\[)s(%5D|\])=notable_of_Person_type_name\+asc/ }
|
432
|
+
end
|
433
|
+
|
318
434
|
context 'view has existing parameters' do
|
319
|
-
|
320
|
-
@controller.view_context.params.merge!({ exist: 'existing' })
|
321
|
-
end
|
435
|
+
|
322
436
|
describe '#sort_link should not remove existing params' do
|
323
|
-
|
324
|
-
|
325
|
-
|
437
|
+
|
438
|
+
before { @controller.view_context.params[:exist] = 'existing' }
|
439
|
+
|
440
|
+
subject {
|
441
|
+
@controller.view_context.sort_link(
|
442
|
+
Person.ransack(
|
326
443
|
{ sorts: ['name desc'] },
|
327
444
|
search_key: 'people_search'
|
328
445
|
),
|
@@ -330,44 +447,296 @@ module Ransack
|
|
330
447
|
controller: 'people'
|
331
448
|
)
|
332
449
|
}
|
450
|
+
|
333
451
|
it { should match /exist\=existing/ }
|
334
452
|
end
|
453
|
+
|
454
|
+
describe '#sort_url should not remove existing params' do
|
455
|
+
|
456
|
+
before { @controller.view_context.params[:exist] = 'existing' }
|
457
|
+
|
458
|
+
subject {
|
459
|
+
@controller.view_context.sort_url(
|
460
|
+
Person.ransack(
|
461
|
+
{ sorts: ['name desc'] },
|
462
|
+
search_key: 'people_search'
|
463
|
+
),
|
464
|
+
:name,
|
465
|
+
controller: 'people'
|
466
|
+
)
|
467
|
+
}
|
468
|
+
|
469
|
+
it { should match /exist\=existing/ }
|
470
|
+
end
|
471
|
+
|
472
|
+
context 'using a real ActionController::Parameter object',
|
473
|
+
if: ::ActiveRecord::VERSION::MAJOR > 3 do
|
474
|
+
|
475
|
+
describe 'with symbol q:, #sort_link should include search params' do
|
476
|
+
subject { @controller.view_context.sort_link(Person.ransack, :name) }
|
477
|
+
let(:params) { ActionController::Parameters.new(
|
478
|
+
{ :q => { name_eq: 'TEST' }, controller: 'people' }
|
479
|
+
) }
|
480
|
+
before { @controller.instance_variable_set(:@params, params) }
|
481
|
+
|
482
|
+
it {
|
483
|
+
should match(
|
484
|
+
/people\?q(%5B|\[)name_eq(%5D|\])=TEST&q(%5B|\[)s(%5D|\])
|
485
|
+
=name\+asc/x,
|
486
|
+
)
|
487
|
+
}
|
488
|
+
end
|
489
|
+
|
490
|
+
describe 'with symbol q:, #sort_url should include search params' do
|
491
|
+
subject { @controller.view_context.sort_url(Person.ransack, :name) }
|
492
|
+
let(:params) { ActionController::Parameters.new(
|
493
|
+
{ :q => { name_eq: 'TEST' }, controller: 'people' }
|
494
|
+
) }
|
495
|
+
before { @controller.instance_variable_set(:@params, params) }
|
496
|
+
|
497
|
+
it {
|
498
|
+
should match(
|
499
|
+
/people\?q(%5B|\[)name_eq(%5D|\])=TEST&q(%5B|\[)s(%5D|\])
|
500
|
+
=name\+asc/x,
|
501
|
+
)
|
502
|
+
}
|
503
|
+
end
|
504
|
+
|
505
|
+
describe "with string 'q', #sort_link should include search params" do
|
506
|
+
subject { @controller.view_context.sort_link(Person.ransack, :name) }
|
507
|
+
let(:params) {
|
508
|
+
ActionController::Parameters.new(
|
509
|
+
{ 'q' => { name_eq: 'Test2' }, controller: 'people' }
|
510
|
+
) }
|
511
|
+
before { @controller.instance_variable_set(:@params, params) }
|
512
|
+
|
513
|
+
it {
|
514
|
+
should match(
|
515
|
+
/people\?q(%5B|\[)name_eq(%5D|\])=Test2&q(%5B|\[)s(%5D|\])
|
516
|
+
=name\+asc/x,
|
517
|
+
)
|
518
|
+
}
|
519
|
+
end
|
520
|
+
|
521
|
+
describe "with string 'q', #sort_url should include search params" do
|
522
|
+
subject { @controller.view_context.sort_url(Person.ransack, :name) }
|
523
|
+
let(:params) {
|
524
|
+
ActionController::Parameters.new(
|
525
|
+
{ 'q' => { name_eq: 'Test2' }, controller: 'people' }
|
526
|
+
) }
|
527
|
+
before { @controller.instance_variable_set(:@params, params) }
|
528
|
+
|
529
|
+
it {
|
530
|
+
should match(
|
531
|
+
/people\?q(%5B|\[)name_eq(%5D|\])=Test2&q(%5B|\[)s(%5D|\])
|
532
|
+
=name\+asc/x,
|
533
|
+
)
|
534
|
+
}
|
535
|
+
end
|
536
|
+
end
|
335
537
|
end
|
336
538
|
|
337
539
|
describe '#sort_link with hide order indicator set to true' do
|
338
540
|
subject { @controller.view_context
|
339
541
|
.sort_link(
|
340
|
-
[:main_app, Person.
|
542
|
+
[:main_app, Person.ransack(sorts: ['name desc'])],
|
341
543
|
:name,
|
342
544
|
controller: 'people',
|
343
545
|
hide_indicator: true
|
344
546
|
)
|
345
547
|
}
|
346
548
|
it { should match /Full Name/ }
|
549
|
+
it { should_not match /▼|▲/ }
|
347
550
|
end
|
348
551
|
|
349
552
|
describe '#sort_link with hide order indicator set to false' do
|
350
553
|
subject { @controller.view_context
|
351
554
|
.sort_link(
|
352
|
-
[:main_app, Person.
|
555
|
+
[:main_app, Person.ransack(sorts: ['name desc'])],
|
556
|
+
:name,
|
557
|
+
controller: 'people',
|
558
|
+
hide_indicator: false
|
559
|
+
)
|
560
|
+
}
|
561
|
+
it { should match /Full Name ▼/ }
|
562
|
+
end
|
563
|
+
|
564
|
+
describe '#sort_link with config set with custom up_arrow' do
|
565
|
+
before do
|
566
|
+
Ransack.configure { |c| c.custom_arrows = { up_arrow: "\u{1F446}" } }
|
567
|
+
end
|
568
|
+
|
569
|
+
after do
|
570
|
+
Ransack.configure { |c| c.custom_arrows = { up_arrow: "▼" } }
|
571
|
+
end
|
572
|
+
|
573
|
+
subject { @controller.view_context
|
574
|
+
.sort_link(
|
575
|
+
[:main_app, Person.ransack(sorts: ['name desc'])],
|
576
|
+
:name,
|
577
|
+
controller: 'people',
|
578
|
+
hide_indicator: false
|
579
|
+
)
|
580
|
+
}
|
581
|
+
|
582
|
+
it { should match /Full Name \u{1F446}/ }
|
583
|
+
end
|
584
|
+
|
585
|
+
describe '#sort_link with config set with custom down_arrow' do
|
586
|
+
before do
|
587
|
+
Ransack.configure { |c| c.custom_arrows = { down_arrow: "\u{1F447}" } }
|
588
|
+
end
|
589
|
+
|
590
|
+
after do
|
591
|
+
Ransack.configure { |c| c.custom_arrows = { down_arrow: "▲" } }
|
592
|
+
end
|
593
|
+
|
594
|
+
subject { @controller.view_context
|
595
|
+
.sort_link(
|
596
|
+
[:main_app, Person.ransack(sorts: ['name asc'])],
|
353
597
|
:name,
|
354
598
|
controller: 'people',
|
355
599
|
hide_indicator: false
|
356
600
|
)
|
357
601
|
}
|
602
|
+
|
603
|
+
it { should match /Full Name \u{1F447}/ }
|
604
|
+
end
|
605
|
+
|
606
|
+
describe '#sort_link with config set to hide arrows' do
|
607
|
+
before do
|
608
|
+
Ransack.configure { |c| c.hide_sort_order_indicators = true }
|
609
|
+
end
|
610
|
+
|
611
|
+
after do
|
612
|
+
Ransack.configure { |c| c.hide_sort_order_indicators = false }
|
613
|
+
end
|
614
|
+
|
615
|
+
subject { @controller.view_context
|
616
|
+
.sort_link(
|
617
|
+
[:main_app, Person.ransack(sorts: ['name desc'])],
|
618
|
+
:name,
|
619
|
+
controller: 'people'
|
620
|
+
)
|
621
|
+
}
|
622
|
+
|
623
|
+
it { should_not match /▼|▲/ }
|
624
|
+
end
|
625
|
+
|
626
|
+
describe '#sort_link with config set to show arrows (default setting)' do
|
627
|
+
before do
|
628
|
+
Ransack.configure { |c| c.hide_sort_order_indicators = false }
|
629
|
+
end
|
630
|
+
|
631
|
+
subject { @controller.view_context
|
632
|
+
.sort_link(
|
633
|
+
[:main_app, Person.ransack(sorts: ['name desc'])],
|
634
|
+
:name,
|
635
|
+
controller: 'people'
|
636
|
+
)
|
637
|
+
}
|
638
|
+
|
358
639
|
it { should match /Full Name ▼/ }
|
359
640
|
end
|
360
641
|
|
642
|
+
describe '#sort_link with config set to show arrows and a default arrow set' do
|
643
|
+
before do
|
644
|
+
Ransack.configure do |c|
|
645
|
+
c.hide_sort_order_indicators = false
|
646
|
+
c.custom_arrows = { default_arrow: "defaultarrow"}
|
647
|
+
end
|
648
|
+
end
|
649
|
+
|
650
|
+
after do
|
651
|
+
Ransack.configure do |c|
|
652
|
+
c.custom_arrows = { default_arrow: nil}
|
653
|
+
end
|
654
|
+
end
|
655
|
+
|
656
|
+
subject { @controller.view_context
|
657
|
+
.sort_link(
|
658
|
+
[:main_app, Person.ransack],
|
659
|
+
:name,
|
660
|
+
controller: 'people'
|
661
|
+
)
|
662
|
+
}
|
663
|
+
|
664
|
+
it { should match /Full Name defaultarrow/ }
|
665
|
+
end
|
666
|
+
|
667
|
+
describe '#sort_link w/config to hide arrows + custom arrow, hides all' do
|
668
|
+
before do
|
669
|
+
Ransack.configure do |c|
|
670
|
+
c.hide_sort_order_indicators = true
|
671
|
+
c.custom_arrows = { down_arrow: 'down', default_arrow: "defaultarrow" }
|
672
|
+
end
|
673
|
+
end
|
674
|
+
|
675
|
+
after do
|
676
|
+
Ransack.configure do |c|
|
677
|
+
c.hide_sort_order_indicators = false
|
678
|
+
c.custom_arrows = { down_arrow: '▲' }
|
679
|
+
end
|
680
|
+
end
|
681
|
+
|
682
|
+
subject { @controller.view_context
|
683
|
+
.sort_link(
|
684
|
+
[:main_app, Person.ransack(sorts: ['name desc'])],
|
685
|
+
:name,
|
686
|
+
controller: 'people'
|
687
|
+
)
|
688
|
+
}
|
689
|
+
|
690
|
+
it { should_not match /▼|down|defaultarrow/ }
|
691
|
+
end
|
692
|
+
|
693
|
+
describe '#sort_link with config set to show arrows + custom arrow' do
|
694
|
+
before do
|
695
|
+
Ransack.configure do |c|
|
696
|
+
c.hide_sort_order_indicators = false
|
697
|
+
c.custom_arrows = { up_arrow: 'up-value' }
|
698
|
+
end
|
699
|
+
end
|
700
|
+
|
701
|
+
after do
|
702
|
+
Ransack.configure do |c|
|
703
|
+
c.hide_sort_order_indicators = false
|
704
|
+
c.custom_arrows = { up_arrow: '▼' }
|
705
|
+
end
|
706
|
+
end
|
707
|
+
|
708
|
+
subject { @controller.view_context
|
709
|
+
.sort_link(
|
710
|
+
[:main_app, Person.ransack(sorts: ['name desc'])],
|
711
|
+
:name,
|
712
|
+
controller: 'people'
|
713
|
+
)
|
714
|
+
}
|
715
|
+
|
716
|
+
it { should match /▲|up-value/ }
|
717
|
+
end
|
718
|
+
|
719
|
+
describe '#sort_link with a block' do
|
720
|
+
subject { @controller.view_context
|
721
|
+
.sort_link(
|
722
|
+
[:main_app, Person.ransack(sorts: ['name desc'])],
|
723
|
+
:name,
|
724
|
+
controller: 'people'
|
725
|
+
) { 'Block label' }
|
726
|
+
}
|
727
|
+
it { should match /Block label ▼/ }
|
728
|
+
end
|
729
|
+
|
361
730
|
describe '#search_form_for with default format' do
|
362
731
|
subject { @controller.view_context
|
363
|
-
.search_form_for(Person.
|
732
|
+
.search_form_for(Person.ransack) {} }
|
364
733
|
it { should match /action="\/people"/ }
|
365
734
|
end
|
366
735
|
|
367
736
|
describe '#search_form_for with pdf format' do
|
368
737
|
subject {
|
369
738
|
@controller.view_context
|
370
|
-
.search_form_for(Person.
|
739
|
+
.search_form_for(Person.ransack, format: :pdf) {}
|
371
740
|
}
|
372
741
|
it { should match /action="\/people.pdf"/ }
|
373
742
|
end
|
@@ -375,7 +744,7 @@ module Ransack
|
|
375
744
|
describe '#search_form_for with json format' do
|
376
745
|
subject {
|
377
746
|
@controller.view_context
|
378
|
-
.search_form_for(Person.
|
747
|
+
.search_form_for(Person.ransack, format: :json) {}
|
379
748
|
}
|
380
749
|
it { should match /action="\/people.json"/ }
|
381
750
|
end
|
@@ -383,7 +752,7 @@ module Ransack
|
|
383
752
|
describe '#search_form_for with an array of routes' do
|
384
753
|
subject {
|
385
754
|
@controller.view_context
|
386
|
-
.search_form_for([:admin, Comment.
|
755
|
+
.search_form_for([:admin, Comment.ransack]) {}
|
387
756
|
}
|
388
757
|
it { should match /action="\/admin\/comments"/ }
|
389
758
|
end
|
@@ -394,11 +763,10 @@ module Ransack
|
|
394
763
|
end
|
395
764
|
subject {
|
396
765
|
@controller.view_context
|
397
|
-
.search_form_for(Person.
|
766
|
+
.search_form_for(Person.ransack) { |f| f.text_field :name_eq }
|
398
767
|
}
|
399
768
|
it { should match /example_name_eq/ }
|
400
769
|
end
|
401
|
-
|
402
770
|
end
|
403
771
|
end
|
404
772
|
end
|