simple_form 2.0.2 → 2.0.3
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.
- data/CHANGELOG.md +33 -0
- data/README.md +49 -7
- data/lib/generators/simple_form/install_generator.rb +7 -1
- data/lib/generators/simple_form/templates/config/initializers/{simple_form.rb.tt → simple_form.rb} +5 -44
- data/lib/generators/simple_form/templates/config/initializers/simple_form_bootstrap.rb +45 -0
- data/lib/simple_form.rb +6 -0
- data/lib/simple_form/action_view_extensions/builder.rb +4 -3
- data/lib/simple_form/action_view_extensions/form_helper.rb +7 -9
- data/lib/simple_form/components/readonly.rb +1 -1
- data/lib/simple_form/form_builder.rb +11 -4
- data/lib/simple_form/inputs/base.rb +6 -4
- data/lib/simple_form/inputs/boolean_input.rb +13 -4
- data/lib/simple_form/version.rb +1 -1
- data/lib/simple_form/wrappers/many.rb +5 -1
- data/lib/simple_form/wrappers/root.rb +2 -2
- data/lib/simple_form/wrappers/single.rb +6 -0
- data/test/action_view_extensions/builder_test.rb +11 -5
- data/test/action_view_extensions/form_helper_test.rb +37 -3
- data/test/components/label_test.rb +7 -0
- data/test/form_builder/association_test.rb +7 -1
- data/test/form_builder/general_test.rb +25 -0
- data/test/form_builder/hint_test.rb +4 -5
- data/test/form_builder/wrapper_test.rb +19 -0
- data/test/generators/simple_form_generator_test.rb +3 -1
- data/test/inputs/boolean_input_test.rb +25 -0
- data/test/inputs/disabled_test.rb +51 -11
- data/test/inputs/general_test.rb +58 -11
- data/test/inputs/readonly_test.rb +51 -11
- data/test/support/misc_helpers.rb +24 -0
- data/test/support/models.rb +1 -1
- metadata +4 -3
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,36 @@
|
|
1
|
+
## 2.0.3
|
2
|
+
|
3
|
+
### enhancements
|
4
|
+
* Allow to specify custom wrappers for input types.
|
5
|
+
([@nashby](https://github.com/nashby))
|
6
|
+
Closes [#636](https://github.com/plataformatec/simple_form/issues/636)
|
7
|
+
* Use separate config file to do bootstrap specific configuration.
|
8
|
+
([@nashby](https://github.com/nashby))
|
9
|
+
|
10
|
+
### bug fix
|
11
|
+
* Allow to specify checked and uncked values for boolean input
|
12
|
+
([@nashby](https://github.com/nashby)).
|
13
|
+
Closes [#643](https://github.com/plataformatec/simple_form/issues/643)
|
14
|
+
* Allow to add additional classes only for wrapper.
|
15
|
+
([@nashby](https://github.com/nashby)).
|
16
|
+
Closes [#629](https://github.com/plataformatec/simple_form/issues/629)
|
17
|
+
* Boolean hidden field now respects `:name` attribute when nested.
|
18
|
+
([@amiel](https://github.com/amiel)).
|
19
|
+
Closes [#619](https://github.com/plataformatec/simple_form/issues/619)
|
20
|
+
* Prevent generation of `class=""`. ([@pkmiec](https://github.com/pkmiec))
|
21
|
+
* Fix namespace html propagation to single wrapper of `label` and `input`
|
22
|
+
* Association creates blank select if `:collection` is `nil`.
|
23
|
+
([@nashby](https://github.com/nashby)).
|
24
|
+
Closes [#595](https://github.com/plataformatec/simple_form/issues/595)
|
25
|
+
* Fix readonly attribute check. ([@retoo](https://github.com/retoo))
|
26
|
+
* Fix error when `collection_check_boxes` used with `form_for` instead of `simple_form_for`.
|
27
|
+
([@RohanM](https://github.com/RohanM))
|
28
|
+
* Ensure ActionView::Base.field_error_proc is preserved when exceptions occur within
|
29
|
+
`with_simple_form_field_error_proc`.
|
30
|
+
([@jim](https://github.com/jim))
|
31
|
+
* Handle array of strings in `:checked` option.
|
32
|
+
([@nashby](https://github.com/nashby))
|
33
|
+
|
1
34
|
## 2.0.2
|
2
35
|
|
3
36
|
### enhancements
|
data/README.md
CHANGED
@@ -53,7 +53,7 @@ For more information see the generator output, our
|
|
53
53
|
are invoked to create a complete html input for you, which by default contains label, hints, errors
|
54
54
|
and the input itself. It does not aim to create a lot of different logic from the default Rails
|
55
55
|
form helpers, as they do a great work by themselves. Instead, **SimpleForm** acts as a DSL and just
|
56
|
-
maps your input type (retrieved from the column definition in the database) to
|
56
|
+
maps your input type (retrieved from the column definition in the database) to a specific helper method.
|
57
57
|
|
58
58
|
To start using **SimpleForm** you just have to use the helper it provides:
|
59
59
|
|
@@ -69,13 +69,14 @@ This will generate an entire form with labels for user name and password as well
|
|
69
69
|
by default when you render the form with invalid data (after submitting for example).
|
70
70
|
|
71
71
|
You can overwrite the default label by passing it to the input method. You can also add a hint or
|
72
|
-
even a placeholder:
|
72
|
+
even a placeholder. For boolean inputs, you can add an inline label as well:
|
73
73
|
|
74
74
|
```erb
|
75
75
|
<%= simple_form_for @user do |f| %>
|
76
76
|
<%= f.input :username, :label => 'Your username please' %>
|
77
77
|
<%= f.input :password, :hint => 'No special characters.' %>
|
78
78
|
<%= f.input :email, :placeholder => 'user@domain.com' %>
|
79
|
+
<%= f.input :remember_me, :inline_label => 'Yes, remember me' %>
|
79
80
|
<%= f.button :submit %>
|
80
81
|
<% end %>
|
81
82
|
```
|
@@ -129,8 +130,11 @@ any html attribute to that wrapper as well using the `:wrapper_html` option, lik
|
|
129
130
|
<% end %>
|
130
131
|
```
|
131
132
|
|
132
|
-
|
133
|
-
|
133
|
+
Required fields are marked with an * prepended to their labels.
|
134
|
+
|
135
|
+
By default all inputs are required. When the form object has `presence` validations attached to its fields, **SimpleForm** tells required and optional fields apart. For performance reasons, this detection is skipped on validations that make use of conditional options, such as `:if` and `:unless`.
|
136
|
+
|
137
|
+
And of course, the `required` property of any input can be overwritten as needed:
|
134
138
|
|
135
139
|
```erb
|
136
140
|
<%= simple_form_for @user do |f| %>
|
@@ -314,6 +318,12 @@ the collection by hand, all together with the prompt:
|
|
314
318
|
f.association :company, :collection => Company.active.all(:order => 'name'), :prompt => "Choose a Company"
|
315
319
|
```
|
316
320
|
|
321
|
+
In case you want to declare different labels and values:
|
322
|
+
|
323
|
+
```ruby
|
324
|
+
f.association :company, :label_method => :company_name, :value_method => :id, :include_blank => false
|
325
|
+
```
|
326
|
+
|
317
327
|
### Buttons
|
318
328
|
|
319
329
|
All web forms need buttons, right? **SimpleForm** wraps them in the DSL, acting like a proxy:
|
@@ -463,7 +473,7 @@ instance, if you want to wrap date/time/datetime in a div, you can do:
|
|
463
473
|
# app/inputs/date_time_input.rb
|
464
474
|
class DateTimeInput < SimpleForm::Inputs::DateTimeInput
|
465
475
|
def input
|
466
|
-
|
476
|
+
template.content_tag(:div, super)
|
467
477
|
end
|
468
478
|
end
|
469
479
|
```
|
@@ -567,7 +577,7 @@ en:
|
|
567
577
|
```
|
568
578
|
|
569
579
|
**SimpleForm** will always look for a default attribute translation under the "defaults" key if no
|
570
|
-
specific is found inside the model key.Note that this syntax is different from 1.x. To migrate to
|
580
|
+
specific is found inside the model key. Note that this syntax is different from 1.x. To migrate to
|
571
581
|
the new syntax, just move "labels.#{attribute}" to "labels.defaults.#{attribute}".
|
572
582
|
|
573
583
|
In addition, **SimpleForm** will fallback to default human_attribute_name from Rails when no other
|
@@ -592,7 +602,7 @@ en:
|
|
592
602
|
user:
|
593
603
|
gender:
|
594
604
|
male: 'Male'
|
595
|
-
female:
|
605
|
+
female: 'Female'
|
596
606
|
```
|
597
607
|
|
598
608
|
You can also use the `defaults` key as you would do with labels, hints and placeholders. It is
|
@@ -614,6 +624,37 @@ There are other options that can be configured through I18n API, such as require
|
|
614
624
|
Be sure to check our locale file or the one copied to your application after you run
|
615
625
|
`rails generate simple_form:install`.
|
616
626
|
|
627
|
+
It should be noted that translations for labels, hints and placeholders for a namespaced model, e.g.
|
628
|
+
`Admin::User`, should be placed under `admin_user`, not under `admin/user`. This is different from
|
629
|
+
how translations for namespaced model and attribute names are defined:
|
630
|
+
|
631
|
+
```yaml
|
632
|
+
en:
|
633
|
+
activerecord:
|
634
|
+
models:
|
635
|
+
admin/user: User
|
636
|
+
attributes:
|
637
|
+
admin/user:
|
638
|
+
name: Name
|
639
|
+
```
|
640
|
+
|
641
|
+
They should be placed under `admin/user`. Form labels, hints and placeholders for those attributes,
|
642
|
+
though, should be placed under `admin_user`:
|
643
|
+
|
644
|
+
```yaml
|
645
|
+
en:
|
646
|
+
simple_form:
|
647
|
+
labels:
|
648
|
+
admin_user:
|
649
|
+
name: Name
|
650
|
+
```
|
651
|
+
|
652
|
+
This difference exists because **SimpleForm** relies on `object_name` provided by Rails'
|
653
|
+
FormBuilder to determine the translation path for a given object instead of `i18n_key` from the
|
654
|
+
object itself. Thus, similarly, if a form for an `Admin::User` object is defined by calling
|
655
|
+
`simple_form_for @admin_user, :as => :some_user`, **SimpleForm** will look for translations
|
656
|
+
under `some_user` instead of `admin_user`.
|
657
|
+
|
617
658
|
## Configuration
|
618
659
|
|
619
660
|
**SimpleForm** has several configuration options. You can read and change them in the initializer
|
@@ -812,6 +853,7 @@ https://github.com/plataformatec/simple_form/issues
|
|
812
853
|
* José Valim (https://github.com/josevalim)
|
813
854
|
* Carlos Antonio da Silva (https://github.com/carlosantoniodasilva)
|
814
855
|
* Rafael Mendonça França (https://github.com/rafaelfranca)
|
856
|
+
* Vasiliy Ermolovich (https://github.com/nashby)
|
815
857
|
|
816
858
|
## License
|
817
859
|
|
@@ -14,7 +14,13 @@ module SimpleForm
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def copy_config
|
17
|
-
|
17
|
+
template "config/initializers/simple_form.rb"
|
18
|
+
|
19
|
+
if options[:bootstrap]
|
20
|
+
template "config/initializers/simple_form_bootstrap.rb"
|
21
|
+
end
|
22
|
+
|
23
|
+
directory 'config/locales'
|
18
24
|
end
|
19
25
|
|
20
26
|
def copy_scaffold_template
|
data/lib/generators/simple_form/templates/config/initializers/{simple_form.rb.tt → simple_form.rb}
RENAMED
@@ -44,53 +44,10 @@ SimpleForm.setup do |config|
|
|
44
44
|
b.use :hint, :wrap_with => { :tag => :span, :class => :hint }
|
45
45
|
b.use :error, :wrap_with => { :tag => :span, :class => :error }
|
46
46
|
end
|
47
|
-
<% if options.bootstrap? %>
|
48
|
-
config.wrappers :bootstrap, :tag => 'div', :class => 'control-group', :error_class => 'error' do |b|
|
49
|
-
b.use :html5
|
50
|
-
b.use :placeholder
|
51
|
-
b.use :label
|
52
|
-
b.wrapper :tag => 'div', :class => 'controls' do |ba|
|
53
|
-
ba.use :input
|
54
|
-
ba.use :error, :wrap_with => { :tag => 'span', :class => 'help-inline' }
|
55
|
-
ba.use :hint, :wrap_with => { :tag => 'p', :class => 'help-block' }
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
config.wrappers :prepend, :tag => 'div', :class => "control-group", :error_class => 'error' do |b|
|
60
|
-
b.use :html5
|
61
|
-
b.use :placeholder
|
62
|
-
b.use :label
|
63
|
-
b.wrapper :tag => 'div', :class => 'controls' do |input|
|
64
|
-
input.wrapper :tag => 'div', :class => 'input-prepend' do |prepend|
|
65
|
-
prepend.use :input
|
66
|
-
end
|
67
|
-
input.use :hint, :wrap_with => { :tag => 'span', :class => 'help-block' }
|
68
|
-
input.use :error, :wrap_with => { :tag => 'span', :class => 'help-inline' }
|
69
|
-
end
|
70
|
-
end
|
71
47
|
|
72
|
-
config.wrappers :append, :tag => 'div', :class => "control-group", :error_class => 'error' do |b|
|
73
|
-
b.use :html5
|
74
|
-
b.use :placeholder
|
75
|
-
b.use :label
|
76
|
-
b.wrapper :tag => 'div', :class => 'controls' do |input|
|
77
|
-
input.wrapper :tag => 'div', :class => 'input-append' do |append|
|
78
|
-
append.use :input
|
79
|
-
end
|
80
|
-
input.use :hint, :wrap_with => { :tag => 'span', :class => 'help-block' }
|
81
|
-
input.use :error, :wrap_with => { :tag => 'span', :class => 'help-inline' }
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
# Wrappers for forms and inputs using the Twitter Bootstrap toolkit.
|
86
|
-
# Check the Bootstrap docs (http://twitter.github.com/bootstrap)
|
87
|
-
# to learn about the different styles for forms and inputs,
|
88
|
-
# buttons and other elements.
|
89
|
-
config.default_wrapper = :bootstrap
|
90
|
-
<% else %>
|
91
48
|
# The default wrapper to be used by the FormBuilder.
|
92
49
|
config.default_wrapper = :default
|
93
|
-
|
50
|
+
|
94
51
|
# Define the way to render check boxes / radio buttons with labels.
|
95
52
|
# Defaults to :nested for bootstrap config.
|
96
53
|
# :inline => input + label
|
@@ -161,6 +118,10 @@ SimpleForm.setup do |config|
|
|
161
118
|
# matches the regexp as value.
|
162
119
|
# config.input_mappings = { /count/ => :integer }
|
163
120
|
|
121
|
+
# Custom wrappers for input types. This should be a hash containing an input
|
122
|
+
# type as key and the wrapper that will be used for all inputs with specified type.
|
123
|
+
# config.wrapper_mappings = { :string => :prepend }
|
124
|
+
|
164
125
|
# Default priority for time_zone inputs.
|
165
126
|
# config.time_zone_priority = nil
|
166
127
|
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# Use this setup block to configure all options available in SimpleForm.
|
2
|
+
SimpleForm.setup do |config|
|
3
|
+
config.wrappers :bootstrap, :tag => 'div', :class => 'control-group', :error_class => 'error' do |b|
|
4
|
+
b.use :html5
|
5
|
+
b.use :placeholder
|
6
|
+
b.use :label
|
7
|
+
b.wrapper :tag => 'div', :class => 'controls' do |ba|
|
8
|
+
ba.use :input
|
9
|
+
ba.use :error, :wrap_with => { :tag => 'span', :class => 'help-inline' }
|
10
|
+
ba.use :hint, :wrap_with => { :tag => 'p', :class => 'help-block' }
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
config.wrappers :prepend, :tag => 'div', :class => "control-group", :error_class => 'error' do |b|
|
15
|
+
b.use :html5
|
16
|
+
b.use :placeholder
|
17
|
+
b.use :label
|
18
|
+
b.wrapper :tag => 'div', :class => 'controls' do |input|
|
19
|
+
input.wrapper :tag => 'div', :class => 'input-prepend' do |prepend|
|
20
|
+
prepend.use :input
|
21
|
+
end
|
22
|
+
input.use :hint, :wrap_with => { :tag => 'span', :class => 'help-block' }
|
23
|
+
input.use :error, :wrap_with => { :tag => 'span', :class => 'help-inline' }
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
config.wrappers :append, :tag => 'div', :class => "control-group", :error_class => 'error' do |b|
|
28
|
+
b.use :html5
|
29
|
+
b.use :placeholder
|
30
|
+
b.use :label
|
31
|
+
b.wrapper :tag => 'div', :class => 'controls' do |input|
|
32
|
+
input.wrapper :tag => 'div', :class => 'input-append' do |append|
|
33
|
+
append.use :input
|
34
|
+
end
|
35
|
+
input.use :hint, :wrap_with => { :tag => 'span', :class => 'help-block' }
|
36
|
+
input.use :error, :wrap_with => { :tag => 'span', :class => 'help-inline' }
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# Wrappers for forms and inputs using the Twitter Bootstrap toolkit.
|
41
|
+
# Check the Bootstrap docs (http://twitter.github.com/bootstrap)
|
42
|
+
# to learn about the different styles for forms and inputs,
|
43
|
+
# buttons and other elements.
|
44
|
+
config.default_wrapper = :bootstrap
|
45
|
+
end
|
data/lib/simple_form.rb
CHANGED
@@ -95,6 +95,12 @@ module SimpleForm
|
|
95
95
|
mattr_accessor :input_mappings
|
96
96
|
@@input_mappings = nil
|
97
97
|
|
98
|
+
# Custom wrappers for input types. This should be a hash containing an input
|
99
|
+
# type as key and the wrapper that will be used for all inputs with specified type.
|
100
|
+
# e.g { :string => :string_wrapper, :boolean => :boolean_wrapper }
|
101
|
+
mattr_accessor :wrapper_mappings
|
102
|
+
@@wrapper_mappings = nil
|
103
|
+
|
98
104
|
# Default priority for time_zone inputs.
|
99
105
|
mattr_accessor :time_zone_priority
|
100
106
|
@@time_zone_priority = nil
|
@@ -153,7 +153,8 @@ module SimpleForm
|
|
153
153
|
#
|
154
154
|
# * collection_wrapper_tag => the tag to wrap the entire collection.
|
155
155
|
#
|
156
|
-
# * collection_wrapper_class => the CSS class to use for collection_wrapper_tag
|
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.
|
157
158
|
#
|
158
159
|
# * item_wrapper_tag => the tag to wrap each item in the collection.
|
159
160
|
#
|
@@ -177,7 +178,7 @@ module SimpleForm
|
|
177
178
|
|
178
179
|
# Append a hidden field to make sure something will be sent back to the
|
179
180
|
# server if all checkboxes are unchecked.
|
180
|
-
hidden = template.hidden_field_tag("#{object_name}[#{attribute}][]", "", :id => nil)
|
181
|
+
hidden = @template.hidden_field_tag("#{object_name}[#{attribute}][]", "", :id => nil)
|
181
182
|
|
182
183
|
wrap_rendered_collection(rendered_collection + hidden, options)
|
183
184
|
end
|
@@ -223,7 +224,7 @@ module SimpleForm
|
|
223
224
|
accept = if current_option.respond_to?(:call)
|
224
225
|
current_option.call(item)
|
225
226
|
else
|
226
|
-
Array(current_option).include?(value)
|
227
|
+
Array(current_option).map(&:to_s).include?(value.to_s)
|
227
228
|
end
|
228
229
|
|
229
230
|
if accept
|
@@ -9,10 +9,6 @@ module SimpleForm
|
|
9
9
|
# end
|
10
10
|
#
|
11
11
|
module FormHelper
|
12
|
-
# based on what is done in formtastic
|
13
|
-
# http://github.com/justinfrench/formtastic/blob/master/lib/formtastic.rb#L1706
|
14
|
-
@@default_field_error_proc = nil
|
15
|
-
|
16
12
|
# Override the default ActiveRecordHelper behaviour of wrapping the input.
|
17
13
|
# This gets taken care of semantically by adding an error class to the wrapper tag
|
18
14
|
# containing the input.
|
@@ -46,11 +42,13 @@ module SimpleForm
|
|
46
42
|
private
|
47
43
|
|
48
44
|
def with_simple_form_field_error_proc
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
45
|
+
default_field_error_proc = ::ActionView::Base.field_error_proc
|
46
|
+
begin
|
47
|
+
::ActionView::Base.field_error_proc = FIELD_ERROR_PROC
|
48
|
+
yield
|
49
|
+
ensure
|
50
|
+
::ActionView::Base.field_error_proc = default_field_error_proc
|
51
|
+
end
|
54
52
|
end
|
55
53
|
|
56
54
|
def simple_form_css_class(record, options)
|
@@ -15,7 +15,7 @@ module SimpleForm
|
|
15
15
|
def readonly_attribute?
|
16
16
|
object.class.respond_to?(:readonly_attributes) &&
|
17
17
|
object.persisted? &&
|
18
|
-
object.class.readonly_attributes.include?(attribute_name)
|
18
|
+
object.class.readonly_attributes.include?(attribute_name.to_s)
|
19
19
|
end
|
20
20
|
end
|
21
21
|
end
|
@@ -104,15 +104,16 @@ module SimpleForm
|
|
104
104
|
#
|
105
105
|
def input(attribute_name, options={}, &block)
|
106
106
|
options = @defaults.deep_dup.deep_merge(options) if @defaults
|
107
|
+
input = find_input(attribute_name, options, &block)
|
107
108
|
|
108
109
|
chosen =
|
109
|
-
if name = options[:wrapper]
|
110
|
+
if name = options[:wrapper] || find_wrapper_mapping(input.input_type)
|
110
111
|
name.respond_to?(:render) ? name : SimpleForm.wrapper(name)
|
111
112
|
else
|
112
113
|
wrapper
|
113
114
|
end
|
114
115
|
|
115
|
-
chosen.render
|
116
|
+
chosen.render input
|
116
117
|
end
|
117
118
|
alias :attribute :input
|
118
119
|
|
@@ -174,13 +175,15 @@ module SimpleForm
|
|
174
175
|
raise "Association #{association.inspect} not found" unless reflection
|
175
176
|
|
176
177
|
options[:as] ||= :select
|
177
|
-
options[:collection] ||=
|
178
|
+
options[:collection] ||= options.fetch(:collection) {
|
179
|
+
reflection.klass.all(reflection.options.slice(:conditions, :order))
|
180
|
+
}
|
178
181
|
|
179
182
|
attribute = case reflection.macro
|
180
183
|
when :belongs_to
|
181
184
|
(reflection.respond_to?(:options) && reflection.options[:foreign_key]) || :"#{reflection.name}_id"
|
182
185
|
when :has_one
|
183
|
-
raise ":has_one associations are not supported by f.association"
|
186
|
+
raise ArgumentError, ":has_one associations are not supported by f.association"
|
184
187
|
else
|
185
188
|
if options[:as] == :select
|
186
189
|
html_options = options[:input_html] ||= {}
|
@@ -442,6 +445,10 @@ module SimpleForm
|
|
442
445
|
end
|
443
446
|
end
|
444
447
|
|
448
|
+
def find_wrapper_mapping(input_type)
|
449
|
+
SimpleForm.wrapper_mappings && SimpleForm.wrapper_mappings[input_type]
|
450
|
+
end
|
451
|
+
|
445
452
|
# If cache_discovery is enabled, use the class level cache that persists
|
446
453
|
# between requests, otherwise use the instance one.
|
447
454
|
def discovery_cache #:nodoc:
|
@@ -60,9 +60,7 @@ module SimpleForm
|
|
60
60
|
# Notice that html_options_for receives a reference to input_html_classes.
|
61
61
|
# This means that classes added dynamically to input_html_classes will
|
62
62
|
# still propagate to input_html_options.
|
63
|
-
@html_classes = SimpleForm.additional_classes_for(:input) {
|
64
|
-
[input_type, required_class, readonly_class, disabled_class].compact
|
65
|
-
}
|
63
|
+
@html_classes = SimpleForm.additional_classes_for(:input) { additional_classes }
|
66
64
|
|
67
65
|
@input_html_classes = @html_classes.dup
|
68
66
|
@input_html_options = html_options_for(:input, input_html_classes).tap do |o|
|
@@ -80,6 +78,10 @@ module SimpleForm
|
|
80
78
|
options
|
81
79
|
end
|
82
80
|
|
81
|
+
def additional_classes
|
82
|
+
@additional_classes ||= [input_type, required_class, readonly_class, disabled_class].compact
|
83
|
+
end
|
84
|
+
|
83
85
|
private
|
84
86
|
|
85
87
|
def add_size!
|
@@ -119,7 +121,7 @@ module SimpleForm
|
|
119
121
|
html_options = options[:"#{namespace}_html"]
|
120
122
|
html_options = html_options ? html_options.dup : {}
|
121
123
|
css_classes << html_options[:class] if html_options.key?(:class)
|
122
|
-
html_options[:class] = css_classes
|
124
|
+
html_options[:class] = css_classes unless css_classes.empty?
|
123
125
|
html_options
|
124
126
|
end
|
125
127
|
|
@@ -34,8 +34,8 @@ module SimpleForm
|
|
34
34
|
# reuse the method for nested boolean style, but with no unchecked value,
|
35
35
|
# which won't generate the hidden checkbox. This is the default functionality
|
36
36
|
# in Rails > 3.2.1, and is backported in SimpleForm AV helpers.
|
37
|
-
def build_check_box(unchecked_value=
|
38
|
-
@builder.check_box(attribute_name, input_html_options,
|
37
|
+
def build_check_box(unchecked_value = unchecked_value)
|
38
|
+
@builder.check_box(attribute_name, input_html_options, checked_value, unchecked_value)
|
39
39
|
end
|
40
40
|
|
41
41
|
# Build a checkbox without generating the hidden field. See
|
@@ -49,8 +49,9 @@ module SimpleForm
|
|
49
49
|
# we need the hidden field to be *outside* the label (otherwise it
|
50
50
|
# generates invalid html - html5 only).
|
51
51
|
def build_hidden_field_for_checkbox
|
52
|
-
@builder.hidden_field(attribute_name, :value =>
|
53
|
-
:disabled => input_html_options[:disabled]
|
52
|
+
@builder.hidden_field(attribute_name, :value => unchecked_value, :id => nil,
|
53
|
+
:disabled => input_html_options[:disabled],
|
54
|
+
:name => input_html_options[:name])
|
54
55
|
end
|
55
56
|
|
56
57
|
def inline_label
|
@@ -64,6 +65,14 @@ module SimpleForm
|
|
64
65
|
def required_by_default?
|
65
66
|
false
|
66
67
|
end
|
68
|
+
|
69
|
+
def checked_value
|
70
|
+
options.fetch(:checked_value, '1')
|
71
|
+
end
|
72
|
+
|
73
|
+
def unchecked_value
|
74
|
+
options.fetch(:unchecked_value, '0')
|
75
|
+
end
|
67
76
|
end
|
68
77
|
end
|
69
78
|
end
|
data/lib/simple_form/version.rb
CHANGED
@@ -56,11 +56,15 @@ module SimpleForm
|
|
56
56
|
return content unless tag
|
57
57
|
|
58
58
|
klass = html_classes(input, options)
|
59
|
-
opts = options
|
59
|
+
opts = html_options(options)
|
60
60
|
opts[:class] = (klass << opts[:class]).join(' ').strip unless klass.empty?
|
61
61
|
input.template.content_tag(tag, content, opts)
|
62
62
|
end
|
63
63
|
|
64
|
+
def html_options(options)
|
65
|
+
options[:"#{namespace}_html"] || {}
|
66
|
+
end
|
67
|
+
|
64
68
|
def html_classes(input, options)
|
65
69
|
@defaults[:class].dup
|
66
70
|
end
|
@@ -24,10 +24,10 @@ module SimpleForm
|
|
24
24
|
|
25
25
|
def html_classes(input, options)
|
26
26
|
css = options[:wrapper_class] ? Array.wrap(options[:wrapper_class]) : @defaults[:class]
|
27
|
-
css += SimpleForm.additional_classes_for(:wrapper) { input.
|
27
|
+
css += SimpleForm.additional_classes_for(:wrapper) { input.additional_classes }
|
28
28
|
css << (options[:wrapper_error_class] || @defaults[:error_class]) if input.has_errors?
|
29
29
|
css << (options[:wrapper_hint_class] || @defaults[:hint_class]) if input.has_hint?
|
30
|
-
css
|
30
|
+
css.compact
|
31
31
|
end
|
32
32
|
end
|
33
33
|
end
|
@@ -63,7 +63,7 @@ class BuilderTest < ActionView::TestCase
|
|
63
63
|
assert_select 'form input[type=radio][value=true][checked=checked]'
|
64
64
|
assert_no_select 'form input[type=radio][value=false][checked=checked]'
|
65
65
|
end
|
66
|
-
|
66
|
+
|
67
67
|
test 'collection radio accepts checked item which has a value of false' do
|
68
68
|
with_collection_radio_buttons @user, :active, [[1, true], [0, false]], :last, :first, :checked => false
|
69
69
|
assert_no_select 'form input[type=radio][value=true][checked=checked]'
|
@@ -302,7 +302,6 @@ class BuilderTest < ActionView::TestCase
|
|
302
302
|
assert_no_select 'form input[type=checkbox][value=2][checked=checked]'
|
303
303
|
end
|
304
304
|
|
305
|
-
|
306
305
|
test 'collection check box accepts selected values as :checked option' do
|
307
306
|
collection = (1..3).map{|i| [i, "Tag #{i}"] }
|
308
307
|
with_collection_check_boxes @user, :tag_ids, collection, :first, :last, :checked => [1, 3]
|
@@ -312,6 +311,15 @@ class BuilderTest < ActionView::TestCase
|
|
312
311
|
assert_no_select 'form input[type=checkbox][value=2][checked=checked]'
|
313
312
|
end
|
314
313
|
|
314
|
+
test 'collection check boxes accepts selected string values as :checked option' do
|
315
|
+
collection = (1..3).map{|i| [i, "Category #{i}"] }
|
316
|
+
with_collection_check_boxes :user, :category_ids, collection, :first, :last, :checked => ['1', '3']
|
317
|
+
|
318
|
+
assert_select 'input[type=checkbox][value=1][checked=checked]'
|
319
|
+
assert_select 'input[type=checkbox][value=3][checked=checked]'
|
320
|
+
assert_no_select 'input[type=checkbox][value=2][checked=checked]'
|
321
|
+
end
|
322
|
+
|
315
323
|
test 'collection check box accepts a single checked value' do
|
316
324
|
collection = (1..3).map{|i| [i, "Tag #{i}"] }
|
317
325
|
with_collection_check_boxes @user, :tag_ids, collection, :first, :last, :checked => 3
|
@@ -537,10 +545,8 @@ class BuilderTest < ActionView::TestCase
|
|
537
545
|
end
|
538
546
|
|
539
547
|
test 'fields for with a hash like model yeilds an instance of FormBuilder' do
|
540
|
-
@hash_backed_author = HashBackedAuthor.new
|
541
|
-
|
542
548
|
with_concat_form_for(:user) do |f|
|
543
|
-
f.simple_fields_for(:author,
|
549
|
+
f.simple_fields_for(:author, HashBackedAuthor.new) do |author|
|
544
550
|
assert author.instance_of?(SimpleForm::FormBuilder)
|
545
551
|
author.input :name
|
546
552
|
end
|
@@ -92,13 +92,47 @@ class FormHelperTest < ActionView::TestCase
|
|
92
92
|
end
|
93
93
|
|
94
94
|
test 'fields for with a hash like model yeilds an instance of FormBuilder' do
|
95
|
-
|
96
|
-
|
97
|
-
with_concat_fields_for(:author, @hash_backed_author) do |f|
|
95
|
+
with_concat_fields_for(:author, HashBackedAuthor.new) do |f|
|
98
96
|
assert f.instance_of?(SimpleForm::FormBuilder)
|
99
97
|
f.input :name
|
100
98
|
end
|
101
99
|
|
102
100
|
assert_select "input[name='author[name]'][value='hash backed author']"
|
103
101
|
end
|
102
|
+
|
103
|
+
test 'custom error proc is not destructive' do
|
104
|
+
swap_field_error_proc do
|
105
|
+
result = nil
|
106
|
+
simple_form_for :user do |f|
|
107
|
+
result = simple_fields_for 'address' do
|
108
|
+
'hello'
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
assert_equal 'hello', result
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
test 'custom error proc survives an exception' do
|
117
|
+
swap_field_error_proc do
|
118
|
+
begin
|
119
|
+
simple_form_for :user do |f|
|
120
|
+
simple_fields_for 'address' do
|
121
|
+
raise 'an exception'
|
122
|
+
end
|
123
|
+
end
|
124
|
+
rescue StandardError
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
private
|
130
|
+
|
131
|
+
def swap_field_error_proc(expected_error_proc = lambda {})
|
132
|
+
swap ActionView::Base, :field_error_proc => expected_error_proc do
|
133
|
+
yield
|
134
|
+
|
135
|
+
assert_equal expected_error_proc, ActionView::Base.field_error_proc
|
136
|
+
end
|
137
|
+
end
|
104
138
|
end
|
@@ -181,6 +181,13 @@ class IsolatedLabelTest < ActionView::TestCase
|
|
181
181
|
end
|
182
182
|
end
|
183
183
|
|
184
|
+
test 'label should not generate empty css class' do
|
185
|
+
swap SimpleForm, :generate_additional_classes_for => [:wrapper, :input] do
|
186
|
+
with_label_for @user, :name, :string
|
187
|
+
assert_no_select 'label[class]'
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
184
191
|
test 'label should obtain required from ActiveModel::Validations when it is included' do
|
185
192
|
with_label_for @validating_user, :name, :string
|
186
193
|
assert_select 'label.required'
|
@@ -79,6 +79,12 @@ class AssociationTest < ActionView::TestCase
|
|
79
79
|
assert_select 'form select option[value=3]', 'Company 3'
|
80
80
|
end
|
81
81
|
|
82
|
+
test 'builder creates blank select if collection is nil' do
|
83
|
+
with_association_for @user, :company, :collection => nil
|
84
|
+
assert_select 'form select.select#user_company_id'
|
85
|
+
assert_no_select 'form select option[value=1]', 'Company 1'
|
86
|
+
end
|
87
|
+
|
82
88
|
test 'builder allows collection radio for belongs_to associations' do
|
83
89
|
with_association_for @user, :company, :as => :radio_buttons
|
84
90
|
assert_select 'form input.radio_buttons#user_company_id_1'
|
@@ -114,7 +120,7 @@ class AssociationTest < ActionView::TestCase
|
|
114
120
|
|
115
121
|
# ASSOCIATIONS - has_*
|
116
122
|
test 'builder does not allow has_one associations' do
|
117
|
-
assert_raise
|
123
|
+
assert_raise ArgumentError do
|
118
124
|
with_association_for @user, :first_company, :as => :radio_buttons
|
119
125
|
end
|
120
126
|
end
|
@@ -46,6 +46,15 @@ class FormBuilderTest < ActionView::TestCase
|
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
49
|
+
test 'builder should allow to add additional classes only for wrapper' do
|
50
|
+
swap SimpleForm, :generate_additional_classes_for => [:wrapper] do
|
51
|
+
with_form_for @user, :post_count
|
52
|
+
assert_no_select "form input#user_post_count.string"
|
53
|
+
assert_no_select "form label#user_post_count.string"
|
54
|
+
assert_select "form div.input.string"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
49
58
|
test 'builder should allow adding custom input mappings for integer input types' do
|
50
59
|
swap SimpleForm, :input_mappings => { /lock_version/ => :hidden } do
|
51
60
|
with_form_for @user, :lock_version
|
@@ -202,6 +211,22 @@ class FormBuilderTest < ActionView::TestCase
|
|
202
211
|
assert_select 'form input#my_input.my_input.string'
|
203
212
|
end
|
204
213
|
|
214
|
+
test 'builder should not propagate input options to wrapper with custom wrapper' do
|
215
|
+
swap_wrapper :default, self.custom_wrapper_with_wrapped_input do
|
216
|
+
with_form_for @user, :name, :input_html => { :class => 'my_input' }
|
217
|
+
assert_no_select 'form div.input.my_input'
|
218
|
+
assert_select 'form input.my_input.string'
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
test 'builder should not propagate label options to wrapper with custom wrapper' do
|
223
|
+
swap_wrapper :default, self.custom_wrapper_with_wrapped_label do
|
224
|
+
with_form_for @user, :name, :label_html => { :class => 'my_label' }
|
225
|
+
assert_no_select 'form div.label.my_label'
|
226
|
+
assert_select 'form label.my_label.string'
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
205
230
|
test 'builder should generate a input with label' do
|
206
231
|
with_form_for @user, :name
|
207
232
|
assert_select 'form label.string[for=user_name]', /Name/
|
@@ -41,12 +41,11 @@ class HintTest < ActionView::TestCase
|
|
41
41
|
with_hint_for @user, :name, :hint => 'Yay!', :id => 'hint', :class => 'yay'
|
42
42
|
assert_select 'span#hint.hint.yay'
|
43
43
|
end
|
44
|
-
|
44
|
+
|
45
45
|
test 'hint should be output as html_safe' do
|
46
46
|
with_hint_for @user, :name, :hint => '<b>Bold</b> and not...'
|
47
|
-
assert_select 'span.hint', 'Bold and not...'
|
47
|
+
assert_select 'span.hint', 'Bold and not...'
|
48
48
|
end
|
49
|
-
|
50
49
|
|
51
50
|
# Without attribute name
|
52
51
|
|
@@ -110,7 +109,7 @@ class HintTest < ActionView::TestCase
|
|
110
109
|
assert_select 'span.hint', /My company!/
|
111
110
|
end
|
112
111
|
end
|
113
|
-
|
112
|
+
|
114
113
|
test 'hint should output translations as html_safe' do
|
115
114
|
store_translations(:en, :simple_form => { :hints => { :user => {
|
116
115
|
:edit => { :name => '<b>This is bold</b> and this is not...' }
|
@@ -119,7 +118,7 @@ class HintTest < ActionView::TestCase
|
|
119
118
|
assert_select 'span.hint', 'This is bold and this is not...'
|
120
119
|
end
|
121
120
|
end
|
122
|
-
|
121
|
+
|
123
122
|
|
124
123
|
# No object
|
125
124
|
|
@@ -75,6 +75,15 @@ class WrapperTest < ActionView::TestCase
|
|
75
75
|
end
|
76
76
|
end
|
77
77
|
|
78
|
+
test 'wrapper should not generate empty css class' do
|
79
|
+
swap SimpleForm, :generate_additional_classes_for => [:input, :label] do
|
80
|
+
swap_wrapper :default, custom_wrapper_without_class do
|
81
|
+
with_form_for @user, :name
|
82
|
+
assert_no_select 'div#custom_wrapper_without_class[class]'
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
78
87
|
# Custom wrapper test
|
79
88
|
|
80
89
|
test 'custom wrappers works' do
|
@@ -159,4 +168,14 @@ class WrapperTest < ActionView::TestCase
|
|
159
168
|
with_form_for @user, :name, :wrapper => :not_found
|
160
169
|
end
|
161
170
|
end
|
171
|
+
|
172
|
+
test 'use wrapper for specified in config mapping' do
|
173
|
+
swap_wrapper :another do
|
174
|
+
swap SimpleForm, :wrapper_mappings => { :string => :another } do
|
175
|
+
with_form_for @user, :name
|
176
|
+
assert_select "section.custom_wrapper div.another_wrapper label"
|
177
|
+
assert_select "section.custom_wrapper div.another_wrapper input.string"
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
162
181
|
end
|
@@ -19,7 +19,9 @@ class SimpleFormGeneratorTest < Rails::Generators::TestCase
|
|
19
19
|
|
20
20
|
test 'generates the simple_form initializer with the bootstrap wrappers' do
|
21
21
|
run_generator %w(--bootstrap)
|
22
|
-
assert_file 'config/initializers/simple_form.rb',
|
22
|
+
assert_file 'config/initializers/simple_form.rb',
|
23
|
+
/config\.default_wrapper = :default/, /config\.boolean_style = :nested/
|
24
|
+
assert_file 'config/initializers/simple_form_bootstrap.rb', /config\.wrappers :bootstrap/,
|
23
25
|
/config\.default_wrapper = :bootstrap/
|
24
26
|
end
|
25
27
|
|
@@ -14,6 +14,24 @@ class BooleanInputTest < ActionView::TestCase
|
|
14
14
|
assert_no_select 'label'
|
15
15
|
end
|
16
16
|
|
17
|
+
test 'input uses custom checked value' do
|
18
|
+
@user.action = 'on'
|
19
|
+
with_input_for @user, :action, :boolean, :checked_value => 'on', :unchecked_value => 'off'
|
20
|
+
assert_select 'input[type=checkbox][value=on][checked=checked]'
|
21
|
+
end
|
22
|
+
|
23
|
+
test 'input uses custom unchecked value' do
|
24
|
+
@user.action = 'off'
|
25
|
+
with_input_for @user, :action, :boolean, :checked_value => 'on', :unchecked_value => 'off'
|
26
|
+
assert_select 'input[type=checkbox][value=on]'
|
27
|
+
assert_no_select 'input[checked=checked][value=on]'
|
28
|
+
end
|
29
|
+
|
30
|
+
test 'input generates hidden input with custom unchecked value' do
|
31
|
+
with_input_for @user, :action, :boolean, :checked_value => 'on', :unchecked_value => 'off'
|
32
|
+
assert_select 'input[type=hidden][value=off]'
|
33
|
+
end
|
34
|
+
|
17
35
|
test 'input uses inline boolean style by default' do
|
18
36
|
with_input_for @user, :active, :boolean
|
19
37
|
assert_select 'input.boolean + label.boolean.optional'
|
@@ -84,6 +102,13 @@ class BooleanInputTest < ActionView::TestCase
|
|
84
102
|
end
|
85
103
|
end
|
86
104
|
|
105
|
+
test 'input with nested style allows customizing input_html' do
|
106
|
+
swap SimpleForm, :boolean_style => :nested do
|
107
|
+
with_input_for @user, :active, :boolean, :input_html => { :name => 'active_user' }
|
108
|
+
assert_select "input[type=hidden][name=active_user] + label.boolean > input.boolean[name=active_user]"
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
87
112
|
test 'input boolean works using :input only in wrapper config (no label_input)' do
|
88
113
|
swap_wrapper do
|
89
114
|
with_input_for @user, :active, :boolean
|
@@ -1,38 +1,78 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
class DisabledTest < ActionView::TestCase
|
4
|
-
test 'input should
|
4
|
+
test 'string input should be disabled when disabled option is true' do
|
5
5
|
with_input_for @user, :name, :string, :disabled => true
|
6
6
|
assert_select 'input.string.disabled[disabled]'
|
7
|
+
end
|
8
|
+
|
9
|
+
test 'text input should be disabled when disabled option is true' do
|
7
10
|
with_input_for @user, :description, :text, :disabled => true
|
8
11
|
assert_select 'textarea.text.disabled[disabled]'
|
12
|
+
end
|
13
|
+
|
14
|
+
test 'numeric input should be disabled when disabled option is true' do
|
9
15
|
with_input_for @user, :age, :integer, :disabled => true
|
10
16
|
assert_select 'input.integer.disabled[disabled]'
|
17
|
+
end
|
18
|
+
|
19
|
+
test 'date input should be disabled when disabled option is true' do
|
11
20
|
with_input_for @user, :born_at, :date, :disabled => true
|
12
21
|
assert_select 'select.date.disabled[disabled]'
|
22
|
+
end
|
23
|
+
|
24
|
+
test 'datetime input should be disabled when disabled option is true' do
|
13
25
|
with_input_for @user, :created_at, :datetime, :disabled => true
|
14
26
|
assert_select 'select.datetime.disabled[disabled]'
|
27
|
+
end
|
15
28
|
|
29
|
+
test 'string input should not be disabled when disabled option is false' do
|
16
30
|
with_input_for @user, :name, :string, :disabled => false
|
17
|
-
|
31
|
+
assert_no_select 'input.string.disabled[disabled]'
|
32
|
+
end
|
33
|
+
|
34
|
+
test 'text input should not be disabled when disabled option is false' do
|
18
35
|
with_input_for @user, :description, :text, :disabled => false
|
19
|
-
|
36
|
+
assert_no_select 'textarea.text.disabled[disabled]'
|
37
|
+
end
|
38
|
+
|
39
|
+
test 'numeric input should not be disabled when disabled option is false' do
|
20
40
|
with_input_for @user, :age, :integer, :disabled => false
|
21
|
-
|
41
|
+
assert_no_select 'input.integer.disabled[disabled]'
|
42
|
+
end
|
43
|
+
|
44
|
+
test 'date input should not be disabled when disabled option is false' do
|
22
45
|
with_input_for @user, :born_at, :date, :disabled => false
|
23
|
-
|
46
|
+
assert_no_select 'select.date.disabled[disabled]'
|
47
|
+
end
|
48
|
+
|
49
|
+
test 'datetime input should not be disabled when disabled option is false' do
|
24
50
|
with_input_for @user, :created_at, :datetime, :disabled => false
|
25
|
-
|
51
|
+
assert_no_select 'select.datetime.disabled[disabled]'
|
52
|
+
end
|
26
53
|
|
54
|
+
test 'string input should not be disabled when disabled option is not present' do
|
27
55
|
with_input_for @user, :name, :string
|
28
|
-
|
56
|
+
assert_no_select 'input.string.disabled[disabled]'
|
57
|
+
end
|
58
|
+
|
59
|
+
test 'text input should not be disabled when disabled option is not present' do
|
29
60
|
with_input_for @user, :description, :text
|
30
|
-
|
61
|
+
assert_no_select 'textarea.text.disabled[disabled]'
|
62
|
+
end
|
63
|
+
|
64
|
+
test 'numeric input should not be disabled when disabled option is not present' do
|
31
65
|
with_input_for @user, :age, :integer
|
32
|
-
|
66
|
+
assert_no_select 'input.integer.disabled[disabled]'
|
67
|
+
end
|
68
|
+
|
69
|
+
test 'date input should not be disabled when disabled option is not present' do
|
33
70
|
with_input_for @user, :born_at, :date
|
34
|
-
|
71
|
+
assert_no_select 'select.date.disabled[disabled]'
|
72
|
+
end
|
73
|
+
|
74
|
+
test 'datetime input should not be disabled when disabled option is not present' do
|
35
75
|
with_input_for @user, :created_at, :datetime
|
36
|
-
|
76
|
+
assert_no_select 'select.datetime.disabled[disabled]'
|
37
77
|
end
|
38
78
|
end
|
data/test/inputs/general_test.rb
CHANGED
@@ -15,39 +15,79 @@ class InputTest < ActionView::TestCase
|
|
15
15
|
assert_select 'select.datetime'
|
16
16
|
end
|
17
17
|
|
18
|
-
test 'input should generate autofocus attribute
|
18
|
+
test 'string input should generate autofocus attribute when autofocus option is true' do
|
19
19
|
with_input_for @user, :name, :string, :autofocus => true
|
20
20
|
assert_select 'input.string[autofocus]'
|
21
|
+
end
|
22
|
+
|
23
|
+
test 'text input should generate autofocus attribute when autofocus option is true' do
|
21
24
|
with_input_for @user, :description, :text, :autofocus => true
|
22
25
|
assert_select 'textarea.text[autofocus]'
|
26
|
+
end
|
27
|
+
|
28
|
+
test 'numeric input should generate autofocus attribute when autofocus option is true' do
|
23
29
|
with_input_for @user, :age, :integer, :autofocus => true
|
24
30
|
assert_select 'input.integer[autofocus]'
|
31
|
+
end
|
32
|
+
|
33
|
+
test 'date input should generate autofocus attribute when autofocus option is true' do
|
25
34
|
with_input_for @user, :born_at, :date, :autofocus => true
|
26
35
|
assert_select 'select.date[autofocus]'
|
36
|
+
end
|
37
|
+
|
38
|
+
test 'datetime input should generate autofocus attribute when autofocus option is true' do
|
27
39
|
with_input_for @user, :created_at, :datetime, :autofocus => true
|
28
40
|
assert_select 'select.datetime[autofocus]'
|
41
|
+
end
|
29
42
|
|
43
|
+
test 'string input should generate autofocus attribute when autofocus option is false' do
|
30
44
|
with_input_for @user, :name, :string, :autofocus => false
|
31
|
-
|
45
|
+
assert_no_select 'input.string[autofocus]'
|
46
|
+
end
|
47
|
+
|
48
|
+
test 'text input should generate autofocus attribute when autofocus option is false' do
|
32
49
|
with_input_for @user, :description, :text, :autofocus => false
|
33
|
-
|
50
|
+
assert_no_select 'textarea.text[autofocus]'
|
51
|
+
end
|
52
|
+
|
53
|
+
test 'numeric input should generate autofocus attribute when autofocus option is false' do
|
34
54
|
with_input_for @user, :age, :integer, :autofocus => false
|
35
|
-
|
55
|
+
assert_no_select 'input.integer[autofocus]'
|
56
|
+
end
|
57
|
+
|
58
|
+
test 'date input should generate autofocus attribute when autofocus option is false' do
|
36
59
|
with_input_for @user, :born_at, :date, :autofocus => false
|
37
|
-
|
60
|
+
assert_no_select 'select.date[autofocus]'
|
61
|
+
end
|
62
|
+
|
63
|
+
test 'datetime input should generate autofocus attribute when autofocus option is false' do
|
38
64
|
with_input_for @user, :created_at, :datetime, :autofocus => false
|
39
|
-
|
65
|
+
assert_no_select 'select.datetime[autofocus]'
|
66
|
+
end
|
40
67
|
|
68
|
+
test 'string input should generate autofocus attribute when autofocus option is not present' do
|
41
69
|
with_input_for @user, :name, :string
|
42
|
-
|
70
|
+
assert_no_select 'input.string[autofocus]'
|
71
|
+
end
|
72
|
+
|
73
|
+
test 'text input should generate autofocus attribute when autofocus option is not present' do
|
43
74
|
with_input_for @user, :description, :text
|
44
|
-
|
75
|
+
assert_no_select 'textarea.text[autofocus]'
|
76
|
+
end
|
77
|
+
|
78
|
+
test 'numeric input should generate autofocus attribute when autofocus option is not present' do
|
45
79
|
with_input_for @user, :age, :integer
|
46
|
-
|
80
|
+
assert_no_select 'input.integer[autofocus]'
|
81
|
+
end
|
82
|
+
|
83
|
+
test 'date input should generate autofocus attribute when autofocus option is not present' do
|
47
84
|
with_input_for @user, :born_at, :date
|
48
|
-
|
85
|
+
assert_no_select 'select.date[autofocus]'
|
86
|
+
end
|
87
|
+
|
88
|
+
test 'datetime input should generate autofocus attribute when autofocus option is not present' do
|
49
89
|
with_input_for @user, :created_at, :datetime
|
50
|
-
|
90
|
+
assert_no_select 'select.datetime[autofocus]'
|
51
91
|
end
|
52
92
|
|
53
93
|
# With no object
|
@@ -66,4 +106,11 @@ class InputTest < ActionView::TestCase
|
|
66
106
|
with_input_for :project, :name, :select, :collection => ['Jose', 'Carlos']
|
67
107
|
assert_select 'select.select#project_name'
|
68
108
|
end
|
109
|
+
|
110
|
+
test 'input should not generate empty css class' do
|
111
|
+
swap SimpleForm, :generate_additional_classes_for => [:wrapper, :label] do
|
112
|
+
with_input_for :project, :name, :string
|
113
|
+
assert_no_select 'input#project_name[class]'
|
114
|
+
end
|
115
|
+
end
|
69
116
|
end
|
@@ -1,39 +1,79 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
class ReadonlyTest < ActionView::TestCase
|
4
|
-
test 'input should generate readonly elements
|
4
|
+
test 'string input should generate readonly elements when readonly option is true' do
|
5
5
|
with_input_for @user, :name, :string, :readonly => true
|
6
6
|
assert_select 'input.string.readonly[readonly]'
|
7
|
+
end
|
8
|
+
|
9
|
+
test 'text input should generate readonly elements when readonly option is true' do
|
7
10
|
with_input_for @user, :description, :text, :readonly => true
|
8
11
|
assert_select 'textarea.text.readonly[readonly]'
|
12
|
+
end
|
13
|
+
|
14
|
+
test 'numeric input should generate readonly elements when readonly option is true' do
|
9
15
|
with_input_for @user, :age, :integer, :readonly => true
|
10
16
|
assert_select 'input.integer.readonly[readonly]'
|
17
|
+
end
|
18
|
+
|
19
|
+
test 'date input should generate readonly elements when readonly option is true' do
|
11
20
|
with_input_for @user, :born_at, :date, :readonly => true
|
12
21
|
assert_select 'select.date.readonly[readonly]'
|
22
|
+
end
|
23
|
+
|
24
|
+
test 'datetime input should generate readonly elements when readonly option is true' do
|
13
25
|
with_input_for @user, :created_at, :datetime, :readonly => true
|
14
26
|
assert_select 'select.datetime.readonly[readonly]'
|
27
|
+
end
|
15
28
|
|
29
|
+
test 'string input should generate readonly elements when readonly option is false' do
|
16
30
|
with_input_for @user, :name, :string, :readonly => false
|
17
|
-
|
31
|
+
assert_no_select 'input.string.readonly[readonly]'
|
32
|
+
end
|
33
|
+
|
34
|
+
test 'text input should generate readonly elements when readonly option is false' do
|
18
35
|
with_input_for @user, :description, :text, :readonly => false
|
19
|
-
|
36
|
+
assert_no_select 'textarea.text.readonly[readonly]'
|
37
|
+
end
|
38
|
+
|
39
|
+
test 'numeric input should generate readonly elements when readonly option is false' do
|
20
40
|
with_input_for @user, :age, :integer, :readonly => false
|
21
|
-
|
41
|
+
assert_no_select 'input.integer.readonly[readonly]'
|
42
|
+
end
|
43
|
+
|
44
|
+
test 'date input should generate readonly elements when readonly option is false' do
|
22
45
|
with_input_for @user, :born_at, :date, :readonly => false
|
23
|
-
|
46
|
+
assert_no_select 'select.date.readonly[readonly]'
|
47
|
+
end
|
48
|
+
|
49
|
+
test 'datetime input should generate readonly elements when readonly option is false' do
|
24
50
|
with_input_for @user, :created_at, :datetime, :readonly => false
|
25
|
-
|
51
|
+
assert_no_select 'select.datetime.readonly[readonly]'
|
52
|
+
end
|
26
53
|
|
54
|
+
test 'string input should generate readonly elements when readonly option is not present' do
|
27
55
|
with_input_for @user, :name, :string
|
28
|
-
|
56
|
+
assert_no_select 'input.string.readonly[readonly]'
|
57
|
+
end
|
58
|
+
|
59
|
+
test 'text input should generate readonly elements when readonly option is not present' do
|
29
60
|
with_input_for @user, :description, :text
|
30
|
-
|
61
|
+
assert_no_select 'textarea.text.readonly[readonly]'
|
62
|
+
end
|
63
|
+
|
64
|
+
test 'numeric input should generate readonly elements when readonly option is not present' do
|
31
65
|
with_input_for @user, :age, :integer
|
32
|
-
|
66
|
+
assert_no_select 'input.integer.readonly[readonly]'
|
67
|
+
end
|
68
|
+
|
69
|
+
test 'date input should generate readonly elements when readonly option is not present' do
|
33
70
|
with_input_for @user, :born_at, :date
|
34
|
-
|
71
|
+
assert_no_select 'select.date.readonly[readonly]'
|
72
|
+
end
|
73
|
+
|
74
|
+
test 'datetime input should generate readonly elements when readonly option is not present' do
|
35
75
|
with_input_for @user, :created_at, :datetime
|
36
|
-
|
76
|
+
assert_no_select 'select.datetime.readonly[readonly]'
|
37
77
|
end
|
38
78
|
|
39
79
|
test 'input should generate readonly attribute when the field is readonly and the object is persisted' do
|
@@ -46,6 +46,24 @@ module MiscHelpers
|
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
49
|
+
def custom_wrapper_with_wrapped_input
|
50
|
+
SimpleForm.build :tag => :div, :class => "custom_wrapper" do |b|
|
51
|
+
b.wrapper :tag => :div, :class => 'elem' do |component|
|
52
|
+
component.use :label
|
53
|
+
component.use :input, :wrap_with => { :tag => :div, :class => 'input' }
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def custom_wrapper_with_wrapped_label
|
59
|
+
SimpleForm.build :tag => :div, :class => "custom_wrapper" do |b|
|
60
|
+
b.wrapper :tag => :div, :class => 'elem' do |component|
|
61
|
+
component.use :label, :wrap_with => { :tag => :div, :class => 'label' }
|
62
|
+
component.use :input
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
49
67
|
def custom_wrapper_without_top_level
|
50
68
|
SimpleForm.build :tag => false, :class => 'custom_wrapper_without_top_level' do |b|
|
51
69
|
b.use :label_input
|
@@ -54,6 +72,12 @@ module MiscHelpers
|
|
54
72
|
end
|
55
73
|
end
|
56
74
|
|
75
|
+
def custom_wrapper_without_class
|
76
|
+
SimpleForm.build :tag => :div, :wrapper_html => { :id => 'custom_wrapper_without_class' } do |b|
|
77
|
+
b.use :label_input
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
57
81
|
def custom_wrapper_with_label_html_option
|
58
82
|
SimpleForm.build :tag => :div, :class => "custom_wrapper", :label_html => { :class => 'extra-label-class' } do |b|
|
59
83
|
b.use :label_input
|
data/test/support/models.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: simple_form
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2012-
|
14
|
+
date: 2012-09-27 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: activemodel
|
@@ -58,7 +58,8 @@ files:
|
|
58
58
|
- lib/generators/simple_form/templates/_form.html.erb
|
59
59
|
- lib/generators/simple_form/templates/_form.html.haml
|
60
60
|
- lib/generators/simple_form/templates/_form.html.slim
|
61
|
-
- lib/generators/simple_form/templates/config/initializers/simple_form.rb
|
61
|
+
- lib/generators/simple_form/templates/config/initializers/simple_form.rb
|
62
|
+
- lib/generators/simple_form/templates/config/initializers/simple_form_bootstrap.rb
|
62
63
|
- lib/generators/simple_form/templates/config/locales/simple_form.en.yml
|
63
64
|
- lib/generators/simple_form/templates/README
|
64
65
|
- lib/generators/simple_form/USAGE
|