Module: Menumatic::Navigation::Item::Renderers

Includes:
ActionView::Helpers::UrlHelper
Included in:
Base
Defined in:
lib/menumatic/navigation/item/renderers.rb

Constant Summary collapse

@@level_options =
[:primary, :secondary, :tertiary, :quarternary, :quinary, :senary, :septenary, :octonary, :nonary, :denary]

Instance Method Summary collapse

Instance Method Details

#count_active_descendants(request) ⇒ Object



86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/menumatic/navigation/item/renderers.rb', line 86

def count_active_descendants(request)
  self.items.each do |item|
    return item.count_active_descendants(request) + 1 if item.has_active_descendant?(request)
  end

  if (self.paths_match?(request) && !self.has_active_descendant?(request, false) && self.items.count > 0)
    return 1
  elsif (self.is_group? && !self.has_active_descendant?(request)) || (self.paths_match?(request) && !self.has_active_descendant?(request, false))
    return 0
  end
  0
end

#depth_count(request, options = {}) ⇒ Object



99
100
101
102
103
# File 'lib/menumatic/navigation/item/renderers.rb', line 99

def depth_count(request, options = {})
  return options[:levels].count if options[:levels] && !options[:levels].empty?
  depth = count_active_descendants(request)
  (depth > 0) ? depth : 1
end

#has_active_descendant?(request, include_self = true) ⇒ Boolean

Returns:

  • (Boolean)


78
79
80
81
82
83
84
# File 'lib/menumatic/navigation/item/renderers.rb', line 78

def has_active_descendant?(request, include_self = true)
  self.items.each do |item|
    return true if item.has_active_descendant?(request)
  end
  return true if paths_match?(request) if include_self
  false
end

#is_active?(request) ⇒ Boolean

Returns:

  • (Boolean)


74
75
76
# File 'lib/menumatic/navigation/item/renderers.rb', line 74

def is_active?(request)
  has_active_descendant?(request) || paths_match?(request)
end

#levels_to_i(levels_in_words) ⇒ Object



119
120
121
# File 'lib/menumatic/navigation/item/renderers.rb', line 119

def levels_to_i(levels_in_words)
  levels_in_words.map{ |word| word.is_a?(Symbol) ? @@level_options.index(word.to_sym) + 1 : word } if levels_in_words
end

#on_valid_level?(levels, current_level) ⇒ Boolean

Returns:

  • (Boolean)


115
116
117
# File 'lib/menumatic/navigation/item/renderers.rb', line 115

def on_valid_level?(levels, current_level)
  levels.nil? || levels.empty? || levels_to_i(levels).include?(current_level-1)
end

#paths_match?(request) ⇒ Boolean

Returns:

  • (Boolean)


105
106
107
108
109
110
111
112
113
# File 'lib/menumatic/navigation/item/renderers.rb', line 105

def paths_match?(request)
  if self.is_link?
    self.active_paths.each do |path|
      return true if path.is_a?(Regexp) && (request.fullpath.split('?').first =~ path || request.url.split('?').first =~ path)
      return true if path.is_a?(String) && (request.fullpath.split('?').first == path || request.url.split('?').first == path)
    end
    return request.fullpath.split('?').first == self.destination || request.url.split('?').first == self.destination if self.active_paths.empty?
  end
end

#render(request, options = {}) ⇒ Object



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/menumatic/navigation/item/renderers.rb', line 8

def render(request, options = {})
  options[:current_level] ||= 0

  html_options = {}
  html_options[:id] = options[:id] if options[:id]
  html_options[:class] = options[:class] if options[:class]
  options.delete(:id)
  options.delete(:class)
  options = options.merge({})
  options[:current_level] += 1

  options[:show] ||= :active
  options[:wrapper_tag] ||= :ul
  options[:item_tag] ||= :li

  # 1.0 roadmap - rendering should be divided into these two methods
  render_as_link(request, options) || render_as_group(request, options)

  # render list
  list = self.items.map { |item| item.render(request, options) }.join("")
  html_options[:class] ||= ""
  html_options[:class] = (html_options[:class].split(" ") + (self.is_active?(request) ? ["active"] : ["inactive"])).join(" ")

  unless list.blank?
    list_options = html_options.merge({})
    list_options[:class] += " level_#{options[:current_level]}"
    list_options[:class] += " depth_#{depth_count(request, options)}" if options[:current_level] == 1
    if on_valid_level?(options[:levels], options[:current_level]) || options[:current_level] == 1
      list = (options[:wrapper_tag], list.html_safe, list_options)
    else
      list = list.html_safe
    end
  end

  # render link
  link = ""
  link = link_to(self.label, self.destination, self.html_options).html_safe if self.is_link? && !options[:group]
  if on_valid_level?(options[:levels], options[:current_level])
    if (options[:current_level] == 1 && self.is_group?) || (self.is_group? && options[:group] == self.group_id)
      list.html_safe
    elsif options[:show] == :all || self.is_active?(request)
      (options[:item_tag], link.to_s + list.to_s, html_options.merge_with_join(self.wrapper_options)).to_s.html_safe
    elsif self.is_link?
      (options[:item_tag], link, html_options.merge_with_join(self.wrapper_options)).to_s.html_safe
    end
  elsif self.is_active?(request)
    list.html_safe
  end
end

#render_sitemap(document, request, options = {}) ⇒ Object



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/menumatic/navigation/item/renderers.rb', line 58

def render_sitemap(document, request, options = {})
  if is_link?
    unless self.destination[0...10] == "javascript"
      document.url do
        if self.destination[0...4] == "http"
          document.loc self.destination
        else
          document.loc request.protocol + request.host_with_port + self.destination
        end
        document.changefreq "weekly"
      end
    end
  end
  self.items.each{ |item| item.render_sitemap(document, request, options) }
end