semantic_navigation 0.0.14 → 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.
- data/Changelog.md +6 -1
- data/README.md +3 -3
- data/lib/generators/semantic_navigation/breadcrumb_renderer/breadcrumb_renderer_generator.rb +19 -0
- data/lib/generators/semantic_navigation/breadcrumb_renderer/templates/breadcrumb_renderer.rb +62 -0
- data/lib/generators/semantic_navigation/install/install_generator.rb +2 -2
- data/lib/generators/semantic_navigation/install/templates/semantic_navigation.rb +5 -5
- data/lib/generators/semantic_navigation/list_renderer/list_renderer_generator.rb +19 -0
- data/lib/generators/semantic_navigation/list_renderer/templates/list_renderer.rb +64 -0
- data/lib/semantic_navigation/configuration.rb +10 -10
- data/lib/semantic_navigation/core.rb +8 -4
- data/lib/semantic_navigation/core/base.rb +8 -8
- data/lib/semantic_navigation/core/leaf.rb +5 -33
- data/lib/semantic_navigation/core/name_methods.rb +24 -0
- data/lib/semantic_navigation/core/navigation.rb +23 -12
- data/lib/semantic_navigation/core/node.rb +6 -34
- data/lib/semantic_navigation/core/url_methods.rb +24 -0
- data/lib/semantic_navigation/railtie.rb +17 -7
- data/lib/semantic_navigation/renderers/acts_as_breadcrumb.rb +8 -8
- data/lib/semantic_navigation/renderers/acts_as_list.rb +34 -33
- data/lib/semantic_navigation/renderers/bread_crumb.rb +5 -5
- data/lib/semantic_navigation/renderers/list.rb +9 -9
- data/lib/semantic_navigation/renderers/render_helpers.rb +19 -32
- data/lib/semantic_navigation/twitter_bootstrap/breadcrumb.rb +8 -8
- data/lib/semantic_navigation/twitter_bootstrap/list.rb +15 -15
- data/lib/semantic_navigation/twitter_bootstrap/tabs.rb +14 -14
- data/lib/semantic_navigation/version.rb +1 -1
- data/spec/lib/semantic_navigation/configuration_spec.rb +50 -42
- data/spec/lib/semantic_navigation/core/navigation_spec.rb +58 -0
- data/spec/lib/semantic_navigation/helper_methods_spec.rb +31 -31
- data/spec/lib/semantic_navigation/twitter_bootstrap/breadcrumb_spec.rb +46 -46
- data/spec/lib/semantic_navigation/twitter_bootstrap/list_spec.rb +49 -49
- data/spec/lib/semantic_navigation_spec.rb +4 -1
- metadata +14 -9
- data/spec/lib/semantic_navigation/custom_renderer.rb +0 -3
@@ -2,15 +2,17 @@ module SemanticNavigation
|
|
2
2
|
module Core
|
3
3
|
class Navigation < Base
|
4
4
|
attr_accessor :sub_elements
|
5
|
-
|
5
|
+
|
6
6
|
def initialize(options, level = 0)
|
7
7
|
@sub_elements = []
|
8
|
+
@scope_options = {}
|
8
9
|
super options, level
|
9
10
|
end
|
10
11
|
|
11
12
|
def item(id, url=nil, options={}, &block)
|
12
13
|
options[:id] = id.to_sym
|
13
|
-
|
14
|
+
options[:render_if] ||= @scope_options[:render_if]
|
15
|
+
|
14
16
|
if url.is_a?(Array)
|
15
17
|
options[:url] = [url].flatten(1).map{|url| decode_url(url)}
|
16
18
|
else
|
@@ -18,7 +20,7 @@ module SemanticNavigation
|
|
18
20
|
end
|
19
21
|
|
20
22
|
options[:i18n_name] = @i18n_name
|
21
|
-
|
23
|
+
|
22
24
|
if block_given?
|
23
25
|
element = Node.new(options, @level+1)
|
24
26
|
element.instance_eval &block
|
@@ -32,21 +34,24 @@ module SemanticNavigation
|
|
32
34
|
puts 'Warning: do not define `dividers` using `item` method. Use `divider` instead. This logic will be deprecated soon.'
|
33
35
|
end
|
34
36
|
end
|
35
|
-
|
37
|
+
|
36
38
|
@sub_elements.push element
|
37
39
|
end
|
38
40
|
|
39
41
|
def header(id, options={})
|
40
42
|
options[:id] = id.to_sym
|
43
|
+
options[:render_if] ||= @scope_options[:render_if]
|
41
44
|
options[:url] = nil
|
42
45
|
options[:i18n_name] = @i18n_name
|
43
46
|
@sub_elements.push Leaf.new(options, @level+1)
|
44
47
|
end
|
45
48
|
|
46
|
-
def divider
|
47
|
-
options
|
48
|
-
|
49
|
-
|
49
|
+
def divider(options = {})
|
50
|
+
options[:id] = :divider
|
51
|
+
options[:render_if] ||= @scope_options[:render_if]
|
52
|
+
options[:url] = nil
|
53
|
+
options[:i18n_name] = nil
|
54
|
+
options[:name] = nil
|
50
55
|
@sub_elements.push Leaf.new(options, @level+1)
|
51
56
|
end
|
52
57
|
|
@@ -58,8 +63,14 @@ module SemanticNavigation
|
|
58
63
|
end
|
59
64
|
end
|
60
65
|
|
66
|
+
def scope(options = {}, &block)
|
67
|
+
@scope_options = options
|
68
|
+
self.instance_eval &block
|
69
|
+
@scope_options = {}
|
70
|
+
end
|
71
|
+
|
61
72
|
def mark_active
|
62
|
-
@sub_elements.each do |element|
|
73
|
+
@sub_elements.each do |element|
|
63
74
|
element.mark_active
|
64
75
|
end
|
65
76
|
@active = !@sub_elements.find{|element| element.active}.nil?
|
@@ -71,12 +82,12 @@ module SemanticNavigation
|
|
71
82
|
if url.is_a? String
|
72
83
|
controller_name, action_name = url.split('#')
|
73
84
|
if controller_name && action_name
|
74
|
-
decoded_url = {:controller => controller_name, :action => action_name}
|
75
|
-
end
|
85
|
+
decoded_url = {:controller => controller_name, :action => action_name}
|
86
|
+
end
|
76
87
|
end
|
77
88
|
decoded_url || url
|
78
89
|
end
|
79
|
-
|
90
|
+
|
80
91
|
end
|
81
92
|
end
|
82
93
|
end
|
@@ -1,50 +1,22 @@
|
|
1
1
|
module SemanticNavigation
|
2
2
|
module Core
|
3
|
-
class Node < Navigation
|
3
|
+
class Node < Navigation
|
4
|
+
include UrlMethods
|
5
|
+
include NameMethods
|
6
|
+
|
4
7
|
attr_accessor :link_classes, :node_classes
|
5
|
-
|
6
|
-
def url
|
7
|
-
urls.first
|
8
|
-
end
|
9
|
-
|
8
|
+
|
10
9
|
def initialize(options, level)
|
11
10
|
@url = []
|
12
11
|
super options, level
|
13
12
|
end
|
14
|
-
|
15
|
-
def name(renderer_name = nil)
|
16
|
-
rendering_name = @name
|
17
|
-
rendering_name = rendering_name[renderer_name.to_sym] || rendering_name[:default] if rendering_name.is_a?(Hash)
|
18
|
-
rendering_name = view_object.instance_eval(&rendering_name).to_s if rendering_name.is_a?(Proc)
|
19
|
-
rendering_name || i18n_name(renderer_name)
|
20
|
-
end
|
21
|
-
|
13
|
+
|
22
14
|
def mark_active
|
23
15
|
@sub_elements.each{|element| element.mark_active}
|
24
16
|
@active = urls.map{|u| current_page?(u) rescue false}.reduce(:"|")
|
25
17
|
@active |= !@sub_elements.find{|element| element.active}.nil?
|
26
18
|
end
|
27
|
-
|
28
|
-
private
|
29
|
-
|
30
|
-
def i18n_name(renderer_name = nil)
|
31
|
-
name = I18n.t("#{@i18n_name}.#{@id}", :default => '')
|
32
|
-
if name.is_a? Hash
|
33
|
-
name = name[renderer_name.to_sym] || name[:default]
|
34
|
-
end
|
35
|
-
name || ''
|
36
|
-
end
|
37
19
|
|
38
|
-
def urls
|
39
|
-
[@url].flatten(1).map do |url|
|
40
|
-
if url.is_a?(Proc)
|
41
|
-
view_object.instance_eval(&url) rescue ''
|
42
|
-
else
|
43
|
-
url
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
20
|
end
|
49
21
|
end
|
50
22
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module SemanticNavigation
|
2
|
+
module Core
|
3
|
+
module UrlMethods
|
4
|
+
|
5
|
+
def url
|
6
|
+
urls.first
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def urls
|
12
|
+
[@url].flatten(1).map do |url|
|
13
|
+
if url.is_a?(Proc)
|
14
|
+
view_object.instance_eval(&url) rescue ''
|
15
|
+
else
|
16
|
+
url
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
@@ -2,7 +2,7 @@ require 'semantic_navigation/helper_methods'
|
|
2
2
|
|
3
3
|
module SemanticNavigation
|
4
4
|
class Railtie < Rails::Railtie
|
5
|
-
|
5
|
+
|
6
6
|
initializer "semantic_navigation.extend_helper_methods" do
|
7
7
|
ActiveSupport.on_load :action_view do
|
8
8
|
ActionView::Base.send :include, HelperMethods
|
@@ -16,7 +16,7 @@ module SemanticNavigation
|
|
16
16
|
conf.register_renderer :bootstrap_tabs, TwitterBootstrap::Tabs
|
17
17
|
conf.register_renderer :bootstrap_pills, TwitterBootstrap::Tabs
|
18
18
|
conf.register_renderer :bootstrap_simple_nav, SemanticNavigation::Renderers::List
|
19
|
-
|
19
|
+
|
20
20
|
conf.styles_for :bootstrap_pills do
|
21
21
|
navigation_default_classes [:nav, 'nav-pills']
|
22
22
|
end
|
@@ -24,16 +24,26 @@ module SemanticNavigation
|
|
24
24
|
navigation_default_classes [:nav]
|
25
25
|
end
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
|
+
def self.actual_config_location
|
29
|
+
locations = ["#{Rails.root}/config/initializers/semantic_navigation.rb",
|
30
|
+
"#{Rails.root}/config/semantic_navigation.rb"]
|
31
|
+
actual_location = locations.find{|l| File.exists?(l)}
|
32
|
+
throw "Please create a semantic_navigation configuration file before starting the project!" unless actual_location
|
33
|
+
puts "DEPRECATION WARNING: Please move the configuration file from #{locations.second}
|
34
|
+
to #{locations.first}! Current configuration file path will be deprecated soon!" if locations.find_index(actual_location) == 1
|
35
|
+
actual_location
|
36
|
+
end
|
37
|
+
|
28
38
|
if Rails.env == "production"
|
29
39
|
config.after_initialize {
|
30
|
-
load
|
40
|
+
load SemanticNavigation::Railtie.actual_config_location
|
31
41
|
}
|
32
42
|
else
|
33
43
|
ActionDispatch::Callbacks.before {
|
34
|
-
load
|
35
|
-
}
|
44
|
+
load SemanticNavigation::Railtie.actual_config_location
|
45
|
+
}
|
36
46
|
end
|
37
|
-
|
47
|
+
|
38
48
|
end
|
39
49
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module SemanticNavigation
|
2
2
|
module Renderers
|
3
3
|
module ActsAsBreadcrumb
|
4
|
-
|
4
|
+
|
5
5
|
def render_navigation(object)
|
6
6
|
return '' unless object.render_if
|
7
7
|
navigation(object) do
|
@@ -13,30 +13,30 @@ module SemanticNavigation
|
|
13
13
|
active_element = object.sub_elements.find{|e| e.active}
|
14
14
|
active_element.render(self) if active_element
|
15
15
|
end
|
16
|
-
end
|
16
|
+
end
|
17
17
|
end
|
18
18
|
|
19
19
|
def render_node(object)
|
20
20
|
active_element = object.sub_elements.find{|e| e.active}
|
21
21
|
if active_element && !active_element.id.in?([except_for].flatten) && active_element.render_if
|
22
|
-
render_element = active_element.render(self)
|
22
|
+
render_element = active_element.render(self)
|
23
23
|
end
|
24
24
|
if render_element
|
25
25
|
node(object) do
|
26
26
|
render_element
|
27
|
-
end
|
27
|
+
end
|
28
28
|
else
|
29
29
|
render_leaf(object)
|
30
|
-
end
|
30
|
+
end
|
31
31
|
end
|
32
|
-
|
32
|
+
|
33
33
|
def render_leaf(object)
|
34
34
|
show = !until_level.nil? ? object.level <= until_level+1 : true
|
35
35
|
return nil unless show
|
36
|
-
|
36
|
+
|
37
37
|
leaf(object)
|
38
38
|
end
|
39
|
-
|
39
|
+
|
40
40
|
end
|
41
41
|
end
|
42
42
|
end
|
@@ -1,47 +1,48 @@
|
|
1
1
|
module SemanticNavigation
|
2
2
|
module Renderers
|
3
3
|
module ActsAsList
|
4
|
-
|
5
|
-
def render_navigation(object)
|
6
|
-
return '' unless object.render_if
|
7
|
-
navigation(object) do
|
8
|
-
while !object.class.in?(SemanticNavigation::Core::Leaf, NilClass) &&
|
9
|
-
from_level.to_i > object.level
|
10
|
-
object = object.sub_elements.find{|e| e.active}
|
11
|
-
end
|
12
|
-
show = !until_level.nil? && !object.nil? ? object.level <= until_level : true
|
13
|
-
if !object.class.in?(SemanticNavigation::Core::Leaf, NilClass) && show
|
14
|
-
object.sub_elements.map{|element| element.render(self)}.compact.sum
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
4
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
5
|
+
def render_navigation(object)
|
6
|
+
return '' unless object.render_if
|
7
|
+
navigation(object) do
|
8
|
+
while !object.class.in?(SemanticNavigation::Core::Leaf, NilClass) &&
|
9
|
+
from_level.to_i > object.level
|
10
|
+
object = object.sub_elements.find{|e| e.active}
|
11
|
+
end
|
12
|
+
show = !until_level.nil? && !object.nil? ? object.level <= until_level : true
|
13
|
+
if !object.class.in?(SemanticNavigation::Core::Leaf, NilClass) && show
|
14
|
+
object.sub_elements.map{|element| element.render(self)}.compact.sum
|
29
15
|
end
|
30
16
|
end
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
17
|
+
end
|
18
|
+
|
19
|
+
def render_node(object)
|
20
|
+
if !object.id.in?([except_for].flatten) && object.render_if
|
21
|
+
content = render_node_content(object)
|
22
|
+
if content
|
23
|
+
node(object) do
|
24
|
+
content
|
36
25
|
end
|
26
|
+
else
|
27
|
+
render_leaf(object)
|
37
28
|
end
|
38
29
|
end
|
30
|
+
end
|
39
31
|
|
40
|
-
|
41
|
-
|
42
|
-
|
32
|
+
def render_node_content(object)
|
33
|
+
if (!until_level.nil? && until_level >= object.level) || until_level.nil?
|
34
|
+
node_content(object) do
|
35
|
+
object.sub_elements.map{|element| element.render(self)}.compact.sum
|
43
36
|
end
|
44
|
-
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def render_leaf(object)
|
41
|
+
if !object.id.in?([except_for].flatten) && object.render_if
|
42
|
+
leaf(object)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
45
46
|
end
|
46
47
|
end
|
47
48
|
end
|
@@ -6,22 +6,22 @@ module SemanticNavigation
|
|
6
6
|
|
7
7
|
style_accessor :last_as_link => false,
|
8
8
|
:breadcrumb_separator => '/'
|
9
|
-
|
9
|
+
|
10
10
|
navigation_default_classes [:breadcrumb]
|
11
11
|
show_navigation_active_class false
|
12
12
|
show_node_active_class false
|
13
13
|
show_leaf_active_class false
|
14
14
|
show_link_active_class false
|
15
|
-
|
15
|
+
|
16
16
|
private
|
17
|
-
|
17
|
+
|
18
18
|
def navigation(object)
|
19
19
|
content_tag :ul, nil, :id => show_id(:navigation, object.id),
|
20
20
|
:class => merge_classes(:navigation, object.active, object.classes) do
|
21
21
|
yield
|
22
22
|
end
|
23
23
|
end
|
24
|
-
|
24
|
+
|
25
25
|
def node(object)
|
26
26
|
content_tag(:li, nil, :id => show_id(:leaf, object.id),
|
27
27
|
:class => merge_classes(:leaf, object.active, object.classes)) do
|
@@ -33,7 +33,7 @@ module SemanticNavigation
|
|
33
33
|
end +
|
34
34
|
yield
|
35
35
|
end
|
36
|
-
|
36
|
+
|
37
37
|
def leaf(object)
|
38
38
|
content_tag :li, nil, :id => show_id(:leaf, object.id),
|
39
39
|
:class => merge_classes(:leaf, object.active, object.classes) do
|
@@ -3,34 +3,34 @@ module SemanticNavigation
|
|
3
3
|
class List
|
4
4
|
include RenderHelpers
|
5
5
|
include ActsAsList
|
6
|
-
|
6
|
+
|
7
7
|
navigation_default_classes [:list]
|
8
|
-
|
8
|
+
|
9
9
|
private
|
10
|
-
|
10
|
+
|
11
11
|
def navigation(object)
|
12
12
|
content_tag :ul, nil, :id => show_id(:navigation, object.id),
|
13
13
|
:class => merge_classes(:navigation, object.active, object.classes) do
|
14
14
|
yield
|
15
15
|
end
|
16
16
|
end
|
17
|
-
|
17
|
+
|
18
18
|
def node(object)
|
19
19
|
content_tag :li, nil, :id => show_id(:leaf, object.id),
|
20
20
|
:class => merge_classes(:leaf, object.active, object.classes) do
|
21
21
|
link_to(object_name(object), object.url, :id => show_id(:link, object.id),
|
22
22
|
:class => merge_classes(:link, object.active, object.link_classes))+
|
23
23
|
yield
|
24
|
-
end
|
24
|
+
end
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
27
|
def node_content(object)
|
28
28
|
content_tag(:ul, nil, :id => show_id(:node, object.id),
|
29
29
|
:class => merge_classes(:node, object.active, object.node_classes)) do
|
30
|
-
yield
|
30
|
+
yield
|
31
31
|
end
|
32
32
|
end
|
33
|
-
|
33
|
+
|
34
34
|
def leaf(object)
|
35
35
|
content_tag :li, nil, :id => show_id(:leaf, object.id),
|
36
36
|
:class => merge_classes(:leaf, object.active, object.classes) do
|
@@ -38,7 +38,7 @@ module SemanticNavigation
|
|
38
38
|
:class => merge_classes(:link, object.active, object.link_classes)
|
39
39
|
end
|
40
40
|
end
|
41
|
-
|
41
|
+
|
42
42
|
end
|
43
43
|
end
|
44
44
|
end
|
@@ -1,33 +1,20 @@
|
|
1
1
|
module SemanticNavigation
|
2
2
|
module Renderers
|
3
3
|
module RenderHelpers
|
4
|
-
|
4
|
+
|
5
5
|
def self.included(base)
|
6
6
|
base.send :include, InstanceMethods
|
7
7
|
base.extend(ClassMethods)
|
8
8
|
base.class_eval do
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
:show_node_active_class => true,
|
16
|
-
:show_leaf_active_class => true,
|
17
|
-
:show_link_active_class => true,
|
18
|
-
|
19
|
-
:show_navigation_id => true,
|
20
|
-
:show_node_id => true,
|
21
|
-
:show_leaf_id => true,
|
22
|
-
:show_link_id => true,
|
23
|
-
|
24
|
-
:navigation_default_classes => [],
|
25
|
-
:node_default_classes => [],
|
26
|
-
:leaf_default_classes => [],
|
27
|
-
:link_default_classes => []
|
9
|
+
[:navigation, :node, :leaf, :link].each do |e|
|
10
|
+
style_accessor :"#{e}_active_class" => [:active],
|
11
|
+
:"show_#{e}_active_class" => true,
|
12
|
+
:"show_#{e}_id" => true,
|
13
|
+
:"#{e}_default_classes" => []
|
14
|
+
end
|
28
15
|
end
|
29
16
|
end
|
30
|
-
|
17
|
+
|
31
18
|
module ClassMethods
|
32
19
|
|
33
20
|
def style_accessor(hash)
|
@@ -50,9 +37,9 @@ module SemanticNavigation
|
|
50
37
|
end
|
51
38
|
"
|
52
39
|
send key, hash[key]
|
53
|
-
end
|
40
|
+
end
|
54
41
|
end
|
55
|
-
|
42
|
+
|
56
43
|
def property_for(class_name,name)
|
57
44
|
class_object = "semantic_navigation/core/#{class_name}".classify.constantize
|
58
45
|
class_object.class_eval "
|
@@ -64,24 +51,24 @@ module SemanticNavigation
|
|
64
51
|
"
|
65
52
|
end
|
66
53
|
end
|
67
|
-
|
68
|
-
module InstanceMethods
|
54
|
+
|
55
|
+
module InstanceMethods
|
69
56
|
attr_accessor :from_level, :until_level, :except_for, :name
|
70
|
-
|
57
|
+
|
71
58
|
def level=(level)
|
72
59
|
@from_level = level
|
73
60
|
@until_level = level
|
74
61
|
end
|
75
|
-
|
62
|
+
|
76
63
|
def levels=(level_range)
|
77
64
|
@from_level = level_range.first
|
78
65
|
@until_level = level_range.last
|
79
66
|
end
|
80
|
-
|
67
|
+
|
81
68
|
def initialize
|
82
69
|
@view_object = SemanticNavigation::Configuration.view_object
|
83
70
|
end
|
84
|
-
|
71
|
+
|
85
72
|
private
|
86
73
|
|
87
74
|
def content_tag(tag_name, content = nil, options={}, &block)
|
@@ -107,9 +94,9 @@ module SemanticNavigation
|
|
107
94
|
def object_name(object)
|
108
95
|
object.name(self.name)
|
109
96
|
end
|
110
|
-
|
97
|
+
|
111
98
|
end
|
112
|
-
|
113
|
-
end
|
99
|
+
|
100
|
+
end
|
114
101
|
end
|
115
102
|
end
|