bootstrap_forms 2.0.3 → 2.0.4

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.
@@ -3,7 +3,7 @@ $:.push File.expand_path("../lib", __FILE__)
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "bootstrap_forms"
6
- s.version = "2.0.3"
6
+ s.version = "2.0.4"
7
7
  s.author = "Seth Vargo"
8
8
  s.email = "sethvargo@gmail.com"
9
9
  s.homepage = "https://github.com/sethvargo/bootstrap_forms"
@@ -22,7 +22,7 @@ module BootstrapForms
22
22
  %w(collection_select select country_select time_zone_select email_field file_field number_field password_field phone_field range_field search_field telephone_field text_area text_field url_field datetime_select date_select time_select).each do |method_name|
23
23
  define_method(method_name) do |name, *args|
24
24
  @name = name
25
- @field_options = args.extract_options!
25
+ @field_options = field_options(args)
26
26
  @args = args
27
27
 
28
28
  control_group_div do
@@ -35,7 +35,7 @@ module BootstrapForms
35
35
 
36
36
  def check_box(name, *args)
37
37
  @name = name
38
- @field_options = args.extract_options!
38
+ @field_options = field_options(args)
39
39
  @args = args
40
40
 
41
41
  control_group_div do
@@ -54,10 +54,10 @@ module BootstrapForms
54
54
 
55
55
  def radio_buttons(name, values = {}, opts = {})
56
56
  @name = name
57
- @field_options = opts.merge(required_attribute)
57
+ @field_options = @options.slice(:namespace, :index).merge(opts.merge(required_attribute))
58
58
  control_group_div do
59
59
  label_field + input_div do
60
- values.map do |text, value|
60
+ values.map do |text, value|
61
61
  if @field_options[:label] == '' || @field_options[:label] == false
62
62
  extras { radio_button(name, value, @field_options) + text }
63
63
  else
@@ -72,7 +72,7 @@ module BootstrapForms
72
72
 
73
73
  def collection_check_boxes(attribute, records, record_id, record_name, *args)
74
74
  @name = attribute
75
- @field_options = args.extract_options!
75
+ @field_options = field_options(args)
76
76
  @args = args
77
77
 
78
78
  control_group_div do
@@ -94,7 +94,7 @@ module BootstrapForms
94
94
 
95
95
  def collection_radio_buttons(attribute, records, record_id, record_name, *args)
96
96
  @name = attribute
97
- @field_options = args.extract_options!
97
+ @field_options = field_options(args)
98
98
  @args = args
99
99
 
100
100
  control_group_div do
@@ -116,7 +116,7 @@ module BootstrapForms
116
116
 
117
117
  def uneditable_input(name, *args)
118
118
  @name = name
119
- @field_options = args.extract_options!
119
+ @field_options = field_options(args)
120
120
  @args = args
121
121
 
122
122
  control_group_div do
@@ -125,7 +125,7 @@ module BootstrapForms
125
125
  value = @field_options.delete(:value)
126
126
  @field_options[:class] = [@field_options[:class], 'uneditable-input'].compact
127
127
 
128
- content_tag(:span, @field_options) do
128
+ content_tag(:span, @field_options) do
129
129
  value || object.send(@name.to_sym) rescue nil
130
130
  end
131
131
  end
@@ -135,7 +135,7 @@ module BootstrapForms
135
135
 
136
136
  def button(name = nil, *args)
137
137
  @name = name
138
- @field_options = args.extract_options!
138
+ @field_options = field_options(args)
139
139
  @args = args
140
140
 
141
141
  @field_options[:class] ||= 'btn btn-primary'
@@ -144,7 +144,7 @@ module BootstrapForms
144
144
 
145
145
  def submit(name = nil, *args)
146
146
  @name = name
147
- @field_options = args.extract_options!
147
+ @field_options = field_options(args)
148
148
  @args = args
149
149
 
150
150
  @field_options[:class] ||= 'btn btn-primary'
@@ -152,7 +152,7 @@ module BootstrapForms
152
152
  end
153
153
 
154
154
  def cancel(*args)
155
- @field_options = args.extract_options!
155
+ @field_options = field_options(args)
156
156
  @field_options[:class] ||= 'btn cancel'
157
157
  link_to(I18n.t('bootstrap_forms.buttons.cancel'), (@field_options[:back] || :back), :class => @field_options[:class])
158
158
  end
@@ -166,5 +166,14 @@ module BootstrapForms
166
166
  end
167
167
  end
168
168
  end
169
+
170
+ private
171
+ def field_options(args)
172
+ if @options
173
+ @options.slice(:namespace, :index).merge(args.extract_options!)
174
+ else
175
+ args.extract_options!
176
+ end
177
+ end
169
178
  end
170
179
  end
@@ -2,7 +2,8 @@ module BootstrapForms
2
2
  module Helpers
3
3
  module FormHelper
4
4
  def bootstrap_form_for(record, options = {}, &block)
5
- options[:builder] = options[:builder] || BootstrapForms.default_form_builder
5
+ options[:builder] ||= BootstrapForms.default_form_builder
6
+
6
7
  form_for(record, options) do |f|
7
8
  if f.object.respond_to?(:errors)
8
9
  f.error_messages.html_safe + capture(f, &block).html_safe
@@ -13,7 +14,8 @@ module BootstrapForms
13
14
  end
14
15
 
15
16
  def bootstrap_fields_for(record, options = {}, &block)
16
- options[:builder] = options[:builder] || BootstrapForms.default_form_builder
17
+ options[:builder] ||= BootstrapForms.default_form_builder
18
+
17
19
  fields_for(record, nil, options, &block)
18
20
  end
19
21
  end
@@ -2,16 +2,16 @@ module BootstrapForms
2
2
  module Helpers
3
3
  module FormTagHelper
4
4
  include BootstrapForms::Helpers::Wrappers
5
-
5
+
6
6
  def bootstrap_form_tag(url_for_options = {}, options = {}, &block)
7
7
  form_tag(url_for_options, options, &block)
8
8
  end
9
-
9
+
10
10
  %w(check_box_tag email_field_tag file_field_tag image_submit_tag number_field_tag password_field_tag phone_field_tag radio_button_tag range_field_tag search_field_tag select_tag telephone_field_tag text_area_tag text_field_tag url_field_tag).each do |method_name|
11
11
  # prefix each method with bootstrap_*
12
12
  define_method("bootstrap_#{method_name}") do |name, *args|
13
13
  @name = name
14
- @field_options = args.extract_options!
14
+ @field_options = field_options(args)
15
15
  @args = args
16
16
 
17
17
  control_group_div do
@@ -21,17 +21,17 @@ module BootstrapForms
21
21
  end
22
22
  end
23
23
  end
24
-
24
+
25
25
  def uneditable_input_tag(name, *args)
26
26
  @name = name
27
- @field_options = args.extract_options!
27
+ @field_options = field_options(args)
28
28
  @args = args
29
29
 
30
30
  control_group_div do
31
31
  label_field + input_div do
32
32
  extras do
33
33
  content_tag(:span, :class => 'uneditable-input') do
34
- @field_options[:value]
34
+ @field_options[:value]
35
35
  end
36
36
  end
37
37
  end
@@ -40,7 +40,7 @@ module BootstrapForms
40
40
 
41
41
  def bootstrap_button_tag(name = nil, *args)
42
42
  @name = name
43
- @field_options = args.extract_options!
43
+ @field_options = field_options(args)
44
44
  @args = args
45
45
 
46
46
  @field_options[:class] = 'btn btn-primary'
@@ -49,7 +49,7 @@ module BootstrapForms
49
49
 
50
50
  def bootstrap_submit_tag(name = nil, *args)
51
51
  @name = name
52
- @field_options = args.extract_options!
52
+ @field_options = field_options(args)
53
53
  @args = args
54
54
 
55
55
  @field_options[:class] = 'btn btn-primary'
@@ -57,7 +57,7 @@ module BootstrapForms
57
57
  end
58
58
 
59
59
  def bootstrap_cancel_tag(*args)
60
- @field_options = args.extract_options!
60
+ @field_options = field_options(args)
61
61
  link_to(I18n.t('bootstrap_forms.buttons.cancel'), (@field_options[:back] || :back), :class => 'btn cancel')
62
62
  end
63
63
 
@@ -66,10 +66,19 @@ module BootstrapForms
66
66
  if block_given?
67
67
  yield
68
68
  else
69
- [bootstrap_submit_tag, bootstrap_cancel_tag].join(' ').html_safe
69
+ [ bootstrap_submit_tag, bootstrap_cancel_tag ].join(' ').html_safe
70
70
  end
71
71
  end
72
72
  end
73
+
74
+ private
75
+ def field_options(args)
76
+ if @options
77
+ @options.slice(:namespace, :index).merge(args.extract_options!)
78
+ else
79
+ args.extract_options!
80
+ end
81
+ end
73
82
  end
74
83
  end
75
84
  end
@@ -1,81 +1,99 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe "BootstrapForms::FormBuilder" do
4
- context "given a setup builder" do
3
+ describe 'BootstrapForms::FormBuilder' do
4
+ context 'given a setup builder' do
5
5
  before(:each) do
6
6
  @project = Project.new
7
7
  @template = ActionView::Base.new
8
- @template.output_buffer = ""
8
+ @template.output_buffer =''
9
9
  @builder = BootstrapForms::FormBuilder.new(:item, @project, @template, {}, proc {})
10
10
  end
11
11
 
12
- it_behaves_like 'a bootstrap form'
12
+ context 'with no options' do
13
+ it_behaves_like 'a bootstrap form'
14
+ end
13
15
 
14
- describe "with no options" do
15
- describe "error_messages" do
16
- it "returns empty string without errors" do
17
- @builder.error_messages.should == ""
18
- end
16
+ context 'with the :namespace option' do
17
+ before(:each) do
18
+ @builder.options[:namespace] = 'foo'
19
+ end
19
20
 
20
- context "with errors" do
21
- before(:each) do
22
- @project.errors.add("name")
23
- @result = @builder.error_messages
24
- end
21
+ it 'prefixs HTML ids correctly' do
22
+ @builder.text_field('name').should match /<(input) .*id="foo_item_name"/
23
+ end
24
+ end
25
25
 
26
- it "is wrapped in error div" do
27
- @result.should match /^<div class="alert alert-block alert-error validation-errors">.*<\/div>$/
28
- end
26
+ context 'with the :index option' do
27
+ before(:each) do
28
+ @builder.options[:index] = 69
29
+ end
29
30
 
30
- it "has a list with errors" do
31
- @result.should match /<ul><li>Name is invalid<\/li><\/ul>/
32
- end
31
+ it 'uses the correct :index' do
32
+ @builder.text_field('name').should match /<input .*id="item_69_name"/
33
+ end
33
34
 
34
- it "has error title" do
35
- @result.should match /<h4 class="alert-heading">#{I18n.t('bootstrap_forms.errors.header', :model => Project.model_name.human)}<\/h4>/
36
- end
35
+ it 'does not add extraneous input data' do
36
+ @builder.text_field('name').should_not match /<input .*index/
37
+ end
38
+ end
37
39
 
38
- it "has error message on field" do
39
- @builder.text_field("name").should == "<div class=\"control-group error\"><label class=\"control-label\" for=\"item_name\">Name</label><div class=\"controls\"><input id=\"item_name\" name=\"item[name]\" size=\"30\" type=\"text\" /><span class=\"help-inline\">Name is invalid</span></div></div>"
40
- end
40
+ context 'with the :namespace and :index options' do
41
+ before(:each) do
42
+ @builder.options[:namespace] = 'foo'
43
+ @builder.options[:index] = 69
44
+ end
41
45
 
42
- it "joins passed error message and validation errors with ', '" do
43
- @builder.text_field("name", :error => 'This is an error!').should == "<div class=\"control-group error\"><label class=\"control-label\" for=\"item_name\">Name</label><div class=\"controls\"><input id=\"item_name\" name=\"item[name]\" size=\"30\" type=\"text\" /><span class=\"help-inline\">This is an error!, Name is invalid</span></div></div>"
44
- end
45
- end
46
+ it 'uses the correct :index' do
47
+ @builder.text_field('name').should match /<input .*id="foo_item_69_name"/
46
48
  end
47
49
  end
48
50
 
49
- context "with errors" do
51
+ context 'with :html options' do
50
52
  before(:each) do
51
- @project.errors.add("name")
53
+ @builder.options[:html] = { :class => 'foo' }
54
+ end
55
+
56
+ it 'does not add the class to the elements' do
57
+ @builder.text_field('name').should_not match /<input .*class="foo"/
58
+ end
59
+ end
60
+
61
+ context 'without errors' do
62
+ it 'returns empty string' do
63
+ @builder.error_messages.should be_empty
64
+ end
65
+ end
66
+
67
+ context 'errors' do
68
+ before(:each) do
69
+ @project.errors.add('name')
52
70
  @result = @builder.error_messages
53
71
  end
54
72
 
55
- it "is wrapped in error div" do
73
+ it 'are wrapped in error div' do
56
74
  @result.should match /^<div class="alert alert-block alert-error validation-errors">.*<\/div>$/
57
75
  end
58
76
 
59
- it "has a list with errors" do
77
+ it 'have a list with errors' do
60
78
  @result.should match /<ul><li>Name is invalid<\/li><\/ul>/
61
79
  end
62
80
 
63
- it "has error title" do
81
+ it 'have error title' do
64
82
  @result.should match /<h4 class="alert-heading">#{I18n.t('bootstrap_forms.errors.header', :model => Project.model_name.human)}<\/h4>/
65
83
  end
66
84
 
67
- it "has error message on field" do
68
- @builder.text_field("name").should == "<div class=\"control-group error\"><label class=\"control-label\" for=\"item_name\">Name</label><div class=\"controls\"><input id=\"item_name\" name=\"item[name]\" size=\"30\" type=\"text\" /><span class=\"help-inline\">Name is invalid</span></div></div>"
85
+ it 'have error message on field' do
86
+ @builder.text_field('name').should == "<div class=\"control-group error\"><label class=\"control-label\" for=\"item_name\">Name</label><div class=\"controls\"><input id=\"item_name\" name=\"item[name]\" size=\"30\" type=\"text\" /><span class=\"help-inline\">Name is invalid</span></div></div>"
69
87
  end
70
88
 
71
89
  it "joins passed error message and validation errors with ', '" do
72
- @builder.text_field("name", :error => 'This is an error!').should == "<div class=\"control-group error\"><label class=\"control-label\" for=\"item_name\">Name</label><div class=\"controls\"><input id=\"item_name\" name=\"item[name]\" size=\"30\" type=\"text\" /><span class=\"help-inline\">This is an error!, Name is invalid</span></div></div>"
90
+ @builder.text_field('name', :error => 'This is an error!').should == "<div class=\"control-group error\"><label class=\"control-label\" for=\"item_name\">Name</label><div class=\"controls\"><input id=\"item_name\" name=\"item[name]\" size=\"30\" type=\"text\" /><span class=\"help-inline\">This is an error!, Name is invalid</span></div></div>"
73
91
  end
74
92
  end
75
93
 
76
- context "an attribute with a PresenceValidator" do
77
- it "adds the required attribute" do
78
- @builder.text_field("owner").should match /<input .*required="required"/
94
+ context 'an attribute with a PresenceValidator' do
95
+ it 'adds the required attribute' do
96
+ @builder.text_field('owner').should match /<input .*required="required"/
79
97
  end
80
98
  end
81
99
 
@@ -92,10 +110,10 @@ describe "BootstrapForms::FormBuilder" do
92
110
  end
93
111
  end
94
112
 
95
- context "given a setup builder with a symbol" do
113
+ context 'setup builder with a symbol' do
96
114
  before(:each) do
97
115
  @template = ActionView::Base.new
98
- @template.output_buffer = ""
116
+ @template.output_buffer = ''
99
117
  @builder = BootstrapForms::FormBuilder.new(:item, nil, @template, {}, proc {})
100
118
  end
101
119
 
@@ -112,6 +130,7 @@ describe 'BootstrapForms::Helpers::FormTagHelper' do
112
130
  @template.output_buffer = ""
113
131
  @builder = BootstrapForms::FormBuilder.new(:item, @non_active_record_object, @template, {}, proc {})
114
132
  end
133
+
115
134
  it 'returns an empty string with no errors' do
116
135
  @template.bootstrap_text_field_tag(@builder.object[:name]).should match /<div class="control-group">.*/
117
136
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bootstrap_forms
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.3
4
+ version: 2.0.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-09-12 00:00:00.000000000 Z
12
+ date: 2012-11-07 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec-rails
@@ -195,7 +195,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
195
195
  version: '0'
196
196
  segments:
197
197
  - 0
198
- hash: -2577927973588577500
198
+ hash: -722096709655512624
199
199
  required_rubygems_version: !ruby/object:Gem::Requirement
200
200
  none: false
201
201
  requirements:
@@ -204,7 +204,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
204
204
  version: '0'
205
205
  segments:
206
206
  - 0
207
- hash: -2577927973588577500
207
+ hash: -722096709655512624
208
208
  requirements: []
209
209
  rubyforge_project:
210
210
  rubygems_version: 1.8.24