navigatrix 0.0.1 → 0.1.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 +14 -6
- data/README.md +108 -7
- data/lib/navigatrix.rb +23 -0
- data/lib/navigatrix/builder.rb +69 -0
- data/lib/navigatrix/configuration.rb +10 -0
- data/lib/navigatrix/item.rb +1 -1
- data/lib/navigatrix/renderer.rb +20 -14
- data/lib/navigatrix/rendering/strategies/bootstrap/navbar.rb +27 -23
- data/lib/navigatrix/rendering/strategies/bootstrap/tabs.rb +10 -6
- data/lib/navigatrix/rendering/strategies/content_helpers.rb +16 -0
- data/lib/navigatrix/rendering/strategies/html_attributes.rb +27 -0
- data/lib/navigatrix/rendering/strategies/item.rb +102 -0
- data/lib/navigatrix/rendering/strategies/list.rb +33 -89
- data/lib/navigatrix/rendering/strategy_factory.rb +28 -0
- data/lib/navigatrix/version.rb +1 -1
- data/spec/integration/documentation_spec.rb +154 -0
- data/spec/item_builder_spec.rb +120 -0
- data/spec/item_spec.rb +1 -3
- data/spec/list_builder_spec.rb +32 -0
- data/spec/renderer_spec.rb +23 -20
- data/spec/{strategies → rendering/strategies}/bootstrap/navbar_spec.rb +2 -4
- data/spec/{strategies → rendering/strategies}/bootstrap/tabs_spec.rb +1 -3
- data/spec/rendering/strategies/list_spec.rb +13 -0
- data/spec/rendering/strategy_factory_spec.rb +58 -0
- data/spec/spec_helper.rb +5 -0
- data/spec/support/list_rendering_strategy.rb +11 -5
- metadata +37 -21
- data/spec/strategies/list_spec.rb +0 -11
checksums.yaml
CHANGED
@@ -1,7 +1,15 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
MTU0ZDk1YzY1NjgxODkwODM0YmE1NjcyYmRmMWQwNWRjYmYwNTUxZQ==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
NWRlOTg0NDVmYWZkNTg1MGEwYmRhMTU2Y2EwNGM4Yjc2MjFkMjk3MA==
|
7
|
+
!binary "U0hBNTEy":
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
MTI3M2I0MTIyYTE0ZjI0N2U4ZDA1NjhlNTJjMWU4MjBjYzg4YjU5NGU4NGM4
|
10
|
+
NWVmZmViNDY4NjgyMzRjZTk3NmU2NTAzZjk4MjkwZTE0N2FlMjU1YmI2ZDEw
|
11
|
+
NTQzMDU4YjQyZTJiMzM2YzNmMmIxYTVlMWE5ZThmZTM3ODM0ZWQ=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
NWU0YzVjMGY3OTYxYWJkNTEyZTQ0ZDBiMWVkMzI1NmU2NmZiNWI1NmU2YWNl
|
14
|
+
MjdmMDVhMDhkNWE1NzNmOTk3ZjBhNGFhODVjZmNjOTk5MmZiMTcwNzdiOGZh
|
15
|
+
MmM2NDhmNTk4ZmEzNmM3NzhkZGRkNjYzOGMwYTc4ZThjMTg2ZmY=
|
data/README.md
CHANGED
@@ -46,9 +46,13 @@ Assuming we're on the "/about-us" path, the resulting HTML will look like this:
|
|
46
46
|
:render? => user_signed_in?
|
47
47
|
}
|
48
48
|
}, {
|
49
|
-
:
|
50
|
-
|
51
|
-
|
49
|
+
:item => {
|
50
|
+
:active_class => "active-nav-item"
|
51
|
+
},
|
52
|
+
:list => {
|
53
|
+
:html_attributes => {
|
54
|
+
:class => "nav"
|
55
|
+
}
|
52
56
|
}
|
53
57
|
}) %>
|
54
58
|
```
|
@@ -57,14 +61,45 @@ Assuming we're on the "/users/1" path, and a User is signed in, the resulting HT
|
|
57
61
|
```HTML
|
58
62
|
<ul class="nav">
|
59
63
|
<li><a href="/">Home</a></li>
|
60
|
-
<li class="active-nav-item">Users</li>
|
64
|
+
<li class="active-nav-item"><a href="/users">Users</a></li>
|
61
65
|
<li><a href="/sign_out">Sign Out</a></li>
|
62
66
|
</ul>
|
63
67
|
```
|
64
68
|
The "Users" item is active and not linked because the path "/users/1" matches the pattern `/\/users\/\d*/`. The "Home" item is linked because we are not on the path "/".
|
65
69
|
|
70
|
+
## List Configuration Options
|
71
|
+
List configuration options are supplied via the `:list` option when rendering a navigation. For example,
|
72
|
+
|
73
|
+
```Ruby
|
74
|
+
render_navigation(config, {
|
75
|
+
list: {
|
76
|
+
html_attributes: {
|
77
|
+
class: "nav"
|
78
|
+
}
|
79
|
+
}
|
80
|
+
})
|
81
|
+
```
|
82
|
+
|
83
|
+
A list accepts the following configuration options:
|
84
|
+
|
85
|
+
##### `:html_attributes`
|
86
|
+
HTML attributes added to an the list.
|
66
87
|
|
67
88
|
## List Item Configuration Options
|
89
|
+
|
90
|
+
List item configuration options can be supplied to all list items or a single list item. Supply options to a single list item via the navigation configuration.
|
91
|
+
|
92
|
+
```Ruby
|
93
|
+
render_navigation({
|
94
|
+
"Home" => {
|
95
|
+
path: "/",
|
96
|
+
active_class: "home-active"
|
97
|
+
}
|
98
|
+
})
|
99
|
+
```
|
100
|
+
|
101
|
+
The following options are supported.
|
102
|
+
|
68
103
|
##### `:path`
|
69
104
|
Specifies where the navigation item should link to.
|
70
105
|
|
@@ -133,12 +168,78 @@ Results in the following HTML.
|
|
133
168
|
##### `:render?`
|
134
169
|
Determines if the navigation item is rendered.
|
135
170
|
|
136
|
-
|
137
|
-
|
138
|
-
|
171
|
+
### Supplying options to all list items
|
172
|
+
List configuration options are supplied via the `:item` option when rendering a navigation. For example,
|
173
|
+
```Ruby
|
174
|
+
render_navigation(config, {
|
175
|
+
item: {
|
176
|
+
active_class: "active-item"
|
177
|
+
}
|
178
|
+
})
|
179
|
+
```
|
180
|
+
|
181
|
+
Supported options are:
|
139
182
|
|
140
183
|
##### `:active_class`
|
141
184
|
Determines which HTML class is applied to list items when the item is active.
|
142
185
|
|
143
186
|
##### `:inactive_class`
|
144
187
|
Determines which HTML class is applied to list items when the item is *not* active.
|
188
|
+
|
189
|
+
`active_class`, `inactive_class`, `html_attributes`.
|
190
|
+
|
191
|
+
## Building Custom List Renderers
|
192
|
+
|
193
|
+
To change the default list rendering from \<ul> tags to \<section> tags with an id of "nav", create a custom list renderer:
|
194
|
+
|
195
|
+
```Ruby
|
196
|
+
Navigatrix.register_list_renderer(:my_custom_list) do |renderer|
|
197
|
+
renderer.wrapper do |items, html_attributes|
|
198
|
+
content_tag(:section, items, html_attributes.merge_attribute(:id, "nav"))
|
199
|
+
end
|
200
|
+
end
|
201
|
+
```
|
202
|
+
|
203
|
+
```ERB
|
204
|
+
<%= render_navigation({
|
205
|
+
"Home" => "/",
|
206
|
+
"About Us" => "/about-us",
|
207
|
+
}, {
|
208
|
+
list: {renderer: :my_custom_list}
|
209
|
+
}) %>
|
210
|
+
```
|
211
|
+
|
212
|
+
## Building Custom Item Renderers
|
213
|
+
|
214
|
+
If the basic list and and item configuration, custom renders can be registered.
|
215
|
+
|
216
|
+
For example, to add change the default item rendering from \<li> tags to \<p> tags, create a custom item renderer:
|
217
|
+
|
218
|
+
```Ruby
|
219
|
+
Navigatrix.register_item_renderer(:my_custom_item) do |renderer|
|
220
|
+
renderer.wrapper do |content, children, html_attributes|
|
221
|
+
content(:p, content + children, html_attributes)
|
222
|
+
end
|
223
|
+
end
|
224
|
+
```
|
225
|
+
|
226
|
+
```ERB
|
227
|
+
<%= render_navigation({
|
228
|
+
"Home" => "/",
|
229
|
+
"About Us" => "/about-us",
|
230
|
+
}, {
|
231
|
+
item: {renderer: :my_custom_item}
|
232
|
+
}) %>
|
233
|
+
```
|
234
|
+
|
235
|
+
#### All item rendering options
|
236
|
+
|
237
|
+
`wrapper` - wraps item content - accepts `content, children, html_attributes`
|
238
|
+
|
239
|
+
`linked` - content when the item is linked - accepts `name, path`
|
240
|
+
|
241
|
+
`unlinked` - content when the item is not linked - accepts `name, path`
|
242
|
+
|
243
|
+
`html_attributes` - HTML attributes for the item
|
244
|
+
|
245
|
+
`children_options` - attributes passed to the child list
|
data/lib/navigatrix.rb
CHANGED
@@ -2,8 +2,31 @@ require "navigatrix/version"
|
|
2
2
|
require "navigatrix/item"
|
3
3
|
require "navigatrix/item_collection"
|
4
4
|
require "navigatrix/renderer"
|
5
|
+
require "navigatrix/builder"
|
5
6
|
require 'navigatrix/integration/rails' if defined?(Rails)
|
6
7
|
require 'navigatrix/integration/sinatra' if defined?(Sinatra)
|
7
8
|
|
8
9
|
module Navigatrix
|
10
|
+
extend self
|
11
|
+
|
12
|
+
mattr_accessor :list_renderers
|
13
|
+
|
14
|
+
self.list_renderers = {
|
15
|
+
:unordered_list => Rendering::Strategies::List,
|
16
|
+
:bootstrap_navbar => Rendering::Strategies::Bootstrap::Navbar,
|
17
|
+
:bootstrap_tabs => Rendering::Strategies::Bootstrap::Tabs
|
18
|
+
}
|
19
|
+
|
20
|
+
mattr_accessor :item_renderers
|
21
|
+
self.item_renderers = {
|
22
|
+
:item => Rendering::Strategies::Item
|
23
|
+
}
|
24
|
+
|
25
|
+
def register_list_renderer(name, &block)
|
26
|
+
list_renderers[name] = ListBuilder.build(&block)
|
27
|
+
end
|
28
|
+
|
29
|
+
def register_item_renderer(name, &block)
|
30
|
+
item_renderers[name] = ItemBuilder.build(&block)
|
31
|
+
end
|
9
32
|
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
module Navigatrix
|
2
|
+
class Builder
|
3
|
+
attr_reader :klass
|
4
|
+
|
5
|
+
def self.build(&block)
|
6
|
+
instance = new(klass)
|
7
|
+
block.call(instance)
|
8
|
+
instance.klass
|
9
|
+
end
|
10
|
+
|
11
|
+
def initialize(klass)
|
12
|
+
@klass = Class.new(klass)
|
13
|
+
end
|
14
|
+
|
15
|
+
def define_method(method_name, &block)
|
16
|
+
@klass.send(:define_method, method_name, &block)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class ListBuilder < Builder
|
21
|
+
def self.klass
|
22
|
+
Navigatrix::Rendering::Strategies::List
|
23
|
+
end
|
24
|
+
|
25
|
+
def wrapper(&block)
|
26
|
+
define_method(:render) do
|
27
|
+
instance_exec(render_items, html_attributes, &block)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
class ItemBuilder < Builder
|
33
|
+
def self.klass
|
34
|
+
Navigatrix::Rendering::Strategies::Item
|
35
|
+
end
|
36
|
+
|
37
|
+
def wrapper(&block)
|
38
|
+
define_method(:render) do
|
39
|
+
instance_exec(name_or_link, render_children, html_attributes, &block) if render?
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def linked(&block)
|
44
|
+
define_method(:linked_content) do
|
45
|
+
instance_exec(name, path, &block)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def unlinked(&block)
|
50
|
+
define_method(:unlinked_content) do
|
51
|
+
instance_exec(name, path, &block)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def children_options(&block)
|
56
|
+
define_method(:children_options) do
|
57
|
+
instance_exec(super(), &block)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def html_attributes(&block)
|
62
|
+
define_method(:html_attributes) do
|
63
|
+
instance_exec(&block).inject(super()) do |acc, (key, val)|
|
64
|
+
acc.merge_attribute(key, val)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -23,6 +23,14 @@ module Navigatrix
|
|
23
23
|
{}
|
24
24
|
end
|
25
25
|
|
26
|
+
def active_class
|
27
|
+
nil
|
28
|
+
end
|
29
|
+
|
30
|
+
def inactive_class
|
31
|
+
nil
|
32
|
+
end
|
33
|
+
|
26
34
|
def render?
|
27
35
|
true
|
28
36
|
end
|
@@ -30,6 +38,8 @@ module Navigatrix
|
|
30
38
|
|
31
39
|
class AdvancedConfig < OpenStruct
|
32
40
|
DEFAULTS = {
|
41
|
+
:active_class => nil,
|
42
|
+
:inactive_class => nil,
|
33
43
|
:html_attributes => {},
|
34
44
|
:render? => true,
|
35
45
|
:children => {}
|
data/lib/navigatrix/item.rb
CHANGED
@@ -6,7 +6,7 @@ module Navigatrix
|
|
6
6
|
class Item < Struct.new(:name, :config, :context)
|
7
7
|
extend Forwardable
|
8
8
|
delegate :current_path => :context
|
9
|
-
delegate [:render?, :html_attributes] => :config
|
9
|
+
delegate [:render?, :html_attributes, :active_class, :inactive_class] => :config
|
10
10
|
|
11
11
|
def active?
|
12
12
|
applicable_active_state? ||
|
data/lib/navigatrix/renderer.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require "navigatrix/rendering/context"
|
2
|
+
require "navigatrix/rendering/strategy_factory"
|
2
3
|
require "navigatrix/rendering/strategies/list"
|
3
4
|
require "navigatrix/rendering/strategies/bootstrap/navbar"
|
4
5
|
require "navigatrix/rendering/strategies/bootstrap/tabs"
|
@@ -7,23 +8,14 @@ module Navigatrix
|
|
7
8
|
class Renderer
|
8
9
|
attr_reader :configuration, :strategy, :render_context, :render_options
|
9
10
|
|
10
|
-
REGISTERED_STRATEGIES = {
|
11
|
-
:unordered_list => Rendering::Strategies::List,
|
12
|
-
:bootstrap_navbar => Rendering::Strategies::Bootstrap::Navbar,
|
13
|
-
:bootstrap_tabs => Rendering::Strategies::Bootstrap::Tabs
|
14
|
-
}
|
15
|
-
|
16
|
-
class MissingStrategy < NameError ; end
|
17
|
-
|
18
11
|
def initialize(configuration, options)
|
19
12
|
@configuration = configuration
|
20
|
-
@strategy = find_strategy(options.delete(:strategy))
|
21
13
|
@render_context = Rendering::Context.new(options.delete(:render_context))
|
22
14
|
@render_options = options
|
23
15
|
end
|
24
16
|
|
25
17
|
def render
|
26
|
-
strategy.new(item_collection.items,
|
18
|
+
strategy.new(item_collection.items, list_options, item_options).render
|
27
19
|
end
|
28
20
|
|
29
21
|
private
|
@@ -32,10 +24,24 @@ module Navigatrix
|
|
32
24
|
ItemCollection.new(configuration, render_context)
|
33
25
|
end
|
34
26
|
|
35
|
-
def
|
36
|
-
|
37
|
-
|
38
|
-
|
27
|
+
def strategy
|
28
|
+
Rendering::StrategyFactory.find_list_strategy(strategy_name)
|
29
|
+
end
|
30
|
+
|
31
|
+
def strategy_name
|
32
|
+
render_options.fetch(:list, {})[:renderer]
|
33
|
+
end
|
34
|
+
|
35
|
+
def list_options
|
36
|
+
base = render_options[:html_attributes]
|
37
|
+
(base ? {html_attributes: base} : {})
|
38
|
+
.merge(render_options.fetch(:list, {}))
|
39
|
+
end
|
40
|
+
|
41
|
+
def item_options
|
42
|
+
render_options
|
43
|
+
.slice(:active_class, :inactive_class)
|
44
|
+
.merge(render_options.fetch(:item, {}))
|
39
45
|
end
|
40
46
|
end
|
41
47
|
end
|
@@ -1,36 +1,40 @@
|
|
1
1
|
require "navigatrix/rendering/strategies/list"
|
2
2
|
|
3
|
-
module Navigatrix
|
4
|
-
module
|
5
|
-
|
3
|
+
module Navigatrix
|
4
|
+
module Rendering
|
5
|
+
module Strategies
|
6
|
+
module Bootstrap
|
7
|
+
class Navbar < List
|
6
8
|
|
7
|
-
|
9
|
+
private
|
8
10
|
|
9
|
-
|
10
|
-
|
11
|
-
|
11
|
+
def html_attributes
|
12
|
+
super.merge_attribute(:class, "nav")
|
13
|
+
end
|
12
14
|
|
13
|
-
|
14
|
-
|
15
|
-
|
15
|
+
def items
|
16
|
+
super.map { |item| (item.has_children? ? Item : Strategies::Item).new(item, options) }
|
17
|
+
end
|
16
18
|
|
17
|
-
|
18
|
-
|
19
|
+
class Item < Strategies::Item
|
20
|
+
private
|
19
21
|
|
20
|
-
|
21
|
-
|
22
|
-
|
22
|
+
def html_attributes
|
23
|
+
super.merge_attribute(:class, "dropdown")
|
24
|
+
end
|
23
25
|
|
24
|
-
|
25
|
-
|
26
|
-
|
26
|
+
def name
|
27
|
+
(super + dropdown_icon).html_safe
|
28
|
+
end
|
27
29
|
|
28
|
-
|
29
|
-
|
30
|
-
|
30
|
+
def nested_list
|
31
|
+
List.new(children, options).render if has_children?
|
32
|
+
end
|
31
33
|
|
32
|
-
|
33
|
-
|
34
|
+
def dropdown_icon
|
35
|
+
options[:dropdown_icon] || content_tag(:i, nil, :class => "icon-chevron-down icon-white")
|
36
|
+
end
|
37
|
+
end
|
34
38
|
end
|
35
39
|
end
|
36
40
|
end
|
@@ -1,11 +1,15 @@
|
|
1
|
-
module Navigatrix
|
2
|
-
module
|
3
|
-
|
1
|
+
module Navigatrix
|
2
|
+
module Rendering
|
3
|
+
module Strategies
|
4
|
+
module Bootstrap
|
5
|
+
class Tabs < List
|
4
6
|
|
5
|
-
|
7
|
+
private
|
6
8
|
|
7
|
-
|
8
|
-
|
9
|
+
def html_attributes
|
10
|
+
super.merge_attribute(:class, "nav nav-tabs")
|
11
|
+
end
|
12
|
+
end
|
9
13
|
end
|
10
14
|
end
|
11
15
|
end
|