tabs_on_rails 2.2.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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.
|