chosen-rails 0.13.2 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|