tabs_on_rails 2.2.0 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +9 -8
- data/.ruby-gemset +1 -0
- data/.travis.yml +13 -10
- data/Appraisals +4 -9
- data/CHANGELOG.md +6 -0
- data/Gemfile +1 -1
- data/LICENSE.txt +1 -1
- data/README.md +302 -40
- data/Rakefile +6 -64
- data/gemfiles/4.2.gemfile +7 -0
- data/gemfiles/5.0.gemfile +7 -0
- data/lib/tabs_on_rails.rb +1 -1
- data/lib/tabs_on_rails/action_controller.rb +2 -2
- data/lib/tabs_on_rails/railtie.rb +3 -6
- data/lib/tabs_on_rails/tabs.rb +7 -3
- data/lib/tabs_on_rails/tabs/builder.rb +1 -1
- data/lib/tabs_on_rails/tabs/tabs_builder.rb +1 -1
- data/lib/tabs_on_rails/version.rb +2 -15
- data/tabs_on_rails.gemspec +23 -34
- data/test/dummy.rb +6 -1
- data/test/test_helper.rb +5 -2
- data/test/unit/action_controller_test.rb +1 -15
- data/test/unit/{tabs/builder_test.rb → builder_test.rb} +4 -4
- data/test/unit/{tabs/tabs_builder_test.rb → tabs_builder_test.rb} +0 -0
- metadata +66 -54
- data/.gemtest +0 -0
- data/gemfiles/3.0.gemfile +0 -7
- data/gemfiles/3.0.gemfile.lock +0 -91
- data/gemfiles/3.1.gemfile +0 -7
- data/gemfiles/3.1.gemfile.lock +0 -100
- data/gemfiles/3.2.gemfile +0 -7
- data/gemfiles/3.2.gemfile.lock +0 -100
- data/init.rb +0 -1
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: f8b05c093bf3ea463e7286064ae18e3f3b443785
|
4
|
+
data.tar.gz: b795ffa146e76d820ba77a693f8646787b11257d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: acb18c671a6d0ff4dca1d4ec50b510c070a520d9372a5db4815c52d7b905159aa395daa5bd2350e509eff7820e15064a85774df87be89450aded8ab7ad399a2c
|
7
|
+
data.tar.gz: a9c0c4e43a517f34534769ecde22c3f9c73e628237e6c93d722f355d773d7ac6f7ba12aa5705b7f6013f42c6960c62dcd13a61793eee004e4f1bd21bf952681b
|
data/.gitignore
CHANGED
data/.ruby-gemset
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
tabs_on_rails
|
data/.travis.yml
CHANGED
@@ -1,12 +1,15 @@
|
|
1
1
|
rvm:
|
2
|
-
-
|
3
|
-
-
|
4
|
-
-
|
5
|
-
|
2
|
+
- 2.2.5
|
3
|
+
- 2.3.1
|
4
|
+
- 2.4.0
|
5
|
+
|
6
6
|
gemfile:
|
7
|
-
- gemfiles/
|
8
|
-
- gemfiles/
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
7
|
+
- gemfiles/4.2.gemfile
|
8
|
+
- gemfiles/5.0.gemfile
|
9
|
+
|
10
|
+
before_install:
|
11
|
+
- gem install bundler
|
12
|
+
|
13
|
+
env:
|
14
|
+
global:
|
15
|
+
- NOKOGIRI_USE_SYSTEM_LIBRARIES=true
|
data/Appraisals
CHANGED
@@ -1,11 +1,6 @@
|
|
1
|
-
appraise "
|
2
|
-
gem "
|
1
|
+
appraise "4.2" do
|
2
|
+
gem "rails", "~> 4.2.0"
|
3
3
|
end
|
4
|
-
|
5
|
-
|
6
|
-
gem "activerecord", "~> 3.1"
|
4
|
+
appraise "5.0" do
|
5
|
+
gem "rails", "~> 5.0.0"
|
7
6
|
end
|
8
|
-
|
9
|
-
appraise "3.2" do
|
10
|
-
gem "activerecord", "~> 3.2"
|
11
|
-
end
|
data/CHANGELOG.md
CHANGED
data/Gemfile
CHANGED
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -1,81 +1,343 @@
|
|
1
1
|
# Tabs on Rails
|
2
2
|
|
3
|
-
|
3
|
+
<tt>TabsOnRails</tt> is a simple Rails plugin for creating tabs and navigation menus. It provides helpers for generating navigation menus with a flexible interface.
|
4
4
|
|
5
5
|
|
6
6
|
## Requirements
|
7
7
|
|
8
|
-
|
8
|
+
- Rails 4.2 or Rails 5
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
* TabsOnRails 2.x requires Rails 3. Use TabsOnRails 1.3.x with Rails 2.
|
13
|
-
* TabsOnRails doesn't work with Rails 2.1 or lower
|
14
|
-
([comment](http://www.simonecarletti.com/blog/2009/04/tabsonrails/#comment-2901) and [commit](http://github.com/weppos/tabs_on_rails/commit/d5ae9f401e3d0acc87251fa8957a8625e90ba4b3)).
|
10
|
+
For older versions of Ruby or Ruby on Rails, see the [CHANGELOG](CHANGELOG.md).
|
15
11
|
|
16
12
|
|
17
13
|
## Installation
|
18
14
|
|
19
|
-
|
15
|
+
Add this line to your application's `Gemfile`:
|
20
16
|
|
21
|
-
|
17
|
+
gem "tabs_on_rails"
|
22
18
|
|
23
|
-
|
19
|
+
And then execute `bundle` to install the dependencies:
|
24
20
|
|
25
|
-
|
21
|
+
$ bundle
|
26
22
|
|
27
|
-
Use [Bundler](http://
|
23
|
+
Use [Bundler](http://bundler.io/) and the `:git` option if you want to grab the latest version from the Git repository.
|
28
24
|
|
29
25
|
|
30
26
|
## Usage
|
31
27
|
|
32
28
|
In your template use the `tabs_tag` helper to create your tab.
|
33
29
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
30
|
+
```ruby
|
31
|
+
<%= tabs_tag do |tab| %>
|
32
|
+
<%= tab.home 'Homepage', root_path %>
|
33
|
+
<%= tab.dashboard 'Dashboard', dashboard_path %>
|
34
|
+
<%= tab.account 'Account', account_path %>
|
35
|
+
<% end %>
|
36
|
+
```
|
39
37
|
|
40
|
-
|
38
|
+
renders
|
41
39
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
40
|
+
```html
|
41
|
+
<ul>
|
42
|
+
<li><a href="/">Homepage</a></li>
|
43
|
+
<li><a href="/dashboard">Dashboard</a></li>
|
44
|
+
<li><a href="/account">Account</a></li>
|
45
|
+
</ul>
|
46
|
+
```
|
47
47
|
|
48
48
|
The usage is similar to the Rails route file. You create named tabs with the syntax `tab.name_of_tab`. The name you use creating a tab is the same you're going to refer to in your controller when you want to mark a tab as the current tab.
|
49
49
|
|
50
|
+
```ruby
|
51
|
+
class DashboardController < ApplicationController
|
52
|
+
set_tab :dashboard
|
53
|
+
end
|
54
|
+
```
|
55
|
+
|
50
56
|
Now, if the action belongs to `DashboardController`, the template will automatically render the following HTML code.
|
51
57
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
58
|
+
```html
|
59
|
+
<ul>
|
60
|
+
<li><a href="/">Homepage</a></li>
|
61
|
+
<li class="custom"><span>Dashboard</span></li>
|
62
|
+
<li><a href="/account">Account</a></li>
|
63
|
+
</ul>
|
64
|
+
```
|
57
65
|
|
58
66
|
Use the `current_tab` helper method if you need to access the value of current tab in your controller or template.
|
59
67
|
|
60
|
-
|
61
|
-
|
68
|
+
```ruby
|
69
|
+
class DashboardController < ApplicationController
|
70
|
+
set_tab :dashboard
|
71
|
+
end
|
72
|
+
```
|
73
|
+
|
74
|
+
In your view
|
75
|
+
|
76
|
+
```html
|
77
|
+
<p>The name of current tab is <%= current_tab %>.</p>
|
78
|
+
```
|
79
|
+
|
80
|
+
### Customizing a Tab
|
81
|
+
|
82
|
+
You can pass a hash of options to customize the style and the behavior of the tab item.
|
83
|
+
Behind the scenes, each time you create a tab, the `#tab_for` method is invoked.
|
84
|
+
|
85
|
+
```ruby
|
86
|
+
<%= tabs_tag do |tab| %>
|
87
|
+
<%= tab.home 'Homepage', root_path, :style => "padding: 10px" %>
|
88
|
+
<%= tab.dashboard 'Dashboard', dashboard_path %>
|
89
|
+
<% end %>
|
90
|
+
```
|
91
|
+
|
92
|
+
renders
|
93
|
+
|
94
|
+
```
|
95
|
+
<ul>
|
96
|
+
<li style="padding: 10px"><a href="/">Homepage</a></li>
|
97
|
+
<li class="custom"><span>Dashboard</span></li>
|
98
|
+
<li><a href="/account">Account</a></li>
|
99
|
+
</ul>
|
100
|
+
```
|
101
|
+
|
102
|
+
See `TabsOnRails::Tabs::TabsBuilder#tab_for` for more details.
|
103
|
+
|
104
|
+
### Customizing `open_tabs` and `close_tabs`
|
105
|
+
|
106
|
+
The `open_tabs` and the `close_tabs` methods can be customized with the `:open_tabs` and `:close_tabs` option.
|
107
|
+
|
108
|
+
```ruby
|
109
|
+
<%= tabs_tag :open_tabs => { :id => "tabs", :class => "cool" } do |tab| %>
|
110
|
+
<%= tab.home 'Homepage', root_path %>
|
111
|
+
<%= tab.dashboard 'Dashboard', dashboard_path %>
|
112
|
+
<%= tab.account 'Account', account_path %>
|
113
|
+
<% end %>
|
114
|
+
```
|
115
|
+
|
116
|
+
renders
|
117
|
+
|
118
|
+
```html
|
119
|
+
<ul id="tabs" class="cool">
|
120
|
+
<li><a href="/">Homepage</a></li>
|
121
|
+
<li><a href="/dashboard">Dashboard</a></li>
|
122
|
+
<li><a href="/account">Account</a></li>
|
123
|
+
</ul>
|
124
|
+
```
|
125
|
+
|
126
|
+
Further customizations require a custom `Builder` (see below).
|
127
|
+
|
128
|
+
|
129
|
+
## Restricting `set_tab` scope
|
130
|
+
|
131
|
+
The `set_tab` method understands all options you are used to pass to a Rails controller filter.
|
132
|
+
In fact, behind the scenes this method uses a `before_filter` to store the tab in the `@tab_stack` variable.
|
133
|
+
|
134
|
+
Taking advantage of Rails filter options, you can restrict a tab to a selected group of actions in the same controller.
|
135
|
+
|
136
|
+
```ruby
|
137
|
+
class PostsController < ApplicationController
|
138
|
+
set_tab :admin
|
139
|
+
set_tab :posts, :only => %w(index show)
|
140
|
+
end
|
141
|
+
|
142
|
+
class ApplicationController < ActionController::Base
|
143
|
+
set_tab :admin, :if => :admin_controller?
|
144
|
+
|
145
|
+
def admin_controller?
|
146
|
+
self.class.name =~ /^Admin(::|Controller)/
|
147
|
+
end
|
148
|
+
end
|
149
|
+
```
|
150
|
+
|
151
|
+
## Using Namespaces to create Multiple Tabs
|
152
|
+
|
153
|
+
Namespaces enable you to create and manage tabs in parallels. The best way to demonstrate namespace usage is with an example.
|
154
|
+
|
155
|
+
Let's assume your application provides a first level navigation menu with 3 elements: `:home`, `:dashboard`, `:projects`. The relationship between your tabs and your controllers is 1:1 so you should end up with the following source code.
|
156
|
+
|
157
|
+
```ruby
|
158
|
+
class HomeController
|
159
|
+
set_tab :home
|
160
|
+
end
|
161
|
+
|
162
|
+
class DashboardController
|
163
|
+
set_tab :dashboard
|
164
|
+
end
|
165
|
+
|
166
|
+
class ProjectsController
|
167
|
+
set_tab :projects
|
168
|
+
|
169
|
+
def first; end
|
170
|
+
def second; end
|
171
|
+
def third; end
|
172
|
+
end
|
173
|
+
```
|
174
|
+
|
175
|
+
The project controller contains 3 actions and you might want to create a second-level navigation menu. This menu should reflect the navigation status of the user in the project page.
|
176
|
+
|
177
|
+
Without namespaces, you wouldn't be able to accomplish this task because you already set the current tab value to :projects. You need to create a parallel navigation menu and uniquely identify it with a custom namespace.
|
178
|
+
Let's call it :navigation.
|
179
|
+
|
180
|
+
```ruby
|
181
|
+
class ProjectsController
|
182
|
+
set_tab :projects
|
183
|
+
|
184
|
+
# Create an other tab navigation level
|
185
|
+
set_tab :first, :navigation, :only => %w(first)
|
186
|
+
set_tab :second, :navigation, :only => %w(second)
|
187
|
+
set_tab :third, :navigation, :only => %w(third)
|
188
|
+
|
189
|
+
def first; end
|
190
|
+
def second; end
|
191
|
+
def third; end
|
192
|
+
end
|
193
|
+
```
|
194
|
+
|
195
|
+
Voilà! That's all you need to do. And you can create an unlimited number of namespaces as long as you use an unique name to identify them.
|
196
|
+
|
197
|
+
The default namespace is called `:default`. Passing `:default` as name is the same as don't using any namespace at all. The following lines are equivalent.
|
198
|
+
|
199
|
+
```ruby
|
200
|
+
set_tab :projects
|
201
|
+
set_tab :projects, :default
|
202
|
+
```
|
203
|
+
|
204
|
+
### Rendering Tabs with Namespaces
|
205
|
+
|
206
|
+
To switch namespace in your template, just pass the `:namespace` option to the `tabs_tag` helper method.
|
207
|
+
|
208
|
+
```ruby
|
209
|
+
<%= tabs_tag do |tab| %>
|
210
|
+
<%= tab.home 'Homepage', root_path %>
|
211
|
+
<%= tab.dashboard 'Dashboard', dashboard_path %>
|
212
|
+
<%= tab.projects 'Projects', projects_path %>
|
213
|
+
<% end %>
|
214
|
+
|
215
|
+
<%= tabs_tag :namespace => :navigation do |tab| %>
|
216
|
+
<%= tab.first 'First', project_first_path %>
|
217
|
+
<%= tab.second 'Second', project_second_path %>
|
218
|
+
<%= tab.third 'Account', project_third_path %>
|
219
|
+
<% end %>
|
220
|
+
```
|
221
|
+
|
222
|
+
### Namespace scope
|
223
|
+
|
224
|
+
As a bonus feature, the namespace needs to be unique within current request scope, not necessarily across the entire application.
|
225
|
+
|
226
|
+
Back to the previous example, you can reuse the same namespace in the other controllers. In this way, you can reuse your templates as well.
|
227
|
+
|
228
|
+
```ruby
|
229
|
+
class HomeController
|
230
|
+
set_tab :home
|
231
|
+
end
|
232
|
+
|
233
|
+
class DashboardController
|
234
|
+
set_tab :dashboard
|
235
|
+
|
236
|
+
set_tab :index, :navigation, :only => %w(index)
|
237
|
+
set_tab :common, :navigation, :only => %w(foo bar)
|
238
|
+
|
239
|
+
# ...
|
240
|
+
end
|
241
|
+
|
242
|
+
class ProjectsController
|
243
|
+
set_tab :projects
|
244
|
+
|
245
|
+
set_tab :first, :navigation, :only => %w(first)
|
246
|
+
set_tab :second, :navigation, :only => %w(second)
|
247
|
+
set_tab :third, :navigation, :only => %w(third)
|
248
|
+
|
249
|
+
# ...
|
250
|
+
end
|
251
|
+
```
|
252
|
+
|
253
|
+
|
254
|
+
## Tab Builders
|
255
|
+
|
256
|
+
The `Builder` is responsible for creating the tabs HTML code. This library is bundled with two `Builders`:
|
257
|
+
|
258
|
+
- `Tabs::Builder`: this is the abstract interface for any custom builder.
|
259
|
+
- `Tabs::TabsBuilder`: this is the default builder.
|
260
|
+
|
261
|
+
### Understanding the Builder
|
262
|
+
|
263
|
+
Builders act as formatters. A Builder encapsulates all the logic behind the tab creation including the code required to toggle tabs status.
|
264
|
+
|
265
|
+
When the `tabs_tag` helper is called, it creates a new `Tabs` instance with selected Builder. If you don't provide a custom builder, then `Tabs::TabsBuilder` is used by default.
|
266
|
+
|
267
|
+
### Creating a custom Builder
|
268
|
+
|
269
|
+
All builders must extend the base `Tabs::Builder` class and implement at least the `tab_for` method.
|
270
|
+
Additional overridable methods include:
|
271
|
+
|
272
|
+
- `open_tabs`: the method called before the tab set
|
273
|
+
- `close_tabs`: the method called after the tab set
|
274
|
+
- `tab_for`: the method called to create a single tab item
|
275
|
+
|
276
|
+
The following example creates a custom tab builder called `MenuTabBuilder`.
|
277
|
+
|
278
|
+
```ruby
|
279
|
+
class MenuTabBuilder < TabsOnRails::Tabs::Builder
|
280
|
+
def open_tabs(options = {})
|
281
|
+
@context.tag("ul", options, open = true)
|
282
|
+
end
|
283
|
+
|
284
|
+
def close_tabs(options = {})
|
285
|
+
"</ul>".html_safe
|
286
|
+
end
|
287
|
+
|
288
|
+
def tab_for(tab, name, options, item_options = {})
|
289
|
+
item_options[:class] = (current_tab?(tab) ? 'active' : '')
|
290
|
+
@context.content_tag(:li, item_options) do
|
291
|
+
@context.link_to(name, options)
|
62
292
|
end
|
293
|
+
end
|
294
|
+
end
|
295
|
+
```
|
296
|
+
|
297
|
+
### Using a custom Builder
|
298
|
+
|
299
|
+
In your view, simply pass the builder class to the `tabs_tag` method.
|
300
|
+
|
301
|
+
```ruby
|
302
|
+
<%= tabs_tag(:builder => MenuTabBuilder) do |tab| %>
|
303
|
+
<%= tab.home 'Homepage', root_path %>
|
304
|
+
<%= tab.dashboard, 'Dashboard', dashboard_path %>
|
305
|
+
<%= tab.account 'Account', account_path, :style => 'float: right;' %>
|
306
|
+
<% end %>
|
307
|
+
```
|
308
|
+
|
309
|
+
renders
|
310
|
+
|
311
|
+
```html
|
312
|
+
<ul>
|
313
|
+
<li class=""><a href="/">Homepage</a></li>
|
314
|
+
<li class="active"><a href="/dashboard">Dashboard</a></li>
|
315
|
+
<li class="" style="float: right;"><a href="/account">Account</a></li>
|
316
|
+
</ul>
|
317
|
+
```
|
318
|
+
|
319
|
+
|
320
|
+
## Credits
|
321
|
+
|
322
|
+
<tt>TabsOnRails</tt> was created and is maintained by [Simone Carletti](https://simonecarletti.com/). Many improvements and bugfixes were contributed by the [open source community](https://github.com/weppos/tabs_on_rails/graphs/contributors).
|
323
|
+
|
324
|
+
|
325
|
+
## Contributing
|
326
|
+
|
327
|
+
Direct questions and discussions to [Stack Overflow](http://stackoverflow.com/questions/tagged/tabs-on-rails).
|
63
328
|
|
64
|
-
|
65
|
-
<p>The name of current tab is <%= current_tab %>.</p>
|
329
|
+
[Pull requests](https://github.com/weppos/tabs_on_rails) are very welcome! Please include tests for every patch, and create a topic branch for every separate change you make.
|
66
330
|
|
67
|
-
|
331
|
+
Report issues or feature requests to [GitHub Issues](https://github.com/weppos/tabs_on_rails/issues).
|
68
332
|
|
69
333
|
|
70
|
-
##
|
334
|
+
## More Information
|
71
335
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
* [Repository](https://github.com/weppos/tabs_on_rails)
|
76
|
-
* [Issue Tracker](http://github.com/weppos/tabs_on_rails/issues)
|
336
|
+
- [Homepage](https://simonecarletti.com/code/tabs-on-rails)
|
337
|
+
- [RubyGems](https://rubygems.org/gems/tabs_on_rails)
|
338
|
+
- [Issues](https://github.com/weppos/tabs_on_rails/issues)
|
77
339
|
|
78
340
|
|
79
341
|
## License
|
80
342
|
|
81
|
-
Copyright (c) 2009-
|
343
|
+
Copyright (c) 2009-2017 Simone Carletti. This is Free Software distributed under the MIT license.
|