Class: WonderNavigation::MenuItem

Inherits:
Object
  • Object
show all
Defined in:
lib/wonder_navigation/menu_item.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(menu_instance, level, id, options = {}, &block) ⇒ MenuItem

Returns a new instance of MenuItem.



6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 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

Instance Attribute Details

#deferrablesObject

Returns the value of attribute deferrables.



4
5
6
# File 'lib/wonder_navigation/menu_item.rb', line 4

def deferrables
  @deferrables
end

#iconObject

Returns the value of attribute icon.



4
5
6
# File 'lib/wonder_navigation/menu_item.rb', line 4

def icon
  @icon
end

#idObject

Returns the value of attribute id.



4
5
6
# File 'lib/wonder_navigation/menu_item.rb', line 4

def id
  @id
end

#levelObject

Returns the value of attribute level.



4
5
6
# File 'lib/wonder_navigation/menu_item.rb', line 4

def level
  @level
end

Returns the value of attribute menu_instance.



4
5
6
# File 'lib/wonder_navigation/menu_item.rb', line 4

def menu_instance
  @menu_instance
end

#parent_itemObject

Returns the value of attribute parent_item.



4
5
6
# File 'lib/wonder_navigation/menu_item.rb', line 4

def parent_item
  @parent_item
end

#permissionObject

Returns the value of attribute permission.



4
5
6
# File 'lib/wonder_navigation/menu_item.rb', line 4

def permission
  @permission
end

#subitemsObject

Returns the value of attribute subitems.



4
5
6
# File 'lib/wonder_navigation/menu_item.rb', line 4

def subitems
  @subitems
end

Instance Method Details



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/wonder_navigation/menu_item.rb', line 51

def breadcrumbs(object = nil)
  result = []
  if parent_item
    parent_object = object
    if parent_deferrable.present?
      parent_object = parent_deferrable.resolve(object)
    end
    result += parent_item.breadcrumbs(parent_object)
  end
  current = Crumb.new(id)
  current.label = label_deferrable.resolve(object)
  current.path  = path_deferrable.resolve(object) if path_deferrable.resolvable?(object)

  result << current
end

#entry_visible?(max_depth, current_user) ⇒ Boolean

Returns:

  • (Boolean)


67
68
69
70
71
72
73
74
# 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) ⇒ Boolean

Returns:

  • (Boolean)


91
92
93
94
95
96
97
98
# 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) ⇒ Object



110
111
112
# File 'lib/wonder_navigation/menu_item.rb', line 110

def label(&block)
  deferrables[:label] = DeferrableOption.new(block: block, name: "Label for #{id}")
end


27
28
29
30
31
32
33
34
35
36
# File 'lib/wonder_navigation/menu_item.rb', line 27

def menu(id, label = nil, options = {}, &block)
  if label.is_a?(Hash)
    options = label
  else
    options[:label] = label
  end
  sub_item = MenuItem.new(menu_instance, level + 1, id.to_sym, options, &block)
  sub_item.parent_item = self
  sub_item
end

#parent(&block) ⇒ Object



122
123
124
# File 'lib/wonder_navigation/menu_item.rb', line 122

def parent(&block)
  deferrables[:parent] = DeferrableOption.new(block: block, name: "Parent for #{id}")
end

#path(&block) ⇒ Object



114
115
116
# 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) ⇒ Object



38
39
40
41
42
43
44
45
46
47
48
49
# 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) ⇒ Object



76
77
78
79
80
81
82
83
84
85
86
87
88
89
# 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

#validateObject



21
22
23
24
25
# 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) ⇒ Object



118
119
120
# File 'lib/wonder_navigation/menu_item.rb', line 118

def visible(&block)
  deferrables[:visible] = DeferrableOption.new(block: block, name: "Visible for #{id}")
end