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.
@@ -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)