bootstrap-view-helpers 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +38 -1
- data/app/controllers/bootstrap_view_helpers_controller.rb +1 -0
- data/app/helpers/bootstrap/common_helper.rb +22 -16
- data/app/helpers/bootstrap/form_helper.rb +45 -22
- data/app/helpers/bootstrap/icon_helper.rb +30 -0
- data/app/helpers/bootstrap/icon_renderer.rb +60 -0
- data/app/views/bootstrap_view_helpers/index.html.erb +15 -0
- data/lib/bootstrap-view-helpers.rb +1 -0
- data/lib/bootstrap-view-helpers/version.rb +1 -1
- metadata +4 -2
data/README.md
CHANGED
@@ -7,6 +7,8 @@ Includes support for:
|
|
7
7
|
* navigation
|
8
8
|
* nav bar
|
9
9
|
* nav list
|
10
|
+
* icons
|
11
|
+
* icons with text
|
10
12
|
* buttons
|
11
13
|
* `<button>`
|
12
14
|
* `<a>` styled as button
|
@@ -19,7 +21,8 @@ Includes support for:
|
|
19
21
|
* split-button dropdowns
|
20
22
|
* accordion
|
21
23
|
* form helpers
|
22
|
-
* submit_tag_button
|
24
|
+
* submit_tag_button
|
25
|
+
* cancel_tag_button
|
23
26
|
|
24
27
|
## Note
|
25
28
|
|
@@ -79,6 +82,30 @@ Complete [API documentation](http://rubydoc.info/gems/bootstrap-view-helpers/fra
|
|
79
82
|
<% end %>
|
80
83
|
```
|
81
84
|
|
85
|
+
### Icons
|
86
|
+
|
87
|
+
See: http://twitter.github.io/bootstrap/base-css.html#icons
|
88
|
+
|
89
|
+
Icons
|
90
|
+
```ruby
|
91
|
+
icon(:search)
|
92
|
+
icon(:search, :white)
|
93
|
+
icon(:search, :white, id: 'my-id')
|
94
|
+
```
|
95
|
+
|
96
|
+
Icons with Text
|
97
|
+
```ruby
|
98
|
+
icon(:search, 'Search')
|
99
|
+
icon(:remove, :white, 'Delete')
|
100
|
+
icon(:ok, 'Save', id: 'my-id')
|
101
|
+
```
|
102
|
+
|
103
|
+
Line up text when some have icons and some don't
|
104
|
+
```ruby
|
105
|
+
icon(:search, 'With icon') # shows search icon
|
106
|
+
icon(:blank, 'No icon') # no icon, text will aligin if icons are stacked
|
107
|
+
```
|
108
|
+
|
82
109
|
### Buttons
|
83
110
|
|
84
111
|
```ruby
|
@@ -194,4 +221,14 @@ submit_button_tag('Big', :large)
|
|
194
221
|
submit_button_tag('With Options', :small, :info, id: 'my-id')
|
195
222
|
```
|
196
223
|
|
224
|
+
#### cancel_tag_button
|
197
225
|
|
226
|
+
Convenience method for standard "Cancel" button. `<a>` tag styled as Bootstrap button.
|
227
|
+
|
228
|
+
```ruby
|
229
|
+
cancel_button_tag(url: '/') # => <a href="/" class="btn">Cancel</a>
|
230
|
+
cancel_button_tag('Go Back', url: '/')
|
231
|
+
cancel_button_tag(:info, url: '/')
|
232
|
+
cancel_button_tag(:large, url: '/')
|
233
|
+
cancel_button_tag('Return', :small, :warning, url: '/', id: 'my-id')
|
234
|
+
```
|
@@ -1,33 +1,40 @@
|
|
1
|
-
# Utililty methods used by Bootstrap::*
|
1
|
+
# Utililty methods used by Bootstrap::*Helper classes
|
2
2
|
module Bootstrap::CommonHelper
|
3
3
|
ArgumentError = Class.new(::ArgumentError)
|
4
4
|
|
5
5
|
# Returns a new Hash with:
|
6
6
|
# * keys converted to Symbols
|
7
|
-
# * the +:class+ key has
|
7
|
+
# * the +:class+ key has its value converted to an Array of String
|
8
|
+
# @example
|
9
|
+
# canonicalize_options("id" => "ID", "class" => "CLASS") # => {:id=>"ID", :class=>["CLASS"]}
|
10
|
+
# canonicalize_options(:class => 'one two') # => {:class=>["one", "two"]}
|
11
|
+
# canonicalize_options("class" => [:one, 2]) # => {:class=>["one", "2"]}
|
12
|
+
# @param [Hash] hash typically an +options+ param to a method call
|
8
13
|
# @raise [ArgumentError] if _hash_ is not a Hash
|
9
14
|
# @return [Hash]
|
10
15
|
def canonicalize_options(hash)
|
11
16
|
raise ArgumentError.new("expected a Hash, got #{hash.inspect}") unless hash.is_a?(Hash)
|
12
17
|
|
13
18
|
hash.symbolize_keys.tap do |h|
|
14
|
-
h[:class] =
|
19
|
+
h[:class] = arrayify_and_stringify_elements(h[:class])
|
15
20
|
end
|
16
21
|
end
|
17
22
|
|
18
|
-
# Returns a new Array of String
|
23
|
+
# Returns a new Array of String from _arg_.
|
19
24
|
# @example
|
20
|
-
#
|
21
|
-
#
|
22
|
-
#
|
25
|
+
# arrayify_and_stringify_elements(nil) #=> []
|
26
|
+
# arrayify_and_stringify_elements('foo') #=> ["foo"]
|
27
|
+
# arrayify_and_stringify_elements('foo bar') #=> ["foo", "bar"]
|
28
|
+
# arrayify_and_stringify_elements([:foo, 'bar']) #=> ["foo", "bar"]
|
29
|
+
# @param [String, Array] arg
|
23
30
|
# @return [Array of String]
|
24
|
-
def
|
25
|
-
return false if
|
31
|
+
def arrayify_and_stringify_elements(arg)
|
32
|
+
return false if arg == false
|
26
33
|
|
27
34
|
case
|
28
|
-
when
|
29
|
-
when
|
30
|
-
else
|
35
|
+
when arg.blank? then []
|
36
|
+
when arg.is_a?(Array) then arg
|
37
|
+
else arg.to_s.strip.split(/\s/)
|
31
38
|
end.map(&:to_s)
|
32
39
|
end
|
33
40
|
|
@@ -42,11 +49,8 @@ module Bootstrap::CommonHelper
|
|
42
49
|
content_tag(:span, nil, options)
|
43
50
|
end
|
44
51
|
|
45
|
-
# Returns new Hash where :class value includes _klasses_.
|
52
|
+
# Returns new (canonicalized) Hash where :class value includes _klasses_.
|
46
53
|
#
|
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.
|
49
|
-
#
|
50
54
|
# @example
|
51
55
|
# ensure_class({class: []}, 'foo') #=> {class: 'foo'}
|
52
56
|
# ensure_class({class: ['bar'], id: 'my-id'}, ['foo', 'foo2']) #=> {:class=>["bar", "foo", "foo2"], :id=>"my-id"}
|
@@ -54,6 +58,8 @@ module Bootstrap::CommonHelper
|
|
54
58
|
# @param [String, Array] klasses one or more classes to add to the +:class+ key of _hash_
|
55
59
|
# @return [Hash]
|
56
60
|
def ensure_class(hash, klasses)
|
61
|
+
canonicalize_options(hash)
|
62
|
+
|
57
63
|
hash.dup.tap do |h|
|
58
64
|
Array(klasses).map(&:to_s).each do |k|
|
59
65
|
h[:class] << k unless h[:class].include?(k)
|
@@ -1,37 +1,60 @@
|
|
1
1
|
# Rails helper methods associated with forms for Bootstrap.
|
2
2
|
#
|
3
|
-
# @example
|
4
|
-
#
|
5
|
-
#
|
6
|
-
#
|
7
|
-
#
|
8
|
-
#
|
3
|
+
# @example Bootstrap form-actions <div>
|
4
|
+
# <div class='form-actions'>
|
5
|
+
# <%= submit_button_tag %>
|
6
|
+
# <%= cancel_button_tag %>
|
7
|
+
# </div>
|
8
|
+
#
|
9
9
|
module Bootstrap::FormHelper
|
10
|
+
ArgumentError = Class.new(StandardError)
|
10
11
|
InvalidButtonModifierError = Class.new(StandardError)
|
11
12
|
|
12
|
-
#
|
13
|
+
# Convenience method for standard "Cancel" button.
|
14
|
+
#
|
15
|
+
# The +text, type,+ and +size+ arguments are all optional.
|
16
|
+
#
|
17
|
+
# Has same semantics as calls to {Bootstrap::ButtonHelper#button} except:
|
18
|
+
# * text defaults to "Cancel"
|
19
|
+
# * +:url+ option is required
|
20
|
+
# @example
|
21
|
+
# cancel_button_tag(url: '/')
|
22
|
+
# cancel_button_tag('Go Back', url: '/')
|
23
|
+
# cancel_button_tag(:info, url: '/')
|
24
|
+
# cancel_button_tag(:large, url: '/')
|
25
|
+
# cancel_button_tag('Return', :small, :warning, url: '/', id: 'my-id')
|
26
|
+
# @overload cancel_button_tag(text, type, size, options={})
|
27
|
+
# @param [String] text text of link
|
28
|
+
# @param [Symbol] type type of button
|
29
|
+
# @param [Symbol] size size of button
|
30
|
+
# @param [Hash] options All keys except +:url+ become html attributes of the <a> tag
|
31
|
+
# @option options [String] :url required
|
32
|
+
# @return [String] <a> tag styled as Bootstrap button
|
33
|
+
def cancel_button_tag(*args)
|
34
|
+
options = canonicalize_options(args.extract_options!)
|
35
|
+
raise(ArgumentError, "must pass a :url option") unless options.has_key?(:url)
|
36
|
+
options = ensure_class(options, 'btn')
|
37
|
+
|
38
|
+
args.map!(&:to_s)
|
39
|
+
args.unshift("Cancel") if args.all? { |e| ::Bootstrap::ButtonHelper::BUTTON_ALL.include?(e) }
|
40
|
+
|
41
|
+
button(*args, options)
|
42
|
+
end
|
43
|
+
|
44
|
+
# Returns <input> similar to +#submit_tag()+ but: x
|
13
45
|
# * styled like a Bootstrap button, type :primary
|
14
46
|
# * has +:disable_with+ set to "Processing ..."
|
15
47
|
# See {Bootstrap::ButtonHelper} for documentation on button type and size
|
16
|
-
#
|
17
|
-
#
|
18
|
-
#
|
19
|
-
#
|
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
|
48
|
+
# submit_button_tag('Save')
|
49
|
+
# submit_button_tag('Delete', :danger)
|
50
|
+
# submit_button_tag('Big', :large)
|
51
|
+
# submit_button_tag('With Options', :small, :info, id: 'my-id')
|
30
52
|
# @overload submit_button_tag(text, type, size, options={})
|
31
53
|
# @param [String] text value of <input>
|
32
54
|
# @param [String, Symbol] type type of button
|
33
55
|
# @param [String, Symbol] size size of button
|
34
|
-
# @param [Hash] options
|
56
|
+
# @param [Hash] options all options except +:disable_with+ become html attributes for <input> tag
|
57
|
+
# @option options [String, false] :disable_with either override or turn off the disabling of the button
|
35
58
|
# @return [String]
|
36
59
|
def submit_button_tag(*args)
|
37
60
|
options = canonicalize_options(args.extract_options!)
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# Helper methods for Bootstrap icons.
|
2
|
+
#
|
3
|
+
# See: http://twitter.github.io/bootstrap/base-css.html#icons
|
4
|
+
#
|
5
|
+
# @example Icons
|
6
|
+
# icon(:search)
|
7
|
+
# icon(:search, :white)
|
8
|
+
# icon(:search, :white, id: 'my-id')
|
9
|
+
#
|
10
|
+
# @example Icons with text
|
11
|
+
# icon(:search, 'Search')
|
12
|
+
# icon(:remove, :white, 'Delete')
|
13
|
+
# icon(:ok, 'Save', id: 'my-id')
|
14
|
+
#
|
15
|
+
# @example Text without icon
|
16
|
+
# # so text lines up when you have text but no icon
|
17
|
+
# icon(:blank, 'No icon')
|
18
|
+
module Bootstrap::IconHelper
|
19
|
+
|
20
|
+
# Returns a Bootstrap icon glyph.
|
21
|
+
#
|
22
|
+
# Optionally returns text with icon.
|
23
|
+
#
|
24
|
+
# See class documentation (above) for examples.
|
25
|
+
# @return [String]
|
26
|
+
def icon(*args)
|
27
|
+
::Bootstrap::IconRenderer.new(self, *args).html
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# @private
|
2
|
+
class Bootstrap::IconRenderer
|
3
|
+
ArgumentError = Class.new(StandardError)
|
4
|
+
|
5
|
+
delegate :canonicalize_options, :content_tag, :ensure_class, :h, to: :template
|
6
|
+
attr_accessor :template, :options, :args, :text
|
7
|
+
|
8
|
+
def initialize(template, *args)
|
9
|
+
self.template = template
|
10
|
+
process_arguments(args)
|
11
|
+
end
|
12
|
+
|
13
|
+
def html
|
14
|
+
icon_tag.tap do |tag|
|
15
|
+
tag << text if text.present?
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def icon_tag
|
22
|
+
content_tag(:i, nil, options)
|
23
|
+
end
|
24
|
+
|
25
|
+
def process_arguments(args)
|
26
|
+
self.options = canonicalize_options(args.extract_options!)
|
27
|
+
self.args = args.map { |e| e.to_s }
|
28
|
+
|
29
|
+
process_icon_type
|
30
|
+
process_icon_white
|
31
|
+
process_text
|
32
|
+
end
|
33
|
+
|
34
|
+
def process_icon_type
|
35
|
+
icon_type = args.shift.presence or raise(ArgumentError, "must pass an icon type")
|
36
|
+
icon_class = icon_type == 'blank' ? 'icon-search' : "icon-#{icon_type}"
|
37
|
+
self.options = ensure_class(self.options, icon_class)
|
38
|
+
|
39
|
+
if icon_type == 'blank'
|
40
|
+
options[:style] = [options[:style], 'opacity: 0'].map(&:presence).compact.join('; ')
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def process_icon_white
|
45
|
+
if args.delete('white')
|
46
|
+
self.options = ensure_class(options, "icon-white")
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def process_text
|
51
|
+
self.text = if args.size == 0
|
52
|
+
nil
|
53
|
+
elsif args.size == 1
|
54
|
+
h(" #{args.first}")
|
55
|
+
else
|
56
|
+
raise ArgumentError, 'too many arguments'
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
@@ -1,5 +1,20 @@
|
|
1
1
|
<h1>Examples</h1>
|
2
2
|
|
3
|
+
<p>
|
4
|
+
<%= icon('search') %>
|
5
|
+
<%= stamp(icon('search', :white))%>
|
6
|
+
<%= stamp(icon('search', 'white', 'Search'))%>
|
7
|
+
</p>
|
8
|
+
<p>
|
9
|
+
<%= stamp(icon(:remove, :white, 'Delete'), :important)%>
|
10
|
+
<br />
|
11
|
+
<%= stamp(icon(:spacer, :white, 'Spacer'), :important)%>
|
12
|
+
</p>
|
13
|
+
<p>
|
14
|
+
<%= stamp(icon(:remove, 'Delete'), :important)%>
|
15
|
+
<br />
|
16
|
+
<%= stamp(icon(:spacer, 'Spacer'), :important)%>
|
17
|
+
</p>
|
3
18
|
<%= split_button_dropdown('Default', url: '/default') do %>
|
4
19
|
<%= dropdown_item('Action 1', '/action1') %>
|
5
20
|
<%= dropdown_item('Action 2', '/action2') %>
|
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.
|
4
|
+
version: 0.0.6
|
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-
|
12
|
+
date: 2013-05-20 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -201,6 +201,8 @@ files:
|
|
201
201
|
- app/helpers/bootstrap/common_helper.rb
|
202
202
|
- app/helpers/bootstrap/dropdown_helper.rb
|
203
203
|
- app/helpers/bootstrap/form_helper.rb
|
204
|
+
- app/helpers/bootstrap/icon_helper.rb
|
205
|
+
- app/helpers/bootstrap/icon_renderer.rb
|
204
206
|
- app/helpers/bootstrap/nav_helper.rb
|
205
207
|
- app/helpers/bootstrap/stamp_helper.rb
|
206
208
|
- app/views/bootstrap_view_helpers/index.html.erb
|