simple-navigation 1.4.2 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -1
- data/CHANGELOG +8 -0
- data/README +5 -1
- data/Rakefile +14 -4
- data/VERSION.yml +3 -3
- data/generators/navigation_config/templates/config/navigation.rb +9 -2
- data/lib/simple_navigation/configuration.rb +14 -8
- data/lib/simple_navigation/controller_methods.rb +24 -20
- data/lib/simple_navigation/helpers.rb +49 -34
- data/lib/simple_navigation/item.rb +56 -15
- data/lib/simple_navigation/item_container.rb +60 -10
- data/lib/simple_navigation/renderer/base.rb +8 -8
- data/lib/simple_navigation/renderer/list.rb +11 -10
- data/lib/simple_navigation.rb +68 -6
- data/simple-navigation.gemspec +4 -4
- data/spec/lib/simple_navigation/configuration_spec.rb +61 -0
- data/spec/lib/simple_navigation/controller_methods_spec.rb +9 -13
- data/spec/lib/simple_navigation/helpers_spec.rb +38 -38
- data/spec/lib/simple_navigation/item_container_spec.rb +146 -5
- data/spec/lib/simple_navigation/item_spec.rb +229 -34
- data/spec/lib/simple_navigation/renderer/base_spec.rb +7 -3
- data/spec/lib/simple_navigation/renderer/list_spec.rb +31 -15
- data/spec/lib/simple_navigation_spec.rb +83 -0
- metadata +4 -4
@@ -3,21 +3,22 @@ module SimpleNavigation
|
|
3
3
|
|
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.
|
7
8
|
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
|
11
|
-
|
9
|
+
# If the SimpleNavigation.config.render_all_levels option is set to true, it always renders all levels of navigation (fully expanded tree).
|
10
|
+
#
|
11
|
+
# 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
|
+
# 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
|
+
class List < SimpleNavigation::Renderer::Base
|
14
|
+
|
12
15
|
def render(item_container, include_sub_navigation=false)
|
13
16
|
list_content = item_container.items.inject([]) do |list, item|
|
14
|
-
html_options = item.html_options
|
15
|
-
li_content = link_to(item.name, item.url, :class => item.selected_class
|
17
|
+
html_options = item.html_options
|
18
|
+
li_content = link_to(item.name, item.url, :class => item.selected_class, :method => item.method)
|
16
19
|
if item.sub_navigation
|
17
|
-
if SimpleNavigation.config.render_all_levels
|
18
|
-
li_content << (item.sub_navigation.render(
|
19
|
-
else
|
20
|
-
li_content << (item.sub_navigation.render(current_sub_navigation)) if include_sub_navigation && item.selected?(current_navigation)
|
20
|
+
if SimpleNavigation.config.render_all_levels || (include_sub_navigation && item.selected?)
|
21
|
+
li_content << (item.sub_navigation.render(include_sub_navigation))
|
21
22
|
end
|
22
23
|
end
|
23
24
|
list << content_tag(:li, li_content, html_options)
|
data/lib/simple_navigation.rb
CHANGED
@@ -10,9 +10,8 @@ require 'simple_navigation/renderer/list'
|
|
10
10
|
# A plugin for generating a simple navigation. See README for resources on usage instructions.
|
11
11
|
module SimpleNavigation
|
12
12
|
|
13
|
-
mattr_accessor :config_files
|
14
|
-
|
15
|
-
mattr_accessor :controller
|
13
|
+
mattr_accessor :config_files, :config_file_path, :controller, :template, :explicit_current_navigation
|
14
|
+
|
16
15
|
self.config_files = {}
|
17
16
|
|
18
17
|
class << self
|
@@ -30,20 +29,83 @@ module SimpleNavigation
|
|
30
29
|
|
31
30
|
# Returns the singleton instance of the SimpleNavigation::Configuration
|
32
31
|
def config
|
33
|
-
Configuration.instance
|
32
|
+
SimpleNavigation::Configuration.instance
|
34
33
|
end
|
35
34
|
|
36
35
|
# Returns the ItemContainer that contains the items for the primary navigation
|
37
36
|
def primary_navigation
|
38
37
|
config.primary_navigation
|
39
38
|
end
|
40
|
-
|
39
|
+
|
41
40
|
# Returns the path to the config_file for the given navigation_context
|
42
41
|
def config_file_name(navigation_context = :default)
|
43
42
|
file_name = navigation_context == :default ? '' : "#{navigation_context.to_s.underscore}_"
|
44
43
|
File.join(config_file_path, "#{file_name}navigation.rb")
|
45
44
|
end
|
46
45
|
|
46
|
+
def explicit_navigation_args
|
47
|
+
self.controller.instance_variable_get(:"@sn_current_navigation_args")
|
48
|
+
end
|
49
|
+
|
50
|
+
# Reads the current navigation for the specified level from the controller.
|
51
|
+
# Returns nil if there is no current navigation set for level.
|
52
|
+
def current_navigation_for(level)
|
53
|
+
self.controller.instance_variable_get(:"@sn_current_navigation_#{level}")
|
54
|
+
end
|
55
|
+
|
56
|
+
def active_item_container_for(level)
|
57
|
+
self.primary_navigation.active_item_container_for(level)
|
58
|
+
end
|
59
|
+
|
60
|
+
# If any navigation has been explicitely set in the controller this method evaluates the specified args set in the controller and sets
|
61
|
+
# the correct instance variable in the controller.
|
62
|
+
def handle_explicit_navigation
|
63
|
+
if SimpleNavigation.explicit_navigation_args
|
64
|
+
level, navigation = parse_explicit_navigation_args
|
65
|
+
self.controller.instance_variable_set(:"@sn_current_navigation_#{level}", navigation)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
private
|
70
|
+
|
71
|
+
# TODO: refactor this ugly thing to make it nice and short
|
72
|
+
def parse_explicit_navigation_args
|
73
|
+
args = SimpleNavigation.explicit_navigation_args
|
74
|
+
args = [Hash.new] if args.empty?
|
75
|
+
if args.first.kind_of? Hash
|
76
|
+
options = args.first
|
77
|
+
else # args is a list of current navigation for several levels
|
78
|
+
options = {}
|
79
|
+
if args.size == 1 #only an navi-key has been specified, try to find out level
|
80
|
+
level = SimpleNavigation.primary_navigation.level_for_item(args.first)
|
81
|
+
options[:"level_#{level}"] = args.first
|
82
|
+
else
|
83
|
+
args.each_with_index {|arg, i| options[:"level_#{i + 1}"] = arg}
|
84
|
+
end
|
85
|
+
end
|
86
|
+
#only the deepest level is relevant
|
87
|
+
level = options.inject(0) do |max, kv|
|
88
|
+
kv.first.to_s =~ /level_(\d)/
|
89
|
+
max = $1.to_i if $1.to_i > max
|
90
|
+
max
|
91
|
+
end
|
92
|
+
raise ArgumentError, "Invalid level specified or item key not found" if level == 0
|
93
|
+
[level, options[:"level_#{level}"]]
|
94
|
+
end
|
95
|
+
|
47
96
|
end
|
48
97
|
|
49
|
-
end
|
98
|
+
end
|
99
|
+
|
100
|
+
# TODOs for the next releases:
|
101
|
+
# 1) add ability to specify explicit highlighting in the config-file itself (directly with the item)
|
102
|
+
# - item.highlight_on :controller => 'users', :action => 'show' ...^
|
103
|
+
# --> with that we can get rid of the controller_methods...
|
104
|
+
#
|
105
|
+
# 2) ability to turn off autohighlighting for a single item...
|
106
|
+
#
|
107
|
+
# 3) add JoinRenderer (HorizontalRenderer?) (wich does not render a list, but just the items joined with a specified char (e.g. | ))
|
108
|
+
#
|
109
|
+
# 4) Enhance SampleProject (more examples)
|
110
|
+
#
|
111
|
+
# 5) Make SampleProject public
|
data/simple-navigation.gemspec
CHANGED
@@ -5,12 +5,12 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{simple-navigation}
|
8
|
-
s.version = "
|
8
|
+
s.version = "2.0.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{2009-
|
13
|
-
s.description = %q{
|
12
|
+
s.date = %q{2009-10-10}
|
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 = [
|
16
16
|
"README"
|
@@ -53,7 +53,7 @@ Gem::Specification.new do |s|
|
|
53
53
|
s.require_paths = ["lib"]
|
54
54
|
s.rubyforge_project = %q{andi}
|
55
55
|
s.rubygems_version = %q{1.3.5}
|
56
|
-
s.summary = %q{Simple Navigation is a ruby library for creating
|
56
|
+
s.summary = %q{Simple Navigation is a ruby library for creating navigations (with multiple levels) for your Ruby on Rails application.}
|
57
57
|
s.test_files = [
|
58
58
|
"spec/lib/simple_navigation/configuration_spec.rb",
|
59
59
|
"spec/lib/simple_navigation/controller_methods_spec.rb",
|
@@ -18,6 +18,7 @@ describe SimpleNavigation::Configuration do
|
|
18
18
|
before(:each) do
|
19
19
|
@context = mock(:context)
|
20
20
|
@context.stub!(:instance_eval)
|
21
|
+
SimpleNavigation::Configuration.stub!(:context_for_eval => @context)
|
21
22
|
@config_files = {:default => 'default', :my_context => 'my_context'}
|
22
23
|
SimpleNavigation.stub!(:config_files).and_return(@config_files)
|
23
24
|
end
|
@@ -39,6 +40,53 @@ describe SimpleNavigation::Configuration do
|
|
39
40
|
SimpleNavigation.should_receive(:controller=).with(@controller)
|
40
41
|
SimpleNavigation::Configuration.eval_config(@context)
|
41
42
|
end
|
43
|
+
it "should set the template" do
|
44
|
+
@template = stub(:template)
|
45
|
+
@controller = stub(:controller, :instance_variable_get => @template)
|
46
|
+
SimpleNavigation.stub!(:controller => @controller)
|
47
|
+
SimpleNavigation.should_receive(:template=).with(@template)
|
48
|
+
SimpleNavigation::Configuration.eval_config(@context)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe 'context_for_eval' do
|
53
|
+
context 'controller is present' do
|
54
|
+
before(:each) do
|
55
|
+
@controller = stub(:controller)
|
56
|
+
SimpleNavigation.stub!(:controller => @controller)
|
57
|
+
end
|
58
|
+
context 'template is present' do
|
59
|
+
before(:each) do
|
60
|
+
@template = stub(:template)
|
61
|
+
SimpleNavigation.stub!(:template => @template)
|
62
|
+
end
|
63
|
+
it {SimpleNavigation::Configuration.context_for_eval.should == @template}
|
64
|
+
end
|
65
|
+
context 'template is not present' do
|
66
|
+
before(:each) do
|
67
|
+
SimpleNavigation.stub!(:template => nil)
|
68
|
+
end
|
69
|
+
it {SimpleNavigation::Configuration.context_for_eval.should == @controller}
|
70
|
+
end
|
71
|
+
end
|
72
|
+
context 'controller is not present' do
|
73
|
+
before(:each) do
|
74
|
+
SimpleNavigation.stub!(:controller => nil)
|
75
|
+
end
|
76
|
+
context 'template is present' do
|
77
|
+
before(:each) do
|
78
|
+
@template = stub(:template)
|
79
|
+
SimpleNavigation.stub!(:template => @template)
|
80
|
+
end
|
81
|
+
it {SimpleNavigation::Configuration.context_for_eval.should == @template}
|
82
|
+
end
|
83
|
+
context 'template is not present' do
|
84
|
+
before(:each) do
|
85
|
+
SimpleNavigation.stub!(:template => nil)
|
86
|
+
end
|
87
|
+
it {lambda {SimpleNavigation::Configuration.context_for_eval}.should raise_error}
|
88
|
+
end
|
89
|
+
end
|
42
90
|
end
|
43
91
|
|
44
92
|
describe 'self.extract_controller_from' do
|
@@ -78,6 +126,9 @@ describe SimpleNavigation::Configuration do
|
|
78
126
|
it "should set autogenerate_item_ids to true as default" do
|
79
127
|
@config.autogenerate_item_ids.should be_true
|
80
128
|
end
|
129
|
+
it "should set auto_highlight to true as default" do
|
130
|
+
@config.auto_highlight.should be_true
|
131
|
+
end
|
81
132
|
end
|
82
133
|
describe 'items' do
|
83
134
|
before(:each) do
|
@@ -95,6 +146,16 @@ describe SimpleNavigation::Configuration do
|
|
95
146
|
end
|
96
147
|
end
|
97
148
|
|
149
|
+
describe 'loaded?' do
|
150
|
+
it "should return true if primary_nav is set" do
|
151
|
+
@config.instance_variable_set(:@primary_navigation, :bla)
|
152
|
+
@config.should be_loaded
|
153
|
+
end
|
154
|
+
it "should return false if no primary_nav is set" do
|
155
|
+
@config.instance_variable_set(:@primary_navigation, nil)
|
156
|
+
@config.should_not be_loaded
|
157
|
+
end
|
158
|
+
end
|
98
159
|
|
99
160
|
end
|
100
161
|
|
@@ -39,17 +39,17 @@ describe SimpleNavigation::ControllerMethods do
|
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
42
|
-
it "should not have an instance-method '
|
43
|
-
@controller.respond_to?(:
|
42
|
+
it "should not have an instance-method 'sn_set_navigation' if navigation-method has not been called" do
|
43
|
+
@controller.respond_to?(:sn_set_navigation).should be_false
|
44
44
|
end
|
45
|
-
it 'should create an instance-method "
|
45
|
+
it 'should create an instance-method "sn_set_navigation" when being called' do
|
46
46
|
call_navigation(:key)
|
47
|
-
@controller.respond_to?(:
|
47
|
+
@controller.respond_to?(:sn_set_navigation).should be_true
|
48
48
|
end
|
49
49
|
it 'the created method should call current_navigation with the specified keys' do
|
50
50
|
call_navigation(:primary, :secondary)
|
51
51
|
@controller.should_receive(:current_navigation).with(:primary, :secondary)
|
52
|
-
@controller.
|
52
|
+
@controller.sn_set_navigation
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
@@ -58,17 +58,13 @@ describe SimpleNavigation::ControllerMethods do
|
|
58
58
|
describe 'instance_methods' do
|
59
59
|
|
60
60
|
describe 'current_navigation' do
|
61
|
-
it "should set the
|
61
|
+
it "should set the sn_current_navigation_args as specified" do
|
62
62
|
@controller.current_navigation(:first)
|
63
|
-
@controller.instance_variable_get(:@
|
63
|
+
@controller.instance_variable_get(:@sn_current_navigation_args).should == [:first]
|
64
64
|
end
|
65
|
-
it "should set the
|
65
|
+
it "should set the sn_current_navigation_args as specified" do
|
66
66
|
@controller.current_navigation(:first, :second)
|
67
|
-
@controller.instance_variable_get(:@
|
68
|
-
end
|
69
|
-
it "should set the current_secondary_navigation to nil if no secondary is specified" do
|
70
|
-
@controller.current_navigation(:first)
|
71
|
-
@controller.instance_variable_get(:@current_secondary_navigation).should be_nil
|
67
|
+
@controller.instance_variable_get(:@sn_current_navigation_args).should == [:first, :second]
|
72
68
|
end
|
73
69
|
end
|
74
70
|
|
@@ -36,40 +36,46 @@ describe SimpleNavigation::Helpers do
|
|
36
36
|
end
|
37
37
|
|
38
38
|
context 'primary' do
|
39
|
-
before(:each) do
|
40
|
-
@controller.instance_variable_set(:@current_primary_navigation, :current_primary)
|
41
|
-
end
|
42
39
|
it "should call render on the primary_navigation" do
|
43
|
-
@primary_navigation.should_receive(:render)
|
40
|
+
@primary_navigation.should_receive(:render)
|
44
41
|
@controller.render_navigation(:primary)
|
45
42
|
end
|
46
43
|
it "should call render on the primary_navigation (specifying level through options)" do
|
47
|
-
@primary_navigation.should_receive(:render)
|
44
|
+
@primary_navigation.should_receive(:render)
|
48
45
|
@controller.render_navigation(:level => :primary)
|
49
46
|
end
|
47
|
+
it "should call render on the primary_navigation (specifying level through options)" do
|
48
|
+
@primary_navigation.should_receive(:render)
|
49
|
+
@controller.render_navigation(:level => 1)
|
50
|
+
end
|
50
51
|
end
|
51
52
|
|
52
53
|
context 'secondary' do
|
53
54
|
context 'with current_primary_navigation set' do
|
54
55
|
before(:each) do
|
55
|
-
@
|
56
|
-
|
57
|
-
@controller.instance_variable_set(:@current_primary_navigation, :current_primary)
|
58
|
-
@controller.instance_variable_set(:@current_secondary_navigation, :current_secondary)
|
56
|
+
@selected_item_container = stub(:selected_container, :null_object => true)
|
57
|
+
SimpleNavigation.stub!(:active_item_container_for => @selected_item_container)
|
59
58
|
end
|
60
|
-
it "should find the sub_navigation
|
61
|
-
|
59
|
+
it "should find the selected sub_navigation for the specified level" do
|
60
|
+
SimpleNavigation.should_receive(:active_item_container_for).with(2)
|
62
61
|
@controller.render_navigation(:secondary)
|
63
62
|
end
|
64
|
-
it "should
|
65
|
-
|
63
|
+
it "should find the selected sub_navigation for the specified level" do
|
64
|
+
SimpleNavigation.should_receive(:active_item_container_for).with(2)
|
65
|
+
@controller.render_navigation(:level => :secondary)
|
66
|
+
end
|
67
|
+
it "should find the selected sub_navigation for the specified level" do
|
68
|
+
SimpleNavigation.should_receive(:active_item_container_for).with(1)
|
69
|
+
@controller.render_navigation(:level => 1)
|
70
|
+
end
|
71
|
+
it "should call render on the active item_container" do
|
72
|
+
@selected_item_container.should_receive(:render)
|
66
73
|
@controller.render_navigation(:secondary)
|
67
74
|
end
|
68
75
|
end
|
69
|
-
context 'without
|
76
|
+
context 'without an active item_container set' do
|
70
77
|
before(:each) do
|
71
|
-
|
72
|
-
@controller.instance_variable_set(:@current_primary_navigation, nil)
|
78
|
+
SimpleNavigation.stub!(:active_item_container_for => nil)
|
73
79
|
end
|
74
80
|
it "should not raise an error" do
|
75
81
|
lambda{@controller.render_navigation(:secondary)}.should_not raise_error
|
@@ -79,24 +85,8 @@ describe SimpleNavigation::Helpers do
|
|
79
85
|
end
|
80
86
|
|
81
87
|
context 'nested' do
|
82
|
-
|
83
|
-
@
|
84
|
-
@controller.instance_variable_set(:@current_secondary_navigation, :current_secondary)
|
85
|
-
end
|
86
|
-
it "should call render on the primary navigation" do
|
87
|
-
@primary_navigation.should_receive(:render).with(anything, anything, anything)
|
88
|
-
@controller.render_navigation(:nested)
|
89
|
-
end
|
90
|
-
it "should call render with the current_primary_navigation" do
|
91
|
-
@primary_navigation.should_receive(:render).with(:current_primary, anything, anything)
|
92
|
-
@controller.render_navigation(:nested)
|
93
|
-
end
|
94
|
-
it "should call render with the include_subnavigation option set" do
|
95
|
-
@primary_navigation.should_receive(:render).with(anything, true, anything)
|
96
|
-
@controller.render_navigation(:nested)
|
97
|
-
end
|
98
|
-
it "should call render with the current_sub_navigation" do
|
99
|
-
@primary_navigation.should_receive(:render).with(anything, anything, :current_secondary)
|
88
|
+
it "should call render on the primary navigation with the include_subnavigation option set" do
|
89
|
+
@primary_navigation.should_receive(:render).with(true)
|
100
90
|
@controller.render_navigation(:nested)
|
101
91
|
end
|
102
92
|
end
|
@@ -105,20 +95,30 @@ describe SimpleNavigation::Helpers do
|
|
105
95
|
it "should raise an error" do
|
106
96
|
lambda {@controller.render_navigation(:unknown)}.should raise_error(ArgumentError)
|
107
97
|
end
|
98
|
+
it "should raise an error" do
|
99
|
+
lambda {@controller.render_navigation(:level => :unknown)}.should raise_error(ArgumentError)
|
100
|
+
end
|
101
|
+
it "should raise an error" do
|
102
|
+
lambda {@controller.render_navigation('level')}.should raise_error(ArgumentError)
|
103
|
+
end
|
108
104
|
end
|
109
105
|
end
|
110
106
|
|
111
107
|
describe 'render_primary_navigation' do
|
112
108
|
it "should delegate to render_navigation(:primary)" do
|
113
|
-
|
114
|
-
|
109
|
+
ActiveSupport::Deprecation.silence do
|
110
|
+
@controller.should_receive(:render_navigation).with(:level => 1)
|
111
|
+
@controller.render_primary_navigation
|
112
|
+
end
|
115
113
|
end
|
116
114
|
end
|
117
115
|
|
118
116
|
describe 'render_sub_navigation' do
|
119
117
|
it "should delegate to render_navigation(:secondary)" do
|
120
|
-
|
121
|
-
|
118
|
+
ActiveSupport::Deprecation.silence do
|
119
|
+
@controller.should_receive(:render_navigation).with(:level => 2)
|
120
|
+
@controller.render_sub_navigation
|
121
|
+
end
|
122
122
|
end
|
123
123
|
end
|
124
124
|
|
@@ -15,6 +15,118 @@ describe SimpleNavigation::ItemContainer do
|
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
+
describe 'selected?' do
|
19
|
+
before(:each) do
|
20
|
+
@item_1 = stub(:item, :selected? => false)
|
21
|
+
@item_2 = stub(:item, :selected? => false)
|
22
|
+
@item_container.instance_variable_set(:@items, [@item_1, @item_2])
|
23
|
+
end
|
24
|
+
it "should return nil if no item is selected" do
|
25
|
+
@item_container.should_not be_selected
|
26
|
+
end
|
27
|
+
it "should return true if one item is selected" do
|
28
|
+
@item_1.stub!(:selected? => true)
|
29
|
+
@item_container.should be_selected
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe 'selected_item' do
|
34
|
+
before(:each) do
|
35
|
+
@item_1 = stub(:item, :selected? => false)
|
36
|
+
@item_2 = stub(:item, :selected? => false)
|
37
|
+
@item_container.instance_variable_set(:@items, [@item_1, @item_2])
|
38
|
+
end
|
39
|
+
context 'navigation explicitely set' do
|
40
|
+
before(:each) do
|
41
|
+
@item_container.stub!(:[] => @item_1)
|
42
|
+
end
|
43
|
+
it "should return the explicitely selected item" do
|
44
|
+
@item_container.selected_item.should == @item_1
|
45
|
+
end
|
46
|
+
end
|
47
|
+
context 'navigation not explicitely set' do
|
48
|
+
before(:each) do
|
49
|
+
@item_container.stub!(:[] => nil)
|
50
|
+
end
|
51
|
+
context 'no item selected' do
|
52
|
+
it "should return nil" do
|
53
|
+
@item_container.selected_item.should be_nil
|
54
|
+
end
|
55
|
+
end
|
56
|
+
context 'one item selected' do
|
57
|
+
before(:each) do
|
58
|
+
@item_1.stub!(:selected? => true)
|
59
|
+
end
|
60
|
+
it "should return the selected item" do
|
61
|
+
@item_container.selected_item.should == @item_1
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
describe 'selected_sub_navigation?' do
|
68
|
+
context 'with an item selected' do
|
69
|
+
before(:each) do
|
70
|
+
@selected_item = stub(:selected_item)
|
71
|
+
@item_container.stub!(:selected_item => @selected_item)
|
72
|
+
end
|
73
|
+
context 'selected item has sub_navigation' do
|
74
|
+
before(:each) do
|
75
|
+
@sub_navigation = stub(:sub_navigation)
|
76
|
+
@selected_item.stub!(:sub_navigation => @sub_navigation)
|
77
|
+
end
|
78
|
+
it {@item_container.send(:selected_sub_navigation?).should be_true}
|
79
|
+
end
|
80
|
+
context 'selected item does not have sub_navigation' do
|
81
|
+
before(:each) do
|
82
|
+
@selected_item.stub!(:sub_navigation => nil)
|
83
|
+
end
|
84
|
+
it {@item_container.send(:selected_sub_navigation?).should be_false}
|
85
|
+
end
|
86
|
+
end
|
87
|
+
context 'without an item selected' do
|
88
|
+
before(:each) do
|
89
|
+
@item_container.stub!(:selected_item => nil)
|
90
|
+
end
|
91
|
+
it {@item_container.send(:selected_sub_navigation?).should be_false}
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
95
|
+
|
96
|
+
describe 'active_item_container_for' do
|
97
|
+
context "the desired level is the same as the container's" do
|
98
|
+
it {@item_container.active_item_container_for(1).should == @item_container}
|
99
|
+
end
|
100
|
+
context "the desired level is different than the container's" do
|
101
|
+
context 'with no selected subnavigation' do
|
102
|
+
before(:each) do
|
103
|
+
@item_container.stub!(:selected_sub_navigation? => false)
|
104
|
+
end
|
105
|
+
it {@item_container.active_item_container_for(2).should be_nil}
|
106
|
+
end
|
107
|
+
context 'with selected subnavigation' do
|
108
|
+
before(:each) do
|
109
|
+
@item_container.stub!(:selected_sub_navigation? => true)
|
110
|
+
@sub_nav = stub(:sub_nav)
|
111
|
+
@selected_item = stub(:selected_item)
|
112
|
+
@item_container.stub!(:selected_item => @selected_item)
|
113
|
+
@selected_item.stub!(:sub_navigation => @sub_nav)
|
114
|
+
end
|
115
|
+
it "should call recursively on the sub_navigation" do
|
116
|
+
@sub_nav.should_receive(:active_item_container_for).with(2)
|
117
|
+
@item_container.active_item_container_for(2)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
describe 'current_explicit_navigation' do
|
124
|
+
it "should call SimpleNavigation.current_navigation with the container's level" do
|
125
|
+
SimpleNavigation.should_receive(:current_navigation_for).with(1)
|
126
|
+
@item_container.current_explicit_navigation
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
18
130
|
describe 'item' do
|
19
131
|
|
20
132
|
context 'unconditional item' do
|
@@ -36,7 +148,7 @@ describe SimpleNavigation::ItemContainer do
|
|
36
148
|
end
|
37
149
|
end
|
38
150
|
it "should create a new Navigation-Item with the given params and the specified block" do
|
39
|
-
SimpleNavigation::Item.should_receive(:new).with('key', 'name', 'url', @options, @proc)
|
151
|
+
SimpleNavigation::Item.should_receive(:new).with(@item_container, 'key', 'name', 'url', @options, @proc)
|
40
152
|
@item_container.item('key', 'name', 'url', @options, &@proc)
|
41
153
|
end
|
42
154
|
it "should add the created item to the list of items" do
|
@@ -47,7 +159,7 @@ describe SimpleNavigation::ItemContainer do
|
|
47
159
|
|
48
160
|
context 'no block given' do
|
49
161
|
it "should create a new Navigation_item with the given params and nil as sub_navi" do
|
50
|
-
SimpleNavigation::Item.should_receive(:new).with('key', 'name', 'url', @options, nil)
|
162
|
+
SimpleNavigation::Item.should_receive(:new).with(@item_container, 'key', 'name', 'url', @options, nil)
|
51
163
|
@item_container.item('key', 'name', 'url', @options)
|
52
164
|
end
|
53
165
|
it "should add the created item to the list of items" do
|
@@ -91,6 +203,12 @@ describe SimpleNavigation::ItemContainer do
|
|
91
203
|
end
|
92
204
|
end
|
93
205
|
|
206
|
+
context 'if is not a proc or method' do
|
207
|
+
it "should raise an error" do
|
208
|
+
lambda {@item_container.item('key', 'name', 'url', {:if => 'text'})}.should raise_error
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
94
212
|
context '"unless" given' do
|
95
213
|
|
96
214
|
before(:each) do
|
@@ -156,8 +274,8 @@ describe SimpleNavigation::ItemContainer do
|
|
156
274
|
@items = stub(:items)
|
157
275
|
@item_container.stub!(:items).and_return(@items)
|
158
276
|
end
|
159
|
-
it "should instatiate a renderer
|
160
|
-
@renderer.should_receive(:new)
|
277
|
+
it "should instatiate a renderer" do
|
278
|
+
@renderer.should_receive(:new)
|
161
279
|
@item_container.render(:current_navigation)
|
162
280
|
end
|
163
281
|
it "should call render on the renderer and pass self" do
|
@@ -166,9 +284,32 @@ describe SimpleNavigation::ItemContainer do
|
|
166
284
|
end
|
167
285
|
it "should call render on the renderer and pass the include_sub_navigation option" do
|
168
286
|
@renderer_instance.should_receive(:render).with(anything, true)
|
169
|
-
@item_container.render(
|
287
|
+
@item_container.render(true)
|
170
288
|
end
|
171
289
|
|
172
290
|
end
|
173
291
|
|
292
|
+
describe 'level_for_item' do
|
293
|
+
before(:each) do
|
294
|
+
@item_container.item(:p1, 'p1', 'p1')
|
295
|
+
@item_container.item(:p2, 'p2', 'p2') do |p2|
|
296
|
+
p2.item(:s1, 's1', 's1')
|
297
|
+
p2.item(:s2, 's2', 's2') do |s2|
|
298
|
+
s2.item(:ss1, 'ss1', 'ss1')
|
299
|
+
s2.item(:ss2, 'ss2', 'ss2')
|
300
|
+
end
|
301
|
+
p2.item(:s3, 's3', 's3')
|
302
|
+
end
|
303
|
+
@item_container.item(:p3, 'p3', 'p3')
|
304
|
+
end
|
305
|
+
it {@item_container.level_for_item(:p1).should == 1}
|
306
|
+
it {@item_container.level_for_item(:p3).should == 1}
|
307
|
+
it {@item_container.level_for_item(:s1).should == 2}
|
308
|
+
it {@item_container.level_for_item(:ss1).should == 3}
|
309
|
+
it {@item_container.level_for_item(:x).should be_nil}
|
310
|
+
|
311
|
+
|
312
|
+
|
313
|
+
end
|
314
|
+
|
174
315
|
end
|