class SmartNavigation::Renderer

Public Class Methods

new(view_context, items, options = {}) click to toggle source
# File lib/smart_navigation/renderer.rb, line 3
def initialize(view_context, items, options = {})
  @context = view_context
  @items   = sort_items items
  @options = merge_options options
end

Public Instance Methods

render() click to toggle source
# File lib/smart_navigation/renderer.rb, line 9
def render
  menu_tag @items.map { |k, v| item_tag(v, @options[:menu_icons]) }.join
end

Private Instance Methods

current_group?(item) click to toggle source
# File lib/smart_navigation/renderer.rb, line 80
def current_group?(item)
  current = current_page?(item)
  current = Hash(item[:children]).any? { |_k, v| current_page?(v) } if current.blank?
  current = Hash(item[:children]).any? { |_k, v| current_group?(v) } if current.blank?

  current
end
current_page?(item) click to toggle source
# File lib/smart_navigation/renderer.rb, line 73
def current_page?(item)
  current = @context.current_page?(item_url(item))
  current = page_parent?(item) if item[:children].blank? and current.blank?

  current
end
default_options() click to toggle source
# File lib/smart_navigation/renderer.rb, line 15
def default_options
  {
    menu_class:           'menu',
    menu_html:            {},
    menu_icons:           true,
    item_class:           'menu-item',
    separator_class:      'separator',
    submenu_parent_class: 'has-submenu',
    submenu_class:        'submenu',
    submenu_item_class:   'submenu-item',
    active_class:         'active',
    active_submenu_class: 'open',
    submenu_icons:        false,
    submenu_toggle:       nil,
    icon_prefix:          'icon icon-',
    icon_default:         'missing',
    icon_position:        'left',
    keep_defaults:        true
  }
end
group_item_tag(item, icons = false) click to toggle source
# File lib/smart_navigation/renderer.rb, line 131
def group_item_tag(item, icons = false)
  active  = @options[:active_class] if current_group?(item)
  link    = item_link_tag item, icons
  submenu = submenu_item_tag item, active
  content = link + submenu

  tag :li, content.html_safe, class: "#{active} #{@options[:submenu_parent_class]}".strip
end
icon_tag(name, label = nil) click to toggle source
# File lib/smart_navigation/renderer.rb, line 92
def icon_tag(name, label = nil)
  icon = tag :i, nil, class: "#{@options[:icon_prefix]}#{name || @options[:icon_default]}"

  if @options[:icon_position] == 'left'
    "#{icon}#{label}".html_safe
  else
    "#{label}#{icon}".html_safe
  end
end
item_tag(item, icons = false, subitem = false) click to toggle source
# File lib/smart_navigation/renderer.rb, line 150
def item_tag(item, icons = false, subitem = false)
  return unless render_item?(item)

  if item[:separator].present?
    separator_tag(item)
  elsif item[:children].present?
    group_item_tag(item, icons)
  else
    single_item_tag(item, icons, subitem)
  end
end
item_url(item) click to toggle source
# File lib/smart_navigation/renderer.rb, line 55
def item_url(item)
  if item[:url].present?
    mixed_value(item[:url])
  elsif item[:id].present?
    "##{item[:id]}"
  end
end
menu_tag(items) click to toggle source
merge_options(options) click to toggle source
# File lib/smart_navigation/renderer.rb, line 36
def merge_options(options)
  if options[:keep_defaults] == false
    options
  else
    default_options.merge(options)
  end
end
mixed_value(value) click to toggle source
# File lib/smart_navigation/renderer.rb, line 166
def mixed_value(value)
  if value.is_a?(Proc)
    @context.instance_exec(&value)
  elsif value.is_a?(Symbol)
    @context.send(value)
  else
    value
  end
end
page_parent?(item) click to toggle source
# File lib/smart_navigation/renderer.rb, line 48
def page_parent?(item)
  url   = item_url item
  paths = [@context.request.path, @context.request.url]

  url.present? && item[:root].blank? && paths.any? { |i| i.starts_with?(url) }
end
render_item?(item) click to toggle source
# File lib/smart_navigation/renderer.rb, line 63
def render_item?(item)
  if item[:if]
    mixed_value(item[:if]).present?
  elsif item[:unless]
    mixed_value(item[:unless]).blank?
  else
    true
  end
end
separator_tag(item) click to toggle source
# File lib/smart_navigation/renderer.rb, line 106
def separator_tag(item)
  tag :li, item[:label], class: @options[:separator_class]
end
single_item_tag(item, icons = false, subitem = false) click to toggle source
# File lib/smart_navigation/renderer.rb, line 140
def single_item_tag(item, icons = false, subitem = false)
  active = @options[:active_class] if current_page?(item)
  iclass = subitem ? @options[:submenu_item_class] : @options[:item_class]
  link   = item_link_tag(item, icons)
  opts   = Hash(item[:wrapper_html])
  opts   = opts.merge(class: "#{opts[:class]} #{active} #{iclass}".strip)

  tag :li, link.html_safe, opts
end
sort_items(items) click to toggle source
# File lib/smart_navigation/renderer.rb, line 44
def sort_items(items)
  items.sort_by { |_k, v| v[:order] }.to_h
end
submenu_item_tag(item, active = false) click to toggle source
tag(*args, &block) click to toggle source
# File lib/smart_navigation/renderer.rb, line 88
def tag(*args, &block)
  @context.content_tag(*args, &block)
end
toggle_tag() click to toggle source
# File lib/smart_navigation/renderer.rb, line 102
def toggle_tag
  "#{@options[:submenu_toggle]}".html_safe
end