bootstrap-view-helpers 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -4,16 +4,28 @@ This gem provides helper methods for various Bootstrap components.
4
4
 
5
5
  Includes support for:
6
6
 
7
+ * navigation
8
+ * nav bar
9
+ * nav list
7
10
  * buttons
8
11
  * `<button>`
9
12
  * `<a>` styled as button
13
+ * button groups
14
+ * button toolbars
10
15
  * labels and badges
11
16
  * dropdowns
12
17
  * nav dropdowns
13
18
  * button dropdowns
14
19
  * split-button dropdowns
15
20
  * accordion
21
+ * form helpers
22
+ * submit_tag_button
16
23
 
24
+ ## Note
25
+
26
+ This is a new gem undergoing a lot of change. There is a chance that some backwards
27
+ compatibility will be broken until things settle down.
28
+
17
29
  ## Installation
18
30
 
19
31
  Add it to your Gemfile:
@@ -28,25 +40,93 @@ Run bundler:
28
40
  bundle install
29
41
  ```
30
42
 
43
+ ## API Documentation
44
+
45
+ Complete [API documentation](http://rubydoc.info/gems/bootstrap-view-helpers/frames/file/README.md) at [RubyGems.org](https://rubygems.org/).
46
+
31
47
  ## Examples
32
48
 
33
- ### Badges
49
+ ### Navigation
34
50
 
35
- Supports the Bootstrap badge types:
36
- * default
37
- * success
38
- * warning
39
- * important
40
- * info
41
- * inverse
42
-
51
+ #### Navigation Bar
52
+ ```
53
+ <%= nav_bar do %>
54
+
55
+ <%= brand('Span Brand')%>
56
+ <%= brand('Link Brand', url: '#')%>
57
+
58
+ <%= nav_bar_links do %>
59
+
60
+ <%= nav_bar_link('Active', '#', active: true) %>
61
+ <%= nav_bar_link('Link1', '/link1') %>
62
+
63
+ <%= nav_bar_divider %>
64
+
65
+ <%= nav_dropdown('Foo') do %>
66
+ <%= dropdown_item('One', 'foo')%>
67
+ <% end %>
68
+
69
+ <% end %>
70
+ <% end %>
71
+ ```
72
+
73
+ #### Navigation List (sidebar)
43
74
  ```erb
44
- <%= badge('Default') %>
45
- <%= badge('Info', :info) %>
46
- <%= badge('Warning', :warning, id: 'warn-id', class: 'more-class', my_key: 'my_value') %>
75
+ <%= nav_list(id: 'my') do %>
76
+ <%= nav_list_header('Buttons & Labels') %>
77
+ <%= dropdown_item('Buttons', 'butons')%>
78
+ <%= dropdown_item('Labels', 'butons')%>
79
+ <% end %>
80
+ ```
81
+
82
+ ### Buttons
83
+
84
+ ```ruby
85
+ # button
86
+ button('Default')
87
+
88
+ # add url option to make <a> styled as button
89
+ button('Home', url: '/')
90
+
91
+ # a button styled as a link
92
+ button('Home', :link)
93
+
94
+ # give it a type; see BUTTON_TYPES
95
+ button('Info', :info)
96
+
97
+ # give it a size (see BUTTON_SIZES)
98
+ button('Small', :small)
99
+
100
+ # size, type, additional class and additional html attributes
101
+ button('Warning', :warning, :large, id: 'warn-id', class: 'more-class', my_key: 'my_value')
102
+ ```
103
+
104
+ ### Button Groups
105
+
106
+ ```erb
107
+ <%= button_group do %>
108
+ <%= button("Left", url: "/left") %>
109
+ <%= button("Right", id: 'right') %>
110
+ <% end %>
111
+ ```
112
+
113
+ ### Button Toolbars
114
+
115
+ ```erb
116
+ <%= button_toolbar do %>
117
+ <%= button('Single Button', url: '/single') %>
118
+ <%= button_group do %>
119
+ <%= button('Group Button 1') %>
120
+ <%= button('Group Button 2') %>
121
+ <% end %>
122
+ <%= button('Another Single') %>
123
+ <% end %>
47
124
  ```
125
+ ### Labels and Badges
48
126
 
49
- ### Labels (Stamps)
127
+ http://twitter.github.io/bootstrap/components.html#labels-badges
128
+
129
+ #### Labels (Stamps)
50
130
 
51
131
  Because `label` is a Rails helper method we use `stamp` -- because Elle thinks it looks like a stamp.
52
132
 
@@ -63,4 +143,55 @@ Supports the Bootstrap label types:
63
143
  <%= stamp('Info', :info) %>
64
144
  <%= stamp('Warning', :warning, id: 'warn-id', class: 'more-class', my_key: 'my_value') %>
65
145
  ```
146
+
147
+ #### Badges
148
+ Supports the Bootstrap badge types:
149
+ * default
150
+ * success
151
+ * warning
152
+ * important
153
+ * info
154
+ * inverse
155
+
156
+ ```erb
157
+ <%= badge('Default') %>
158
+ <%= badge('Info', :info) %>
159
+ <%= badge('Warning', :warning, id: 'warn-id', class: 'more-class', my_key: 'my_value') %>
160
+ ```
161
+
162
+
163
+ ### Accordions
164
+
165
+ See: http://twitter.github.io/bootstrap/javascript.html#collapse
166
+
167
+ ```erb
168
+ <%= accordion do %>
169
+
170
+ <%= accordion_group('Section 1', open: true) do %>
171
+ content for group 1
172
+ <% end >
173
+
174
+ <%= accordion_group('Section 1') do %>
175
+ content for group 2
176
+ <% end %>
177
+
178
+ <% end %>
179
+ ```
180
+
181
+ ### Form Helpers
182
+
183
+ #### submit_tag_button
184
+
185
+ Returns <input> similar to +#submit_tag()+ but:
186
+ * styled like a Bootstrap button, type `:primary`
187
+ * has `:disable_with` set to "Processing ..."
66
188
 
189
+ ```ruby
190
+ submit_button_tag # => <input class="btn btn-primary" data-disable-with="Processing ..." name="commit" type="submit" value="Save changes" />
191
+ submit_button_tag('Save')
192
+ submit_button_tag('Delete', :danger)
193
+ submit_button_tag('Big', :large)
194
+ submit_button_tag('With Options', :small, :info, id: 'my-id')
195
+ ```
196
+
197
+
@@ -1,6 +1,29 @@
1
+ # Rails helpers for building Bootstrap accordions.
2
+ #
3
+ # See: http://twitter.github.io/bootstrap/javascript.html#collapse
4
+ #
5
+ # <%= accordion do %>
6
+ #
7
+ # <%= accordion_group('Section 1', open: true) do %>
8
+ # content for group 1
9
+ # <% end >
10
+ #
11
+ # <%= accordion_group('Section 1') do %>
12
+ # content for group 2
13
+ # <% end %>
14
+ #
15
+ # <% end %>
16
+ #
1
17
  module Bootstrap::AccordionHelper
2
18
 
19
+ # Returns the outer html for a Bootstrap accordion.
20
+ #
21
+ # @param [Hash] options html attributes for accordion <div>
22
+ # @return [String] accordion html
23
+ # @yield Should contain calls to {Bootstrap::AccordionHelper#accordion_group}
24
+ # @yieldreturn [String] Html from {Bootstrap::AccordionHelper#accordion_group} calls
3
25
  def accordion(options={})
26
+ options = canonicalize_options(options)
4
27
  options = ensure_accordion_id(options)
5
28
  @accordion_id = options[:id]
6
29
  options = ensure_class(options, 'accordion')
@@ -10,12 +33,23 @@ module Bootstrap::AccordionHelper
10
33
  end
11
34
  end
12
35
 
36
+ # Returns the html for a Bootstrap accordion group.
37
+ #
38
+ # @param [String] text the text in the accordion group header
39
+ # @param [Hash] options All keys except +:open+ become html attributes for the accordion group
40
+ # @option options [true] :open Set to +true+ if you want this group initially open
41
+ # @yield Html contents of accordion group
42
+ # @yieldreturn [String] Html for accordion group contents
13
43
  def accordion_group(text, options={})
44
+ options = canonicalize_options(options)
45
+ open = options.delete(:open)
46
+
14
47
  options = ensure_accordion_group_id(options)
15
48
  @accordion_group_id = options[:id]
16
- open = options.delete(:open)
49
+
50
+ options = ensure_class(options, 'accordion-group')
17
51
 
18
- content_tag(:div, class: 'accordion-group') do
52
+ content_tag(:div, options) do
19
53
  accordion_group_heading(text) + accordion_group_body(open) { yield }
20
54
  end
21
55
  end
@@ -1,17 +1,14 @@
1
+ # Rails helper for producing Twitter Bootstrap badges
2
+ #
1
3
  # See: http://twitter.github.io/bootstrap/components.html#labels-badges
2
4
  #
3
- # Helper for producing Twitter Bootstrap badges
4
- #
5
5
  # Default badge:
6
6
  #
7
+ # @example
7
8
  # badge('Default')
8
9
  #
9
- # Other badges (see BADGE_TYPES):
10
- #
11
10
  # badge('Info', :info)
12
11
  #
13
- # Options passed through to <span> tag:
14
- #
15
12
  # badge('Warning', :warning, id: 'warn-id', class: 'more-class', my_key: 'my_value')
16
13
  #
17
14
  module Bootstrap::BadgeHelper
@@ -19,6 +16,19 @@ module Bootstrap::BadgeHelper
19
16
 
20
17
  BADGE_TYPES = %w(default success warning important info inverse)
21
18
 
19
+ # Returns html for a Bootstrap badge.
20
+ #
21
+ # @overload badge(text, options={})
22
+ # Returns html for +default+ badge
23
+ # @param [String] text Text of badge
24
+ # @param [Hash] options Html attributes for badge <span>
25
+ # @overload badge(text, badge_type, options={})
26
+ # Returns html for badge of type _badge_type_
27
+ # @param [String] text Text of badge
28
+ # @param [String, Symbol] badge_type one of BADGE_TYPES
29
+ # @param [Hash] options Html attributes for badge <span>
30
+ # @return [String] html for badge
31
+ # @raise [InvalidBadgeTypeError] When a badge type is passed and isn't one of the BADGE_TYPES
22
32
  def badge(*args)
23
33
  text = args.shift
24
34
  options = add_badge_classes(*args)
@@ -28,7 +38,7 @@ module Bootstrap::BadgeHelper
28
38
  private
29
39
 
30
40
  def add_badge_classes(*args)
31
- options = args.extract_options!
41
+ options = canonicalize_options(args.extract_options!)
32
42
  validate_badge_types(args)
33
43
  classes = ['badge'] + args.map { |arg| "badge-#{arg}" }
34
44
  ensure_class(options, classes)
@@ -1,43 +1,44 @@
1
1
  # Helper for producing Twitter Bootstrap buttons OR links that look like buttons.
2
- # See: http://twitter.github.io/bootstrap/base-css.html#buttons
3
2
  #
4
- # Default button:
3
+ # See:
4
+ # * http://twitter.github.io/bootstrap/base-css.html#buttons
5
+ # * http://twitter.github.io/bootstrap/components.html#buttonGroups
6
+ # * http://twitter.github.io/bootstrap/components.html#buttonDropdowns
7
+ # @example Button / Link
5
8
  #
6
- # button('Default') #=> <button class="btn">Default</button>
9
+ # # button
10
+ # button('Default')
7
11
  #
8
- # Pass in a url to make a link that looks like a button:
9
- #
10
- # button('Home', url: '/home') #=> <a href="/home" class="btn">Home</a>
11
- #
12
- # Or make a <button> look like a link:
12
+ # # add url option to make <a> styled as button
13
+ # button('Home', url: '/')
13
14
  #
15
+ # # a button styled as a link
14
16
  # button('Home', :link)
15
17
  #
16
- # Specify the type (see BUTTON_TYPES):
17
- #
18
+ # # give it a type; see BUTTON_TYPES
18
19
  # button('Info', :info)
19
20
  #
20
- # Specify the size (see BUTTON_SIZES)
21
- #
21
+ # # give it a size (see BUTTON_SIZES)
22
22
  # button('Small', :small)
23
23
  #
24
- # Options passed through to <span> tag:
25
- #
26
- # button('Warning', :warning, :large id: 'warn-id', class: 'more-class', my_key: 'my_value')
27
- #
28
- # Button groups/toolbars: http://twitter.github.io/bootstrap/components.html#buttonGroups
29
- #
30
- # = button_group do
31
- # = button("Left", "/left")
32
- # = button("Right", "/right")
33
- #
34
- # = button_toolbar do
35
- # = button('Single Button', '/single')
36
- # = button_group
37
- # = button('Group Button 1')
38
- # = button('Group Button 2')
39
- # = button('Another Single')
40
- #
24
+ # # size, type, additional class and additional html attributes
25
+ # button('Warning', :warning, :large, id: 'warn-id', class: 'more-class', my_key: 'my_value')
26
+ #
27
+ # @example Button Group
28
+ # <%= button_group do %>
29
+ # <%= button("Left", url: "/left") %>
30
+ # <%= button("Right", id: 'right') %>
31
+ # <% end %>
32
+ #
33
+ # @example Button Toolbar
34
+ # <%= button_toolbar do %>
35
+ # <%= button('Single Button', url: '/single') %>
36
+ # <%= button_group do %>
37
+ # <%= button('Group Button 1') %>
38
+ # <%= button('Group Button 2') %>
39
+ # <% end %>
40
+ # <%= button('Another Single') %>
41
+ # <% end %>
41
42
  module Bootstrap::ButtonHelper
42
43
  InvalidButtonModifierError = Class.new(StandardError)
43
44
 
@@ -47,9 +48,36 @@ module Bootstrap::ButtonHelper
47
48
 
48
49
  BUTTON_ALL = BUTTON_TYPES + BUTTON_SIZES + BUTTON_OTHERS
49
50
 
51
+ # Returns <button> or <a> styled as Bootstrap button
52
+ #
53
+ # @overload button(text, options={})
54
+ # Default button
55
+ # @param [String] text text of button
56
+ # @param [Hash] options All keys except +:url+ become html attributes for the generated tag
57
+ # @option options [String] :url if present, return a <a> styled as a button
58
+ # @overload button(text, type, options={})
59
+ # Button of type _type_
60
+ # @param [String] text text of button
61
+ # @param [String, Symbol] type type of button; see {Bootstrap::ButtonHelper::BUTTON_TYPES}
62
+ # @param [Hash] options All keys except +:url+ become html attributes for the generated tag
63
+ # @option options [String] :url if present, return a <a> styled as a button
64
+ # @overload button(text, size, options={})
65
+ # Button of size _size_
66
+ # @param [String] text text of button
67
+ # @param [String, Symbol] size size of button; see {Bootstrap::ButtonHelper::BUTTON_SIZES}
68
+ # @param [Hash] options All keys except +:url+ become html attributes for the generated tag
69
+ # @option options [String] :url if present, return a <a> styled as a button
70
+ # @overload button(text, type, size, options={})
71
+ # Button of type _type_, size _size_
72
+ # @param [String] text text of button
73
+ # @param [String, Symbol] type type of button; see {Bootstrap::ButtonHelper::BUTTON_TYPES}
74
+ # @param [String, Symbol] size size of button; see {Bootstrap::ButtonHelper::BUTTON_SIZES}
75
+ # @param [Hash] options All keys except +:url+ become html attributes for the generated tag
76
+ # @option options [String] :url if present, return a <a> styled as a button
77
+ # @return [String] Html for a <button> (or <a> if +url+ option passed in)
50
78
  def button(*args)
51
79
  text = args.shift
52
- options = args.extract_options!
80
+ options = canonicalize_options(args.extract_options!)
53
81
  href = options.delete(:url)
54
82
  options = add_button_classes(options, args)
55
83
 
@@ -60,28 +88,48 @@ module Bootstrap::ButtonHelper
60
88
  end
61
89
  end
62
90
 
63
- def button_toolbar
64
- content_tag(:div, class: 'btn-toolbar') do
91
+ # Returns a Bootstrap button toolbar
92
+ #
93
+ # @param [Hash] options will be come html attributes of generated <div>
94
+ # @yield block usually consists of calls to {Bootstrap::ButtonHelper#button} or {Bootstrap::ButtonHelper#button_group}
95
+ # @yieldreturn [String] html for contents of toolbar
96
+ #
97
+ # @return [String] html for button toolbar
98
+ def button_toolbar(options={})
99
+ options = canonicalize_options(options)
100
+ options = ensure_class(options, 'btn-toolbar')
101
+
102
+ content_tag(:div, options) do
65
103
  yield
66
104
  end
67
105
  end
68
106
 
69
- def button_group
70
- content_tag(:div, class: 'btn-group') do
107
+ # Returns a Bootstrap button group
108
+ #
109
+ # @param [Hash] options will be come html attributes of generated <div>
110
+ # @yield block usually consists of calls to {Bootstrap::ButtonHelper#button}
111
+ # @yieldreturn [String] html for contents of group
112
+ #
113
+ # @return [String] html for button group
114
+ def button_group(options={})
115
+ options = canonicalize_options(options)
116
+ options = ensure_class(options, 'btn-group')
117
+
118
+ content_tag(:div, options) do
71
119
  yield
72
120
  end
73
121
  end
74
122
 
123
+ def validate_button_types_and_sizes(types_and_sizes)
124
+ types_and_sizes.each { |e| raise(InvalidButtonModifierError, e.inspect) unless BUTTON_ALL.include?(e.to_s) }
125
+ end
126
+
75
127
  private
76
128
 
77
129
  def add_button_classes(options, button_types_and_sizes)
78
- validate_types_and_sizes(button_types_and_sizes)
130
+ validate_button_types_and_sizes(button_types_and_sizes)
79
131
  classes = ['btn'] + button_types_and_sizes.map { |e| "btn-#{e}" }
80
132
  ensure_class(options, classes)
81
133
  end
82
134
 
83
- def validate_types_and_sizes(types_and_sizes)
84
- types_and_sizes.each { |e| raise(InvalidButtonModifierError, e.inspect) unless BUTTON_ALL.include?(e.to_s) }
85
- end
86
-
87
135
  end
@@ -1,52 +1,73 @@
1
+ # Utililty methods used by Bootstrap::*Heler classes
1
2
  module Bootstrap::CommonHelper
2
3
  ArgumentError = Class.new(::ArgumentError)
3
4
 
4
- # Returns a new hash with the :class key's value converted to an
5
- # Array with each element converted to a String.
6
- #
7
- # arrayify_class({}) #=> {:class=>[]}
8
- # arrayify_class(:class => 'foo') #=> {:class=>["foo"]}
9
- # arrayify_class(:class => [:foo, 'bar']) #=> {:class=>["foo", "bar"]}
10
- def arrayify_class(hash)
5
+ # Returns a new Hash with:
6
+ # * keys converted to Symbols
7
+ # * the +:class+ key has it value converted to an Array of String
8
+ # @raise [ArgumentError] if _hash_ is not a Hash
9
+ # @return [Hash]
10
+ def canonicalize_options(hash)
11
11
  raise ArgumentError.new("expected a Hash, got #{hash.inspect}") unless hash.is_a?(Hash)
12
-
13
- return hash if hash[:class] == false
14
-
15
- hash.dup.tap do |h|
16
- classes = h[:class]
17
- h[:class] = case
18
- when classes.blank? then []
19
- when classes.is_a?(Array) then classes.dup
20
- else classes.to_s.split(/\s/)
21
- end
22
- h[:class].map!(&:to_s)
12
+
13
+ hash.symbolize_keys.tap do |h|
14
+ h[:class] = arrayify_class_and_stringify_elements(h[:class])
23
15
  end
24
16
  end
17
+
18
+ # Returns a new Array of String
19
+ # @example
20
+ # arrayify_class_and_stringify_elements(nil) #=> []
21
+ # arrayify_class_and_stringify_elements('foo') #=> ["foo"]
22
+ # arrayify_class_and_stringify_elements([:foo, 'bar']) #=> ["foo", "bar"]
23
+ # @return [Array of String]
24
+ def arrayify_class_and_stringify_elements(klass)
25
+ return false if klass == false
26
+
27
+ case
28
+ when klass.blank? then []
29
+ when klass.is_a?(Array) then klass
30
+ else klass.to_s.strip.split(/\s/)
31
+ end.map(&:to_s)
32
+ end
25
33
 
26
34
  # Returns down-caret character used in various dropdown menus.
35
+ # @param [Hash] options html options for <span>
36
+ # @example
37
+ # caret(id: 'my-id') #=> <span class='caret' id='my-id'></span>
38
+ # @return [String]
27
39
  def caret(options={})
40
+ options= canonicalize_options(options)
28
41
  options = ensure_class(options, 'caret')
29
42
  content_tag(:span, nil, options)
30
43
  end
31
44
 
32
- # Ensures that _hash_ has key of :class that includes _klass_.
45
+ # Returns new Hash where :class value includes _klasses_.
46
+ #
47
+ # Assumes _hash_ has a key :class (Symbol) whose value is an Array of String.
48
+ # {Bootstrap::CommonHelper#canonicalize_options} will return such a Hash.
33
49
  #
34
- # ensure_class({}, 'foo') #=> {class: 'foo'}
35
- # ensure_class({class: 'bar', id: 'my-id'}, 'foo') #=> {:class=>["bar", "foo"], :id=>"my-id"}
36
- def ensure_class(hash, klass)
37
- arrayify_class(hash).tap do |h|
38
- klasses = Array(klass).map(&:to_s)
39
- klasses.each do |k|
50
+ # @example
51
+ # ensure_class({class: []}, 'foo') #=> {class: 'foo'}
52
+ # ensure_class({class: ['bar'], id: 'my-id'}, ['foo', 'foo2']) #=> {:class=>["bar", "foo", "foo2"], :id=>"my-id"}
53
+ # @param [Hash] hash
54
+ # @param [String, Array] klasses one or more classes to add to the +:class+ key of _hash_
55
+ # @return [Hash]
56
+ def ensure_class(hash, klasses)
57
+ hash.dup.tap do |h|
58
+ Array(klasses).map(&:to_s).each do |k|
40
59
  h[:class] << k unless h[:class].include?(k)
41
60
  end
42
61
  end
43
62
  end
44
63
 
45
64
  # Returns extra arguments that are Bootstrap modifiers. Basically 2nd argument
46
- # up to (not including) the last (hash) argument.
65
+ # up to (not including) the last (Hash) argument.
47
66
  #
67
+ # @example
48
68
  # extract_extras('text') #=> []
49
69
  # extract_extras('text', :small, :info, id: 'foo') #=> [:small, :info]
70
+ # @return [Array]
50
71
  def extract_extras(*args)
51
72
  args.extract_options!
52
73
  args.shift
@@ -1,40 +1,66 @@
1
- # Helper methods for various Bootstrap dropdown menus
1
+ # Rails helper methods for various Bootstrap dropdown menus
2
2
  #
3
3
  # * http://twitter.github.io/bootstrap/components.html#buttonDropdowns
4
4
  # * http://twitter.github.io/bootstrap/components.html#navbar
5
5
  #
6
- # All of the *_dropdown methods should have dropdown_item() or dropdown_divider()
7
- # as children.
6
+ # @example nav dropdown
7
+ # <%= nav_dropdown('Admin') do %>
8
+ # <%= dropdown_item('Users', '/admin/users') %>
9
+ # <%= dropdown_item('Logs', '/admin/logs') %>
10
+ # <%= dropdown_divider %>
11
+ # <%= dropdown_item('Exceptions', '/admin/exceptions') %>
12
+ # <% end %>
8
13
  #
9
- # = nav_dropdown('Admin') do
10
- # = dropdown_item('Users', admin_users_path)
11
- # = dropdown_item('Logs', admin_logs_path)
12
- # = dropdown_divider
13
- # = dropdown_item('Exceptions', admin_exceptions_path)
14
+ # @example button dropdown
15
+ # <%= button_dropdown('Actions') do %>
16
+ # <%= dropdown_item('Action 1', '/action1') %>
17
+ # <%= dropdown_item('Action 2', '/action2') %>
18
+ # <% end %>
14
19
  #
15
- # = button_dropdown('Actions') do
16
- # / dropdown_items
17
- #
18
- # = split_button_dropdown('Edit', edit_user_path(@user)) do
19
- # / dropdown_items
20
+ # @example split-button dropdown
21
+ # <%= split_button_dropdown('Default', url: '/default') do %>
22
+ # <%= dropdown_item('Action 1', '/action1') %>
23
+ # <%= dropdown_item('Action 2', '/action2') %>
24
+ # <% end %>#
20
25
  #
21
26
  module Bootstrap::DropdownHelper
22
27
 
23
- # should be nested within a <ul class='nav'> tag
28
+ # Returns a drop-down menu of links
29
+ #
30
+ # Usually called from yielded block of {Bootstrap::NavHelper#nav_bar}
31
+ #
32
+ # @param [String] text text of dropdown link
33
+ # @yield yielded block is usually calls to {Bootstrap::NavHelper#dropdown_item} or {Bootstrap::NavHelper#dropdown_divider}
34
+ # @return [String] '<li class='dropdown'><ul class='dropdown-menu'> with contents of yielded block
24
35
  def nav_dropdown(text)
25
36
  content_tag(:li, class: 'dropdown') do
26
37
  nav_dropdown_link(text) + dropdown_ul { yield }
27
38
  end
28
39
  end
29
40
 
30
- # likely nested within button_toolbar
41
+ # Returns a Bootstrap button dropdown
42
+ #
43
+ # Parameters have same semantics as in {Bootstrap::ButtonHelper#button}
44
+ #
45
+ # @overload button_dropdown('Text')
46
+ # @overload button_dropdown('Text', :info)
47
+ # @overload button_dropdown('Text', :info, :mini)
48
+ # @yield yielded block is usually calls to {Bootstrap::NavHelper#dropdown_item} or {Bootstrap::NavHelper#dropdown_divider}# @return [String]
31
49
  def button_dropdown(*args)
32
50
  content_tag(:div, class: 'btn-group') do
33
51
  button_dropdown_link(*args) + dropdown_ul { yield }
34
52
  end
35
53
  end
36
54
 
37
- # likely nested within button_toolbar
55
+ # Returns a Bootstrap split-button dropdown
56
+ #
57
+ # Parameters have same semantics as in {Bootstrap::ButtonHelper#button}
58
+ #
59
+ # @overload split_button_dropdown('Text')
60
+ # @overload split_button_dropdown('Text', url: '/url')
61
+ # @overload split_button_dropdown('Text', :large, :danger, url: '/url')
62
+ # @yield yielded block is usually calls to {Bootstrap::NavHelper#dropdown_item} or {Bootstrap::NavHelper#dropdown_divider}
63
+ # @return [String]
38
64
  def split_button_dropdown(*args)
39
65
  extras = extract_extras(*args)
40
66
 
@@ -43,12 +69,11 @@ module Bootstrap::DropdownHelper
43
69
  end
44
70
  end
45
71
 
46
- # Must be nested under one of the *_dropdown methods:
47
- #
48
- # dropdown_item('Action', '/action')
49
- # dropdown_item('Action') # href set to 'javascript:void(0)'
50
- # dropdown_item('Action', id: 'foo') # options passed to <a> tag
72
+ # Returns a link for use within various *_dropdown methods
51
73
  #
74
+ # @overload dropdown_item('Text')
75
+ # @overload dropdown_item('Text', url: '/url')
76
+ # @return [String]
52
77
  def dropdown_item(*args)
53
78
  options = args.extract_options!
54
79
  text = args.shift or raise "Need text to link to"
@@ -59,7 +84,8 @@ module Bootstrap::DropdownHelper
59
84
  end
60
85
  end
61
86
 
62
- # Produces a line to divide sections of a dropdown menu
87
+ # Returns a divider for various dropdowns
88
+ # @return [String] <li class="divider">
63
89
  def dropdown_divider
64
90
  content_tag(:li, nil, class: 'divider')
65
91
  end
@@ -1,19 +1,59 @@
1
+ # Rails helper methods associated with forms for Bootstrap.
2
+ #
3
+ # @example +#submit_button_tag()+ instead of +#submit_button()+
4
+ # submit_button_tag
5
+ # submit_button_tag('Save')
6
+ # submit_button_tag('Delete', :danger)
7
+ # submit_button_tag('Big', :large)
8
+ # submit_button_tag('With Options', :small, :info, id: 'my-id')
1
9
  module Bootstrap::FormHelper
10
+ InvalidButtonModifierError = Class.new(StandardError)
2
11
 
3
- def submit_tag(value = "Save changes", options = {})
4
- options = arrayify_class(options.symbolize_keys)
5
-
6
- class_arg = Array(options.delete(:class)).map(&:to_s)
7
- classes = []
8
- classes << 'btn-primary' unless options.delete(:bootstrap) == false ||
9
- class_arg.detect { |e| e.starts_with?('btn-') }
10
- class_arg.each { |e| classes << e }
11
- classes << 'btn' if classes.detect { |e| e.starts_with?('btn-') }
12
- options = ensure_class(options, classes)
12
+ # Returns <input> similar to +#submit_tag()+ but:
13
+ # * styled like a Bootstrap button, type :primary
14
+ # * has +:disable_with+ set to "Processing ..."
15
+ # See {Bootstrap::ButtonHelper} for documentation on button type and size
16
+ # @overload submit_button_tag(options={})
17
+ # @param [Hash] options all options except +:disable_with+ become html attributes for <input> tag
18
+ # @option options [String, false] :disable_with either override or turn off the disabling of the button
19
+ # @overload submit_button_tag(text, options={})
20
+ # @param [String] text value of <input>
21
+ # @param [Hash] options see +options+ param in first method signature
22
+ # @overload submit_button_tag(text, type, options={})
23
+ # @param [String] text value of <input>
24
+ # @param [String, Symbol] type type of button
25
+ # @param [Hash] options see +options+ param in first method signature
26
+ # @overload submit_button_tag(text, size, options={})
27
+ # @param [String] text value of <input>
28
+ # @param [String, Symbol] size size of button
29
+ # @param [Hash] options see +options+ param in first method signature
30
+ # @overload submit_button_tag(text, type, size, options={})
31
+ # @param [String] text value of <input>
32
+ # @param [String, Symbol] type type of button
33
+ # @param [String, Symbol] size size of button
34
+ # @param [Hash] options see +options+ param in first method signature
35
+ # @return [String]
36
+ def submit_button_tag(*args)
37
+ options = canonicalize_options(args.extract_options!)
13
38
 
39
+ value = if Bootstrap::ButtonHelper::BUTTON_ALL.include?(args.first.to_s)
40
+ "Save changes"
41
+ else
42
+ args.shift.presence || "Save changes"
43
+ end
44
+
45
+ button_classes = if args.present?
46
+ args.each { |e| raise(InvalidButtonModifierError, e.inspect) unless
47
+ Bootstrap::ButtonHelper::BUTTON_ALL.include?(e.to_s) }
48
+ ['btn'] + args.map { |e| "btn-#{e}" }
49
+ else
50
+ ['btn', 'btn-primary']
51
+ end
52
+ options = ensure_class(options, button_classes)
53
+
14
54
  options[:disable_with] = "Processing ..." unless options.has_key?(:disable_with)
15
55
 
16
- super(value, options)
56
+ submit_tag(value, options)
17
57
  end
18
58
 
19
59
  end
@@ -0,0 +1,125 @@
1
+ # Rails view helpers for various Bootstrap navigation components.
2
+ #
3
+ # See: http://twitter.github.io/bootstrap/components.html#navbar
4
+ # @example navigation bar (across top of page)
5
+ # <%= nav_bar do %>
6
+ #
7
+ # <%= brand('Span Brand')%>
8
+ # <%= brand('Link Brand', url: '#')%>
9
+ #
10
+ # <%= nav_bar_links do %>
11
+ #
12
+ # <%= nav_bar_link('Active', '#', active: true) %>
13
+ # <%= nav_bar_link('Link1', '/link1') %>
14
+ #
15
+ # <%= nav_bar_divider %>
16
+ #
17
+ # <%= nav_dropdown('Foo') do %>
18
+ # <%= dropdown_item('One', 'foo')%>
19
+ # <% end %>
20
+ #
21
+ # <% end %>
22
+ # <% end %>
23
+ #
24
+ # @example navigation list (e.g., in sidebar)
25
+ # <%= nav_list(id: 'my') do %>
26
+ # <%= nav_list_header('Buttons & Labels') %>
27
+ # <%= dropdown_item('Buttons', 'butons')%>
28
+ # <%= dropdown_item('Labels', 'butons')%>
29
+ # <% end %>
30
+ module Bootstrap::NavHelper
31
+
32
+ # Returns a Bootstrap navigation bar
33
+ # @yield yield block usually consists of other {Bootstrap::NavHelper} helpers
34
+ # @yieldreturn the contents of the navigation bar
35
+ # @return [String]
36
+ def nav_bar()
37
+ content_tag(:header, class: 'navbar') do
38
+ content_tag(:nav, class: 'navbar-inner') do
39
+ yield
40
+ end
41
+ end
42
+ end
43
+
44
+ # Returns a Bootstrap brand element
45
+ #
46
+ # @param [String] text text of the brand
47
+ # @param [Hash] options except for +:url+, becomes html attributes of returned tag
48
+ # @option options [String] :url if present, returned tag is an <a> (else <span>)
49
+ # @return [String] <a> if +:url+ option present, else <span>
50
+ def brand(text, options = {})
51
+ options = canonicalize_options(options)
52
+ options = ensure_class(options, 'brand')
53
+ url = options.delete(:url)
54
+
55
+ if url.present?
56
+ link_to(text, url, options)
57
+ else
58
+ content_tag(:span, text, options)
59
+ end
60
+ end
61
+
62
+ # Returns <ul> for a group of nav bar links.
63
+ #
64
+ # Usually called in +yield+ block of {Bootstrap::NavHelper#nav_bar}
65
+ #
66
+ # @yield block usually consists of calls to {Bootstrap::NavHelper#nav_bar_link} and {Bootstrap::NavHelper#nav_bar_divider}
67
+ # @return [String] <div class='nav'> containing results of yielded block
68
+ def nav_bar_links(options={})
69
+ options = canonicalize_options(options)
70
+ options = ensure_class(options, 'nav')
71
+
72
+ content_tag(:div, options) do
73
+ yield
74
+ end
75
+ end
76
+
77
+ # Returns a nav_bar_link
78
+ #
79
+ # Usually called within yield block of {Bootstrap::NavHelper#nav_bar}
80
+ #
81
+ # @param [String] text text of link
82
+ # @param [String] url url of link
83
+ # @param [Hash] options except for +:active+, becomes html attributes of link
84
+ # @option options [true] :active if set to true, displays as inactive
85
+ # @return [String] returns <a> within <li>
86
+ def nav_bar_link(text, url, options={})
87
+ a_options = canonicalize_options(options)
88
+ active = a_options.delete(:active)
89
+
90
+ li_options = {class: ('active' if active)}
91
+
92
+ content_tag(:li, li_options) do
93
+ link_to(text, url, a_options)
94
+ end
95
+ end
96
+
97
+ # Returns divider (vertical bar) for separating items in a nav_bar
98
+ #
99
+ # @return [String] <li class="divider-vertical"></li>
100
+ def nav_bar_divider
101
+ content_tag(:li, nil, class: "divider-vertical")
102
+ end
103
+
104
+ # Returns nav list
105
+ #
106
+ # @param [Hash] options becomes html attributes of enclosing <div>
107
+ # @yield block consists of calls to {Bootstrap::NavHelper#nav_list_header} and {Bootstrap::NavHelper#dropdown_item}
108
+ # @return [String] <div class='well'><ul class='nav nav-list'> containg results of yielded block
109
+ def nav_list(options={})
110
+ options = canonicalize_options(options)
111
+ options = ensure_class(options, 'well')
112
+ content_tag(:div, options) do
113
+ content_tag(:ul, class: 'nav nav-list') do
114
+ yield
115
+ end
116
+ end
117
+ end
118
+
119
+ # Returns header for nav_list
120
+ # @param [String] text text of header
121
+ # @return [String]
122
+ def nav_list_header(text)
123
+ content_tag(:li, text, class: 'nav-header')
124
+ end
125
+ end
@@ -1,28 +1,32 @@
1
+ # Rails helper for producing Twitter Bootstrap labels. We use +#stamp()+ because +#label()+ is
2
+ # a standard Rails helper method.
3
+ #
1
4
  # See: http://twitter.github.io/bootstrap/components.html#labels-badges
2
5
  #
3
- # Helper for producing Twitter Bootstrap labels. We call them stamps because #label() is
4
- # a Rails helper method.
5
- #
6
- # Default label:
7
- #
6
+ # @example
8
7
  # stamp('Default')
9
- #
10
- # Other labels (see LABEL_TYPES):
11
- #
12
- # stamp('Info', :info)
13
- #
14
- # Options passed through to <span> tag:
15
- #
8
+ # stamp('Info', :info)
16
9
  # stamp('Warning', :warning, id: 'warn-id', class: 'more-class', my_key: 'my_value')
17
10
  #
18
11
  module Bootstrap::StampHelper
19
12
  InvalidStampTypeError = Class.new(StandardError)
20
13
 
21
14
  LABEL_TYPES = %w(default success warning important info inverse)
22
-
23
- # stamp('Text')
24
- # stamp('Text', :success) # see LABEL_TYPES
25
- # stamp('Text', :info, id: 'my-id') # options passed thru to <span>
15
+
16
+ #=> see {Bootstrap::StampHelper::LABEL_TYPES}
17
+
18
+ # Returns a Bootstrap label
19
+ #
20
+ # @overload stamp(text, options={})
21
+ # Returns a label of type :default
22
+ # @param [String] text text of the label
23
+ # @param [Hash] options html attributes for returned <span>
24
+ # @overload stamp(text, type, options={})
25
+ # Returns a label of type _type_
26
+ # @param [String] text text of the label
27
+ # @param [Symbol, String] type type of label see {Bootstrap::StampHelper::LABEL_TYPES}
28
+ # @param [Hash] options html attributes for returned <span>
29
+ # @return [String]
26
30
  def stamp(*args)
27
31
  text = args.shift
28
32
  options = add_label_classes(*args)
@@ -32,7 +36,7 @@ module Bootstrap::StampHelper
32
36
  private
33
37
 
34
38
  def add_label_classes(*args)
35
- options = args.extract_options!
39
+ options = canonicalize_options(args.extract_options!)
36
40
  validate_label_types(args)
37
41
  classes = ['label'] + args.map { |arg| "label-#{arg}" }
38
42
  ensure_class(options, classes)
@@ -1,3 +1,107 @@
1
1
  <h1>Examples</h1>
2
2
 
3
- <%= badge('Default') %>
3
+ <%= split_button_dropdown('Default', url: '/default') do %>
4
+ <%= dropdown_item('Action 1', '/action1') %>
5
+ <%= dropdown_item('Action 2', '/action2') %>
6
+ <% end %>
7
+
8
+ <%= button_dropdown('Actions foo', url: 'foo') do %>
9
+ <%= dropdown_item('Action 1', '/action1') %>
10
+ <%= dropdown_item('Action 2', '/action2') %>
11
+ <% end %>
12
+
13
+ <%= nav_dropdown('Admin') do %>
14
+ <%= dropdown_item('Users', 'admin_users_path') %>
15
+ <%= dropdown_item('Logs', 'admin_logs_path') %>
16
+ <%= dropdown_divider %>
17
+ <%= dropdown_item('Exceptions', 'admin_exceptions_path') %>
18
+ <% end %>
19
+
20
+
21
+ <%= button_group do %>
22
+ <%= button("Left", url: "/left") %>
23
+ <%= button("Right", id: 'right') %>
24
+ <% end %>
25
+
26
+ <%= button_toolbar do %>
27
+ <%= button('Single Button', url: '/single') %>
28
+ <%= button_group do %>
29
+ <%= button('Group Button 1') %>
30
+ <%= button('Group Button 2') %>
31
+ <% end %>
32
+ <%= button('Another Single') %>
33
+ <% end %>
34
+ #
35
+ <div>
36
+ <%= badge('Default') %>
37
+ </div><div>
38
+ <%= badge('Default') %>
39
+ </div><div>
40
+ <%= badge('Default') %>
41
+ </div><div>
42
+ <%= badge('Default') %>
43
+ </div><div>
44
+ <%= badge('Default') %>
45
+ </div><div>
46
+ <%= badge('Default') %>
47
+ </div><div>
48
+ <%= badge('Default') %>
49
+ </div><div>
50
+ <%= badge('Default') %>
51
+ </div><div>
52
+ <%= badge('Default') %>
53
+ </div><div>
54
+ <%= badge('Default') %>
55
+ </div><div>
56
+ <%= badge('Default') %>
57
+ </div><div>
58
+ <%= badge('Default') %>
59
+ </div><div>
60
+ <%= badge('Default') %>
61
+ </div><div>
62
+ <%= badge('Default') %>
63
+ </div><div>
64
+ <%= badge('Default') %>
65
+ </div><div>
66
+ <%= badge('Default') %>
67
+ </div><div>
68
+ <%= badge('Default') %>
69
+ </div><div>
70
+ <%= badge('Default') %>
71
+ </div><div>
72
+ <%= badge('Default') %>
73
+ </div><div>
74
+ <%= badge('Default') %>
75
+ </div><div>
76
+ <%= badge('Default') %>
77
+ </div><div>
78
+ <%= badge('Default') %>
79
+ </div><div>
80
+ <%= badge('Default') %>
81
+ </div><div>
82
+ <%= badge('Default') %>
83
+ </div><div>
84
+ <%= badge('Default') %>
85
+ </div><div>
86
+ <%= badge('Default') %>
87
+ </div><div>
88
+ <%= badge('Default') %>
89
+ </div><div>
90
+ <%= badge('Default') %>
91
+ </div><div>
92
+ <%= badge('Default') %>
93
+ </div><div>
94
+ <%= badge('Default') %>
95
+ </div><div>
96
+ <%= badge('Default') %>
97
+ </div><div>
98
+ <%= badge('Default') %>
99
+ </div><div>
100
+ <%= badge('Default') %>
101
+ </div><div>
102
+ <%= badge('Default') %>
103
+ </div><div>
104
+ <%= badge('Default') %>
105
+ </div><div>
106
+ <%= badge('Default') %>
107
+ </div>
@@ -1,3 +1,3 @@
1
1
  module BootstrapViewHelpers
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bootstrap-view-helpers
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.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: 2013-05-17 00:00:00.000000000 Z
12
+ date: 2013-05-18 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -27,6 +27,54 @@ dependencies:
27
27
  - - ! '>='
28
28
  - !ruby/object:Gem::Version
29
29
  version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: jquery-rails
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: sass-rails
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: '3.2'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '3.2'
62
+ - !ruby/object:Gem::Dependency
63
+ name: bootstrap-sass
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: 2.3.1.0
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: 2.3.1.0
30
78
  - !ruby/object:Gem::Dependency
31
79
  name: rspec-rails
32
80
  requirement: !ruby/object:Gem::Requirement
@@ -107,6 +155,38 @@ dependencies:
107
155
  - - ! '>='
108
156
  - !ruby/object:Gem::Version
109
157
  version: '0'
158
+ - !ruby/object:Gem::Dependency
159
+ name: yard
160
+ requirement: !ruby/object:Gem::Requirement
161
+ none: false
162
+ requirements:
163
+ - - ! '>='
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ type: :development
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ none: false
170
+ requirements:
171
+ - - ! '>='
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ - !ruby/object:Gem::Dependency
175
+ name: redcarpet
176
+ requirement: !ruby/object:Gem::Requirement
177
+ none: false
178
+ requirements:
179
+ - - ! '>='
180
+ - !ruby/object:Gem::Version
181
+ version: '0'
182
+ type: :development
183
+ prerelease: false
184
+ version_requirements: !ruby/object:Gem::Requirement
185
+ none: false
186
+ requirements:
187
+ - - ! '>='
188
+ - !ruby/object:Gem::Version
189
+ version: '0'
110
190
  description: Rails view helpers for Bootstrap
111
191
  email:
112
192
  - steve.downtown@gmail.com
@@ -121,6 +201,7 @@ files:
121
201
  - app/helpers/bootstrap/common_helper.rb
122
202
  - app/helpers/bootstrap/dropdown_helper.rb
123
203
  - app/helpers/bootstrap/form_helper.rb
204
+ - app/helpers/bootstrap/nav_helper.rb
124
205
  - app/helpers/bootstrap/stamp_helper.rb
125
206
  - app/views/bootstrap_view_helpers/index.html.erb
126
207
  - config/routes.rb
@@ -156,3 +237,4 @@ signing_key:
156
237
  specification_version: 3
157
238
  summary: Rails view helpers for Bootstrap
158
239
  test_files: []
240
+ has_rdoc: