simple_form 3.0.4 → 3.1.0.rc1

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.

Potentially problematic release.


This version of simple_form might be problematic. Click here for more details.

Files changed (72) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +32 -43
  3. data/MIT-LICENSE +1 -1
  4. data/README.md +146 -71
  5. data/lib/generators/simple_form/install_generator.rb +2 -2
  6. data/lib/generators/simple_form/templates/README +3 -4
  7. data/lib/generators/simple_form/templates/config/initializers/simple_form.rb +19 -3
  8. data/lib/generators/simple_form/templates/config/initializers/simple_form_bootstrap.rb +83 -22
  9. data/lib/generators/simple_form/templates/config/initializers/simple_form_foundation.rb +1 -1
  10. data/lib/generators/simple_form/templates/config/locales/simple_form.en.yml +7 -2
  11. data/lib/simple_form.rb +38 -6
  12. data/lib/simple_form/action_view_extensions/form_helper.rb +1 -1
  13. data/lib/simple_form/components/errors.rb +27 -5
  14. data/lib/simple_form/components/hints.rb +2 -2
  15. data/lib/simple_form/components/html5.rb +1 -1
  16. data/lib/simple_form/components/label_input.rb +20 -2
  17. data/lib/simple_form/components/labels.rb +9 -5
  18. data/lib/simple_form/components/maxlength.rb +1 -1
  19. data/lib/simple_form/components/min_max.rb +1 -1
  20. data/lib/simple_form/components/pattern.rb +1 -1
  21. data/lib/simple_form/components/placeholders.rb +2 -2
  22. data/lib/simple_form/components/readonly.rb +1 -1
  23. data/lib/simple_form/form_builder.rb +92 -59
  24. data/lib/simple_form/helpers.rb +5 -5
  25. data/lib/simple_form/inputs/base.rb +34 -12
  26. data/lib/simple_form/inputs/block_input.rb +1 -1
  27. data/lib/simple_form/inputs/boolean_input.rb +23 -13
  28. data/lib/simple_form/inputs/collection_input.rb +32 -9
  29. data/lib/simple_form/inputs/collection_radio_buttons_input.rb +6 -11
  30. data/lib/simple_form/inputs/collection_select_input.rb +4 -2
  31. data/lib/simple_form/inputs/date_time_input.rb +12 -2
  32. data/lib/simple_form/inputs/file_input.rb +4 -2
  33. data/lib/simple_form/inputs/grouped_collection_select_input.rb +15 -3
  34. data/lib/simple_form/inputs/hidden_input.rb +4 -2
  35. data/lib/simple_form/inputs/numeric_input.rb +5 -4
  36. data/lib/simple_form/inputs/password_input.rb +4 -2
  37. data/lib/simple_form/inputs/priority_input.rb +4 -2
  38. data/lib/simple_form/inputs/range_input.rb +1 -1
  39. data/lib/simple_form/inputs/string_input.rb +4 -2
  40. data/lib/simple_form/inputs/text_input.rb +4 -2
  41. data/lib/simple_form/railtie.rb +7 -0
  42. data/lib/simple_form/tags.rb +7 -0
  43. data/lib/simple_form/version.rb +1 -1
  44. data/lib/simple_form/wrappers.rb +1 -0
  45. data/lib/simple_form/wrappers/builder.rb +5 -5
  46. data/lib/simple_form/wrappers/leaf.rb +28 -0
  47. data/lib/simple_form/wrappers/many.rb +5 -6
  48. data/lib/simple_form/wrappers/root.rb +1 -1
  49. data/lib/simple_form/wrappers/single.rb +5 -3
  50. data/test/action_view_extensions/builder_test.rb +2 -2
  51. data/test/components/label_test.rb +1 -1
  52. data/test/form_builder/association_test.rb +17 -0
  53. data/test/form_builder/error_notification_test.rb +1 -1
  54. data/test/form_builder/error_test.rb +51 -32
  55. data/test/form_builder/general_test.rb +2 -2
  56. data/test/form_builder/input_field_test.rb +21 -37
  57. data/test/form_builder/label_test.rb +24 -1
  58. data/test/form_builder/wrapper_test.rb +67 -0
  59. data/test/generators/simple_form_generator_test.rb +2 -2
  60. data/test/inputs/boolean_input_test.rb +50 -2
  61. data/test/inputs/collection_check_boxes_input_test.rb +40 -11
  62. data/test/inputs/collection_radio_buttons_input_test.rb +76 -17
  63. data/test/inputs/collection_select_input_test.rb +108 -3
  64. data/test/inputs/datetime_input_test.rb +105 -38
  65. data/test/inputs/discovery_test.rb +12 -1
  66. data/test/inputs/grouped_collection_select_input_test.rb +36 -0
  67. data/test/inputs/string_input_test.rb +20 -0
  68. data/test/simple_form_test.rb +8 -0
  69. data/test/support/discovery_inputs.rb +12 -2
  70. data/test/support/misc_helpers.rb +46 -8
  71. data/test/support/models.rb +49 -24
  72. metadata +7 -7
@@ -21,16 +21,19 @@ module SimpleForm
21
21
  end
22
22
  end
23
23
 
24
- def label
24
+ def label(wrapper_options = nil)
25
+ label_options = merge_wrapper_options(label_html_options, wrapper_options)
26
+
25
27
  if generate_label_for_attribute?
26
- @builder.label(label_target, label_text, label_html_options)
28
+ @builder.label(label_target, label_text, label_options)
27
29
  else
28
- template.label_tag(nil, label_text, label_html_options)
30
+ template.label_tag(nil, label_text, label_options)
29
31
  end
30
32
  end
31
33
 
32
34
  def label_text
33
- SimpleForm.label_text.call(html_escape(raw_label_text), required_label_text).strip.html_safe
35
+ label_text = options[:label_text] || SimpleForm.label_text
36
+ label_text.call(html_escape(raw_label_text), required_label_text, options[:label].present?).strip.html_safe
34
37
  end
35
38
 
36
39
  def label_target
@@ -46,6 +49,7 @@ module SimpleForm
46
49
  if options.key?(:input_html) && options[:input_html].key?(:id)
47
50
  label_options[:for] = options[:input_html][:id]
48
51
  end
52
+
49
53
  label_options
50
54
  end
51
55
 
@@ -62,7 +66,7 @@ module SimpleForm
62
66
 
63
67
  # First check labels translation and then human attribute name.
64
68
  def label_translation #:nodoc:
65
- if SimpleForm.translate_labels && (translated_label = translate(:labels))
69
+ if SimpleForm.translate_labels && (translated_label = translate_from_namespace(:labels))
66
70
  translated_label
67
71
  elsif object.class.respond_to?(:human_attribute_name)
68
72
  object.class.human_attribute_name(reflection_or_attribute_name.to_s)
@@ -2,7 +2,7 @@ module SimpleForm
2
2
  module Components
3
3
  # Needs to be enabled in order to do automatic lookups.
4
4
  module Maxlength
5
- def maxlength
5
+ def maxlength(wrapper_options = nil)
6
6
  input_html_options[:maxlength] ||= maximum_length_from_validation || limit
7
7
  nil
8
8
  end
@@ -1,7 +1,7 @@
1
1
  module SimpleForm
2
2
  module Components
3
3
  module MinMax
4
- def min_max
4
+ def min_max(wrapper_options = nil)
5
5
  if numeric_validator = find_numericality_validator
6
6
  validator_options = numeric_validator.options
7
7
  input_html_options[:min] ||= minimum_value(validator_options)
@@ -2,7 +2,7 @@ module SimpleForm
2
2
  module Components
3
3
  # Needs to be enabled in order to do automatic lookups.
4
4
  module Pattern
5
- def pattern
5
+ def pattern(wrapper_options = nil)
6
6
  input_html_options[:pattern] ||= pattern_source
7
7
  nil
8
8
  end
@@ -2,14 +2,14 @@ module SimpleForm
2
2
  module Components
3
3
  # Needs to be enabled in order to do automatic lookups.
4
4
  module Placeholders
5
- def placeholder
5
+ def placeholder(wrapper_options = nil)
6
6
  input_html_options[:placeholder] ||= placeholder_text
7
7
  nil
8
8
  end
9
9
 
10
10
  def placeholder_text
11
11
  placeholder = options[:placeholder]
12
- placeholder.is_a?(String) ? placeholder : translate(:placeholders)
12
+ placeholder.is_a?(String) ? placeholder : translate_from_namespace(:placeholders)
13
13
  end
14
14
  end
15
15
  end
@@ -2,7 +2,7 @@ module SimpleForm
2
2
  module Components
3
3
  # Needs to be enabled in order to do automatic lookups.
4
4
  module Readonly
5
- def readonly
5
+ def readonly(wrapper_options = nil)
6
6
  if readonly_attribute? && !has_readonly?
7
7
  input_html_options[:readonly] ||= true
8
8
  input_html_classes << :readonly
@@ -8,8 +8,8 @@ module SimpleForm
8
8
 
9
9
  # When action is create or update, we still should use new and edit
10
10
  ACTIONS = {
11
- create: :new,
12
- update: :edit
11
+ 'create' => 'new',
12
+ 'update' => 'edit'
13
13
  }
14
14
 
15
15
  ATTRIBUTE_COMPONENTS = [:html5, :min_max, :maxlength, :placeholder, :pattern, :readonly]
@@ -106,18 +106,13 @@ module SimpleForm
106
106
  # Some inputs, as :time_zone and :country accepts a :priority option. If none is
107
107
  # given SimpleForm.time_zone_priority and SimpleForm.country_priority are used respectively.
108
108
  #
109
- def input(attribute_name, options={}, &block)
109
+ def input(attribute_name, options = {}, &block)
110
110
  options = @defaults.deep_dup.deep_merge(options) if @defaults
111
- input = find_input(attribute_name, options, &block)
112
111
 
113
- chosen =
114
- if name = options[:wrapper] || find_wrapper_mapping(input.input_type)
115
- name.respond_to?(:render) ? name : SimpleForm.wrapper(name)
116
- else
117
- wrapper
118
- end
112
+ input = find_input(attribute_name, options, &block)
113
+ wrapper = find_wrapper(input.input_type, options)
119
114
 
120
- chosen.render input
115
+ wrapper.render input
121
116
  end
122
117
  alias :attribute :input
123
118
 
@@ -135,14 +130,17 @@ module SimpleForm
135
130
  # <input class="string required" id="user_name" maxlength="100"
136
131
  # name="user[name]" type="text" value="Carlos" />
137
132
  #
138
- def input_field(attribute_name, options={})
139
- components = (wrapper.components & ATTRIBUTE_COMPONENTS)
140
-
133
+ def input_field(attribute_name, options = {})
141
134
  options = options.dup
142
- options[:input_html] = options.except(:as, :collection, :label_method, :value_method, *components)
135
+ options[:input_html] = options.except(:as, :boolean_style, :collection, :label_method, :value_method, *ATTRIBUTE_COMPONENTS)
143
136
  options = @defaults.deep_dup.deep_merge(options) if @defaults
144
137
 
145
- SimpleForm::Wrappers::Root.new(components + [:input], wrapper: false).render find_input(attribute_name, options)
138
+ input = find_input(attribute_name, options)
139
+ wrapper = find_wrapper(input.input_type, options)
140
+ components = (wrapper.components.map(&:namespace) & ATTRIBUTE_COMPONENTS) + [:input]
141
+ components = components.map { |component| SimpleForm::Wrappers::Leaf.new(component) }
142
+
143
+ SimpleForm::Wrappers::Root.new(components, wrapper.options.merge(wrapper: false)).render input
146
144
  end
147
145
 
148
146
  # Helper for dealing with association selects/radios, generating the
@@ -173,7 +171,7 @@ module SimpleForm
173
171
  #
174
172
  # Please note that the association helper is currently only tested with Active Record. Depending on the ORM you are using your mileage may vary.
175
173
  #
176
- def association(association, options={}, &block)
174
+ def association(association, options = {}, &block)
177
175
  options = options.dup
178
176
 
179
177
  return simple_fields_for(*[association,
@@ -185,31 +183,9 @@ module SimpleForm
185
183
  raise "Association #{association.inspect} not found" unless reflection
186
184
 
187
185
  options[:as] ||= :select
188
- options[:collection] ||= options.fetch(:collection) {
189
- conditions = reflection.options[:conditions]
190
- conditions = conditions.call if conditions.respond_to?(:call)
191
- reflection.klass.where(conditions).order(reflection.options[:order])
192
- }
193
-
194
- attribute = case reflection.macro
195
- when :belongs_to
196
- (reflection.respond_to?(:options) && reflection.options[:foreign_key]) || :"#{reflection.name}_id"
197
- when :has_one
198
- raise ArgumentError, ":has_one associations are not supported by f.association"
199
- else
200
- if options[:as] == :select
201
- html_options = options[:input_html] ||= {}
202
- html_options[:multiple] = true unless html_options.key?(:multiple)
203
- end
204
-
205
- # Force the association to be preloaded for performance.
206
- if options[:preload] != false && object.respond_to?(association)
207
- target = object.send(association)
208
- target.to_a if target.respond_to?(:to_a)
209
- end
210
-
211
- :"#{reflection.name.to_s.singularize}_ids"
212
- end
186
+ options[:collection] ||= fetch_association_collection(reflection, options)
187
+
188
+ attribute = build_association_attribute(reflection, association, options)
213
189
 
214
190
  input(attribute, options.merge(reflection: reflection))
215
191
  end
@@ -244,7 +220,7 @@ module SimpleForm
244
220
  # f.error :name
245
221
  # f.error :name, id: "cool_error"
246
222
  #
247
- def error(attribute_name, options={})
223
+ def error(attribute_name, options = {})
248
224
  options = options.dup
249
225
 
250
226
  options[:error_html] = options.except(:error_tag, :error_prefix, :error_method)
@@ -261,7 +237,7 @@ module SimpleForm
261
237
  #
262
238
  # f.full_error :token #=> <span class="error">Token is invalid</span>
263
239
  #
264
- def full_error(attribute_name, options={})
240
+ def full_error(attribute_name, options = {})
265
241
  options = options.dup
266
242
 
267
243
  options[:error_prefix] ||= if object.class.respond_to?(:human_attribute_name)
@@ -283,7 +259,7 @@ module SimpleForm
283
259
  # f.hint :name, id: "cool_hint"
284
260
  # f.hint "Don't forget to accept this"
285
261
  #
286
- def hint(attribute_name, options={})
262
+ def hint(attribute_name, options = {})
287
263
  options = options.dup
288
264
 
289
265
  options[:hint_html] = options.except(:hint_tag, :hint)
@@ -334,7 +310,7 @@ module SimpleForm
334
310
  # f.error_notification message: 'Something went wrong'
335
311
  # f.error_notification id: 'user_error_message', class: 'form_error'
336
312
  #
337
- def error_notification(options={})
313
+ def error_notification(options = {})
338
314
  SimpleForm::ErrorNotification.new(self, options).render
339
315
  end
340
316
 
@@ -466,15 +442,56 @@ module SimpleForm
466
442
  @lookup_action ||= begin
467
443
  action = template.controller && template.controller.action_name
468
444
  return unless action
469
- action = action.to_sym
445
+ action = action.to_s
470
446
  ACTIONS[action] || action
471
447
  end
472
448
  end
473
449
 
474
450
  private
475
451
 
452
+ def fetch_association_collection(reflection, options)
453
+ options.fetch(:collection) do
454
+ relation = reflection.klass.all
455
+
456
+ if reflection.respond_to?(:scope) && reflection.scope
457
+ relation = reflection.klass.instance_exec(&reflection.scope)
458
+ else
459
+ order = reflection.options[:order]
460
+ conditions = reflection.options[:conditions]
461
+ conditions = object.instance_exec(&conditions) if conditions.respond_to?(:call)
462
+
463
+ relation = relation.where(conditions)
464
+ relation = relation.order(order) if relation.respond_to?(:order)
465
+ end
466
+
467
+ relation
468
+ end
469
+ end
470
+
471
+ def build_association_attribute(reflection, association, options)
472
+ case reflection.macro
473
+ when :belongs_to
474
+ (reflection.respond_to?(:options) && reflection.options[:foreign_key]) || :"#{reflection.name}_id"
475
+ when :has_one
476
+ raise ArgumentError, ":has_one associations are not supported by f.association"
477
+ else
478
+ if options[:as] == :select
479
+ html_options = options[:input_html] ||= {}
480
+ html_options[:multiple] = true unless html_options.key?(:multiple)
481
+ end
482
+
483
+ # Force the association to be preloaded for performance.
484
+ if options[:preload] != false && object.respond_to?(association)
485
+ target = object.send(association)
486
+ target.to_a if target.respond_to?(:to_a)
487
+ end
488
+
489
+ :"#{reflection.name.to_s.singularize}_ids"
490
+ end
491
+ end
492
+
476
493
  # Find an input based on the attribute name.
477
- def find_input(attribute_name, options={}, &block) #:nodoc:
494
+ def find_input(attribute_name, options = {}, &block)
478
495
  column = find_attribute_column(attribute_name)
479
496
  input_type = default_input_type(attribute_name, column, options)
480
497
 
@@ -488,7 +505,7 @@ module SimpleForm
488
505
  # Attempt to guess the better input type given the defined options. By
489
506
  # default alwayls fallback to the user :as option, or to a :select when a
490
507
  # collection is given.
491
- def default_input_type(attribute_name, column, options) #:nodoc:
508
+ def default_input_type(attribute_name, column, options)
492
509
  return options[:as].to_sym if options[:as]
493
510
  return :select if options[:collection]
494
511
  custom_type = find_custom_type(attribute_name.to_s) and return custom_type
@@ -513,24 +530,24 @@ module SimpleForm
513
530
  end
514
531
  end
515
532
 
516
- def find_custom_type(attribute_name) #:nodoc:
533
+ def find_custom_type(attribute_name)
517
534
  SimpleForm.input_mappings.find { |match, type|
518
535
  attribute_name =~ match
519
536
  }.try(:last) if SimpleForm.input_mappings
520
537
  end
521
538
 
522
- def file_method?(attribute_name) #:nodoc:
539
+ def file_method?(attribute_name)
523
540
  file = @object.send(attribute_name) if @object.respond_to?(attribute_name)
524
541
  file && SimpleForm.file_methods.any? { |m| file.respond_to?(m) }
525
542
  end
526
543
 
527
- def find_attribute_column(attribute_name) #:nodoc:
544
+ def find_attribute_column(attribute_name)
528
545
  if @object.respond_to?(:column_for_attribute)
529
546
  @object.column_for_attribute(attribute_name)
530
547
  end
531
548
  end
532
549
 
533
- def find_association_reflection(association) #:nodoc:
550
+ def find_association_reflection(association)
534
551
  if @object.class.respond_to?(:reflect_on_association)
535
552
  @object.class.reflect_on_association(association)
536
553
  end
@@ -543,7 +560,7 @@ module SimpleForm
543
560
  # b) Or use the found mapping
544
561
  # 2) If not, fallbacks to #{input_type}Input
545
562
  # 3) If not, fallbacks to SimpleForm::Inputs::#{input_type}Input
546
- def find_mapping(input_type) #:nodoc:
563
+ def find_mapping(input_type)
547
564
  discovery_cache[input_type] ||=
548
565
  if mapping = self.class.mappings[input_type]
549
566
  mapping_override(mapping) || mapping
@@ -554,13 +571,29 @@ module SimpleForm
554
571
  end
555
572
  end
556
573
 
557
- def find_wrapper_mapping(input_type) #:nodoc:
558
- SimpleForm.wrapper_mappings && SimpleForm.wrapper_mappings[input_type]
574
+ # Attempts to find a wrapper mapping. It follows the following rules:
575
+ #
576
+ # 1) It tries to find a wrapper for the current form
577
+ # 2) If not, it tries to find a config
578
+ def find_wrapper_mapping(input_type)
579
+ if options[:wrapper_mappings] && options[:wrapper_mappings][input_type]
580
+ options[:wrapper_mappings][input_type]
581
+ else
582
+ SimpleForm.wrapper_mappings && SimpleForm.wrapper_mappings[input_type]
583
+ end
584
+ end
585
+
586
+ def find_wrapper(input_type, options)
587
+ if name = options[:wrapper] || find_wrapper_mapping(input_type)
588
+ name.respond_to?(:render) ? name : SimpleForm.wrapper(name)
589
+ else
590
+ wrapper
591
+ end
559
592
  end
560
593
 
561
594
  # If cache_discovery is enabled, use the class level cache that persists
562
595
  # between requests, otherwise use the instance one.
563
- def discovery_cache #:nodoc:
596
+ def discovery_cache
564
597
  if SimpleForm.cache_discovery
565
598
  self.class.discovery_cache
566
599
  else
@@ -568,14 +601,14 @@ module SimpleForm
568
601
  end
569
602
  end
570
603
 
571
- def mapping_override(klass) #:nodoc:
604
+ def mapping_override(klass)
572
605
  name = klass.name
573
606
  if name =~ /^SimpleForm::Inputs/
574
607
  attempt_mapping name.split("::").last, Object
575
608
  end
576
609
  end
577
610
 
578
- def attempt_mapping(mapping, at) #:nodoc:
611
+ def attempt_mapping(mapping, at)
579
612
  return if SimpleForm.inputs_discovery == false && at == Object
580
613
 
581
614
  begin
@@ -3,10 +3,10 @@ module SimpleForm
3
3
  # For instance, disabled cannot be turned on automatically, it requires the
4
4
  # user to explicitly pass the option disabled: true so it may work.
5
5
  module Helpers
6
- autoload :Autofocus, 'simple_form/helpers/autofocus'
7
- autoload :Disabled, 'simple_form/helpers/disabled'
8
- autoload :Readonly, 'simple_form/helpers/readonly'
9
- autoload :Required, 'simple_form/helpers/required'
10
- autoload :Validators, 'simple_form/helpers/validators'
6
+ autoload :Autofocus, 'simple_form/helpers/autofocus'
7
+ autoload :Disabled, 'simple_form/helpers/disabled'
8
+ autoload :Readonly, 'simple_form/helpers/readonly'
9
+ autoload :Required, 'simple_form/helpers/required'
10
+ autoload :Validators, 'simple_form/helpers/validators'
11
11
  end
12
12
  end
@@ -1,10 +1,12 @@
1
1
  require 'simple_form/i18n_cache'
2
2
  require 'active_support/core_ext/string/output_safety'
3
+ require 'action_view/helpers'
3
4
 
4
5
  module SimpleForm
5
6
  module Inputs
6
7
  class Base
7
8
  include ERB::Util
9
+ include ActionView::Helpers::TranslationHelper
8
10
 
9
11
  extend I18nCache
10
12
 
@@ -45,7 +47,7 @@ module SimpleForm
45
47
  end
46
48
 
47
49
  # Always enabled.
48
- enable :hint, :error
50
+ enable :hint
49
51
 
50
52
  # Usually disabled, needs to be enabled explicitly passing true as option.
51
53
  disable :maxlength, :placeholder, :pattern, :min_max
@@ -53,14 +55,14 @@ module SimpleForm
53
55
  def initialize(builder, attribute_name, column, input_type, options = {})
54
56
  super
55
57
 
56
- options = options.dup
57
- @builder = builder
58
- @attribute_name = attribute_name
59
- @column = column
60
- @input_type = input_type
61
- @reflection = options.delete(:reflection)
62
- @options = options.reverse_merge!(self.class.default_options)
63
- @required = calculate_required
58
+ options = options.dup
59
+ @builder = builder
60
+ @attribute_name = attribute_name
61
+ @column = column
62
+ @input_type = input_type
63
+ @reflection = options.delete(:reflection)
64
+ @options = options.reverse_merge!(self.class.default_options)
65
+ @required = calculate_required
64
66
 
65
67
  # Notice that html_options_for receives a reference to input_html_classes.
66
68
  # This means that classes added dynamically to input_html_classes will
@@ -79,7 +81,7 @@ module SimpleForm
79
81
  end
80
82
  end
81
83
 
82
- def input
84
+ def input(wrapper_options = nil)
83
85
  raise NotImplementedError
84
86
  end
85
87
 
@@ -167,7 +169,7 @@ module SimpleForm
167
169
  # email: 'E-mail.'
168
170
  #
169
171
  # Take a look at our locale example file.
170
- def translate(namespace, default='')
172
+ def translate_from_namespace(namespace, default = '')
171
173
  model_names = lookup_model_names.dup
172
174
  lookups = []
173
175
 
@@ -176,13 +178,33 @@ module SimpleForm
176
178
  model_names.shift
177
179
 
178
180
  lookups << :"#{joined_model_names}.#{lookup_action}.#{reflection_or_attribute_name}"
181
+ lookups << :"#{joined_model_names}.#{lookup_action}.#{reflection_or_attribute_name}_html"
179
182
  lookups << :"#{joined_model_names}.#{reflection_or_attribute_name}"
183
+ lookups << :"#{joined_model_names}.#{reflection_or_attribute_name}_html"
180
184
  end
181
185
  lookups << :"defaults.#{lookup_action}.#{reflection_or_attribute_name}"
186
+ lookups << :"defaults.#{lookup_action}.#{reflection_or_attribute_name}_html"
182
187
  lookups << :"defaults.#{reflection_or_attribute_name}"
188
+ lookups << :"defaults.#{reflection_or_attribute_name}_html"
183
189
  lookups << default
184
190
 
185
- I18n.t(lookups.shift, scope: :"simple_form.#{namespace}", default: lookups).presence
191
+ t(lookups.shift, scope: :"#{i18n_scope}.#{namespace}", default: lookups).presence
192
+ end
193
+
194
+ def merge_wrapper_options(options, wrapper_options)
195
+ if wrapper_options
196
+ options.merge(wrapper_options) do |_, oldval, newval|
197
+ if Array === oldval
198
+ oldval + Array(newval)
199
+ end
200
+ end
201
+ else
202
+ options
203
+ end
204
+ end
205
+
206
+ def i18n_scope
207
+ SimpleForm.i18n_scope
186
208
  end
187
209
  end
188
210
  end