bootstrap_form 2.7.0 → 4.0.0.alpha1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (104) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +14 -0
  3. data/.travis.yml +29 -0
  4. data/CHANGELOG.md +227 -0
  5. data/CONTRIBUTING.md +57 -0
  6. data/Dangerfile +54 -0
  7. data/Gemfile +21 -0
  8. data/{MIT-LICENSE → LICENSE.txt} +1 -1
  9. data/README.md +154 -87
  10. data/Rakefile +5 -15
  11. data/UPGRADE-4.0.md +79 -0
  12. data/bootstrap_form.gemspec +28 -0
  13. data/demo/README.md +17 -0
  14. data/demo/Rakefile +6 -0
  15. data/demo/app/controllers/application_controller.rb +2 -0
  16. data/demo/app/controllers/bootstrap_controller.rb +16 -0
  17. data/demo/app/helpers/bootstrap_helper.rb +23 -0
  18. data/{test/dummy → demo}/app/models/address.rb +0 -0
  19. data/demo/app/models/application_record.rb +3 -0
  20. data/{test/dummy → demo}/app/models/faux_user.rb +0 -0
  21. data/{test/dummy → demo}/app/models/super_user.rb +0 -0
  22. data/{test/dummy → demo}/app/models/user.rb +0 -0
  23. data/demo/app/views/bootstrap/form.html.erb +53 -0
  24. data/demo/app/views/layouts/application.html.erb +65 -0
  25. data/demo/bin/bundle +3 -0
  26. data/{test/dummy → demo}/bin/rails +1 -1
  27. data/{test/dummy → demo}/bin/rake +0 -0
  28. data/demo/bin/setup +36 -0
  29. data/demo/bin/update +31 -0
  30. data/demo/bin/yarn +11 -0
  31. data/{test/dummy → demo}/config.ru +2 -1
  32. data/demo/config/application.rb +24 -0
  33. data/demo/config/boot.rb +5 -0
  34. data/{test/dummy → demo}/config/database.yml +8 -12
  35. data/demo/config/environment.rb +5 -0
  36. data/demo/config/environments/development.rb +60 -0
  37. data/{test/dummy → demo}/config/environments/test.rb +15 -20
  38. data/demo/config/initializers/application_controller_renderer.rb +8 -0
  39. data/demo/config/initializers/assets.rb +14 -0
  40. data/{test/dummy → demo}/config/initializers/backtrace_silencers.rb +0 -0
  41. data/demo/config/initializers/cookies_serializer.rb +5 -0
  42. data/{test/dummy → demo}/config/initializers/filter_parameter_logging.rb +0 -0
  43. data/{test/dummy → demo}/config/initializers/inflections.rb +0 -0
  44. data/{test/dummy → demo}/config/initializers/mime_types.rb +0 -1
  45. data/{test/dummy → demo}/config/initializers/wrap_parameters.rb +2 -2
  46. data/{test/dummy → demo}/config/locales/en.yml +10 -0
  47. data/demo/config/puma.rb +56 -0
  48. data/{test/dummy → demo}/config/routes.rb +2 -0
  49. data/demo/config/spring.rb +6 -0
  50. data/demo/config/storage.yml +35 -0
  51. data/demo/db/schema.rb +24 -0
  52. data/{test/dummy/public/favicon.ico → demo/log/.keep} +0 -0
  53. data/demo/package.json +5 -0
  54. data/demo/public/favicon.ico +0 -0
  55. data/lib/bootstrap_form/form_builder.rb +221 -96
  56. data/lib/bootstrap_form/helper.rb +26 -16
  57. data/lib/bootstrap_form/helpers/bootstrap.rb +37 -24
  58. data/lib/bootstrap_form/version.rb +1 -1
  59. metadata +67 -252
  60. data/lib/bootstrap_form/helpers/nested_form.rb +0 -33
  61. data/test/bootstrap_checkbox_test.rb +0 -144
  62. data/test/bootstrap_fields_test.rb +0 -152
  63. data/test/bootstrap_form_group_test.rb +0 -289
  64. data/test/bootstrap_form_test.rb +0 -209
  65. data/test/bootstrap_other_components_test.rb +0 -86
  66. data/test/bootstrap_radio_button_test.rb +0 -124
  67. data/test/bootstrap_selects_test.rb +0 -160
  68. data/test/dummy/Gemfile +0 -45
  69. data/test/dummy/Gemfile.lock +0 -120
  70. data/test/dummy/README.rdoc +0 -28
  71. data/test/dummy/Rakefile +0 -10
  72. data/test/dummy/app/assets/javascripts/application.js +0 -16
  73. data/test/dummy/app/assets/stylesheets/application.css +0 -13
  74. data/test/dummy/app/controllers/application_controller.rb +0 -5
  75. data/test/dummy/app/helpers/application_helper.rb +0 -2
  76. data/test/dummy/app/views/layouts/application.html.erb +0 -14
  77. data/test/dummy/bin/bundle +0 -3
  78. data/test/dummy/config/application.rb +0 -23
  79. data/test/dummy/config/boot.rb +0 -4
  80. data/test/dummy/config/environment.rb +0 -5
  81. data/test/dummy/config/environments/development.rb +0 -29
  82. data/test/dummy/config/environments/production.rb +0 -80
  83. data/test/dummy/config/initializers/secret_token.rb +0 -12
  84. data/test/dummy/config/initializers/session_store.rb +0 -3
  85. data/test/dummy/db/migrate/20130703191909_create_users.rb +0 -13
  86. data/test/dummy/db/migrate/20130703191937_create_addresses.rb +0 -13
  87. data/test/dummy/db/migrate/20130912171202_add_preferences_to_user.rb +0 -5
  88. data/test/dummy/db/migrate/20140327190145_add_terms_to_user.rb +0 -5
  89. data/test/dummy/db/migrate/20140922133133_add_type_to_users.rb +0 -5
  90. data/test/dummy/db/schema.rb +0 -39
  91. data/test/dummy/db/seeds.rb +0 -7
  92. data/test/dummy/db/test.sqlite3 +0 -0
  93. data/test/dummy/log/test.log +0 -38160
  94. data/test/dummy/public/404.html +0 -58
  95. data/test/dummy/public/422.html +0 -58
  96. data/test/dummy/public/500.html +0 -57
  97. data/test/dummy/public/robots.txt +0 -5
  98. data/test/dummy/test/fixtures/addresses.yml +0 -15
  99. data/test/dummy/test/fixtures/users.yml +0 -15
  100. data/test/dummy/test/models/address_test.rb +0 -7
  101. data/test/dummy/test/models/user_test.rb +0 -7
  102. data/test/dummy/test/test_helper.rb +0 -15
  103. data/test/special_form_class_models_test.rb +0 -43
  104. data/test/test_helper.rb +0 -86
@@ -1,33 +0,0 @@
1
- begin
2
- require 'nested_form/builder_mixin'
3
-
4
- module BootstrapForm
5
- class NestedFormBuilder < ::BootstrapForm::FormBuilder
6
- include ::NestedForm::BuilderMixin
7
- end
8
- end
9
-
10
- module BootstrapForm
11
- module Helpers
12
- module NestedForm
13
- def bootstrap_nested_form_for(object, options = {}, &block)
14
- options.reverse_merge!({builder: BootstrapForm::NestedFormBuilder})
15
- bootstrap_form_for(object, options) do |f|
16
- capture(f, &block).to_s << after_nested_form_callbacks
17
- end
18
- end
19
- end
20
- end
21
- end
22
-
23
- rescue LoadError
24
- module BootstrapForm
25
- module Helpers
26
- module NestedForm
27
- def bootstrap_nested_form_for(object, options = {}, &block)
28
- raise 'nested_forms was not found. Is it in your Gemfile?'
29
- end
30
- end
31
- end
32
- end
33
- end
@@ -1,144 +0,0 @@
1
- require 'test_helper'
2
-
3
- class BootstrapCheckboxTest < ActionView::TestCase
4
- include BootstrapForm::Helper
5
-
6
- def setup
7
- setup_test_fixture
8
- end
9
-
10
- test "check_box is wrapped correctly" do
11
- expected = %{<div class="checkbox"><label for="user_terms"><input name="user[terms]" type="hidden" value="0" /><input id="user_terms" name="user[terms]" type="checkbox" value="1" /> I agree to the terms</label></div>}
12
- assert_equivalent_xml expected, @builder.check_box(:terms, label: 'I agree to the terms')
13
- end
14
-
15
- test "disabled check_box has proper wrapper classes" do
16
- expected = %{<div class="checkbox disabled"><label for="user_terms"><input disabled="disabled" name="user[terms]" type="hidden" value="0" /><input disabled="disabled" id="user_terms" name="user[terms]" type="checkbox" value="1" /> I agree to the terms</label></div>}
17
- assert_equivalent_xml expected, @builder.check_box(:terms, label: 'I agree to the terms', disabled: true)
18
- end
19
-
20
- test "check_box label allows html" do
21
- expected = %{<div class="checkbox"><label for="user_terms"><input name="user[terms]" type="hidden" value="0" /><input id="user_terms" name="user[terms]" type="checkbox" value="1" /> I agree to the <a href="#">terms</a></label></div>}
22
- assert_equivalent_xml expected, @builder.check_box(:terms, label: %{I agree to the <a href="#">terms</a>}.html_safe)
23
- end
24
-
25
- test "check_box accepts a block to define the label" do
26
- expected = %{<div class="checkbox"><label for="user_terms"><input name="user[terms]" type="hidden" value="0" /><input id="user_terms" name="user[terms]" type="checkbox" value="1" /> I agree to the terms</label></div>}
27
- assert_equivalent_xml expected, @builder.check_box(:terms) { "I agree to the terms" }
28
- end
29
-
30
- test "check_box accepts a custom label class" do
31
- expected = %{<div class="checkbox"><label class="btn" for="user_terms"><input name="user[terms]" type="hidden" value="0" /><input id="user_terms" name="user[terms]" type="checkbox" value="1" /> Terms</label></div>}
32
- assert_equivalent_xml expected, @builder.check_box(:terms, label_class: 'btn')
33
- end
34
-
35
- test "check_box responds to checked_value and unchecked_value arguments" do
36
- expected = %{<div class="checkbox"><label for="user_terms"><input name="user[terms]" type="hidden" value="no" /><input id="user_terms" name="user[terms]" type="checkbox" value="yes" /> I agree to the terms</label></div>}
37
- assert_equivalent_xml expected, @builder.check_box(:terms, {label: 'I agree to the terms'}, 'yes', 'no')
38
- end
39
-
40
- test "inline checkboxes" do
41
- expected = %{<label class="checkbox-inline" for="user_terms"><input name="user[terms]" type="hidden" value="0" /><input id="user_terms" name="user[terms]" type="checkbox" value="1" /> I agree to the terms</label>}
42
- assert_equivalent_xml expected, @builder.check_box(:terms, label: 'I agree to the terms', inline: true)
43
- end
44
-
45
- test "disabled inline check_box" do
46
- expected = %{<label class="checkbox-inline disabled" for="user_terms"><input disabled="disabled" name="user[terms]" type="hidden" value="0" /><input disabled="disabled" id="user_terms" name="user[terms]" type="checkbox" value="1" /> I agree to the terms</label>}
47
- assert_equivalent_xml expected, @builder.check_box(:terms, label: 'I agree to the terms', inline: true, disabled: true)
48
- end
49
-
50
- test "inline checkboxes with custom label class" do
51
- expected = %{<label class="checkbox-inline btn" for="user_terms"><input name="user[terms]" type="hidden" value="0" /><input id="user_terms" name="user[terms]" type="checkbox" value="1" /> Terms</label>}
52
- assert_equivalent_xml expected, @builder.check_box(:terms, inline: true, label_class: 'btn')
53
- end
54
-
55
- test 'collection_check_boxes renders the form_group correctly' do
56
- collection = [Address.new(id: 1, street: 'Foobar')]
57
- expected = %{<input id="user_misc" multiple="multiple" name="user[misc][]" type="hidden" value="" /><div class="form-group"><label class="control-label" for="user_misc">This is a checkbox collection</label><div class="checkbox"><label for="user_misc_1"><input id="user_misc_1" name="user[misc][]" type="checkbox" value="1" /> Foobar</label></div><span class="help-block">With a help!</span></div>}
58
-
59
- assert_equivalent_xml expected, @builder.collection_check_boxes(:misc, collection, :id, :street, label: 'This is a checkbox collection', help: 'With a help!')
60
- end
61
-
62
- test 'collection_check_boxes renders multiple checkboxes correctly' do
63
- collection = [Address.new(id: 1, street: 'Foo'), Address.new(id: 2, street: 'Bar')]
64
- expected = %{<input id="user_misc" multiple="multiple" name="user[misc][]" type="hidden" value="" /><div class="form-group"><label class="control-label" for="user_misc">Misc</label><div class="checkbox"><label for="user_misc_1"><input id="user_misc_1" name="user[misc][]" type="checkbox" value="1" /> Foo</label></div><div class="checkbox"><label for="user_misc_2"><input id="user_misc_2" name="user[misc][]" type="checkbox" value="2" /> Bar</label></div></div>}
65
-
66
- assert_equivalent_xml expected, @builder.collection_check_boxes(:misc, collection, :id, :street)
67
- end
68
-
69
- test 'collection_check_boxes renders inline checkboxes correctly' do
70
- collection = [Address.new(id: 1, street: 'Foo'), Address.new(id: 2, street: 'Bar')]
71
- expected = %{<input id="user_misc" multiple="multiple" name="user[misc][]" type="hidden" value="" /><div class="form-group"><label class="control-label" for="user_misc">Misc</label><label class="checkbox-inline" for="user_misc_1"><input id="user_misc_1" name="user[misc][]" type="checkbox" value="1" /> Foo</label><label class="checkbox-inline" for="user_misc_2"><input id="user_misc_2" name="user[misc][]" type="checkbox" value="2" /> Bar</label></div>}
72
-
73
- assert_equivalent_xml expected, @builder.collection_check_boxes(:misc, collection, :id, :street, inline: true)
74
- end
75
-
76
- test 'collection_check_boxes renders with checked option correctly' do
77
- collection = [Address.new(id: 1, street: 'Foo'), Address.new(id: 2, street: 'Bar')]
78
- expected = %{<input id="user_misc" multiple="multiple" name="user[misc][]" type="hidden" value="" /><div class="form-group"><label class="control-label" for="user_misc">Misc</label><div class="checkbox"><label for="user_misc_1"><input checked="checked" id="user_misc_1" name="user[misc][]" type="checkbox" value="1" /> Foo</label></div><div class="checkbox"><label for="user_misc_2"><input id="user_misc_2" name="user[misc][]" type="checkbox" value="2" /> Bar</label></div></div>}
79
-
80
- assert_equivalent_xml expected, @builder.collection_check_boxes(:misc, collection, :id, :street, checked: 1)
81
- assert_equivalent_xml expected, @builder.collection_check_boxes(:misc, collection, :id, :street, checked: collection.first)
82
- end
83
-
84
- test 'collection_check_boxes renders with multiple checked options correctly' do
85
- collection = [Address.new(id: 1, street: 'Foo'), Address.new(id: 2, street: 'Bar')]
86
- expected = %{<input id="user_misc" multiple="multiple" name="user[misc][]" type="hidden" value="" /><div class="form-group"><label class="control-label" for="user_misc">Misc</label><div class="checkbox"><label for="user_misc_1"><input checked="checked" id="user_misc_1" name="user[misc][]" type="checkbox" value="1" /> Foo</label></div><div class="checkbox"><label for="user_misc_2"><input checked="checked" id="user_misc_2" name="user[misc][]" type="checkbox" value="2" /> Bar</label></div></div>}
87
-
88
- assert_equivalent_xml expected, @builder.collection_check_boxes(:misc, collection, :id, :street, checked: [1, 2])
89
- assert_equivalent_xml expected, @builder.collection_check_boxes(:misc, collection, :id, :street, checked: collection)
90
- end
91
-
92
- test 'collection_check_boxes sanitizes values when generating label `for`' do
93
- collection = [Address.new(id: 1, street: 'Foo St')]
94
- expected = %{<input id="user_misc" multiple="multiple" name="user[misc][]" type="hidden" value="" /><div class="form-group"><label class="control-label" for="user_misc">Misc</label><div class="checkbox"><label for="user_misc_foo_st"><input id="user_misc_foo_st" name="user[misc][]" type="checkbox" value="Foo St" /> Foo St</label></div></div>}
95
-
96
- assert_equivalent_xml expected, @builder.collection_check_boxes(:misc, collection, :street, :street)
97
- end
98
-
99
- test 'collection_check_boxes renders multiple checkboxes with labels defined by Proc :text_method correctly' do
100
- collection = [Address.new(id: 1, street: 'Foo'), Address.new(id: 2, street: 'Bar')]
101
- expected = %{<input id="user_misc" multiple="multiple" name="user[misc][]" type="hidden" value="" /><div class="form-group"><label class="control-label" for="user_misc">Misc</label><div class="checkbox"><label for="user_misc_1"><input id="user_misc_1" name="user[misc][]" type="checkbox" value="1" /> ooF</label></div><div class="checkbox"><label for="user_misc_2"><input id="user_misc_2" name="user[misc][]" type="checkbox" value="2" /> raB</label></div></div>}
102
-
103
- assert_equivalent_xml expected, @builder.collection_check_boxes(:misc, collection, :id, Proc.new { |a| a.street.reverse })
104
- end
105
-
106
- test 'collection_check_boxes renders multiple checkboxes with values defined by Proc :value_method correctly' do
107
- collection = [Address.new(id: 1, street: 'Foo'), Address.new(id: 2, street: 'Bar')]
108
- expected = %{<input id="user_misc" multiple="multiple" name="user[misc][]" type="hidden" value="" /><div class="form-group"><label class="control-label" for="user_misc">Misc</label><div class="checkbox"><label for="user_misc_address_1"><input id="user_misc_address_1" name="user[misc][]" type="checkbox" value="address_1" /> Foo</label></div><div class="checkbox"><label for="user_misc_address_2"><input id="user_misc_address_2" name="user[misc][]" type="checkbox" value="address_2" /> Bar</label></div></div>}
109
-
110
- assert_equivalent_xml expected, @builder.collection_check_boxes(:misc, collection, Proc.new { |a| "address_#{a.id}" }, :street)
111
- end
112
-
113
- test 'collection_check_boxes renders multiple checkboxes with labels defined by lambda :text_method correctly' do
114
- collection = [Address.new(id: 1, street: 'Foo'), Address.new(id: 2, street: 'Bar')]
115
- expected = %{<input id="user_misc" multiple="multiple" name="user[misc][]" type="hidden" value="" /><div class="form-group"><label class="control-label" for="user_misc">Misc</label><div class="checkbox"><label for="user_misc_1"><input id="user_misc_1" name="user[misc][]" type="checkbox" value="1" /> ooF</label></div><div class="checkbox"><label for="user_misc_2"><input id="user_misc_2" name="user[misc][]" type="checkbox" value="2" /> raB</label></div></div>}
116
-
117
- assert_equivalent_xml expected, @builder.collection_check_boxes(:misc, collection, :id, lambda { |a| a.street.reverse })
118
- end
119
-
120
- test 'collection_check_boxes renders multiple checkboxes with values defined by lambda :value_method correctly' do
121
- collection = [Address.new(id: 1, street: 'Foo'), Address.new(id: 2, street: 'Bar')]
122
- expected = %{<input id="user_misc" multiple="multiple" name="user[misc][]" type="hidden" value="" /><div class="form-group"><label class="control-label" for="user_misc">Misc</label><div class="checkbox"><label for="user_misc_address_1"><input id="user_misc_address_1" name="user[misc][]" type="checkbox" value="address_1" /> Foo</label></div><div class="checkbox"><label for="user_misc_address_2"><input id="user_misc_address_2" name="user[misc][]" type="checkbox" value="address_2" /> Bar</label></div></div>}
123
-
124
- assert_equivalent_xml expected, @builder.collection_check_boxes(:misc, collection, lambda { |a| "address_#{a.id}" }, :street)
125
- end
126
-
127
- test 'collection_check_boxes renders with checked option correctly with Proc :value_method' do
128
- collection = [Address.new(id: 1, street: 'Foo'), Address.new(id: 2, street: 'Bar')]
129
- expected = %{<input id="user_misc" multiple="multiple" name="user[misc][]" type="hidden" value="" /><div class="form-group"><label class="control-label" for="user_misc">Misc</label><div class="checkbox"><label for="user_misc_address_1"><input checked="checked" id="user_misc_address_1" name="user[misc][]" type="checkbox" value="address_1" /> Foo</label></div><div class="checkbox"><label for="user_misc_address_2"><input id="user_misc_address_2" name="user[misc][]" type="checkbox" value="address_2" /> Bar</label></div></div>}
130
-
131
- assert_equivalent_xml expected, @builder.collection_check_boxes(:misc, collection, Proc.new { |a| "address_#{a.id}" }, :street, checked: "address_1")
132
- assert_equivalent_xml expected, @builder.collection_check_boxes(:misc, collection, Proc.new { |a| "address_#{a.id}" }, :street, checked: collection.first)
133
- end
134
-
135
- test 'collection_check_boxes renders with multiple checked options correctly with lambda :value_method' do
136
- collection = [Address.new(id: 1, street: 'Foo'), Address.new(id: 2, street: 'Bar')]
137
- expected = %{<input id="user_misc" multiple="multiple" name="user[misc][]" type="hidden" value="" /><div class="form-group"><label class="control-label" for="user_misc">Misc</label><div class="checkbox"><label for="user_misc_address_1"><input checked="checked" id="user_misc_address_1" name="user[misc][]" type="checkbox" value="address_1" /> Foo</label></div><div class="checkbox"><label for="user_misc_address_2"><input checked="checked" id="user_misc_address_2" name="user[misc][]" type="checkbox" value="address_2" /> Bar</label></div></div>}
138
-
139
- assert_equivalent_xml expected, @builder.collection_check_boxes(:misc, collection, lambda { |a| "address_#{a.id}" }, :street, checked: ["address_1", "address_2"])
140
- assert_equivalent_xml expected, @builder.collection_check_boxes(:misc, collection, lambda { |a| "address_#{a.id}" }, :street, checked: collection)
141
- end
142
-
143
-
144
- end
@@ -1,152 +0,0 @@
1
- require 'test_helper'
2
-
3
- class BootstrapFieldsTest < ActionView::TestCase
4
- include BootstrapForm::Helper
5
-
6
- def setup
7
- setup_test_fixture
8
- end
9
-
10
- test "color fields are wrapped correctly" do
11
- expected = %{<div class="form-group"><label class="control-label" for="user_misc">Misc</label><input class="form-control" id="user_misc" name="user[misc]" type="color" value="#000000" /></div>}
12
- assert_equivalent_xml expected, @builder.color_field(:misc)
13
- end
14
-
15
- test "date fields are wrapped correctly" do
16
- expected = %{<div class="form-group"><label class="control-label" for="user_misc">Misc</label><input class="form-control" id="user_misc" name="user[misc]" type="date" /></div>}
17
- assert_equivalent_xml expected, @builder.date_field(:misc)
18
- end
19
-
20
- test "date time fields are wrapped correctly" do
21
- expected = %{<div class="form-group"><label class="control-label" for="user_misc">Misc</label><input class="form-control" id="user_misc" name="user[misc]" type="datetime" /></div>}
22
- assert_equivalent_xml expected, @builder.datetime_field(:misc)
23
- end
24
-
25
- test "date time local fields are wrapped correctly" do
26
- expected = %{<div class="form-group"><label class="control-label" for="user_misc">Misc</label><input class="form-control" id="user_misc" name="user[misc]" type="datetime-local" /></div>}
27
- assert_equivalent_xml expected, @builder.datetime_local_field(:misc)
28
- end
29
-
30
- test "email fields are wrapped correctly" do
31
- expected = %{<div class="form-group"><label class="control-label" for="user_misc">Misc</label><input class="form-control" id="user_misc" name="user[misc]" type="email" /></div>}
32
- assert_equivalent_xml expected, @builder.email_field(:misc)
33
- end
34
-
35
- test "file fields are wrapped correctly" do
36
- expected = %{<div class="form-group"><label class="control-label" for="user_misc">Misc</label><input id="user_misc" name="user[misc]" type="file" /></div>}
37
- assert_equivalent_xml expected, @builder.file_field(:misc)
38
- end
39
-
40
- test "hidden fields are supported" do
41
- expected = %{<input id="user_misc" name="user[misc]" type="hidden" />}
42
- assert_equivalent_xml expected, @builder.hidden_field(:misc)
43
- end
44
-
45
- test "month local fields are wrapped correctly" do
46
- expected = %{<div class="form-group"><label class="control-label" for="user_misc">Misc</label><input class="form-control" id="user_misc" name="user[misc]" type="month" /></div>}
47
- assert_equivalent_xml expected, @builder.month_field(:misc)
48
- end
49
-
50
- test "number fields are wrapped correctly" do
51
- expected = %{<div class="form-group"><label class="control-label" for="user_misc">Misc</label><input class="form-control" id="user_misc" name="user[misc]" type="number" /></div>}
52
- assert_equivalent_xml expected, @builder.number_field(:misc)
53
- end
54
-
55
- test "password fields are wrapped correctly" do
56
- expected = %{<div class="form-group"><label class="control-label" for="user_password">Password</label><input class="form-control" id="user_password" name="user[password]" type="password" /><span class="help-block">A good password should be at least six characters long</span></div>}
57
- assert_equivalent_xml expected, @builder.password_field(:password)
58
- end
59
-
60
- test "phone/telephone fields are wrapped correctly" do
61
- expected = %{<div class="form-group"><label class="control-label" for="user_misc">Misc</label><input class="form-control" id="user_misc" name="user[misc]" type="tel" /></div>}
62
- assert_equivalent_xml expected, @builder.phone_field(:misc)
63
- assert_equivalent_xml expected, @builder.telephone_field(:misc)
64
- end
65
-
66
- test "range fields are wrapped correctly" do
67
- expected = %{<div class="form-group"><label class="control-label" for="user_misc">Misc</label><input class="form-control" id="user_misc" name="user[misc]" type="range" /></div>}
68
- assert_equivalent_xml expected, @builder.range_field(:misc)
69
- end
70
-
71
- test "search fields are wrapped correctly" do
72
- expected = %{<div class="form-group"><label class="control-label" for="user_misc">Misc</label><input class="form-control" id="user_misc" name="user[misc]" type="search" /></div>}
73
- assert_equivalent_xml expected, @builder.search_field(:misc)
74
- end
75
-
76
- test "text areas are wrapped correctly" do
77
- expected = %{<div class="form-group"><label class="control-label" for="user_comments">Comments</label><textarea class="form-control" id="user_comments" name="user[comments]">\nmy comment</textarea></div>}
78
- assert_equivalent_xml expected, @builder.text_area(:comments)
79
- end
80
-
81
- test "text fields are wrapped correctly" do
82
- expected = %{<div class="form-group"><label class="control-label required" for="user_email">Email</label><input class="form-control" id="user_email" name="user[email]" type="text" value="steve@example.com" /></div>}
83
- assert_equivalent_xml expected, @builder.text_field(:email)
84
- end
85
-
86
- test "time fields are wrapped correctly" do
87
- expected = %{<div class="form-group"><label class="control-label" for="user_misc">Misc</label><input class="form-control" id="user_misc" name="user[misc]" type="time" /></div>}
88
- assert_equivalent_xml expected, @builder.time_field(:misc)
89
- end
90
-
91
- test "url fields are wrapped correctly" do
92
- expected = %{<div class="form-group"><label class="control-label" for="user_misc">Misc</label><input class="form-control" id="user_misc" name="user[misc]" type="url" /></div>}
93
- assert_equivalent_xml expected, @builder.url_field(:misc)
94
- end
95
-
96
- test "week fields are wrapped correctly" do
97
- expected = %{<div class="form-group"><label class="control-label" for="user_misc">Misc</label><input class="form-control" id="user_misc" name="user[misc]" type="week" /></div>}
98
- assert_equivalent_xml expected, @builder.week_field(:misc)
99
- end
100
-
101
- test "bootstrap_form_for helper works for associations" do
102
- @user.address = Address.new(street: '123 Main Street')
103
-
104
- output = bootstrap_form_for(@user) do |f|
105
- f.fields_for :address do |af|
106
- af.text_field(:street)
107
- end
108
- end
109
-
110
- expected = %{<form accept-charset="UTF-8" action="/users" class="new_user" id="new_user" method="post" role="form"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /></div><div class="form-group"><label class="control-label" for="user_address_attributes_street">Street</label><input class="form-control" id="user_address_attributes_street" name="user[address_attributes][street]" type="text" value="123 Main Street" /></div></form>}
111
- assert_equivalent_xml expected, output
112
- end
113
-
114
- test "bootstrap_form_for helper works for serialized hash attributes" do
115
- @user.preferences = { favorite_color: "cerulean" }
116
-
117
- output = bootstrap_form_for(@user) do |f|
118
- f.fields_for :preferences do |builder|
119
- builder.text_field :favorite_color, value: @user.preferences[:favorite_color]
120
- end
121
- end
122
-
123
- expected = %{<form accept-charset="UTF-8" action="/users" class="new_user" id="new_user" method="post" role="form"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /></div><div class="form-group"><label class="control-label" for="user_preferences_favorite_color">Favorite color</label><input class="form-control" id="user_preferences_favorite_color" name="user[preferences][favorite_color]" type="text" value="cerulean" /></div></form>}
124
- assert_equivalent_xml expected, output
125
- end
126
-
127
- test "fields_for correctly passes horizontal style from parent builder" do
128
- @user.address = Address.new(street: '123 Main Street')
129
-
130
- output = bootstrap_form_for(@user, layout: :horizontal, label_col: 'col-sm-2', control_col: 'col-sm-10') do |f|
131
- f.fields_for :address do |af|
132
- af.text_field(:street)
133
- end
134
- end
135
-
136
- expected = %{<form accept-charset="UTF-8" action="/users" class="form-horizontal" id="new_user" method="post" role="form"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /></div><div class="form-group"><label class="control-label col-sm-2" for="user_address_attributes_street">Street</label><div class="col-sm-10"><input class="form-control" id="user_address_attributes_street" name="user[address_attributes][street]" type="text" value="123 Main Street" /></div></div></form>}
137
- assert_equivalent_xml expected, output
138
- end
139
-
140
- test "fields_for correctly passes inline style from parent builder" do
141
- @user.address = Address.new(street: '123 Main Street')
142
-
143
- output = bootstrap_form_for(@user, layout: :inline) do |f|
144
- f.fields_for :address do |af|
145
- af.text_field(:street)
146
- end
147
- end
148
-
149
- expected = %{<form accept-charset="UTF-8" action="/users" class="form-inline" id="new_user" method="post" role="form"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /></div><div class="form-group"><label class="control-label" for="user_address_attributes_street">Street</label><input class="form-control" id="user_address_attributes_street" name="user[address_attributes][street]" type="text" value="123 Main Street" /></div></form>}
150
- assert_equivalent_xml expected, output
151
- end
152
- end
@@ -1,289 +0,0 @@
1
- require 'test_helper'
2
-
3
- class BootstrapFormGroupTest < ActionView::TestCase
4
- include BootstrapForm::Helper
5
-
6
- def setup
7
- setup_test_fixture
8
- end
9
-
10
- test "changing the label text via the label option parameter" do
11
- expected = %{<div class="form-group"><label class="control-label required" for="user_email">Email Address</label><input class="form-control" id="user_email" name="user[email]" type="text" value="steve@example.com" /></div>}
12
- assert_equivalent_xml expected, @builder.text_field(:email, label: 'Email Address')
13
- end
14
-
15
- test "changing the label text via the html_options label hash" do
16
- expected = %{<div class="form-group"><label class="control-label required" for="user_email">Email Address</label><input class="form-control" id="user_email" name="user[email]" type="text" value="steve@example.com" /></div>}
17
- assert_equivalent_xml expected, @builder.text_field(:email, label: {text: 'Email Address'})
18
- end
19
-
20
- test "hiding a label" do
21
- expected = %{<div class="form-group"><label class="sr-only control-label required" for="user_email">Email</label><input class="form-control" id="user_email" name="user[email]" type="text" value="steve@example.com" /></div>}
22
- assert_equivalent_xml expected, @builder.text_field(:email, hide_label: true)
23
- end
24
-
25
- test "adding a custom label class via the label_class parameter" do
26
- expected = %{<div class="form-group"><label class="btn control-label required" for="user_email">Email</label><input class="form-control" id="user_email" name="user[email]" type="text" value="steve@example.com" /></div>}
27
- assert_equivalent_xml expected, @builder.text_field(:email, label_class: 'btn')
28
- end
29
-
30
- test "adding a custom label class via the html_options label hash" do
31
- expected = %{<div class="form-group"><label class="btn control-label required" for="user_email">Email</label><input class="form-control" id="user_email" name="user[email]" type="text" value="steve@example.com" /></div>}
32
- assert_equivalent_xml expected, @builder.text_field(:email, label: {class: 'btn'})
33
- end
34
-
35
- test "adding a custom label and changing the label text via the html_options label hash" do
36
- expected = %{<div class="form-group"><label class="btn control-label required" for="user_email">Email Address</label><input class="form-control" id="user_email" name="user[email]" type="text" value="steve@example.com" /></div>}
37
- assert_equivalent_xml expected, @builder.text_field(:email, label: {class: 'btn', text: "Email Address"})
38
- end
39
-
40
- test "skipping a label" do
41
- expected = %{<div class="form-group"><input class="form-control" id="user_email" name="user[email]" type="text" value="steve@example.com" /></div>}
42
- assert_equivalent_xml expected, @builder.text_field(:email, skip_label: true)
43
- end
44
-
45
- test "preventing a label from having the required class" do
46
- expected = %{<div class="form-group"><label class="control-label" for="user_email">Email</label><input class="form-control" id="user_email" name="user[email]" type="text" value="steve@example.com" /></div>}
47
- assert_equivalent_xml expected, @builder.text_field(:email, skip_required: true)
48
- end
49
-
50
- test "adding prepend text" do
51
- expected = %{<div class="form-group"><label class="control-label required" for="user_email">Email</label><div class="input-group"><span class="input-group-addon">@</span><input class="form-control" id="user_email" name="user[email]" type="text" value="steve@example.com" /></div></div>}
52
- assert_equivalent_xml expected, @builder.text_field(:email, prepend: '@')
53
- end
54
-
55
- test "adding append text" do
56
- expected = %{<div class="form-group"><label class="control-label required" for="user_email">Email</label><div class="input-group"><input class="form-control" id="user_email" name="user[email]" type="text" value="steve@example.com" /><span class="input-group-addon">.00</span></div></div>}
57
- assert_equivalent_xml expected, @builder.text_field(:email, append: '.00')
58
- end
59
-
60
- test "append and prepend button" do
61
- prefix = %{<div class="form-group"><label class="control-label required" for="user_email">Email</label><div class="input-group">}
62
- field = %{<input class="form-control" id="user_email" name="user[email]" type="text" value="steve@example.com" />}
63
- button = %{<span class="input-group-btn"><a class="btn btn-default" href="#">Click</a></span>}
64
- suffix = %{</div></div>}
65
- after_button = prefix + field + button + suffix
66
- before_button = prefix + button + field + suffix
67
- both_button = prefix + button + field + button + suffix
68
- button_src = link_to("Click", "#", class: "btn btn-default")
69
- assert_equivalent_xml after_button, @builder.text_field(:email, append: button_src)
70
- assert_equivalent_xml before_button, @builder.text_field(:email, prepend: button_src)
71
- assert_equivalent_xml both_button, @builder.text_field(:email, append: button_src, prepend: button_src)
72
- end
73
-
74
- test "adding both prepend and append text" do
75
- expected = %{<div class="form-group"><label class="control-label required" for="user_email">Email</label><div class="input-group"><span class="input-group-addon">$</span><input class="form-control" id="user_email" name="user[email]" type="text" value="steve@example.com" /><span class="input-group-addon">.00</span></div></div>}
76
- assert_equivalent_xml expected, @builder.text_field(:email, prepend: '$', append: '.00')
77
- end
78
-
79
- test "help messages for default forms" do
80
- expected = %{<div class="form-group"><label class="control-label required" for="user_email">Email</label><input class="form-control" id="user_email" name="user[email]" type="text" value="steve@example.com" /><span class="help-block">This is required</span></div>}
81
- assert_equivalent_xml expected, @builder.text_field(:email, help: 'This is required')
82
- end
83
-
84
- test "help messages for horizontal forms" do
85
- expected = %{<div class="form-group"><label class="control-label col-sm-2 required" for="user_email">Email</label><div class="col-sm-10"><input class="form-control" id="user_email" name="user[email]" type="text" value="steve@example.com" /><span class="help-block">This is required</span></div></div>}
86
- assert_equivalent_xml expected, @horizontal_builder.text_field(:email, help: "This is required")
87
- end
88
-
89
- test "help messages to look up I18n automatically" do
90
- expected = %{<div class="form-group"><label class="control-label" for="user_password">Password</label><input class="form-control" id="user_password" name="user[password]" type="text" value="secret" /><span class="help-block">A good password should be at least six characters long</span></div>}
91
- assert_equivalent_xml expected, @builder.text_field(:password)
92
- end
93
-
94
- test "help messages to warn about deprecated I18n key" do
95
- super_user = SuperUser.new(@user.attributes)
96
- builder = BootstrapForm::FormBuilder.new(:super_user, super_user, self, {})
97
-
98
- I18n.backend.store_translations(:en, activerecord: {
99
- help: {
100
- superuser: {
101
- password: 'A good password should be at least six characters long'
102
- }
103
- }
104
- })
105
-
106
- builder.stubs(:warn).returns(true)
107
- builder.expects(:warn).at_least_once
108
-
109
- builder.password_field(:password)
110
- end
111
-
112
- test "help messages to ignore translation when user disables help" do
113
- expected = %{<div class="form-group"><label class="control-label" for="user_password">Password</label><input class="form-control" id="user_password" name="user[password]" type="text" value="secret" /></div>}
114
- assert_equivalent_xml expected, @builder.text_field(:password, help: false)
115
- end
116
-
117
- test "form_group creates a valid structure and allows arbitrary html to be added via a block" do
118
- output = @horizontal_builder.form_group :nil, label: { text: 'Foo' } do
119
- %{<p class="form-control-static">Bar</p>}.html_safe
120
- end
121
-
122
- expected = %{<div class="form-group"><label class="control-label col-sm-2" for="user_nil">Foo</label><div class="col-sm-10"><p class="form-control-static">Bar</p></div></div>}
123
- assert_equivalent_xml expected, output
124
- end
125
-
126
- test "form_group adds a spacer when no label exists for a horizontal form" do
127
- output = @horizontal_builder.form_group do
128
- %{<p class="form-control-static">Bar</p>}.html_safe
129
- end
130
-
131
- expected = %{<div class="form-group"><div class="col-sm-10 col-sm-offset-2"><p class="form-control-static">Bar</p></div></div>}
132
- assert_equivalent_xml expected, output
133
- end
134
-
135
- test "form_group renders the label correctly" do
136
- output = @horizontal_builder.form_group :email, label: { text: 'Custom Control' } do
137
- %{<p class="form-control-static">Bar</p>}.html_safe
138
- end
139
-
140
- expected = %{<div class="form-group"><label class="control-label col-sm-2 required" for="user_email">Custom Control</label><div class="col-sm-10"><p class="form-control-static">Bar</p></div></div>}
141
- assert_equivalent_xml expected, output
142
- end
143
-
144
- test "form_group accepts class thorugh options hash" do
145
- output = @horizontal_builder.form_group :email, class: "foo" do
146
- %{<p class="form-control-static">Bar</p>}.html_safe
147
- end
148
-
149
- expected = %{<div class="form-group foo"><div class="col-sm-10 col-sm-offset-2"><p class="form-control-static">Bar</p></div></div>}
150
- assert_equivalent_xml expected, output
151
- end
152
-
153
- test "form_group accepts class thorugh options hash without needing a name" do
154
- output = @horizontal_builder.form_group class: "foo" do
155
- %{<p class="form-control-static">Bar</p>}.html_safe
156
- end
157
-
158
- expected = %{<div class="form-group foo"><div class="col-sm-10 col-sm-offset-2"><p class="form-control-static">Bar</p></div></div>}
159
- assert_equivalent_xml expected, output
160
- end
161
-
162
- test "form_group overrides the label's 'class' and 'for' attributes if others are passed" do
163
- output = @horizontal_builder.form_group nil, label: { text: 'Custom Control', class: 'foo', for: 'bar' } do
164
- %{<p class="form-control-static">Bar</p>}.html_safe
165
- end
166
-
167
- expected = %{<div class="form-group"><label class="foo control-label col-sm-2" for="bar">Custom Control</label><div class="col-sm-10"><p class="form-control-static">Bar</p></div></div>}
168
- assert_equivalent_xml expected, output
169
- end
170
-
171
- test 'form_group renders the "error" class and message corrrectly when object is invalid' do
172
- @user.email = nil
173
- @user.valid?
174
-
175
- output = @builder.form_group :email do
176
- %{<p class="form-control-static">Bar</p>}.html_safe
177
- end
178
-
179
- expected = %{<div class="form-group has-error"><p class="form-control-static">Bar</p><span class="help-block">can&#39;t be blank, is too short (minimum is 5 characters)</span></div>}
180
- assert_equivalent_xml expected, output
181
- end
182
-
183
- test "adds class to wrapped form_group by a field" do
184
- expected = %{<div class="form-group none-margin"><label class="control-label" for="user_misc">Misc</label><input class="form-control" id="user_misc" name="user[misc]" type="search" /></div>}
185
- assert_equivalent_xml expected, @builder.search_field(:misc, wrapper_class: 'none-margin')
186
- end
187
-
188
- test "adds class to wrapped form_group by a field with errors" do
189
- @user.email = nil
190
- @user.valid?
191
-
192
- expected = %{<div class="form-group none-margin has-error"><div class="field_with_errors"><label class="control-label required" for="user_email">Email</label></div><div class="field_with_errors"><input class="form-control" id="user_email" name="user[email]" type="email" /></div><span class="help-block">can&#39;t be blank, is too short (minimum is 5 characters)</span></div>}
193
- assert_equivalent_xml expected, @builder.email_field(:email, wrapper_class: 'none-margin')
194
- end
195
-
196
- test "adds class to wrapped form_group by a field with errors when bootstrap_form_for is used" do
197
- @user.email = nil
198
- @user.valid?
199
-
200
- output = bootstrap_form_for(@user) do |f|
201
- f.text_field(:email, help: 'This is required', wrapper_class: 'none-margin')
202
- end
203
-
204
- expected = %{<form accept-charset="UTF-8" action="/users" class="new_user" id="new_user" method="post" role="form"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /></div><div class="form-group none-margin has-error"><label class="control-label required" for="user_email">Email</label><input class="form-control" id="user_email" name="user[email]" type="text" /><span class="help-block">can&#39;t be blank, is too short (minimum is 5 characters)</span></div></form>}
205
- assert_equivalent_xml expected, output
206
- end
207
-
208
- test "adds offset for form_group without label" do
209
- output = @horizontal_builder.form_group do
210
- @horizontal_builder.submit
211
- end
212
-
213
- expected = %{<div class="form-group"><div class="col-sm-10 col-sm-offset-2"><input class="btn btn-default" name="commit" type="submit" value="Create User" /></div></div>}
214
- assert_equivalent_xml expected, output
215
- end
216
-
217
- test "adds offset for form_group without label but specific label_col" do
218
- output = @horizontal_builder.form_group label_col: 'col-sm-5', control_col: 'col-sm-8' do
219
- @horizontal_builder.submit
220
- end
221
-
222
- expected = %{<div class="form-group"><div class="col-sm-8 col-sm-offset-5"><input class="btn btn-default" name="commit" type="submit" value="Create User" /></div></div>}
223
- assert_equivalent_xml expected, output
224
- end
225
-
226
- test "adding an icon to a field" do
227
- expected = %{<div class="form-group has-feedback"><label class="control-label" for="user_misc">Misc</label><input class="form-control" id="user_misc" name="user[misc]" type="email" /><span class="glyphicon glyphicon-ok form-control-feedback"></span></div>}
228
- assert_equivalent_xml expected, @builder.email_field(:misc, icon: 'ok')
229
- end
230
-
231
- test "single form_group call in horizontal form should not be smash design" do
232
- output = ''
233
- output = @horizontal_builder.form_group do
234
- "Hallo"
235
- end
236
-
237
- output = output + @horizontal_builder.text_field(:email)
238
-
239
- expected = %{<div class="form-group"><div class="col-sm-10 col-sm-offset-2">Hallo</div></div><div class="form-group"><label class="control-label col-sm-2 required" for="user_email">Email</label><div class="col-sm-10"><input class="form-control" id="user_email" name="user[email]" type="text" value="steve@example.com" /></div></div>}
240
- assert_equivalent_xml expected, output
241
- end
242
-
243
- test "adds data-attributes (or any other options) to wrapper" do
244
- expected = %{<div class="form-group" data-foo="bar"><label class="control-label" for="user_misc">Misc</label><input class="form-control" id="user_misc" name="user[misc]" type="search" /></div>}
245
- assert_equivalent_xml expected, @builder.search_field(:misc, wrapper: { data: { foo: 'bar' } })
246
- end
247
-
248
- test "passing options to a form control get passed through" do
249
- expected = %{<div class="form-group"><label class="control-label required" for="user_email">Email</label><input autofocus="autofocus" class="form-control" id="user_email" name="user[email]" type="text" value="steve@example.com" /></div>}
250
- assert_equivalent_xml expected, @builder.text_field(:email, autofocus: true)
251
- end
252
-
253
- test "doesn't throw undefined method error when the content block returns nil" do
254
- output = @builder.form_group :nil, label: { text: 'Foo' } do
255
- nil
256
- end
257
-
258
- expected = %{<div class="form-group"><label class="control-label" for="user_nil">Foo</label></div>}
259
- assert_equivalent_xml expected, output
260
- end
261
-
262
- test "custom form group layout option" do
263
- expected = %{<form accept-charset="UTF-8" action="/users" class="form-horizontal" id="new_user" method="post" role="form"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /></div><div class="form-group"><label class="control-label required" for="user_email">Email</label><input class="form-control" id="user_email" name="user[email]" type="email" value="steve@example.com" /></div></form>}
264
- assert_equivalent_xml expected, bootstrap_form_for(@user, layout: :horizontal) { |f| f.email_field :email, layout: :inline }
265
- end
266
-
267
- test "non-default column span on form is reflected in form_group" do
268
- non_default_horizontal_builder = BootstrapForm::FormBuilder.new(:user, @user, self, { layout: :horizontal, label_col: "col-sm-3", control_col: "col-sm-9" })
269
- output = non_default_horizontal_builder.form_group do
270
- %{<p class="form-control-static">Bar</p>}.html_safe
271
- end
272
-
273
- expected = %{<div class="form-group"><div class="col-sm-9 col-sm-offset-3"><p class="form-control-static">Bar</p></div></div>}
274
- assert_equivalent_xml expected, output
275
- end
276
-
277
- test "non-default column span on form isn't mutated" do
278
- frozen_horizontal_builder = BootstrapForm::FormBuilder.new(:user, @user, self, { layout: :horizontal, label_col: "col-sm-3".freeze, control_col: "col-sm-9".freeze })
279
- output = frozen_horizontal_builder.form_group { 'test' }
280
-
281
- expected = %{<div class="form-group"><div class="col-sm-9 col-sm-offset-3">test</div></div>}
282
- assert_equivalent_xml expected, output
283
- end
284
-
285
- test ":input_group_class should apply to input-group" do
286
- expected = %{<div class="form-group"><label class="control-label required" for="user_email">Email</label><div class="input-group input-group-lg"><input class="form-control" id="user_email" name="user[email]" type="email" value="steve@example.com" /><span class="input-group-btn"><input class="btn btn-primary" name="commit" type="submit" value="Subscribe" /></span></div></div>}
287
- assert_equivalent_xml expected, @builder.email_field(:email, append: @builder.primary('Subscribe'), input_group_class: 'input-group-lg')
288
- end
289
- end