forme 1.3.0 → 1.4.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/CHANGELOG +16 -0
- data/MIT-LICENSE +1 -1
- data/README.rdoc +9 -1
- data/Rakefile +10 -39
- data/lib/forme.rb +8 -4
- data/lib/forme/bs3.rb +387 -0
- data/lib/forme/erb.rb +4 -2
- data/lib/forme/form.rb +2 -0
- data/lib/forme/input.rb +2 -0
- data/lib/forme/rails.rb +2 -0
- data/lib/forme/raw.rb +2 -0
- data/lib/forme/sinatra.rb +2 -0
- data/lib/forme/tag.rb +2 -0
- data/lib/forme/transformers/error_handler.rb +2 -0
- data/lib/forme/transformers/formatter.rb +37 -13
- data/lib/forme/transformers/helper.rb +3 -1
- data/lib/forme/transformers/inputs_wrapper.rb +2 -0
- data/lib/forme/transformers/labeler.rb +2 -0
- data/lib/forme/transformers/serializer.rb +2 -0
- data/lib/forme/transformers/wrapper.rb +3 -1
- data/lib/forme/version.rb +3 -1
- data/lib/roda/plugins/forme.rb +2 -0
- data/lib/sequel/plugins/forme.rb +6 -2
- data/spec/bs3_reference_spec.rb +358 -0
- data/spec/bs3_sequel_plugin_spec.rb +523 -0
- data/spec/bs3_spec.rb +690 -0
- data/spec/erb_helper.rb +27 -25
- data/spec/forme_spec.rb +542 -526
- data/spec/rails_integration_spec.rb +26 -26
- data/spec/roda_integration_spec.rb +14 -5
- data/spec/sequel_plugin_spec.rb +247 -233
- data/spec/sinatra_integration_spec.rb +12 -3
- data/spec/spec_helper.rb +1 -14
- metadata +120 -4
data/lib/forme/erb.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen-string-literal: true
|
2
|
+
|
1
3
|
require 'forme'
|
2
4
|
|
3
5
|
module Forme
|
@@ -30,7 +32,7 @@ module Forme
|
|
30
32
|
# Set the template output object when initializing.
|
31
33
|
def initialize(*)
|
32
34
|
super
|
33
|
-
@output = @opts[:output] ? @opts[:output] :
|
35
|
+
@output = @opts[:output] ? @opts[:output] : String.new
|
34
36
|
end
|
35
37
|
|
36
38
|
# Serialize the tag and inject it into the output.
|
@@ -76,7 +78,7 @@ module Forme
|
|
76
78
|
end
|
77
79
|
end
|
78
80
|
|
79
|
-
def capture(block=
|
81
|
+
def capture(block=String.new) # :nodoc:
|
80
82
|
buf_was, @output = @output, block.is_a?(Proc) ? (eval("@_out_buf", block.binding) || @output) : block
|
81
83
|
yield
|
82
84
|
ret = @output
|
data/lib/forme/form.rb
CHANGED
data/lib/forme/input.rb
CHANGED
data/lib/forme/rails.rb
CHANGED
data/lib/forme/raw.rb
CHANGED
data/lib/forme/sinatra.rb
CHANGED
data/lib/forme/tag.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen-string-literal: true
|
2
|
+
|
1
3
|
module Forme
|
2
4
|
# The default formatter used by the library. Any custom formatters should
|
3
5
|
# probably inherit from this formatter unless they have very special needs.
|
@@ -60,9 +62,14 @@ module Forme
|
|
60
62
|
@opts = input.opts
|
61
63
|
normalize_options
|
62
64
|
|
63
|
-
tag =
|
64
|
-
|
65
|
-
|
65
|
+
tag = if html = input.opts[:html]
|
66
|
+
html = html.call(input) if html.respond_to?(:call)
|
67
|
+
form.raw(html)
|
68
|
+
else
|
69
|
+
convert_to_tag(input.type)
|
70
|
+
end
|
71
|
+
tag = wrap_tag_with_label(tag) if @opts[:label]
|
72
|
+
tag = wrap_tag_with_error(tag) if @opts[:error]
|
66
73
|
tag = wrap(:helper, tag) if input.opts[:help]
|
67
74
|
wrap_tag(tag)
|
68
75
|
end
|
@@ -220,14 +227,17 @@ module Forme
|
|
220
227
|
if @opts[:label]
|
221
228
|
@opts[:set_label] = @opts.delete(:label)
|
222
229
|
end
|
223
|
-
|
224
|
-
|
230
|
+
|
231
|
+
tag_wrapper = Forme.transformer(:tag_wrapper, @opts.delete(:tag_wrapper), @input.form_opts) || :default
|
232
|
+
wrapper = @opts.fetch(:wrapper){@opts[:wrapper] = @input.form_opts[:set_wrapper] || @input.form_opts[:wrapper]}
|
233
|
+
wrapper = Forme.transformer(:wrapper, wrapper)
|
225
234
|
|
226
235
|
tags = process_select_optgroups(:_format_set_optgroup) do |label, value, sel, attrs|
|
227
236
|
value ||= label
|
228
237
|
r_opts = attrs.merge(tag_attrs).merge(:label=>label||value, :label_attr=>{:class=>:option}, :wrapper=>tag_wrapper)
|
229
238
|
r_opts[:value] ||= value if value
|
230
239
|
r_opts[:checked] ||= :checked if sel
|
240
|
+
r_opts[:formatter] = @opts[:formatter] if @opts[:formatter]
|
231
241
|
|
232
242
|
if name
|
233
243
|
r_opts[:name] ||= name
|
@@ -244,17 +254,26 @@ module Forme
|
|
244
254
|
end
|
245
255
|
|
246
256
|
if @opts[:set_error]
|
247
|
-
|
248
|
-
last_input.opts[:error] = @opts[:set_error]
|
249
|
-
else
|
250
|
-
tags << form._tag(:span, {:class=>'error_message'}, [@opts[:set_error]])
|
251
|
-
end
|
257
|
+
_add_set_error(tags)
|
252
258
|
end
|
253
|
-
|
254
|
-
|
259
|
+
|
260
|
+
tags.unshift(set_label) if @opts[:set_label]
|
261
|
+
|
255
262
|
tags
|
256
263
|
end
|
257
264
|
|
265
|
+
def set_label
|
266
|
+
form._tag(:span, {:class=>:label}, @opts[:set_label])
|
267
|
+
end
|
268
|
+
|
269
|
+
def _add_set_error(tags)
|
270
|
+
if (last_input = tags.last) && last_input.is_a?(Input)
|
271
|
+
last_input.opts[:error] = @opts[:set_error]
|
272
|
+
else
|
273
|
+
tags << form._tag(:span, {:class=>'error_message'}, [@opts[:set_error]])
|
274
|
+
end
|
275
|
+
end
|
276
|
+
|
258
277
|
# Formats a textarea. Respects the following options:
|
259
278
|
# :value :: Sets value as the child of the textarea.
|
260
279
|
def format_textarea
|
@@ -315,7 +334,7 @@ module Forme
|
|
315
334
|
unless @attr[:id] || @attr['id']
|
316
335
|
id = namespaced_id(key)
|
317
336
|
if suffix = @opts[:key_id]
|
318
|
-
id
|
337
|
+
id += "_#{suffix}"
|
319
338
|
end
|
320
339
|
@attr[:id] = id
|
321
340
|
end
|
@@ -503,6 +522,11 @@ module Forme
|
|
503
522
|
tag(:span, {}, children)
|
504
523
|
end
|
505
524
|
|
525
|
+
# Ignore submit buttons
|
526
|
+
def format_submit
|
527
|
+
''
|
528
|
+
end
|
529
|
+
|
506
530
|
# Use a span with text instead of a text area.
|
507
531
|
def format_textarea
|
508
532
|
tag(:span, {}, @attr[:value])
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen-string-literal: true
|
2
|
+
|
1
3
|
module Forme
|
2
4
|
# Default wrapper doesn't wrap input in any tag
|
3
5
|
class Wrapper
|
@@ -25,7 +27,7 @@ module Forme
|
|
25
27
|
Forme.register_transformer(:wrapper, x, new(x))
|
26
28
|
end
|
27
29
|
end
|
28
|
-
|
30
|
+
|
29
31
|
class Wrapper::TableRow < Wrapper
|
30
32
|
# Wrap the input in tr and td tags.
|
31
33
|
def call(tag, input)
|
data/lib/forme/version.rb
CHANGED
data/lib/roda/plugins/forme.rb
CHANGED
data/lib/sequel/plugins/forme.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen-string-literal: true
|
2
|
+
|
1
3
|
require 'forme'
|
2
4
|
require 'thread'
|
3
5
|
|
@@ -198,7 +200,7 @@ module Sequel # :nodoc:
|
|
198
200
|
# is required.
|
199
201
|
def handle_label(f)
|
200
202
|
opts[:label] = humanize(field) unless opts.has_key?(:label)
|
201
|
-
opts[:label] = [opts[:label], form._tag(:abbr, {:title=>'required'}, '*')] if opts[:required]
|
203
|
+
opts[:label] = [opts[:label], form._tag(:abbr, {:title=>'required'}, '*')] if opts[:label] && opts[:required]
|
202
204
|
end
|
203
205
|
|
204
206
|
# Update the attributes and options for any recognized validations
|
@@ -301,7 +303,9 @@ module Sequel # :nodoc:
|
|
301
303
|
opts[:array] = true unless opts.has_key?(:array)
|
302
304
|
opts[:key] = field
|
303
305
|
end
|
304
|
-
|
306
|
+
unless opts.has_key?(:value)
|
307
|
+
opts[:value] = obj.respond_to?(field) ? obj.send(field) : obj.send(ref[:name]).map{|x| x.send(pk)}
|
308
|
+
end
|
305
309
|
opts[:options] = association_select_options(ref) unless opts.has_key?(:options)
|
306
310
|
handle_label(label)
|
307
311
|
if opts.delete(:as) == :checkbox
|
@@ -0,0 +1,358 @@
|
|
1
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper.rb')
|
2
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), 'sequel_helper.rb')
|
3
|
+
require 'forme/bs3'
|
4
|
+
|
5
|
+
describe "Forme Bootstrap3 (BS3) forms" do
|
6
|
+
def sel(opts, s)
|
7
|
+
opts.map{|o| "<option #{'selected="selected" ' if o == s}value=\"#{o}\">#{sprintf("%02i", o)}</option>"}.join
|
8
|
+
end
|
9
|
+
|
10
|
+
before do
|
11
|
+
@f = Forme::Form.new(:config=>:bs3)
|
12
|
+
@ab = Album[1]
|
13
|
+
@b = Forme::Form.new(@ab, :config=>:bs3)
|
14
|
+
@ac = Album[2]
|
15
|
+
@c = Forme::Form.new(@ac, :config=>:bs3)
|
16
|
+
end
|
17
|
+
|
18
|
+
describe 'input[:text]' do
|
19
|
+
it "should create a simple input[:text] tag" do
|
20
|
+
@f.input(:text).to_s.must_equal '<div class="form-group"><input class="form-control" type="text"/></div>'
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should create an input[:text] tag with a label when ':label => Name'" do
|
24
|
+
@f.input(:text, :label=>"Name").to_s.must_equal '<div class="form-group"><label>Name</label> <input class="form-control" type="text"/></div>'
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should create an input[:text] tag with a label when ':class => bar'" do
|
28
|
+
@f.input(:text, :label=>"Name", :class=>'bar').to_s.must_equal '<div class="form-group"><label>Name</label> <input class="form-control bar" type="text"/></div>'
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should create an input[:text] tag with a label when ':id => bar'" do
|
32
|
+
@f.input(:text, :label=>"Name", :id=>'bar').to_s.must_equal '<div class="form-group"><label for="bar">Name</label> <input class="form-control" id="bar" type="text"/></div>'
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should create an input[:text] tag with a label when ':id => bar' with an error" do
|
36
|
+
@f.input(:text, :label=>"Name", :id=>'bar', :class=>'foo', :error=>'input-text-error').to_s.must_equal '<div class="form-group has-error"><label for="bar">Name</label> <input class="form-control foo" id="bar" type="text"/><span class="help-block with-errors">input-text-error</span></div>'
|
37
|
+
end
|
38
|
+
|
39
|
+
describe 'from a Sequel model' do
|
40
|
+
it "should create a correct input[:text] tag from Sequel model" do
|
41
|
+
@c.input(:name).to_s.must_equal '<div class="form-group string"><label for="album_name">Name</label> <input class="form-control" id="album_name" name="album[name]" type="text" value="c"/></div>'
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should correctly handle an input[:text] tag from Sequel model with error" do
|
45
|
+
@ac.errors.add(:name, 'name not valid')
|
46
|
+
@c.input(:name).to_s.must_equal '<div class="form-group has-error string"><label for="album_name">Name</label> <input class="form-control" id="album_name" name="album[name]" type="text" value="c"/><span class="help-block with-errors">name not valid</span></div>'
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe 'input[:password]' do
|
52
|
+
it "should create a simple input[:password] tag" do
|
53
|
+
@f.input(:password).to_s.must_equal '<div class="form-group"><input class="form-control" type="password"/></div>'
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should create an input[:password] tag with a label when ':label => Name'" do
|
57
|
+
@f.input(:password, :label=>"Name").to_s.must_equal '<div class="form-group"><label>Name</label> <input class="form-control" type="password"/></div>'
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should create an input[:password] tag with a label when ':class => bar'" do
|
61
|
+
@f.input(:password, :label=>"Name", :class=>'bar').to_s.must_equal '<div class="form-group"><label>Name</label> <input class="form-control bar" type="password"/></div>'
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should create an input[:password] tag with a label when ':id => bar'" do
|
65
|
+
@f.input(:password, :label=>"Name", :id=>'bar').to_s.must_equal '<div class="form-group"><label for="bar">Name</label> <input class="form-control" id="bar" type="password"/></div>'
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should create an input[:password] tag with a label when ':id => bar' with an error" do
|
69
|
+
@f.input(:password, :label=>"Name", :id=>'bar', :class=>'foo', :error=>'input-password-error').to_s.must_equal '<div class="form-group has-error"><label for="bar">Name</label> <input class="form-control foo" id="bar" type="password"/><span class="help-block with-errors">input-password-error</span></div>'
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
describe 'input[:email]' do
|
74
|
+
it "should create a simple input[:email] tag" do
|
75
|
+
@f.input(:email).to_s.must_equal '<div class="form-group"><input class="form-control" type="email"/></div>'
|
76
|
+
end
|
77
|
+
|
78
|
+
it "should create an input[:email] tag with a label when ':label => Name'" do
|
79
|
+
@f.input(:email, :label=>"Name").to_s.must_equal '<div class="form-group"><label>Name</label> <input class="form-control" type="email"/></div>'
|
80
|
+
end
|
81
|
+
|
82
|
+
it "should create an input[:email] tag with a label when ':class => bar'" do
|
83
|
+
@f.input(:email, :label=>"Name", :class=>'bar').to_s.must_equal '<div class="form-group"><label>Name</label> <input class="form-control bar" type="email"/></div>'
|
84
|
+
end
|
85
|
+
|
86
|
+
it "should create an input[:email] tag with a label when ':id => bar'" do
|
87
|
+
@f.input(:email, :label=>"Name", :id=>'bar').to_s.must_equal '<div class="form-group"><label for="bar">Name</label> <input class="form-control" id="bar" type="email"/></div>'
|
88
|
+
end
|
89
|
+
|
90
|
+
it "should create an input[:email] tag with a label when ':id => bar' with an error" do
|
91
|
+
@f.input(:email, :label=>"Name", :id=>'bar', :class=>'foo', :error=>'input-email-error').to_s.must_equal '<div class="form-group has-error"><label for="bar">Name</label> <input class="form-control foo" id="bar" type="email"/><span class="help-block with-errors">input-email-error</span></div>'
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
describe 'input[:file]' do
|
96
|
+
it "should create a simple input[:file] tag" do
|
97
|
+
@f.input(:file).to_s.must_equal '<div class="form-group"><input type="file"/></div>'
|
98
|
+
end
|
99
|
+
|
100
|
+
it "should create an input[:file] tag with a label when ':label => Name'" do
|
101
|
+
@f.input(:file, :label=>"Name").to_s.must_equal '<div class="form-group"><label>Name</label> <input type="file"/></div>'
|
102
|
+
end
|
103
|
+
|
104
|
+
it "should create an input[:file] tag with a label when ':class => bar'" do
|
105
|
+
@f.input(:file, :label=>"Name", :class=>'bar').to_s.must_equal '<div class="form-group"><label>Name</label> <input class="bar" type="file"/></div>'
|
106
|
+
end
|
107
|
+
|
108
|
+
it "should create an input[:file] tag with a label when ':id => bar'" do
|
109
|
+
@f.input(:file, :label=>"Name", :id=>'bar').to_s.must_equal '<div class="form-group"><label for="bar">Name</label> <input id="bar" type="file"/></div>'
|
110
|
+
end
|
111
|
+
|
112
|
+
it "should create an input[:file] tag with a label when ':id => bar' with an error" do
|
113
|
+
@f.input(:file, :label=>"Name", :id=>'bar', :class=>'foo', :error=>'input-file-error').to_s.must_equal '<div class="form-group has-error"><label for="bar">Name</label> <input class="foo" id="bar" type="file"/><span class="help-block with-errors">input-file-error</span></div>'
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
describe 'input[:submit]' do
|
118
|
+
it "should create a simple input[:submit] tag" do
|
119
|
+
@f.input(:submit).to_s.must_equal '<input class="btn btn-default" type="submit"/>'
|
120
|
+
end
|
121
|
+
|
122
|
+
it "should create an input[:submit] tag with the correct value" do
|
123
|
+
@f.input(:submit, :value=>'Save').to_s.must_equal '<input class="btn btn-default" type="submit" value="Save"/>'
|
124
|
+
end
|
125
|
+
|
126
|
+
it "should create an input[:submit] tag with the correct class" do
|
127
|
+
@f.input(:submit, :value=>'Save', :class=>'btn-primary').to_s.must_equal '<input class="btn btn-primary" type="submit" value="Save"/>'
|
128
|
+
end
|
129
|
+
|
130
|
+
it "should create an input[:submit] tag with the correct id" do
|
131
|
+
@f.input(:submit, :value=>'Save', :id=>'foo').to_s.must_equal '<input class="btn btn-default" id="foo" type="submit" value="Save"/>'
|
132
|
+
end
|
133
|
+
|
134
|
+
it "should create an input[:submit] tag without error message " do
|
135
|
+
@f.input(:submit, :value=>'Save', :id=>'foo', :error=>'error-message').to_s.must_equal '<input class="btn btn-default" id="foo" type="submit" value="Save"/>'
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
describe 'input[:reset]' do
|
140
|
+
it "should create a simple input[:reset] tag" do
|
141
|
+
@f.input(:reset).to_s.must_equal '<input class="btn btn-default" type="reset"/>'
|
142
|
+
end
|
143
|
+
|
144
|
+
it "should create an input[:reset] tag with the correct value" do
|
145
|
+
@f.input(:reset, :value=>'Save').to_s.must_equal '<input class="btn btn-default" type="reset" value="Save"/>'
|
146
|
+
end
|
147
|
+
|
148
|
+
it "should create an input[:reset] tag with the correct class" do
|
149
|
+
@f.input(:reset, :value=>'Save', :class=>'btn-primary').to_s.must_equal '<input class="btn btn-primary" type="reset" value="Save"/>'
|
150
|
+
end
|
151
|
+
|
152
|
+
it "should create an input[:reset] tag with the correct id" do
|
153
|
+
@f.input(:reset, :value=>'Save', :id=>'foo').to_s.must_equal '<input class="btn btn-default" id="foo" type="reset" value="Save"/>'
|
154
|
+
end
|
155
|
+
|
156
|
+
it "should create an input[:reset] tag without error message " do
|
157
|
+
@f.input(:reset, :value=>'Save', :id=>'foo', :error=>'error-message').to_s.must_equal '<input class="btn btn-default" id="foo" type="reset" value="Save"/>'
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
describe 'textarea' do
|
162
|
+
it "should create a simple :textarea tag" do
|
163
|
+
@f.input(:textarea).to_s.must_equal '<div class="form-group"><textarea class="form-control"></textarea></div>'
|
164
|
+
end
|
165
|
+
|
166
|
+
it "should create an :textarea tag with the correct value" do
|
167
|
+
@f.input(:textarea, :value=>'Bio').to_s.must_equal '<div class="form-group"><textarea class="form-control">Bio</textarea></div>'
|
168
|
+
end
|
169
|
+
|
170
|
+
it "should create an :textarea tag with the correct class" do
|
171
|
+
@f.input(:textarea, :class=>'foo').to_s.must_equal '<div class="form-group"><textarea class="form-control foo"></textarea></div>'
|
172
|
+
end
|
173
|
+
|
174
|
+
it "should create an :textarea tag with the correct id" do
|
175
|
+
@f.input(:textarea, :id=>'bar').to_s.must_equal '<div class="form-group"><textarea class="form-control" id="bar"></textarea></div>'
|
176
|
+
end
|
177
|
+
|
178
|
+
it "should create a textarea tag without a .has-error and error message span when ':skip_error => true'" do
|
179
|
+
@f.input(:textarea, :skip_error=>true).to_s.must_equal '<div class="form-group"><textarea class="form-control"></textarea></div>'
|
180
|
+
end
|
181
|
+
|
182
|
+
it "should create a textarea tag with .has-error and error message when ':error => is-a-string'" do
|
183
|
+
@f.input(:textarea, :error=>'input-textarea-error').to_s.must_equal '<div class="form-group has-error"><textarea class="form-control"></textarea><span class="help-block with-errors">input-textarea-error</span></div>'
|
184
|
+
end
|
185
|
+
|
186
|
+
describe 'from a Sequel model' do
|
187
|
+
it "should create a correct input[:text] tag from Sequel model" do
|
188
|
+
@c.input(:name, :as=>:textarea).to_s.must_equal '<div class="form-group string"><label for="album_name">Name</label> <textarea class="form-control" id="album_name" name="album[name]">c</textarea></div>'
|
189
|
+
end
|
190
|
+
|
191
|
+
it "should correctly handle an input[:text] tag from Sequel model with error" do
|
192
|
+
@ac.errors.add(:name, 'name not valid')
|
193
|
+
@c.input(:name, :as=>:textarea).to_s.must_equal '<div class="form-group has-error string"><label for="album_name">Name</label> <textarea class="form-control" id="album_name" name="album[name]">c</textarea><span class="help-block with-errors">name not valid</span></div>'
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
describe 'select' do
|
199
|
+
it "should create a simple :select tag" do
|
200
|
+
@f.input(:select).to_s.must_equal '<div class="form-group"><select class="form-control"></select></div>'
|
201
|
+
end
|
202
|
+
|
203
|
+
it "should create a simple :select tag with options" do
|
204
|
+
@f.input(:select, :options=>[[:a, 1], [:b,2]]).to_s.must_equal '<div class="form-group"><select class="form-control"><option value="1">a</option><option value="2">b</option></select></div>'
|
205
|
+
end
|
206
|
+
|
207
|
+
it "should create a simple :select tag with options and the correct value" do
|
208
|
+
@f.input(:select, :options=>[[:a, 1], [:b,2]], :value=>2).to_s.must_equal '<div class="form-group"><select class="form-control"><option value="1">a</option><option selected="selected" value="2">b</option></select></div>'
|
209
|
+
end
|
210
|
+
|
211
|
+
it "should support :add_blank option for select inputs" do
|
212
|
+
@f.input(:select, :options=>[[:a, 1], [:b, 2]], :add_blank=>true, :value=>1).to_s.must_equal '<div class="form-group"><select class="form-control"><option value=""></option><option selected="selected" value="1">a</option><option value="2">b</option></select></div>'
|
213
|
+
end
|
214
|
+
|
215
|
+
it "should create an :select tag with the correct class" do
|
216
|
+
@f.input(:select, :class=>'foo').to_s.must_equal '<div class="form-group"><select class="form-control foo"></select></div>'
|
217
|
+
end
|
218
|
+
|
219
|
+
it "should create an :select tag with the correct id" do
|
220
|
+
@f.input(:select, :id=>'bar').to_s.must_equal '<div class="form-group"><select class="form-control" id="bar"></select></div>'
|
221
|
+
end
|
222
|
+
|
223
|
+
it "should create a select tag without .has-error and error message span when ':skip_error => true'" do
|
224
|
+
@f.input(:select, :skip_error=>true).to_s.must_equal '<div class="form-group"><select class="form-control"></select></div>'
|
225
|
+
end
|
226
|
+
|
227
|
+
it "should create a select tag with .has-error and error message when ':error => is-a-string'" do
|
228
|
+
@f.input(:select, :error=>'input-select-error').to_s.must_equal '<div class="form-group has-error"><select class="form-control"></select><span class="help-block with-errors">input-select-error</span></div>'
|
229
|
+
end
|
230
|
+
|
231
|
+
it "should correctly handle a Sequel model output :as => :select" do
|
232
|
+
@b.input(:artist, :as=>:select).to_s.must_equal '<div class="form-group many_to_one"><label for="album_artist_id">Artist</label> <select class="form-control" id="album_artist_id" name="album[artist_id]"><option value=""></option><option selected="selected" value="1">a</option><option value="2">d</option></select></div>'
|
233
|
+
end
|
234
|
+
|
235
|
+
it "should correctly handle a Sequel model output :as => :select with error" do
|
236
|
+
@ac.errors.add(:artist, 'error message')
|
237
|
+
@c.input(:artist, :as=>:select).to_s.must_equal '<div class="form-group has-error many_to_one"><label for="album_artist_id">Artist</label> <select class="form-control" id="album_artist_id" name="album[artist_id]"><option value=""></option><option value="1">a</option><option selected="selected" value="2">d</option></select><span class="help-block with-errors">error message</span></div>'
|
238
|
+
end
|
239
|
+
|
240
|
+
describe 'from a Sequel model' do
|
241
|
+
it "should correctly handle a boolean attribute from a Sequel model" do
|
242
|
+
@c.input(:gold).to_s.must_equal '<div class="boolean form-group"><label for="album_gold">Gold</label> <select class="form-control" id="album_gold" name="album[gold]"><option value=""></option><option selected="selected" value="t">True</option><option value="f">False</option></select></div>'
|
243
|
+
end
|
244
|
+
|
245
|
+
it "should correctly handle a boolean attribute from a Sequel model with an error" do
|
246
|
+
@ac.errors.add(:gold, 'error message')
|
247
|
+
@c.input(:gold).to_s.must_equal '<div class="boolean form-group has-error"><label for="album_gold">Gold</label> <select class="form-control" id="album_gold" name="album[gold]"><option value=""></option><option selected="selected" value="t">True</option><option value="f">False</option></select><span class="help-block with-errors">error message</span></div>'
|
248
|
+
end
|
249
|
+
end
|
250
|
+
end
|
251
|
+
|
252
|
+
describe 'input[:checkbox]' do
|
253
|
+
it "should create a simple input[:checkbox] tag" do
|
254
|
+
@f.input(:checkbox).to_s.must_equal '<div class="checkbox"><input type="checkbox"/></div>'
|
255
|
+
end
|
256
|
+
|
257
|
+
it "should create an input[:checkbox] tag with a label when ':label => Gold'" do
|
258
|
+
@f.input(:checkbox, :label=>"Gold").to_s.must_equal '<div class="checkbox"><label><input type="checkbox"/> Gold</label></div>'
|
259
|
+
end
|
260
|
+
|
261
|
+
it "should create an input[:checkbox] tag with a label when ':class => bar'" do
|
262
|
+
@f.input(:checkbox, :label=>"Gold", :class=>'bar').to_s.must_equal '<div class="checkbox"><label><input class="bar" type="checkbox"/> Gold</label></div>'
|
263
|
+
end
|
264
|
+
|
265
|
+
it "should create an input[:checkbox] tag with a label when ':id => bar'" do
|
266
|
+
@f.input(:checkbox, :label=>"Gold", :id=>'bar').to_s.must_equal '<div class="checkbox"><label for="bar"><input id="bar" type="checkbox"/> Gold</label></div>'
|
267
|
+
end
|
268
|
+
|
269
|
+
it "should create an input[:checkbox] tag with a label when ':id => bar' with an error" do
|
270
|
+
@f.input(:checkbox, :label=>"Gold", :id=>'bar', :class=>'foo', :error=>'input-checkbox-error').to_s.must_equal '<div class="has-error"><div class="checkbox"><label for="bar"><input class="foo" id="bar" type="checkbox"/> Gold</label></div><span class="help-block with-errors">input-checkbox-error</span></div>'
|
271
|
+
end
|
272
|
+
|
273
|
+
describe 'from a Sequel model' do
|
274
|
+
it "should correctly handle a boolean attribute ':as=>:checkbox'" do
|
275
|
+
@c.input(:gold, :as=>:checkbox).to_s.must_equal '<div class="boolean checkbox"><label for="album_gold"><input id="album_gold_hidden" name="album[gold]" type="hidden" value="f"/><input checked="checked" id="album_gold" name="album[gold]" type="checkbox" value="t"/> Gold</label></div>'
|
276
|
+
end
|
277
|
+
|
278
|
+
it "should correctly handle a boolean attribute ':as=>:checkbox' with an error" do
|
279
|
+
@ac.errors.add(:gold, 'error message')
|
280
|
+
@c.input(:gold, :as=>:checkbox).to_s.must_equal '<div class="boolean has-error"><div class="checkbox"><label for="album_gold"><input id="album_gold_hidden" name="album[gold]" type="hidden" value="f"/><input checked="checked" id="album_gold" name="album[gold]" type="checkbox" value="t"/> Gold</label></div><span class="help-block with-errors">error message</span></div>'
|
281
|
+
end
|
282
|
+
end
|
283
|
+
end
|
284
|
+
|
285
|
+
|
286
|
+
describe 'input[:radio]' do
|
287
|
+
it "should create a simple input[:radio] tag" do
|
288
|
+
@f.input(:radio).to_s.must_equal '<div class="radio"><input type="radio"/></div>'
|
289
|
+
end
|
290
|
+
|
291
|
+
it "should create an input[:radio] tag with a label when ':label => Gold'" do
|
292
|
+
@f.input(:radio, :label=>"Gold").to_s.must_equal '<div class="radio"><label><input type="radio"/> Gold</label></div>'
|
293
|
+
end
|
294
|
+
|
295
|
+
it "should create an input[:radio] tag with a label when ':class => bar'" do
|
296
|
+
@f.input(:radio, :label=>"Gold", :class=>'bar').to_s.must_equal '<div class="radio"><label><input class="bar" type="radio"/> Gold</label></div>'
|
297
|
+
end
|
298
|
+
|
299
|
+
it "should create an input[:radio] tag with a label when ':id => bar'" do
|
300
|
+
@f.input(:radio, :label=>"Gold", :id=>'bar').to_s.must_equal '<div class="radio"><label for="bar"><input id="bar" type="radio"/> Gold</label></div>'
|
301
|
+
end
|
302
|
+
|
303
|
+
it "should create an input[:radio] tag with a label when ':id => bar' with an error" do
|
304
|
+
@f.input(:radio, :label=>"Gold", :id=>'bar', :class=>'foo', :error=>'input-radio-error').to_s.must_equal '<div class="has-error"><div class="radio"><label for="bar"><input class="foo" id="bar" type="radio"/> Gold</label></div><span class="help-block with-errors">input-radio-error</span></div>'
|
305
|
+
end
|
306
|
+
|
307
|
+
describe 'from a Sequel model' do
|
308
|
+
it "should correctly handle a boolean attribute ':as=>:radio'" do
|
309
|
+
@c.input(:gold, :as=>:radio).to_s.must_equal '<div class="boolean radioset"><label>Gold</label><div class="radio"><label class="option" for="album_gold_yes"><input checked="checked" id="album_gold_yes" name="album[gold]" type="radio" value="t"/> Yes</label></div><div class="radio"><label class="option" for="album_gold_no"><input id="album_gold_no" name="album[gold]" type="radio" value="f"/> No</label></div></div>'
|
310
|
+
end
|
311
|
+
|
312
|
+
it "should correctly handle a boolean attribute ':as=>:radio' with an error" do
|
313
|
+
@ac.errors.add(:gold, 'error message')
|
314
|
+
@c.input(:gold, :as=>:radio).to_s.must_equal '<div class="boolean radioset has-error"><label>Gold</label><div class="radio"><label class="option" for="album_gold_yes"><input checked="checked" id="album_gold_yes" name="album[gold]" type="radio" value="t"/> Yes</label></div><div class="radio"><label class="option" for="album_gold_no"><input id="album_gold_no" name="album[gold]" type="radio" value="f"/> No</label></div><span class="help-block with-errors">error message</span></div>'
|
315
|
+
end
|
316
|
+
end
|
317
|
+
end
|
318
|
+
|
319
|
+
|
320
|
+
it "should correctly handle a :checkboxset tag" do
|
321
|
+
@f.input(:checkboxset, :options=>[[:a, 1], [:b,2]]).to_s.must_equal '<div class="checkboxset"><div class="checkbox"><label class="option"><input type="checkbox" value="1"/> a</label></div><div class="checkbox"><label class="option"><input type="checkbox" value="2"/> b</label></div></div>'
|
322
|
+
end
|
323
|
+
|
324
|
+
it "should correctly handle a :checkboxset tag without options" do
|
325
|
+
@f.input(:checkboxset, :options=>[]).to_s.must_equal '<div class="checkboxset"></div>'
|
326
|
+
end
|
327
|
+
|
328
|
+
it "should correctly handle a :checkboxset tag with an error - Alternative A: (see BS3 HTML reference)" do
|
329
|
+
@f.input(:checkboxset, :options=>[[:a, 1], [:b,2]], :error=>'error message').to_s.must_equal '<div class="checkboxset has-error"><div class="checkbox"><label class="option"><input type="checkbox" value="1"/> a</label></div><div class="checkbox"><label class="option"><input type="checkbox" value="2"/> b</label></div><span class="help-block with-errors">error message</span></div>'
|
330
|
+
end
|
331
|
+
|
332
|
+
it "should correctly handle a :checkboxset tag with an error and label - Alternative A: (see BS3 HTML reference)" do
|
333
|
+
@f.input(:checkboxset, :options=>[[:a, 1], [:b,2]], :error=>'error message', :label=>'CheckboxSet').to_s.must_equal '<div class="checkboxset has-error"><label>CheckboxSet</label><div class="checkbox"><label class="option"><input type="checkbox" value="1"/> a</label></div><div class="checkbox"><label class="option"><input type="checkbox" value="2"/> b</label></div><span class="help-block with-errors">error message</span></div>'
|
334
|
+
end
|
335
|
+
|
336
|
+
it "should correctly handle a :radioset tag" do
|
337
|
+
@f.input(:radioset, :options=>[[:a, 1], [:b,2]]).to_s.must_equal '<div class="radioset"><div class="radio"><label class="option"><input type="radio" value="1"/> a</label></div><div class="radio"><label class="option"><input type="radio" value="2"/> b</label></div></div>'
|
338
|
+
end
|
339
|
+
|
340
|
+
it "should correctly handle a :radioset tag without options" do
|
341
|
+
@f.input(:radioset, :options=>[]).to_s.must_equal '<div class="radioset"></div>'
|
342
|
+
end
|
343
|
+
|
344
|
+
it "should correctly handle a :radioset tag with an error - Alternative A: (see BS3 HTML reference)" do
|
345
|
+
@f.input(:radioset, :options=>[[:a, 1], [:b,2]], :error=>'error message').to_s.must_equal '<div class="radioset has-error"><div class="radio"><label class="option"><input type="radio" value="1"/> a</label></div><div class="radio"><label class="option"><input type="radio" value="2"/> b</label></div><span class="help-block with-errors">error message</span></div>'
|
346
|
+
end
|
347
|
+
|
348
|
+
it "should correctly handle a :radioset tag with an error and label - Alternative A: (see BS3 HTML reference)" do
|
349
|
+
@f.input(:radioset, :options=>[[:a, 1], [:b,2]], :error=>'error message', :label=>'RadioSet').to_s.must_equal '<div class="radioset has-error"><label>RadioSet</label><div class="radio"><label class="option"><input type="radio" value="1"/> a</label></div><div class="radio"><label class="option"><input type="radio" value="2"/> b</label></div><span class="help-block with-errors">error message</span></div>'
|
350
|
+
end
|
351
|
+
|
352
|
+
it "should use a set of radio buttons for many_to_one associations with :as=>:radio option" do
|
353
|
+
@b.input(:artist, :as=>:radio).to_s.must_equal '<div class="many_to_one radioset"><label>Artist</label><div class="radio"><label class="option" for="album_artist_id_1"><input checked="checked" id="album_artist_id_1" name="album[artist_id]" type="radio" value="1"/> a</label></div><div class="radio"><label class="option" for="album_artist_id_2"><input id="album_artist_id_2" name="album[artist_id]" type="radio" value="2"/> d</label></div></div>'
|
354
|
+
@b.input(:artist, :as=>:radio, :wrapper=>nil).to_s.must_equal '<label>Artist</label><div class="radio"><label class="option" for="album_artist_id_1"><input checked="checked" id="album_artist_id_1" name="album[artist_id]" type="radio" value="1"/> a</label></div><div class="radio"><label class="option" for="album_artist_id_2"><input id="album_artist_id_2" name="album[artist_id]" type="radio" value="2"/> d</label></div>'
|
355
|
+
@c.input(:artist, :as=>:radio).to_s.must_equal '<div class="many_to_one radioset"><label>Artist</label><div class="radio"><label class="option" for="album_artist_id_1"><input id="album_artist_id_1" name="album[artist_id]" type="radio" value="1"/> a</label></div><div class="radio"><label class="option" for="album_artist_id_2"><input checked="checked" id="album_artist_id_2" name="album[artist_id]" type="radio" value="2"/> d</label></div></div>'
|
356
|
+
@c.input(:artist, :as=>:radio, :wrapper=>:div).to_s.must_equal '<div class="many_to_one radioset"><label>Artist</label><div class="radio"><label class="option" for="album_artist_id_1"><input id="album_artist_id_1" name="album[artist_id]" type="radio" value="1"/> a</label></div><div class="radio"><label class="option" for="album_artist_id_2"><input checked="checked" id="album_artist_id_2" name="album[artist_id]" type="radio" value="2"/> d</label></div></div>'
|
357
|
+
end
|
358
|
+
end
|