ransack_ui 1.0.2 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
@@ -33,6 +33,9 @@ Ransack.predicate_inputs = {}
|
|
33
33
|
when 'date','datetime','time' then type
|
34
34
|
else false # Hide for unhandled types.
|
35
35
|
|
36
|
+
# Setup predicates for fixed select options. Includes relevant any/all permutations
|
37
|
+
Ransack.option_predicates = ['eq', 'eq_any', 'not_eq', 'not_eq_all', 'null', 'not_null']
|
38
|
+
|
36
39
|
# Use a tags input for 'in' if Select2 is available
|
37
40
|
if Select2?
|
38
41
|
Ransack.predicate_inputs.in = 'tags'
|
@@ -32,6 +32,7 @@
|
|
32
32
|
|
33
33
|
base_id = target.attr('id').slice(0, -8)
|
34
34
|
predicate_select = @element.find("select##{base_id}p")
|
35
|
+
available = predicate_select.data['predicates']
|
35
36
|
query_input = $("input##{base_id}v_0_value")
|
36
37
|
|
37
38
|
# Initialize datepicker if column is date/datetime/time
|
@@ -40,7 +41,7 @@
|
|
40
41
|
# Handle association columns with AJAX autocomplete
|
41
42
|
if selected.data('ajax-url') and Select2?
|
42
43
|
controller = selected.data('controller')
|
43
|
-
@
|
44
|
+
@set_option_predicates(base_id, available, column_type)
|
44
45
|
|
45
46
|
# Set up Select2 for query input
|
46
47
|
query_input.val('')
|
@@ -61,7 +62,7 @@
|
|
61
62
|
|
62
63
|
# Handle columns with options detected from validates :inclusion
|
63
64
|
else if selected.data('select-options') and Select2?
|
64
|
-
@
|
65
|
+
@set_option_predicates(base_id, available, column_type)
|
65
66
|
query_input.val('')
|
66
67
|
query_input.select2
|
67
68
|
data: selected.data('select-options')
|
@@ -83,7 +84,6 @@
|
|
83
84
|
previous_val = predicate_select.val()
|
84
85
|
|
85
86
|
# Build array of supported predicates
|
86
|
-
available = predicate_select.data['predicates']
|
87
87
|
predicates = Ransack.type_predicates[column_type] || []
|
88
88
|
predicates = $.map predicates, (p) -> [p, Ransack.predicates[p]]
|
89
89
|
|
@@ -114,12 +114,16 @@
|
|
114
114
|
|
115
115
|
return true
|
116
116
|
|
117
|
+
|
117
118
|
predicate_changed: (e) ->
|
118
119
|
target = $(e.currentTarget)
|
119
120
|
p = target.val() || ""
|
120
121
|
base_id = target.attr('id').slice(0, -1)
|
121
122
|
query_input = $("input##{base_id}v_0_value")
|
122
123
|
|
124
|
+
attribute_select = @element.find("select##{base_id}a_0_name")
|
125
|
+
selected_attribute = attribute_select.find('option:selected')
|
126
|
+
|
123
127
|
# We need to use a dummy input to handle multiple terms
|
124
128
|
multi_id = query_input.attr('id') + '_multi'
|
125
129
|
multi_input = @element.find("##{multi_id}")
|
@@ -127,18 +131,50 @@
|
|
127
131
|
if Select2?
|
128
132
|
# Turn query input into Select2 tag list when query accepts multiple values
|
129
133
|
if p in ["in", "not_in"] || p.match(/_(all|any)$/)
|
134
|
+
# If Select2 is on query input, remove and set defaults
|
135
|
+
if @element.find("#s2id_#{base_id}v_0_value").length
|
136
|
+
query_input.select2('destroy')
|
137
|
+
|
130
138
|
# Add dummy 'multi' input for select2 if not already added
|
131
139
|
if multi_input.length == 0
|
132
|
-
|
140
|
+
# Set up multi-query input with fixed options, if present
|
141
|
+
query_input.val('')
|
142
|
+
options = selected_attribute.data('select-options')
|
143
|
+
@setup_multi_query_input(target, query_input, multi_id, options)
|
144
|
+
|
133
145
|
return
|
134
|
-
|
135
|
-
|
136
|
-
|
146
|
+
|
147
|
+
else
|
148
|
+
if multi_input.length
|
149
|
+
# Otherwise, remove Select2 from multi-query input, and remove input.
|
137
150
|
multi_input.select2('destroy').remove()
|
151
|
+
# Also remove all extra inputs
|
152
|
+
base_name = multi_input.data('base-name')
|
153
|
+
inputs = @element.find("input[name^=\"#{base_name}\"]")
|
154
|
+
inputs = inputs.slice(1)
|
155
|
+
inputs.remove()
|
156
|
+
|
157
|
+
# If no fixed options, show query input
|
138
158
|
query_input.val('').show()
|
159
|
+
|
160
|
+
# Handle fixed options - set up Select2 for single values if not already present
|
161
|
+
if selected_attribute.data('select-options')
|
162
|
+
if (query_select2 = @element.find("#s2id_#{base_id}v_0_value")).length == 0
|
163
|
+
query_input.select2
|
164
|
+
data: selected_attribute.data('select-options')
|
165
|
+
placeholder: "Please select a #{selected_attribute.val()}"
|
166
|
+
allowClear: true
|
167
|
+
|
168
|
+
return
|
169
|
+
|
139
170
|
|
140
171
|
# Hide query input when not needed
|
141
172
|
if p in ["true", "false", "blank", "present", "null", "not_null"]
|
173
|
+
# If Select2 is on query input, remove and set defaults
|
174
|
+
if Select2? && @element.find("#s2id_#{base_id}v_0_value").length
|
175
|
+
query_input.select2('destroy')
|
176
|
+
query_input.val('')
|
177
|
+
|
142
178
|
query_input.val("true")
|
143
179
|
query_input.hide()
|
144
180
|
query_input.parent().find('.ui-datepicker-trigger').hide()
|
@@ -151,16 +187,22 @@
|
|
151
187
|
|
152
188
|
|
153
189
|
# Dsiables predicate choices and sets it to 'eq'
|
154
|
-
|
190
|
+
set_option_predicates: (base_id, available, column_type) ->
|
155
191
|
predicate_select = @element.find("select##{base_id}p")
|
156
|
-
|
192
|
+
|
193
|
+
# Remove all predicates, and add any supported predicates
|
157
194
|
predicate_select.find('option').each (i, o) -> $(o).remove()
|
158
|
-
|
195
|
+
|
196
|
+
$.each available, (i, p) =>
|
197
|
+
[predicate, label] = [p[0], p[1]]
|
198
|
+
|
199
|
+
if predicate in Ransack.option_predicates
|
200
|
+
# Get alternative predicate label depending on column type
|
201
|
+
label = @alt_predicate_label_or_default(predicate, column_type, label)
|
202
|
+
predicate_select.append $("<option value=#{predicate}>#{label}</option>")
|
159
203
|
|
160
204
|
if Select2?
|
161
205
|
predicate_select2 = @element.find("#s2id_#{base_id}p")
|
162
|
-
# Disable predicate Select2
|
163
|
-
predicate_select2.select2('disable')
|
164
206
|
predicate_select2.select2('val', 'eq')
|
165
207
|
|
166
208
|
# Attempts to find a predicate translation for the specific column type,
|
@@ -196,7 +238,7 @@
|
|
196
238
|
|
197
239
|
# If value was added after the first value, then append extra input with added value
|
198
240
|
if values.length && e.added
|
199
|
-
@add_query_input(target, base_name, inputs.length + 1, e.added.
|
241
|
+
@add_query_input(target, base_name, inputs.length + 1, e.added.id)
|
200
242
|
|
201
243
|
else if e.removed
|
202
244
|
# If value was removed, clear all extra inputs, then rebuild inputs for extra terms
|
@@ -204,7 +246,7 @@
|
|
204
246
|
$.each values, (i, v) =>
|
205
247
|
@add_query_input(target, base_name, i + 1, v)
|
206
248
|
|
207
|
-
setup_multi_query_input: (predicate_el, query_el, multi_id) ->
|
249
|
+
setup_multi_query_input: (predicate_el, query_el, multi_id, options) ->
|
208
250
|
base_name = predicate_el.attr('name').slice(0, -3) + '[v]'
|
209
251
|
query_el.after(
|
210
252
|
$('<input class="ransack_query_multi" id="' + multi_id + '" ' +
|
@@ -221,11 +263,32 @@
|
|
221
263
|
if Select2?
|
222
264
|
# Find newly created input and setup Select2
|
223
265
|
multi_query = @element.find('#' + multi_id)
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
266
|
+
|
267
|
+
if options?
|
268
|
+
# Setup Select2 with fixed options
|
269
|
+
multi_query.select2
|
270
|
+
data: options
|
271
|
+
multiple: true
|
272
|
+
tokenSeparators: [',']
|
273
|
+
formatNoMatches:
|
274
|
+
if options
|
275
|
+
(t) -> "No matches found."
|
276
|
+
else
|
277
|
+
(t) -> "Add a search term"
|
278
|
+
initSelection: (element, callback) ->
|
279
|
+
data = []
|
280
|
+
unless element.val().trim() == ""
|
281
|
+
$(element.val().split(",")).each ->
|
282
|
+
data.push {id: this, text: this}
|
283
|
+
callback(data)
|
284
|
+
else
|
285
|
+
# Setup Select2 with tagging support (can create options)
|
286
|
+
multi_query.select2
|
287
|
+
tags: []
|
288
|
+
tokenSeparators: [',']
|
289
|
+
formatNoMatches: (t) ->
|
290
|
+
"Add a search term"
|
291
|
+
|
229
292
|
multi_query.select2('val', values)
|
230
293
|
|
231
294
|
add_query_input: (base_input, base_name, id, value) ->
|
data/lib/ransack_ui/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ransack_ui
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-01-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: ransack_chronic
|
@@ -99,7 +99,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
99
99
|
version: '0'
|
100
100
|
segments:
|
101
101
|
- 0
|
102
|
-
hash:
|
102
|
+
hash: 3625052068884160403
|
103
103
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
104
104
|
none: false
|
105
105
|
requirements:
|
@@ -108,10 +108,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
108
108
|
version: '0'
|
109
109
|
segments:
|
110
110
|
- 0
|
111
|
-
hash:
|
111
|
+
hash: 3625052068884160403
|
112
112
|
requirements: []
|
113
113
|
rubyforge_project:
|
114
|
-
rubygems_version: 1.8.
|
114
|
+
rubygems_version: 1.8.24
|
115
115
|
signing_key:
|
116
116
|
specification_version: 3
|
117
117
|
summary: UI Builder for Ransack
|