2011-08-20 06:50:09 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# Redmine - project management software  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# Copyright (C) 2006-2011  Jean-Philippe Lang  
						 
					
						
							
								
									
										
										
										
											2007-08-29 16:52:35 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								#  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# 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.  
						 
					
						
							
								
									
										
										
										
											2011-08-20 06:50:09 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								#  
						 
					
						
							
								
									
										
										
										
											2007-08-29 16:52:35 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# This program is distributed in the hope that it will be useful,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# but WITHOUT ANY WARRANTY; without even the implied warranty of  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# GNU General Public License for more details.  
						 
					
						
							
								
									
										
										
										
											2011-08-20 06:50:09 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								#  
						 
					
						
							
								
									
										
										
										
											2007-08-29 16:52:35 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# You should have received a copy of the GNU General Public License  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# along with this program; if not, write to the Free Software  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								module  Redmine  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  module  MenuManager 
							 
						 
					
						
							
								
									
										
										
										
											2009-11-25 05:36:50 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    class  MenuError  <  StandardError  #:nodoc: 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    end 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-20 06:50:09 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-01-19 11:53:43 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    module  MenuController 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      def  self . included ( base ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        base . extend ( ClassMethods ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      module  ClassMethods 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        @@menu_items  =  Hash . new  { | hash ,  key |  hash [ key ]  =  { :default  = >  key ,  :actions  = >  { } } } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        mattr_accessor  :menu_items 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-20 06:50:09 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-01-19 11:53:43 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        # Set the menu item name for a controller or specific actions 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Examples: 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        #   * menu_item :tickets # => sets the menu name to :tickets for the whole controller 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        #   * menu_item :tickets, :only => :list # => sets the menu name to :tickets for the 'list' action only 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        #   * menu_item :tickets, :only => [:list, :show] # => sets the menu name to :tickets for 2 actions only 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-20 06:50:09 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        # 
							 
						 
					
						
							
								
									
										
										
										
											2008-01-19 11:53:43 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        # The default menu item name for a controller is controller_name by default 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Eg. the default menu item name for ProjectsController is :projects 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        def  menu_item ( id ,  options  =  { } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          if  actions  =  options [ :only ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            actions  =  [ ]  <<  actions  unless  actions . is_a? ( Array ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            actions . each  { | a |  menu_items [ controller_name . to_sym ] [ :actions ] [ a . to_sym ]  =  id } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            menu_items [ controller_name . to_sym ] [ :default ]  =  id 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      end 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-20 06:50:09 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-01-19 11:53:43 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								      def  menu_items 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        self . class . menu_items 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      end 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-20 06:50:09 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-01-19 11:53:43 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								      # Returns the menu item name according to the current action 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      def  current_menu_item 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-30 14:24:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        @current_menu_item  || =  menu_items [ controller_name . to_sym ] [ :actions ] [ action_name . to_sym ]  || 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                 menu_items [ controller_name . to_sym ] [ :default ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      end 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-20 06:50:09 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-12-30 14:24:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								      # Redirects user to the menu item of the given project 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      # Returns false if user is not authorized 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      def  redirect_to_project_menu_item ( project ,  name ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        item  =  Redmine :: MenuManager . items ( :project_menu ) . detect  { | i |  i . name . to_s  ==  name . to_s } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  item  &&  User . current . allowed_to? ( item . url ,  project )  &&  ( item . condition . nil?  ||  item . condition . call ( project ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          redirect_to ( { item . param  = >  project } . merge ( item . url ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          return  true 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        false 
							 
						 
					
						
							
								
									
										
										
										
											2008-01-19 11:53:43 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								      end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    end 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-20 06:50:09 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-01-19 11:53:43 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    module  MenuHelper 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      # Returns the current menu item name 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      def  current_menu_item 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-23 18:28:11 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        controller . current_menu_item 
							 
						 
					
						
							
								
									
										
										
										
											2008-01-19 11:53:43 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								      end 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-20 06:50:09 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-02-12 17:58:46 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								      # Renders the application main menu 
							 
						 
					
						
							
								
									
										
										
										
											2008-01-19 11:53:43 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								      def  render_main_menu ( project ) 
							 
						 
					
						
							
								
									
										
										
										
											2008-02-12 17:58:46 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        render_menu ( ( project  &&  ! project . new_record? )  ?  :project_menu  :  :application_menu ,  project ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      end 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-20 06:50:09 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-03-04 06:01:05 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								      def  display_main_menu? ( project ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        menu_name  =  project  &&  ! project . new_record?  ?  :project_menu  :  :application_menu 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-14 22:51:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        Redmine :: MenuManager . items ( menu_name ) . children . present? 
							 
						 
					
						
							
								
									
										
										
										
											2010-03-04 06:01:05 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								      end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-02-12 17:58:46 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								      def  render_menu ( menu ,  project = nil ) 
							 
						 
					
						
							
								
									
										
										
										
											2008-01-19 11:53:43 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        links  =  [ ] 
							 
						 
					
						
							
								
									
										
										
										
											2009-11-25 05:36:44 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        menu_items_for ( menu ,  project )  do  | node | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          links  <<  render_menu_node ( node ,  project ) 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-11 18:10:21 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        end 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-20 06:52:25 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        links . empty?  ?  nil  :  content_tag ( 'ul' ,  links . join ( " \n " ) . html_safe ) 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-11 18:10:21 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								      end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-11-25 05:36:44 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								      def  render_menu_node ( node ,  project = nil ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-14 22:51:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  node . children . present?  ||  ! node . child_menus . nil? 
							 
						 
					
						
							
								
									
										
										
										
											2009-11-25 05:36:50 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								          return  render_menu_node_with_children ( node ,  project ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          caption ,  url ,  selected  =  extract_node_details ( node ,  project ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          return  content_tag ( 'li' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                               render_single_menu_node ( node ,  caption ,  url ,  selected ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      def  render_menu_node_with_children ( node ,  project = nil ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-11-25 05:36:44 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        caption ,  url ,  selected  =  extract_node_details ( node ,  project ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-11-25 05:36:50 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-11-14 16:24:21 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        html  =  [ ] . tap  do  | html | 
							 
						 
					
						
							
								
									
										
										
										
											2009-11-25 05:36:44 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								          html  <<  '<li>' 
							 
						 
					
						
							
								
									
										
										
										
											2009-11-25 05:36:50 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								          # Parent 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          html  <<  render_single_menu_node ( node ,  caption ,  url ,  selected ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          # Standard children 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 22:26:27 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								          standard_children_list  =  " " . html_safe . tap  do  | child_html | 
							 
						 
					
						
							
								
									
										
										
										
											2009-11-25 05:36:50 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            node . children . each  do  | child | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								              child_html  <<  render_menu_node ( child ,  project ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            end 
							 
						 
					
						
							
								
									
										
										
										
											2009-11-25 05:36:44 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								          end 
							 
						 
					
						
							
								
									
										
										
										
											2009-11-25 05:36:50 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          html  <<  content_tag ( :ul ,  standard_children_list ,  :class  = >  'menu-children' )  unless  standard_children_list . empty? 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          # Unattached children 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          unattached_children_list  =  render_unattached_children_menu ( node ,  project ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          html  <<  content_tag ( :ul ,  unattached_children_list ,  :class  = >  'menu-children unattached' )  unless  unattached_children_list . blank? 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-11-25 05:36:44 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								          html  <<  '</li>' 
							 
						 
					
						
							
								
									
										
										
										
											2009-11-25 05:36:50 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        end 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 22:26:27 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  html . join ( " \n " ) . html_safe 
							 
						 
					
						
							
								
									
										
										
										
											2009-11-25 05:36:50 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								      end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      # Returns a list of unattached children menu items 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      def  render_unattached_children_menu ( node ,  project ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  nil  unless  node . child_menus 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 22:26:27 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        " " . html_safe . tap  do  | child_html | 
							 
						 
					
						
							
								
									
										
										
										
											2009-11-25 05:36:50 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								          unattached_children  =  node . child_menus . call ( project ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          # Tree nodes support #each so we need to do object detection 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          if  unattached_children . is_a?  Array 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            unattached_children . each  do  | child | 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-20 06:50:09 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								              child_html  <<  content_tag ( :li ,  render_unattached_menu_item ( child ,  project ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-11-25 05:36:50 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            raise  MenuError ,  " :child_menus must be an array of MenuItems " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          end 
							 
						 
					
						
							
								
									
										
										
										
											2009-11-25 05:36:44 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      def  render_single_menu_node ( item ,  caption ,  url ,  selected ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        link_to ( h ( caption ) ,  url ,  item . html_options ( :selected  = >  selected ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      end 
							 
						 
					
						
							
								
									
										
										
										
											2009-11-25 05:36:50 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      def  render_unattached_menu_item ( menu_item ,  project ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        raise  MenuError ,  " :child_menus must be an array of MenuItems "  unless  menu_item . is_a?  MenuItem 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  User . current . allowed_to? ( menu_item . url ,  project ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          link_to ( h ( menu_item . caption ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                  menu_item . url , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                  menu_item . html_options ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      end 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-20 06:50:09 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-11-11 18:10:21 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								      def  menu_items_for ( menu ,  project = nil ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        items  =  [ ] 
							 
						 
					
						
							
								
									
										
										
										
											2009-11-25 05:36:44 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        Redmine :: MenuManager . items ( menu ) . root . children . each  do  | node | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          if  allowed_node? ( node ,  User . current ,  project ) 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-11 18:10:21 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  block_given? 
							 
						 
					
						
							
								
									
										
										
										
											2009-11-25 05:36:44 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								              yield  node 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-11 18:10:21 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            else 
							 
						 
					
						
							
								
									
										
										
										
											2009-11-25 05:36:44 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								              items  <<  node   # TODO: not used? 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-11 18:10:21 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            end 
							 
						 
					
						
							
								
									
										
										
										
											2008-01-19 11:53:43 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								          end 
							 
						 
					
						
							
								
									
										
										
										
											2008-02-12 17:58:46 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        end 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-11 18:10:21 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  block_given?  ?  nil  :  items 
							 
						 
					
						
							
								
									
										
										
										
											2008-01-19 11:53:43 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								      end 
							 
						 
					
						
							
								
									
										
										
										
											2009-11-25 05:36:44 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      def  extract_node_details ( node ,  project = nil ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        item  =  node 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        url  =  case  item . url 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        when  Hash 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          project . nil?  ?  item . url  :  { item . param  = >  project } . merge ( item . url ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        when  Symbol 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          send ( item . url ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          item . url 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        caption  =  item . caption ( project ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  [ caption ,  url ,  ( current_menu_item  ==  item . name ) ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      # Checks if a user is allowed to access the menu item by: 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      # 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      # * Checking the conditions of the item 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      # * Checking the url target (project only) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      def  allowed_node? ( node ,  user ,  project ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  node . condition  &&  ! node . condition . call ( project ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          # Condition that doesn't pass 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          return  false 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  project 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          return  user  &&  user . allowed_to? ( node . url ,  project ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          # outside a project, all menu items allowed 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          return  true 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      end 
							 
						 
					
						
							
								
									
										
										
										
											2008-01-19 11:53:43 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    end 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-20 06:50:09 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-08-29 16:52:35 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    class  <<  self 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      def  map ( menu_name ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        @items  || =  { } 
							 
						 
					
						
							
								
									
										
										
										
											2008-07-13 12:12:58 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        mapper  =  Mapper . new ( menu_name . to_sym ,  @items ) 
							 
						 
					
						
							
								
									
										
										
										
											2008-10-25 09:55:31 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  block_given? 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          yield  mapper 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          mapper 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        end 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-29 16:52:35 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								      end 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-20 06:50:09 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-08-29 16:52:35 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								      def  items ( menu_name ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-14 22:51:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        @items [ menu_name . to_sym ]  ||  MenuNode . new ( :root ,  { } ) 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-29 16:52:35 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								      end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    end 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-20 06:50:09 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-08-29 16:52:35 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    class  Mapper 
							 
						 
					
						
							
								
									
										
										
										
											2008-07-13 12:12:58 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								      def  initialize ( menu ,  items ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-14 22:51:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        items [ menu ]  || =  MenuNode . new ( :root ,  { } ) 
							 
						 
					
						
							
								
									
										
										
										
											2008-07-13 12:12:58 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        @menu  =  menu 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        @menu_items  =  items [ menu ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      end 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-20 06:50:09 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-01-20 13:07:19 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								      # 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) 
							 
						 
					
						
							
								
									
										
										
										
											2008-07-13 11:02:42 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								      # * 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 
							 
						 
					
						
							
								
									
										
										
										
											2008-07-13 12:12:58 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								      # * before, after: specify where the menu item should be inserted (eg. :after => :activity) 
							 
						 
					
						
							
								
									
										
										
										
											2009-11-25 05:36:56 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								      # * 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(...)] } 
							 
						 
					
						
							
								
									
										
										
										
											2008-07-13 12:12:58 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								      # * last: menu item will stay at the end (eg. :last => true) 
							 
						 
					
						
							
								
									
										
										
										
											2008-01-20 13:07:19 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								      # * html_options: a hash of html options that are passed to link_to 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-29 16:52:35 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								      def  push ( name ,  url ,  options = { } ) 
							 
						 
					
						
							
								
									
										
										
										
											2008-07-13 12:12:58 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        options  =  options . dup 
							 
						 
					
						
							
								
									
										
										
										
											2009-11-25 05:36:44 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-11-25 05:36:56 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  options [ :parent ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          subtree  =  self . find ( options [ :parent ] ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-11-25 05:36:44 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								          if  subtree 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            target_root  =  subtree 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            target_root  =  @menu_items . root 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          target_root  =  @menu_items . root 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-07-13 12:12:58 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        # menu item position 
							 
						 
					
						
							
								
									
										
										
										
											2009-11-25 05:36:44 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  first  =  options . delete ( :first ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          target_root . prepend ( MenuItem . new ( name ,  url ,  options ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        elsif  before  =  options . delete ( :before ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          if  exists? ( before ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            target_root . add_at ( MenuItem . new ( name ,  url ,  options ) ,  position_of ( before ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            target_root . add ( MenuItem . new ( name ,  url ,  options ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-07-13 12:12:58 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        elsif  after  =  options . delete ( :after ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-11-25 05:36:44 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          if  exists? ( after ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            target_root . add_at ( MenuItem . new ( name ,  url ,  options ) ,  position_of ( after )  +  1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            target_root . add ( MenuItem . new ( name ,  url ,  options ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          end 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-20 06:50:09 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-02-18 05:01:39 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        elsif  options [ :last ]  # don't delete, needs to be stored 
							 
						 
					
						
							
								
									
										
										
										
											2009-11-25 05:36:44 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								          target_root . add_last ( MenuItem . new ( name ,  url ,  options ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          target_root . add ( MenuItem . new ( name ,  url ,  options ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2008-07-13 12:12:58 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        end 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-29 16:52:35 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								      end 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-20 06:50:09 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-07-13 12:12:58 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								      # Removes a menu item 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      def  delete ( name ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-11-25 05:36:44 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  found  =  self . find ( name ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          @menu_items . remove! ( found ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      # Checks if a menu item exists 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      def  exists? ( name ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        @menu_items . any?  { | node |  node . name  ==  name } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      def  find ( name ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        @menu_items . find  { | node |  node . name  ==  name } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      def  position_of ( name ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        @menu_items . each  do  | node | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          if  node . name  ==  name 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  node . position 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        end 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-29 16:52:35 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								      end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    end 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-20 06:50:09 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-12-14 22:51:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    class  MenuNode 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      include  Enumerable 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      attr_accessor  :parent 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      attr_reader  :last_items_count ,  :name 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      def  initialize ( name ,  content  =  nil ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        @name  =  name 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        @children  =  [ ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        @last_items_count  =  0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      def  children 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  block_given? 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          @children . each  { | child |  yield  child } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          @children 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      # Returns the number of descendants + 1 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      def  size 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        @children . inject ( 1 )  { | sum ,  node |  sum  +  node . size } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      def  each  & block 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        yield  self 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        children  {  | child |  child . each ( & block )  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      # Adds a child at first position 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      def  prepend ( child ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-15 10:57:59 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        add_at ( child ,  0 ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-14 22:51:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								      end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      # Adds a child at given position 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      def  add_at ( child ,  position ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-15 10:57:59 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        raise  " Child already added "  if  find  { | node |  node . name  ==  child . name } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-12-14 22:51:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        @children  =  @children . insert ( position ,  child ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        child . parent  =  self 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-15 10:57:59 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        child 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-14 22:51:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								      end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      # Adds a child as last child 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      def  add_last ( child ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-15 10:57:59 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        add_at ( child ,  - 1 ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-14 22:51:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        @last_items_count  +=  1 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-15 10:57:59 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        child 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-14 22:51:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								      end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      # Adds a child 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      def  add ( child ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        position  =  @children . size  -  @last_items_count 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-15 10:57:59 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        add_at ( child ,  position ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-14 22:51:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								      end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      alias  :<<  :add 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      # Removes a child 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      def  remove! ( child ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        @children . delete ( child ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        @last_items_count  -=  + 1  if  child  &&  child . last 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        child . parent  =  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        child 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      # Returns the position for this node in it's parent 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      def  position 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        self . parent . children . index ( self ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      # Returns the root for this node 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      def  root 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        root  =  self 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        root  =  root . parent  while  root . parent 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        root 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    class  MenuItem  <  MenuNode 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-21 11:04:50 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								      include  Redmine :: I18n 
							 
						 
					
						
							
								
									
										
										
										
											2010-02-18 05:01:39 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								      attr_reader  :name ,  :url ,  :param ,  :condition ,  :parent ,  :child_menus ,  :last 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-20 06:50:09 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-08-29 16:52:35 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								      def  initialize ( name ,  url ,  options ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-11-25 05:36:44 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        raise  ArgumentError ,  " Invalid option :if for menu item ' #{ name } ' "  if  options [ :if ]  &&  ! options [ :if ] . respond_to? ( :call ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        raise  ArgumentError ,  " Invalid option :html for menu item ' #{ name } ' "  if  options [ :html ]  &&  ! options [ :html ] . is_a? ( Hash ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-11-25 05:36:56 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        raise  ArgumentError ,  " Cannot set the :parent to be the same as this item "  if  options [ :parent ]  ==  name . to_sym 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        raise  ArgumentError ,  " Invalid option :children for menu item ' #{ name } ' "  if  options [ :children ]  &&  ! options [ :children ] . respond_to? ( :call ) 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-29 16:52:35 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        @name  =  name 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        @url  =  url 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        @condition  =  options [ :if ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        @param  =  options [ :param ]  ||  :id 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-21 11:31:22 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        @caption  =  options [ :caption ] 
							 
						 
					
						
							
								
									
										
										
										
											2008-01-20 13:07:19 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        @html_options  =  options [ :html ]  ||  { } 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-27 18:04:48 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        # Adds a unique class to each menu item based on its name 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        @html_options [ :class ]  =  [ @html_options [ :class ] ,  @name . to_s . dasherize ] . compact . join ( ' ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-11-25 05:36:56 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        @parent  =  options [ :parent ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        @child_menus  =  options [ :children ] 
							 
						 
					
						
							
								
									
										
										
										
											2010-02-18 05:01:39 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        @last  =  options [ :last ]  ||  false 
							 
						 
					
						
							
								
									
										
										
										
											2009-11-25 05:36:44 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        super  @name . to_sym 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-29 16:52:35 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								      end 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-20 06:50:09 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-07-13 11:02:42 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								      def  caption ( project = nil ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  @caption . is_a? ( Proc ) 
							 
						 
					
						
							
								
									
										
										
										
											2008-07-13 13:25:37 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								          c  =  @caption . call ( project ) . to_s 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          c  =  @name . to_s . humanize  if  c . blank? 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          c 
							 
						 
					
						
							
								
									
										
										
										
											2008-07-13 11:02:42 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        else 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-21 11:31:22 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								          if  @caption . nil? 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            l_or_humanize ( name ,  :prefix  = >  'label_' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            @caption . is_a? ( Symbol )  ?  l ( @caption )  :  @caption 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          end 
							 
						 
					
						
							
								
									
										
										
										
											2008-07-13 11:02:42 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        end 
							 
						 
					
						
							
								
									
										
										
										
											2008-02-22 18:19:00 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								      end 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-20 06:50:09 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-11-27 18:04:48 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								      def  html_options ( options = { } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  options [ :selected ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          o  =  @html_options . dup 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          o [ :class ]  +=  ' selected' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          o 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          @html_options 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      end 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-20 06:50:09 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    end 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-29 16:52:35 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								  end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								end