]> source.dussan.org Git - redmine.git/commitdiff
Highlight the current item of the main menu.
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Sat, 19 Jan 2008 11:53:43 +0000 (11:53 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Sat, 19 Jan 2008 11:53:43 +0000 (11:53 +0000)
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1076 e93f8b46-1217-0410-a6f0-8f06a7374b81

14 files changed:
app/controllers/application.rb
app/controllers/issue_categories_controller.rb
app/controllers/messages_controller.rb
app/controllers/projects_controller.rb
app/controllers/queries_controller.rb
app/controllers/reports_controller.rb
app/controllers/repositories_controller.rb
app/controllers/timelog_controller.rb
app/controllers/versions_controller.rb
app/controllers/wikis_controller.rb
app/views/layouts/base.rhtml
lib/redmine.rb
lib/redmine/menu_manager.rb
public/stylesheets/application.css

index 25cf205f4de1ce076106343df95a9497352a09d5..66cec7d2ac650dd06d871d350627f36e3cf67c39 100644 (file)
@@ -19,6 +19,9 @@ class ApplicationController < ActionController::Base
   before_filter :user_setup, :check_if_login_required, :set_localization
   filter_parameter_logging :password
   
+  include Redmine::MenuManager::MenuController
+  helper Redmine::MenuManager::MenuHelper
+  
   REDMINE_SUPPORTED_SCM.each do |scm|
     require_dependency "repository/#{scm.underscore}"
   end
index 2c1c6657b98c073dca7ab38c6ecf636dba9f7b38..a73935b4fc5d842db2fcb196ba1adae718122a56 100644 (file)
@@ -17,6 +17,7 @@
 
 class IssueCategoriesController < ApplicationController
   layout 'base'
+  menu_item :settings
   before_filter :find_project, :authorize
   
   verify :method => :post, :only => :destroy
index 8078abf71a126e6b487b089ab45aae8c9d03e3cb..49f4ba77ccf14646aa2d8e3e63e39c0bfd603ed9 100644 (file)
@@ -17,6 +17,7 @@
 
 class MessagesController < ApplicationController
   layout 'base'
+  menu_item :boards
   before_filter :find_board, :only => :new
   before_filter :find_message, :except => :new
   before_filter :authorize
index 6add8585ba6b479c548bb01af6c67f7dac6955a2..f38ca828eacbc873ad6ccf3ab6da65c95c752ed5 100644 (file)
 
 class ProjectsController < ApplicationController
   layout 'base'
+  menu_item :overview
+  menu_item :activity, :only => :activity
+  menu_item :roadmap, :only => :roadmap
+  menu_item :files, :only => [:list_files, :add_file]
+  menu_item :settings, :only => :settings
+  menu_item :issues, :only => [:add_issue, :bulk_edit_issues, :changelog, :move_issues]
+  
   before_filter :find_project, :except => [ :index, :list, :add ]
   before_filter :authorize, :except => [ :index, :list, :add, :archive, :unarchive, :destroy ]
   before_filter :require_admin, :only => [ :add, :archive, :unarchive, :destroy ]
index 69bad345aeed137fcd7da7404afcda25a108a9be..0a762eee02e0e1cee9fd1955fc694018a75ff3f7 100644 (file)
@@ -17,6 +17,7 @@
 
 class QueriesController < ApplicationController
   layout 'base'
+  menu_item :issues
   before_filter :find_project, :authorize
 
   def index
index e33fe84127c5a1d7700ca89c7ed54df27a454638..338059a5068d1ab86d84b637879c8e72ce57135b 100644 (file)
@@ -17,6 +17,7 @@
 
 class ReportsController < ApplicationController
   layout 'base'
+  menu_item :issues
   before_filter :find_project, :authorize
 
   def issue_report
index f8b1eae8161d104830f728b34e8b92625c7c538d..6c2b088cc0e102f0b16fc5d39b8aa1bf2bbc3102 100644 (file)
@@ -24,6 +24,7 @@ end
 
 class RepositoriesController < ApplicationController
   layout 'base'
+  menu_item :repository
   before_filter :find_repository, :except => :edit
   before_filter :find_project, :only => :edit
   before_filter :authorize
index f90c4527eb7e679bb62349c6179ce69b8788ccd6..39e6d2fd392b0e4b85aed143b5888aa20092d7ef 100644 (file)
@@ -16,7 +16,8 @@
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
 class TimelogController < ApplicationController
-  layout 'base'  
+  layout 'base'
+  menu_item :issues
   before_filter :find_project, :authorize
 
   helper :sort
index df1be286956f5c3ed158393c2d76ed66b9ce9f59..55b3a7fcec8bee6ffe96e5a678e0f8870bb787f6 100644 (file)
@@ -17,6 +17,7 @@
 
 class VersionsController < ApplicationController
   layout 'base'
+  menu_item :roadmap
   before_filter :find_project, :authorize
 
   cache_sweeper :version_sweeper, :only => [ :edit, :destroy ]
index a222570ef19798b9d8df6c14315abd9aa2aa426c..6054abd9a7fac9850fe18f985f3055d1ce44f781 100644 (file)
@@ -17,6 +17,7 @@
 
 class WikisController < ApplicationController
   layout 'base'
+  menu_item :settings
   before_filter :find_project, :authorize
   
   # Create or update a project's wiki
index bdaddcb3b746c1437bd200efa76d7b3bd18523aa..91c3b2634cd7231ef177be49b4baa998bd401945 100644 (file)
     <h1><%= h(@project ? @project.name : Setting.app_title) %></h1>
     
     <div id="main-menu">
-        <ul>
-            <% Redmine::MenuManager.allowed_items(:project_menu, User.current, @project).each do |item| %>
-            <% unless item.condition && !item.condition.call(@project) %>
-                <li><%= link_to l(item.name), {item.param => @project}.merge(item.url) %></li>
-            <% end %>
-            <% end if @project && !@project.new_record? %>
-        </ul>
+        <%= render_main_menu(@project) %>
     </div>
 </div>
 
index 2dca9ed50016e9734d01fd0ccfbc866b4d590ed2..d0e152467edfdfb054a2a129aaa268bef181558b 100644 (file)
@@ -91,15 +91,18 @@ end
 
 # Project menu configuration
 Redmine::MenuManager.map :project_menu do |menu|
-  menu.push :label_overview, :controller => 'projects', :action => 'show'
-  menu.push :label_activity, :controller => 'projects', :action => 'activity'
-  menu.push :label_roadmap, :controller => 'projects', :action => 'roadmap'
-  menu.push :label_issue_plural, { :controller => 'issues', :action => 'index' }, :param => :project_id
-  menu.push :label_news_plural, { :controller => 'news', :action => 'index' }, :param => :project_id
-  menu.push :label_document_plural, { :controller => 'documents', :action => 'index' }, :param => :project_id
-  menu.push :label_wiki, { :controller => 'wiki', :action => 'index', :page => nil }, :if => Proc.new { |p| p.wiki && !p.wiki.new_record? }
-  menu.push :label_board_plural, { :controller => 'boards', :action => 'index', :id => nil }, :param => :project_id, :if => Proc.new { |p| p.boards.any? }
-  menu.push :label_attachment_plural, :controller => 'projects', :action => 'list_files'
-  menu.push :label_repository, { :controller => 'repositories', :action => 'show' }, :if => Proc.new { |p| p.repository && !p.repository.new_record? }
-  menu.push :label_settings, :controller => 'projects', :action => 'settings'
+  menu.push :overview, { :controller => 'projects', :action => 'show' }, :caption => :label_overview
+  menu.push :activity, { :controller => 'projects', :action => 'activity' }, :caption => :label_activity
+  menu.push :roadmap, { :controller => 'projects', :action => 'roadmap' }, :caption => :label_roadmap
+  menu.push :issues, { :controller => 'issues', :action => 'index' }, :param => :project_id, :caption => :label_issue_plural
+  menu.push :news, { :controller => 'news', :action => 'index' }, :param => :project_id, :caption => :label_news_plural
+  menu.push :documents, { :controller => 'documents', :action => 'index' }, :param => :project_id, :caption => :label_document_plural
+  menu.push :wiki, { :controller => 'wiki', :action => 'index', :page => nil }, 
+              :if => Proc.new { |p| p.wiki && !p.wiki.new_record? }, :caption => :label_wiki
+  menu.push :boards, { :controller => 'boards', :action => 'index', :id => nil }, :param => :project_id,
+              :if => Proc.new { |p| p.boards.any? }, :caption => :label_board_plural
+  menu.push :files, { :controller => 'projects', :action => 'list_files' }, :caption => :label_attachment_plural
+  menu.push :repository, { :controller => 'repositories', :action => 'show' },
+              :if => Proc.new { |p| p.repository && !p.repository.new_record? }, :caption => :label_repository
+  menu.push :settings, { :controller => 'projects', :action => 'settings' }, :caption => :label_settings
 end
index d4a46b3e162ec7893c0dc34eddf01057b3092362..c801cb3838169f12c80f7c1b6b34855783804a5e 100644 (file)
 
 module Redmine
   module MenuManager
+    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
+        
+        # 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
+        #   
+        # 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
+      
+      def menu_items
+        self.class.menu_items
+      end
+      
+      # Returns the menu item name according to the current action
+      def current_menu_item
+        menu_items[controller_name.to_sym][:actions][action_name.to_sym] ||
+          menu_items[controller_name.to_sym][:default]
+      end
+    end
+    
+    module MenuHelper
+      # Returns the current menu item name
+      def current_menu_item
+        @controller.current_menu_item
+      end
+      
+      # Renders the application main menu as a ul element
+      def render_main_menu(project)
+        links = []
+        Redmine::MenuManager.allowed_items(:project_menu, User.current, project).each do |item|
+          unless item.condition && !item.condition.call(project)
+            links << content_tag('li', 
+                       link_to(l(item.caption), {item.param => project}.merge(item.url),
+                               :class => (current_menu_item == item.name ? 'selected' : nil)))
+          end
+        end if project && !project.new_record?
+        links.empty? ? nil : content_tag('ul', links.join("\n"))
+      end
+    end
     
     class << self
       def map(menu_name)
@@ -48,13 +105,14 @@ module Redmine
     end
     
     class MenuItem
-      attr_reader :name, :url, :param, :condition
+      attr_reader :name, :url, :param, :condition, :caption
       
       def initialize(name, url, options)
         @name = name
         @url = url
         @condition = options[:if]
         @param = options[:param] || :id
+        @caption = options[:caption] || name.to_s.humanize
       end
     end    
   end
index fa76948d2c935bc1654d18666d56f9a7954876f4..d370f1b4263bbb14cb529d165b524568cb89df09 100644 (file)
@@ -34,7 +34,7 @@ h4, .wiki h3 {font-size: 12px;padding: 2px 10px 1px 0px;margin-bottom: 5px; bord
   padding: 4px 4px 4px 4px;
   background: #2C4056;
 }
-#main-menu li a:hover {background:#759FCF;}
+#main-menu li a:hover, #main-menu li a.selected {background:#759FCF;}
 
 #main {background: url(../images/mainbg.png) repeat-x; background-color:#EEEEEE;}