bh 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +5 -0
- data/.rspec +3 -0
- data/CHANGELOG.md +11 -0
- data/Gemfile +1 -0
- data/{LICENSE.txt → MIT-LICENSE} +1 -1
- data/README.md +176 -15
- data/Rakefile +11 -1
- data/TODO.md +298 -0
- data/bh.gemspec +18 -6
- data/lib/bh.rb +3 -1
- data/lib/bh/helpers/alert_helper.rb +83 -0
- data/lib/bh/helpers/url_helper.rb +24 -0
- data/lib/bh/railtie.rb +11 -0
- data/lib/bh/version.rb +1 -1
- data/spec/helpers/alert_helper_spec.rb +81 -0
- data/spec/helpers/url_helper_spec.rb +31 -0
- data/spec/spec_helper.rb +15 -0
- metadata +112 -15
- data/HISTORY.md +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e69edccfc681f4a4d24ba2d5212ab4f609b7f15e
|
4
|
+
data.tar.gz: e9cb987e0b6d6dbf58342169d5cb37088167a93f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4b20a81f7e2b445f9fc263b80c5a72f1f3a72caafaa562752129f72843bf67b0424d2ef6bfddee5c2d3abdb737bd926c70d31adcb50f2cd668fe85402b9c5c58
|
7
|
+
data.tar.gz: 891b720e5fb99e30003fc13410956750d862c71089fc3eb19e2ebe3147ae099d402f47084a5324f342c5dd0169eab2d8abcb180a7b047688d876f36368a39232
|
data/.gitignore
CHANGED
data/.rspec
ADDED
data/CHANGELOG.md
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
# Changelog
|
2
|
+
|
3
|
+
All notable changes to this project will be documented in this file.
|
4
|
+
|
5
|
+
For more information about changelogs, check
|
6
|
+
[Keep a Changelog](http://keepachangelog.com) and
|
7
|
+
[Vandamme](http://tech-angels.github.io/vandamme).
|
8
|
+
|
9
|
+
## 0.0.2 - 2014-08-15
|
10
|
+
|
11
|
+
* [FEATURE] Add `alert_box` helper
|
data/Gemfile
CHANGED
data/{LICENSE.txt → MIT-LICENSE}
RENAMED
data/README.md
CHANGED
@@ -1,25 +1,186 @@
|
|
1
|
-
|
1
|
+
Bh - Bootstrap Helpers
|
2
|
+
======================
|
2
3
|
|
3
|
-
|
4
|
+
Bh provides a set of powerful helpers that streamlines the use of
|
5
|
+
[Bootstrap components](http://getbootstrap.com/components) in Rails views.
|
4
6
|
|
5
|
-
|
7
|
+
Bootstrap is a great framework, but requires to write many lines of HTML code
|
8
|
+
even for simple components.
|
9
|
+
For instance, you need to write the following HTML to show a _dismissible alert_:
|
6
10
|
|
7
|
-
|
11
|
+
```html
|
12
|
+
<div class="alert alert-info alert-dismissible" role="alert">
|
13
|
+
<button type="button" class="close" data-dismiss="alert">
|
14
|
+
<span aria-hidden="true">×</span>
|
15
|
+
<span class="sr-only">Close</span>
|
16
|
+
</button>
|
17
|
+
You accepted the Terms of service.
|
18
|
+
</div>
|
19
|
+
```
|
8
20
|
|
9
|
-
|
21
|
+
Writing this for every _dismissible alert_ in a web site is cumbersome,
|
22
|
+
repetitive, and prone to errors.
|
10
23
|
|
11
|
-
|
24
|
+
Bh offers a solution to this problem by means of a set of helper methods.
|
25
|
+
The example above can be with just one line of code:
|
12
26
|
|
13
|
-
|
27
|
+
```erb
|
28
|
+
<%= alert_box 'You accepted the Terms of service.', dismissible: true %>
|
29
|
+
```
|
14
30
|
|
15
|
-
|
31
|
+
`alert_box` is only of the helpers provided by Bh and described below.
|
32
|
+
You can use only the ones you need and even mix-and-match the "standard way"
|
33
|
+
of writing Bootstrap components (many HTML lines) with the "Bh way".
|
16
34
|
|
17
|
-
|
35
|
+
How to install
|
36
|
+
==============
|
18
37
|
|
19
|
-
|
38
|
+
Bh is meant to be included in Rails apps by adding this line to the Gemfile:
|
20
39
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
40
|
+
gem 'bh', '~> 0.0.2'
|
41
|
+
|
42
|
+
Since the gem follows [Semantic Versioning](http://semver.org),
|
43
|
+
indicating the full version in your Gemfile (~> *major*.*minor*.*patch*)
|
44
|
+
guarantees that your project won’t occur in any error when you `bundle update`
|
45
|
+
and a new version of Bh is released.
|
46
|
+
|
47
|
+
Adding 'bh' to your Gemfile is all you need!
|
48
|
+
From now on, you will be able to use any of the following Bh helpers in your Rails views.
|
49
|
+
|
50
|
+
The `alert_box` helper
|
51
|
+
======================
|
52
|
+
|
53
|
+
To include [Boostrap alert boxes](http://getbootstrap.com/components/#alerts)
|
54
|
+
in your Rails views, you can use the [alert_box](#doc) helper.
|
55
|
+
Here are some examples.
|
56
|
+
|
57
|
+
Basic alerts
|
58
|
+
------------
|
59
|
+
|
60
|
+
```erb
|
61
|
+
<%= alert_box 'You accepted the Terms of service.' %>
|
62
|
+
```
|
63
|
+
|
64
|
+
will generate the HTML to render an "info" alert:
|
65
|
+
|
66
|
+
```html
|
67
|
+
<div class="alert alert-info" role="alert">You accepted the Terms of service.</div>
|
68
|
+
```
|
69
|
+
|
70
|
+
![alert-basic](https://cloud.githubusercontent.com/assets/7408595/3936904/7c1c419c-24a7-11e4-9910-6452ab334c09.png)
|
71
|
+
|
72
|
+
Dismissible alerts
|
73
|
+
------------------
|
74
|
+
|
75
|
+
```erb
|
76
|
+
<%= alert_box 'You accepted the Terms of service.', dismissible: true %>
|
77
|
+
```
|
78
|
+
|
79
|
+
will generate the HTML to render an alert with an '×' to close it:
|
80
|
+
|
81
|
+
```html
|
82
|
+
<div class="alert alert-info" role="alert">
|
83
|
+
<button class="close" data-dismiss="alert" type="button">
|
84
|
+
<span aria-hidden="true">×</span><span class="sr-only">Close</span>
|
85
|
+
</button>
|
86
|
+
You accepted the Terms of service.
|
87
|
+
</div>
|
88
|
+
```
|
89
|
+
|
90
|
+
![alert-dismissible](https://cloud.githubusercontent.com/assets/7408595/3936901/7c107b00-24a7-11e4-8265-2752a630357a.png)
|
91
|
+
|
92
|
+
Contextual alerts
|
93
|
+
-----------------
|
94
|
+
|
95
|
+
```erb
|
96
|
+
<%= alert_box 'You accepted the Terms of service.', context: :success %>
|
97
|
+
```
|
98
|
+
|
99
|
+
will generate the HTML to render a "success" alert (green background):
|
100
|
+
|
101
|
+
```html
|
102
|
+
<div class="alert alert-success" role="alert">You accepted the Terms of service.</div>
|
103
|
+
```
|
104
|
+
|
105
|
+
Available contexts are `:success`, `:info` (default), `:warning`, `:danger`.
|
106
|
+
|
107
|
+
![alert-success](https://cloud.githubusercontent.com/assets/7408595/3936902/7c182a44-24a7-11e4-9f8b-7c381662128b.png)
|
108
|
+
|
109
|
+
Priority alerts
|
110
|
+
---------------
|
111
|
+
|
112
|
+
Since a common use of alert boxes in Rails applications is to display
|
113
|
+
[flash messages](http://api.rubyonrails.org/classes/ActionDispatch/Flash/FlashHash.html),
|
114
|
+
the `alert_box` helper accepts the priority of the flash message as an option.
|
115
|
+
|
116
|
+
```erb
|
117
|
+
<%= alert_box 'You accepted the Terms of service.', priority: :notice %>
|
118
|
+
```
|
119
|
+
|
120
|
+
will generate the HTML to render a dismissible "success" alert (green background):
|
121
|
+
|
122
|
+
```html
|
123
|
+
<div class="alert alert-success" role="alert">
|
124
|
+
<button class="close" data-dismiss="alert" type="button">
|
125
|
+
<span aria-hidden="true">×</span><span class="sr-only">Close</span>
|
126
|
+
</button>
|
127
|
+
You accepted the Terms of service.
|
128
|
+
</div>
|
129
|
+
```
|
130
|
+
|
131
|
+
Available priorities are `:alert`, `:notice`.
|
132
|
+
|
133
|
+
![alert-success-dismissible](https://cloud.githubusercontent.com/assets/7408595/3936900/7c0bdbcc-24a7-11e4-9b49-93468b7dc738.png)
|
134
|
+
|
135
|
+
Complex alerts
|
136
|
+
--------------
|
137
|
+
|
138
|
+
```erb
|
139
|
+
<%= alert_box context: :success, dismissible: true do %>
|
140
|
+
<strong>Thanks!</strong> You accepted the <%= link_to 'Terms of service', '/terms' %>.
|
141
|
+
<% end %>
|
142
|
+
```
|
143
|
+
|
144
|
+
will generate the HTML to render a dismissible "success" alert that includes
|
145
|
+
highlighted text and appropriately styled links:
|
146
|
+
|
147
|
+
```html
|
148
|
+
<div class="alert alert-success" role="alert">
|
149
|
+
<button class="close" data-dismiss="alert" type="button">
|
150
|
+
<span aria-hidden="true">×</span><span class="sr-only">Close</span>
|
151
|
+
</button>
|
152
|
+
<strong>Thanks!</strong> You accepted the <a href="/terms" class="alert-link">Terms of service</a>.
|
153
|
+
</div>
|
154
|
+
```
|
155
|
+
|
156
|
+
![alert-complex](https://cloud.githubusercontent.com/assets/7408595/3936903/7c1b70f0-24a7-11e4-95ee-11f6920ddd4d.png)
|
157
|
+
|
158
|
+
|
159
|
+
How to release new versions
|
160
|
+
===========================
|
161
|
+
|
162
|
+
If you are a manager of this project, remember to upgrade the [Bh gem](http://rubygems.org/gems/bh)
|
163
|
+
whenever a new feature is added or a bug gets fixed.
|
164
|
+
|
165
|
+
Make sure all the tests are passing on [Travis CI](https://travis-ci.org/Fullscreen/bh),
|
166
|
+
document the changes in CHANGELOG.md and README.md, bump the version, then run
|
167
|
+
|
168
|
+
rake release
|
169
|
+
|
170
|
+
Remember that the bh gem follows [Semantic Versioning](http://semver.org).
|
171
|
+
Any new release that is fully backward-compatible should bump the *patch* version (0.0.x).
|
172
|
+
Any new version that breaks compatibility should bump the *minor* version (0.x.0)
|
173
|
+
|
174
|
+
How to contribute
|
175
|
+
=================
|
176
|
+
|
177
|
+
Bh needs your support!
|
178
|
+
|
179
|
+
If you find that a method is missing, fork the project, add the missing code,
|
180
|
+
write the appropriate tests, then submit a pull request, and it will gladly
|
181
|
+
be merged! If you need an inspiration, look at the TODO.md file.
|
182
|
+
|
183
|
+
To run the tests, simply type `rspec` on the command line.
|
184
|
+
|
185
|
+
Don’t hesitate to send code comments, issues or pull requests through GitHub
|
186
|
+
and to spread the love. Thanks! :)
|
data/Rakefile
CHANGED
data/TODO.md
ADDED
@@ -0,0 +1,298 @@
|
|
1
|
+
|
2
|
+
Modals
|
3
|
+
======
|
4
|
+
|
5
|
+
Use the `modal` helper to insert a button that will toggle any type of
|
6
|
+
[modal](http://getbootstrap.com/javascript/#modals) provided by Bootstrap.
|
7
|
+
|
8
|
+
Basic modals
|
9
|
+
------------
|
10
|
+
|
11
|
+
```erb
|
12
|
+
<%= modal 'Click to toggle a modal', 'I am the content of the modal' %>
|
13
|
+
```
|
14
|
+
|
15
|
+
will generate the HTML to render a button that, when clicked, will toggle
|
16
|
+
a modal with some simple text:
|
17
|
+
|
18
|
+
```html
|
19
|
+
<button class="btn btn-primary" data-toggle="modal" data-target="#myModal">
|
20
|
+
Click to toggle a modal
|
21
|
+
</button>
|
22
|
+
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
|
23
|
+
<div class="modal-dialog">
|
24
|
+
<div class="modal-content">
|
25
|
+
<div class="modal-body">
|
26
|
+
I am the content of the modal
|
27
|
+
</div>
|
28
|
+
</div>
|
29
|
+
</div>
|
30
|
+
</div>
|
31
|
+
```
|
32
|
+
|
33
|
+
Complex modals
|
34
|
+
--------------
|
35
|
+
|
36
|
+
```erb
|
37
|
+
<%= modal 'Delete account', title: 'Confirm your action', dismissible: true, context: :danger, button_class: 'btn-sm', modal_class: 'modal-sm' do %>
|
38
|
+
You are about to delete your account. Would you like to proceed?
|
39
|
+
<%= footer do %>
|
40
|
+
<button class="btn btn-danger">Yes, delete my account</button>
|
41
|
+
<% end %>
|
42
|
+
<% end %>
|
43
|
+
|
44
|
+
will generate the HTML to render a small "danger" (red) button that, when
|
45
|
+
clicked, will toggle a small, dismissible modal with a title, some text, and a
|
46
|
+
footer with a call-to-action:
|
47
|
+
|
48
|
+
```html
|
49
|
+
<button class="btn btn-danger btn-sm" data-toggle="modal" data-target="#myModal">
|
50
|
+
Delete account
|
51
|
+
</button>
|
52
|
+
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
|
53
|
+
<div class="modal-dialog modal-sm">
|
54
|
+
<div class="modal-content">
|
55
|
+
<div class="modal-header">
|
56
|
+
<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span class="sr-only">Close</span></button>
|
57
|
+
<h4 class="modal-title" id="mySmallModalLabel">Confirm your action</h4>
|
58
|
+
</div>
|
59
|
+
<div class="modal-body">
|
60
|
+
You are about to delete your account. Would you like to proceed?
|
61
|
+
</div>
|
62
|
+
<div class="modal-footer">
|
63
|
+
<button class="btn btn-danger">Yes, delete my account</button>
|
64
|
+
</div>
|
65
|
+
</div>
|
66
|
+
</div>
|
67
|
+
</div>
|
68
|
+
```
|
69
|
+
|
70
|
+
Panels
|
71
|
+
======
|
72
|
+
|
73
|
+
Use the `panel` helper to insert any type of
|
74
|
+
[panel](http://getbootstrap.com/components/#panels) provided by Bootstrap.
|
75
|
+
|
76
|
+
Basic panels
|
77
|
+
------------
|
78
|
+
|
79
|
+
```erb
|
80
|
+
<%= panel 'You have the right to remain silent...' %>
|
81
|
+
```
|
82
|
+
|
83
|
+
will generate the HTML to render a basic panel:
|
84
|
+
|
85
|
+
```html
|
86
|
+
<div class="panel panel-default">
|
87
|
+
<div class="panel-body">
|
88
|
+
You have the right to remain silent...
|
89
|
+
</div>
|
90
|
+
</div>
|
91
|
+
```
|
92
|
+
|
93
|
+
Panels with title
|
94
|
+
-----------------
|
95
|
+
|
96
|
+
```erb
|
97
|
+
<%= panel 'You have the right to remain silent...', title: 'Your rights' %>
|
98
|
+
```
|
99
|
+
|
100
|
+
will generate the HTML to render a panel with a simple title header:
|
101
|
+
|
102
|
+
```html
|
103
|
+
<div class="panel panel-default">
|
104
|
+
<div class="panel-heading">
|
105
|
+
<h2 class="panel-title">Your rights</h2>
|
106
|
+
</div>
|
107
|
+
<div class="panel-body">
|
108
|
+
You have the right to remain silent...
|
109
|
+
</div>
|
110
|
+
</div>
|
111
|
+
```
|
112
|
+
|
113
|
+
Body and title can be passed as blocks if they are more than plain text:
|
114
|
+
|
115
|
+
```erb
|
116
|
+
<%= panel do %>
|
117
|
+
<strong>Hey!</strong> You have the right to remain silent...
|
118
|
+
<%= title tag: :h3, do %>
|
119
|
+
<strong>Your rights</strong> (from our <%= link_to '/terms', 'Terms of service' %>)
|
120
|
+
<% end %>
|
121
|
+
<% end %>
|
122
|
+
```
|
123
|
+
|
124
|
+
will generate
|
125
|
+
|
126
|
+
```html
|
127
|
+
<div class="panel panel-info">
|
128
|
+
<div class="panel-heading">
|
129
|
+
<h3 class="panel-title">
|
130
|
+
<strong>Your rights</strong> (from our <a href="/terms">Terms of service</a>)
|
131
|
+
</h2>
|
132
|
+
</div>
|
133
|
+
<div class="panel-body">
|
134
|
+
<strong>Hey!</strong> You have the right to remain silent...
|
135
|
+
</div>
|
136
|
+
</div>
|
137
|
+
```
|
138
|
+
|
139
|
+
Contextual panels
|
140
|
+
-----------------
|
141
|
+
|
142
|
+
```erb
|
143
|
+
<%= panel 'You have the right to remain silent...', title: 'Your rights', context: :warning %>
|
144
|
+
```
|
145
|
+
|
146
|
+
will generate the HTML to render a "warning" (orange border) panel:
|
147
|
+
|
148
|
+
```html
|
149
|
+
<div class="panel panel-warning">
|
150
|
+
<div class="panel-heading">
|
151
|
+
<h2 class="panel-title">
|
152
|
+
Your rights
|
153
|
+
</h2>
|
154
|
+
</div>
|
155
|
+
<div class="panel-body">
|
156
|
+
You have the right to remain silent...
|
157
|
+
</div>
|
158
|
+
</div>
|
159
|
+
```
|
160
|
+
|
161
|
+
Panels with footer
|
162
|
+
------------------
|
163
|
+
|
164
|
+
```erb
|
165
|
+
<%= panel do %>
|
166
|
+
You have the right to remain silent...
|
167
|
+
<%= footer do %>
|
168
|
+
<button class="btn btn-primary">Accept</button>
|
169
|
+
<% end %>
|
170
|
+
<% end %>
|
171
|
+
```
|
172
|
+
|
173
|
+
will generate the HTML to render a panel with a button in the footer:
|
174
|
+
|
175
|
+
```html
|
176
|
+
<div class="panel panel-default">
|
177
|
+
<div class="panel-body">
|
178
|
+
You have the right to remain silent...
|
179
|
+
</div>
|
180
|
+
<div class="panel-footer">
|
181
|
+
<button class="btn btn-primary">Accept</button>
|
182
|
+
</div>
|
183
|
+
</div>
|
184
|
+
```
|
185
|
+
|
186
|
+
<!--
|
187
|
+
TODO
|
188
|
+
Both panel and modal should accept a title to override the header, or a header,
|
189
|
+
or none of them and then they should not have the header component at all.
|
190
|
+
For the size, though, they are different.
|
191
|
+
-->
|
192
|
+
|
193
|
+
Navbar
|
194
|
+
======
|
195
|
+
|
196
|
+
Basic navbar
|
197
|
+
------------
|
198
|
+
|
199
|
+
```erb
|
200
|
+
<%= navbar do %>
|
201
|
+
<%= nav do %>
|
202
|
+
<%= link_to 'Posts', '/posts' %>
|
203
|
+
<%= link_to 'Users', '/users' %>
|
204
|
+
<% end %>
|
205
|
+
<% end %>
|
206
|
+
```
|
207
|
+
|
208
|
+
will generate the HTML to render an default navbar with two links:
|
209
|
+
|
210
|
+
```html
|
211
|
+
<nav class="navbar" role="navigation">
|
212
|
+
<div class="container">
|
213
|
+
<div class="navbar-header">
|
214
|
+
<button class="navbar-toggle" data-target="#bs-example-navbar-collapse-1" data-toggle="collapse" type="button">
|
215
|
+
<span class="sr-only">Toggle navigation</span>
|
216
|
+
<span class="icon-bar"></span>
|
217
|
+
<span class="icon-bar"></span>
|
218
|
+
<span class="icon-bar"></span>
|
219
|
+
</button>
|
220
|
+
</div>
|
221
|
+
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
|
222
|
+
<ul class="nav navbar-nav">
|
223
|
+
<li><a href="/posts">Posts</a></li>
|
224
|
+
<li><a href="/users">Users</a></li>
|
225
|
+
</ul>
|
226
|
+
</div>
|
227
|
+
</div>
|
228
|
+
</nav>
|
229
|
+
```
|
230
|
+
|
231
|
+
|
232
|
+
Complex navbar
|
233
|
+
--------------
|
234
|
+
|
235
|
+
<%= navbar fixed: :top, inverted: true do %>
|
236
|
+
<%= brand do %>
|
237
|
+
<%= link_to image_tag('logo.png', alt: 'Company Name'), '/' %>
|
238
|
+
<% end %>
|
239
|
+
<%= nav do %>
|
240
|
+
<%= link_to 'Posts', '/posts' %>
|
241
|
+
<%= link_to 'Users', '/users' %>
|
242
|
+
<% end %>
|
243
|
+
<%= nav align: :right do %>
|
244
|
+
<%= link_to 'Log in', '/login' %>
|
245
|
+
<% end %>
|
246
|
+
<% end %>
|
247
|
+
|
248
|
+
<!-- NOTE: to align a form to the right, it's not necessary to put it inside
|
249
|
+
a "nav align: :right", it's enough to have the form directly, but form_for
|
250
|
+
should be smart enough to add the 'navbar-form' class for better alignment -->
|
251
|
+
|
252
|
+
<style>body {padding-top: 70px}</style>
|
253
|
+
<nav class="navbar navbar-inverse navbar-fixed-top" role="navigation">
|
254
|
+
<div class="container">
|
255
|
+
<div class="navbar-header">
|
256
|
+
<button class="navbar-toggle" data-target="#bs-example-navbar-collapse-1" data-toggle="collapse" type="button">
|
257
|
+
<span class="sr-only">Toggle navigation</span>
|
258
|
+
<span class="icon-bar"></span>
|
259
|
+
<span class="icon-bar"></span>
|
260
|
+
<span class="icon-bar"></span>
|
261
|
+
</button>
|
262
|
+
<a href="/" class="navbar-brand">
|
263
|
+
<img alt="Company Name" src="/logo.png">
|
264
|
+
</a>
|
265
|
+
</div>
|
266
|
+
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
|
267
|
+
<ul class="nav navbar-nav">
|
268
|
+
<li class="active"><a href="/posts">Posts</a></li>
|
269
|
+
<li><a href="/users">Users</a></li>
|
270
|
+
</ul>
|
271
|
+
<ul class="nav navbar-nav navbar-right">
|
272
|
+
<li><a href="/login">Log in</a></li>
|
273
|
+
</ul>
|
274
|
+
</div>
|
275
|
+
</div>
|
276
|
+
</nav>
|
277
|
+
|
278
|
+
Forms
|
279
|
+
=====
|
280
|
+
|
281
|
+
<%= form_for %>
|
282
|
+
<%= button_to %>
|
283
|
+
<%= link_to %>
|
284
|
+
|
285
|
+
Buttons
|
286
|
+
=======
|
287
|
+
|
288
|
+
<!-- TODO: explain that button_to is smarter, same for form_for, link_to
|
289
|
+
they add extra-classes based on the context -->
|
290
|
+
|
291
|
+
Viewport meta tag
|
292
|
+
=================
|
293
|
+
|
294
|
+
<%= viewport_meta_tag %>
|
295
|
+
|
296
|
+
generates
|
297
|
+
|
298
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
data/bh.gemspec
CHANGED
@@ -6,16 +6,28 @@ require 'bh/version'
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
7
|
spec.name = "bh"
|
8
8
|
spec.version = Bh::VERSION
|
9
|
-
spec.authors = ["
|
10
|
-
spec.email = ["
|
11
|
-
spec.description = %q{Bootstrap Helpers}
|
12
|
-
spec.summary = %q{
|
13
|
-
|
9
|
+
spec.authors = ["Claudio Baccigalupo"]
|
10
|
+
spec.email = ["claudio@fullscreen.net"]
|
11
|
+
spec.description = %q{Bh - Bootstrap Helpers}
|
12
|
+
spec.summary = %q{Bh provides a set of powerful helpers that
|
13
|
+
streamlines the use of Bootstrap components in Rails views.}
|
14
|
+
spec.homepage = "http://github.com/Fullscreen/bh"
|
14
15
|
spec.license = "MIT"
|
15
16
|
|
17
|
+
spec.required_ruby_version = '>= 1.9.3'
|
18
|
+
|
16
19
|
spec.files = `git ls-files`.split($/)
|
20
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
17
21
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
22
|
spec.require_paths = ["lib"]
|
19
23
|
|
20
|
-
spec.
|
24
|
+
spec.add_dependency 'activesupport'
|
25
|
+
spec.add_dependency 'actionpack'
|
26
|
+
|
27
|
+
# For development / Code coverage / Documentation
|
28
|
+
spec.add_development_dependency 'bundler' #, '~> 1.0'
|
29
|
+
spec.add_development_dependency 'rspec' #, '~> 2.0'
|
30
|
+
spec.add_development_dependency 'rake' #, '~> 10.0'
|
31
|
+
spec.add_development_dependency 'yard' #, '~> 0.8.0'
|
32
|
+
spec.add_development_dependency 'coveralls' #, '~> 0.7.0'
|
21
33
|
end
|
data/lib/bh.rb
CHANGED
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'action_view'
|
2
|
+
|
3
|
+
module Bh
|
4
|
+
module AlertHelper
|
5
|
+
include ActionView::Helpers::TagHelper # for content_tag
|
6
|
+
include ActionView::Context # for capture
|
7
|
+
include ActionView::Helpers::OutputSafetyHelper # for safe_join
|
8
|
+
# Returns an HTML block tag that follows the Bootstrap documentation
|
9
|
+
# on how to display *alert boxes*.
|
10
|
+
# Alert boxes provide contextual feedback messages for typical user
|
11
|
+
# actions with the handful of available and flexible alert messages.
|
12
|
+
# @see http://getbootstrap.com/components/#alerts
|
13
|
+
#
|
14
|
+
# The message to display in the alert can either be passed as the first
|
15
|
+
# parameter (in which case, the options are the second parameter), or as
|
16
|
+
# a block (in which case, the options are the first paramter).
|
17
|
+
# @example An alert with a plain-text message passed as the first parameter.
|
18
|
+
# alert 'User updated successfully', dismissible: true
|
19
|
+
# @example An alert with an HTML message passed as a block.
|
20
|
+
# alert_box dismissible: true do
|
21
|
+
# <strong>Hooray!</strong> User updated successfully
|
22
|
+
# end
|
23
|
+
#
|
24
|
+
# @return [String] an HTML block tag for an alert.
|
25
|
+
# @param [String] message_or_options_with_block the message to display in
|
26
|
+
# the alert.
|
27
|
+
# @param [Hash] options the options for the alert box.
|
28
|
+
# @option options [Boolean] :dismissible whether to display an '×' to the
|
29
|
+
# right of the alert than can be clicked to dismiss the alert.
|
30
|
+
# @option options [Symbol] :context the contextual class to apply to the
|
31
|
+
# alert depending on its importance. Can be :success, :info, :warning,
|
32
|
+
# or :danger. Defaults to :info.
|
33
|
+
# @option options [Symbol] :priority if the alert box is used to show a
|
34
|
+
# Rails flash message, the priority of the message. Can be :alert
|
35
|
+
# or :notice.
|
36
|
+
def alert_box(message_or_options_with_block = nil, options = nil, &block)
|
37
|
+
if block_given?
|
38
|
+
alert_string capture_alert(&block), message_or_options_with_block || {}
|
39
|
+
else
|
40
|
+
alert_string message_or_options_with_block, options || {}
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def alert_string(message = nil, options = {})
|
47
|
+
dismissible = options[:dismissible] || options[:priority]
|
48
|
+
message = add_dismiss_button_to(message) if dismissible
|
49
|
+
klass = alert_class options.fetch(:context, options[:priority])
|
50
|
+
content_tag :div, message, role: :alert, class: klass
|
51
|
+
end
|
52
|
+
|
53
|
+
def alert_class(context = nil)
|
54
|
+
context = case context.to_s
|
55
|
+
when 'success', 'notice' then :success
|
56
|
+
when 'warning' then :warning
|
57
|
+
when 'danger', 'alert' then :danger
|
58
|
+
else 'info'
|
59
|
+
end
|
60
|
+
"alert alert-#{context}"
|
61
|
+
end
|
62
|
+
|
63
|
+
def add_dismiss_button_to(message)
|
64
|
+
options = {type: 'button', class: 'close', :'data-dismiss' => 'alert'}
|
65
|
+
dismiss_button = content_tag :button, options do
|
66
|
+
safe_join [
|
67
|
+
content_tag(:span, '×'.html_safe, :'aria-hidden' => true),
|
68
|
+
content_tag(:span, 'Close', class: 'sr-only'),
|
69
|
+
], ''
|
70
|
+
end
|
71
|
+
safe_join [dismiss_button, message], "\n"
|
72
|
+
end
|
73
|
+
|
74
|
+
# Captures the message passed as a block and sets a variable so that
|
75
|
+
# every +link_to+ helper called inside the block gets the "alert-link"
|
76
|
+
# class added, for links to look better.
|
77
|
+
# @see http://getbootstrap.com/components/#alerts-links
|
78
|
+
def capture_alert(&block)
|
79
|
+
@alert_link = true
|
80
|
+
capture(&block).tap{ @alert_link = false }
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'action_view'
|
2
|
+
|
3
|
+
module Bh
|
4
|
+
module UrlHelper
|
5
|
+
include ActionView::Helpers::UrlHelper # for link_to
|
6
|
+
# Overrides ActionView +link_to+ to be able to add the 'alert_link' class
|
7
|
+
# to the link in case the link is inside of an alert.
|
8
|
+
# @see http://getbootstrap.com/components/#alerts-links
|
9
|
+
def link_to(*args, &block)
|
10
|
+
args = add_alert_class_to_link!(*args, &block) if @alert_link
|
11
|
+
super *args, &block
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def add_alert_class_to_link!(*args, &block)
|
17
|
+
html_options = (block_given? ? args[1] : args[2]) || {}
|
18
|
+
klass = html_options[:class]
|
19
|
+
html_options[:class] = [klass, 'alert-link'].compact.join ' '
|
20
|
+
block_given? ? args[1] = html_options : args[2] = html_options
|
21
|
+
args
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/bh/railtie.rb
ADDED
data/lib/bh/version.rb
CHANGED
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'bh/helpers/alert_helper'
|
3
|
+
require 'bh/helpers/url_helper'
|
4
|
+
include Bh::AlertHelper
|
5
|
+
include Bh::UrlHelper
|
6
|
+
|
7
|
+
describe 'alert_box' do
|
8
|
+
describe 'accepts as parameters:' do
|
9
|
+
let(:behave) { be_a String }
|
10
|
+
|
11
|
+
specify 'a string (message)' do
|
12
|
+
expect(alert_box 'message').to behave
|
13
|
+
end
|
14
|
+
|
15
|
+
specify 'a block (message)' do
|
16
|
+
expect(alert_box { 'message' }).to behave
|
17
|
+
end
|
18
|
+
|
19
|
+
specify 'a string (message) + a hash (options)' do
|
20
|
+
expect(alert_box 'message', context: :danger).to behave
|
21
|
+
end
|
22
|
+
|
23
|
+
specify 'a hash (options) + a block (message)' do
|
24
|
+
expect(alert_box(context: :danger) { 'message' }).to behave
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe 'with the :dismissible option' do
|
29
|
+
specify 'not set, does not show an × to dismiss the alert' do
|
30
|
+
expect(alert_box 'message').not_to include '×'
|
31
|
+
end
|
32
|
+
|
33
|
+
specify 'set to false, does not show an × to dismiss the alert' do
|
34
|
+
expect(alert_box 'message', dismissible: false).not_to include '×'
|
35
|
+
end
|
36
|
+
|
37
|
+
specify 'set to true, does not show an × to dismiss the alert' do
|
38
|
+
expect(alert_box 'message', dismissible: true).to include '×'
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe 'with the :context option' do
|
43
|
+
specify 'set to :success, shows a "success" alert' do
|
44
|
+
expect(alert_box 'message', context: :success).to include 'alert-success'
|
45
|
+
end
|
46
|
+
|
47
|
+
specify 'set to :info, shows a "info" alert' do
|
48
|
+
expect(alert_box 'message', context: :info).to include 'alert-info'
|
49
|
+
end
|
50
|
+
|
51
|
+
specify 'set to :warning, shows a "warning" alert' do
|
52
|
+
expect(alert_box 'message', context: :warning).to include 'alert-warning'
|
53
|
+
end
|
54
|
+
|
55
|
+
specify 'set to :danger, shows a "danger" alert' do
|
56
|
+
expect(alert_box 'message', context: :danger).to include 'alert-danger'
|
57
|
+
end
|
58
|
+
|
59
|
+
specify 'set to any other value, shows an "info" alert' do
|
60
|
+
expect(alert_box 'message', context: :unknown).to include 'alert-info'
|
61
|
+
end
|
62
|
+
|
63
|
+
specify 'not set, shows an "info" alert' do
|
64
|
+
expect(alert_box 'message').to include 'alert-info'
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe 'with the :priority option' do
|
69
|
+
specify 'shows a dismissible alert' do
|
70
|
+
expect(alert_box 'message', priority: :notice).to include '×'
|
71
|
+
end
|
72
|
+
|
73
|
+
specify 'set to :notice, shows a "success" alert' do
|
74
|
+
expect(alert_box 'message', priority: :notice).to include 'alert-success'
|
75
|
+
end
|
76
|
+
|
77
|
+
specify 'set to :alert, shows a "danger" alert' do
|
78
|
+
expect(alert_box 'message', priority: :alert).to include 'alert-danger'
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'bh/helpers/alert_helper'
|
3
|
+
require 'bh/helpers/url_helper'
|
4
|
+
include Bh::AlertHelper
|
5
|
+
include Bh::UrlHelper
|
6
|
+
|
7
|
+
describe 'link_to' do
|
8
|
+
context 'used without a block' do
|
9
|
+
let(:link) { link_to 'Home', '/' }
|
10
|
+
|
11
|
+
specify 'does not apply the "alert_link" class if used outside of an alert' do
|
12
|
+
expect(link).not_to include 'alert-link'
|
13
|
+
end
|
14
|
+
|
15
|
+
specify 'applies the "alert_link" class if used inside an alert' do
|
16
|
+
expect(alert_box { link }).to include 'alert-link'
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
context 'used with a block' do
|
21
|
+
let(:link) { link_to('/') { 'Home' } }
|
22
|
+
|
23
|
+
specify 'does not apply the "alert_link" class if used outside of an alert' do
|
24
|
+
expect(link).not_to include 'alert-link'
|
25
|
+
end
|
26
|
+
|
27
|
+
specify 'applies the "alert_link" class if used inside an alert' do
|
28
|
+
expect(alert_box { link }).to include 'alert-link'
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'simplecov'
|
2
|
+
require 'coveralls'
|
3
|
+
|
4
|
+
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
|
5
|
+
SimpleCov::Formatter::HTMLFormatter,
|
6
|
+
Coveralls::SimpleCov::Formatter
|
7
|
+
]
|
8
|
+
SimpleCov.start
|
9
|
+
|
10
|
+
Dir['./spec/support/**/*.rb'].each {|f| require f}
|
11
|
+
|
12
|
+
RSpec.configure do |config|
|
13
|
+
config.order = 'random'
|
14
|
+
config.run_all_when_everything_filtered = false
|
15
|
+
end
|
metadata
CHANGED
@@ -1,46 +1,138 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bh
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
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
|
+
date: 2014-08-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activesupport
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: actionpack
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: bundler
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
13
69
|
- !ruby/object:Gem::Dependency
|
14
70
|
name: rake
|
15
71
|
requirement: !ruby/object:Gem::Requirement
|
16
72
|
requirements:
|
17
|
-
- - "
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: yard
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
18
88
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
89
|
+
version: '0'
|
20
90
|
type: :development
|
21
91
|
prerelease: false
|
22
92
|
version_requirements: !ruby/object:Gem::Requirement
|
23
93
|
requirements:
|
24
|
-
- - "
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: coveralls
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
25
102
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
27
|
-
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
description: Bh - Bootstrap Helpers
|
28
112
|
email:
|
29
|
-
-
|
113
|
+
- claudio@fullscreen.net
|
30
114
|
executables: []
|
31
115
|
extensions: []
|
32
116
|
extra_rdoc_files: []
|
33
117
|
files:
|
34
118
|
- ".gitignore"
|
119
|
+
- ".rspec"
|
120
|
+
- CHANGELOG.md
|
35
121
|
- Gemfile
|
36
|
-
-
|
37
|
-
- LICENSE.txt
|
122
|
+
- MIT-LICENSE
|
38
123
|
- README.md
|
39
124
|
- Rakefile
|
125
|
+
- TODO.md
|
40
126
|
- bh.gemspec
|
41
127
|
- lib/bh.rb
|
128
|
+
- lib/bh/helpers/alert_helper.rb
|
129
|
+
- lib/bh/helpers/url_helper.rb
|
130
|
+
- lib/bh/railtie.rb
|
42
131
|
- lib/bh/version.rb
|
43
|
-
|
132
|
+
- spec/helpers/alert_helper_spec.rb
|
133
|
+
- spec/helpers/url_helper_spec.rb
|
134
|
+
- spec/spec_helper.rb
|
135
|
+
homepage: http://github.com/Fullscreen/bh
|
44
136
|
licenses:
|
45
137
|
- MIT
|
46
138
|
metadata: {}
|
@@ -52,7 +144,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
52
144
|
requirements:
|
53
145
|
- - ">="
|
54
146
|
- !ruby/object:Gem::Version
|
55
|
-
version:
|
147
|
+
version: 1.9.3
|
56
148
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
57
149
|
requirements:
|
58
150
|
- - ">="
|
@@ -63,5 +155,10 @@ rubyforge_project:
|
|
63
155
|
rubygems_version: 2.2.2
|
64
156
|
signing_key:
|
65
157
|
specification_version: 4
|
66
|
-
summary:
|
67
|
-
|
158
|
+
summary: Bh provides a set of powerful helpers that streamlines the use of Bootstrap
|
159
|
+
components in Rails views.
|
160
|
+
test_files:
|
161
|
+
- spec/helpers/alert_helper_spec.rb
|
162
|
+
- spec/helpers/url_helper_spec.rb
|
163
|
+
- spec/spec_helper.rb
|
164
|
+
has_rdoc:
|
data/HISTORY.md
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
v0.0.1 - 2014/06/23 Scaffold gem
|