chosen-rails 0.13.2 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +11 -3
- data/Rakefile +1 -0
- data/lib/chosen-rails/source_file.rb +13 -0
- data/lib/chosen-rails/version.rb +2 -2
- data/vendor/assets/javascripts/chosen.jquery.coffee +88 -71
- data/vendor/assets/javascripts/chosen.proto.coffee +67 -44
- data/vendor/assets/javascripts/lib/abstract-chosen.coffee +72 -19
- data/vendor/assets/javascripts/lib/select-parser.coffee +1 -1
- data/vendor/assets/stylesheets/chosen.css.scss +57 -53
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c5812584c5181aa451334406808d07978d251851
|
4
|
+
data.tar.gz: 43f40dbd823a2b44b34ad12d8b93a4f05919965f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 26248f3d19863fefb7d454f003f58f9a2d7eba1e3479198c0b0a7c57c8c18bbfa677026a2e7feccfee4503e6d59ec60e4a251a09d1087f7b4d75f4dd701f08af
|
7
|
+
data.tar.gz: 202143305a02bc84937d711c47cecc483477682ed6a1ca168d556c49d39666dc91d8e8bb710afda596c74672ad1a77bbb5dedbaa032885dc8ef51f92009a8901
|
data/README.md
CHANGED
@@ -12,6 +12,14 @@ Include `chosen-rails` in Gemefile
|
|
12
12
|
|
13
13
|
gem 'chosen-rails'
|
14
14
|
|
15
|
+
For Rails 4 project, it is required to add [compass-rails](https://github.com/Compass/compass-rails) gem explicitly and use unofficial branch for [compatible issue](https://github.com/Compass/compass-rails/pull/59).
|
16
|
+
|
17
|
+
|
18
|
+
```ruby
|
19
|
+
# gem 'compass-rails', github: 'Compass/compass-rails', branch: 'rails4'
|
20
|
+
gem 'compass-rails', github: 'milgner/compass-rails', branch: 'rails4'
|
21
|
+
```
|
22
|
+
|
15
23
|
Then run `bundle install`
|
16
24
|
|
17
25
|
### Include chosen javascript assets
|
@@ -36,7 +44,7 @@ Add to one coffee script file, like `scaffold.js.coffee`
|
|
36
44
|
|
37
45
|
$ ->
|
38
46
|
# enable chosen js
|
39
|
-
$('.
|
47
|
+
$('.chosen-select').chosen
|
40
48
|
allow_single_deselect: true
|
41
49
|
no_results_text: 'No results matched'
|
42
50
|
width: '200px'
|
@@ -53,7 +61,7 @@ Also add the class to your form field
|
|
53
61
|
<%= f.select :author,
|
54
62
|
User.all.map { |u| [u.name, u.id] },
|
55
63
|
{ include_blank: true },
|
56
|
-
{ class: '
|
64
|
+
{ class: 'chosen-select' }
|
57
65
|
%>
|
58
66
|
|
59
67
|
If you use simple form as form builder
|
@@ -61,7 +69,7 @@ If you use simple form as form builder
|
|
61
69
|
<%= f.association :author,
|
62
70
|
collection: User.all,
|
63
71
|
include_blank: true,
|
64
|
-
input_html: { class: '
|
72
|
+
input_html: { class: 'chosen-select' }
|
65
73
|
%>
|
66
74
|
|
67
75
|
### Deployment
|
data/Rakefile
CHANGED
@@ -18,6 +18,19 @@ class SourceFile < Thor
|
|
18
18
|
bump_version
|
19
19
|
end
|
20
20
|
|
21
|
+
desc 'eject class from closure', 'eject javascript library class from closure'
|
22
|
+
def eject_javascript_class_from_closure
|
23
|
+
self.destination_root = 'vendor/assets'
|
24
|
+
inside destination_root do
|
25
|
+
append_to_file 'javascripts/lib/abstract-chosen.coffee' do
|
26
|
+
"\nwindow.AbstractChosen = AbstractChosen\n"
|
27
|
+
end
|
28
|
+
append_to_file 'javascripts/lib/select-parser.coffee' do
|
29
|
+
"\n\nwindow.SelectParser = SelectParser\n"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
21
34
|
desc 'clean up useless files', 'clean up useless files'
|
22
35
|
def cleanup
|
23
36
|
self.destination_root = 'vendor/assets'
|
data/lib/chosen-rails/version.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
root = this
|
2
1
|
$ = jQuery
|
3
2
|
|
4
3
|
$.fn.extend({
|
@@ -6,10 +5,16 @@ $.fn.extend({
|
|
6
5
|
# Do no harm and return as soon as possible for unsupported browsers, namely IE6 and IE7
|
7
6
|
# Continue on if running IE document type but in compatibility mode
|
8
7
|
return this unless AbstractChosen.browser_is_supported()
|
9
|
-
this.each(
|
8
|
+
this.each (input_field) ->
|
10
9
|
$this = $ this
|
11
|
-
$this.data('chosen'
|
12
|
-
|
10
|
+
chosen = $this.data('chosen')
|
11
|
+
if options is 'destroy' && chosen
|
12
|
+
chosen.destroy()
|
13
|
+
else unless chosen
|
14
|
+
$this.data('chosen', new Chosen(this, options))
|
15
|
+
|
16
|
+
return
|
17
|
+
|
13
18
|
})
|
14
19
|
|
15
20
|
class Chosen extends AbstractChosen
|
@@ -17,88 +22,98 @@ class Chosen extends AbstractChosen
|
|
17
22
|
setup: ->
|
18
23
|
@form_field_jq = $ @form_field
|
19
24
|
@current_selectedIndex = @form_field.selectedIndex
|
20
|
-
@is_rtl = @form_field_jq.hasClass "
|
21
|
-
|
22
|
-
finish_setup: ->
|
23
|
-
@form_field_jq.addClass "chzn-done"
|
25
|
+
@is_rtl = @form_field_jq.hasClass "chosen-rtl"
|
24
26
|
|
25
27
|
set_up_html: ->
|
26
|
-
container_classes = ["
|
27
|
-
container_classes.push "
|
28
|
+
container_classes = ["chosen-container"]
|
29
|
+
container_classes.push "chosen-container-" + (if @is_multiple then "multi" else "single")
|
28
30
|
container_classes.push @form_field.className if @inherit_select_classes && @form_field.className
|
29
|
-
container_classes.push "
|
31
|
+
container_classes.push "chosen-rtl" if @is_rtl
|
30
32
|
|
31
33
|
container_props =
|
32
34
|
'class': container_classes.join ' '
|
33
35
|
'style': "width: #{this.container_width()};"
|
34
36
|
'title': @form_field.title
|
35
37
|
|
36
|
-
container_props.id = @form_field.id.replace(/[^\w]/g, '_') + "
|
38
|
+
container_props.id = @form_field.id.replace(/[^\w]/g, '_') + "_chosen" if @form_field.id.length
|
37
39
|
|
38
40
|
@container = ($ "<div />", container_props)
|
39
41
|
|
40
42
|
if @is_multiple
|
41
|
-
@container.html '<ul class="
|
43
|
+
@container.html '<ul class="chosen-choices"><li class="search-field"><input type="text" value="' + @default_text + '" class="default" autocomplete="off" style="width:25px;" /></li></ul><div class="chosen-drop"><ul class="chosen-results"></ul></div>'
|
42
44
|
else
|
43
|
-
@container.html '<a
|
45
|
+
@container.html '<a class="chosen-single chosen-default" tabindex="-1"><span>' + @default_text + '</span><div><b></b></div></a><div class="chosen-drop"><div class="chosen-search"><input type="text" autocomplete="off" /></div><ul class="chosen-results"></ul></div>'
|
44
46
|
|
45
47
|
@form_field_jq.hide().after @container
|
46
|
-
@dropdown = @container.find('div.
|
48
|
+
@dropdown = @container.find('div.chosen-drop').first()
|
47
49
|
|
48
50
|
@search_field = @container.find('input').first()
|
49
|
-
@search_results = @container.find('ul.
|
51
|
+
@search_results = @container.find('ul.chosen-results').first()
|
50
52
|
this.search_field_scale()
|
51
53
|
|
52
54
|
@search_no_results = @container.find('li.no-results').first()
|
53
55
|
|
54
56
|
if @is_multiple
|
55
|
-
@search_choices = @container.find('ul.
|
57
|
+
@search_choices = @container.find('ul.chosen-choices').first()
|
56
58
|
@search_container = @container.find('li.search-field').first()
|
57
59
|
else
|
58
|
-
@search_container = @container.find('div.
|
59
|
-
@selected_item = @container.find('.
|
60
|
+
@search_container = @container.find('div.chosen-search').first()
|
61
|
+
@selected_item = @container.find('.chosen-single').first()
|
60
62
|
|
61
63
|
this.results_build()
|
62
64
|
this.set_tab_index()
|
63
65
|
this.set_label_behavior()
|
64
|
-
@form_field_jq.trigger("
|
66
|
+
@form_field_jq.trigger("chosen:ready", {chosen: this})
|
65
67
|
|
66
68
|
register_observers: ->
|
67
|
-
@container.mousedown (evt) => this.container_mousedown(evt); return
|
68
|
-
@container.mouseup (evt) => this.container_mouseup(evt); return
|
69
|
-
@container.mouseenter (evt) => this.mouse_enter(evt); return
|
70
|
-
@container.mouseleave (evt) => this.mouse_leave(evt); return
|
69
|
+
@container.bind 'mousedown.chosen', (evt) => this.container_mousedown(evt); return
|
70
|
+
@container.bind 'mouseup.chosen', (evt) => this.container_mouseup(evt); return
|
71
|
+
@container.bind 'mouseenter.chosen', (evt) => this.mouse_enter(evt); return
|
72
|
+
@container.bind 'mouseleave.chosen', (evt) => this.mouse_leave(evt); return
|
73
|
+
|
74
|
+
@search_results.bind 'mouseup.chosen', (evt) => this.search_results_mouseup(evt); return
|
75
|
+
@search_results.bind 'mouseover.chosen', (evt) => this.search_results_mouseover(evt); return
|
76
|
+
@search_results.bind 'mouseout.chosen', (evt) => this.search_results_mouseout(evt); return
|
77
|
+
@search_results.bind 'mousewheel.chosen DOMMouseScroll.chosen', (evt) => this.search_results_mousewheel(evt); return
|
71
78
|
|
72
|
-
@search_results.
|
73
|
-
@search_results.
|
74
|
-
@search_results.
|
75
|
-
@search_results.bind 'mousewheel DOMMouseScroll', (evt) => this.search_results_mousewheel(evt); return
|
79
|
+
@search_results.bind 'touchstart.chosen', (evt) => this.search_results_touchstart(evt); return
|
80
|
+
@search_results.bind 'touchmove.chosen', (evt) => this.search_results_touchmove(evt); return
|
81
|
+
@search_results.bind 'touchend.chosen', (evt) => this.search_results_touchend(evt); return
|
76
82
|
|
77
|
-
@form_field_jq.bind "
|
78
|
-
@form_field_jq.bind "
|
79
|
-
@form_field_jq.bind "
|
83
|
+
@form_field_jq.bind "chosen:updated.chosen", (evt) => this.results_update_field(evt); return
|
84
|
+
@form_field_jq.bind "chosen:activate.chosen", (evt) => this.activate_field(evt); return
|
85
|
+
@form_field_jq.bind "chosen:open.chosen", (evt) => this.container_mousedown(evt); return
|
80
86
|
|
81
|
-
@search_field.blur (evt) => this.input_blur(evt); return
|
82
|
-
@search_field.keyup (evt) => this.keyup_checker(evt); return
|
83
|
-
@search_field.keydown (evt) => this.keydown_checker(evt); return
|
84
|
-
@search_field.focus (evt) => this.input_focus(evt); return
|
87
|
+
@search_field.bind 'blur.chosen', (evt) => this.input_blur(evt); return
|
88
|
+
@search_field.bind 'keyup.chosen', (evt) => this.keyup_checker(evt); return
|
89
|
+
@search_field.bind 'keydown.chosen', (evt) => this.keydown_checker(evt); return
|
90
|
+
@search_field.bind 'focus.chosen', (evt) => this.input_focus(evt); return
|
85
91
|
|
86
92
|
if @is_multiple
|
87
|
-
@search_choices.click (evt) => this.choices_click(evt); return
|
93
|
+
@search_choices.bind 'click.chosen', (evt) => this.choices_click(evt); return
|
88
94
|
else
|
89
|
-
@container.click (evt)
|
95
|
+
@container.bind 'click.chosen', (evt) -> evt.preventDefault(); return # gobble click of anchor
|
96
|
+
|
97
|
+
destroy: ->
|
98
|
+
$(document).unbind "click.chosen", @click_test_action
|
99
|
+
if @search_field[0].tabIndex
|
100
|
+
@form_field_jq[0].tabIndex = @search_field[0].tabIndex
|
101
|
+
|
102
|
+
@container.remove()
|
103
|
+
@form_field_jq.removeData('chosen')
|
104
|
+
@form_field_jq.show()
|
90
105
|
|
91
106
|
search_field_disabled: ->
|
92
107
|
@is_disabled = @form_field_jq[0].disabled
|
93
108
|
if(@is_disabled)
|
94
|
-
@container.addClass '
|
109
|
+
@container.addClass 'chosen-disabled'
|
95
110
|
@search_field[0].disabled = true
|
96
|
-
@selected_item.unbind "focus", @activate_action if !@is_multiple
|
111
|
+
@selected_item.unbind "focus.chosen", @activate_action if !@is_multiple
|
97
112
|
this.close_field()
|
98
113
|
else
|
99
|
-
@container.removeClass '
|
114
|
+
@container.removeClass 'chosen-disabled'
|
100
115
|
@search_field[0].disabled = false
|
101
|
-
@selected_item.bind "focus", @activate_action if !@is_multiple
|
116
|
+
@selected_item.bind "focus.chosen", @activate_action if !@is_multiple
|
102
117
|
|
103
118
|
container_mousedown: (evt) ->
|
104
119
|
if !@is_disabled
|
@@ -108,9 +123,9 @@ class Chosen extends AbstractChosen
|
|
108
123
|
if not (evt? and ($ evt.target).hasClass "search-choice-close")
|
109
124
|
if not @active_field
|
110
125
|
@search_field.val "" if @is_multiple
|
111
|
-
$(document).click @click_test_action
|
126
|
+
$(document).bind 'click.chosen', @click_test_action
|
112
127
|
this.results_show()
|
113
|
-
else if not @is_multiple and evt and (($(evt.target)[0] == @selected_item[0]) || $(evt.target).parents("a.
|
128
|
+
else if not @is_multiple and evt and (($(evt.target)[0] == @selected_item[0]) || $(evt.target).parents("a.chosen-single").length)
|
114
129
|
evt.preventDefault()
|
115
130
|
this.results_toggle()
|
116
131
|
|
@@ -127,22 +142,22 @@ class Chosen extends AbstractChosen
|
|
127
142
|
@search_results.scrollTop(delta + @search_results.scrollTop())
|
128
143
|
|
129
144
|
blur_test: (evt) ->
|
130
|
-
this.close_field() if not @active_field and @container.hasClass "
|
145
|
+
this.close_field() if not @active_field and @container.hasClass "chosen-container-active"
|
131
146
|
|
132
147
|
close_field: ->
|
133
|
-
$(document).unbind "click", @click_test_action
|
148
|
+
$(document).unbind "click.chosen", @click_test_action
|
134
149
|
|
135
150
|
@active_field = false
|
136
151
|
this.results_hide()
|
137
152
|
|
138
|
-
@container.removeClass "
|
153
|
+
@container.removeClass "chosen-container-active"
|
139
154
|
this.clear_backstroke()
|
140
155
|
|
141
156
|
this.show_search_field_default()
|
142
157
|
this.search_field_scale()
|
143
158
|
|
144
159
|
activate_field: ->
|
145
|
-
@container.addClass "
|
160
|
+
@container.addClass "chosen-container-active"
|
146
161
|
@active_field = true
|
147
162
|
|
148
163
|
@search_field.val(@search_field.val())
|
@@ -150,7 +165,7 @@ class Chosen extends AbstractChosen
|
|
150
165
|
|
151
166
|
|
152
167
|
test_active_click: (evt) ->
|
153
|
-
if @container.is($(evt.target).closest('.
|
168
|
+
if @container.is($(evt.target).closest('.chosen-container'))
|
154
169
|
@active_field = true
|
155
170
|
else
|
156
171
|
this.close_field()
|
@@ -159,7 +174,7 @@ class Chosen extends AbstractChosen
|
|
159
174
|
@parsing = true
|
160
175
|
@selected_option_count = null
|
161
176
|
|
162
|
-
@results_data =
|
177
|
+
@results_data = SelectParser.select_to_array @form_field
|
163
178
|
|
164
179
|
if @is_multiple
|
165
180
|
@search_choices.find("li.search-choice").remove()
|
@@ -167,10 +182,10 @@ class Chosen extends AbstractChosen
|
|
167
182
|
this.single_set_selected_text()
|
168
183
|
if @disable_search or @form_field.options.length <= @disable_search_threshold
|
169
184
|
@search_field[0].readOnly = true
|
170
|
-
@container.addClass "
|
185
|
+
@container.addClass "chosen-container-single-nosearch"
|
171
186
|
else
|
172
187
|
@search_field[0].readOnly = false
|
173
|
-
@container.removeClass "
|
188
|
+
@container.removeClass "chosen-container-single-nosearch"
|
174
189
|
|
175
190
|
this.update_results_content this.results_option_build({first:true})
|
176
191
|
|
@@ -205,11 +220,11 @@ class Chosen extends AbstractChosen
|
|
205
220
|
|
206
221
|
results_show: ->
|
207
222
|
if @is_multiple and @max_selected_options <= this.choices_count()
|
208
|
-
@form_field_jq.trigger("
|
223
|
+
@form_field_jq.trigger("chosen:maxselected", {chosen: this})
|
209
224
|
return false
|
210
225
|
|
211
|
-
@container.addClass "
|
212
|
-
@form_field_jq.trigger("
|
226
|
+
@container.addClass "chosen-with-drop"
|
227
|
+
@form_field_jq.trigger("chosen:showing_dropdown", {chosen: this})
|
213
228
|
|
214
229
|
@results_showing = true
|
215
230
|
|
@@ -225,17 +240,17 @@ class Chosen extends AbstractChosen
|
|
225
240
|
if @results_showing
|
226
241
|
this.result_clear_highlight()
|
227
242
|
|
228
|
-
@container.removeClass "
|
229
|
-
@form_field_jq.trigger("
|
243
|
+
@container.removeClass "chosen-with-drop"
|
244
|
+
@form_field_jq.trigger("chosen:hiding_dropdown", {chosen: this})
|
230
245
|
|
231
246
|
@results_showing = false
|
232
247
|
|
233
248
|
|
234
249
|
set_tab_index: (el) ->
|
235
|
-
if @
|
236
|
-
ti = @
|
237
|
-
@
|
238
|
-
@search_field.
|
250
|
+
if @form_field.tabIndex
|
251
|
+
ti = @form_field.tabIndex
|
252
|
+
@form_field.tabIndex = -1
|
253
|
+
@search_field[0].tabIndex = ti
|
239
254
|
|
240
255
|
set_label_behavior: ->
|
241
256
|
@form_field_label = @form_field_jq.parents("label") # first check for a parent label
|
@@ -243,7 +258,7 @@ class Chosen extends AbstractChosen
|
|
243
258
|
@form_field_label = $("label[for='#{@form_field.id}']") #next check for a for=#{id}
|
244
259
|
|
245
260
|
if @form_field_label.length > 0
|
246
|
-
@form_field_label.click (evt) => if @is_multiple then this.container_mousedown(evt) else this.activate_field()
|
261
|
+
@form_field_label.bind 'click.chosen', (evt) => if @is_multiple then this.container_mousedown(evt) else this.activate_field()
|
247
262
|
|
248
263
|
show_search_field_default: ->
|
249
264
|
if @is_multiple and this.choices_count() < 1 and not @active_field
|
@@ -273,8 +288,8 @@ class Chosen extends AbstractChosen
|
|
273
288
|
if item.disabled
|
274
289
|
choice.addClass 'search-choice-disabled'
|
275
290
|
else
|
276
|
-
close_link = $('<a />', {
|
277
|
-
close_link.click (evt) => this.choice_destroy_link_click(evt)
|
291
|
+
close_link = $('<a />', { class: 'search-choice-close', 'data-option-array-index': item.array_index })
|
292
|
+
close_link.bind 'click.chosen', (evt) => this.choice_destroy_link_click(evt)
|
278
293
|
choice.append close_link
|
279
294
|
|
280
295
|
@search_container.before choice
|
@@ -285,7 +300,7 @@ class Chosen extends AbstractChosen
|
|
285
300
|
this.choice_destroy $(evt.target) unless @is_disabled
|
286
301
|
|
287
302
|
choice_destroy: (link) ->
|
288
|
-
if this.result_deselect
|
303
|
+
if this.result_deselect( link[0].getAttribute("data-option-array-index") )
|
289
304
|
this.show_search_field_default()
|
290
305
|
|
291
306
|
this.results_hide() if @is_multiple and this.choices_count() > 0 and @search_field.val().length < 1
|
@@ -314,13 +329,17 @@ class Chosen extends AbstractChosen
|
|
314
329
|
this.result_clear_highlight()
|
315
330
|
|
316
331
|
if @is_multiple and @max_selected_options <= this.choices_count()
|
317
|
-
@form_field_jq.trigger("
|
332
|
+
@form_field_jq.trigger("chosen:maxselected", {chosen: this})
|
318
333
|
return false
|
319
334
|
|
320
335
|
if @is_multiple
|
321
336
|
high.removeClass("active-result")
|
322
337
|
else
|
323
|
-
@
|
338
|
+
if @result_single_selected
|
339
|
+
@result_single_selected.removeClass("result-selected")
|
340
|
+
selected_index = @result_single_selected[0].getAttribute('data-option-array-index')
|
341
|
+
@results_data[selected_index].selected = false
|
342
|
+
|
324
343
|
@result_single_selected = high
|
325
344
|
|
326
345
|
high.addClass "result-selected"
|
@@ -346,10 +365,10 @@ class Chosen extends AbstractChosen
|
|
346
365
|
|
347
366
|
single_set_selected_text: (text=@default_text) ->
|
348
367
|
if text is @default_text
|
349
|
-
@selected_item.addClass("
|
368
|
+
@selected_item.addClass("chosen-default")
|
350
369
|
else
|
351
370
|
this.single_deselect_control_build()
|
352
|
-
@selected_item.removeClass("
|
371
|
+
@selected_item.removeClass("chosen-default")
|
353
372
|
|
354
373
|
@selected_item.find("span").text(text)
|
355
374
|
|
@@ -375,7 +394,7 @@ class Chosen extends AbstractChosen
|
|
375
394
|
single_deselect_control_build: ->
|
376
395
|
return unless @allow_single_deselect
|
377
396
|
@selected_item.find("span").first().after "<abbr class=\"search-choice-close\"></abbr>" unless @selected_item.find("abbr").length
|
378
|
-
@selected_item.addClass("
|
397
|
+
@selected_item.addClass("chosen-single-with-deselect")
|
379
398
|
|
380
399
|
get_search_text: ->
|
381
400
|
if @search_field.val() is @default_text then "" else $('<div/>').text($.trim(@search_field.val())).html()
|
@@ -482,5 +501,3 @@ class Chosen extends AbstractChosen
|
|
482
501
|
w = f_width - 10
|
483
502
|
|
484
503
|
@search_field.css({'width': w + 'px'})
|
485
|
-
|
486
|
-
root.Chosen = Chosen
|
@@ -1,57 +1,52 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
class Chosen extends AbstractChosen
|
1
|
+
class @Chosen extends AbstractChosen
|
4
2
|
|
5
3
|
setup: ->
|
6
4
|
@current_selectedIndex = @form_field.selectedIndex
|
7
|
-
@is_rtl = @form_field.hasClassName "
|
8
|
-
|
9
|
-
finish_setup: ->
|
10
|
-
@form_field.addClassName "chzn-done"
|
5
|
+
@is_rtl = @form_field.hasClassName "chosen-rtl"
|
11
6
|
|
12
7
|
set_default_values: ->
|
13
8
|
super()
|
14
9
|
|
15
10
|
# HTML Templates
|
16
|
-
@single_temp = new Template('<a
|
17
|
-
@multi_temp = new Template('<ul class="
|
11
|
+
@single_temp = new Template('<a class="chosen-single chosen-default" tabindex="-1"><span>#{default}</span><div><b></b></div></a><div class="chosen-drop"><div class="chosen-search"><input type="text" autocomplete="off" /></div><ul class="chosen-results"></ul></div>')
|
12
|
+
@multi_temp = new Template('<ul class="chosen-choices"><li class="search-field"><input type="text" value="#{default}" class="default" autocomplete="off" style="width:25px;" /></li></ul><div class="chosen-drop"><ul class="chosen-results"></ul></div>')
|
18
13
|
@no_results_temp = new Template('<li class="no-results">' + @results_none_found + ' "<span>#{terms}</span>"</li>')
|
19
14
|
|
20
15
|
set_up_html: ->
|
21
|
-
container_classes = ["
|
22
|
-
container_classes.push "
|
16
|
+
container_classes = ["chosen-container"]
|
17
|
+
container_classes.push "chosen-container-" + (if @is_multiple then "multi" else "single")
|
23
18
|
container_classes.push @form_field.className if @inherit_select_classes && @form_field.className
|
24
|
-
container_classes.push "
|
19
|
+
container_classes.push "chosen-rtl" if @is_rtl
|
25
20
|
|
26
21
|
container_props =
|
27
22
|
'class': container_classes.join ' '
|
28
23
|
'style': "width: #{this.container_width()};"
|
29
24
|
'title': @form_field.title
|
30
25
|
|
31
|
-
container_props.id = @form_field.id.replace(/[^\w]/g, '_') + "
|
26
|
+
container_props.id = @form_field.id.replace(/[^\w]/g, '_') + "_chosen" if @form_field.id.length
|
32
27
|
|
33
28
|
@container = if @is_multiple then new Element('div', container_props).update( @multi_temp.evaluate({ "default": @default_text}) ) else new Element('div', container_props).update( @single_temp.evaluate({ "default":@default_text }) )
|
34
29
|
|
35
30
|
@form_field.hide().insert({ after: @container })
|
36
|
-
@dropdown = @container.down('div.
|
31
|
+
@dropdown = @container.down('div.chosen-drop')
|
37
32
|
|
38
33
|
@search_field = @container.down('input')
|
39
|
-
@search_results = @container.down('ul.
|
34
|
+
@search_results = @container.down('ul.chosen-results')
|
40
35
|
this.search_field_scale()
|
41
36
|
|
42
37
|
@search_no_results = @container.down('li.no-results')
|
43
38
|
|
44
39
|
if @is_multiple
|
45
|
-
@search_choices = @container.down('ul.
|
40
|
+
@search_choices = @container.down('ul.chosen-choices')
|
46
41
|
@search_container = @container.down('li.search-field')
|
47
42
|
else
|
48
|
-
@search_container = @container.down('div.
|
49
|
-
@selected_item = @container.down('.
|
43
|
+
@search_container = @container.down('div.chosen-search')
|
44
|
+
@selected_item = @container.down('.chosen-single')
|
50
45
|
|
51
46
|
this.results_build()
|
52
47
|
this.set_tab_index()
|
53
48
|
this.set_label_behavior()
|
54
|
-
@form_field.fire("
|
49
|
+
@form_field.fire("chosen:ready", {chosen: this})
|
55
50
|
|
56
51
|
register_observers: ->
|
57
52
|
@container.observe "mousedown", (evt) => this.container_mousedown(evt)
|
@@ -65,9 +60,13 @@ class Chosen extends AbstractChosen
|
|
65
60
|
@search_results.observe "mousewheel", (evt) => this.search_results_mousewheel(evt)
|
66
61
|
@search_results.observe "DOMMouseScroll", (evt) => this.search_results_mousewheel(evt)
|
67
62
|
|
68
|
-
@
|
69
|
-
@
|
70
|
-
@
|
63
|
+
@search_results.observe "touchstart", (evt) => this.search_results_touchstart(evt)
|
64
|
+
@search_results.observe "touchmove", (evt) => this.search_results_touchmove(evt)
|
65
|
+
@search_results.observe "touchend", (evt) => this.search_results_touchend(evt)
|
66
|
+
|
67
|
+
@form_field.observe "chosen:updated", (evt) => this.results_update_field(evt)
|
68
|
+
@form_field.observe "chosen:activate", (evt) => this.activate_field(evt)
|
69
|
+
@form_field.observe "chosen:open", (evt) => this.container_mousedown(evt)
|
71
70
|
|
72
71
|
@search_field.observe "blur", (evt) => this.input_blur(evt)
|
73
72
|
@search_field.observe "keyup", (evt) => this.keyup_checker(evt)
|
@@ -79,15 +78,37 @@ class Chosen extends AbstractChosen
|
|
79
78
|
else
|
80
79
|
@container.observe "click", (evt) => evt.preventDefault() # gobble click of anchor
|
81
80
|
|
81
|
+
destroy: ->
|
82
|
+
document.stopObserving "click", @click_test_action
|
83
|
+
|
84
|
+
@form_field.stopObserving()
|
85
|
+
@container.stopObserving()
|
86
|
+
@search_results.stopObserving()
|
87
|
+
@search_field.stopObserving()
|
88
|
+
@form_field_label.stopObserving() if @form_field_label?
|
89
|
+
|
90
|
+
if @is_multiple
|
91
|
+
@search_choices.stopObserving()
|
92
|
+
@container.select(".search-choice-close").each (choice) ->
|
93
|
+
choice.stopObserving()
|
94
|
+
else
|
95
|
+
@selected_item.stopObserving()
|
96
|
+
|
97
|
+
if @search_field.tabIndex
|
98
|
+
@form_field.tabIndex = @search_field.tabIndex
|
99
|
+
|
100
|
+
@container.remove()
|
101
|
+
@form_field.show()
|
102
|
+
|
82
103
|
search_field_disabled: ->
|
83
104
|
@is_disabled = @form_field.disabled
|
84
105
|
if(@is_disabled)
|
85
|
-
@container.addClassName '
|
106
|
+
@container.addClassName 'chosen-disabled'
|
86
107
|
@search_field.disabled = true
|
87
108
|
@selected_item.stopObserving "focus", @activate_action if !@is_multiple
|
88
109
|
this.close_field()
|
89
110
|
else
|
90
|
-
@container.removeClassName '
|
111
|
+
@container.removeClassName 'chosen-disabled'
|
91
112
|
@search_field.disabled = false
|
92
113
|
@selected_item.observe "focus", @activate_action if !@is_multiple
|
93
114
|
|
@@ -101,7 +122,7 @@ class Chosen extends AbstractChosen
|
|
101
122
|
@search_field.clear() if @is_multiple
|
102
123
|
document.observe "click", @click_test_action
|
103
124
|
this.results_show()
|
104
|
-
else if not @is_multiple and evt and (evt.target is @selected_item || evt.target.up("a.
|
125
|
+
else if not @is_multiple and evt and (evt.target is @selected_item || evt.target.up("a.chosen-single"))
|
105
126
|
this.results_toggle()
|
106
127
|
|
107
128
|
this.activate_field()
|
@@ -117,7 +138,7 @@ class Chosen extends AbstractChosen
|
|
117
138
|
@search_results.scrollTop = delta + @search_results.scrollTop
|
118
139
|
|
119
140
|
blur_test: (evt) ->
|
120
|
-
this.close_field() if not @active_field and @container.hasClassName("
|
141
|
+
this.close_field() if not @active_field and @container.hasClassName("chosen-container-active")
|
121
142
|
|
122
143
|
close_field: ->
|
123
144
|
document.stopObserving "click", @click_test_action
|
@@ -125,21 +146,21 @@ class Chosen extends AbstractChosen
|
|
125
146
|
@active_field = false
|
126
147
|
this.results_hide()
|
127
148
|
|
128
|
-
@container.removeClassName "
|
149
|
+
@container.removeClassName "chosen-container-active"
|
129
150
|
this.clear_backstroke()
|
130
151
|
|
131
152
|
this.show_search_field_default()
|
132
153
|
this.search_field_scale()
|
133
154
|
|
134
155
|
activate_field: ->
|
135
|
-
@container.addClassName "
|
156
|
+
@container.addClassName "chosen-container-active"
|
136
157
|
@active_field = true
|
137
158
|
|
138
159
|
@search_field.value = @search_field.value
|
139
160
|
@search_field.focus()
|
140
161
|
|
141
162
|
test_active_click: (evt) ->
|
142
|
-
if evt.target.up('.
|
163
|
+
if evt.target.up('.chosen-container') is @container
|
143
164
|
@active_field = true
|
144
165
|
else
|
145
166
|
this.close_field()
|
@@ -148,7 +169,7 @@ class Chosen extends AbstractChosen
|
|
148
169
|
@parsing = true
|
149
170
|
@selected_option_count = null
|
150
171
|
|
151
|
-
@results_data =
|
172
|
+
@results_data = SelectParser.select_to_array @form_field
|
152
173
|
|
153
174
|
if @is_multiple
|
154
175
|
@search_choices.select("li.search-choice").invoke("remove")
|
@@ -156,10 +177,10 @@ class Chosen extends AbstractChosen
|
|
156
177
|
this.single_set_selected_text()
|
157
178
|
if @disable_search or @form_field.options.length <= @disable_search_threshold
|
158
179
|
@search_field.readOnly = true
|
159
|
-
@container.addClassName "
|
180
|
+
@container.addClassName "chosen-container-single-nosearch"
|
160
181
|
else
|
161
182
|
@search_field.readOnly = false
|
162
|
-
@container.removeClassName "
|
183
|
+
@container.removeClassName "chosen-container-single-nosearch"
|
163
184
|
|
164
185
|
this.update_results_content this.results_option_build({first:true})
|
165
186
|
|
@@ -193,11 +214,11 @@ class Chosen extends AbstractChosen
|
|
193
214
|
|
194
215
|
results_show: ->
|
195
216
|
if @is_multiple and @max_selected_options <= this.choices_count()
|
196
|
-
@form_field.fire("
|
217
|
+
@form_field.fire("chosen:maxselected", {chosen: this})
|
197
218
|
return false
|
198
219
|
|
199
|
-
@container.addClassName "
|
200
|
-
@form_field.fire("
|
220
|
+
@container.addClassName "chosen-with-drop"
|
221
|
+
@form_field.fire("chosen:showing_dropdown", {chosen: this})
|
201
222
|
|
202
223
|
@results_showing = true
|
203
224
|
|
@@ -213,8 +234,8 @@ class Chosen extends AbstractChosen
|
|
213
234
|
if @results_showing
|
214
235
|
this.result_clear_highlight()
|
215
236
|
|
216
|
-
@container.removeClassName "
|
217
|
-
@form_field.fire("
|
237
|
+
@container.removeClassName "chosen-with-drop"
|
238
|
+
@form_field.fire("chosen:hiding_dropdown", {chosen: this})
|
218
239
|
|
219
240
|
@results_showing = false
|
220
241
|
|
@@ -302,13 +323,17 @@ class Chosen extends AbstractChosen
|
|
302
323
|
this.result_clear_highlight()
|
303
324
|
|
304
325
|
if @is_multiple and @max_selected_options <= this.choices_count()
|
305
|
-
@form_field.fire("
|
326
|
+
@form_field.fire("chosen:maxselected", {chosen: this})
|
306
327
|
return false
|
307
328
|
|
308
329
|
if @is_multiple
|
309
330
|
high.removeClassName("active-result")
|
310
331
|
else
|
311
|
-
@
|
332
|
+
if @result_single_selected
|
333
|
+
@result_single_selected.removeClassName("result-selected")
|
334
|
+
selected_index = @result_single_selected.getAttribute('data-option-array-index')
|
335
|
+
@results_data[selected_index].selected = false
|
336
|
+
|
312
337
|
@result_single_selected = high
|
313
338
|
|
314
339
|
high.addClassName("result-selected")
|
@@ -335,10 +360,10 @@ class Chosen extends AbstractChosen
|
|
335
360
|
|
336
361
|
single_set_selected_text: (text=@default_text) ->
|
337
362
|
if text is @default_text
|
338
|
-
@selected_item.addClassName("
|
363
|
+
@selected_item.addClassName("chosen-default")
|
339
364
|
else
|
340
365
|
this.single_deselect_control_build()
|
341
|
-
@selected_item.removeClassName("
|
366
|
+
@selected_item.removeClassName("chosen-default")
|
342
367
|
|
343
368
|
@selected_item.down("span").update(text)
|
344
369
|
|
@@ -363,7 +388,7 @@ class Chosen extends AbstractChosen
|
|
363
388
|
single_deselect_control_build: ->
|
364
389
|
return unless @allow_single_deselect
|
365
390
|
@selected_item.down("span").insert { after: "<abbr class=\"search-choice-close\"></abbr>" } unless @selected_item.down("abbr")
|
366
|
-
@selected_item.addClassName("
|
391
|
+
@selected_item.addClassName("chosen-single-with-deselect")
|
367
392
|
|
368
393
|
get_search_text: ->
|
369
394
|
if @search_field.value is @default_text then "" else @search_field.value.strip().escapeHTML()
|
@@ -473,5 +498,3 @@ class Chosen extends AbstractChosen
|
|
473
498
|
w = f_width - 10
|
474
499
|
|
475
500
|
@search_field.setStyle({'width': w + 'px'})
|
476
|
-
|
477
|
-
root.Chosen = Chosen
|
@@ -1,5 +1,3 @@
|
|
1
|
-
root = this
|
2
|
-
|
3
1
|
class AbstractChosen
|
4
2
|
|
5
3
|
constructor: (@form_field, @options={}) ->
|
@@ -13,8 +11,6 @@ class AbstractChosen
|
|
13
11
|
this.set_up_html()
|
14
12
|
this.register_observers()
|
15
13
|
|
16
|
-
this.finish_setup()
|
17
|
-
|
18
14
|
set_default_values: ->
|
19
15
|
@click_test_action = (evt) => this.test_active_click(evt)
|
20
16
|
@activate_action = (evt) => this.activate_field(evt)
|
@@ -32,6 +28,8 @@ class AbstractChosen
|
|
32
28
|
@single_backstroke_delete = if @options.single_backstroke_delete? then @options.single_backstroke_delete else true
|
33
29
|
@max_selected_options = @options.max_selected_options || Infinity
|
34
30
|
@inherit_select_classes = @options.inherit_select_classes || false
|
31
|
+
@display_selected_options = if @options.display_selected_options? then @options.display_selected_options else true
|
32
|
+
@display_disabled_options = if @options.display_disabled_options? then @options.display_disabled_options else true
|
35
33
|
|
36
34
|
set_default_text: ->
|
37
35
|
if @form_field.getAttribute("data-placeholder")
|
@@ -60,9 +58,9 @@ class AbstractChosen
|
|
60
58
|
results_option_build: (options) ->
|
61
59
|
content = ''
|
62
60
|
for data in @results_data
|
63
|
-
if data.group
|
61
|
+
if data.group
|
64
62
|
content += this.result_add_group data
|
65
|
-
else
|
63
|
+
else
|
66
64
|
content += this.result_add_option data
|
67
65
|
|
68
66
|
# this select logic pins on an awkward flag
|
@@ -76,6 +74,9 @@ class AbstractChosen
|
|
76
74
|
content
|
77
75
|
|
78
76
|
result_add_option: (option) ->
|
77
|
+
return '' unless option.search_match
|
78
|
+
return '' unless this.include_option_in_results(option)
|
79
|
+
|
79
80
|
classes = []
|
80
81
|
classes.push "active-result" if !option.disabled and !(option.selected and @is_multiple)
|
81
82
|
classes.push "disabled-result" if option.disabled and !(option.selected and @is_multiple)
|
@@ -83,12 +84,23 @@ class AbstractChosen
|
|
83
84
|
classes.push "group-option" if option.group_array_index?
|
84
85
|
classes.push option.classes if option.classes != ""
|
85
86
|
|
86
|
-
|
87
|
+
option_el = document.createElement("li")
|
88
|
+
option_el.className = classes.join(" ")
|
89
|
+
option_el.style.cssText = option.style
|
90
|
+
option_el.setAttribute("data-option-array-index", option.array_index)
|
91
|
+
option_el.innerHTML = option.search_text
|
87
92
|
|
88
|
-
|
93
|
+
this.outerHTML(option_el)
|
89
94
|
|
90
95
|
result_add_group: (group) ->
|
91
|
-
|
96
|
+
return '' unless group.search_match || group.group_match
|
97
|
+
return '' unless group.active_options > 0
|
98
|
+
|
99
|
+
group_el = document.createElement("li")
|
100
|
+
group_el.className = "group-result"
|
101
|
+
group_el.innerHTML = group.search_text
|
102
|
+
|
103
|
+
this.outerHTML(group_el)
|
92
104
|
|
93
105
|
results_update_field: ->
|
94
106
|
this.set_default_text()
|
@@ -116,21 +128,32 @@ class AbstractChosen
|
|
116
128
|
results = 0
|
117
129
|
|
118
130
|
searchText = this.get_search_text()
|
131
|
+
escapedSearchText = searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&")
|
119
132
|
regexAnchor = if @search_contains then "" else "^"
|
120
|
-
regex = new RegExp(regexAnchor +
|
121
|
-
zregex = new RegExp(
|
133
|
+
regex = new RegExp(regexAnchor + escapedSearchText, 'i')
|
134
|
+
zregex = new RegExp(escapedSearchText, 'i')
|
122
135
|
|
123
136
|
for option in @results_data
|
124
|
-
if not option.empty
|
125
137
|
|
126
|
-
|
138
|
+
option.search_match = false
|
139
|
+
results_group = null
|
127
140
|
|
141
|
+
if this.include_option_in_results(option)
|
142
|
+
|
143
|
+
if option.group
|
144
|
+
option.group_match = false
|
145
|
+
option.active_options = 0
|
146
|
+
|
147
|
+
if option.group_array_index? and @results_data[option.group_array_index]
|
148
|
+
results_group = @results_data[option.group_array_index]
|
149
|
+
results += 1 if results_group.active_options is 0 and results_group.search_match
|
150
|
+
results_group.active_options += 1
|
151
|
+
|
128
152
|
unless option.group and not @group_search
|
129
|
-
option.search_match = false
|
130
153
|
|
131
154
|
option.search_text = if option.group then option.label else option.html
|
132
155
|
option.search_match = this.search_string_match(option.search_text, regex)
|
133
|
-
results += 1 if option.search_match
|
156
|
+
results += 1 if option.search_match and not option.group
|
134
157
|
|
135
158
|
if option.search_match
|
136
159
|
if searchText.length
|
@@ -138,14 +161,15 @@ class AbstractChosen
|
|
138
161
|
text = option.search_text.substr(0, startpos + searchText.length) + '</em>' + option.search_text.substr(startpos + searchText.length)
|
139
162
|
option.search_text = text.substr(0, startpos) + '<em>' + text.substr(startpos)
|
140
163
|
|
141
|
-
|
164
|
+
results_group.group_match = true if results_group?
|
142
165
|
|
143
166
|
else if option.group_array_index? and @results_data[option.group_array_index].search_match
|
144
167
|
option.search_match = true
|
145
168
|
|
169
|
+
this.result_clear_highlight()
|
170
|
+
|
146
171
|
if results < 1 and searchText.length
|
147
172
|
this.update_results_content ""
|
148
|
-
this.result_clear_highlight()
|
149
173
|
this.no_results searchText
|
150
174
|
else
|
151
175
|
this.update_results_content this.results_option_build()
|
@@ -199,15 +223,44 @@ class AbstractChosen
|
|
199
223
|
container_width: ->
|
200
224
|
return if @options.width? then @options.width else "#{@form_field.offsetWidth}px"
|
201
225
|
|
226
|
+
include_option_in_results: (option) ->
|
227
|
+
return false if @is_multiple and (not @display_selected_options and option.selected)
|
228
|
+
return false if not @display_disabled_options and option.disabled
|
229
|
+
return false if option.empty
|
230
|
+
|
231
|
+
return true
|
232
|
+
|
233
|
+
search_results_touchstart: (evt) ->
|
234
|
+
@touch_started = true
|
235
|
+
this.search_results_mouseover(evt)
|
236
|
+
|
237
|
+
search_results_touchmove: (evt) ->
|
238
|
+
@touch_started = false
|
239
|
+
this.search_results_mouseout(evt)
|
240
|
+
|
241
|
+
search_results_touchend: (evt) ->
|
242
|
+
this.search_results_mouseup(evt) if @touch_started
|
243
|
+
|
244
|
+
outerHTML: (element) ->
|
245
|
+
return element.outerHTML if element.outerHTML
|
246
|
+
tmp = document.createElement("div")
|
247
|
+
tmp.appendChild(element)
|
248
|
+
tmp.innerHTML
|
249
|
+
|
202
250
|
# class methods and variables ============================================================
|
203
251
|
|
204
252
|
@browser_is_supported: ->
|
205
253
|
if window.navigator.appName == "Microsoft Internet Explorer"
|
206
|
-
return
|
254
|
+
return document.documentMode >= 8
|
255
|
+
if /iP(od|hone)/i.test(window.navigator.userAgent)
|
256
|
+
return false
|
257
|
+
if /Android/i.test(window.navigator.userAgent)
|
258
|
+
return false if /Mobile/i.test(window.navigator.userAgent)
|
207
259
|
return true
|
208
260
|
|
209
261
|
@default_multiple_text: "Select Some Options"
|
210
262
|
@default_single_text: "Select an Option"
|
211
263
|
@default_no_result_text: "No results match"
|
212
264
|
|
213
|
-
|
265
|
+
|
266
|
+
window.AbstractChosen = AbstractChosen
|
@@ -6,7 +6,7 @@ $chosen-sprite: image-url('chosen-sprite.png');
|
|
6
6
|
$chosen-sprite-retina: image-url('chosen-sprite@2x.png');
|
7
7
|
|
8
8
|
/* @group Base */
|
9
|
-
.
|
9
|
+
.chosen-container {
|
10
10
|
position: relative;
|
11
11
|
display: inline-block;
|
12
12
|
vertical-align: middle;
|
@@ -14,7 +14,7 @@ $chosen-sprite-retina: image-url('chosen-sprite@2x.png');
|
|
14
14
|
zoom: 1;
|
15
15
|
*display: inline;
|
16
16
|
@include user-select(none);
|
17
|
-
.
|
17
|
+
.chosen-drop {
|
18
18
|
position: absolute;
|
19
19
|
top: 100%;
|
20
20
|
left: -9999px;
|
@@ -26,15 +26,18 @@ $chosen-sprite-retina: image-url('chosen-sprite@2x.png');
|
|
26
26
|
background: #fff;
|
27
27
|
box-shadow: 0 4px 5px rgba(#000,.15);
|
28
28
|
}
|
29
|
-
&.
|
29
|
+
&.chosen-with-drop .chosen-drop {
|
30
30
|
left: 0;
|
31
31
|
}
|
32
|
+
a{
|
33
|
+
cursor: pointer;
|
34
|
+
}
|
32
35
|
}
|
33
36
|
/* @end */
|
34
37
|
|
35
38
|
/* @group Single Chosen */
|
36
|
-
.
|
37
|
-
.
|
39
|
+
.chosen-container-single{
|
40
|
+
.chosen-single {
|
38
41
|
position: relative;
|
39
42
|
display: block;
|
40
43
|
overflow: hidden;
|
@@ -51,20 +54,20 @@ $chosen-sprite-retina: image-url('chosen-sprite@2x.png');
|
|
51
54
|
white-space: nowrap;
|
52
55
|
line-height: 24px;
|
53
56
|
}
|
54
|
-
.
|
57
|
+
.chosen-default {
|
55
58
|
color: #999;
|
56
59
|
}
|
57
|
-
.
|
60
|
+
.chosen-single span {
|
58
61
|
display: block;
|
59
62
|
overflow: hidden;
|
60
63
|
margin-right: 26px;
|
61
64
|
text-overflow: ellipsis;
|
62
65
|
white-space: nowrap;
|
63
66
|
}
|
64
|
-
.
|
67
|
+
.chosen-single-with-deselect span {
|
65
68
|
margin-right: 38px;
|
66
69
|
}
|
67
|
-
.
|
70
|
+
.chosen-single abbr {
|
68
71
|
position: absolute;
|
69
72
|
top: 6px;
|
70
73
|
right: 26px;
|
@@ -77,10 +80,10 @@ $chosen-sprite-retina: image-url('chosen-sprite@2x.png');
|
|
77
80
|
background-position: -42px -10px;
|
78
81
|
}
|
79
82
|
}
|
80
|
-
&.
|
83
|
+
&.chosen-disabled .chosen-single abbr:hover {
|
81
84
|
background-position: -42px -10px;
|
82
85
|
}
|
83
|
-
.
|
86
|
+
.chosen-single div {
|
84
87
|
position: absolute;
|
85
88
|
top: 0;
|
86
89
|
right: 0;
|
@@ -94,7 +97,7 @@ $chosen-sprite-retina: image-url('chosen-sprite@2x.png');
|
|
94
97
|
background: $chosen-sprite no-repeat 0px 2px;
|
95
98
|
}
|
96
99
|
}
|
97
|
-
.
|
100
|
+
.chosen-search {
|
98
101
|
position: relative;
|
99
102
|
z-index: 1010;
|
100
103
|
margin: 0;
|
@@ -116,12 +119,12 @@ $chosen-sprite-retina: image-url('chosen-sprite@2x.png');
|
|
116
119
|
border-radius: 0;
|
117
120
|
}
|
118
121
|
}
|
119
|
-
.
|
122
|
+
.chosen-drop {
|
120
123
|
margin-top: -1px;
|
121
124
|
border-radius: 0 0 4px 4px;
|
122
125
|
background-clip: padding-box;
|
123
126
|
}
|
124
|
-
&.
|
127
|
+
&.chosen-container-single-nosearch .chosen-search {
|
125
128
|
position: absolute;
|
126
129
|
left: -9999px;
|
127
130
|
}
|
@@ -129,7 +132,7 @@ $chosen-sprite-retina: image-url('chosen-sprite@2x.png');
|
|
129
132
|
/* @end */
|
130
133
|
|
131
134
|
/* @group Results */
|
132
|
-
.
|
135
|
+
.chosen-container .chosen-results {
|
133
136
|
position: relative;
|
134
137
|
overflow-x: hidden;
|
135
138
|
overflow-y: auto;
|
@@ -143,6 +146,7 @@ $chosen-sprite-retina: image-url('chosen-sprite@2x.png');
|
|
143
146
|
padding: 5px 6px;
|
144
147
|
list-style: none;
|
145
148
|
line-height: 15px;
|
149
|
+
-webkit-touch-callout: none;
|
146
150
|
&.active-result {
|
147
151
|
display: list-item;
|
148
152
|
cursor: pointer;
|
@@ -178,8 +182,8 @@ $chosen-sprite-retina: image-url('chosen-sprite@2x.png');
|
|
178
182
|
/* @end */
|
179
183
|
|
180
184
|
/* @group Multi Chosen */
|
181
|
-
.
|
182
|
-
.
|
185
|
+
.chosen-container-multi{
|
186
|
+
.chosen-choices {
|
183
187
|
position: relative;
|
184
188
|
overflow: hidden;
|
185
189
|
@include box-sizing(border-box);
|
@@ -193,7 +197,7 @@ $chosen-sprite-retina: image-url('chosen-sprite@2x.png');
|
|
193
197
|
@include background-image(linear-gradient(#eee 1%, #fff 15%));
|
194
198
|
cursor: text;
|
195
199
|
}
|
196
|
-
.
|
200
|
+
.chosen-choices li {
|
197
201
|
float: left;
|
198
202
|
list-style: none;
|
199
203
|
&.search-field {
|
@@ -259,11 +263,11 @@ $chosen-sprite-retina: image-url('chosen-sprite@2x.png');
|
|
259
263
|
}
|
260
264
|
}
|
261
265
|
}
|
262
|
-
.
|
266
|
+
.chosen-results {
|
263
267
|
margin: 0;
|
264
268
|
padding: 0;
|
265
269
|
}
|
266
|
-
.
|
270
|
+
.chosen-drop .result-selected {
|
267
271
|
display: list-item;
|
268
272
|
color: #ccc;
|
269
273
|
cursor: default;
|
@@ -272,13 +276,13 @@ $chosen-sprite-retina: image-url('chosen-sprite@2x.png');
|
|
272
276
|
/* @end */
|
273
277
|
|
274
278
|
/* @group Active */
|
275
|
-
.
|
276
|
-
.
|
279
|
+
.chosen-container-active{
|
280
|
+
.chosen-single {
|
277
281
|
border: 1px solid #5897fb;
|
278
282
|
box-shadow: 0 0 5px rgba(#000,.3);
|
279
283
|
}
|
280
|
-
&.
|
281
|
-
.
|
284
|
+
&.chosen-with-drop{
|
285
|
+
.chosen-single {
|
282
286
|
border: 1px solid #aaa;
|
283
287
|
-moz-border-radius-bottomright: 0;
|
284
288
|
border-bottom-right-radius: 0;
|
@@ -287,7 +291,7 @@ $chosen-sprite-retina: image-url('chosen-sprite@2x.png');
|
|
287
291
|
@include background-image(linear-gradient(#eee 20%, #fff 80%));
|
288
292
|
box-shadow: 0 1px 0 #fff inset;
|
289
293
|
}
|
290
|
-
.
|
294
|
+
.chosen-single div {
|
291
295
|
border-left: none;
|
292
296
|
background: transparent;
|
293
297
|
b {
|
@@ -295,7 +299,7 @@ $chosen-sprite-retina: image-url('chosen-sprite@2x.png');
|
|
295
299
|
}
|
296
300
|
}
|
297
301
|
}
|
298
|
-
.
|
302
|
+
.chosen-choices {
|
299
303
|
border: 1px solid #5897fb;
|
300
304
|
box-shadow: 0 0 5px rgba(#000,.3);
|
301
305
|
li.search-field input[type="text"] {
|
@@ -306,42 +310,42 @@ $chosen-sprite-retina: image-url('chosen-sprite@2x.png');
|
|
306
310
|
/* @end */
|
307
311
|
|
308
312
|
/* @group Disabled Support */
|
309
|
-
.
|
313
|
+
.chosen-disabled {
|
310
314
|
opacity: 0.5 !important;
|
311
315
|
cursor: default;
|
312
|
-
.
|
316
|
+
.chosen-single {
|
313
317
|
cursor: default;
|
314
318
|
}
|
315
|
-
.
|
319
|
+
.chosen-choices .search-choice .search-choice-close {
|
316
320
|
cursor: default;
|
317
321
|
}
|
318
322
|
}
|
319
323
|
/* @end */
|
320
324
|
|
321
325
|
/* @group Right to Left */
|
322
|
-
.
|
326
|
+
.chosen-rtl {
|
323
327
|
text-align: right;
|
324
|
-
.
|
328
|
+
.chosen-single {
|
325
329
|
overflow: visible;
|
326
330
|
padding: 0 8px 0 0;
|
327
331
|
}
|
328
|
-
.
|
332
|
+
.chosen-single span {
|
329
333
|
margin-right: 0;
|
330
334
|
margin-left: 26px;
|
331
335
|
direction: rtl;
|
332
336
|
}
|
333
|
-
.
|
337
|
+
.chosen-single-with-deselect span {
|
334
338
|
margin-left: 38px;
|
335
339
|
}
|
336
|
-
.
|
340
|
+
.chosen-single div {
|
337
341
|
right: auto;
|
338
342
|
left: 3px;
|
339
343
|
}
|
340
|
-
.
|
344
|
+
.chosen-single abbr {
|
341
345
|
right: auto;
|
342
346
|
left: 26px;
|
343
347
|
}
|
344
|
-
.
|
348
|
+
.chosen-choices li {
|
345
349
|
float: right;
|
346
350
|
&.search-field input[type="text"] {
|
347
351
|
direction: rtl;
|
@@ -355,33 +359,33 @@ $chosen-sprite-retina: image-url('chosen-sprite@2x.png');
|
|
355
359
|
}
|
356
360
|
}
|
357
361
|
}
|
358
|
-
&.
|
359
|
-
.
|
362
|
+
&.chosen-container-single-nosearch .chosen-search,
|
363
|
+
.chosen-drop {
|
360
364
|
left: 9999px;
|
361
365
|
}
|
362
|
-
&.
|
366
|
+
&.chosen-container-single .chosen-results {
|
363
367
|
margin: 0 0 4px 4px;
|
364
368
|
padding: 0 4px 0 0;
|
365
369
|
}
|
366
|
-
.
|
370
|
+
.chosen-results li.group-option {
|
367
371
|
padding-right: 15px;
|
368
372
|
padding-left: 0;
|
369
373
|
}
|
370
|
-
&.
|
374
|
+
&.chosen-container-active.chosen-with-drop .chosen-single div {
|
371
375
|
border-right: none;
|
372
376
|
}
|
373
|
-
.
|
377
|
+
.chosen-search input[type="text"] {
|
374
378
|
padding: 4px 5px 4px 20px;
|
375
379
|
background: #fff $chosen-sprite no-repeat -30px -20px;
|
376
380
|
@include background($chosen-sprite no-repeat -30px -20px, linear-gradient(#eee 1%, #fff 15%));
|
377
381
|
direction: rtl;
|
378
382
|
}
|
379
|
-
&.
|
380
|
-
.
|
383
|
+
&.chosen-container-single{
|
384
|
+
.chosen-single div b {
|
381
385
|
background-position: 6px 2px;
|
382
386
|
}
|
383
|
-
&.
|
384
|
-
.
|
387
|
+
&.chosen-with-drop{
|
388
|
+
.chosen-single div b {
|
385
389
|
background-position: -12px 2px;
|
386
390
|
}
|
387
391
|
}
|
@@ -392,13 +396,13 @@ $chosen-sprite-retina: image-url('chosen-sprite@2x.png');
|
|
392
396
|
|
393
397
|
/* @group Retina compatibility */
|
394
398
|
@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min-resolution: 144dpi) {
|
395
|
-
.
|
396
|
-
.
|
397
|
-
.
|
398
|
-
.
|
399
|
-
.
|
400
|
-
.
|
401
|
-
.
|
399
|
+
.chosen-rtl .chosen-search input[type="text"],
|
400
|
+
.chosen-container-single .chosen-single abbr,
|
401
|
+
.chosen-container-single .chosen-single div b,
|
402
|
+
.chosen-container-single .chosen-search input[type="text"],
|
403
|
+
.chosen-container-multi .chosen-choices .search-choice .search-choice-close,
|
404
|
+
.chosen-container .chosen-results-scroll-down span,
|
405
|
+
.chosen-container .chosen-results-scroll-up span {
|
402
406
|
background-image: $chosen-sprite-retina !important;
|
403
407
|
background-size: 52px 37px !important;
|
404
408
|
background-repeat: no-repeat !important;
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chosen-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tse-Ching Ho
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-07
|
11
|
+
date: 2013-08-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: railties
|