bh 1.2.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c4f7bca38e930bb3d819bb8eb02c8179cba085ba
4
- data.tar.gz: 0f378c9f8ad7a87c3c157a394f22523c725479bf
3
+ metadata.gz: a5ee96b17731875a1201eb7ec0cf89f1835e44ed
4
+ data.tar.gz: 538d55809b170aa39b2bf7dc533bf57b601627ed
5
5
  SHA512:
6
- metadata.gz: 191624fbe875bdbeeaca0c0892371b98982be93c52c371c6fbfb570040965616b8d9cfc59ad87edeb4f39d24f476181ef9674f5773d6e226b7386cf3221c63dc
7
- data.tar.gz: 1fbac9bf8bb10d1d3763aedd47e35a569c51211a93b21aa5c7acb25877c1dc9e300db77a8a74495f30f1ebaf5696766504e148bb8a8c802d9df11c191c3d6390
6
+ metadata.gz: 34dc9102e88461797920f35beb0192c13590dbffab164262a6451be3e2224b276b68826dff4c389a7e06a1606653a74b12417e9c863c26ab269e0867257eaecc
7
+ data.tar.gz: 63405566998bc759a03dfb472aa7b96976d9c3580fec01f1497bfdb1eac3ea6c4d58a7a9d0e5cb1cb33ce2c7eaf5a7e3ab42658bb4c39e1f0b3b736bd89158a0
@@ -6,6 +6,16 @@ For more information about changelogs, check
6
6
  [Keep a Changelog](http://keepachangelog.com) and
7
7
  [Vandamme](http://tech-angels.github.io/vandamme).
8
8
 
9
+ ## 1.3.0 - 2014-02-02
10
+
11
+ * [FEATURE] Extend `form_for` to be wrapped in <li> when inside a `nav`, just like `link_to`
12
+ * [FEATURE] Extend `button_to` to be wrapped in <li> when inside a `nav`, just like `link_to`
13
+ * [BUGFIX] Match default placeholder with label content (therefore supporting localization)
14
+ * [ENHANCEMENT] Bootstrappify forms wrapped in `navbar`, setting their class to "navbar-form"
15
+ * [ENHANCEMENT] Add `:help` option to display a help block after most form fields
16
+ * [ENHANCEMENT] Bump Bootstrap version to 3.3.2
17
+ * [ENHANCEMENT] Bump Font Awesome version to 4.3.0
18
+
9
19
  ## 1.2.0 - 2014-11-13
10
20
 
11
21
  * [FEATURE] Add support for Middleman and Padrino for all helpers except `form_for`
data/README.md CHANGED
@@ -1,8 +1,8 @@
1
1
  Bh · Bootstrap Helpers
2
2
  ======================
3
3
 
4
- Bh provides a set of helpers that streamlines the use of
5
- [Bootstrap 3 components](http://getbootstrap.com/components) in Ruby views.
4
+ A set of Ruby helpers that streamlines the use of
5
+ [Bootstrap 3 components](http://getbootstrap.com/components) in HTML views.
6
6
 
7
7
  The **full documentation** is available at [rubydoc.info](http://www.rubydoc.info/github/Fullscreen/bh/master/Bh/Helpers).
8
8
 
@@ -7,14 +7,14 @@ module Bh
7
7
  # @note if unspecified, the version should match the latest available
8
8
  # version. If that's not the case, it's a bug and should be fixed.
9
9
  def self.bootstrap(options = {})
10
- options[:version] ||= '3.3.0'
10
+ options[:version] ||= '3.3.2'
11
11
  cdn_asset options.merge(library: 'bootstrap')
12
12
  end
13
13
 
14
14
  # @note if unspecified, the version should match the latest available
15
15
  # version. If that's not the case, it's a bug and should be fixed.
16
16
  def self.font_awesome(options = {})
17
- options[:version] ||= '4.2.0'
17
+ options[:version] ||= '4.3.0'
18
18
  cdn_asset options.merge(library: 'font-awesome')
19
19
  end
20
20
 
@@ -31,10 +31,15 @@ module Bh
31
31
 
32
32
  def field_tags(errors, field_type, options = {}, &block)
33
33
  prefix, suffix = options.delete(:prefix), options.delete(:suffix)
34
+ help_text = options.delete(:help)
34
35
  field = @template.capture(&block)
35
36
  tags = [field_in_group(field, prefix, suffix)]
36
37
  tags << error_icon_tag if show_error_icon?(field_type, errors, suffix)
37
- tags << error_help_tag(errors) if errors.any? && show_error_help?
38
+ if errors.any? && show_error_help?
39
+ tags << help_tag(errors.to_sentence)
40
+ elsif help_text
41
+ tags << help_tag(help_text)
42
+ end
38
43
  safe_join tags
39
44
  end
40
45
 
@@ -74,10 +79,10 @@ module Bh
74
79
  glyphicon :remove, class: 'form-control-feedback'
75
80
  end
76
81
 
77
- def error_help_tag(errors)
82
+ def help_tag(help_text)
78
83
  klass = ['help-block', 'text-left']
79
84
  klass << 'sr-only' if inline_form?
80
- content_tag :span, errors.to_sentence, class: klass.join(' ')
85
+ content_tag :span, help_text, class: klass.join(' ')
81
86
  end
82
87
 
83
88
  def label_for(method, errors, options)
@@ -117,7 +122,7 @@ module Bh
117
122
  end
118
123
 
119
124
  def inline_form?
120
- @options[:layout].to_s == 'inline'
125
+ ['inline', 'navbar'].include? @options[:layout].to_s
121
126
  end
122
127
 
123
128
  def horizontal_form?
@@ -6,7 +6,7 @@ module Bh
6
6
  include BaseHelper
7
7
 
8
8
  def field(method, field_type, options = {}, &block)
9
- options[:placeholder] ||= method.to_s.humanize
9
+ options[:placeholder] ||= strip_tags(label method)
10
10
  append_class! options, 'form-control'
11
11
  base_field method, field_type, options, &block
12
12
  end
@@ -12,6 +12,8 @@ require 'bh/core_ext/rails/form/submit_helper'
12
12
  module Bh
13
13
  # @api private
14
14
  class FormBuilder < ActionView::Helpers::FormBuilder
15
+ include ActionView::Helpers::SanitizeHelper
16
+ extend ActionView::Helpers::SanitizeHelper::ClassMethods
15
17
  include Form::CheckBoxHelper
16
18
  include Form::FieldHelper
17
19
  include Form::FieldsetHelper
@@ -8,8 +8,16 @@ module Bh
8
8
  include ActionView::Helpers::FormHelper # for form_for
9
9
 
10
10
  def form_for(record, options = {}, &block)
11
+ options[:layout] ||= 'navbar' if Bh::Stack.find(Bh::Navbar)
11
12
  add_form_options!(options) if options[:layout]
12
- super record, options, &block
13
+ html = super record, options, &block
14
+
15
+ if Bh::Stack.find(Bh::Nav)
16
+ container = Bh::Base.new(self) { html }
17
+ container.render_tag :li
18
+ else
19
+ html
20
+ end
13
21
  end
14
22
 
15
23
  private
@@ -23,6 +31,7 @@ module Bh
23
31
 
24
32
  def class_for(layout)
25
33
  case layout.to_s
34
+ when 'navbar' then 'navbar-form'
26
35
  when 'inline' then 'form-inline'
27
36
  when 'horizontal' then 'form-horizontal'
28
37
  end
@@ -9,6 +9,7 @@ module Bh
9
9
  # Only overrides the original method if called with any of the `:context`,
10
10
  # `:size` or `:layout` option, otherwise calls the original method.
11
11
  # @see http://getbootstrap.com/css/#buttons
12
+ # @see http://getbootstrap.com/components/#nav
12
13
  # @see http://getbootstrap.com/components/#navbar-buttons
13
14
  # @see http://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#method-i-button_to
14
15
  # @see http://rubydoc.info/gems/padrino-helpers/Padrino/Helpers/FormHelpers#button_to-instance_method
@@ -47,11 +48,18 @@ module Bh
47
48
  button_to.append_form_class! 'navbar-form' if Bh::Stack.find(Bh::Navbar)
48
49
  end
49
50
 
50
- if block_given? && button_to.accepts_block?
51
+ html = if block_given? && button_to.accepts_block?
51
52
  super button_to.url, button_to.attributes, &-> { button_to.content }
52
53
  else
53
54
  super button_to.content, button_to.url, button_to.attributes, &nil
54
55
  end
56
+
57
+ if Bh::Stack.find(Bh::Nav)
58
+ container = Bh::Base.new(self) { html }
59
+ container.render_tag :li
60
+ else
61
+ html
62
+ end
55
63
  end
56
64
  end
57
65
  end
@@ -1,3 +1,3 @@
1
1
  module Bh
2
- VERSION = '1.2.0'
2
+ VERSION = '1.3.0'
3
3
  end
@@ -23,6 +23,15 @@ describe 'check_box' do
23
23
  it { expect(form).to include 'Given name</label>' }
24
24
  end
25
25
 
26
+ context 'not given a help option, does not display a help box' do
27
+ it { expect(form).not_to include 'help-block' }
28
+ end
29
+
30
+ context 'given a help option, displays a help box' do
31
+ let(:options) { {help: 'Please select an option'} }
32
+ it { expect(form).to include '<span class="help-block text-left">Please select an option</span>' }
33
+ end
34
+
26
35
  specify 'not given an error, does not apply has-error to the form group' do
27
36
  expect(form).not_to include 'has-error'
28
37
  end
@@ -83,6 +92,14 @@ describe 'check_box' do
83
92
  end
84
93
  end
85
94
 
95
+ context 'given a help message' do
96
+ let(:options) { {help: 'Please select an option'} }
97
+
98
+ specify 'applies sr-only to the help message' do
99
+ expect(form).to include '<span class="help-block text-left sr-only">Please select an option</span>'
100
+ end
101
+ end
102
+
86
103
  context 'given the inline_label: false option' do
87
104
  let(:options) { {inline_label: false} }
88
105
 
@@ -42,6 +42,15 @@ field_helpers_to_test.each do |form_field|
42
42
  it { expect(form).to include 'Given name</label>' }
43
43
  end
44
44
 
45
+ context 'not given a help option, does not display a help box' do
46
+ it { expect(form).not_to include 'help-block' }
47
+ end
48
+
49
+ context 'given a help option, displays a help box' do
50
+ let(:options) { {help: 'Please write the given name'} }
51
+ it { expect(form).to include '<span class="help-block text-left">Please write the given name</span>' }
52
+ end
53
+
45
54
  specify 'not given a prefix or suffix option, does not use an input group' do
46
55
  expect(form).not_to include 'input-group'
47
56
  end
@@ -109,6 +118,14 @@ field_helpers_to_test.each do |form_field|
109
118
  expect(form).to match %r{<div class="form-group"><label class="sr-only".+?>Name</label><(input|textarea) class="form-control"}
110
119
  end
111
120
 
121
+ context 'given a help message' do
122
+ let(:options) { {help: 'Please write the given name'} }
123
+
124
+ specify 'applies sr-only to the help message' do
125
+ expect(form).to include '<span class="help-block text-left sr-only">Please write the given name</span>'
126
+ end
127
+ end
128
+
112
129
  context 'given an error' do
113
130
  before { user.errors.add :name, 'cannot be nil' }
114
131
 
@@ -7,7 +7,21 @@ describe 'file_field' do
7
7
  let(:form) { form_for user, layout: layout, errors: errors, url: '/', &block }
8
8
  let(:user) { User.new }
9
9
  let(:errors) { {} }
10
- let(:block) { Proc.new {|f| f.file_field :name, accept: 'text/html'} }
10
+ let(:block) { Proc.new {|f| f.file_field :name, options.merge(accept: 'text/html')} }
11
+ let(:options) { {} }
12
+
13
+ context 'given any layout' do
14
+ let(:layout) { :whatever }
15
+
16
+ context 'not given a help option, does not display a help box' do
17
+ it { expect(form).not_to include 'help-block' }
18
+ end
19
+
20
+ context 'given a help option, displays a help box' do
21
+ let(:options) { {help: 'Please upload a file'} }
22
+ it { expect(form).to include '<span class="help-block text-left">Please upload a file</span>' }
23
+ end
24
+ end
11
25
 
12
26
  describe 'given a basic layout' do
13
27
  let(:layout) { :basic }
@@ -41,6 +55,14 @@ describe 'file_field' do
41
55
  expect(form).not_to match 'form-control'
42
56
  end
43
57
 
58
+ context 'given a help message' do
59
+ let(:options) { {help: 'Please select a file'} }
60
+
61
+ specify 'applies sr-only to the help message' do
62
+ expect(form).to include '<span class="help-block text-left sr-only">Please select a file</span>'
63
+ end
64
+ end
65
+
44
66
  context 'given an error' do
45
67
  before { user.errors.add :name, 'cannot be nil' }
46
68
 
@@ -22,6 +22,15 @@ describe 'radio_button' do
22
22
  it { expect(form).to include '> Jerry</label>' }
23
23
  end
24
24
 
25
+ context 'not given a help option, does not display a help box' do
26
+ it { expect(form).not_to include 'help-block' }
27
+ end
28
+
29
+ context 'given a help option, displays a help box' do
30
+ let(:options) { {help: 'Please select an option'} }
31
+ it { expect(form).to include '<span class="help-block text-left">Please select an option</span>' }
32
+ end
33
+
25
34
  specify 'not given an error, does not apply has-error to the form group' do
26
35
  expect(form).not_to include 'has-error'
27
36
  end
@@ -56,6 +65,14 @@ describe 'radio_button' do
56
65
  expect(form).to match %r{<div class="radio"><label><input.+? /> Jeremy</label></div>}
57
66
  end
58
67
 
68
+ context 'given a help message' do
69
+ let(:options) { {help: 'Please select an option'} }
70
+
71
+ specify 'applies sr-only to the help message' do
72
+ expect(form).to include '<span class="help-block text-left sr-only">Please select an option</span>'
73
+ end
74
+ end
75
+
59
76
  context 'given an error' do
60
77
  before { user.errors.add :name, 'cannot be nil' }
61
78
 
@@ -22,6 +22,15 @@ describe 'select' do
22
22
  it { expect(form).to include 'Given name</label>' }
23
23
  end
24
24
 
25
+ context 'not given a help option, does not display a help box' do
26
+ it { expect(form).not_to include 'help-block' }
27
+ end
28
+
29
+ context 'given a help option, displays a help box' do
30
+ let(:options) { {help: 'Please select an option'} }
31
+ it { expect(form).to include '<span class="help-block text-left">Please select an option</span>' }
32
+ end
33
+
25
34
  specify 'not given an error, does not apply has-error to the form group' do
26
35
  expect(form).not_to include 'has-error'
27
36
  end
@@ -60,6 +69,14 @@ describe 'select' do
60
69
  expect(form).to match %r{<div class="form-group"><label class="sr-only".+?>Name</label><select class="form-control"}
61
70
  end
62
71
 
72
+ context 'given a help message' do
73
+ let(:options) { {help: 'Please select an option'} }
74
+
75
+ specify 'applies sr-only to the help message' do
76
+ expect(form).to include '<span class="help-block text-left sr-only">Please select an option</span>'
77
+ end
78
+ end
79
+
63
80
  context 'given an error' do
64
81
  before { user.errors.add :name, 'cannot be nil' }
65
82
 
@@ -3,16 +3,23 @@ require 'bh/core_ext/rails/form_for_helper'
3
3
  include Bh::Rails::Helpers
4
4
 
5
5
  describe 'form_for' do
6
+ let(:bh) { RailsView.new }
6
7
  let(:protect_against_forgery?) { false }
7
8
  attr_accessor :output_buffer
8
9
  let(:form) { form_for(:object, options.merge(url: '/')) {} }
10
+ let(:options) { {} }
9
11
 
10
- describe 'without a :layout option' do
11
- let(:options) { {} }
12
+ specify 'by default, does not apply Bootstrap attributes to the form' do
13
+ expect(form).not_to include 'role="form"'
14
+ end
12
15
 
13
- specify 'does not apply Bootstrap attributes to the form' do
14
- expect(form).not_to include 'role="form"'
15
- end
16
+ specify 'wrapped in navbar, applies Bootstrap attributes of a navbar form' do
17
+ bh.navbar { expect(form).to include 'role="form"' }
18
+ bh.navbar { expect(form).to include 'class="navbar-form"' }
19
+ end
20
+
21
+ specify 'wrapped in nav, surrounds the form in a <li> item' do
22
+ bh.nav { expect(form).to match %r{^<li><form.+?</form></li>$} }
16
23
  end
17
24
 
18
25
  describe 'with layout: :horizontal' do
@@ -3,6 +3,7 @@ shared_examples_for 'the button_to helper' do
3
3
  all_tests_pass_with 'the :size button_to option'
4
4
  all_tests_pass_with 'the :layout button_to option'
5
5
  all_tests_pass_with 'the button wrapped in navbar'
6
+ all_tests_pass_with 'the button wrapped in nav'
6
7
  end
7
8
 
8
9
  #--
@@ -39,4 +40,12 @@ shared_examples_for 'the button wrapped in navbar' do
39
40
  html = %r{^<form.+class="navbar-form"}
40
41
  bh.navbar { expect(button_to: {context: :default}).to generate html }
41
42
  end
42
- end
43
+ end
44
+
45
+
46
+ shared_examples_for 'the button wrapped in nav' do
47
+ specify 'surrounds the form in a <li> item' do
48
+ html = %r{^<li><form.+?</form></li>}
49
+ bh.nav { expect(:button_to).to generate html }
50
+ end
51
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bh
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Claudio Baccigalupo
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-11-13 00:00:00.000000000 Z
11
+ date: 2015-02-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -320,7 +320,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
320
320
  version: '0'
321
321
  requirements: []
322
322
  rubyforge_project:
323
- rubygems_version: 2.2.2
323
+ rubygems_version: 2.4.5
324
324
  signing_key:
325
325
  specification_version: 4
326
326
  summary: Bh provides a set of powerful helpers that streamlines the use of Bootstrap