From 546b98a1186dc070abff388b7baa20d27b9d8278 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Lang Date: Thu, 27 Nov 2008 18:04:48 +0000 Subject: [PATCH] Adds a css class on menu items in order to apply item specific styles (eg. icons). git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2059 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- lib/redmine.rb | 18 +++++++++--------- lib/redmine/menu_manager.rb | 16 ++++++++++++++-- .../themes/classic/stylesheets/application.css | 6 +++--- test/functional/projects_controller_test.rb | 9 ++++++--- 4 files changed, 32 insertions(+), 17 deletions(-) diff --git a/lib/redmine.rb b/lib/redmine.rb index 45cfcbddf..42b074a51 100644 --- a/lib/redmine.rb +++ b/lib/redmine.rb @@ -106,18 +106,18 @@ Redmine::AccessControl.map do |map| end Redmine::MenuManager.map :top_menu do |menu| - menu.push :home, :home_path, :html => { :class => 'home' } - menu.push :my_page, { :controller => 'my', :action => 'page' }, :html => { :class => 'mypage' }, :if => Proc.new { User.current.logged? } - menu.push :projects, { :controller => 'projects', :action => 'index' }, :caption => :label_project_plural, :html => { :class => 'projects' } - menu.push :administration, { :controller => 'admin', :action => 'index' }, :html => { :class => 'admin' }, :if => Proc.new { User.current.admin? }, :last => true - menu.push :help, Redmine::Info.help_url, :html => { :class => 'help' }, :last => true + menu.push :home, :home_path + menu.push :my_page, { :controller => 'my', :action => 'page' }, :if => Proc.new { User.current.logged? } + menu.push :projects, { :controller => 'projects', :action => 'index' }, :caption => :label_project_plural + menu.push :administration, { :controller => 'admin', :action => 'index' }, :if => Proc.new { User.current.admin? }, :last => true + menu.push :help, Redmine::Info.help_url, :last => true end Redmine::MenuManager.map :account_menu do |menu| - menu.push :login, :signin_path, :html => { :class => 'login' }, :if => Proc.new { !User.current.logged? } - menu.push :register, { :controller => 'account', :action => 'register' }, :html => { :class => 'register' }, :if => Proc.new { !User.current.logged? && Setting.self_registration? } - menu.push :my_account, { :controller => 'my', :action => 'account' }, :html => { :class => 'myaccount' }, :if => Proc.new { User.current.logged? } - menu.push :logout, :signout_path, :html => { :class => 'logout' }, :if => Proc.new { User.current.logged? } + menu.push :login, :signin_path, :if => Proc.new { !User.current.logged? } + menu.push :register, { :controller => 'account', :action => 'register' }, :if => Proc.new { !User.current.logged? && Setting.self_registration? } + menu.push :my_account, { :controller => 'my', :action => 'account' }, :if => Proc.new { User.current.logged? } + menu.push :logout, :signout_path, :if => Proc.new { User.current.logged? } end Redmine::MenuManager.map :application_menu do |menu| diff --git a/lib/redmine/menu_manager.rb b/lib/redmine/menu_manager.rb index b09e5150a..f8fc5dd8d 100644 --- a/lib/redmine/menu_manager.rb +++ b/lib/redmine/menu_manager.rb @@ -72,7 +72,7 @@ module Redmine links = [] menu_items_for(menu, project) do |item, caption, url, selected| links << content_tag('li', - link_to(h(caption), url, (selected ? item.html_options.merge(:class => 'selected') : item.html_options))) + link_to(h(caption), url, item.html_options(:selected => selected))) end links.empty? ? nil : content_tag('ul', links.join("\n")) end @@ -168,7 +168,7 @@ module Redmine class MenuItem include GLoc - attr_reader :name, :url, :param, :condition, :html_options + attr_reader :name, :url, :param, :condition def initialize(name, url, options) raise "Invalid option :if for menu item '#{name}'" if options[:if] && !options[:if].respond_to?(:call) @@ -179,6 +179,8 @@ module Redmine @param = options[:param] || :id @caption = options[:caption] @html_options = options[:html] || {} + # Adds a unique class to each menu item based on its name + @html_options[:class] = [@html_options[:class], @name.to_s.dasherize].compact.join(' ') end def caption(project=nil) @@ -191,6 +193,16 @@ module Redmine @caption_key ||= (@caption || (l_has_string?("label_#{@name}".to_sym) ? "label_#{@name}".to_sym : @name.to_s.humanize)) end end + + def html_options(options={}) + if options[:selected] + o = @html_options.dup + o[:class] += ' selected' + o + else + @html_options + end + end end end end diff --git a/public/themes/classic/stylesheets/application.css b/public/themes/classic/stylesheets/application.css index 57f911da6..280b86edd 100644 --- a/public/themes/classic/stylesheets/application.css +++ b/public/themes/classic/stylesheets/application.css @@ -26,7 +26,7 @@ h2, h3, h4, .wiki h1, .wiki h2, .wiki h3 { border-bottom: 0px; color:#606060; fo h2, .wiki h1 { letter-spacing:-1px; } h4 { border-bottom: dotted 1px #c0c0c0; } -#top-menu a.home, #top-menu a.mypage, #top-menu a.projects, #top-menu a.admin, #top-menu a.help { +#top-menu a.home, #top-menu a.my-page, #top-menu a.projects, #top-menu a.administration, #top-menu a.help { background-position: 0% 40%; background-repeat: no-repeat; padding-left: 20px; @@ -35,7 +35,7 @@ h4 { border-bottom: dotted 1px #c0c0c0; } } #top-menu a.home { background-image: url(../../../images/home.png); } -#top-menu a.mypage { background-image: url(../../../images/user_page.png); } +#top-menu a.my-page { background-image: url(../../../images/user_page.png); } #top-menu a.projects { background-image: url(../../../images/projects.png); } -#top-menu a.admin { background-image: url(../../../images/admin.png); } +#top-menu a.administration { background-image: url(../../../images/admin.png); } #top-menu a.help { background-image: url(../../../images/help.png); } diff --git a/test/functional/projects_controller_test.rb b/test/functional/projects_controller_test.rb index 371bd834f..1b36a9d6b 100644 --- a/test/functional/projects_controller_test.rb +++ b/test/functional/projects_controller_test.rb @@ -234,14 +234,17 @@ class ProjectsControllerTest < Test::Unit::TestCase get :show, :id => 1 assert_tag :div, :attributes => { :id => 'main-menu' }, - :descendant => { :tag => 'li', :child => { :tag => 'a', :content => 'Foo' } } + :descendant => { :tag => 'li', :child => { :tag => 'a', :content => 'Foo', + :attributes => { :class => 'foo' } } } assert_tag :div, :attributes => { :id => 'main-menu' }, - :descendant => { :tag => 'li', :child => { :tag => 'a', :content => 'Bar' }, + :descendant => { :tag => 'li', :child => { :tag => 'a', :content => 'Bar', + :attributes => { :class => 'bar' } }, :before => { :tag => 'li', :child => { :tag => 'a', :content => 'ECOOKBOOK' } } } assert_tag :div, :attributes => { :id => 'main-menu' }, - :descendant => { :tag => 'li', :child => { :tag => 'a', :content => 'ECOOKBOOK' }, + :descendant => { :tag => 'li', :child => { :tag => 'a', :content => 'ECOOKBOOK', + :attributes => { :class => 'hello' } }, :before => { :tag => 'li', :child => { :tag => 'a', :content => 'Activity' } } } # Remove the menu items -- 2.39.5