simple_form 3.0.0.rc → 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 +4 -4
- data/CHANGELOG.md +17 -10
- data/README.md +65 -55
- data/lib/generators/simple_form/templates/config/initializers/simple_form.rb +3 -0
- data/lib/simple_form.rb +4 -0
- data/lib/simple_form/action_view_extensions/builder.rb.orig +247 -0
- data/lib/simple_form/form_builder.rb +10 -4
- data/lib/simple_form/form_builder.rb.orig +486 -0
- data/lib/simple_form/inputs/base.rb +4 -0
- data/lib/simple_form/inputs/boolean_input.rb +1 -0
- data/lib/simple_form/inputs/collection_input.rb +1 -1
- data/lib/simple_form/inputs/date_time_input.rb +1 -1
- data/lib/simple_form/tags.rb +2 -1
- data/lib/simple_form/version.rb +1 -1
- data/lib/simple_form/version.rb.orig +7 -0
- data/test/action_view_extensions/builder_test.rb +3 -4
- data/test/form_builder/association_test.rb +8 -0
- data/test/form_builder/general_test.rb +13 -0
- data/test/form_builder/input_field_test.rb +17 -0
- data/test/form_builder/label_test.rb +1 -1
- data/test/inputs/boolean_input_test.rb +12 -0
- data/test/inputs/collection_check_boxes_input_test.rb +5 -0
- data/test/inputs/collection_radio_buttons_input_test.rb +5 -0
- data/test/inputs/collection_select_input_test.rb +7 -1
- data/test/inputs/datetime_input_test.rb +4 -4
- data/test/inputs/general_test.rb +16 -0
- data/test/inputs/grouped_collection_select_input_test.rb +13 -0
- data/test/support/models.rb +18 -1
- data/test/test_helper.rb +8 -21
- metadata +12 -9
@@ -65,6 +65,10 @@ module SimpleForm
|
|
65
65
|
@html_classes = SimpleForm.additional_classes_for(:input) { additional_classes }
|
66
66
|
|
67
67
|
@input_html_classes = @html_classes.dup
|
68
|
+
if SimpleForm.input_class && !input_html_classes.empty?
|
69
|
+
input_html_classes << SimpleForm.input_class
|
70
|
+
end
|
71
|
+
|
68
72
|
@input_html_options = html_options_for(:input, input_html_classes).tap do |o|
|
69
73
|
o[:readonly] = true if has_readonly?
|
70
74
|
o[:disabled] = true if has_disabled?
|
@@ -66,7 +66,7 @@ module SimpleForm
|
|
66
66
|
collection_translated = translate_collection if collection_classes == [Symbol]
|
67
67
|
|
68
68
|
if collection_translated || collection_classes.include?(Array)
|
69
|
-
{ label: :first, value: :
|
69
|
+
{ label: :first, value: :second }
|
70
70
|
elsif collection_includes_basic_objects?(collection_classes)
|
71
71
|
{ label: :to_s, value: :to_s }
|
72
72
|
else
|
data/lib/simple_form/tags.rb
CHANGED
@@ -11,8 +11,9 @@ module SimpleForm
|
|
11
11
|
value = value_for_collection(item, @value_method)
|
12
12
|
text = value_for_collection(item, @text_method)
|
13
13
|
default_html_options = default_html_options_for_collection(item, value)
|
14
|
+
additional_html_options = option_html_attributes(item)
|
14
15
|
|
15
|
-
rendered_item = yield item, value, text, default_html_options
|
16
|
+
rendered_item = yield item, value, text, default_html_options.merge(additional_html_options)
|
16
17
|
|
17
18
|
item_wrapper_tag ? @template_object.content_tag(item_wrapper_tag, rendered_item, class: item_wrapper_class) : rendered_item
|
18
19
|
end.join.html_safe
|
data/lib/simple_form/version.rb
CHANGED
@@ -49,8 +49,7 @@ class BuilderTest < ActionView::TestCase
|
|
49
49
|
end
|
50
50
|
|
51
51
|
test "collection radio checks the correct value to local variables" do
|
52
|
-
user = User.
|
53
|
-
user.active = false
|
52
|
+
user = User.build(active: false)
|
54
53
|
with_collection_radio_buttons user, :active, [true, false], :to_s, :to_s
|
55
54
|
|
56
55
|
assert_select 'form input[type=radio][value=true]'
|
@@ -297,9 +296,9 @@ class BuilderTest < ActionView::TestCase
|
|
297
296
|
end
|
298
297
|
|
299
298
|
test "collection check box checks the correct value to local variables" do
|
300
|
-
user = User.
|
301
|
-
user.tag_ids = [1, 3]
|
299
|
+
user = User.build(tag_ids: [1, 3])
|
302
300
|
collection = (1..3).map { |i| [i, "Tag #{i}"] }
|
301
|
+
|
303
302
|
with_collection_check_boxes user, :tag_ids, collection, :first, :last
|
304
303
|
|
305
304
|
assert_select 'form input[type=checkbox][value=1][checked=checked]'
|
@@ -105,6 +105,14 @@ class AssociationTest < ActionView::TestCase
|
|
105
105
|
assert_select 'form input.radio_buttons#user_company_id_3'
|
106
106
|
end
|
107
107
|
|
108
|
+
test 'builder allows collection to have a proc as a condition' do
|
109
|
+
with_association_for @user, :extra_special_company
|
110
|
+
assert_select 'form select.select#user_extra_special_company_id'
|
111
|
+
assert_select 'form select option[value=1]'
|
112
|
+
assert_no_select 'form select option[value=2]'
|
113
|
+
assert_no_select 'form select option[value=3]'
|
114
|
+
end
|
115
|
+
|
108
116
|
test 'builder marks the record which already belongs to the user' do
|
109
117
|
@user.company_id = 2
|
110
118
|
with_association_for @user, :company, as: :radio_buttons
|
@@ -87,6 +87,19 @@ class FormBuilderTest < ActionView::TestCase
|
|
87
87
|
end
|
88
88
|
end
|
89
89
|
|
90
|
+
test 'builder allow to use numbers in the model name' do
|
91
|
+
user = UserNumber1And2.build(tags: [Tag.new(nil, 'Tag1')])
|
92
|
+
|
93
|
+
with_concat_form_for(user, url: '/') do |f|
|
94
|
+
f.simple_fields_for(:tags) do |tags|
|
95
|
+
tags.input :name
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
assert_select 'form .user_number1_and2_tags_name'
|
100
|
+
assert_no_select 'form .user_number1_and2_tags_1_name'
|
101
|
+
end
|
102
|
+
|
90
103
|
# INPUT TYPES
|
91
104
|
test 'builder should generate text fields for string columns' do
|
92
105
|
with_form_for @user, :name
|
@@ -21,6 +21,23 @@ class InputFieldTest < ActionView::TestCase
|
|
21
21
|
assert_select 'textarea#user_name.text'
|
22
22
|
end
|
23
23
|
|
24
|
+
test 'builder input_field should generate input type based on column type' do
|
25
|
+
with_concat_form_for(@user) do |f|
|
26
|
+
f.input_field :age
|
27
|
+
end
|
28
|
+
|
29
|
+
assert_select 'input[type=number].integer#user_age'
|
30
|
+
end
|
31
|
+
|
32
|
+
test 'builder input_field should be able to disable any component' do
|
33
|
+
with_concat_form_for(@user) do |f|
|
34
|
+
f.input_field :age, html5: false
|
35
|
+
end
|
36
|
+
|
37
|
+
assert_no_select 'input[html5=false]#user_age'
|
38
|
+
assert_select 'input[type=text].integer#user_age'
|
39
|
+
end
|
40
|
+
|
24
41
|
test 'builder input_field should allow passing options to input tag' do
|
25
42
|
with_concat_form_for(@user) do |f|
|
26
43
|
f.input_field :name, id: 'name_input', class: 'name'
|
@@ -19,7 +19,7 @@ class LabelTest < ActionView::TestCase
|
|
19
19
|
assert_no_select 'label[as=boolean]'
|
20
20
|
end
|
21
21
|
|
22
|
-
test 'builder should generate a label
|
22
|
+
test 'builder should generate a label component tag with a clean HTML' do
|
23
23
|
with_label_for @user, :name
|
24
24
|
assert_no_select 'label.string[label_html]'
|
25
25
|
end
|
@@ -137,4 +137,16 @@ class BooleanInputTest < ActionView::TestCase
|
|
137
137
|
end
|
138
138
|
end
|
139
139
|
end
|
140
|
+
|
141
|
+
test 'input boolean without additional classes should add "checkbox" class to label' do
|
142
|
+
swap_wrapper :default, self.custom_wrapper_without_top_level do
|
143
|
+
swap SimpleForm, boolean_style: :nested, generate_additional_classes_for: [:input] do
|
144
|
+
with_input_for @user, :active, :boolean
|
145
|
+
|
146
|
+
assert_select 'label'
|
147
|
+
assert_select 'label.checkbox'
|
148
|
+
assert_no_select 'label.boolean'
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
140
152
|
end
|
@@ -60,6 +60,11 @@ class CollectionCheckBoxesInputTest < ActionView::TestCase
|
|
60
60
|
assert_no_select 'form ul'
|
61
61
|
end
|
62
62
|
|
63
|
+
test 'input check boxes accepts html options as the last element of collection' do
|
64
|
+
with_input_for @user, :name, :check_boxes, collection: [['Jose', 'jose', class: 'foo']]
|
65
|
+
assert_select 'input.foo[type=checkbox][value=jose]'
|
66
|
+
end
|
67
|
+
|
63
68
|
test 'input check boxes wraps the collection in the configured collection wrapper tag' do
|
64
69
|
swap SimpleForm, collection_wrapper_tag: :ul do
|
65
70
|
with_input_for @user, :active, :check_boxes
|
@@ -82,6 +82,11 @@ class CollectionRadioButtonsInputTest < ActionView::TestCase
|
|
82
82
|
assert_select 'input[type=radio][value=Carlos][checked=checked]'
|
83
83
|
end
|
84
84
|
|
85
|
+
test 'input should accept html options as the last element of collection' do
|
86
|
+
with_input_for @user, :name, :radio_buttons, collection: [['Jose', 'jose', class: 'foo']]
|
87
|
+
assert_select 'input.foo[type=radio][value=jose]'
|
88
|
+
end
|
89
|
+
|
85
90
|
test 'input should allow using a collection with text/value arrays' do
|
86
91
|
with_input_for @user, :name, :radio_buttons, collection: [['Jose', 'jose'], ['Carlos', 'carlos']]
|
87
92
|
assert_select 'input[type=radio][value=jose]'
|
@@ -56,6 +56,12 @@ class CollectionSelectInputTest < ActionView::TestCase
|
|
56
56
|
assert_select 'select option[selected=selected]', 'Carlos'
|
57
57
|
end
|
58
58
|
|
59
|
+
test 'input should accept html options as the last element of collection' do
|
60
|
+
with_input_for @user, :name, :select, collection: [['Jose', class: 'foo']]
|
61
|
+
assert_select 'select.select#user_name'
|
62
|
+
assert_select 'select option.foo', 'Jose'
|
63
|
+
end
|
64
|
+
|
59
65
|
test 'input should mark the selected value also when using integers' do
|
60
66
|
@user.age = 18
|
61
67
|
with_input_for @user, :age, :select, collection: 18..60
|
@@ -112,7 +118,7 @@ class CollectionSelectInputTest < ActionView::TestCase
|
|
112
118
|
end
|
113
119
|
|
114
120
|
test 'input should detect label and value on collections' do
|
115
|
-
users = [
|
121
|
+
users = [User.build(id: 1, name: "Jose"), User.build(id: 2, name: "Carlos")]
|
116
122
|
with_input_for @user, :description, :select, collection: users
|
117
123
|
assert_select 'select option[value=1]', 'Jose'
|
118
124
|
assert_select 'select option[value=2]', 'Carlos'
|
@@ -63,26 +63,26 @@ class DateTimeInputTest < ActionView::TestCase
|
|
63
63
|
end
|
64
64
|
|
65
65
|
test 'label should use i18n to get target for date input type' do
|
66
|
-
store_translations(:en, date: { order: [
|
66
|
+
store_translations(:en, date: { order: ['month', 'day', 'year'] }) do
|
67
67
|
with_input_for :project, :created_at, :date
|
68
68
|
assert_select 'label[for=project_created_at_2i]'
|
69
69
|
end
|
70
70
|
end
|
71
71
|
|
72
72
|
test 'label should use i18n to get target for datetime input type' do
|
73
|
-
store_translations(:en, date: { order: [
|
73
|
+
store_translations(:en, date: { order: ['month', 'day', 'year'] }) do
|
74
74
|
with_input_for :project, :created_at, :datetime
|
75
75
|
assert_select 'label[for=project_created_at_2i]'
|
76
76
|
end
|
77
77
|
end
|
78
78
|
|
79
79
|
test 'label should use order to get target when date input type' do
|
80
|
-
with_input_for :project, :created_at, :date, order: [
|
80
|
+
with_input_for :project, :created_at, :date, order: ['month', 'year', 'day']
|
81
81
|
assert_select 'label[for=project_created_at_2i]'
|
82
82
|
end
|
83
83
|
|
84
84
|
test 'label should use order to get target when datetime input type' do
|
85
|
-
with_input_for :project, :created_at, :datetime, order: [
|
85
|
+
with_input_for :project, :created_at, :datetime, order: ['month', 'year', 'day']
|
86
86
|
assert_select 'label[for=project_created_at_2i]'
|
87
87
|
end
|
88
88
|
|
data/test/inputs/general_test.rb
CHANGED
@@ -20,6 +20,22 @@ class InputTest < ActionView::TestCase
|
|
20
20
|
assert_select 'input.string[autofocus]'
|
21
21
|
end
|
22
22
|
|
23
|
+
test 'input accepts input_class configuration' do
|
24
|
+
swap SimpleForm, input_class: :xlarge do
|
25
|
+
with_input_for @user, :name, :string
|
26
|
+
assert_select 'input.xlarge'
|
27
|
+
assert_no_select 'div.xlarge'
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
test 'input does not add input_class when configured to not generate additional classes for input' do
|
32
|
+
swap SimpleForm, input_class: 'xlarge', generate_additional_classes_for: [:wrapper] do
|
33
|
+
with_input_for @user, :name, :string
|
34
|
+
assert_select 'input'
|
35
|
+
assert_no_select '.xlarge'
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
23
39
|
test 'text input should generate autofocus attribute when autofocus option is true' do
|
24
40
|
with_input_for @user, :description, :text, autofocus: true
|
25
41
|
assert_select 'textarea.text[autofocus]'
|
@@ -130,4 +130,17 @@ class GroupedCollectionSelectInputTest < ActionView::TestCase
|
|
130
130
|
end
|
131
131
|
end
|
132
132
|
end
|
133
|
+
|
134
|
+
test 'grouped collection should accept html options as the last element of collection' do
|
135
|
+
with_input_for @user, :tag_ids, :grouped_select,
|
136
|
+
collection: [['Authors', [['Jose', 'jose', class: 'foo'], ['Carlos', 'carlos', class: 'bar']]]],
|
137
|
+
group_method: :last
|
138
|
+
|
139
|
+
assert_select 'select.grouped_select#user_tag_ids' do
|
140
|
+
assert_select 'optgroup[label=Authors]' do
|
141
|
+
assert_select 'option.foo', 'Jose'
|
142
|
+
assert_select 'option.bar', 'Carlos'
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
133
146
|
end
|
data/test/support/models.rb
CHANGED
@@ -52,7 +52,19 @@ class User
|
|
52
52
|
:description, :created_at, :updated_at, :credit_limit, :password, :url,
|
53
53
|
:delivery_time, :born_at, :special_company_id, :country, :tags, :tag_ids,
|
54
54
|
:avatar, :home_picture, :email, :status, :residence_country, :phone_number,
|
55
|
-
:post_count, :lock_version, :amount, :attempts, :action, :credit_card, :gender
|
55
|
+
:post_count, :lock_version, :amount, :attempts, :action, :credit_card, :gender,
|
56
|
+
:extra_special_company_id
|
57
|
+
|
58
|
+
def self.build(extra_attributes = {})
|
59
|
+
attributes = {
|
60
|
+
id: 1,
|
61
|
+
name: 'New in SimpleForm!',
|
62
|
+
description: 'Hello!',
|
63
|
+
created_at: Time.now
|
64
|
+
}.merge! extra_attributes
|
65
|
+
|
66
|
+
new attributes
|
67
|
+
end
|
56
68
|
|
57
69
|
def initialize(options={})
|
58
70
|
@new_record = false
|
@@ -119,6 +131,8 @@ class User
|
|
119
131
|
Association.new(Company, association, :has_one, {})
|
120
132
|
when :special_company
|
121
133
|
Association.new(Company, association, :belongs_to, { conditions: { id: 1 } })
|
134
|
+
when :extra_special_company
|
135
|
+
Association.new(Company, association, :belongs_to, { conditions: proc { { id: 1 } } })
|
122
136
|
end
|
123
137
|
end
|
124
138
|
|
@@ -215,3 +229,6 @@ class HashBackedAuthor < Hash
|
|
215
229
|
'hash backed author'
|
216
230
|
end
|
217
231
|
end
|
232
|
+
|
233
|
+
class UserNumber1And2 < User
|
234
|
+
end
|
data/test/test_helper.rb
CHANGED
@@ -35,40 +35,27 @@ class ActionView::TestCase
|
|
35
35
|
include SimpleForm::ActionViewExtensions::FormHelper
|
36
36
|
|
37
37
|
setup :set_controller
|
38
|
-
setup :
|
38
|
+
setup :setup_users
|
39
39
|
|
40
40
|
def set_controller
|
41
41
|
@controller = MockController.new
|
42
42
|
end
|
43
43
|
|
44
|
-
def
|
45
|
-
@user = User.
|
46
|
-
|
47
|
-
|
48
|
-
description: 'Hello!',
|
49
|
-
created_at: Time.now
|
50
|
-
}.merge(options))
|
51
|
-
|
52
|
-
@validating_user = ValidatingUser.new({
|
53
|
-
id: 1,
|
54
|
-
name: 'New in SimpleForm!',
|
55
|
-
description: 'Hello!',
|
44
|
+
def setup_users(extra_attributes = {})
|
45
|
+
@user = User.build(extra_attributes)
|
46
|
+
|
47
|
+
@validating_user = ValidatingUser.build({
|
56
48
|
home_picture: 'Home picture',
|
57
|
-
created_at: Time.now,
|
58
49
|
age: 19,
|
59
50
|
amount: 15,
|
60
51
|
attempts: 1,
|
61
52
|
company: [1]
|
62
|
-
}.merge(
|
53
|
+
}.merge!(extra_attributes))
|
63
54
|
|
64
|
-
@other_validating_user = OtherValidatingUser.
|
65
|
-
id: 1,
|
66
|
-
name: 'New in SimpleForm!',
|
67
|
-
description: 'Hello!',
|
68
|
-
created_at: Time.now,
|
55
|
+
@other_validating_user = OtherValidatingUser.build({
|
69
56
|
age: 19,
|
70
57
|
company: 1
|
71
|
-
}.merge(
|
58
|
+
}.merge!(extra_attributes))
|
72
59
|
end
|
73
60
|
|
74
61
|
def protect_against_forgery?
|
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: 3.0.0
|
4
|
+
version: 3.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- José Valim
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2013-
|
13
|
+
date: 2013-09-21 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activemodel
|
@@ -18,7 +18,7 @@ dependencies:
|
|
18
18
|
requirements:
|
19
19
|
- - '>='
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: 4.0.0
|
21
|
+
version: 4.0.0
|
22
22
|
- - <
|
23
23
|
- !ruby/object:Gem::Version
|
24
24
|
version: '4.1'
|
@@ -28,7 +28,7 @@ dependencies:
|
|
28
28
|
requirements:
|
29
29
|
- - '>='
|
30
30
|
- !ruby/object:Gem::Version
|
31
|
-
version: 4.0.0
|
31
|
+
version: 4.0.0
|
32
32
|
- - <
|
33
33
|
- !ruby/object:Gem::Version
|
34
34
|
version: '4.1'
|
@@ -38,7 +38,7 @@ dependencies:
|
|
38
38
|
requirements:
|
39
39
|
- - '>='
|
40
40
|
- !ruby/object:Gem::Version
|
41
|
-
version: 4.0.0
|
41
|
+
version: 4.0.0
|
42
42
|
- - <
|
43
43
|
- !ruby/object:Gem::Version
|
44
44
|
version: '4.1'
|
@@ -48,7 +48,7 @@ dependencies:
|
|
48
48
|
requirements:
|
49
49
|
- - '>='
|
50
50
|
- !ruby/object:Gem::Version
|
51
|
-
version: 4.0.0
|
51
|
+
version: 4.0.0
|
52
52
|
- - <
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '4.1'
|
@@ -72,6 +72,7 @@ files:
|
|
72
72
|
- lib/generators/simple_form/templates/README
|
73
73
|
- lib/generators/simple_form/USAGE
|
74
74
|
- lib/simple_form/action_view_extensions/builder.rb
|
75
|
+
- lib/simple_form/action_view_extensions/builder.rb.orig
|
75
76
|
- lib/simple_form/action_view_extensions/form_helper.rb
|
76
77
|
- lib/simple_form/components/errors.rb
|
77
78
|
- lib/simple_form/components/hints.rb
|
@@ -86,6 +87,7 @@ files:
|
|
86
87
|
- lib/simple_form/components.rb
|
87
88
|
- lib/simple_form/error_notification.rb
|
88
89
|
- lib/simple_form/form_builder.rb
|
90
|
+
- lib/simple_form/form_builder.rb.orig
|
89
91
|
- lib/simple_form/helpers/autofocus.rb
|
90
92
|
- lib/simple_form/helpers/disabled.rb
|
91
93
|
- lib/simple_form/helpers/readonly.rb
|
@@ -115,6 +117,7 @@ files:
|
|
115
117
|
- lib/simple_form/railtie.rb
|
116
118
|
- lib/simple_form/tags.rb
|
117
119
|
- lib/simple_form/version.rb
|
120
|
+
- lib/simple_form/version.rb.orig
|
118
121
|
- lib/simple_form/wrappers/builder.rb
|
119
122
|
- lib/simple_form/wrappers/many.rb
|
120
123
|
- lib/simple_form/wrappers/root.rb
|
@@ -172,12 +175,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
172
175
|
version: '0'
|
173
176
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
174
177
|
requirements:
|
175
|
-
- - '
|
178
|
+
- - '>='
|
176
179
|
- !ruby/object:Gem::Version
|
177
|
-
version:
|
180
|
+
version: '0'
|
178
181
|
requirements: []
|
179
182
|
rubyforge_project: simple_form
|
180
|
-
rubygems_version: 2.0.
|
183
|
+
rubygems_version: 2.0.6
|
181
184
|
signing_key:
|
182
185
|
specification_version: 4
|
183
186
|
summary: Forms made easy!
|