Class: SmartNavigation::Renderer

Inherits:
Object
  • Object
show all
Defined in:
lib/smart_navigation/renderer.rb

Instance Method Summary collapse

Constructor Details

#initialize(view_context, items, options = {}) ⇒ Renderer

Initialize builder



4
5
6
7
8
9
10
11
12
13
14
# File 'lib/smart_navigation/renderer.rb', line 4

def initialize(view_context, items, options={})
  @context              = view_context
  @items                = sort_items items
  @menu_class           = options.fetch :menu_class,           'menu'
  @sep_class            = options.fetch :separator_class,      'separator'
  @group_class          = options.fetch :group_class,          'menu-group'
  @submenu_class        = options.fetch :submenu_class,        'submenu'
  @active_class         = options.fetch :active_class,         'active'
  @active_submenu_class = options.fetch :active_submenu_class, 'open'
  @submenu_icons        = options.fetch :submenu_icons,        false
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method, *args, &block) ⇒ Object

Get app helpers if method is missing



104
105
106
# File 'lib/smart_navigation/renderer.rb', line 104

def method_missing(method, *args, &block)
  @context.respond_to?(method) ? @context.send(method, *args, &block) : super
end

Instance Method Details

#current_group?(item) ⇒ Boolean

Check if current group



34
35
36
37
38
# File 'lib/smart_navigation/renderer.rb', line 34

def current_group?(item)
  current = item[:children].any? { |_k, v| current_page?(v) }
  current = item[:children].any? { |_k, v| current_group?(v) } if current.blank?
  current
end

#current_page?(item) ⇒ Boolean

Check if current page



28
29
30
31
# File 'lib/smart_navigation/renderer.rb', line 28

def current_page?(item)
  url = item_url(item)
  @context.current_page?(url)
end

#group_item_tag(item, icons = false) ⇒ Object

Create group menu item



65
66
67
68
69
70
71
72
# File 'lib/smart_navigation/renderer.rb', line 65

def group_item_tag(item, icons=false)
  active  = @active_class if current_group?(item)
  link    = item_link_tag item, icons
  submenu = submenu_item_tag item, active
  content = link + submenu

   :li, content.html_safe, class: "#{active} #{@group_class}"
end

Create item link



46
47
48
49
50
51
52
53
# File 'lib/smart_navigation/renderer.rb', line 46

def item_link_tag(item, icons=false)
  arrow =  :span, icon('angle-left pull-right'), class: 'pull-right-container'
  label =  :span, item[:label]
  label = icon("#{item[:icon]}") + label if icons.present?
  label = label + arrow if item[:children].present?

  link_to label.html_safe, item_url(item)
end

#item_tag(item, icons = false) ⇒ Object

Create menu list item



83
84
85
86
87
88
89
90
91
# File 'lib/smart_navigation/renderer.rb', line 83

def item_tag(item, icons=false)
  if item[:separator].present?
    separator_tag(item)
  elsif item[:children].present?
    group_item_tag(item, icons)
  else
    single_item_tag(item, icons)
  end
end

#item_url(item) ⇒ Object

Get menu item url



22
23
24
25
# File 'lib/smart_navigation/renderer.rb', line 22

def item_url(item)
  params = { controller: item[:controller], action: item[:action] }
  params[:action] ? url_for(params) : "##{item[:id]}"
end

Create menu list



94
95
96
# File 'lib/smart_navigation/renderer.rb', line 94

def menu_tag(items)
   :ul, items.html_safe, class: @menu_class
end

#renderObject

Render menu



99
100
101
# File 'lib/smart_navigation/renderer.rb', line 99

def render
  menu_tag @items.map { |k, v| item_tag(v, true) }.join
end

#separator_tag(item) ⇒ Object

Create menu separator



41
42
43
# File 'lib/smart_navigation/renderer.rb', line 41

def separator_tag(item)
   :li, item[:label], class: @sep_class
end

#single_item_tag(item, icons = false) ⇒ Object

Create single menu item



75
76
77
78
79
80
# File 'lib/smart_navigation/renderer.rb', line 75

def single_item_tag(item, icons=false)
  active = @active_class if current_page?(item)
  link   = item_link_tag(item, icons)

   :li, link.html_safe, class: "#{active}"
end

#sort_items(items) ⇒ Object

Sort items by order



17
18
19
# File 'lib/smart_navigation/renderer.rb', line 17

def sort_items(items)
  items.sort_by { |_k, v| v[:order] }.to_h
end

Create submenu item



56
57
58
59
60
61
62
# File 'lib/smart_navigation/renderer.rb', line 56

def submenu_item_tag(item, active=false)
  items  = sort_items item[:children]
  items  = items.map { |_k, v| item_tag(v, @submenu_icons) }.join
  active = @active_submenu_class if active.present?

  (:ul, items.html_safe, class: "#{active} #{@submenu_class}")
end