simple_form 3.4.0 → 5.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/CHANGELOG.md +118 -8
- data/MIT-LICENSE +2 -1
- data/README.md +235 -67
- data/lib/generators/simple_form/install_generator.rb +1 -0
- data/lib/generators/simple_form/templates/README +2 -3
- data/lib/generators/simple_form/templates/_form.html.erb +2 -0
- data/lib/generators/simple_form/templates/_form.html.haml +2 -0
- data/lib/generators/simple_form/templates/_form.html.slim +1 -0
- data/lib/generators/simple_form/templates/config/initializers/simple_form.rb +14 -7
- data/lib/generators/simple_form/templates/config/initializers/simple_form_bootstrap.rb +360 -74
- data/lib/generators/simple_form/templates/config/initializers/simple_form_foundation.rb +20 -8
- data/lib/simple_form/action_view_extensions/builder.rb +1 -0
- data/lib/simple_form/action_view_extensions/form_helper.rb +1 -0
- data/lib/simple_form/components/errors.rb +15 -2
- data/lib/simple_form/components/hints.rb +1 -0
- data/lib/simple_form/components/html5.rb +1 -0
- data/lib/simple_form/components/label_input.rb +2 -1
- data/lib/simple_form/components/labels.rb +12 -7
- data/lib/simple_form/components/maxlength.rb +4 -17
- data/lib/simple_form/components/min_max.rb +1 -0
- data/lib/simple_form/components/minlength.rb +5 -18
- data/lib/simple_form/components/pattern.rb +1 -0
- data/lib/simple_form/components/placeholders.rb +2 -1
- data/lib/simple_form/components/readonly.rb +1 -0
- data/lib/simple_form/components.rb +1 -0
- data/lib/simple_form/error_notification.rb +1 -0
- data/lib/simple_form/form_builder.rb +104 -29
- data/lib/simple_form/helpers/autofocus.rb +1 -0
- data/lib/simple_form/helpers/disabled.rb +1 -0
- data/lib/simple_form/helpers/readonly.rb +1 -0
- data/lib/simple_form/helpers/required.rb +1 -0
- data/lib/simple_form/helpers/validators.rb +2 -1
- data/lib/simple_form/helpers.rb +1 -0
- data/lib/simple_form/inputs/base.rb +24 -5
- data/lib/simple_form/inputs/block_input.rb +1 -0
- data/lib/simple_form/inputs/boolean_input.rb +4 -2
- data/lib/simple_form/inputs/collection_check_boxes_input.rb +3 -2
- data/lib/simple_form/inputs/collection_input.rb +6 -7
- data/lib/simple_form/inputs/collection_radio_buttons_input.rb +2 -1
- data/lib/simple_form/inputs/collection_select_input.rb +1 -0
- data/lib/simple_form/inputs/color_input.rb +14 -0
- data/lib/simple_form/inputs/date_time_input.rb +1 -0
- data/lib/simple_form/inputs/file_input.rb +1 -0
- data/lib/simple_form/inputs/grouped_collection_select_input.rb +1 -0
- data/lib/simple_form/inputs/hidden_input.rb +1 -0
- data/lib/simple_form/inputs/numeric_input.rb +1 -0
- data/lib/simple_form/inputs/password_input.rb +1 -0
- data/lib/simple_form/inputs/priority_input.rb +1 -4
- data/lib/simple_form/inputs/range_input.rb +1 -0
- data/lib/simple_form/inputs/rich_text_area_input.rb +12 -0
- data/lib/simple_form/inputs/string_input.rb +2 -1
- data/lib/simple_form/inputs/text_input.rb +1 -0
- data/lib/simple_form/inputs.rb +3 -0
- data/lib/simple_form/map_type.rb +1 -0
- data/lib/simple_form/railtie.rb +1 -0
- data/lib/simple_form/tags.rb +7 -2
- data/lib/simple_form/version.rb +2 -1
- data/lib/simple_form/wrappers/builder.rb +1 -0
- data/lib/simple_form/wrappers/leaf.rb +2 -1
- data/lib/simple_form/wrappers/many.rb +1 -0
- data/lib/simple_form/wrappers/root.rb +9 -2
- data/lib/simple_form/wrappers/single.rb +2 -1
- data/lib/simple_form/wrappers.rb +1 -0
- data/lib/simple_form.rb +79 -11
- data/test/action_view_extensions/builder_test.rb +28 -9
- data/test/action_view_extensions/form_helper_test.rb +3 -2
- data/test/components/custom_components_test.rb +62 -0
- data/test/components/label_test.rb +33 -8
- data/test/form_builder/association_test.rb +33 -2
- data/test/form_builder/button_test.rb +1 -0
- data/test/form_builder/error_notification_test.rb +1 -0
- data/test/form_builder/error_test.rb +12 -0
- data/test/form_builder/general_test.rb +75 -13
- data/test/form_builder/hint_test.rb +6 -0
- data/test/form_builder/input_field_test.rb +30 -10
- data/test/form_builder/label_test.rb +10 -4
- data/test/form_builder/wrapper_test.rb +32 -5
- data/test/generators/simple_form_generator_test.rb +4 -3
- data/test/inputs/boolean_input_test.rb +17 -0
- data/test/inputs/collection_check_boxes_input_test.rb +38 -18
- data/test/inputs/collection_radio_buttons_input_test.rb +48 -28
- data/test/inputs/collection_select_input_test.rb +46 -43
- data/test/inputs/color_input_test.rb +10 -0
- data/test/inputs/datetime_input_test.rb +7 -16
- data/test/inputs/disabled_test.rb +14 -0
- data/test/inputs/discovery_test.rb +22 -0
- data/test/inputs/file_input_test.rb +1 -0
- data/test/inputs/general_test.rb +3 -2
- data/test/inputs/grouped_collection_select_input_test.rb +11 -10
- data/test/inputs/hidden_input_test.rb +1 -0
- data/test/inputs/numeric_input_test.rb +2 -1
- data/test/inputs/priority_input_test.rb +7 -14
- data/test/inputs/readonly_test.rb +1 -0
- data/test/inputs/required_test.rb +1 -0
- data/test/inputs/rich_text_area_input_test.rb +15 -0
- data/test/inputs/string_input_test.rb +10 -16
- data/test/inputs/text_input_test.rb +1 -0
- data/test/simple_form_test.rb +1 -0
- data/test/support/discovery_inputs.rb +8 -0
- data/test/support/misc_helpers.rb +22 -1
- data/test/support/mock_controller.rb +7 -1
- data/test/support/models.rb +80 -18
- data/test/test_helper.rb +9 -4
- metadata +49 -55
- data/lib/simple_form/i18n_cache.rb +0 -22
@@ -1,16 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module SimpleForm
|
2
3
|
module Inputs
|
3
4
|
class CollectionCheckBoxesInput < CollectionRadioButtonsInput
|
4
5
|
protected
|
5
6
|
|
6
7
|
# Checkbox components do not use the required html tag.
|
7
|
-
# More info: https://github.com/
|
8
|
+
# More info: https://github.com/heartcombo/simple_form/issues/340#issuecomment-2871956
|
8
9
|
def has_required?
|
9
10
|
false
|
10
11
|
end
|
11
12
|
|
12
13
|
def build_nested_boolean_style_item_tag(collection_builder)
|
13
|
-
collection_builder.check_box + collection_builder.text
|
14
|
+
collection_builder.check_box + collection_builder.text.to_s
|
14
15
|
end
|
15
16
|
|
16
17
|
def item_wrapper_class
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module SimpleForm
|
2
3
|
module Inputs
|
3
4
|
class CollectionInput < Base
|
@@ -9,10 +10,8 @@ module SimpleForm
|
|
9
10
|
# Texts can be translated using i18n in "simple_form.yes" and
|
10
11
|
# "simple_form.no" keys. See the example locale file.
|
11
12
|
def self.boolean_collection
|
12
|
-
|
13
|
-
[
|
14
|
-
[I18n.t(:"simple_form.no", default: 'No'), false] ]
|
15
|
-
end
|
13
|
+
[ [I18n.t(:"simple_form.yes", default: 'Yes'), true],
|
14
|
+
[I18n.t(:"simple_form.no", default: 'No'), false] ]
|
16
15
|
end
|
17
16
|
|
18
17
|
def input(wrapper_options = nil)
|
@@ -40,12 +39,12 @@ module SimpleForm
|
|
40
39
|
end
|
41
40
|
|
42
41
|
def has_required?
|
43
|
-
super && (input_options[:include_blank] || input_options[:prompt] || multiple?)
|
42
|
+
super && (input_options[:include_blank] || input_options[:prompt].present? || multiple?)
|
44
43
|
end
|
45
44
|
|
46
45
|
# Check if :include_blank must be included by default.
|
47
46
|
def skip_include_blank?
|
48
|
-
(options.keys & [
|
47
|
+
(options.keys & %i[prompt include_blank default selected]).any? || multiple?
|
49
48
|
end
|
50
49
|
|
51
50
|
def multiple?
|
@@ -89,7 +88,7 @@ module SimpleForm
|
|
89
88
|
end
|
90
89
|
|
91
90
|
def detect_collection_classes(some_collection = collection)
|
92
|
-
some_collection.map
|
91
|
+
some_collection.map(&:class).uniq
|
93
92
|
end
|
94
93
|
|
95
94
|
def collection_includes_basic_objects?(collection_classes)
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module SimpleForm
|
2
3
|
module Inputs
|
3
4
|
class CollectionRadioButtonsInput < CollectionInput
|
@@ -40,7 +41,7 @@ module SimpleForm
|
|
40
41
|
end
|
41
42
|
|
42
43
|
def build_nested_boolean_style_item_tag(collection_builder)
|
43
|
-
collection_builder.radio_button + collection_builder.text
|
44
|
+
collection_builder.radio_button + collection_builder.text.to_s
|
44
45
|
end
|
45
46
|
|
46
47
|
def item_wrapper_class
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module SimpleForm
|
3
|
+
module Inputs
|
4
|
+
class ColorInput < Base
|
5
|
+
def input(wrapper_options = nil)
|
6
|
+
input_html_options[:type] ||= "color" if html5?
|
7
|
+
|
8
|
+
merged_input_options = merge_wrapper_options(input_html_options, wrapper_options)
|
9
|
+
|
10
|
+
@builder.text_field(attribute_name, merged_input_options)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module SimpleForm
|
2
3
|
module Inputs
|
3
4
|
class PriorityInput < CollectionSelectInput
|
@@ -14,10 +15,6 @@ module SimpleForm
|
|
14
15
|
|
15
16
|
protected
|
16
17
|
|
17
|
-
def has_required?
|
18
|
-
false
|
19
|
-
end
|
20
|
-
|
21
18
|
def skip_include_blank?
|
22
19
|
super || input_priority.present?
|
23
20
|
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module SimpleForm
|
3
|
+
module Inputs
|
4
|
+
class RichTextAreaInput < Base
|
5
|
+
def input(wrapper_options = nil)
|
6
|
+
merged_input_options = merge_wrapper_options(input_html_options, wrapper_options)
|
7
|
+
|
8
|
+
@builder.rich_text_area(attribute_name, merged_input_options)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module SimpleForm
|
2
3
|
module Inputs
|
3
4
|
class StringInput < Base
|
@@ -17,7 +18,7 @@ module SimpleForm
|
|
17
18
|
private
|
18
19
|
|
19
20
|
def string?
|
20
|
-
input_type == :string
|
21
|
+
input_type == :string || input_type == :citext
|
21
22
|
end
|
22
23
|
end
|
23
24
|
end
|
data/lib/simple_form/inputs.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module SimpleForm
|
2
3
|
module Inputs
|
3
4
|
extend ActiveSupport::Autoload
|
@@ -9,6 +10,7 @@ module SimpleForm
|
|
9
10
|
autoload :CollectionInput
|
10
11
|
autoload :CollectionRadioButtonsInput
|
11
12
|
autoload :CollectionSelectInput
|
13
|
+
autoload :ColorInput
|
12
14
|
autoload :DateTimeInput
|
13
15
|
autoload :FileInput
|
14
16
|
autoload :GroupedCollectionSelectInput
|
@@ -17,6 +19,7 @@ module SimpleForm
|
|
17
19
|
autoload :PasswordInput
|
18
20
|
autoload :PriorityInput
|
19
21
|
autoload :RangeInput
|
22
|
+
autoload :RichTextAreaInput
|
20
23
|
autoload :StringInput
|
21
24
|
autoload :TextInput
|
22
25
|
end
|
data/lib/simple_form/map_type.rb
CHANGED
data/lib/simple_form/railtie.rb
CHANGED
data/lib/simple_form/tags.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module SimpleForm
|
2
3
|
module Tags
|
3
4
|
module CollectionExtensions
|
@@ -47,7 +48,9 @@ module SimpleForm
|
|
47
48
|
private
|
48
49
|
|
49
50
|
def render_component(builder)
|
50
|
-
|
51
|
+
label_class = "#{@options[:item_label_class]} collection_radio_buttons".strip
|
52
|
+
|
53
|
+
builder.radio_button + builder.label(class: label_class)
|
51
54
|
end
|
52
55
|
end
|
53
56
|
|
@@ -61,7 +64,9 @@ module SimpleForm
|
|
61
64
|
private
|
62
65
|
|
63
66
|
def render_component(builder)
|
64
|
-
|
67
|
+
label_class = "#{@options[:item_label_class]} collection_check_boxes".strip
|
68
|
+
|
69
|
+
builder.check_box + builder.label(class: label_class)
|
65
70
|
end
|
66
71
|
end
|
67
72
|
end
|
data/lib/simple_form/version.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module SimpleForm
|
2
3
|
module Wrappers
|
3
4
|
class Leaf
|
@@ -11,7 +12,7 @@ module SimpleForm
|
|
11
12
|
def render(input)
|
12
13
|
method = input.method(@namespace)
|
13
14
|
|
14
|
-
if method.arity
|
15
|
+
if method.arity.zero?
|
15
16
|
ActiveSupport::Deprecation.warn(SimpleForm::CUSTOM_INPUT_DEPRECATION_WARN % { name: @namespace })
|
16
17
|
|
17
18
|
method.call
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module SimpleForm
|
2
3
|
module Wrappers
|
3
4
|
# `Root` is the root wrapper for all components. It is special cased to
|
@@ -27,10 +28,16 @@ module SimpleForm
|
|
27
28
|
css += SimpleForm.additional_classes_for(:wrapper) do
|
28
29
|
input.additional_classes + [input.input_class]
|
29
30
|
end
|
30
|
-
css << (
|
31
|
-
css << (
|
31
|
+
css << html_class(:error_class, options) { input.has_errors? }
|
32
|
+
css << html_class(:hint_class, options) { input.has_hint? }
|
33
|
+
css << html_class(:valid_class, options) { input.valid? }
|
32
34
|
css.compact
|
33
35
|
end
|
36
|
+
|
37
|
+
def html_class(key, options)
|
38
|
+
css = (options[:"wrapper_#{key}"] || @defaults[key])
|
39
|
+
css if css && yield
|
40
|
+
end
|
34
41
|
end
|
35
42
|
end
|
36
43
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module SimpleForm
|
2
3
|
module Wrappers
|
3
4
|
# `Single` is an optimization for a wrapper that has only one component.
|
@@ -19,7 +20,7 @@ module SimpleForm
|
|
19
20
|
private
|
20
21
|
|
21
22
|
def html_options(options)
|
22
|
-
[
|
23
|
+
%i[label input].include?(namespace) ? {} : super
|
23
24
|
end
|
24
25
|
end
|
25
26
|
end
|
data/lib/simple_form/wrappers.rb
CHANGED
data/lib/simple_form.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'action_view'
|
3
|
+
require 'action_pack'
|
2
4
|
require 'simple_form/action_view_extensions/form_helper'
|
3
5
|
require 'simple_form/action_view_extensions/builder'
|
4
6
|
require 'active_support/core_ext/hash/slice'
|
@@ -33,7 +35,18 @@ to
|
|
33
35
|
|
34
36
|
def %{name}(wrapper_options)
|
35
37
|
|
36
|
-
See https://github.com/
|
38
|
+
See https://github.com/heartcombo/simple_form/pull/997 for more information.
|
39
|
+
WARN
|
40
|
+
|
41
|
+
FILE_METHODS_DEPRECATION_WARN = <<-WARN
|
42
|
+
[SIMPLE_FORM] SimpleForm.file_methods is deprecated and has no effect.
|
43
|
+
|
44
|
+
Since version 5, Simple Form now supports automatically discover of file inputs for the following Gems: activestorage, carrierwave, paperclip, refile and shrine.
|
45
|
+
If you are using a custom method that is not from one of the supported Gems, please change your forms to pass the input type explicitly:
|
46
|
+
|
47
|
+
<%= form.input :avatar, as: :file %>
|
48
|
+
|
49
|
+
See http://blog.plataformatec.com.br/2019/09/incorrect-access-control-in-simple-form-cve-2019-16676 for more information.
|
37
50
|
WARN
|
38
51
|
|
39
52
|
@@configured = false
|
@@ -58,11 +71,11 @@ See https://github.com/plataformatec/simple_form/pull/997 for more information.
|
|
58
71
|
|
59
72
|
# Series of attemps to detect a default label method for collection.
|
60
73
|
mattr_accessor :collection_label_methods
|
61
|
-
@@collection_label_methods = [
|
74
|
+
@@collection_label_methods = %i[to_label name title to_s]
|
62
75
|
|
63
76
|
# Series of attemps to detect a default value method for collection.
|
64
77
|
mattr_accessor :collection_value_methods
|
65
|
-
@@collection_value_methods = [
|
78
|
+
@@collection_value_methods = %i[id to_s]
|
66
79
|
|
67
80
|
# You can wrap a collection of radio/check boxes in a pre-defined tag, defaulting to none.
|
68
81
|
mattr_accessor :collection_wrapper_tag
|
@@ -84,7 +97,7 @@ See https://github.com/plataformatec/simple_form/pull/997 for more information.
|
|
84
97
|
|
85
98
|
# How the label text should be generated altogether with the required text.
|
86
99
|
mattr_accessor :label_text
|
87
|
-
@@label_text =
|
100
|
+
@@label_text = ->(label, required, explicit_label) { "#{required} #{label}" }
|
88
101
|
|
89
102
|
# You can define the class to be used on all labels. Defaults to none.
|
90
103
|
mattr_accessor :label_class
|
@@ -108,7 +121,7 @@ See https://github.com/plataformatec/simple_form/pull/997 for more information.
|
|
108
121
|
|
109
122
|
# You can define which elements should obtain additional classes.
|
110
123
|
mattr_accessor :generate_additional_classes_for
|
111
|
-
@@generate_additional_classes_for = [
|
124
|
+
@@generate_additional_classes_for = %i[wrapper label input]
|
112
125
|
|
113
126
|
# Whether attributes are required by default or not.
|
114
127
|
mattr_accessor :required_by_default
|
@@ -118,10 +131,6 @@ See https://github.com/plataformatec/simple_form/pull/997 for more information.
|
|
118
131
|
mattr_accessor :browser_validations
|
119
132
|
@@browser_validations = true
|
120
133
|
|
121
|
-
# Collection of methods to detect if a file type was given.
|
122
|
-
mattr_accessor :file_methods
|
123
|
-
@@file_methods = [:mounted_as, :file?, :public_filename]
|
124
|
-
|
125
134
|
# Custom mappings for input types. This should be a hash containing a regexp
|
126
135
|
# to match as key, and the input type that will be used when the field name
|
127
136
|
# matches the regexp as value, such as { /count/ => :integer }.
|
@@ -163,7 +172,7 @@ See https://github.com/plataformatec/simple_form/pull/997 for more information.
|
|
163
172
|
|
164
173
|
# Cache SimpleForm inputs discovery.
|
165
174
|
mattr_accessor :cache_discovery
|
166
|
-
@@cache_discovery = defined?(Rails) && !Rails.env.development?
|
175
|
+
@@cache_discovery = defined?(Rails.env) && !Rails.env.development?
|
167
176
|
|
168
177
|
# Adds a class to each generated button, mostly for compatiblity.
|
169
178
|
mattr_accessor :button_class
|
@@ -198,6 +207,12 @@ See https://github.com/plataformatec/simple_form/pull/997 for more information.
|
|
198
207
|
mattr_accessor :i18n_scope
|
199
208
|
@@i18n_scope = 'simple_form'
|
200
209
|
|
210
|
+
mattr_accessor :input_field_error_class
|
211
|
+
@@input_field_error_class = nil
|
212
|
+
|
213
|
+
mattr_accessor :input_field_valid_class
|
214
|
+
@@input_field_valid_class = nil
|
215
|
+
|
201
216
|
# Retrieves a given wrapper
|
202
217
|
def self.wrapper(name)
|
203
218
|
@@wrappers[name.to_s] or raise WrapperNotFound, "Couldn't find wrapper with name #{name}"
|
@@ -227,7 +242,7 @@ See https://github.com/plataformatec/simple_form/pull/997 for more information.
|
|
227
242
|
SimpleForm::Wrappers::Root.new(builder.to_a, options)
|
228
243
|
end
|
229
244
|
|
230
|
-
wrappers class: :input, hint_class: :field_with_hint, error_class: :field_with_errors do |b|
|
245
|
+
wrappers class: :input, hint_class: :field_with_hint, error_class: :field_with_errors, valid_class: :field_without_errors do |b|
|
231
246
|
b.use :html5
|
232
247
|
|
233
248
|
b.use :min_max
|
@@ -257,12 +272,65 @@ See https://github.com/plataformatec/simple_form/pull/997 for more information.
|
|
257
272
|
@@form_class = value
|
258
273
|
end
|
259
274
|
|
275
|
+
def self.file_methods=(file_methods)
|
276
|
+
ActiveSupport::Deprecation.warn(FILE_METHODS_DEPRECATION_WARN, caller)
|
277
|
+
@@file_methods = file_methods
|
278
|
+
end
|
279
|
+
|
280
|
+
def self.file_methods
|
281
|
+
ActiveSupport::Deprecation.warn(FILE_METHODS_DEPRECATION_WARN, caller)
|
282
|
+
@@file_methods
|
283
|
+
end
|
284
|
+
|
260
285
|
# Default way to setup Simple Form. Run rails generate simple_form:install
|
261
286
|
# to create a fresh initializer with all configuration values.
|
262
287
|
def self.setup
|
263
288
|
@@configured = true
|
264
289
|
yield self
|
265
290
|
end
|
291
|
+
|
292
|
+
# Includes a component to be used by Simple Form. Methods defined in a
|
293
|
+
# component will be exposed to be used in the wrapper as Simple::Components
|
294
|
+
#
|
295
|
+
# Examples
|
296
|
+
#
|
297
|
+
# # The application needs to tell where the components will be.
|
298
|
+
# Dir[Rails.root.join('lib/components/**/*.rb')].each { |f| require f }
|
299
|
+
#
|
300
|
+
# # Create a custom component in the path specified above.
|
301
|
+
# # lib/components/input_group_component.rb
|
302
|
+
# module InputGroupComponent
|
303
|
+
# def prepend
|
304
|
+
# ...
|
305
|
+
# end
|
306
|
+
#
|
307
|
+
# def append
|
308
|
+
# ...
|
309
|
+
# end
|
310
|
+
# end
|
311
|
+
#
|
312
|
+
# SimpleForm.setup do |config|
|
313
|
+
# # Create a wrapper using the custom component.
|
314
|
+
# config.wrappers :input_group, tag: :div, error_class: :error do |b|
|
315
|
+
# b.use :label
|
316
|
+
# b.optional :prepend
|
317
|
+
# b.use :input
|
318
|
+
# b.use :append
|
319
|
+
# end
|
320
|
+
# end
|
321
|
+
#
|
322
|
+
# # Using the custom component in the form.
|
323
|
+
# <%= simple_form_for @blog, wrapper: input_group do |f| %>
|
324
|
+
# <%= f.input :title, prepend: true %>
|
325
|
+
# <% end %>
|
326
|
+
#
|
327
|
+
def self.include_component(component)
|
328
|
+
if Module === component
|
329
|
+
SimpleForm::Inputs::Base.include(component)
|
330
|
+
else
|
331
|
+
raise TypeError, "SimpleForm.include_component expects a module but got: #{component.class}"
|
332
|
+
end
|
333
|
+
end
|
266
334
|
end
|
267
335
|
|
268
336
|
require 'simple_form/railtie' if defined?(Rails)
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'test_helper'
|
2
3
|
|
3
4
|
class BuilderTest < ActionView::TestCase
|
@@ -36,7 +37,7 @@ class BuilderTest < ActionView::TestCase
|
|
36
37
|
end
|
37
38
|
|
38
39
|
test "collection radio handles camelized collection values for labels correctly" do
|
39
|
-
with_collection_radio_buttons @user, :active, [
|
40
|
+
with_collection_radio_buttons @user, :active, %w[Yes No], :to_s, :to_s
|
40
41
|
|
41
42
|
assert_select 'form label.collection_radio_buttons[for=user_active_yes]', 'Yes'
|
42
43
|
assert_select 'form label.collection_radio_buttons[for=user_active_no]', 'No'
|
@@ -44,8 +45,17 @@ class BuilderTest < ActionView::TestCase
|
|
44
45
|
|
45
46
|
test "collection radio sanitizes collection values for labels correctly" do
|
46
47
|
with_collection_radio_buttons @user, :name, ['$0.99', '$1.99'], :to_s, :to_s
|
47
|
-
|
48
|
-
|
48
|
+
|
49
|
+
# Rails 6 changed the way it sanitizes the values
|
50
|
+
# https://github.com/rails/rails/blob/6-0-stable/actionview/lib/action_view/helpers/tags/base.rb#L141
|
51
|
+
# https://github.com/rails/rails/blob/5-2-stable/actionview/lib/action_view/helpers/tags/base.rb#L141
|
52
|
+
if ActionView::VERSION::MAJOR == 5
|
53
|
+
assert_select 'label.collection_radio_buttons[for=user_name_099]', '$0.99'
|
54
|
+
assert_select 'label.collection_radio_buttons[for=user_name_199]', '$1.99'
|
55
|
+
else
|
56
|
+
assert_select 'label.collection_radio_buttons[for=user_name_0_99]', '$0.99'
|
57
|
+
assert_select 'label.collection_radio_buttons[for=user_name_1_99]', '$1.99'
|
58
|
+
end
|
49
59
|
end
|
50
60
|
|
51
61
|
test "collection radio checks the correct value to local variables" do
|
@@ -243,7 +253,7 @@ class BuilderTest < ActionView::TestCase
|
|
243
253
|
|
244
254
|
test "collection radio with block helpers does not leak the template" do
|
245
255
|
with_concat_form_for(@user) do |f|
|
246
|
-
collection_input =
|
256
|
+
collection_input = f.collection_radio_buttons :active, [true, false], :to_s, :to_s do |b|
|
247
257
|
b.label(class: b.object) { b.radio_button + b.text }
|
248
258
|
end
|
249
259
|
concat collection_input
|
@@ -283,7 +293,7 @@ class BuilderTest < ActionView::TestCase
|
|
283
293
|
end
|
284
294
|
|
285
295
|
test "collection check box handles camelized collection values for labels correctly" do
|
286
|
-
with_collection_check_boxes @user, :active, [
|
296
|
+
with_collection_check_boxes @user, :active, %w[Yes No], :to_s, :to_s
|
287
297
|
|
288
298
|
assert_select 'form label.collection_check_boxes[for=user_active_yes]', 'Yes'
|
289
299
|
assert_select 'form label.collection_check_boxes[for=user_active_no]', 'No'
|
@@ -291,8 +301,17 @@ class BuilderTest < ActionView::TestCase
|
|
291
301
|
|
292
302
|
test "collection check box sanitizes collection values for labels correctly" do
|
293
303
|
with_collection_check_boxes @user, :name, ['$0.99', '$1.99'], :to_s, :to_s
|
294
|
-
|
295
|
-
|
304
|
+
|
305
|
+
# Rails 6 changed the way it sanitizes the values
|
306
|
+
# https://github.com/rails/rails/blob/6-0-stable/actionview/lib/action_view/helpers/tags/base.rb#L141
|
307
|
+
# https://github.com/rails/rails/blob/5-2-stable/actionview/lib/action_view/helpers/tags/base.rb#L141
|
308
|
+
if ActionView::VERSION::MAJOR == 5
|
309
|
+
assert_select 'label.collection_check_boxes[for=user_name_099]', '$0.99'
|
310
|
+
assert_select 'label.collection_check_boxes[for=user_name_199]', '$1.99'
|
311
|
+
else
|
312
|
+
assert_select 'label.collection_check_boxes[for=user_name_0_99]', '$0.99'
|
313
|
+
assert_select 'label.collection_check_boxes[for=user_name_1_99]', '$1.99'
|
314
|
+
end
|
296
315
|
end
|
297
316
|
|
298
317
|
test "collection check box checks the correct value to local variables" do
|
@@ -317,7 +336,7 @@ class BuilderTest < ActionView::TestCase
|
|
317
336
|
|
318
337
|
test "collection check boxes accepts selected string values as :checked option" do
|
319
338
|
collection = (1..3).map { |i| [i, "Category #{i}"] }
|
320
|
-
with_collection_check_boxes :user, :category_ids, collection, :first, :last, checked: [
|
339
|
+
with_collection_check_boxes :user, :category_ids, collection, :first, :last, checked: %w[1 3]
|
321
340
|
|
322
341
|
assert_select 'input[type=checkbox][value="1"][checked=checked]'
|
323
342
|
assert_select 'input[type=checkbox][value="3"][checked=checked]'
|
@@ -541,7 +560,7 @@ class BuilderTest < ActionView::TestCase
|
|
541
560
|
|
542
561
|
test "collection check boxes with block helpers does not leak the template" do
|
543
562
|
with_concat_form_for(@user) do |f|
|
544
|
-
collection_input =
|
563
|
+
collection_input = f.collection_check_boxes :active, [true, false], :to_s, :to_s do |b|
|
545
564
|
b.label(class: b.object) { b.check_box + b.text }
|
546
565
|
end
|
547
566
|
concat collection_input
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'test_helper'
|
2
3
|
|
3
4
|
class FormHelperTest < ActionView::TestCase
|
@@ -151,7 +152,7 @@ class FormHelperTest < ActionView::TestCase
|
|
151
152
|
end
|
152
153
|
|
153
154
|
test 'SimpleForm for swaps default action view field_error_proc' do
|
154
|
-
expected_error_proc =
|
155
|
+
expected_error_proc = -> {}
|
155
156
|
swap SimpleForm, field_error_proc: expected_error_proc do
|
156
157
|
simple_form_for :user do |f|
|
157
158
|
assert_equal expected_error_proc, ::ActionView::Base.field_error_proc
|
@@ -161,7 +162,7 @@ class FormHelperTest < ActionView::TestCase
|
|
161
162
|
|
162
163
|
private
|
163
164
|
|
164
|
-
def swap_field_error_proc(expected_error_proc =
|
165
|
+
def swap_field_error_proc(expected_error_proc = -> {})
|
165
166
|
swap ActionView::Base, field_error_proc: expected_error_proc do
|
166
167
|
yield
|
167
168
|
|