splendeo-dependent_select 0.6.4 → 0.6.5

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.
@@ -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_#{object_name}_#{method}_array"
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 = collection_select(object_name, method, initial_collection, value_method,
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, extra_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 = select(object_name, method, initial_choices, options, html_options)
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_#{object_name}_#{method}_array"
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
- dependent_id = dependent_select_calculate_id(object_name, method)
386
- observed_id = dependent_select_calculate_observed_field_id(object_name, filter_method, extra_options)
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( '#{dependent_id}', '#{observed_id}', #{js_array_name}, " +
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
- "$('#{observed_id}').observe ('change', #{js_callback});\n" +
397
- "$('#{observed_id}').observe ('DependentSelectFormBuilder:change', #{js_callback}); \n" +
398
- "update_dependent_select( '#{dependent_id}', '#{observed_id}', #{js_array_name}, " +
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, extra_options)
424
- if extra_options.has_key? :complete_filter_field
425
- return extra_options[:complete_filter_field]
426
- elsif extra_options.has_key? :filter_field
427
- method = extra_options[:filter_field]
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
- dependent_select_calculate_id(object_name, method)
455
+ return dependent_select_calculate_field_id(object_name, object, method, html_options)
431
456
  end
432
457
 
433
- # calculates one id. Usually it just concatenates object_method, ie 'employee_city_id'
434
- def dependent_select_calculate_id(object_name, method)
435
- sanitized_object_name = object_name.to_s.gsub(/\]\[|[^-a-zA-Z0-9:.]/, "_").sub(/_$/, "")
436
- sanitized_method_name = method.to_s.sub(/\?$/,"")
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
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: splendeo-dependent_select
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.4
4
+ version: 0.6.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Enrique Garcia Cota (egarcia)