xebec 2.0.0 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +4 -0
- data/VERSION +1 -1
- data/lib/xebec/has_nav_bars.rb +10 -4
- data/lib/xebec/nav_bar.rb +5 -1
- data/lib/xebec/nav_bar_helper.rb +7 -7
- data/lib/xebec/nav_bar_proxy.rb +7 -5
- data/lib/xebec.rb +9 -0
- data/test/nav_bar_helper_test.rb +5 -0
- data/test/nav_bar_proxy_test.rb +20 -0
- metadata +2 -2
data/README.md
CHANGED
@@ -62,6 +62,10 @@ If you only have one navigation bar on your site, you can leave off the name, li
|
|
62
62
|
|
63
63
|
<%= nav_bar %>
|
64
64
|
|
65
|
+
If you want to add extra HTML attributes to the root navigation bar element (say, for compatibility with existing CSS and Javascript), you can pass them to the `nav_bar` call:
|
66
|
+
|
67
|
+
<%= nav_bar :site, :id => 'sitenav' %>
|
68
|
+
|
65
69
|
Xebec will assign this navigation bar the name `:default` in case you need to refer to it elsewhere, but you probably won't.
|
66
70
|
|
67
71
|
#### Populating a Navigation Bar ####
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.
|
1
|
+
2.1.0
|
data/lib/xebec/has_nav_bars.rb
CHANGED
@@ -11,15 +11,21 @@ module Xebec
|
|
11
11
|
# Looks up the named nav bar, creates it if it
|
12
12
|
# doesn't exist, and evaluates the the block, if
|
13
13
|
# given, in the scope of +self+, yielding the nav bar.
|
14
|
-
|
14
|
+
#
|
15
|
+
# @param [Symbol, String] name the name of the navigation bar to look up
|
16
|
+
# @param [Hash] html_attributes additional HTML attributes to add to the
|
17
|
+
# navigation bar
|
18
|
+
def look_up_nav_bar_and_eval(name = nil, html_attributes = {}, &block)
|
15
19
|
name ||= Xebec::NavBar::DEFAULT_NAME
|
16
|
-
look_up_nav_bar(name).tap do |bar|
|
20
|
+
look_up_nav_bar(name, html_attributes).tap do |bar|
|
17
21
|
block.bind(self).call(bar) if block_given?
|
18
22
|
end
|
19
23
|
end
|
20
24
|
|
21
|
-
def look_up_nav_bar(name)
|
22
|
-
nav_bars[name] ||= NavBar.new(name)
|
25
|
+
def look_up_nav_bar(name, html_attributes)
|
26
|
+
(nav_bars[name] ||= NavBar.new(name, html_attributes)).tap do |bar|
|
27
|
+
bar.html_attributes.merge!(html_attributes)
|
28
|
+
end
|
23
29
|
end
|
24
30
|
|
25
31
|
def nav_bars
|
data/lib/xebec/nav_bar.rb
CHANGED
@@ -8,13 +8,17 @@ module Xebec
|
|
8
8
|
|
9
9
|
attr_reader :name
|
10
10
|
attr_reader :items
|
11
|
+
attr_reader :html_attributes
|
11
12
|
attr_accessor :current
|
12
13
|
|
13
14
|
# Create a new NavBar object.
|
14
15
|
#
|
15
16
|
# @param [String] name the name of the navigation bar; defaults to :default
|
16
|
-
|
17
|
+
# @param [Hash] html_attributes additional HTML attributes for the
|
18
|
+
# navigation bar, e.g. { :id => 'my-navbar' }
|
19
|
+
def initialize(name = nil, html_attributes = nil)
|
17
20
|
@name = name || DEFAULT_NAME
|
21
|
+
@html_attributes = html_attributes || {}
|
18
22
|
@items = []
|
19
23
|
@current = nil
|
20
24
|
end
|
data/lib/xebec/nav_bar_helper.rb
CHANGED
@@ -13,7 +13,7 @@ module Xebec
|
|
13
13
|
# or "=navbar" in HAML), renders the navigation bar.
|
14
14
|
#
|
15
15
|
# @example
|
16
|
-
# <%= navbar :tabs%>
|
16
|
+
# <%= navbar :tabs %>
|
17
17
|
# # => <ul class="navbar tabs">...</ul>
|
18
18
|
#
|
19
19
|
# @see Xebec::NavBarProxy#to_s
|
@@ -31,8 +31,8 @@ module Xebec
|
|
31
31
|
# @see Xebec::HasNavBars#nav_bar
|
32
32
|
#
|
33
33
|
# @return [Xebec::NavBarProxy]
|
34
|
-
def nav_bar(name = nil, &block)
|
35
|
-
look_up_nav_bar_and_eval name, &block
|
34
|
+
def nav_bar(name = nil, html_attributes = {}, &block)
|
35
|
+
look_up_nav_bar_and_eval name, html_attributes, &block
|
36
36
|
end
|
37
37
|
|
38
38
|
# Renders a navigation bar if and only if it contains any
|
@@ -40,8 +40,8 @@ module Xebec
|
|
40
40
|
# accept a block.
|
41
41
|
#
|
42
42
|
# @return [String, Xebec::NavBarProxy]
|
43
|
-
def nav_bar_unless_empty(name = nil)
|
44
|
-
bar = look_up_nav_bar name
|
43
|
+
def nav_bar_unless_empty(name = nil, html_attributes = {})
|
44
|
+
bar = look_up_nav_bar name, html_attributes
|
45
45
|
bar.empty? ? '' : bar
|
46
46
|
end
|
47
47
|
|
@@ -63,8 +63,8 @@ EOS
|
|
63
63
|
|
64
64
|
# Override HasNavBars#look_up_nav_bar to replace with a
|
65
65
|
# proxy if necessary.
|
66
|
-
def look_up_nav_bar(name)
|
67
|
-
bar = super(name)
|
66
|
+
def look_up_nav_bar(name, html_attributes)
|
67
|
+
bar = super(name, html_attributes)
|
68
68
|
if bar.kind_of?(Xebec::NavBar)
|
69
69
|
bar = nav_bars[bar.name] = NavBarProxy.new(bar, self)
|
70
70
|
end
|
data/lib/xebec/nav_bar_proxy.rb
CHANGED
@@ -70,19 +70,21 @@ module Xebec
|
|
70
70
|
attr_reader :bar, :helper
|
71
71
|
|
72
72
|
def root_navbar_element
|
73
|
-
|
73
|
+
html_attributes = bar.html_attributes
|
74
|
+
html_attributes[:class] ||= ''
|
75
|
+
(html_attributes[:class] << " #{bar.name}").strip!
|
74
76
|
if helper.user_agent_supports_html5?
|
75
|
-
return :nav,
|
77
|
+
return :nav, html_attributes
|
76
78
|
else
|
77
|
-
|
78
|
-
return :div,
|
79
|
+
html_attributes[:class] << " navbar"
|
80
|
+
return :div, html_attributes
|
79
81
|
end
|
80
82
|
end
|
81
83
|
|
82
84
|
def render_nav_item(item)
|
83
85
|
text = text_for_nav_item item
|
84
86
|
href = href_for_nav_item item
|
85
|
-
options = is_current_nav_item?(item, href) ? { :class =>
|
87
|
+
options = is_current_nav_item?(item, href) ? { :class => Xebec.currently_selected_nav_item_class } : {}
|
86
88
|
helper.content_tag :li, options do
|
87
89
|
helper.link_to_unless_current text, href
|
88
90
|
end
|
data/lib/xebec.rb
CHANGED
@@ -1,5 +1,14 @@
|
|
1
1
|
module Xebec
|
2
2
|
|
3
|
+
class <<self
|
4
|
+
|
5
|
+
# The CSS class that is added to navigation items that are
|
6
|
+
# "active." Defaults to "current."
|
7
|
+
attr_accessor :currently_selected_nav_item_class
|
8
|
+
|
9
|
+
end
|
10
|
+
self.currently_selected_nav_item_class = :current
|
11
|
+
|
3
12
|
autoload :NavBarHelper, 'xebec/nav_bar_helper'
|
4
13
|
autoload :ControllerSupport, 'xebec/controller_support'
|
5
14
|
autoload :StylesheetGenerator, 'xebec/stylesheet_generator'
|
data/test/nav_bar_helper_test.rb
CHANGED
@@ -27,6 +27,11 @@ class NavBarHelperTest < Test::Unit::TestCase
|
|
27
27
|
assert_equal desserts, @helper.nav_bar('desserts')
|
28
28
|
end
|
29
29
|
|
30
|
+
should 'allow additional HTML attributes' do
|
31
|
+
salads = @helper.nav_bar(:salads, :id => 'salads-nav')
|
32
|
+
assert_equal 'salads-nav', @helper.nav_bar(:salads).html_attributes[:id]
|
33
|
+
end
|
34
|
+
|
30
35
|
should "evaluate a block in the helper's scope" do
|
31
36
|
@helper.expects(:zoink!)
|
32
37
|
@helper.nav_bar do
|
data/test/nav_bar_proxy_test.rb
CHANGED
@@ -33,6 +33,12 @@ class NavBarProxyTest < Test::Unit::TestCase
|
|
33
33
|
assert_equal 'elephants', @proxy.name
|
34
34
|
end
|
35
35
|
|
36
|
+
should 'support additional HTML properties' do
|
37
|
+
@bar.html_attributes.merge!(:id => 'salads-nav')
|
38
|
+
assert_equal({:id => 'salads-nav'}, @proxy.html_attributes)
|
39
|
+
assert_select_from @proxy.to_s, '#salads-nav'
|
40
|
+
end
|
41
|
+
|
36
42
|
should 'not respond to a method that the underlying NavBar does not' do
|
37
43
|
assert !@proxy.respond_to?(:cromulize)
|
38
44
|
end
|
@@ -89,6 +95,20 @@ class NavBarProxyTest < Test::Unit::TestCase
|
|
89
95
|
assert_select 'li.current', 'Foo'
|
90
96
|
end
|
91
97
|
end
|
98
|
+
context 'when Xebec is configured to use a different "current" class' do
|
99
|
+
setup do
|
100
|
+
@old_class = Xebec.currently_selected_nav_item_class
|
101
|
+
Xebec.currently_selected_nav_item_class = 'active'
|
102
|
+
end
|
103
|
+
should 'use the configured CSS class' do
|
104
|
+
assert_select_from @proxy.to_s, 'ul' do
|
105
|
+
assert_select 'li.active', 'Foo'
|
106
|
+
end
|
107
|
+
end
|
108
|
+
teardown do
|
109
|
+
Xebec.currently_selected_nav_item_class = @old_class
|
110
|
+
end
|
111
|
+
end
|
92
112
|
end
|
93
113
|
|
94
114
|
context 'with a NavBar that has a navigation item not set as current' do
|