sinatra_more 0.2.2 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.rdoc +13 -0
- data/VERSION +1 -1
- data/lib/sinatra_more/markup_plugin/form_builder/abstract_form_builder.rb +8 -1
- data/lib/sinatra_more/markup_plugin/form_builder/standard_form_builder.rb +6 -4
- data/lib/sinatra_more/markup_plugin/form_helpers.rb +13 -1
- data/sinatra_more.gemspec +1 -1
- data/test/fixtures/markup_app/views/form_for.erb +7 -0
- data/test/fixtures/markup_app/views/form_for.haml +7 -1
- data/test/markup_plugin/test_form_builder.rb +95 -1
- data/test/markup_plugin/test_form_helpers.rb +2 -1
- metadata +1 -1
data/README.rdoc
CHANGED
@@ -231,6 +231,10 @@ The following are fields provided by AbstractFormBuilder that can be used within
|
|
231
231
|
* <tt>f.password_field :secret, :class => 'long'</tt>
|
232
232
|
* <tt>file_field(field, options={})</tt>
|
233
233
|
* <tt>f.file_field :photo, :class => 'long'</tt>
|
234
|
+
* <tt>select(field, options={})</tt>
|
235
|
+
* <tt>f.select(:state, :options => ['California', 'Texas', 'Wyoming'])</tt>
|
236
|
+
* <tt>f.select(:state, :collection => @states, :fields => [:name, :id])</tt>
|
237
|
+
* <tt>f.select(:state, :options => [...], :include_blank => true)</tt>
|
234
238
|
* <tt>submit(caption, options={})</tt>
|
235
239
|
* <tt>f.submit "Update", :class => 'long'</tt>
|
236
240
|
* <tt>image_submit(source, options={})</tt>
|
@@ -252,6 +256,9 @@ A form_for using these basic fields might look like:
|
|
252
256
|
%p
|
253
257
|
= f.label :is_admin, :caption => "Admin User?"
|
254
258
|
= f.check_box :is_admin
|
259
|
+
$p
|
260
|
+
= f.label :color, :caption => "Favorite Color?"
|
261
|
+
= f.select :color, :options => ['red', 'black']
|
255
262
|
%p
|
256
263
|
= f.submit "Create", :class => 'button'
|
257
264
|
|
@@ -265,6 +272,10 @@ There is also a StandardFormBuilder which builds on the abstract fields that can
|
|
265
272
|
* <tt>password_field_block(:code, :class => 'big')</tt>
|
266
273
|
* <tt>file_field_block(field, options={}, label_options={})</tt>
|
267
274
|
* <tt>file_field_block(:photo, :class => 'big')</tt>
|
275
|
+
* <tt>check_box_block(field, options={}, label_options={})</tt>
|
276
|
+
* <tt>check_box_block(:remember_me, :class => 'big')</tt>
|
277
|
+
* <tt>select_block(field, options={}, label_options={})</tt>
|
278
|
+
* <tt>select_block(:country, :option => ['USA', 'Canada'])</tt>
|
268
279
|
* <tt>submit_block(caption, options={})</tt>
|
269
280
|
* <tt>submit_block(:username, :class => 'big')</tt>
|
270
281
|
* <tt>image_submit_block(source, options={})</tt>
|
@@ -276,6 +287,8 @@ A form_for using these standard fields might look like:
|
|
276
287
|
= f.error_messages
|
277
288
|
= f.text_field_block :name, :caption => "Full name"
|
278
289
|
= f.text_field_block :email
|
290
|
+
= f.check_box_block :remember_me
|
291
|
+
= f.select_block :fav_color, :options => ['red', 'blue']
|
279
292
|
= f.password_field_block :password
|
280
293
|
= f.submit_block "Create", :class => 'button'
|
281
294
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.3
|
@@ -43,6 +43,13 @@ class AbstractFormBuilder
|
|
43
43
|
@template.password_field_tag field_name(field), options
|
44
44
|
end
|
45
45
|
|
46
|
+
# f.select :color, :options => ['red', 'green'], :include_blank => true
|
47
|
+
# f.select :color, :collection => @colors, :fields => [:name, :id]
|
48
|
+
def select(field, options={})
|
49
|
+
options.reverse_merge!(:id => field_id(field), :selected => field_value(field))
|
50
|
+
@template.select_tag field_name(field), options
|
51
|
+
end
|
52
|
+
|
46
53
|
# f.check_box :remember_me, :value => 'true', :uncheck_value => '0'
|
47
54
|
def check_box(field, options={})
|
48
55
|
unchecked_value = options.delete(:uncheck_value) || '0'
|
@@ -79,7 +86,7 @@ class AbstractFormBuilder
|
|
79
86
|
|
80
87
|
# Returns the known field types for a formbuilder
|
81
88
|
def self.field_types
|
82
|
-
[:text_field, :text_area, :password_field, :file_field, :
|
89
|
+
[:hidden_field, :text_field, :text_area, :password_field, :file_field, :radio_button, :check_box, :select]
|
83
90
|
end
|
84
91
|
|
85
92
|
# Returns the object's models name
|
@@ -1,10 +1,12 @@
|
|
1
1
|
class StandardFormBuilder < AbstractFormBuilder
|
2
2
|
|
3
3
|
# text_field_block(:username, { :class => 'long' }, { :class => 'wide-label' })
|
4
|
-
# text_area_block(:
|
5
|
-
# password_field_block(:
|
6
|
-
# file_field_block(:
|
7
|
-
(
|
4
|
+
# text_area_block(:summary, { :class => 'long' }, { :class => 'wide-label' })
|
5
|
+
# password_field_block(:password, { :class => 'long' }, { :class => 'wide-label' })
|
6
|
+
# file_field_block(:photo, { :class => 'long' }, { :class => 'wide-label' })
|
7
|
+
# check_box_block(:remember_me, { :class => 'long' }, { :class => 'wide-label' })
|
8
|
+
# select_block(:color, :options => ['green', 'black'])
|
9
|
+
(self.field_types - [ :hidden_field, :radio_button ]).each do |field_type|
|
8
10
|
class_eval <<-EOF
|
9
11
|
def #{field_type}_block(field, options={}, label_options={})
|
10
12
|
label_options.reverse_merge!(:caption => options.delete(:caption)) if options[:caption]
|
@@ -86,8 +86,12 @@ module SinatraMore
|
|
86
86
|
# options = [['caption', 'value'], ['Green', 'green1'], ['Blue', 'blue1'], ['Black', "black1"]]
|
87
87
|
# options = ['option', 'red', 'yellow' ]
|
88
88
|
# select_tag(:favorite_color, :options => ['red', 'yellow'], :selected => 'green1')
|
89
|
+
# select_tag(:country, :collection => @countries, :fields => [:name, :code])
|
89
90
|
def select_tag(name, options={})
|
90
91
|
options.reverse_merge!(:name => name)
|
92
|
+
collection, fields = options.delete(:collection), options.delete(:fields)
|
93
|
+
options[:options] = options_from_collection(collection, fields) if collection
|
94
|
+
options[:options].unshift('') if options.delete(:include_blank)
|
91
95
|
select_options_html = options_for_select(options.delete(:options), options.delete(:selected))
|
92
96
|
options.merge!(:name => "#{options[:name]}[]") if options[:multiple]
|
93
97
|
content_tag(:select, select_options_html, options)
|
@@ -130,11 +134,19 @@ module SinatraMore
|
|
130
134
|
|
131
135
|
protected
|
132
136
|
|
137
|
+
# Returns an array of option items for a select field based on the given collection
|
138
|
+
# fields is an array containing the fields to display from each item in the collection
|
139
|
+
def options_from_collection(collection, fields)
|
140
|
+
return '' if collection.blank?
|
141
|
+
collection.collect { |item| [ item.send(fields.first), item.send(fields.last) ] }
|
142
|
+
end
|
143
|
+
|
133
144
|
# Returns the options tags for a select based on the given option items
|
134
145
|
def options_for_select(option_items, selected_value=nil)
|
135
146
|
return '' if option_items.blank?
|
136
147
|
option_items.collect do |caption, value|
|
137
|
-
|
148
|
+
value ||= caption
|
149
|
+
content_tag(:option, caption, :value => value, :selected => selected_value.to_s =~ /#{value}|#{caption}/)
|
138
150
|
end
|
139
151
|
end
|
140
152
|
|
data/sinatra_more.gemspec
CHANGED
@@ -27,6 +27,11 @@
|
|
27
27
|
<%= f.radio_button :gender, :value => 'female' %>
|
28
28
|
</p>
|
29
29
|
<p>
|
30
|
+
<%= f.label :country, :caption => "Your country" %>
|
31
|
+
<%= f.select :country, :options => ['USA', 'Canada', 'Mexico'], :selected => 'USA', :class => 'selector' %>
|
32
|
+
</p>
|
33
|
+
<p>
|
34
|
+
<%= f.label :remember_me %>
|
30
35
|
<%= f.check_box :remember_me, :value => '1' %>
|
31
36
|
</p>
|
32
37
|
<p><%= f.submit "Create", :class => 'success', :id => 'demo-button' %></p>
|
@@ -40,6 +45,8 @@
|
|
40
45
|
<%= f.password_field_block :code, { :class => 'input' } %>
|
41
46
|
<%= f.text_area_block :about, { :class => 'textarea' } %>
|
42
47
|
<%= f.file_field_block :photo, { :class => 'upload' } %>
|
48
|
+
<%= f.check_box_block :remember_me, { :class => 'checker' } %>
|
49
|
+
<%= f.select_block :state, :options => ['California', 'Texas'], :class => 'selector' %>
|
43
50
|
<%= f.submit_block "Create", { :class => 'button' } %>
|
44
51
|
<%= f.image_submit_block "buttons/ok.png", { :class => 'image' } %>
|
45
52
|
<% end %>
|
@@ -17,10 +17,14 @@
|
|
17
17
|
= f.label :about, :caption => "About Me"
|
18
18
|
= f.text_area :about, :class => 'user-about'
|
19
19
|
%p
|
20
|
-
= f.label :gender, :caption => "Your gender
|
20
|
+
= f.label :gender, :caption => "Your gender"
|
21
21
|
= f.radio_button :gender, :value => 'male'
|
22
22
|
= f.radio_button :gender, :value => 'female'
|
23
23
|
%p
|
24
|
+
= f.label :country, :caption => "Your country"
|
25
|
+
= f.select :country, :options => ['USA', 'Canada', 'Mexico'], :selected => 'USA', :class => 'selector'
|
26
|
+
%p
|
27
|
+
= f.label :remember_me
|
24
28
|
= f.check_box :remember_me, :value => "1"
|
25
29
|
%p
|
26
30
|
= f.submit "Create", :class => 'success', :id => 'demo-button'
|
@@ -34,5 +38,7 @@
|
|
34
38
|
= f.password_field_block :code, { :class => 'input' }
|
35
39
|
= f.text_area_block :about, { :class => 'textarea' }
|
36
40
|
= f.file_field_block :photo, { :class => 'upload' }
|
41
|
+
= f.check_box_block :remember_me, { :class => 'checker' }
|
42
|
+
= f.select_block :state, :options => ['California', 'Texas'], :class => 'selector'
|
37
43
|
= f.submit_block "Create", { :class => 'button' }
|
38
44
|
= f.image_submit_block "buttons/ok.png", { :class => 'image' }
|
@@ -9,7 +9,10 @@ class TestFormBuilder < Test::Unit::TestCase
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def setup
|
12
|
-
|
12
|
+
error_stub = stub(:full_messages => ["1", "2"], :none? => false)
|
13
|
+
role_types = [stub(:name => 'Admin', :id => 1), stub(:name => 'Moderate', :id => 2), stub(:name => 'Limited', :id => 3)]
|
14
|
+
@user = stub(:errors => error_stub, :class => 'User', :first_name => "Joe", :session_id => 54)
|
15
|
+
@user.stubs(:role_types => role_types, :role => "1")
|
13
16
|
@user_none = stub(:errors => stub(:none? => true), :class => 'User')
|
14
17
|
end
|
15
18
|
|
@@ -292,6 +295,53 @@ class TestFormBuilder < Test::Unit::TestCase
|
|
292
295
|
end
|
293
296
|
end
|
294
297
|
|
298
|
+
context 'for #select method' do
|
299
|
+
should "display correct select html" do
|
300
|
+
actual_html = standard_builder.select(:state, :options => ['California', 'Texas', 'Wyoming'], :class => 'selecty')
|
301
|
+
assert_has_tag('select.selecty', :id => 'user_state', :name => 'user[state]') { actual_html }
|
302
|
+
assert_has_tag('select.selecty option', :count => 3) { actual_html }
|
303
|
+
assert_has_tag('select.selecty option', :value => 'California', :content => 'California') { actual_html }
|
304
|
+
assert_has_tag('select.selecty option', :value => 'Texas', :content => 'Texas') { actual_html }
|
305
|
+
assert_has_tag('select.selecty option', :value => 'Wyoming', :content => 'Wyoming') { actual_html }
|
306
|
+
end
|
307
|
+
|
308
|
+
should "display correct select html with selected item if it matches value" do
|
309
|
+
@user.stubs(:state => 'California')
|
310
|
+
actual_html = standard_builder.select(:state, :options => ['California', 'Texas', 'Wyoming'])
|
311
|
+
assert_has_tag('select', :id => 'user_state', :name => 'user[state]') { actual_html }
|
312
|
+
assert_has_tag('select option', :selected => 'selected', :count => 1) { actual_html }
|
313
|
+
assert_has_tag('select option', :value => 'California', :selected => 'selected') { actual_html }
|
314
|
+
end
|
315
|
+
|
316
|
+
should "display correct select html with include_blank" do
|
317
|
+
actual_html = standard_builder.select(:state, :options => ['California', 'Texas', 'Wyoming'], :include_blank => true)
|
318
|
+
assert_has_tag('select', :id => 'user_state', :name => 'user[state]') { actual_html }
|
319
|
+
assert_has_tag('select option', :count => 4) { actual_html }
|
320
|
+
assert_has_tag('select option:first-child', :content => '') { actual_html }
|
321
|
+
end
|
322
|
+
|
323
|
+
should "display correct select html with collection passed in" do
|
324
|
+
actual_html = standard_builder.select(:role, :collection => @user.role_types, :fields => [:name, :id])
|
325
|
+
assert_has_tag('select', :id => 'user_role', :name => 'user[role]') { actual_html }
|
326
|
+
assert_has_tag('select option', :count => 3) { actual_html }
|
327
|
+
assert_has_tag('select option', :value => '1', :content => 'Admin', :selected => 'selected') { actual_html }
|
328
|
+
assert_has_tag('select option', :value => '2', :content => 'Moderate') { actual_html }
|
329
|
+
assert_has_tag('select option', :value => '3', :content => 'Limited') { actual_html }
|
330
|
+
end
|
331
|
+
|
332
|
+
should "display correct select in haml" do
|
333
|
+
visit '/haml/form_for'
|
334
|
+
assert_have_selector '#demo textarea', :name => 'markup_user[about]', :id => 'markup_user_about', :class => 'user-about'
|
335
|
+
assert_have_selector '#demo2 textarea', :name => 'markup_user[about]', :id => 'markup_user_about', :class => 'textarea'
|
336
|
+
end
|
337
|
+
|
338
|
+
should "display correct select in erb" do
|
339
|
+
visit '/erb/form_for'
|
340
|
+
assert_have_selector '#demo textarea', :name => 'markup_user[about]', :id => 'markup_user_about', :class => 'user-about'
|
341
|
+
assert_have_selector '#demo2 textarea', :name => 'markup_user[about]', :id => 'markup_user_about', :class => 'textarea'
|
342
|
+
end
|
343
|
+
end
|
344
|
+
|
295
345
|
context 'for #submit method' do
|
296
346
|
should "display correct submit button html with no options" do
|
297
347
|
actual_html = standard_builder.submit
|
@@ -424,6 +474,50 @@ class TestFormBuilder < Test::Unit::TestCase
|
|
424
474
|
end
|
425
475
|
end
|
426
476
|
|
477
|
+
context 'for #check_box_block method' do
|
478
|
+
should "display correct check box block html" do
|
479
|
+
actual_html = standard_builder.check_box_block(:remember_me, :class => 'large', :caption => "Remember session")
|
480
|
+
assert_has_tag('p label', :for => 'user_remember_me', :content => "Remember session: ") { actual_html }
|
481
|
+
assert_has_tag('p input.large[type=checkbox]', :id => 'user_remember_me', :name => 'user[remember_me]') { actual_html }
|
482
|
+
end
|
483
|
+
|
484
|
+
should "display correct check box block in haml" do
|
485
|
+
visit '/haml/form_for'
|
486
|
+
assert_have_selector '#demo2 p label', :for => 'markup_user_remember_me', :content => "Remember Me: "
|
487
|
+
assert_have_selector '#demo2 p input.checker', :type => 'checkbox', :name => 'markup_user[remember_me]'
|
488
|
+
end
|
489
|
+
|
490
|
+
should "display correct check box block in erb" do
|
491
|
+
visit '/erb/form_for'
|
492
|
+
assert_have_selector '#demo2 p label', :for => 'markup_user_remember_me', :content => "Remember Me: "
|
493
|
+
assert_have_selector '#demo2 p input.checker', :type => 'checkbox', :name => 'markup_user[remember_me]'
|
494
|
+
end
|
495
|
+
end
|
496
|
+
|
497
|
+
context 'for #select_block method' do
|
498
|
+
should "display correct select_block block html" do
|
499
|
+
actual_html = standard_builder.select_block(:country, :options => ['USA', 'Canada'], :class => 'large', :caption => "Your country")
|
500
|
+
assert_has_tag('p label', :for => 'user_country', :content => "Your country: ") { actual_html }
|
501
|
+
assert_has_tag('p select', :id => 'user_country', :name => 'user[country]') { actual_html }
|
502
|
+
assert_has_tag('p select option', :content => 'USA') { actual_html }
|
503
|
+
assert_has_tag('p select option', :content => 'Canada') { actual_html }
|
504
|
+
end
|
505
|
+
|
506
|
+
should "display correct select_block block in haml" do
|
507
|
+
visit '/haml/form_for'
|
508
|
+
assert_have_selector '#demo2 p label', :for => 'markup_user_state', :content => "State: "
|
509
|
+
assert_have_selector '#demo2 p select', :name => 'markup_user[state]', :id => 'markup_user_state'
|
510
|
+
assert_have_selector '#demo2 p select option', :content => 'California'
|
511
|
+
assert_have_selector '#demo2 p select option', :content => 'Texas'
|
512
|
+
end
|
513
|
+
|
514
|
+
should "display correct select_block block in erb" do
|
515
|
+
visit '/erb/form_for'
|
516
|
+
assert_have_selector '#demo2 p label', :for => 'markup_user_state', :content => "State: "
|
517
|
+
assert_have_selector '#demo2 p select', :name => 'markup_user[state]', :id => 'markup_user_state'
|
518
|
+
end
|
519
|
+
end
|
520
|
+
|
427
521
|
context 'for #submit_block method' do
|
428
522
|
should "display correct submit block html" do
|
429
523
|
actual_html = standard_builder.submit_block("Update", :class => 'large')
|
@@ -291,8 +291,9 @@ class TestFormHelpers < Test::Unit::TestCase
|
|
291
291
|
|
292
292
|
context "for #select_tag method" do
|
293
293
|
should "display select tag in ruby" do
|
294
|
-
actual_html = select_tag(:favorite_color, :options => ['green', 'blue', 'black'])
|
294
|
+
actual_html = select_tag(:favorite_color, :options => ['green', 'blue', 'black'], :include_blank => true)
|
295
295
|
assert_has_tag(:select, :name => 'favorite_color') { actual_html }
|
296
|
+
assert_has_tag('select option:first-child', :content => '') { actual_html }
|
296
297
|
assert_has_tag('select option', :content => 'green', :value => 'green') { actual_html }
|
297
298
|
assert_has_tag('select option', :content => 'blue', :value => 'blue') { actual_html }
|
298
299
|
assert_has_tag('select option', :content => 'black', :value => 'black') { actual_html }
|