dependent_select 0.6.5 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc
CHANGED
@@ -59,8 +59,7 @@ Finally, the controller might look like this:
|
|
59
59
|
This will generate a regular +collection_select+ for the country and a +dependent_collection_select+
|
60
60
|
for province. The later will be a regular +collection_select+ followed by a js +<script>+ tag that:
|
61
61
|
* Will create an array with all the provinces. (+var array=[province1, province2...];+)
|
62
|
-
* Will place a listeners on the +country_id+ +select+ in order to update the provinces select if
|
63
|
-
the countries select is modified
|
62
|
+
* Will place a listeners on the +country_id+ +select+ in order to update the provinces select if the countries select is modified
|
64
63
|
* Fill up the provinces select with appropiate values.
|
65
64
|
|
66
65
|
*Note that this will not work if you haven't followed the installation procedure - see below*
|
@@ -71,7 +70,7 @@ There's a more complex example at the end of this document.
|
|
71
70
|
|
72
71
|
===As a gem
|
73
72
|
Copy this on config/environment.erb, inside the gems section
|
74
|
-
config.gem "
|
73
|
+
config.gem "dependent_select"
|
75
74
|
Then execute
|
76
75
|
rake gems:install
|
77
76
|
|
@@ -88,7 +87,7 @@ Several steps are needed:
|
|
88
87
|
* And then install the new version
|
89
88
|
|
90
89
|
In other words:
|
91
|
-
sudo gem uninstall
|
90
|
+
sudo gem uninstall dependent_select
|
92
91
|
rm public/javascripts/dependent_select/dependent_select.js
|
93
92
|
rake gems:install
|
94
93
|
|
@@ -180,4 +179,4 @@ On your controller:
|
|
180
179
|
@provinces = Province.find(:all, :order => 'name ASC') # all provinces for all countries
|
181
180
|
@cities = City.find(:all, :order => 'name ASC') # all cities for all provinces
|
182
181
|
end
|
183
|
-
end
|
182
|
+
end
|
@@ -8,7 +8,7 @@ module DependentSelect
|
|
8
8
|
# :collapse_spaces => false
|
9
9
|
# )
|
10
10
|
def self.default_options
|
11
|
-
@default_options ||= { :collapse_spaces => true }
|
11
|
+
@default_options ||= { :collapse_spaces => true, :use_jquery => false }
|
12
12
|
end
|
13
13
|
|
14
14
|
# By default, spaces are collapsed on browsers when printing the select option texts
|
@@ -24,5 +24,18 @@ module DependentSelect
|
|
24
24
|
def self.collapse_spaces=(value)
|
25
25
|
default_options[:collapse_spaces] = value
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
|
+
def self.collapse_spaces?
|
29
|
+
default_options[:collapse_spaces]
|
30
|
+
end
|
31
|
+
|
32
|
+
# By default, dependent_select will use Prototype. If you need to use jquery, you can do so by doing
|
33
|
+
# DependentSelect.use_jquery = true
|
34
|
+
def self.use_jquery=(value)
|
35
|
+
default_options[:use_jquery] = value
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.use_jquery?
|
39
|
+
default_options[:use_jquery]
|
40
|
+
end
|
28
41
|
end
|
@@ -390,18 +390,31 @@ module DependentSelect::FormHelpers
|
|
390
390
|
filter_method, html_options, extra_options)
|
391
391
|
initial_value = dependent_select_initial_value(object, method)
|
392
392
|
include_blank = options[:include_blank] || false
|
393
|
-
collapse_spaces = extra_options[:collapse_spaces] ||
|
394
|
-
|
393
|
+
collapse_spaces = extra_options[:collapse_spaces] || DependentSelect.collapse_spaces?
|
394
|
+
|
395
|
+
|
396
|
+
if(DependentSelect.use_jquery?)
|
397
|
+
js_function = 'update_depentent_select_jquery'
|
398
|
+
else
|
399
|
+
js_function = 'update_dependent_select'
|
400
|
+
end
|
401
|
+
|
395
402
|
js_callback =
|
396
|
-
"function(e) {
|
403
|
+
"function(e) { #{js_function}( '#{dependent_field_id}', '#{observed_field_id}', #{js_array_name}, " +
|
397
404
|
"'#{initial_value}', #{include_blank}, #{collapse_spaces}, false); }"
|
405
|
+
|
406
|
+
if(DependentSelect.use_jquery?)
|
407
|
+
observers = "$('##{observed_field_id}').bind('change', #{js_callback});\n"
|
408
|
+
else
|
409
|
+
observers = "$('#{observed_field_id}').observe('change', #{js_callback});\n" +
|
410
|
+
"$('#{observed_field_id}').observe('DependentSelectFormBuilder:change', #{js_callback}); \n"
|
411
|
+
end
|
398
412
|
|
399
|
-
|
400
|
-
"
|
401
|
-
"
|
402
|
-
|
403
|
-
|
404
|
-
)
|
413
|
+
initial_call =
|
414
|
+
"#{js_function}( '#{dependent_field_id}', '#{observed_field_id}', #{js_array_name}, " +
|
415
|
+
"'#{initial_value}', #{include_blank}, #{collapse_spaces}, true);\n"
|
416
|
+
|
417
|
+
javascript_tag(js_array_code + observers + initial_call)
|
405
418
|
end
|
406
419
|
|
407
420
|
# generates the js script for a dependent_collection_select. See +dependent_select_js+
|
@@ -42,4 +42,61 @@ function update_dependent_select( dependent_id, observed_id, values_array, // ma
|
|
42
42
|
|
43
43
|
// launch a custom event (Prototype doesn't allow launcthing "change") to support dependencies of dependencies
|
44
44
|
dependent_field.fire('DependentSelectFormBuilder:change');
|
45
|
-
}
|
45
|
+
}
|
46
|
+
|
47
|
+
function update_dependent_select_jquery( dependent_id, observed_id, values_array, // mandatory
|
48
|
+
initial_value, include_blank, collapse_spaces, first_run ) { // optional
|
49
|
+
|
50
|
+
// parse the optional parameters ....
|
51
|
+
initial_value = initial_value || '';
|
52
|
+
include_blank = include_blank || false;
|
53
|
+
collapse_spaces = collapse_spaces || false;
|
54
|
+
first_run = first_run || false;
|
55
|
+
|
56
|
+
// select DOM node whose options are modified
|
57
|
+
var dependent_field = $('#'+dependent_id);
|
58
|
+
|
59
|
+
// select DOM node whose changes trigger this
|
60
|
+
var observed_field = $('#'+observed_id);
|
61
|
+
|
62
|
+
// value chosen on observed_select, used for filtering dependent_select
|
63
|
+
var filter = observed_field.value;
|
64
|
+
|
65
|
+
// the first time the update_func is executed (on edit) the value the select has
|
66
|
+
// comes directly from the model. From them on, it will only use the client's input
|
67
|
+
var previous_value = first_run ? initial_value : dependent_field.value;
|
68
|
+
|
69
|
+
// removes all options from dependent_field
|
70
|
+
dependent_field[0].options.length = 0; // empty() gives some trouble in IE7, it seems
|
71
|
+
|
72
|
+
// adds a blank option, only if specified on options
|
73
|
+
if(include_blank) {
|
74
|
+
if(!previous_value) { // it will be selected if previous_value is nil
|
75
|
+
dependent_field.append('<option selected="selected" value=""></option>');
|
76
|
+
} else {
|
77
|
+
dependent_field.append('<option value=""></option>');
|
78
|
+
}
|
79
|
+
}
|
80
|
+
|
81
|
+
// this fills the dependent select
|
82
|
+
values_array.each (function (index) {
|
83
|
+
var arrFilter = this[2];
|
84
|
+
var arrValue = this[1];
|
85
|
+
var arrText = this[0];
|
86
|
+
var opt;
|
87
|
+
if (arrFilter==filter) { // only include options with the right filter field
|
88
|
+
if(collapse_spaces == false) { // assign the text (spaces are automatically collapsed)
|
89
|
+
arrText = arrText.replace(/ /g, '\240'); // replacing spaces with if requested
|
90
|
+
}
|
91
|
+
if(arrValue == previous_value) { // mark it as selected if appropiate
|
92
|
+
opt = '<option selected="selected" value="'+arrValue+'">'+arrText+'</option>'
|
93
|
+
} else {
|
94
|
+
opt = '<option value="'+arrValue+'">'+arrText+'</option>';
|
95
|
+
}
|
96
|
+
dependent_field.append(opt);
|
97
|
+
}
|
98
|
+
});
|
99
|
+
|
100
|
+
// trigger change event so the dependent field is populated
|
101
|
+
dependent_field.trigger('change');
|
102
|
+
}
|