bootstrap_form 2.1.1 → 2.2.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.
- checksums.yaml +4 -4
- data/README.md +242 -119
- data/lib/bootstrap_form/form_builder.rb +128 -44
- data/lib/bootstrap_form/helper.rb +3 -1
- data/lib/bootstrap_form/helpers/bootstrap.rb +24 -7
- data/lib/bootstrap_form/version.rb +1 -1
- data/test/bootstrap_checkbox_test.rb +71 -0
- data/test/bootstrap_fields_test.rb +152 -0
- data/test/bootstrap_form_group_test.rb +218 -0
- data/test/bootstrap_form_test.rb +47 -518
- data/test/bootstrap_other_components_test.rb +54 -0
- data/test/bootstrap_radio_button_test.rb +47 -0
- data/test/bootstrap_selects_test.rb +132 -0
- data/test/dummy/log/test.log +3385 -39948
- data/test/test_helper.rb +7 -0
- metadata +14 -4
- data/test/dummy/log/development.log +0 -0
@@ -26,53 +26,79 @@ module BootstrapForm
|
|
26
26
|
end
|
27
27
|
|
28
28
|
FIELD_HELPERS.each do |method_name|
|
29
|
-
|
29
|
+
with_method_name = "#{method_name}_with_bootstrap"
|
30
|
+
without_method_name = "#{method_name}_without_bootstrap"
|
31
|
+
|
32
|
+
define_method(with_method_name) do |name, options = {}|
|
30
33
|
form_group_builder(name, options) do
|
31
34
|
prepend_and_append_input(options) do
|
32
|
-
|
35
|
+
send(without_method_name, name, options)
|
33
36
|
end
|
34
37
|
end
|
35
38
|
end
|
39
|
+
|
40
|
+
alias_method_chain method_name, :bootstrap
|
36
41
|
end
|
37
42
|
|
38
43
|
DATE_SELECT_HELPERS.each do |method_name|
|
39
|
-
|
44
|
+
with_method_name = "#{method_name}_with_bootstrap"
|
45
|
+
without_method_name = "#{method_name}_without_bootstrap"
|
46
|
+
|
47
|
+
define_method(with_method_name) do |name, options = {}, html_options = {}|
|
40
48
|
form_group_builder(name, options, html_options) do
|
41
|
-
content_tag(:div,
|
49
|
+
content_tag(:div, send(without_method_name, name, options, html_options), class: control_specific_class(method_name))
|
42
50
|
end
|
43
51
|
end
|
52
|
+
|
53
|
+
alias_method_chain method_name, :bootstrap
|
44
54
|
end
|
45
55
|
|
46
|
-
def
|
56
|
+
def file_field_with_bootstrap(name, options = {})
|
47
57
|
form_group_builder(name, options.reverse_merge(control_class: nil)) do
|
48
|
-
|
58
|
+
file_field_without_bootstrap(name, options)
|
49
59
|
end
|
50
60
|
end
|
51
61
|
|
52
|
-
|
62
|
+
alias_method_chain :file_field, :bootstrap
|
63
|
+
|
64
|
+
def select_with_bootstrap(method, choices, options = {}, html_options = {})
|
53
65
|
form_group_builder(method, options, html_options) do
|
54
|
-
|
66
|
+
select_without_bootstrap(method, choices, options, html_options)
|
55
67
|
end
|
56
68
|
end
|
57
69
|
|
58
|
-
|
70
|
+
alias_method_chain :select, :bootstrap
|
71
|
+
|
72
|
+
def collection_select_with_bootstrap(method, collection, value_method, text_method, options = {}, html_options = {})
|
59
73
|
form_group_builder(method, options, html_options) do
|
60
|
-
|
74
|
+
collection_select_without_bootstrap(method, collection, value_method, text_method, options, html_options)
|
61
75
|
end
|
62
76
|
end
|
63
77
|
|
64
|
-
|
78
|
+
alias_method_chain :collection_select, :bootstrap
|
79
|
+
|
80
|
+
def grouped_collection_select_with_bootstrap(method, collection, group_method, group_label_method, option_key_method, option_value_method, options = {}, html_options = {})
|
65
81
|
form_group_builder(method, options, html_options) do
|
66
|
-
|
82
|
+
grouped_collection_select_without_bootstrap(method, collection, group_method, group_label_method, option_key_method, option_value_method, options, html_options)
|
67
83
|
end
|
68
84
|
end
|
69
85
|
|
70
|
-
|
86
|
+
alias_method_chain :grouped_collection_select, :bootstrap
|
87
|
+
|
88
|
+
def time_zone_select_with_bootstrap(method, priority_zones = nil, options = {}, html_options = {})
|
89
|
+
form_group_builder(method, options, html_options) do
|
90
|
+
time_zone_select_without_bootstrap(method, priority_zones, options, html_options)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
alias_method_chain :time_zone_select, :bootstrap
|
95
|
+
|
96
|
+
def check_box_with_bootstrap(name, options = {}, checked_value = "1", unchecked_value = "0", &block)
|
71
97
|
options = options.symbolize_keys!
|
72
98
|
|
73
|
-
html =
|
99
|
+
html = check_box_without_bootstrap(name, options.except(:label, :help, :inline), checked_value, unchecked_value)
|
74
100
|
label_content = block_given? ? capture(&block) : options[:label]
|
75
|
-
html.concat(" ").concat(label_content || object.class.human_attribute_name(name) || name.to_s.humanize)
|
101
|
+
html.concat(" ").concat(label_content || (object && object.class.human_attribute_name(name)) || name.to_s.humanize)
|
76
102
|
|
77
103
|
label_name = name
|
78
104
|
label_name = "#{name}_#{checked_value}" if options[:multiple]
|
@@ -86,22 +112,31 @@ module BootstrapForm
|
|
86
112
|
end
|
87
113
|
end
|
88
114
|
|
89
|
-
|
115
|
+
alias_method_chain :check_box, :bootstrap
|
116
|
+
|
117
|
+
def radio_button_with_bootstrap(name, value, *args)
|
90
118
|
options = args.extract_options!.symbolize_keys!
|
91
119
|
args << options.except(:label, :help, :inline)
|
92
120
|
|
93
|
-
html =
|
121
|
+
html = radio_button_without_bootstrap(name, value, *args) + " " + options[:label]
|
94
122
|
|
95
|
-
|
96
|
-
|
97
|
-
|
123
|
+
if options[:inline]
|
124
|
+
label(name, html, class: "radio-inline", value: value)
|
125
|
+
else
|
126
|
+
content_tag(:div, class: "radio") do
|
127
|
+
label(name, html, value: value)
|
128
|
+
end
|
129
|
+
end
|
98
130
|
end
|
99
131
|
|
132
|
+
alias_method_chain :radio_button, :bootstrap
|
133
|
+
|
100
134
|
def collection_check_boxes(*args)
|
101
|
-
inputs_collection(*args) do |name, value, options|
|
135
|
+
html = inputs_collection(*args) do |name, value, options|
|
102
136
|
options[:multiple] = true
|
103
137
|
check_box(name, options, value, nil)
|
104
138
|
end
|
139
|
+
hidden_field(args.first,{value: "", multiple: true}).concat(html)
|
105
140
|
end
|
106
141
|
|
107
142
|
def collection_radio_buttons(*args)
|
@@ -122,29 +157,42 @@ module BootstrapForm
|
|
122
157
|
|
123
158
|
def form_group(*args, &block)
|
124
159
|
options = args.extract_options!
|
125
|
-
name
|
126
|
-
|
160
|
+
name = args.first
|
161
|
+
|
127
162
|
options[:class] = ["form-group", options[:class]].compact.join(' ')
|
128
163
|
options[:class] << " #{error_class}" if has_error?(name)
|
164
|
+
options[:class] << " #{feedback_class}" if options[:icon]
|
165
|
+
|
166
|
+
content_tag(:div, options.except(:id, :label, :help, :icon, :label_col, :control_col, :layout)) do
|
167
|
+
label = generate_label(options[:id], name, options[:label], options[:label_col], options[:layout]) if options[:label]
|
168
|
+
control = capture(&block).to_s
|
169
|
+
control.concat(generate_help(name, options[:help]).to_s)
|
170
|
+
control.concat(generate_icon(options[:icon])) if options[:icon]
|
129
171
|
|
130
|
-
content_tag(:div, options.except(:id, :label, :help, :label_col, :control_col, :layout)) do
|
131
|
-
label = generate_label(options[:id], name, options[:label], options[:label_col], options[:layout])
|
132
|
-
control_and_help = capture(&block).concat(generate_help(name, options[:help]))
|
133
172
|
if get_group_layout(options[:layout]) == :horizontal
|
134
|
-
|
173
|
+
control_class = (options[:control_col] || control_col.clone)
|
174
|
+
|
175
|
+
unless options[:label]
|
176
|
+
control_offset = offset_col(/([0-9]+)$/.match(options[:label_col] || default_label_col))
|
177
|
+
control_class.concat(" #{control_offset}")
|
178
|
+
end
|
179
|
+
control = content_tag(:div, control, class: control_class)
|
135
180
|
end
|
136
|
-
|
181
|
+
|
182
|
+
concat(label).concat(control)
|
137
183
|
end
|
138
184
|
end
|
139
185
|
|
140
|
-
def
|
186
|
+
def fields_for_with_bootstrap(record_name, record_object = nil, fields_options = {}, &block)
|
141
187
|
fields_options, record_object = record_object, nil if record_object.is_a?(Hash) && record_object.extractable_options?
|
142
188
|
fields_options[:layout] ||= options[:layout]
|
143
189
|
fields_options[:label_col] = fields_options[:label_col].present? ? "#{fields_options[:label_col]} #{label_class}" : options[:label_col]
|
144
190
|
fields_options[:control_col] ||= options[:control_col]
|
145
|
-
|
191
|
+
fields_for_without_bootstrap(record_name, record_object, fields_options, &block)
|
146
192
|
end
|
147
193
|
|
194
|
+
alias_method_chain :fields_for, :bootstrap
|
195
|
+
|
148
196
|
private
|
149
197
|
|
150
198
|
def horizontal?
|
@@ -159,6 +207,10 @@ module BootstrapForm
|
|
159
207
|
"col-sm-2"
|
160
208
|
end
|
161
209
|
|
210
|
+
def offset_col(offset)
|
211
|
+
"col-sm-offset-#{offset}"
|
212
|
+
end
|
213
|
+
|
162
214
|
def default_control_col
|
163
215
|
"col-sm-10"
|
164
216
|
end
|
@@ -179,6 +231,10 @@ module BootstrapForm
|
|
179
231
|
"has-error"
|
180
232
|
end
|
181
233
|
|
234
|
+
def feedback_class
|
235
|
+
"has-feedback"
|
236
|
+
end
|
237
|
+
|
182
238
|
def control_specific_class(method)
|
183
239
|
"rails-bootstrap-forms-#{method.gsub(/_/, "-")}"
|
184
240
|
end
|
@@ -200,12 +256,32 @@ module BootstrapForm
|
|
200
256
|
|
201
257
|
label = options.delete(:label)
|
202
258
|
label_class = hide_class if options.delete(:hide_label)
|
259
|
+
wrapper_class = options.delete(:wrapper_class)
|
260
|
+
wrapper_options = options.delete(:wrapper)
|
203
261
|
help = options.delete(:help)
|
262
|
+
icon = options.delete(:icon)
|
204
263
|
label_col = options.delete(:label_col)
|
205
264
|
control_col = options.delete(:control_col)
|
206
265
|
layout = get_group_layout(options.delete(:layout))
|
266
|
+
form_group_options = {
|
267
|
+
id: options[:id],
|
268
|
+
label: {
|
269
|
+
text: label,
|
270
|
+
class: label_class
|
271
|
+
},
|
272
|
+
help: help,
|
273
|
+
icon: icon,
|
274
|
+
label_col: label_col,
|
275
|
+
control_col: control_col,
|
276
|
+
layout: layout,
|
277
|
+
class: wrapper_class
|
278
|
+
}
|
279
|
+
|
280
|
+
if wrapper_options.is_a?(Hash)
|
281
|
+
form_group_options.reverse_merge!(wrapper_options)
|
282
|
+
end
|
207
283
|
|
208
|
-
form_group(method,
|
284
|
+
form_group(method, form_group_options) do
|
209
285
|
yield
|
210
286
|
end
|
211
287
|
end
|
@@ -217,22 +293,24 @@ module BootstrapForm
|
|
217
293
|
end
|
218
294
|
|
219
295
|
def generate_label(id, name, options, custom_label_col, group_layout)
|
220
|
-
if
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
label(name, options[:text], options.except(:text))
|
227
|
-
elsif get_group_layout(group_layout) == :horizontal
|
228
|
-
# no label. create an empty one to keep proper form alignment.
|
229
|
-
content_tag(:label, "", class: "#{label_class} #{label_col}")
|
230
|
-
end
|
296
|
+
options[:for] = id if acts_like_form_tag
|
297
|
+
classes = [options[:class], label_class]
|
298
|
+
classes << (custom_label_col || label_col) if get_group_layout(group_layout) == :horizontal
|
299
|
+
options[:class] = classes.compact.join(" ")
|
300
|
+
|
301
|
+
label(name, options[:text], options.except(:text))
|
231
302
|
end
|
232
303
|
|
233
304
|
def generate_help(name, help_text)
|
234
305
|
help_text = object.errors[name].join(", ") if has_error?(name) && inline_errors
|
235
|
-
|
306
|
+
return if help_text === false
|
307
|
+
|
308
|
+
help_text ||= I18n.t(name, scope: "activerecord.help.#{object.class.to_s.downcase}", default: '')
|
309
|
+
content_tag(:span, help_text, class: 'help-block') if help_text.present?
|
310
|
+
end
|
311
|
+
|
312
|
+
def generate_icon(icon)
|
313
|
+
content_tag(:span, "", class: "glyphicon glyphicon-#{icon} form-control-feedback")
|
236
314
|
end
|
237
315
|
|
238
316
|
def inputs_collection(name, collection, value, text, options = {}, &block)
|
@@ -241,7 +319,13 @@ module BootstrapForm
|
|
241
319
|
|
242
320
|
collection.each do |obj|
|
243
321
|
input_options = options.merge(label: obj.send(text))
|
244
|
-
|
322
|
+
|
323
|
+
if checked = input_options[:checked]
|
324
|
+
input_options[:checked] = checked == obj.send(value) ||
|
325
|
+
checked.try(:include?, obj.send(value)) ||
|
326
|
+
checked == obj ||
|
327
|
+
checked.try(:include?, obj)
|
328
|
+
end
|
245
329
|
|
246
330
|
input_options.delete(:class)
|
247
331
|
inputs << block.call(name, obj.send(value), input_options)
|
@@ -7,6 +7,9 @@ module BootstrapForm
|
|
7
7
|
def bootstrap_form_for(object, options = {}, &block)
|
8
8
|
options.reverse_merge!({builder: BootstrapForm::FormBuilder})
|
9
9
|
|
10
|
+
options[:html] ||= {}
|
11
|
+
options[:html][:role] ||= 'form'
|
12
|
+
|
10
13
|
layout = case options[:layout]
|
11
14
|
when :inline
|
12
15
|
"form-inline"
|
@@ -15,7 +18,6 @@ module BootstrapForm
|
|
15
18
|
end
|
16
19
|
|
17
20
|
if layout
|
18
|
-
options[:html] ||= {}
|
19
21
|
options[:html][:class] = [options[:html][:class], layout].compact.join(" ")
|
20
22
|
end
|
21
23
|
|
@@ -17,7 +17,7 @@ module BootstrapForm
|
|
17
17
|
if object.respond_to?(:errors) && object.errors.full_messages.any?
|
18
18
|
content_tag :div, class: css do
|
19
19
|
concat content_tag :p, title
|
20
|
-
concat error_summary unless
|
20
|
+
concat error_summary unless options[:error_summary] == false
|
21
21
|
end
|
22
22
|
end
|
23
23
|
end
|
@@ -30,15 +30,24 @@ module BootstrapForm
|
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
|
-
def errors_on(name)
|
33
|
+
def errors_on(name, options = {})
|
34
34
|
if has_error?(name)
|
35
|
+
hide_attribute_name = options[:hide_attribute_name] || false
|
36
|
+
|
35
37
|
content_tag :div, class: "alert alert-danger" do
|
36
|
-
|
38
|
+
if hide_attribute_name
|
39
|
+
object.errors[name].join(", ")
|
40
|
+
else
|
41
|
+
object.errors.full_messages_for(name).join(", ")
|
42
|
+
end
|
37
43
|
end
|
38
44
|
end
|
39
45
|
end
|
40
46
|
|
41
|
-
def static_control(
|
47
|
+
def static_control(*args, &block)
|
48
|
+
options = args.extract_options!
|
49
|
+
name = args.first
|
50
|
+
|
42
51
|
html = if block_given?
|
43
52
|
capture(&block)
|
44
53
|
else
|
@@ -54,12 +63,20 @@ module BootstrapForm
|
|
54
63
|
options = options.extract!(:prepend, :append)
|
55
64
|
input = capture(&block)
|
56
65
|
|
57
|
-
input = content_tag(:span, options[:prepend], class:
|
58
|
-
input << content_tag(:span, options[:append], class:
|
59
|
-
input = content_tag(:div, input, class:
|
66
|
+
input = content_tag(:span, options[:prepend], class: input_group_class(options[:prepend])) + input if options[:prepend]
|
67
|
+
input << content_tag(:span, options[:append], class: input_group_class(options[:append])) if options[:append]
|
68
|
+
input = content_tag(:div, input, class: "input-group") unless options.empty?
|
60
69
|
input
|
61
70
|
end
|
62
71
|
|
72
|
+
def input_group_class(add_on_content)
|
73
|
+
if add_on_content.match /btn/
|
74
|
+
'input-group-btn'
|
75
|
+
else
|
76
|
+
'input-group-addon'
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
63
80
|
def static_class
|
64
81
|
"form-control-static"
|
65
82
|
end
|
@@ -0,0 +1,71 @@
|
|
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_equal expected, @builder.check_box(:terms, label: 'I agree to the terms')
|
13
|
+
end
|
14
|
+
|
15
|
+
test "check_box label allows html" do
|
16
|
+
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>}
|
17
|
+
assert_equal expected, @builder.check_box(:terms, label: %{I agree to the <a href="#">terms</a>}.html_safe)
|
18
|
+
end
|
19
|
+
|
20
|
+
test "check_box accepts a block to define the label" 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 terms</label></div>}
|
22
|
+
assert_equal expected, @builder.check_box(:terms) { "I agree to the terms" }
|
23
|
+
end
|
24
|
+
|
25
|
+
test "check_box responds to checked_value and unchecked_value arguments" do
|
26
|
+
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>}
|
27
|
+
assert_equal expected, @builder.check_box(:terms, {label: 'I agree to the terms'}, 'yes', 'no')
|
28
|
+
end
|
29
|
+
|
30
|
+
test "inline checkboxes" do
|
31
|
+
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>}
|
32
|
+
assert_equal expected, @builder.check_box(:terms, label: 'I agree to the terms', inline: true)
|
33
|
+
end
|
34
|
+
|
35
|
+
test 'collection_check_boxes renders the form_group correctly' do
|
36
|
+
collection = [Address.new(id: 1, street: 'Foobar')]
|
37
|
+
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>}
|
38
|
+
|
39
|
+
assert_equal expected, @builder.collection_check_boxes(:misc, collection, :id, :street, label: 'This is a checkbox collection', help: 'With a help!')
|
40
|
+
end
|
41
|
+
|
42
|
+
test 'collection_check_boxes renders multiple checkboxes correctly' do
|
43
|
+
collection = [Address.new(id: 1, street: 'Foo'), Address.new(id: 2, street: 'Bar')]
|
44
|
+
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>}
|
45
|
+
|
46
|
+
assert_equal expected, @builder.collection_check_boxes(:misc, collection, :id, :street)
|
47
|
+
end
|
48
|
+
|
49
|
+
test 'collection_check_boxes renders inline checkboxes correctly' do
|
50
|
+
collection = [Address.new(id: 1, street: 'Foo'), Address.new(id: 2, street: 'Bar')]
|
51
|
+
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>}
|
52
|
+
|
53
|
+
assert_equal expected, @builder.collection_check_boxes(:misc, collection, :id, :street, inline: true)
|
54
|
+
end
|
55
|
+
|
56
|
+
test 'collection_check_boxes renders with checked option correctly' do
|
57
|
+
collection = [Address.new(id: 1, street: 'Foo'), Address.new(id: 2, street: 'Bar')]
|
58
|
+
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>}
|
59
|
+
|
60
|
+
assert_equal expected, @builder.collection_check_boxes(:misc, collection, :id, :street, checked: 1)
|
61
|
+
assert_equal expected, @builder.collection_check_boxes(:misc, collection, :id, :street, checked: collection.first)
|
62
|
+
end
|
63
|
+
|
64
|
+
test 'collection_check_boxes renders with multiple checked options correctly' do
|
65
|
+
collection = [Address.new(id: 1, street: 'Foo'), Address.new(id: 2, street: 'Bar')]
|
66
|
+
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>}
|
67
|
+
|
68
|
+
assert_equal expected, @builder.collection_check_boxes(:misc, collection, :id, :street, checked: [1, 2])
|
69
|
+
assert_equal expected, @builder.collection_check_boxes(:misc, collection, :id, :street, checked: collection)
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,152 @@
|
|
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_equal 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_equal 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_equal 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_equal 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_equal 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_equal 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_equal 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_equal 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_equal 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_equal 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_equal expected, @builder.phone_field(:misc)
|
63
|
+
assert_equal 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_equal 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_equal 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_equal 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" for="user_email">Email</label><input class="form-control" id="user_email" name="user[email]" type="text" value="steve@example.com" /></div>}
|
83
|
+
assert_equal 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_equal 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_equal 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_equal 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="✓" /></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_equal 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="✓" /></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_equal 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="✓" /></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_equal 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="✓" /></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_equal expected, output
|
151
|
+
end
|
152
|
+
end
|