simple_form 2.1.0 → 3.0.0
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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +22 -32
- data/README.md +161 -119
- data/lib/generators/simple_form/install_generator.rb +3 -3
- data/lib/generators/simple_form/templates/README +1 -1
- data/lib/generators/simple_form/templates/config/initializers/simple_form.rb +16 -13
- data/lib/generators/simple_form/templates/config/initializers/simple_form_bootstrap.rb +14 -14
- data/lib/generators/simple_form/templates/config/initializers/simple_form_foundation.rb +3 -3
- data/lib/simple_form/action_view_extensions/builder.rb +1 -319
- data/lib/simple_form/action_view_extensions/form_helper.rb +2 -9
- data/lib/simple_form/components/html5.rb +5 -2
- data/lib/simple_form/components/labels.rb +3 -3
- data/lib/simple_form/components/maxlength.rb +1 -8
- data/lib/simple_form/components/pattern.rb +2 -2
- data/lib/simple_form/components.rb +1 -1
- data/lib/simple_form/error_notification.rb +2 -2
- data/lib/simple_form/form_builder.rb +155 -51
- data/lib/simple_form/helpers.rb +1 -1
- data/lib/simple_form/inputs/base.rb +6 -6
- data/lib/simple_form/inputs/block_input.rb +1 -1
- data/lib/simple_form/inputs/boolean_input.rb +6 -4
- data/lib/simple_form/inputs/collection_input.rb +6 -6
- data/lib/simple_form/inputs/date_time_input.rb +1 -1
- data/lib/simple_form/inputs/numeric_input.rb +0 -6
- data/lib/simple_form/inputs/password_input.rb +0 -1
- data/lib/simple_form/inputs/string_input.rb +0 -1
- data/lib/simple_form/railtie.rb +7 -0
- data/lib/simple_form/tags.rb +62 -0
- data/lib/simple_form/version.rb +1 -1
- data/lib/simple_form/wrappers/builder.rb +5 -29
- data/lib/simple_form/wrappers/many.rb +1 -1
- data/lib/simple_form/wrappers/root.rb +1 -1
- data/lib/simple_form/wrappers.rb +1 -1
- data/lib/simple_form.rb +43 -47
- data/test/action_view_extensions/builder_test.rb +78 -92
- data/test/action_view_extensions/form_helper_test.rb +25 -16
- data/test/components/label_test.rb +46 -46
- data/test/form_builder/association_test.rb +47 -29
- data/test/form_builder/button_test.rb +4 -4
- data/test/form_builder/error_notification_test.rb +8 -8
- data/test/form_builder/error_test.rb +12 -12
- data/test/form_builder/general_test.rb +71 -52
- data/test/form_builder/hint_test.rb +22 -22
- data/test/form_builder/input_field_test.rb +29 -12
- data/test/form_builder/label_test.rb +7 -7
- data/test/form_builder/wrapper_test.rb +21 -21
- data/test/inputs/boolean_input_test.rb +35 -23
- data/test/inputs/collection_check_boxes_input_test.rb +66 -55
- data/test/inputs/collection_radio_buttons_input_test.rb +81 -79
- data/test/inputs/collection_select_input_test.rb +76 -45
- data/test/inputs/datetime_input_test.rb +17 -11
- data/test/inputs/disabled_test.rb +10 -10
- data/test/inputs/discovery_test.rb +4 -4
- data/test/inputs/file_input_test.rb +1 -1
- data/test/inputs/general_test.rb +28 -12
- data/test/inputs/grouped_collection_select_input_test.rb +33 -20
- data/test/inputs/hidden_input_test.rb +3 -2
- data/test/inputs/numeric_input_test.rb +3 -3
- data/test/inputs/priority_input_test.rb +9 -3
- data/test/inputs/readonly_test.rb +12 -12
- data/test/inputs/required_test.rb +5 -5
- data/test/inputs/string_input_test.rb +15 -25
- data/test/inputs/text_input_test.rb +1 -1
- data/test/support/misc_helpers.rb +46 -24
- data/test/support/mock_controller.rb +6 -6
- data/test/support/models.rb +80 -62
- data/test/test_helper.rb +17 -34
- metadata +31 -29
- data/lib/simple_form/core_ext/hash.rb +0 -16
@@ -3,9 +3,9 @@ module SimpleForm
|
|
3
3
|
class InstallGenerator < Rails::Generators::Base
|
4
4
|
desc "Copy SimpleForm default files"
|
5
5
|
source_root File.expand_path('../templates', __FILE__)
|
6
|
-
class_option :template_engine, :
|
7
|
-
class_option :bootstrap, :
|
8
|
-
class_option :foundation, :
|
6
|
+
class_option :template_engine, desc: 'Template engine to be invoked (erb, haml or slim).'
|
7
|
+
class_option :bootstrap, type: :boolean, desc: 'Add the Twitter Bootstrap wrappers to the SimpleForm initializer.'
|
8
|
+
class_option :foundation, type: :boolean, desc: 'Add the Zurb Foundation 3 wrappers to the SimpleForm initializer.'
|
9
9
|
|
10
10
|
def info_bootstrap
|
11
11
|
return if options.bootstrap? || options.foundation?
|
@@ -7,6 +7,6 @@
|
|
7
7
|
classes, '.form-horizontal', '.form-inline', '.form-search' or
|
8
8
|
'.form-vertical', as the following:
|
9
9
|
|
10
|
-
= simple_form_for(@user, :
|
10
|
+
= simple_form_for(@user, html: {class: 'form-horizontal' }) do |form|
|
11
11
|
|
12
12
|
===============================================================================
|
@@ -5,8 +5,8 @@ SimpleForm.setup do |config|
|
|
5
5
|
# wrapper, change the order or even add your own to the
|
6
6
|
# stack. The options given below are used to wrap the
|
7
7
|
# whole input.
|
8
|
-
config.wrappers :default, :
|
9
|
-
:
|
8
|
+
config.wrappers :default, class: :input,
|
9
|
+
hint_class: :field_with_hint, error_class: :field_with_errors do |b|
|
10
10
|
## Extensions enabled by default
|
11
11
|
# Any of these extensions can be disabled for a
|
12
12
|
# given input by passing: `f.input EXTENSION_NAME => false`.
|
@@ -18,7 +18,7 @@ SimpleForm.setup do |config|
|
|
18
18
|
b.use :html5
|
19
19
|
|
20
20
|
# Calculates placeholders automatically from I18n
|
21
|
-
# You can also pass a string as f.input :
|
21
|
+
# You can also pass a string as f.input placeholder: "Placeholder"
|
22
22
|
b.use :placeholder
|
23
23
|
|
24
24
|
## Optional extensions
|
@@ -41,8 +41,8 @@ SimpleForm.setup do |config|
|
|
41
41
|
|
42
42
|
## Inputs
|
43
43
|
b.use :label_input
|
44
|
-
b.use :hint, :
|
45
|
-
b.use :error, :
|
44
|
+
b.use :hint, wrap_with: { tag: :span, class: :hint }
|
45
|
+
b.use :error, wrap_with: { tag: :span, class: :error }
|
46
46
|
end
|
47
47
|
|
48
48
|
# The default wrapper to be used by the FormBuilder.
|
@@ -50,8 +50,8 @@ SimpleForm.setup do |config|
|
|
50
50
|
|
51
51
|
# Define the way to render check boxes / radio buttons with labels.
|
52
52
|
# Defaults to :nested for bootstrap config.
|
53
|
-
# :
|
54
|
-
# :
|
53
|
+
# inline: input + label
|
54
|
+
# nested: label > input
|
55
55
|
config.boolean_style = :nested
|
56
56
|
|
57
57
|
# Default class for buttons
|
@@ -106,8 +106,11 @@ SimpleForm.setup do |config|
|
|
106
106
|
# Whether attributes are required by default (or not). Default is true.
|
107
107
|
# config.required_by_default = true
|
108
108
|
|
109
|
-
# Tell browsers whether to use
|
110
|
-
#
|
109
|
+
# Tell browsers whether to use the native HTML5 validations (novalidate form option).
|
110
|
+
# These validations are enabled in SimpleForm's internal config but disabled by default
|
111
|
+
# in this configuration, which is recommended due to some quirks from different browsers.
|
112
|
+
# To stop SimpleForm from generating the novalidate option, enabling the HTML5 validations,
|
113
|
+
# change this configuration to true.
|
111
114
|
config.browser_validations = false
|
112
115
|
|
113
116
|
# Collection of methods to detect if a file type was given.
|
@@ -120,7 +123,7 @@ SimpleForm.setup do |config|
|
|
120
123
|
|
121
124
|
# Custom wrappers for input types. This should be a hash containing an input
|
122
125
|
# type as key and the wrapper that will be used for all inputs with specified type.
|
123
|
-
# config.wrapper_mappings = { :
|
126
|
+
# config.wrapper_mappings = { string: :prepend }
|
124
127
|
|
125
128
|
# Default priority for time_zone inputs.
|
126
129
|
# config.time_zone_priority = nil
|
@@ -128,9 +131,6 @@ SimpleForm.setup do |config|
|
|
128
131
|
# Default priority for country inputs.
|
129
132
|
# config.country_priority = nil
|
130
133
|
|
131
|
-
# Default size for text inputs.
|
132
|
-
# config.default_input_size = 50
|
133
|
-
|
134
134
|
# When false, do not use translations for labels.
|
135
135
|
# config.translate_labels = true
|
136
136
|
|
@@ -139,4 +139,7 @@ SimpleForm.setup do |config|
|
|
139
139
|
|
140
140
|
# Cache SimpleForm inputs discovery
|
141
141
|
# config.cache_discovery = !Rails.env.development?
|
142
|
+
|
143
|
+
# Default class for inputs
|
144
|
+
# config.input_class = nil
|
142
145
|
end
|
@@ -1,39 +1,39 @@
|
|
1
1
|
# Use this setup block to configure all options available in SimpleForm.
|
2
2
|
SimpleForm.setup do |config|
|
3
|
-
config.wrappers :bootstrap, :
|
3
|
+
config.wrappers :bootstrap, tag: 'div', class: 'control-group', error_class: 'error' do |b|
|
4
4
|
b.use :html5
|
5
5
|
b.use :placeholder
|
6
6
|
b.use :label
|
7
|
-
b.wrapper :
|
7
|
+
b.wrapper tag: 'div', class: 'controls' do |ba|
|
8
8
|
ba.use :input
|
9
|
-
ba.use :error, :
|
10
|
-
ba.use :hint, :
|
9
|
+
ba.use :error, wrap_with: { tag: 'span', class: 'help-inline' }
|
10
|
+
ba.use :hint, wrap_with: { tag: 'p', class: 'help-block' }
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
|
-
config.wrappers :prepend, :
|
14
|
+
config.wrappers :prepend, tag: 'div', class: "control-group", error_class: 'error' do |b|
|
15
15
|
b.use :html5
|
16
16
|
b.use :placeholder
|
17
17
|
b.use :label
|
18
|
-
b.wrapper :
|
19
|
-
input.wrapper :
|
18
|
+
b.wrapper tag: 'div', class: 'controls' do |input|
|
19
|
+
input.wrapper tag: 'div', class: 'input-prepend' do |prepend|
|
20
20
|
prepend.use :input
|
21
21
|
end
|
22
|
-
input.use :hint, :
|
23
|
-
input.use :error, :
|
22
|
+
input.use :hint, wrap_with: { tag: 'span', class: 'help-block' }
|
23
|
+
input.use :error, wrap_with: { tag: 'span', class: 'help-inline' }
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
|
-
config.wrappers :append, :
|
27
|
+
config.wrappers :append, tag: 'div', class: "control-group", error_class: 'error' do |b|
|
28
28
|
b.use :html5
|
29
29
|
b.use :placeholder
|
30
30
|
b.use :label
|
31
|
-
b.wrapper :
|
32
|
-
input.wrapper :
|
31
|
+
b.wrapper tag: 'div', class: 'controls' do |input|
|
32
|
+
input.wrapper tag: 'div', class: 'input-append' do |append|
|
33
33
|
append.use :input
|
34
34
|
end
|
35
|
-
input.use :hint, :
|
36
|
-
input.use :error, :
|
35
|
+
input.use :hint, wrap_with: { tag: 'span', class: 'help-block' }
|
36
|
+
input.use :error, wrap_with: { tag: 'span', class: 'help-inline' }
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# Use this setup block to configure all options available in SimpleForm.
|
2
2
|
SimpleForm.setup do |config|
|
3
|
-
config.wrappers :foundation, :
|
3
|
+
config.wrappers :foundation, class: :input, hint_class: :field_with_hint, error_class: :error do |b|
|
4
4
|
b.use :html5
|
5
5
|
b.use :placeholder
|
6
6
|
b.optional :maxlength
|
@@ -8,11 +8,11 @@ SimpleForm.setup do |config|
|
|
8
8
|
b.optional :min_max
|
9
9
|
b.optional :readonly
|
10
10
|
b.use :label_input
|
11
|
-
b.use :error, :
|
11
|
+
b.use :error, wrap_with: { tag: :small }
|
12
12
|
|
13
13
|
# Uncomment the following line to enable hints. The line is commented out by default since Foundation
|
14
14
|
# does't provide styles for hints. You will need to provide your own CSS styles for hints.
|
15
|
-
# b.use :hint, :
|
15
|
+
# b.use :hint, wrap_with: { tag: :span, class: :hint }
|
16
16
|
end
|
17
17
|
|
18
18
|
# CSS class for buttons
|
@@ -1,187 +1,8 @@
|
|
1
1
|
module SimpleForm
|
2
2
|
module ActionViewExtensions
|
3
|
-
# Base builder to handle each instance of a collection of radio buttons / check boxes.
|
4
|
-
# Based on (at this time upcoming) Rails 4 collection builders.
|
5
|
-
class BuilderBase #:nodoc:
|
6
|
-
attr_reader :object, :text, :value
|
7
|
-
|
8
|
-
def initialize(form_builder, method_name, object, sanitized_attribute_name, text,
|
9
|
-
value, input_html_options)
|
10
|
-
@form_builder = form_builder
|
11
|
-
@method_name = method_name
|
12
|
-
@object = object
|
13
|
-
@sanitized_attribute_name = sanitized_attribute_name
|
14
|
-
@text = text
|
15
|
-
@value = value
|
16
|
-
@input_html_options = input_html_options
|
17
|
-
end
|
18
|
-
|
19
|
-
def label(label_html_options={}, &block)
|
20
|
-
@form_builder.label(@sanitized_attribute_name, @text, label_html_options, &block)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
# Handles generating an instance of radio + label for collection_radio_buttons.
|
25
|
-
class RadioButtonBuilder < BuilderBase #:nodoc:
|
26
|
-
def radio_button(extra_html_options={})
|
27
|
-
html_options = extra_html_options.merge(@input_html_options)
|
28
|
-
@form_builder.radio_button(@method_name, @value, html_options)
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
# Handles generating an instance of check box + label for collection_check_boxes.
|
33
|
-
class CheckBoxBuilder < BuilderBase #:nodoc:
|
34
|
-
def check_box(extra_html_options={})
|
35
|
-
html_options = extra_html_options.merge(@input_html_options)
|
36
|
-
@form_builder.check_box(@method_name, html_options, @value, nil)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
3
|
# A collection of methods required by simple_form but added to rails default form.
|
41
4
|
# This means that you can use such methods outside simple_form context.
|
42
5
|
module Builder
|
43
|
-
# Create a collection of radio inputs for the attribute. Basically this
|
44
|
-
# helper will create a radio input associated with a label for each
|
45
|
-
# text/value option in the collection, using value_method and text_method
|
46
|
-
# to convert these text/value. You can give a symbol or a proc to both
|
47
|
-
# value_method and text_method, that will be evaluated for each item in
|
48
|
-
# the collection.
|
49
|
-
#
|
50
|
-
# == Examples
|
51
|
-
#
|
52
|
-
# form_for @user do |f|
|
53
|
-
# f.collection_radio_buttons :options, [[true, 'Yes'] ,[false, 'No']], :first, :last
|
54
|
-
# end
|
55
|
-
#
|
56
|
-
# <input id="user_options_true" name="user[options]" type="radio" value="true" />
|
57
|
-
# <label class="collection_radio_buttons" for="user_options_true">Yes</label>
|
58
|
-
# <input id="user_options_false" name="user[options]" type="radio" value="false" />
|
59
|
-
# <label class="collection_radio_buttons" for="user_options_false">No</label>
|
60
|
-
#
|
61
|
-
# It is also possible to give a block that should generate the radio +
|
62
|
-
# label. To wrap the radio with the label, for instance:
|
63
|
-
#
|
64
|
-
# form_for @user do |f|
|
65
|
-
# f.collection_radio_buttons(
|
66
|
-
# :options, [[true, 'Yes'] ,[false, 'No']], :first, :last
|
67
|
-
# ) do |b|
|
68
|
-
# b.label { b.radio_button + b.text }
|
69
|
-
# end
|
70
|
-
# end
|
71
|
-
#
|
72
|
-
# == Options
|
73
|
-
#
|
74
|
-
# Collection radio accepts some extra options:
|
75
|
-
#
|
76
|
-
# * checked => the value that should be checked initially.
|
77
|
-
#
|
78
|
-
# * disabled => the value or values that should be disabled. Accepts a single
|
79
|
-
# item or an array of items.
|
80
|
-
#
|
81
|
-
# * collection_wrapper_tag => the tag to wrap the entire collection.
|
82
|
-
#
|
83
|
-
# * collection_wrapper_class => the CSS class to use for collection_wrapper_tag
|
84
|
-
#
|
85
|
-
# * item_wrapper_tag => the tag to wrap each item in the collection.
|
86
|
-
#
|
87
|
-
# * item_wrapper_class => the CSS class to use for item_wrapper_tag
|
88
|
-
#
|
89
|
-
# * a block => to generate the label + radio or any other component.
|
90
|
-
#
|
91
|
-
def collection_radio_buttons(attribute, collection, value_method, text_method, options={}, html_options={})
|
92
|
-
rendered_collection = render_collection(
|
93
|
-
collection, value_method, text_method, options, html_options
|
94
|
-
) do |item, value, text, default_html_options|
|
95
|
-
builder = instantiate_collection_builder(RadioButtonBuilder, attribute, item, value, text, default_html_options)
|
96
|
-
|
97
|
-
if block_given?
|
98
|
-
yield builder
|
99
|
-
else
|
100
|
-
builder.radio_button + builder.label(:class => "collection_radio_buttons")
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
wrap_rendered_collection(rendered_collection, options)
|
105
|
-
end
|
106
|
-
|
107
|
-
# deprecated
|
108
|
-
def collection_radio(*args, &block)
|
109
|
-
SimpleForm.deprecation_warn "The `collection_radio` helper is deprecated, " \
|
110
|
-
"please use `collection_radio_buttons` instead."
|
111
|
-
collection_radio_buttons(*args, &block)
|
112
|
-
end
|
113
|
-
|
114
|
-
# Creates a collection of check boxes for each item in the collection,
|
115
|
-
# associated with a clickable label. Use value_method and text_method to
|
116
|
-
# convert items in the collection for use as text/value in check boxes.
|
117
|
-
# You can give a symbol or a proc to both value_method and text_method,
|
118
|
-
# that will be evaluated for each item in the collection.
|
119
|
-
#
|
120
|
-
# == Examples
|
121
|
-
#
|
122
|
-
# form_for @user do |f|
|
123
|
-
# f.collection_check_boxes :options, [[true, 'Yes'] ,[false, 'No']], :first, :last
|
124
|
-
# end
|
125
|
-
#
|
126
|
-
# <input name="user[options][]" type="hidden" value="" />
|
127
|
-
# <input id="user_options_true" name="user[options][]" type="checkbox" value="true" />
|
128
|
-
# <label class="collection_check_boxes" for="user_options_true">Yes</label>
|
129
|
-
# <input name="user[options][]" type="hidden" value="" />
|
130
|
-
# <input id="user_options_false" name="user[options][]" type="checkbox" value="false" />
|
131
|
-
# <label class="collection_check_boxes" for="user_options_false">No</label>
|
132
|
-
#
|
133
|
-
# It is also possible to give a block that should generate the check box +
|
134
|
-
# label. To wrap the check box with the label, for instance:
|
135
|
-
#
|
136
|
-
# form_for @user do |f|
|
137
|
-
# f.collection_check_boxes(
|
138
|
-
# :options, [[true, 'Yes'] ,[false, 'No']], :first, :last
|
139
|
-
# ) do |b|
|
140
|
-
# b.label { b.check_box + b.text }
|
141
|
-
# end
|
142
|
-
# end
|
143
|
-
#
|
144
|
-
# == Options
|
145
|
-
#
|
146
|
-
# Collection check box accepts some extra options:
|
147
|
-
#
|
148
|
-
# * checked => the value or values that should be checked initially. Accepts
|
149
|
-
# a single item or an array of items. It overrides existing associations.
|
150
|
-
#
|
151
|
-
# * disabled => the value or values that should be disabled. Accepts a single
|
152
|
-
# item or an array of items.
|
153
|
-
#
|
154
|
-
# * collection_wrapper_tag => the tag to wrap the entire collection.
|
155
|
-
#
|
156
|
-
# * collection_wrapper_class => the CSS class to use for collection_wrapper_tag. This option
|
157
|
-
# is ignored if the :collection_wrapper_tag option is blank.
|
158
|
-
#
|
159
|
-
# * item_wrapper_tag => the tag to wrap each item in the collection.
|
160
|
-
#
|
161
|
-
# * item_wrapper_class => the CSS class to use for item_wrapper_tag
|
162
|
-
#
|
163
|
-
# * a block => to generate the label + check box or any other component.
|
164
|
-
#
|
165
|
-
def collection_check_boxes(attribute, collection, value_method, text_method, options={}, html_options={})
|
166
|
-
rendered_collection = render_collection(
|
167
|
-
collection, value_method, text_method, options, html_options
|
168
|
-
) do |item, value, text, default_html_options|
|
169
|
-
default_html_options[:multiple] = true
|
170
|
-
builder = instantiate_collection_builder(CheckBoxBuilder, attribute, item, value, text, default_html_options)
|
171
|
-
|
172
|
-
if block_given?
|
173
|
-
yield builder
|
174
|
-
else
|
175
|
-
builder.check_box + builder.label(:class => "collection_check_boxes")
|
176
|
-
end
|
177
|
-
end
|
178
|
-
|
179
|
-
# Append a hidden field to make sure something will be sent back to the
|
180
|
-
# server if all checkboxes are unchecked.
|
181
|
-
hidden = @template.hidden_field_tag("#{object_name}[#{attribute}][]", "", :id => nil)
|
182
|
-
|
183
|
-
wrap_rendered_collection(rendered_collection + hidden, options)
|
184
|
-
end
|
185
6
|
|
186
7
|
# Wrapper for using SimpleForm inside a default rails form.
|
187
8
|
# Example:
|
@@ -202,73 +23,7 @@ module SimpleForm
|
|
202
23
|
else
|
203
24
|
options[:builder] ||= SimpleForm::FormBuilder
|
204
25
|
end
|
205
|
-
fields_for(*
|
206
|
-
end
|
207
|
-
|
208
|
-
private
|
209
|
-
|
210
|
-
def instantiate_collection_builder(builder_class, attribute, item, value, text, html_options)
|
211
|
-
builder_class.new(self, attribute, item,
|
212
|
-
sanitize_attribute_name(attribute, value), text, value, html_options)
|
213
|
-
end
|
214
|
-
|
215
|
-
# Generate default options for collection helpers, such as :checked and
|
216
|
-
# :disabled.
|
217
|
-
def default_html_options_for_collection(item, value, options, html_options) #:nodoc:
|
218
|
-
html_options = html_options.dup
|
219
|
-
|
220
|
-
[:checked, :selected, :disabled].each do |option|
|
221
|
-
current_option = options[option]
|
222
|
-
next if current_option.nil?
|
223
|
-
|
224
|
-
accept = if current_option.respond_to?(:call)
|
225
|
-
current_option.call(item)
|
226
|
-
else
|
227
|
-
Array(current_option).map(&:to_s).include?(value.to_s)
|
228
|
-
end
|
229
|
-
|
230
|
-
if accept
|
231
|
-
html_options[option] = true
|
232
|
-
elsif option == :checked
|
233
|
-
html_options[option] = false
|
234
|
-
end
|
235
|
-
end
|
236
|
-
|
237
|
-
html_options
|
238
|
-
end
|
239
|
-
|
240
|
-
def sanitize_attribute_name(attribute, value) #:nodoc:
|
241
|
-
"#{attribute}_#{value.to_s.gsub(/\s/, "_").gsub(/[^-\w]/, "").downcase}"
|
242
|
-
end
|
243
|
-
|
244
|
-
def render_collection(collection, value_method, text_method, options={}, html_options={}) #:nodoc:
|
245
|
-
item_wrapper_tag = options.fetch(:item_wrapper_tag, :span)
|
246
|
-
item_wrapper_class = options[:item_wrapper_class]
|
247
|
-
|
248
|
-
collection.map do |item|
|
249
|
-
value = value_for_collection(item, value_method)
|
250
|
-
text = value_for_collection(item, text_method)
|
251
|
-
default_html_options = default_html_options_for_collection(item, value, options, html_options)
|
252
|
-
|
253
|
-
rendered_item = yield item, value, text, default_html_options
|
254
|
-
|
255
|
-
item_wrapper_tag ? @template.content_tag(item_wrapper_tag, rendered_item, :class => item_wrapper_class) : rendered_item
|
256
|
-
end.join.html_safe
|
257
|
-
end
|
258
|
-
|
259
|
-
def value_for_collection(item, value) #:nodoc:
|
260
|
-
value.respond_to?(:call) ? value.call(item) : item.send(value)
|
261
|
-
end
|
262
|
-
|
263
|
-
def wrap_rendered_collection(collection, options)
|
264
|
-
wrapper_tag = options[:collection_wrapper_tag]
|
265
|
-
|
266
|
-
if wrapper_tag
|
267
|
-
wrapper_class = options[:collection_wrapper_class]
|
268
|
-
@template.content_tag(wrapper_tag, collection, :class => wrapper_class)
|
269
|
-
else
|
270
|
-
collection
|
271
|
-
end
|
26
|
+
fields_for(*args, options, &block)
|
272
27
|
end
|
273
28
|
end
|
274
29
|
end
|
@@ -278,77 +33,4 @@ module ActionView::Helpers
|
|
278
33
|
class FormBuilder
|
279
34
|
include SimpleForm::ActionViewExtensions::Builder
|
280
35
|
end
|
281
|
-
|
282
|
-
module FormOptionsHelper
|
283
|
-
# Override Rails options_from_collection_for_select to handle lambdas/procs in
|
284
|
-
# text and value methods, so it works the same way as collection_radio_buttons
|
285
|
-
# and collection_check_boxes in SimpleForm. If none of text/value methods is a
|
286
|
-
# callable object, then it just delegates back to original collection select.
|
287
|
-
# FIXME: remove when support only Rails 4.0 forward
|
288
|
-
# https://github.com/rails/rails/commit/9035324367526af0300477a58b6d3efc15d1a5a8
|
289
|
-
alias :original_options_from_collection_for_select :options_from_collection_for_select
|
290
|
-
def options_from_collection_for_select(collection, value_method, text_method, selected = nil)
|
291
|
-
if value_method.respond_to?(:call) || text_method.respond_to?(:call)
|
292
|
-
collection = collection.map do |item|
|
293
|
-
value = value_for_collection(item, value_method)
|
294
|
-
text = value_for_collection(item, text_method)
|
295
|
-
|
296
|
-
[value, text]
|
297
|
-
end
|
298
|
-
|
299
|
-
value_method, text_method = :first, :last
|
300
|
-
selected = extract_selected_and_disabled_and_call_procs selected, collection
|
301
|
-
end
|
302
|
-
|
303
|
-
original_options_from_collection_for_select collection, value_method, text_method, selected
|
304
|
-
end
|
305
|
-
|
306
|
-
private
|
307
|
-
|
308
|
-
def extract_selected_and_disabled_and_call_procs(selected, collection)
|
309
|
-
selected, disabled = extract_selected_and_disabled selected
|
310
|
-
selected_disabled = { :selected => selected, :disabled => disabled }
|
311
|
-
|
312
|
-
selected_disabled.each do |key, check|
|
313
|
-
if check.is_a? Proc
|
314
|
-
values = collection.map { |option| option.first if check.call(option.first) }
|
315
|
-
selected_disabled[key] = values
|
316
|
-
end
|
317
|
-
end
|
318
|
-
end
|
319
|
-
|
320
|
-
def value_for_collection(item, value) #:nodoc:
|
321
|
-
value.respond_to?(:call) ? value.call(item) : item.send(value)
|
322
|
-
end
|
323
|
-
end
|
324
|
-
|
325
|
-
# Backport Rails fix to checkbox tag element, which does not generate the
|
326
|
-
# hidden input when given nil as unchecked value. This is to make SimpleForm
|
327
|
-
# collection check boxes helper to work fine with nested boolean style, when
|
328
|
-
# they are wrapped in labels. Without that, clicking in the label would
|
329
|
-
# actually change the hidden input, instead of the checkbox.
|
330
|
-
# FIXME: remove when support only Rails >= 3.2.2.
|
331
|
-
class InstanceTag
|
332
|
-
def to_check_box_tag(options = {}, checked_value = "1", unchecked_value = "0")
|
333
|
-
options = options.stringify_keys
|
334
|
-
options["type"] = "checkbox"
|
335
|
-
options["value"] = checked_value
|
336
|
-
if options.has_key?("checked")
|
337
|
-
cv = options.delete "checked"
|
338
|
-
checked = cv == true || cv == "checked"
|
339
|
-
else
|
340
|
-
checked = self.class.check_box_checked?(value(object), checked_value)
|
341
|
-
end
|
342
|
-
options["checked"] = "checked" if checked
|
343
|
-
if options["multiple"]
|
344
|
-
add_default_name_and_id_for_value(checked_value, options)
|
345
|
-
options.delete("multiple")
|
346
|
-
else
|
347
|
-
add_default_name_and_id(options)
|
348
|
-
end
|
349
|
-
hidden = unchecked_value ? tag("input", "name" => options["name"], "type" => "hidden", "value" => unchecked_value, "disabled" => options["disabled"]) : "".html_safe
|
350
|
-
checkbox = tag("input", options)
|
351
|
-
hidden + checkbox
|
352
|
-
end
|
353
|
-
end
|
354
36
|
end
|
@@ -5,17 +5,10 @@ module SimpleForm
|
|
5
5
|
# Example:
|
6
6
|
#
|
7
7
|
# simple_form_for @user do |f|
|
8
|
-
# f.input :name, :
|
8
|
+
# f.input :name, hint: 'My hint'
|
9
9
|
# end
|
10
10
|
#
|
11
11
|
module FormHelper
|
12
|
-
# Override the default ActiveRecordHelper behaviour of wrapping the input.
|
13
|
-
# This gets taken care of semantically by adding an error class to the wrapper tag
|
14
|
-
# containing the input.
|
15
|
-
#
|
16
|
-
FIELD_ERROR_PROC = proc do |html_tag, instance_tag|
|
17
|
-
html_tag
|
18
|
-
end
|
19
12
|
|
20
13
|
def simple_form_for(record, options={}, &block)
|
21
14
|
options[:builder] ||= SimpleForm::FormBuilder
|
@@ -44,7 +37,7 @@ module SimpleForm
|
|
44
37
|
def with_simple_form_field_error_proc
|
45
38
|
default_field_error_proc = ::ActionView::Base.field_error_proc
|
46
39
|
begin
|
47
|
-
::ActionView::Base.field_error_proc =
|
40
|
+
::ActionView::Base.field_error_proc = SimpleForm.field_error_proc
|
48
41
|
yield
|
49
42
|
ensure
|
50
43
|
::ActionView::Base.field_error_proc = default_field_error_proc
|
@@ -7,7 +7,10 @@ module SimpleForm
|
|
7
7
|
|
8
8
|
def html5
|
9
9
|
@html5 = true
|
10
|
-
|
10
|
+
if has_required?
|
11
|
+
input_html_options[:required] = true
|
12
|
+
input_html_options[:'aria-required'] = true
|
13
|
+
end
|
11
14
|
nil
|
12
15
|
end
|
13
16
|
|
@@ -23,4 +26,4 @@ module SimpleForm
|
|
23
26
|
end
|
24
27
|
end
|
25
28
|
end
|
26
|
-
end
|
29
|
+
end
|
@@ -6,18 +6,18 @@ module SimpleForm
|
|
6
6
|
module ClassMethods #:nodoc:
|
7
7
|
def translate_required_html
|
8
8
|
i18n_cache :translate_required_html do
|
9
|
-
I18n.t(:"simple_form.required.html", :
|
9
|
+
I18n.t(:"simple_form.required.html", default:
|
10
10
|
%[<abbr title="#{translate_required_text}">#{translate_required_mark}</abbr>]
|
11
11
|
)
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
15
|
def translate_required_text
|
16
|
-
I18n.t(:"simple_form.required.text", :
|
16
|
+
I18n.t(:"simple_form.required.text", default: 'required')
|
17
17
|
end
|
18
18
|
|
19
19
|
def translate_required_mark
|
20
|
-
I18n.t(:"simple_form.required.mark", :
|
20
|
+
I18n.t(:"simple_form.required.mark", default: '*')
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
@@ -27,14 +27,7 @@ module SimpleForm
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def has_tokenizer?(length_validator)
|
30
|
-
|
31
|
-
|
32
|
-
# TODO: Remove this check when we drop Rails 3.0 support
|
33
|
-
if ActiveModel::Validations::LengthValidator.const_defined?(:DEFAULT_TOKENIZER)
|
34
|
-
tokenizer && tokenizer != ActiveModel::Validations::LengthValidator::DEFAULT_TOKENIZER
|
35
|
-
else
|
36
|
-
tokenizer
|
37
|
-
end
|
30
|
+
length_validator.options[:tokenizer]
|
38
31
|
end
|
39
32
|
end
|
40
33
|
end
|
@@ -13,8 +13,8 @@ module SimpleForm
|
|
13
13
|
pattern = options[:pattern]
|
14
14
|
if pattern.is_a?(String)
|
15
15
|
pattern
|
16
|
-
elsif pattern_validator = find_pattern_validator
|
17
|
-
evaluate_format_validator_option(
|
16
|
+
elsif (pattern_validator = find_pattern_validator) && (with = pattern_validator.options[:with])
|
17
|
+
evaluate_format_validator_option(with).source
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
@@ -2,7 +2,7 @@ module SimpleForm
|
|
2
2
|
# Components are a special type of helpers that can work on their own.
|
3
3
|
# For example, by using a component, it will automatically change the
|
4
4
|
# output under given circumstances without user input. For example,
|
5
|
-
# the disabled helper always need a :
|
5
|
+
# the disabled helper always need a disabled: true option given
|
6
6
|
# to the input in order to be enabled. On the other hand, things like
|
7
7
|
# hints can generate output automatically by doing I18n lookups.
|
8
8
|
module Components
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module SimpleForm
|
2
2
|
class ErrorNotification
|
3
|
-
delegate :object, :object_name, :template, :
|
3
|
+
delegate :object, :object_name, :template, to: :@builder
|
4
4
|
|
5
5
|
def initialize(builder, options)
|
6
6
|
@builder = builder
|
@@ -42,7 +42,7 @@ module SimpleForm
|
|
42
42
|
lookups << :"#{object_name}"
|
43
43
|
lookups << :default_message
|
44
44
|
lookups << "Please review the problems below:"
|
45
|
-
I18n.t(lookups.shift, :
|
45
|
+
I18n.t(lookups.shift, scope: :"simple_form.error_notification", default: lookups)
|
46
46
|
end
|
47
47
|
end
|
48
48
|
end
|