class Refinery::MenuItem

Attributes

attributes[RW]
depth[RW]
lft[RW]
menu[RW]
menu_match[RW]
original_id[RW]
original_type[RW]
parent_id[RW]
rgt[RW]
title[RW]
url[RW]

Public Class Methods

new(menu, options = {}) click to toggle source
# File lib/refinery/menu_item.rb, line 7
def initialize(menu, options = {})
  @menu = menu
  remap!(options).each do |key, value|
    send "#{key}=", value
  end
  self.attributes = options
end

Public Instance Methods

ancestors() click to toggle source
# File lib/refinery/menu_item.rb, line 21
def ancestors
  @ancestors ||= generate_ancestors
end
children() click to toggle source
# File lib/refinery/menu_item.rb, line 25
def children
  @children ||= generate_children
end
descendants() click to toggle source
# File lib/refinery/menu_item.rb, line 29
def descendants
  @descendants ||= generate_descendants
end
has_children?() click to toggle source
# File lib/refinery/menu_item.rb, line 33
def has_children?
  !leaf?
end
Also aliased as: has_descendants?
has_descendants?()
Alias for: has_children?
has_parent?() click to toggle source
# File lib/refinery/menu_item.rb, line 38
def has_parent?
  !orphan?
end
leaf?() click to toggle source
# File lib/refinery/menu_item.rb, line 46
def leaf?
  @leaf ||= rgt.to_i - lft.to_i == 1
end
orphan?() click to toggle source
# File lib/refinery/menu_item.rb, line 42
def orphan?
  parent_id.nil? || menu.detect{ |item| compatible_with?(item) && item.original_id == parent_id}.nil?
end
parent() click to toggle source
# File lib/refinery/menu_item.rb, line 50
def parent
  @parent ||= ancestors.detect { |item| item.original_id == parent_id }
end
remap!(options) click to toggle source
# File lib/refinery/menu_item.rb, line 15
def remap!(options)
  options[:original_id] = options.delete(:id)
  options[:original_type] = options.delete(:type)
  options
end
shown_siblings()
Alias for: siblings
siblings() click to toggle source
# File lib/refinery/menu_item.rb, line 54
def siblings
  @siblings ||= ((has_parent? ? parent.children : menu.roots) - [self])
end
Also aliased as: shown_siblings
to_refinery_menu_item() click to toggle source
# File lib/refinery/menu_item.rb, line 59
def to_refinery_menu_item
  attributes
end

Private Instance Methods

compatible_with?(item) click to toggle source

At present a MenuItem can only have children of the same type to avoid id conflicts like a Blog::Post and a Page both having an id of 42

# File lib/refinery/menu_item.rb, line 67
def compatible_with?(item)
  original_type == item.original_type
end
generate_ancestors() click to toggle source
# File lib/refinery/menu_item.rb, line 71
def generate_ancestors
  if has_parent?
    menu.select { |item| compatible_with?(item) && item.lft < lft && item.rgt > rgt }
  else
    []
  end
end
generate_children() click to toggle source
# File lib/refinery/menu_item.rb, line 79
def generate_children
  descendants.select { |item| item.parent_id == original_id }
end
generate_descendants() click to toggle source
# File lib/refinery/menu_item.rb, line 83
def generate_descendants
  if has_descendants?
    menu.select { |item| compatible_with?(item) && item.lft > lft && item.rgt < rgt }
  else
    []
  end
end