semantic_navigation 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/Changelog.md ADDED
@@ -0,0 +1,17 @@
1
+ ### 0.0.2 / Unknown
2
+
3
+ * Definition of default render options (active_class and show_ids)
4
+ * Definition of the private render options to each menu item
5
+ * Definition of default option that says render submenu always or only then parent is active
6
+ * Raise error on undefined helper methods calls
7
+ * Raise error on undefined menu render calls
8
+ * Added helper method to render active name item
9
+ * Added helper method to render active item parent name
10
+ * Changed helper method to render menu
11
+ * Added prefixes for menu, item, name ids
12
+ * Added conditions for rendering (function show_if)
13
+ * Added breadcrumbs rendering
14
+
15
+ ### 0.0.1 / December 23th, 2011
16
+
17
+ * Initial release [Sergey Gribovski]
data/README.md CHANGED
@@ -8,7 +8,7 @@ The purpose of this gem is to generate simple and usefull navigation. You can de
8
8
 
9
9
  Write the gem dependency in your Gemfile:
10
10
  ```
11
- gem 'semantic_navigation', :git => 'git://github.com/fr33z3/semantic_navigation.git'
11
+ gem 'semantic_navigation'
12
12
  ```
13
13
 
14
14
  Make the install by bundler
@@ -3,34 +3,44 @@ require 'semantic_navigation/item'
3
3
  module SemanticNavigation
4
4
  class Configuration
5
5
 
6
- attr_accessor :active_class, :create_ids, :show_submenu
7
-
8
- class << self
9
- def run
10
- instance = self.new
11
- yield instance if block_given?
12
- instance
13
- end
6
+ def self.run
7
+ instance = self.new
8
+ yield instance if block_given?
9
+ instance
14
10
  end
15
11
 
16
12
  def initialize
17
- @active_class = 'active'
18
- @create_ids = true
19
- @show_submenu = false
20
13
  @menus = {}
21
14
  end
22
15
 
23
16
  def method_missing(name, *args)
24
- menu = Item.new(name.to_s, args, self)
25
- @menus.merge!({name => menu})
26
- yield menu if block_given?
17
+ name = name.to_s
18
+ if name.chomp('=') != name
19
+ SemanticNavigation::Item.set_default_option(name.chop,args[0])
20
+ else
21
+ menu = Item.new(name, args, nil)
22
+ @menus.merge!({name.to_sym => menu})
23
+ yield menu if block_given?
24
+ end
27
25
  end
28
26
 
29
- def render(view_object, name)
27
+ def render(name, command = :render)
30
28
  if @menus[name.to_sym]
31
- return @menus[name.to_sym].render(view_object)
29
+ if command == :render
30
+ return @menus[name.to_sym].render
31
+ elsif command == :active_item_name
32
+ item = @menus[name.to_sym].find_active_item
33
+ !item.nil? ? item.name : ''
34
+ elsif command == :active_item_parent_name
35
+ item = @menus[name.to_sym].find_active_item
36
+ !item.nil? && !item.parent.nil? ? item.parent.name : ''
37
+ elsif command == :breadcrumb
38
+ return @menus[name.to_sym].render_breadcrumb
39
+ else
40
+ raise NoMethodError.new("Wrong menu render parameter:`#{command.to_s}`")
41
+ end
32
42
  else
33
- return nil
43
+ raise NoMethodError.new("No such menu name:`#{name}` check your #{Rails.root}/config/semantic_navigation.rb) file")
34
44
  end
35
45
  end
36
46
 
@@ -0,0 +1,15 @@
1
+ module SemanticNavigation
2
+ module Core
3
+ module Procs
4
+
5
+ def show_if
6
+ @condition = Proc.new
7
+ end
8
+
9
+ def render_item?
10
+ !@condition.nil? ? @condition.call : true
11
+ end
12
+
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,67 @@
1
+ module SemanticNavigation
2
+ module Core
3
+ module Render
4
+
5
+ def render
6
+ return nil if !render_item?
7
+ if @parent
8
+ sub = @active || show_submenu? ? render_submenu : nil
9
+ link = view_object.link_to @name, @url_options, :class => classes, :id => a_id
10
+ view_object.content_tag(:li, link + sub, :id => li_id, :class => classes)
11
+ else
12
+ render_submenu
13
+ end
14
+ end
15
+
16
+ def set_as_active
17
+ @active = true
18
+ @parent.set_as_active if @parent
19
+ end
20
+
21
+ def find_active_item
22
+ item = nil
23
+ if active?
24
+ item = self
25
+ elsif @active
26
+ @sub_items.each do |s|
27
+ buff = s.find_active_item
28
+ item = buff if !buff.nil?
29
+ end
30
+ end
31
+ item
32
+ end
33
+
34
+ def render_breadcrumb
35
+ breadcrumb = nil
36
+ if @active
37
+ if @name
38
+ link = view_object.link_to @name, @url_options, :id => a_id
39
+ breadcrumb = view_object.content_tag(:li, link + breadcrumb_name, :id => li_id) if @name
40
+ end
41
+ buff = @sub_items.map{|s| s.render_breadcrumb}.find{|s| !s.nil?}
42
+ if !breadcrumb.nil?
43
+ breadcrumb += buff if !buff.nil?
44
+ else
45
+ breadcrumb = buff
46
+ end
47
+ end
48
+ breadcrumb = view_object.content_tag(:ul, breadcrumb, :id => ul_id, :class => breadcrumb_classes) if !@parent
49
+ breadcrumb
50
+ end
51
+
52
+ private
53
+
54
+ def render_submenu
55
+ if @sub_items.count > 0
56
+ sub = @sub_items.map{|s| s.render}.sum
57
+ view_object.content_tag(:ul, sub, :id => ul_id) if sub != 0
58
+ end
59
+ end
60
+
61
+ def active?
62
+ !@parent.nil? ? view_object.current_page?(@url_options) : false
63
+ end
64
+ end
65
+ end
66
+ end
67
+
@@ -1,11 +1,12 @@
1
1
  module SemanticNavigation::HelperMethods
2
2
 
3
- def method_missing(name)
4
- name_parts = name.to_s.split('_')
5
- if (name_parts.count == 3 && name_parts[0] == 'render' && name_parts[2] == 'menu')
6
- semantic_navigation_config.render(self, name_parts[1])
3
+ def method_missing(name, command = :render)
4
+ name = name.to_s
5
+ if name[0..6] == 'render_'
6
+ SemanticNavigation::Item.set_default_option('view_object',self)
7
+ semantic_navigation_config.render(name[7..-1], command)
7
8
  else
8
- super
9
+ raise NoMethodError.new("NoMethodError:#{name}")
9
10
  end
10
11
  end
11
12
 
@@ -1,15 +1,42 @@
1
+ require 'semantic_navigation/core/render'
2
+ require 'semantic_navigation/core/procs'
1
3
  module SemanticNavigation
2
4
  class Item
3
-
5
+ include Core::Render
6
+ include Core::Procs
7
+
8
+ #Menu variables
9
+ @@active_class = 'active'
10
+ @@show_active_class = true
11
+ @@show_menu_id = true
12
+ @@show_submenu = false
13
+ @@menu_prefix = ''
14
+
15
+ #Item variables
16
+ @@item_perfix = ''
17
+ @@name_prefix = ''
18
+ @@show_name_id = true
19
+ @@show_item_id = true
20
+
21
+ #Breadcrumb variables
22
+ @@breadcrumb_divider = "/"
23
+
24
+
25
+
26
+ attr_accessor :active_class, :show_active_class, :show_menu_id,
27
+ :show_item_id, :show_name_id, :show_submenu,
28
+ :menu_prefix, :item_prefix, :name_prefix,
29
+ :item_classes,
30
+ :name, :parent
31
+
4
32
  def initialize(id, args, parent)
5
33
  @item_id = id
6
34
  @name = args.first
7
35
  @url_options = args.second
8
36
  @parent = parent
9
-
10
37
  @sub_items = []
11
- @active_class = 'active'
12
- @active = false
38
+
39
+ set_as_active if active?
13
40
  end
14
41
 
15
42
  def method_missing(name, *args)
@@ -18,44 +45,59 @@ module SemanticNavigation
18
45
  yield item if block_given?
19
46
  end
20
47
 
21
- def render(view_object)
22
- @view_object = view_object
23
- if parent
24
- set_as_active if active?
25
- sub = render_subitems
26
- link = view_object.link_to @name, @url_options, :class => classes, :id => @item_id
27
- view_object.content_tag(:li, link + sub, :id => @item_id, :class => classes)
28
- else
29
- render_subitems
30
- end
31
- end
32
-
33
- def set_as_active
34
- @active = true
35
- parent.set_as_active if parent
48
+ def self.set_default_option(name, value)
49
+ class_variable_set("@@#{name}".to_sym, value)
36
50
  end
37
51
 
38
52
  private
39
53
 
40
- def render_subitems
41
- if @sub_items.count > 0
42
- sub = @sub_items.map{|s| s.render(@view_object)}.sum
43
- @view_object.content_tag(:ul, sub, :id => @item_id)
44
- end
54
+ def ul_id
55
+ prefix = @menu_prefix.nil? ? @@menu_prefix : @menu_prefix
56
+ flag = @show_menu_id.nil? ? @@show_menu_id : @show_menu_id
57
+ flag ? prefix+@item_id : nil
58
+ end
59
+
60
+ def li_id
61
+ prefix = @item_prefix.nil? ? @@item_prefix : @item_prefix
62
+ flag = @show_item_id.nil? ? @@show_item_id : @show_item_id
63
+ flag ? prefix+@item_id : nil
64
+ end
65
+
66
+ def a_id
67
+ prefix = @name_prefix.nil? ? @@name_prefix : @name_prefix
68
+ flag = @show_name_id.nil? ? @@show_name_id : @show_name_id
69
+ flag ? prefix+@item_id : nil
45
70
  end
46
71
 
47
72
  def classes
48
- if @active
49
- @active_class
73
+ class_array = []
74
+ class_array << item_classes
75
+ active_class = @active_class.nil? ? @@active_class : @active_class
76
+ flag = @show_active_class.nil? ? @@show_active_class : @show_active_class
77
+ if @active && flag
78
+ class_array << active_class
50
79
  end
80
+ class_array.flatten.join(' ')
51
81
  end
52
82
 
53
- def active?
54
- @view_object.current_page?(@url_options)
83
+ def view_object
84
+ @@view_object
55
85
  end
56
86
 
57
- def parent
58
- @parent.is_a?(SemanticNavigation::Item) ? @parent : nil
87
+ def show_submenu?
88
+ @show_submenu.nil? ? @@show_submenu : @show_submenu
89
+ end
90
+
91
+ def breadcrumb_name
92
+ @@breadcrumb_divider.html_safe
93
+ end
94
+
95
+ def breadcrumb_classes
96
+ if @@breadcrumb_classes.is_a? Array
97
+ return @@breadcrumb_classes.join(' ')
98
+ else
99
+ return @@breadcrumb_classes
100
+ end
59
101
  end
60
102
 
61
103
  end
@@ -1,3 +1,3 @@
1
1
  module SemanticNavigation
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -1,15 +1,57 @@
1
1
  #This file need to create the navigation in your app.
2
+ #You can learn more about how to customize your menu reading the wiki
3
+ #Wiki pages link: https://github.com/fr33z3/semantic_navigation/wiki/_pages
2
4
  SemanticNavigation::Configuration.run do |config|
3
5
 
4
- #That's the creation of the navigation menu
5
- config.navigation do |n|
6
- n.main 'Main', :controller => :dashboard, :action => :index
7
- n.about 'About', :controller => :about, :action => :index do |a|
8
- a.company 'About company', :controller => :about, :action => :company
9
- a.employes 'About our employes', :controller => :about, :action => :employes
10
- end
11
- n.feed_back 'Feedback', :controller => :feed_back, :action => :index
12
- end
13
- #You can render this menu by calling method render_navigation_menu
6
+ #What's the name of the active menu class will be (the dafault is 'active')
7
+ #config.active_class = 'active';
8
+
9
+ #Do you want to show active class? (default = true)
10
+ #config.show_active_class = true
11
+
12
+ #Create the item ids (in the `li` tag) automatically (default = true)?
13
+ #config.show_item_id = true
14
+
15
+ #Create the menu ids (in the `ul` tag) automatically (default = true)?
16
+ #config.show_menu_id = true
17
+
18
+ #Create the name id (in the `a` tag) automatically (default = true)?
19
+ #config.show_name_id = true
20
+
21
+ #Show the submenu only when the menu is active (default = false)
22
+ #config.show_submenu = false
23
+
24
+ #Add menu prefix (`ul` tag)
25
+ #config.menu_prefix = 'menu_'
26
+
27
+ #Add item prefix (`li` tag)
28
+ #config.item_prefix = 'item_'
29
+
30
+ #Add name preifx (`a` tag)
31
+ #config.name_prefix = 'name_'
32
+
33
+ #Define breadcrumb divider
34
+ #config.breadcrumb_divider = "<span class ='divider'>/</span>"
35
+
36
+ #Define bread crumb classes
37
+ #config.breadcrumb_classes = "breadcrumb"
38
+
39
+ #That's how you can create your userbar menu
40
+ #config.userbar do |userbar|
41
+ # userbar.signin :controller => :session, :action => :signin, :if => current_user.nil?
42
+ # userbar.signout :controller => :session, :action => :signout, :if => !current_user.nil?
43
+ #end
44
+ #so you can use the helper 'render_userbar_menu' to render it.
45
+
46
+ #That's the creation of the `navigation` menu
47
+ #config.navigation {|n|
48
+ # n.dashboard 'Dashboard', :controller => :dashboard, :action => :index do |d|
49
+ # d.first 'First', :controller => :first, :action => :index do |f|
50
+ # f.sub_first 'Sub First', sub_first_index_path
51
+ # f.sub_second 'Sub Second', :controller => :sub_second, :action => :index
52
+ # end
53
+ # end
54
+ # n.second 'Help', :controller => :second, :action => :index
55
+ #}
14
56
 
15
57
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: semantic_navigation
3
3
  version: !ruby/object:Gem::Version
4
- hash: 29
4
+ hash: 27
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 1
10
- version: 0.0.1
9
+ - 2
10
+ version: 0.0.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Sergey Gribovski
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-12-22 00:00:00 Z
18
+ date: 2011-12-30 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: rspec
@@ -60,11 +60,14 @@ extra_rdoc_files: []
60
60
 
61
61
  files:
62
62
  - .gitignore
63
+ - Changelog.md
63
64
  - Gemfile
64
65
  - README.md
65
66
  - Rakefile
66
67
  - lib/semantic_navigation.rb
67
68
  - lib/semantic_navigation/configuration.rb
69
+ - lib/semantic_navigation/core/procs.rb
70
+ - lib/semantic_navigation/core/render.rb
68
71
  - lib/semantic_navigation/helper_methods.rb
69
72
  - lib/semantic_navigation/item.rb
70
73
  - lib/semantic_navigation/railtie.rb