Class: Redmine::MenuManager::Mapper

Inherits:
Object
  • Object
show all
Defined in:
lib/redmine/menu_manager/mapper.rb

Overview

– copyright ChiliProject is a project management system.

Copyright (C) 2010-2013 the ChiliProject Team

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

See doc/COPYRIGHT.rdoc for more details. ++

Constant Summary collapse

@@last_items_count =
Hash.new {|h,k| h[k] = 0}

Instance Method Summary collapse

Constructor Details

#initialize(menu, items) ⇒ Mapper


16
17
18
19
20
# File 'lib/redmine/menu_manager/mapper.rb', line 16

def initialize(menu, items)
  items[menu] ||= Redmine::MenuManager::TreeNode.new(:root, {})
  @menu = menu
  @menu_items = items[menu]
end

Instance Method Details

#delete(name) ⇒ Object

Removes a menu item


79
80
81
82
83
# File 'lib/redmine/menu_manager/mapper.rb', line 79

def delete(name)
  if found = self.find(name)
    @menu_items.remove!(found)
  end
end

#exists?(name) ⇒ Boolean

Checks if a menu item exists


86
87
88
# File 'lib/redmine/menu_manager/mapper.rb', line 86

def exists?(name)
  @menu_items.any? {|node| node.name == name}
end

#find(name) ⇒ Object


90
91
92
# File 'lib/redmine/menu_manager/mapper.rb', line 90

def find(name)
  @menu_items.find {|node| node.name == name}
end

#position_of(name) ⇒ Object


94
95
96
97
98
99
100
# File 'lib/redmine/menu_manager/mapper.rb', line 94

def position_of(name)
  @menu_items.each do |node|
    if node.name == name
      return node.position
    end
  end
end

#push(name, url, options = {}) ⇒ Object

Adds an item at the end of the menu. Available options:

  • param: the parameter name that is used for the project id (default is :id)

  • if: a Proc that is called before rendering the item, the item is displayed only if it returns true

  • caption that can be:

    • a localized string Symbol

    • a String

    • a Proc that can take the project as argument

  • before, after: specify where the menu item should be inserted (eg. :after => :activity)

  • parent: menu item will be added as a child of another named menu (eg. :parent => :issues)

  • children: a Proc that is called before rendering the item. The Proc should return an array of MenuItems, which will be added as children to this item. eg. :children => Proc.new {|project| [Redmine::MenuManager::MenuItem.new(…)] }

  • last: menu item will stay at the end (eg. :last => true)

  • html_options: a hash of html options that are passed to link_to


37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/redmine/menu_manager/mapper.rb', line 37

def push(name, url, options={})
  options = options.dup

  if options[:parent]
    subtree = self.find(options[:parent])
    if subtree
      target_root = subtree
    else
      target_root = @menu_items.root
    end

  else
    target_root = @menu_items.root
  end

  # menu item position
  if first = options.delete(:first)
    target_root.prepend(Redmine::MenuManager::MenuItem.new(name, url, options))
  elsif before = options.delete(:before)

    if exists?(before)
      target_root.add_at(Redmine::MenuManager::MenuItem.new(name, url, options), position_of(before))
    else
      target_root.add(Redmine::MenuManager::MenuItem.new(name, url, options))
    end

  elsif after = options.delete(:after)

    if exists?(after)
      target_root.add_at(Redmine::MenuManager::MenuItem.new(name, url, options), position_of(after) + 1)
    else
      target_root.add(Redmine::MenuManager::MenuItem.new(name, url, options))
    end

  elsif options[:last] # don't delete, needs to be stored
    target_root.add_last(Redmine::MenuManager::MenuItem.new(name, url, options))
  else
    target_root.add(Redmine::MenuManager::MenuItem.new(name, url, options))
  end
end