module ActiveAdmin::Menu::MenuNode

Attributes

children[RW]

Public Class Methods

new() click to toggle source
# File lib/active_admin/menu.rb, line 24
def initialize
  @children = {}
end

Public Instance Methods

[](id) click to toggle source
# File lib/active_admin/menu.rb, line 28
def [](id)
  @children[normalize_id(id)]
end
[]=(id, child) click to toggle source
# File lib/active_admin/menu.rb, line 32
def []=(id, child)
  @children[normalize_id(id)] = child
end
add(options) { |item| ... } click to toggle source

Recursively builds any given menu items. There are two syntaxes supported, as shown in the below examples. Both create an identical menu structure.

Example 1:

menu = Menu.new
menu.add label: 'Dashboard' do |dash|
  dash.add label: 'My Child Dashboard'
end

Example 2:

menu = Menu.new
menu.add label:  'Dashboard'
menu.add parent: 'Dashboard', label: 'My Child Dashboard'
# File lib/active_admin/menu.rb, line 50
def add(options)
  options = options.dup # Make sure parameter is not modified
  parent_chain = Array.wrap(options.delete(:parent))

  item = if parent = parent_chain.shift
           options[:parent] = parent_chain if parent_chain.any?
           (self[parent] || add(label: parent)).add options
         else
           _add options.merge parent: self
         end

  yield(item) if block_given?

  item
end
current?(item) click to toggle source

Used in the UI to visually distinguish which menu item is selected.

# File lib/active_admin/menu.rb, line 72
def current?(item)
  self == item || include?(item)
end
include?(item) click to toggle source

Whether any children match the given item.

# File lib/active_admin/menu.rb, line 67
def include?(item)
  @children.values.include?(item) || @children.values.any? { |child| child.include?(item) }
end
items() click to toggle source
# File lib/active_admin/menu.rb, line 76
def items
  @children.values
end

Private Instance Methods

_add(options) click to toggle source

The method that actually adds new menu items. Called by the public method. If this ID is already taken, transfer the children of the existing item to the new item.

# File lib/active_admin/menu.rb, line 86
def _add(options)
  item = ActiveAdmin::MenuItem.new(options)
  item.send :children=, self[item.id].children if self[item.id]
  self[item.id] = item
end
normalize_id(id) click to toggle source
# File lib/active_admin/menu.rb, line 92
def normalize_id(id)
  case id
  when String, Symbol, ActiveModel::Name
    id.to_s.downcase.tr " ", "_"
  when ActiveAdmin::Resource::Name
    id.param_key
  else
    raise TypeError, "#{id.class} isn't supported as a Menu ID"
  end
end