splendeo-dependent_select 0.6.4 → 0.6.5
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/dependent_select/form_helpers.rb +62 -29
- metadata +1 -1
@@ -111,7 +111,7 @@ module DependentSelect::FormHelpers
|
|
111
111
|
# dependent_select generates a javascript array with all the options available to the dependent select.
|
112
112
|
# By default, the name of that variable is automatically generated using the following formula:
|
113
113
|
#
|
114
|
-
# js_array_name = "ds_#{
|
114
|
+
# js_array_name = "ds_#{dependent_field_id}_array"
|
115
115
|
#
|
116
116
|
# This can be overriden by using the js_array_name option (its value will be used instead of the previous)
|
117
117
|
#
|
@@ -272,11 +272,13 @@ module DependentSelect::FormHelpers
|
|
272
272
|
initial_collection = dependent_select_initial_collection(object,
|
273
273
|
method, collection, value_method)
|
274
274
|
|
275
|
-
tag =
|
275
|
+
tag, dependent_field_id = dependent_collection_select_build_tag(
|
276
|
+
object_name, object, method, initial_collection, value_method,
|
276
277
|
text_method, options, html_options)
|
277
278
|
|
278
279
|
script = dependent_select_js_for_collection(object_name, object, method,
|
279
|
-
collection, value_method, text_method, filter_method, options,
|
280
|
+
collection, value_method, text_method, filter_method, options, html_options,
|
281
|
+
extra_options, dependent_field_id)
|
280
282
|
|
281
283
|
return "#{tag}\n#{script}"
|
282
284
|
end
|
@@ -335,10 +337,12 @@ module DependentSelect::FormHelpers
|
|
335
337
|
|
336
338
|
initial_choices = dependent_select_initial_choices(object, method, choices_with_filter)
|
337
339
|
|
338
|
-
tag =
|
340
|
+
tag, dependent_field_id = dependent_select_build_tag(
|
341
|
+
object_name, object, method, initial_collection, value_method,
|
342
|
+
text_method, options, html_options)
|
339
343
|
|
340
344
|
script = dependent_select_js(object_name, method, choices_with_filter,
|
341
|
-
filter_method, options, extra_options)
|
345
|
+
filter_method, options, html_options, extra_options)
|
342
346
|
|
343
347
|
return "#{tag}\n#{script}"
|
344
348
|
end
|
@@ -370,10 +374,10 @@ module DependentSelect::FormHelpers
|
|
370
374
|
# * An extra observer for custon events. These events are raised by the dependent_select itself.
|
371
375
|
# * An first call to update_dependent_select, that sets up the initial stuff
|
372
376
|
def dependent_select_js(object_name, object, method, choices_with_filter,
|
373
|
-
filter_method, options, extra_options)
|
377
|
+
filter_method, options, html_options, extra_options, dependent_field_id)
|
374
378
|
|
375
379
|
# the js variable that will hold the array with option values, texts and filters
|
376
|
-
js_array_name = extra_options[:array_name] || "ds_#{
|
380
|
+
js_array_name = extra_options[:array_name] || "ds_#{dependent_field_id}_array"
|
377
381
|
|
378
382
|
js_array_code = ""
|
379
383
|
|
@@ -382,27 +386,27 @@ module DependentSelect::FormHelpers
|
|
382
386
|
js_array_code += "#{js_array_name} = #{choices_with_filter.to_json};\n"
|
383
387
|
end
|
384
388
|
|
385
|
-
|
386
|
-
|
389
|
+
observed_field_id = dependent_select_calculate_observed_field_id(object_name, object,
|
390
|
+
filter_method, html_options, extra_options)
|
387
391
|
initial_value = dependent_select_initial_value(object, method)
|
388
392
|
include_blank = options[:include_blank] || false
|
389
393
|
collapse_spaces = extra_options[:collapse_spaces] || false
|
390
394
|
|
391
395
|
js_callback =
|
392
|
-
"function(e) { update_dependent_select( '#{
|
396
|
+
"function(e) { update_dependent_select( '#{dependent_field_id}', '#{observed_field_id}', #{js_array_name}, " +
|
393
397
|
"'#{initial_value}', #{include_blank}, #{collapse_spaces}, false); }"
|
394
398
|
|
395
399
|
javascript_tag(js_array_code +
|
396
|
-
"$('#{
|
397
|
-
"$('#{
|
398
|
-
"update_dependent_select( '#{
|
400
|
+
"$('#{observed_field_id}').observe ('change', #{js_callback});\n" +
|
401
|
+
"$('#{observed_field_id}').observe ('DependentSelectFormBuilder:change', #{js_callback}); \n" +
|
402
|
+
"update_dependent_select( '#{dependent_field_id}', '#{observed_field_id}', #{js_array_name}, " +
|
399
403
|
"'#{initial_value}', #{include_blank}, #{collapse_spaces}, true);"
|
400
404
|
)
|
401
405
|
end
|
402
406
|
|
403
407
|
# generates the js script for a dependent_collection_select. See +dependent_select_js+
|
404
408
|
def dependent_select_js_for_collection(object_name, object, method, collection,
|
405
|
-
value_method, text_method, filter_method, options, extra_options)
|
409
|
+
value_method, text_method, filter_method, options, html_options, extra_options, dependent_field_id)
|
406
410
|
|
407
411
|
# the array that, converted to javascript, will be assigned values_var variable,
|
408
412
|
# so it can be used for updating the select
|
@@ -411,7 +415,29 @@ module DependentSelect::FormHelpers
|
|
411
415
|
end
|
412
416
|
|
413
417
|
dependent_select_js(object_name, object, method, choices_with_filter,
|
414
|
-
filter_method, options, extra_options)
|
418
|
+
filter_method, options, html_options, extra_options, dependent_field_id)
|
419
|
+
end
|
420
|
+
|
421
|
+
# returns a collection_select html string and the id of the generated field
|
422
|
+
def dependent_collection_select_build_tag(object_name, object, method, collection, value_method,
|
423
|
+
text_method, options, html_options)
|
424
|
+
dependent_field_id, it = dependent_select_calculate_field_id_and_it(object_name,
|
425
|
+
object, method, html_options)
|
426
|
+
|
427
|
+
tag = it.to_collection_select_tag(collection, value_method, text_method, options, html_options)
|
428
|
+
|
429
|
+
return [tag, dependent_field_id]
|
430
|
+
end
|
431
|
+
|
432
|
+
# returns a select html string and the id of the generated field
|
433
|
+
def dependent_select_build_tag(object_name, object, method, choices, options = {}, html_options = {})
|
434
|
+
|
435
|
+
dependent_field_id, it = dependent_select_calculate_field_id_and_it(object_name,
|
436
|
+
object, method, html_options)
|
437
|
+
|
438
|
+
tag = it.to_select_tag(choices, options, html_options)
|
439
|
+
|
440
|
+
return [tag, dependent_field_id]
|
415
441
|
end
|
416
442
|
|
417
443
|
# Calculates the dom id of the observed field, usually concatenating object_name and filt. meth.
|
@@ -420,24 +446,31 @@ module DependentSelect::FormHelpers
|
|
420
446
|
# it returns the value of that item
|
421
447
|
# * If +extra_options+ has an item with key +:filter_field+,
|
422
448
|
# it uses its value instead of +method+
|
423
|
-
def dependent_select_calculate_observed_field_id(object_name, method,
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
end
|
449
|
+
def dependent_select_calculate_observed_field_id(object_name, object, method,
|
450
|
+
html_options, extra_options)
|
451
|
+
|
452
|
+
return extra_options[:complete_filter_field] if extra_options.has_key? :complete_filter_field
|
453
|
+
method = extra_options[:filter_field] if extra_options.has_key? :filter_field
|
429
454
|
|
430
|
-
|
455
|
+
return dependent_select_calculate_field_id(object_name, object, method, html_options)
|
431
456
|
end
|
432
457
|
|
433
|
-
# calculates
|
434
|
-
def
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
return "#{sanitized_object_name}_#{sanitized_method_name}"
|
458
|
+
# calculates the id of a generated field
|
459
|
+
def dependent_select_calculate_field_id(object_name, object, method, html_options)
|
460
|
+
field_id, it = dependent_select_calculate_field_id_and_it(object_name, object, method, html_options)
|
461
|
+
return field_id
|
439
462
|
end
|
440
|
-
|
463
|
+
|
464
|
+
# ugly hack used to obtain the generated id from a form_helper
|
465
|
+
# uses the method ActionView::Helpers::InstanceTag.add_default_name_and_id,
|
466
|
+
# ...which is a private method of an internal class of rails. filty.
|
467
|
+
def dependent_select_calculate_field_id_and_it(object_name, object, method, html_options)
|
468
|
+
it = ActionView::Helpers::InstanceTag.new(object_name, method, self, object)
|
469
|
+
html_options = html_options.stringify_keys
|
470
|
+
it.send :add_default_name_and_id, html_options #use send since add_default... is private
|
471
|
+
return [ html_options['id'], it]
|
472
|
+
end
|
473
|
+
|
441
474
|
# Returns the collection that will be used when the dependent_select is first displayed
|
442
475
|
# (before even the first update_dependent_select call is done)
|
443
476
|
# The collection is obained by taking all the elements in collection whose value
|