simple-navigation 2.1.0 → 2.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +6 -0
- data/VERSION.yml +1 -1
- data/generators/navigation_config/templates/config/navigation.rb +1 -6
- data/lib/simple_navigation.rb +16 -1
- data/lib/simple_navigation/configuration.rb +8 -2
- data/lib/simple_navigation/helpers.rb +29 -19
- data/lib/simple_navigation/item_container.rb +3 -3
- data/lib/simple_navigation/renderer/base.rb +42 -8
- data/lib/simple_navigation/renderer/list.rb +6 -10
- data/simple-navigation.gemspec +2 -2
- data/spec/lib/simple_navigation/configuration_spec.rb +9 -3
- data/spec/lib/simple_navigation/helpers_spec.rb +59 -36
- data/spec/lib/simple_navigation/item_container_spec.rb +5 -8
- data/spec/lib/simple_navigation/renderer/base_spec.rb +152 -1
- data/spec/lib/simple_navigation/renderer/list_spec.rb +12 -18
- data/spec/lib/simple_navigation_spec.rb +21 -3
- metadata +2 -2
data/CHANGELOG
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
*2.2.0
|
2
|
+
|
3
|
+
* Allow Ranges for :level option. Credits to Ying Tsen Hong.
|
4
|
+
* Changing the API of Helpers#render_navigation. Now supports Ranges for :level option and :expand_all to render all levels as expanded. Old Api is still supported, but deprecated.
|
5
|
+
* Deprecated render_all_levels in config-file.
|
6
|
+
|
1
7
|
*2.1.0
|
2
8
|
|
3
9
|
* included Ben Marini's commit which allows individual id-generators. Thanks Ben!
|
data/VERSION.yml
CHANGED
@@ -6,12 +6,7 @@ SimpleNavigation::Configuration.run do |navigation|
|
|
6
6
|
|
7
7
|
# Specify the class that will be applied to active navigation items. Defaults to 'selected'
|
8
8
|
# navigation.selected_class = 'your_selected_class'
|
9
|
-
|
10
|
-
# Normally only the current sub menu is renderedwhen render_navigation is called
|
11
|
-
# setting this to true render all submenus which is useful for javascript
|
12
|
-
# driven hovering menus like the jquery superfish plugin
|
13
|
-
# navigation.render_all_levels = true
|
14
|
-
|
9
|
+
|
15
10
|
# Item keys are normally added to list items as id.
|
16
11
|
# This setting turns that off
|
17
12
|
# navigation.autogenerate_item_ids = false
|
data/lib/simple_navigation.rb
CHANGED
@@ -55,8 +55,23 @@ module SimpleNavigation
|
|
55
55
|
self.controller.instance_variable_get(:"@sn_current_navigation_#{level}")
|
56
56
|
end
|
57
57
|
|
58
|
+
# Returns the active item container for the specified level. Valid levels are
|
59
|
+
# * :all - in this case the primary_navigation is returned.
|
60
|
+
# * a specific level - the active item_container for the specified level will be returned
|
61
|
+
# * a range of levels - the active item_container for the range's minimum will be returned
|
62
|
+
#
|
63
|
+
# Returns nil if there is no active item_container for the specified level.
|
58
64
|
def active_item_container_for(level)
|
59
|
-
|
65
|
+
case level
|
66
|
+
when :all
|
67
|
+
self.primary_navigation
|
68
|
+
when Integer
|
69
|
+
self.primary_navigation.active_item_container_for(level)
|
70
|
+
when Range
|
71
|
+
self.primary_navigation.active_item_container_for(level.min)
|
72
|
+
else
|
73
|
+
raise ArgumentError, "Invalid navigation level: #{level}"
|
74
|
+
end
|
60
75
|
end
|
61
76
|
|
62
77
|
# If any navigation has been explicitely set in the controller this method evaluates the specified args set in the controller and sets
|
@@ -6,7 +6,8 @@ module SimpleNavigation
|
|
6
6
|
class Configuration
|
7
7
|
include Singleton
|
8
8
|
|
9
|
-
attr_accessor :renderer, :selected_class, :
|
9
|
+
attr_accessor :renderer, :selected_class, :autogenerate_item_ids, :id_generator, :auto_highlight
|
10
|
+
attr_reader :render_all_levels
|
10
11
|
attr_reader :primary_navigation
|
11
12
|
|
12
13
|
class << self
|
@@ -45,12 +46,17 @@ module SimpleNavigation
|
|
45
46
|
def initialize
|
46
47
|
@renderer = SimpleNavigation::Renderer::List
|
47
48
|
@selected_class = 'selected'
|
48
|
-
@render_all_levels = false
|
49
49
|
@autogenerate_item_ids = true
|
50
50
|
@id_generator = Proc.new {|id| id.to_s }
|
51
51
|
@auto_highlight = true
|
52
52
|
end
|
53
53
|
|
54
|
+
# Adds a deprecation warning when this options is set in the config file
|
55
|
+
def render_all_levels=(do_it)
|
56
|
+
ActiveSupport::Deprecation.warn("Setting render_all_levels in the config-file has been deprected. Please use render_navigation(:expand_all => true) instead")
|
57
|
+
@render_all_levels = do_it
|
58
|
+
end
|
59
|
+
|
54
60
|
# This is the main method for specifying the navigation items. It can be used in two ways:
|
55
61
|
#
|
56
62
|
# 1. Declaratively specify your items in the config/navigation.rb file using a block. It then yields an SimpleNavigation::ItemContainer for adding navigation items.
|
@@ -3,8 +3,10 @@ module SimpleNavigation
|
|
3
3
|
# View helpers to render the navigation.
|
4
4
|
#
|
5
5
|
# Use render_navigation as following to render your navigation:
|
6
|
-
# * call <tt>render_navigation</tt> without :level option to render your navigation as nested tree.
|
6
|
+
# * call <tt>render_navigation</tt> without :level option to render your complete navigation as nested tree.
|
7
7
|
# * call <tt>render_navigation(:level => x)</tt> to render a specific navigation level (e.g. :level => 1 to render your primary navigation, :level => 2 to render the sub navigation and so forth)
|
8
|
+
# * call <tt>render_navigation(:level => 2..3)</tt> to render navigation levels 2 and 3).
|
9
|
+
# For example, you could use render_navigation(:level => 1) to render your primary navigation as tabs and render_navigation(:level => 2..3) to render the rest of the navigation as a tree in a sidebar.
|
8
10
|
#
|
9
11
|
# ==== Examples (using Haml)
|
10
12
|
# #primary_navigation= render_navigation(:level => 1)
|
@@ -13,49 +15,44 @@ module SimpleNavigation
|
|
13
15
|
#
|
14
16
|
# #nested_navigation= render_navigation
|
15
17
|
#
|
16
|
-
#
|
18
|
+
# #top_navigation= render_navigation(:level => 1..2)
|
19
|
+
# #sidebar_navigation= render_navigation(:level => 3)
|
17
20
|
module Helpers
|
18
21
|
|
19
22
|
# Renders the navigation according to the specified options-hash.
|
20
23
|
#
|
21
24
|
# The following options are supported:
|
22
|
-
# * <tt>:level</tt> - defaults to :
|
25
|
+
# * <tt>:level</tt> - defaults to :all which renders the the sub_navigation for an active primary_navigation inside that active primary_navigation item.
|
23
26
|
# Specify a specific level to only render that level of navigation (e.g. :level => 1 for primary_navigation etc...).
|
27
|
+
# Specifiy a Range of levels to render only those specific levels (e.g. :level => 1..2 to render both your first and second levels, maybe you want to render your third level somewhere else on the page)
|
28
|
+
# * <tt>:expand_all</tt> - defaults to false. If set to true the all specified levels will be rendered as a fully expanded tree (always open). This is useful for javascript menus like Superfish.
|
24
29
|
# * <tt>:context</tt> - specifies the context for which you would render the navigation. Defaults to :default which loads the default navigation.rb (i.e. config/navigation.rb).
|
25
30
|
# If you specify a context then the plugin tries to load the configuration file for that context, e.g. if you call <tt>render_navigation(:context => :admin)</tt> the file config/admin_navigation.rb
|
26
31
|
# will be loaded and used for rendering the navigation.
|
27
|
-
# * <tt>:all_open</tt> - setting this options to true means that all items are always open (ie. fully expanded tree). Same as setting render_all_levels option in the config-file.
|
28
32
|
# * <tt>:items</tt> - you can specify the items directly (e.g. if items are dynamically generated from database). See SimpleNavigation::ItemsProvider for documentation on what to provide as items.
|
29
33
|
def render_navigation(*args)
|
30
34
|
args = [Hash.new] if args.empty?
|
31
35
|
options = extract_backwards_compatible_options(*args)
|
32
|
-
options = {:context => :default, :level => :
|
33
|
-
|
34
|
-
SimpleNavigation
|
35
|
-
SimpleNavigation.
|
36
|
+
options = {:context => :default, :level => :all}.merge(options)
|
37
|
+
ctx = options.delete(:context)
|
38
|
+
SimpleNavigation.load_config(ctx) rescue nil
|
39
|
+
SimpleNavigation::Configuration.eval_config(self, ctx) rescue nil
|
36
40
|
SimpleNavigation.config.items(options[:items]) if options[:items]
|
37
41
|
SimpleNavigation.handle_explicit_navigation
|
38
42
|
raise "no primary navigation defined, either use a navigation config file or pass items directly to render_navigation" unless SimpleNavigation.primary_navigation
|
39
|
-
|
40
|
-
|
41
|
-
active_item_container = SimpleNavigation.active_item_container_for(options[:level])
|
42
|
-
active_item_container.render if active_item_container
|
43
|
-
when :nested
|
44
|
-
SimpleNavigation.primary_navigation.render(true)
|
45
|
-
else
|
46
|
-
raise ArgumentError, "Invalid navigation level: #{options[:level]}"
|
47
|
-
end
|
43
|
+
active_item_container = SimpleNavigation.active_item_container_for(options[:level])
|
44
|
+
active_item_container.render(options) unless active_item_container.nil?
|
48
45
|
end
|
49
46
|
|
50
47
|
# Deprecated. Renders the primary_navigation with the configured renderer. Calling render_navigation(:level => 0) has the same effect.
|
51
48
|
def render_primary_navigation(options = {})
|
52
|
-
ActiveSupport::Deprecation.warn("SimpleNavigation::Helpers.render_primary_navigation has been
|
49
|
+
ActiveSupport::Deprecation.warn("SimpleNavigation::Helpers.render_primary_navigation has been deprecated. Please use render_navigation(:level => 1) instead")
|
53
50
|
render_navigation(options.merge(:level => 1))
|
54
51
|
end
|
55
52
|
|
56
53
|
# Deprecated. Renders the sub_navigation with the configured renderer. Calling render_navigation(:level => 1) has the same effect.
|
57
54
|
def render_sub_navigation(options = {})
|
58
|
-
ActiveSupport::Deprecation.warn("SimpleNavigation::Helpers.render_primary_navigation has been
|
55
|
+
ActiveSupport::Deprecation.warn("SimpleNavigation::Helpers.render_primary_navigation has been deprecated. Please use render_navigation(:level => 2) instead")
|
59
56
|
render_navigation(options.merge(:level => 2))
|
60
57
|
end
|
61
58
|
|
@@ -65,20 +62,33 @@ module SimpleNavigation
|
|
65
62
|
case args.first
|
66
63
|
when Hash
|
67
64
|
options = args.first
|
65
|
+
options[:level] = options.delete(:levels) if options[:levels]
|
66
|
+
deprecated_api! if options[:level] == :primary || options[:level] == :secondary || options[:level] == :nested
|
68
67
|
options[:level] = 1 if options[:level] == :primary
|
69
68
|
options[:level] = 2 if options[:level] == :secondary
|
69
|
+
options[:level] = :all if options[:level] == :nested
|
70
70
|
when Symbol
|
71
|
+
deprecated_api!
|
71
72
|
raise ArgumentError, "Invalid arguments" unless [:primary, :secondary, :nested].include? args.first
|
72
73
|
options = Hash.new
|
73
74
|
options[:level] = args.first
|
75
|
+
options[:level] = :all if options[:level] == :nested
|
74
76
|
options[:level] = 1 if options[:level] == :primary
|
75
77
|
options[:level] = 2 if options[:level] == :secondary
|
76
78
|
options.merge!(args[1] || {})
|
77
79
|
else
|
78
80
|
raise ArgumentError, "Invalid arguments"
|
79
81
|
end
|
82
|
+
if options[:all_open]
|
83
|
+
options[:expand_all] = options.delete(:all_open)
|
84
|
+
ActiveSupport::Deprecation.warn("render_navigation(:all_open => true) has been deprecated, please use render_navigation(:expand_all => true) instead")
|
85
|
+
end
|
80
86
|
options
|
81
87
|
end
|
82
88
|
|
89
|
+
def deprecated_api!
|
90
|
+
ActiveSupport::Deprecation.warn("You are using a deprecated API of SimpleNavigation::Helpers.render_navigation, please check the documentation on http://wiki.github.com/andi/simple-navigation")
|
91
|
+
end
|
92
|
+
|
83
93
|
end
|
84
94
|
end
|
@@ -66,9 +66,9 @@ module SimpleNavigation
|
|
66
66
|
|
67
67
|
# Renders the items in this ItemContainer using the configured renderer.
|
68
68
|
#
|
69
|
-
#
|
70
|
-
def render(
|
71
|
-
self.renderer.new.render(self
|
69
|
+
# The options are the same as in the view's render_navigation call (they get passed on)
|
70
|
+
def render(options={})
|
71
|
+
self.renderer.new(options).render(self)
|
72
72
|
end
|
73
73
|
|
74
74
|
# Returns true if any of this container's items is selected.
|
@@ -8,7 +8,7 @@ module SimpleNavigation
|
|
8
8
|
include ActionView::Helpers::UrlHelper
|
9
9
|
include ActionView::Helpers::TagHelper
|
10
10
|
|
11
|
-
attr_reader :controller
|
11
|
+
attr_reader :controller, :options
|
12
12
|
|
13
13
|
class << self
|
14
14
|
|
@@ -23,21 +23,55 @@ module SimpleNavigation
|
|
23
23
|
|
24
24
|
controller_method :form_authenticity_token, :protect_against_forgery?, :request_forgery_protection_token
|
25
25
|
|
26
|
-
def initialize #:nodoc:
|
26
|
+
def initialize(options) #:nodoc:
|
27
|
+
@options = options
|
27
28
|
@controller = SimpleNavigation.controller
|
28
29
|
end
|
29
30
|
|
31
|
+
def expand_all?
|
32
|
+
!!options[:expand_all]
|
33
|
+
end
|
34
|
+
|
35
|
+
def level
|
36
|
+
options[:level] || :all
|
37
|
+
end
|
38
|
+
|
39
|
+
def include_sub_navigation?(item)
|
40
|
+
consider_sub_navigation?(item) && expand_sub_navigation?(item)
|
41
|
+
end
|
42
|
+
|
43
|
+
def render_sub_navigation_for(item)
|
44
|
+
item.sub_navigation.render(self.options)
|
45
|
+
end
|
46
|
+
|
30
47
|
# Renders the specified ItemContainer to HTML.
|
31
48
|
#
|
32
|
-
#
|
33
|
-
#
|
34
|
-
#
|
35
|
-
# A renderer should also take the option SimpleNavigation.config.render_all_levels into account. If it is set to true then it should render all navigation levels
|
36
|
-
# independent of the <tt>include_sub_navigation</tt> option.
|
49
|
+
# When implementing a renderer, please consider to call include_sub_navigation? to determin
|
50
|
+
# whether an item's sub_navigation should be rendered or not.
|
37
51
|
#
|
38
|
-
def render(item_container
|
52
|
+
def render(item_container)
|
39
53
|
raise 'subclass responsibility'
|
40
54
|
end
|
55
|
+
|
56
|
+
protected
|
57
|
+
|
58
|
+
def consider_sub_navigation?(item)
|
59
|
+
return false if item.sub_navigation.nil?
|
60
|
+
case level
|
61
|
+
when :all
|
62
|
+
return true
|
63
|
+
when Integer
|
64
|
+
return false
|
65
|
+
when Range
|
66
|
+
return item.sub_navigation.level <= level.max
|
67
|
+
end
|
68
|
+
false
|
69
|
+
end
|
70
|
+
|
71
|
+
def expand_sub_navigation?(item)
|
72
|
+
expand_all? || item.selected?
|
73
|
+
end
|
74
|
+
|
41
75
|
|
42
76
|
end
|
43
77
|
end
|
@@ -4,28 +4,24 @@ module SimpleNavigation
|
|
4
4
|
# Renders an ItemContainer as a <ul> element and its containing items as <li> elements.
|
5
5
|
# It adds the 'selected' class to li element AND the link inside the li element that is currently active.
|
6
6
|
#
|
7
|
-
# If the sub navigation should be included, it renders another <ul> containing the sub navigation inside the active <li> element.
|
8
|
-
#
|
9
|
-
# If the SimpleNavigation.config.render_all_levels option is set to true, it always renders all levels of navigation (fully expanded tree).
|
7
|
+
# If the sub navigation should be included (based on the level and expand_all options), it renders another <ul> containing the sub navigation inside the active <li> element.
|
10
8
|
#
|
11
9
|
# By default, the renderer sets the item's key as dom_id for the rendered <li> element unless the config option <tt>autogenerate_item_ids</tt> is set to false.
|
12
10
|
# The id can also be explicitely specified by setting the id in the html-options of the 'item' method in the config/navigation.rb file.
|
13
11
|
class List < SimpleNavigation::Renderer::Base
|
14
12
|
|
15
|
-
def render(item_container
|
13
|
+
def render(item_container)
|
16
14
|
list_content = item_container.items.inject([]) do |list, item|
|
17
15
|
html_options = item.html_options
|
18
16
|
li_content = link_to(item.name, item.url, :class => item.selected_class, :method => item.method)
|
19
|
-
if item
|
20
|
-
|
21
|
-
li_content << (item.sub_navigation.render(include_sub_navigation))
|
22
|
-
end
|
17
|
+
if include_sub_navigation?(item)
|
18
|
+
li_content << render_sub_navigation_for(item)
|
23
19
|
end
|
24
20
|
list << content_tag(:li, li_content, html_options)
|
25
21
|
end
|
26
22
|
content_tag(:ul, list_content.join, {:id => item_container.dom_id, :class => item_container.dom_class})
|
27
23
|
end
|
28
|
-
|
29
24
|
end
|
25
|
+
|
30
26
|
end
|
31
|
-
end
|
27
|
+
end
|
data/simple-navigation.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{simple-navigation}
|
8
|
-
s.version = "2.
|
8
|
+
s.version = "2.2.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Andi Schacke"]
|
12
|
-
s.date = %q{
|
12
|
+
s.date = %q{2010-01-17}
|
13
13
|
s.description = %q{With the simple-navigation gem installed you can easily create multilevel navigations for your Ruby on Rails applications. The navigation is defined in a single configuration file. It supports automatic as well as explicit highlighting of the currently active navigation.}
|
14
14
|
s.email = %q{andreas.schacke@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -120,9 +120,6 @@ describe SimpleNavigation::Configuration do
|
|
120
120
|
it "should set the selected_class to 'selected' as default" do
|
121
121
|
@config.selected_class.should == 'selected'
|
122
122
|
end
|
123
|
-
it "should set render_all_levels to false as default" do
|
124
|
-
@config.render_all_levels.should be_false
|
125
|
-
end
|
126
123
|
it "should set autogenerate_item_ids to true as default" do
|
127
124
|
@config.autogenerate_item_ids.should be_true
|
128
125
|
end
|
@@ -186,6 +183,15 @@ describe SimpleNavigation::Configuration do
|
|
186
183
|
end
|
187
184
|
end
|
188
185
|
|
186
|
+
describe 'render_all_levels=' do
|
187
|
+
it "should set the instance var" do
|
188
|
+
ActiveSupport::Deprecation.silence do
|
189
|
+
@config.render_all_levels = true
|
190
|
+
@config.render_all_levels.should be_true
|
191
|
+
end
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
189
195
|
describe 'loaded?' do
|
190
196
|
it "should return true if primary_nav is set" do
|
191
197
|
@config.instance_variable_set(:@primary_navigation, :bla)
|
@@ -34,28 +34,7 @@ describe SimpleNavigation::Helpers do
|
|
34
34
|
SimpleNavigation::Configuration.should_receive(:eval_config).with(@controller, :default)
|
35
35
|
@controller.render_navigation
|
36
36
|
end
|
37
|
-
|
38
|
-
describe "regarding setting the 'render_all_levels' option" do
|
39
|
-
context 'all_open is not specified' do
|
40
|
-
it "should not set the option" do
|
41
|
-
SimpleNavigation.config.should_not_receive(:render_all_levels=)
|
42
|
-
@controller.render_navigation
|
43
|
-
end
|
44
|
-
end
|
45
|
-
context 'all_open is true' do
|
46
|
-
it "should set the option to true" do
|
47
|
-
SimpleNavigation.config.should_receive(:render_all_levels=).with(true)
|
48
|
-
@controller.render_navigation(:all_open => true)
|
49
|
-
end
|
50
|
-
end
|
51
|
-
context 'all_open is false' do
|
52
|
-
it "should set the option to false" do
|
53
|
-
SimpleNavigation.config.should_receive(:render_all_levels=).with(false)
|
54
|
-
@controller.render_navigation(:all_open => false)
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
37
|
+
|
59
38
|
describe 'regarding setting of items' do
|
60
39
|
context 'not items specified in options' do
|
61
40
|
it "should not set the items directly" do
|
@@ -81,17 +60,43 @@ describe SimpleNavigation::Helpers do
|
|
81
60
|
it {lambda {@controller.render_navigation}.should raise_error}
|
82
61
|
end
|
83
62
|
|
63
|
+
context 'rendering of the item_container' do
|
64
|
+
before(:each) do
|
65
|
+
@active_item_container = stub(:item_container, :null_object => true)
|
66
|
+
SimpleNavigation.stub!(:active_item_container_for => @active_item_container)
|
67
|
+
end
|
68
|
+
it "should lookup the active_item_container based on the level" do
|
69
|
+
SimpleNavigation.should_receive(:active_item_container_for).with(:all)
|
70
|
+
@controller.render_navigation
|
71
|
+
end
|
72
|
+
context 'active_item_container is nil' do
|
73
|
+
before(:each) do
|
74
|
+
SimpleNavigation.stub!(:active_item_container_for => nil)
|
75
|
+
end
|
76
|
+
it "should not call render" do
|
77
|
+
@active_item_container.should_not_receive(:render)
|
78
|
+
@controller.render_navigation
|
79
|
+
end
|
80
|
+
end
|
81
|
+
context 'active_item_container is not nil' do
|
82
|
+
it "should call render on the container" do
|
83
|
+
@active_item_container.should_receive(:render)
|
84
|
+
@controller.render_navigation
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
84
89
|
context 'primary' do
|
85
90
|
it "should call render on the primary_navigation" do
|
86
91
|
@primary_navigation.should_receive(:render)
|
87
|
-
@controller.render_navigation(:primary)
|
92
|
+
ActiveSupport::Deprecation.silence {@controller.render_navigation(:primary)}
|
88
93
|
end
|
89
94
|
it "should call render on the primary_navigation (specifying level through options)" do
|
90
95
|
@primary_navigation.should_receive(:render)
|
91
|
-
@controller.render_navigation(:level => :primary)
|
96
|
+
ActiveSupport::Deprecation.silence {@controller.render_navigation(:level => :primary)}
|
92
97
|
end
|
93
98
|
it "should call render on the primary_navigation (specifying level through options)" do
|
94
|
-
@primary_navigation.should_receive(:render)
|
99
|
+
@primary_navigation.should_receive(:render).with(:level => 1)
|
95
100
|
@controller.render_navigation(:level => 1)
|
96
101
|
end
|
97
102
|
end
|
@@ -104,19 +109,19 @@ describe SimpleNavigation::Helpers do
|
|
104
109
|
end
|
105
110
|
it "should find the selected sub_navigation for the specified level" do
|
106
111
|
SimpleNavigation.should_receive(:active_item_container_for).with(2)
|
107
|
-
@controller.render_navigation(:secondary)
|
112
|
+
ActiveSupport::Deprecation.silence {@controller.render_navigation(:secondary)}
|
108
113
|
end
|
109
114
|
it "should find the selected sub_navigation for the specified level" do
|
110
115
|
SimpleNavigation.should_receive(:active_item_container_for).with(2)
|
111
|
-
@controller.render_navigation(:level => :secondary)
|
116
|
+
ActiveSupport::Deprecation.silence {@controller.render_navigation(:level => :secondary)}
|
112
117
|
end
|
113
118
|
it "should find the selected sub_navigation for the specified level" do
|
114
119
|
SimpleNavigation.should_receive(:active_item_container_for).with(1)
|
115
120
|
@controller.render_navigation(:level => 1)
|
116
121
|
end
|
117
122
|
it "should call render on the active item_container" do
|
118
|
-
@selected_item_container.should_receive(:render)
|
119
|
-
@controller.render_navigation(:secondary)
|
123
|
+
@selected_item_container.should_receive(:render).with(:level => 2)
|
124
|
+
ActiveSupport::Deprecation.silence {@controller.render_navigation(:secondary)}
|
120
125
|
end
|
121
126
|
end
|
122
127
|
context 'without an active item_container set' do
|
@@ -124,22 +129,22 @@ describe SimpleNavigation::Helpers do
|
|
124
129
|
SimpleNavigation.stub!(:active_item_container_for => nil)
|
125
130
|
end
|
126
131
|
it "should not raise an error" do
|
127
|
-
lambda{@controller.render_navigation(:secondary)}.should_not raise_error
|
132
|
+
lambda{ActiveSupport::Deprecation.silence {@controller.render_navigation(:secondary)}}.should_not raise_error
|
128
133
|
end
|
129
134
|
end
|
130
135
|
|
131
136
|
end
|
132
137
|
|
133
138
|
context 'nested' do
|
134
|
-
it "should call render on the primary navigation with the
|
135
|
-
@primary_navigation.should_receive(:render).with(
|
136
|
-
@controller.render_navigation(:nested)
|
139
|
+
it "should call render on the primary navigation with the :level => :all option set" do
|
140
|
+
@primary_navigation.should_receive(:render).with(:level => :all)
|
141
|
+
ActiveSupport::Deprecation.silence {@controller.render_navigation(:nested)}
|
137
142
|
end
|
138
143
|
end
|
139
144
|
|
140
145
|
context 'unknown level' do
|
141
146
|
it "should raise an error" do
|
142
|
-
lambda {@controller.render_navigation(:unknown)}.should raise_error(ArgumentError)
|
147
|
+
lambda {ActiveSupport::Deprecation.silence {@controller.render_navigation(:unknown)}}.should raise_error(ArgumentError)
|
143
148
|
end
|
144
149
|
it "should raise an error" do
|
145
150
|
lambda {@controller.render_navigation(:level => :unknown)}.should raise_error(ArgumentError)
|
@@ -151,7 +156,7 @@ describe SimpleNavigation::Helpers do
|
|
151
156
|
end
|
152
157
|
|
153
158
|
describe 'render_primary_navigation' do
|
154
|
-
it "should delegate to render_navigation(:
|
159
|
+
it "should delegate to render_navigation(:level => 1)" do
|
155
160
|
ActiveSupport::Deprecation.silence do
|
156
161
|
@controller.should_receive(:render_navigation).with(:level => 1)
|
157
162
|
@controller.render_primary_navigation
|
@@ -160,7 +165,7 @@ describe SimpleNavigation::Helpers do
|
|
160
165
|
end
|
161
166
|
|
162
167
|
describe 'render_sub_navigation' do
|
163
|
-
it "should delegate to render_navigation(:
|
168
|
+
it "should delegate to render_navigation(:level => 2)" do
|
164
169
|
ActiveSupport::Deprecation.silence do
|
165
170
|
@controller.should_receive(:render_navigation).with(:level => 2)
|
166
171
|
@controller.render_sub_navigation
|
@@ -168,4 +173,22 @@ describe SimpleNavigation::Helpers do
|
|
168
173
|
end
|
169
174
|
end
|
170
175
|
|
176
|
+
describe "should treat :level and :levels options the same" do
|
177
|
+
before(:each) do
|
178
|
+
@selected_item_container = stub(:selected_container, :null_object => true)
|
179
|
+
SimpleNavigation.stub!(:active_item_container_for => @selected_item_container)
|
180
|
+
end
|
181
|
+
it "should pass a valid levels options as level" do
|
182
|
+
@selected_item_container.should_receive(:render).with(:level => 2)
|
183
|
+
@controller.render_navigation(:levels => 2)
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
describe 'option all_open should work as expand_all' do
|
188
|
+
it "should call render on the primary navigation with the include_subnavigation option set" do
|
189
|
+
@primary_navigation.should_receive(:render).with(:level => :all, :expand_all => true)
|
190
|
+
ActiveSupport::Deprecation.silence {@controller.render_navigation(:level => :all, :all_open => true)}
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
171
194
|
end
|
@@ -315,18 +315,15 @@ describe SimpleNavigation::ItemContainer do
|
|
315
315
|
@item_container.stub!(:renderer).and_return(@renderer)
|
316
316
|
@items = stub(:items)
|
317
317
|
@item_container.stub!(:items).and_return(@items)
|
318
|
+
@options = stub(:options)
|
318
319
|
end
|
319
320
|
it "should instatiate a renderer" do
|
320
|
-
@renderer.should_receive(:new)
|
321
|
-
@item_container.render(
|
321
|
+
@renderer.should_receive(:new).with(@options)
|
322
|
+
@item_container.render(@options)
|
322
323
|
end
|
323
324
|
it "should call render on the renderer and pass self" do
|
324
|
-
@renderer_instance.should_receive(:render).with(@item_container
|
325
|
-
@item_container.render
|
326
|
-
end
|
327
|
-
it "should call render on the renderer and pass the include_sub_navigation option" do
|
328
|
-
@renderer_instance.should_receive(:render).with(anything, true)
|
329
|
-
@item_container.render(true)
|
325
|
+
@renderer_instance.should_receive(:render).with(@item_container)
|
326
|
+
@item_container.render
|
330
327
|
end
|
331
328
|
|
332
329
|
end
|
@@ -2,9 +2,10 @@ require File.dirname(__FILE__) + '/../../../spec_helper'
|
|
2
2
|
|
3
3
|
describe SimpleNavigation::Renderer::Base do
|
4
4
|
before(:each) do
|
5
|
+
@options = stub(:options, :null_object => true)
|
5
6
|
@controller = stub(:controller)
|
6
7
|
SimpleNavigation.stub!(:controller).and_return(@controller)
|
7
|
-
@base_renderer = SimpleNavigation::Renderer::Base.new
|
8
|
+
@base_renderer = SimpleNavigation::Renderer::Base.new(@options)
|
8
9
|
end
|
9
10
|
it "should inclue ActionView::Helpers::UrlHelper" do
|
10
11
|
@base_renderer.should respond_to(:link_to)
|
@@ -21,6 +22,7 @@ describe SimpleNavigation::Renderer::Base do
|
|
21
22
|
|
22
23
|
describe 'initialize' do
|
23
24
|
it {@base_renderer.controller.should == @controller}
|
25
|
+
it {@base_renderer.options.should == @options}
|
24
26
|
end
|
25
27
|
|
26
28
|
describe 'controller_method' do
|
@@ -56,5 +58,154 @@ describe SimpleNavigation::Renderer::Base do
|
|
56
58
|
lambda {@base_renderer.render(:container)}.should raise_error('subclass responsibility')
|
57
59
|
end
|
58
60
|
end
|
61
|
+
|
62
|
+
describe 'expand_all?' do
|
63
|
+
context 'option is set' do
|
64
|
+
context 'expand_all is true' do
|
65
|
+
before(:each) do
|
66
|
+
@base_renderer.stub!(:options => {:expand_all => true})
|
67
|
+
end
|
68
|
+
it {@base_renderer.expand_all?.should be_true}
|
69
|
+
end
|
70
|
+
context 'expand_all is false' do
|
71
|
+
before(:each) do
|
72
|
+
@base_renderer.stub!(:options => {:expand_all => false})
|
73
|
+
end
|
74
|
+
it {@base_renderer.expand_all?.should be_false}
|
75
|
+
end
|
76
|
+
end
|
77
|
+
context 'option is not set' do
|
78
|
+
before(:each) do
|
79
|
+
@base_renderer.stub!(:options => {})
|
80
|
+
end
|
81
|
+
it {@base_renderer.expand_all?.should be_false}
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
describe 'level' do
|
86
|
+
context 'options[level] is set' do
|
87
|
+
before(:each) do
|
88
|
+
@base_renderer.stub!(:options => {:level => 1})
|
89
|
+
end
|
90
|
+
it {@base_renderer.level.should == 1}
|
91
|
+
end
|
92
|
+
context 'options[level] is not set' do
|
93
|
+
before(:each) do
|
94
|
+
@base_renderer.stub!(:options => {})
|
95
|
+
end
|
96
|
+
it {@base_renderer.level.should == :all}
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
describe 'consider_sub_navigation?' do
|
101
|
+
before(:each) do
|
102
|
+
@item = stub(:item)
|
103
|
+
end
|
104
|
+
context 'item has no subnavigation' do
|
105
|
+
before(:each) do
|
106
|
+
@item.stub!(:sub_navigation => nil)
|
107
|
+
end
|
108
|
+
it {@base_renderer.send(:consider_sub_navigation?, @item).should be_false}
|
109
|
+
end
|
110
|
+
context 'item has subnavigation' do
|
111
|
+
before(:each) do
|
112
|
+
@sub_navigation = stub(:sub_navigation)
|
113
|
+
@item.stub!(:sub_navigation => @sub_navigation)
|
114
|
+
end
|
115
|
+
context 'level is something unknown' do
|
116
|
+
before(:each) do
|
117
|
+
@base_renderer.stub!(:level => 'unknown')
|
118
|
+
end
|
119
|
+
it {@base_renderer.send(:consider_sub_navigation?, @item).should be_false}
|
120
|
+
end
|
121
|
+
context 'level is :all' do
|
122
|
+
before(:each) do
|
123
|
+
@base_renderer.stub!(:level => :all)
|
124
|
+
end
|
125
|
+
it {@base_renderer.send(:consider_sub_navigation?, @item).should be_true}
|
126
|
+
end
|
127
|
+
context 'level is an Integer' do
|
128
|
+
before(:each) do
|
129
|
+
@base_renderer.stub!(:level => 2)
|
130
|
+
end
|
131
|
+
it {@base_renderer.send(:consider_sub_navigation?, @item).should be_false}
|
132
|
+
end
|
133
|
+
context 'level is a Range' do
|
134
|
+
before(:each) do
|
135
|
+
@base_renderer.stub!(:level => 2..3)
|
136
|
+
end
|
137
|
+
context 'subnavs level > range.max' do
|
138
|
+
before(:each) do
|
139
|
+
@sub_navigation.stub!(:level => 4)
|
140
|
+
end
|
141
|
+
it {@base_renderer.send(:consider_sub_navigation?, @item).should be_false}
|
142
|
+
end
|
143
|
+
context 'subnavs level = range.max' do
|
144
|
+
before(:each) do
|
145
|
+
@sub_navigation.stub!(:level => 3)
|
146
|
+
end
|
147
|
+
it {@base_renderer.send(:consider_sub_navigation?, @item).should be_true}
|
148
|
+
|
149
|
+
end
|
150
|
+
context 'subnavs level < range.max' do
|
151
|
+
before(:each) do
|
152
|
+
@sub_navigation.stub!(:level => 2)
|
153
|
+
end
|
154
|
+
it {@base_renderer.send(:consider_sub_navigation?, @item).should be_true}
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
describe 'include_sub_navigation?' do
|
161
|
+
before(:each) do
|
162
|
+
@item = stub(:item)
|
163
|
+
end
|
164
|
+
context 'consider_sub_navigation? is true' do
|
165
|
+
before(:each) do
|
166
|
+
@base_renderer.stub!(:consider_sub_navigation? => true)
|
167
|
+
end
|
168
|
+
context 'expand_sub_navigation? is true' do
|
169
|
+
before(:each) do
|
170
|
+
@base_renderer.stub!(:expand_sub_navigation? => true)
|
171
|
+
end
|
172
|
+
it {@base_renderer.include_sub_navigation?(@item).should be_true}
|
173
|
+
end
|
174
|
+
context 'expand_sub_navigation? is false' do
|
175
|
+
before(:each) do
|
176
|
+
@base_renderer.stub!(:expand_sub_navigation? => false)
|
177
|
+
end
|
178
|
+
it {@base_renderer.include_sub_navigation?(@item).should be_false}
|
179
|
+
end
|
180
|
+
end
|
181
|
+
context 'consider_sub_navigation is false' do
|
182
|
+
before(:each) do
|
183
|
+
@base_renderer.stub!(:consider_sub_navigation? => false)
|
184
|
+
end
|
185
|
+
context 'expand_sub_navigation? is true' do
|
186
|
+
before(:each) do
|
187
|
+
@base_renderer.stub!(:expand_sub_navigation? => true)
|
188
|
+
end
|
189
|
+
it {@base_renderer.include_sub_navigation?(@item).should be_false}
|
190
|
+
end
|
191
|
+
context 'expand_sub_navigation? is false' do
|
192
|
+
before(:each) do
|
193
|
+
@base_renderer.stub!(:expand_sub_navigation? => false)
|
194
|
+
end
|
195
|
+
it {@base_renderer.include_sub_navigation?(@item).should be_false}
|
196
|
+
end
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
describe 'render_sub_navigation_for' do
|
201
|
+
before(:each) do
|
202
|
+
@sub_navigation = stub(:sub_navigation)
|
203
|
+
@item = stub(:item, :sub_navigation => @sub_navigation)
|
204
|
+
end
|
205
|
+
it "should call render on the sub_navigation (passing the options)" do
|
206
|
+
@sub_navigation.should_receive(:render).with(@options)
|
207
|
+
@base_renderer.render_sub_navigation_for(@item)
|
208
|
+
end
|
209
|
+
end
|
59
210
|
|
60
211
|
end
|
@@ -47,11 +47,11 @@ describe SimpleNavigation::Renderer::List do
|
|
47
47
|
container
|
48
48
|
end
|
49
49
|
|
50
|
-
def render(current_nav=nil,
|
50
|
+
def render(current_nav=nil, options={:level => :all})
|
51
51
|
primary_navigation = primary_container
|
52
52
|
select_item(current_nav) if current_nav
|
53
|
-
@renderer = SimpleNavigation::Renderer::List.new
|
54
|
-
HTML::Document.new(@renderer.render(primary_navigation
|
53
|
+
@renderer = SimpleNavigation::Renderer::List.new(options)
|
54
|
+
HTML::Document.new(@renderer.render(primary_navigation)).root
|
55
55
|
end
|
56
56
|
|
57
57
|
it "should render a ul-tag around the items" do
|
@@ -103,31 +103,25 @@ describe SimpleNavigation::Renderer::List do
|
|
103
103
|
|
104
104
|
context 'nested sub_navigation' do
|
105
105
|
it "should nest the current_primary's subnavigation inside the selected li-element" do
|
106
|
-
HTML::Selector.new('li.selected ul li').select(render(:invoices
|
106
|
+
HTML::Selector.new('li.selected ul li').select(render(:invoices)).should have(2).entries
|
107
107
|
end
|
108
108
|
it "should be possible to identify sub items using an html selector (using ids)" do
|
109
|
-
HTML::Selector.new('#invoices #subnav1').select(render(:invoices
|
109
|
+
HTML::Selector.new('#invoices #subnav1').select(render(:invoices)).should have(1).entries
|
110
110
|
end
|
111
|
-
context '
|
112
|
-
before(:each) do
|
113
|
-
SimpleNavigation.config.render_all_levels = false
|
114
|
-
end
|
111
|
+
context 'expand_all => false' do
|
115
112
|
it "should not render the invoices submenu if the user-primary is active" do
|
116
|
-
HTML::Selector.new('#invoices #subnav1').select(render(:users,
|
117
|
-
HTML::Selector.new('#invoices #subnav2').select(render(:users,
|
113
|
+
HTML::Selector.new('#invoices #subnav1').select(render(:users, :level => :all, :expand_all => false)).should be_empty
|
114
|
+
HTML::Selector.new('#invoices #subnav2').select(render(:users, :level => :all, :expand_all => false)).should be_empty
|
118
115
|
end
|
119
116
|
end
|
120
117
|
|
121
|
-
context '
|
122
|
-
before(:each) do
|
123
|
-
SimpleNavigation.config.render_all_levels = true
|
124
|
-
end
|
118
|
+
context 'expand_all => true' do
|
125
119
|
it "should render the invoices submenu even if the user-primary is active" do
|
126
|
-
HTML::Selector.new('#invoices #subnav1').select(render(:users, true)).should have(1).entry
|
127
|
-
HTML::Selector.new('#invoices #subnav2').select(render(:users, true)).should have(1).entry
|
120
|
+
HTML::Selector.new('#invoices #subnav1').select(render(:users, :level => :all, :expand_all => true)).should have(1).entry
|
121
|
+
HTML::Selector.new('#invoices #subnav2').select(render(:users, :level => :all, :expand_all => true)).should have(1).entry
|
128
122
|
end
|
129
123
|
end
|
130
|
-
|
124
|
+
|
131
125
|
end
|
132
126
|
|
133
127
|
end
|
@@ -153,9 +153,27 @@ describe SimpleNavigation do
|
|
153
153
|
@primary = stub(:primary)
|
154
154
|
SimpleNavigation.config.stub!(:primary_navigation => @primary)
|
155
155
|
end
|
156
|
-
|
157
|
-
|
158
|
-
|
156
|
+
context 'level is :all' do
|
157
|
+
it "should return the primary_navigation" do
|
158
|
+
SimpleNavigation.active_item_container_for(:all).should == @primary
|
159
|
+
end
|
160
|
+
end
|
161
|
+
context 'level is a Range' do
|
162
|
+
it "should take the min of the range to lookup the active container" do
|
163
|
+
@primary.should_receive(:active_item_container_for).with(2)
|
164
|
+
SimpleNavigation.active_item_container_for(2..3)
|
165
|
+
end
|
166
|
+
end
|
167
|
+
context 'level is an Integer' do
|
168
|
+
it "should consider the Integer to lookup the active container" do
|
169
|
+
@primary.should_receive(:active_item_container_for).with(1)
|
170
|
+
SimpleNavigation.active_item_container_for(1)
|
171
|
+
end
|
172
|
+
end
|
173
|
+
context 'level is something else' do
|
174
|
+
it "should raise an ArgumentError" do
|
175
|
+
lambda {SimpleNavigation.active_item_container_for('something else')}.should raise_error(ArgumentError)
|
176
|
+
end
|
159
177
|
end
|
160
178
|
end
|
161
179
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: simple-navigation
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andi Schacke
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date:
|
12
|
+
date: 2010-01-17 00:00:00 +01:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|