class WonderNavigation::MenuItem

Attributes

deferrables[RW]
icon[RW]
id[RW]
level[RW]
menu_instance[RW]
parent_item[RW]
permission[RW]
subitems[RW]

Public Class Methods

new(menu_instance, level, id, options = {}, &block) click to toggle source
# File lib/wonder_navigation/menu_item.rb, line 6
def initialize(menu_instance, level, id, options = {}, &block)
  @level         = level
  @menu_instance = menu_instance
  @id            = id
  @subitems      = []
  @permission    = options[:permission]
  @icon          = options[:icon]
  @menu_instance.items[id] = self
  initialize_deferrables(options)

  self.instance_eval(&block) if block_given?

  validate if options.fetch(:validate, true)
end

Public Instance Methods

breadcrumbs(object = nil) click to toggle source
entry_visible?(max_depth, current_user) click to toggle source
# File lib/wonder_navigation/menu_item.rb, line 67
def entry_visible?(max_depth, current_user)
  # require "byebug"; debugger

  level < max_depth &&
    visible_deferrable.resolve(current_user) &&
    label_deferrable.resolvable?(nil) &&
    has_permission?(current_user)
end
has_permission?(current_user) click to toggle source
# File lib/wonder_navigation/menu_item.rb, line 91
def has_permission?(current_user)
  if !!permission && !!menu_instance.permission_checker
    # debugger
    instance_exec(permission, current_user, &menu_instance.permission_checker)
  else
    true
  end
end
label(&block) click to toggle source
# File lib/wonder_navigation/menu_item.rb, line 110
def label(&block)
  deferrables[:label] = DeferrableOption.new(block: block, name: "Label for #{id}")
end
menu(id, label = nil, options = {}, &block) click to toggle source
parent(&block) click to toggle source
# File lib/wonder_navigation/menu_item.rb, line 122
def parent(&block)
  deferrables[:parent] = DeferrableOption.new(block: block, name: "Parent for #{id}")
end
parent_item=(parent_item) click to toggle source
# File lib/wonder_navigation/menu_item.rb, line 100
def parent_item=(parent_item)
  if parent_item
    @parent_item = parent_item
    parent_item.subitems << self
  elsif @parent_item
    @parent_item.subitems.delete(self)
    @parent_item = nil
  end
end
path(&block) click to toggle source
# File lib/wonder_navigation/menu_item.rb, line 114
def path(&block)
  deferrables[:path] = DeferrableOption.new(block: block, name: "Path for #{id}")
end
resource(id, options = {}, &block) click to toggle source
# File lib/wonder_navigation/menu_item.rb, line 38
def resource(id, options = {}, &block)
  new = show = nil
  index = menu "#{id}_index", options do
    new = menu "#{id}_new", options.fetch(:new_label, translate_resource_action(:new, "New")), visible: false
    show = menu "#{id}_show" do
      label {|obj| obj.to_s }
      path {|obj| obj }
      menu "#{id}_edit", translate_resource_action(:edit, "Edit")
    end
  end
  index.instance_exec(index, new, show, &block) if block_given?
end
tree(current_page, max_depth, current_user) click to toggle source
# File lib/wonder_navigation/menu_item.rb, line 76
def tree(current_page, max_depth, current_user)
  MenuEntry.new(id, level).tap do |entry|
    entry.active  = id == current_page
    entry.visible = entry_visible?(max_depth, current_user)
    entry.icon = icon
    if entry.visible
      entry.label   = label_deferrable.resolve(nil)
      entry.path    = path_deferrable.try_resolve(nil)
    end

    entry.children = subtree(current_page, max_depth, current_user)
    entry.promote_active_state
  end
end
validate() click to toggle source
# File lib/wonder_navigation/menu_item.rb, line 21
def validate
  unless label_deferrable.present?
    raise ELabelNotDefined.new("MenuItem #{id} was called without define a label text or proc")
  end
end
visible(&block) click to toggle source
# File lib/wonder_navigation/menu_item.rb, line 118
def visible(&block)
  deferrables[:visible] = DeferrableOption.new(block: block, name: "Visible for #{id}")
end

Private Instance Methods

initialize_deferrables(options) click to toggle source
# File lib/wonder_navigation/menu_item.rb, line 128
def initialize_deferrables(options)
  @deferrables = {}
  visible = options.fetch(:visible, true)
  deferrables[:visible] = DeferrableOption.new(fixed: visible, name: "Visible for #{id}")
  deferrables[:label]   = DeferrableOption.new(fixed: options[:label], name: "Label for #{id}")
  deferrables[:path]    = DeferrableOption.new(fixed: options[:path], name: "Path for #{id}")
  deferrables[:parent]  = DeferrableOption.new(name: "Parent for #{id}")
end
label_deferrable() click to toggle source
# File lib/wonder_navigation/menu_item.rb, line 137
def label_deferrable
  deferrables[:label]
end
parent_deferrable() click to toggle source
# File lib/wonder_navigation/menu_item.rb, line 149
def parent_deferrable
  deferrables[:parent]
end
path_deferrable() click to toggle source
# File lib/wonder_navigation/menu_item.rb, line 141
def path_deferrable
  deferrables[:path]
end
subtree(current_page, max_depth, current_user) click to toggle source
# File lib/wonder_navigation/menu_item.rb, line 153
def subtree(current_page, max_depth, current_user)
  subitems.collect do |sub_item|
    sub_item.tree(current_page, max_depth, current_user)
  end
end
translate_resource_action(action, default) click to toggle source
# File lib/wonder_navigation/menu_item.rb, line 159
def translate_resource_action(action, default)
  if defined?(I18n)
    I18n.t("wonder_navigation.resource.#{action}", default: default)
  else
    default
  end
end
visible_deferrable() click to toggle source
# File lib/wonder_navigation/menu_item.rb, line 145
def visible_deferrable
  deferrables[:visible]
end