diff --git a/app/assets/images/icons.svg b/app/assets/images/icons.svg
index 7875ea782..294811c04 100644
--- a/app/assets/images/icons.svg
+++ b/app/assets/images/icons.svg
@@ -132,6 +132,8 @@
+
+
@@ -207,7 +209,7 @@
-
+
diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css
index a77f33215..abb5e1b2b 100644
--- a/app/assets/stylesheets/application.css
+++ b/app/assets/stylesheets/application.css
@@ -1713,7 +1713,7 @@ span.icon-label {
.icon-report { background-image: url(/report.png); }
.icon-comment:not(:has(svg)), .icon-comments:not(:has(svg)) { background-image: url(/comment.png); }
.icon-summary:not(:has(svg)) { background-image: url(/lightning.png); }
-.icon-server-authentication { background-image: url(/server_key.png); }
+.icon-server-authentication:not(:has(svg)) { background-image: url(/server_key.png); }
.icon-issue:not(:has(svg)) { background-image: url(/ticket.png); }
.icon-zoom-in:not(:has(svg)) { background-image: url(/zoom_in.png); }
.icon-zoom-out:not(:has(svg)) { background-image: url(/zoom_out.png); }
@@ -1731,11 +1731,11 @@ span.icon-label {
.icon-close:hover:not(:has(svg)) { background-image: url(/close_hl.png); }
.icon-settings:not(:has(svg)) { background-image: url(/changeset.png); }
.icon-group:not(:has(svg)),.icon-groupnonmember, .icon-groupanonymous { background-image: url(/group.png); }
-.icon-roles { background-image: url(/database_key.png); }
+.icon-roles:not(:has(svg)) { background-image: url(/database_key.png); }
.icon-issue-edit:not(:has(svg)) { background-image: url(/ticket_edit.png); }
-.icon-workflows { background-image: url(/ticket_go.png); }
-.icon-custom-fields { background-image: url(/textfield.png); }
-.icon-plugins { background-image: url(/plugin.png); }
+.icon-workflows:not(:has(svg)) { background-image: url(/ticket_go.png); }
+.icon-custom-fields:not(:has(svg)) { background-image: url(/textfield.png); }
+.icon-plugins:not(:has(svg)) { background-image: url(/plugin.png); }
.icon-news:not(:has(svg)) { background-image: url(/news.png); }
.icon-issue-closed:not(:has(svg)) { background-image: url(/ticket_checked.png); }
.icon-issue-note:not(:has(svg)) { background-image: url(/ticket_note.png); }
diff --git a/lib/redmine/menu_manager.rb b/lib/redmine/menu_manager.rb
index 5846011e2..7b7b4a809 100644
--- a/lib/redmine/menu_manager.rb
+++ b/lib/redmine/menu_manager.rb
@@ -180,7 +180,14 @@ module Redmine
url = '#'
options.reverse_merge!(:onclick => 'return false;')
end
- link_to(h(caption), use_absolute_controller(url), options)
+
+ label = if item.icon.present?
+ icon_with_label(item.icon, h(caption))
+ else
+ h(caption)
+ end
+
+ link_to(label, use_absolute_controller(url), options)
end
def render_unattached_menu_item(menu_item, project)
@@ -424,7 +431,7 @@ module Redmine
class MenuItem < MenuNode
include Redmine::I18n
attr_reader :name, :url, :param, :condition, :parent,
- :child_menus, :last, :permission
+ :child_menus, :last, :permission, :icon
def initialize(name, url, options={})
if options[:if] && !options[:if].respond_to?(:call)
@@ -447,6 +454,7 @@ module Redmine
@permission ||= false if options.key?(:permission)
@param = options[:param] || :id
@caption = options[:caption]
+ @icon = options[:icon]
@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(' ')
diff --git a/lib/redmine/preparation.rb b/lib/redmine/preparation.rb
index ab6cbdff6..553f8693a 100644
--- a/lib/redmine/preparation.rb
+++ b/lib/redmine/preparation.rb
@@ -242,38 +242,51 @@ module Redmine
MenuManager.map :admin_menu do |menu|
menu.push :projects, {:controller => 'admin', :action => 'projects'},
:caption => :label_project_plural,
+ :icon => 'projects',
:html => {:class => 'icon icon-projects'}
menu.push :users, {:controller => 'users'}, :caption => :label_user_plural,
+ :icon => 'user',
:html => {:class => 'icon icon-user'}
menu.push :groups, {:controller => 'groups'}, :caption => :label_group_plural,
+ :icon => 'group',
:html => {:class => 'icon icon-group'}
menu.push :roles, {:controller => 'roles'},
:caption => :label_role_and_permissions,
+ :icon => 'roles',
:html => {:class => 'icon icon-roles'}
menu.push :trackers, {:controller => 'trackers'},
:caption => :label_tracker_plural,
+ :icon => 'issue',
:html => {:class => 'icon icon-issue'}
menu.push :issue_statuses, {:controller => 'issue_statuses'},
:caption => :label_issue_status_plural,
+ :icon => 'issue-edit',
:html => {:class => 'icon icon-issue-edit'}
menu.push :workflows, {:controller => 'workflows', :action => 'edit'},
:caption => :label_workflow,
+ :icon => 'workflows',
:html => {:class => 'icon icon-workflows'}
menu.push :custom_fields, {:controller => 'custom_fields'},
:caption => :label_custom_field_plural,
+ :icon => 'custom-fields',
:html => {:class => 'icon icon-custom-fields'}
menu.push :enumerations, {:controller => 'enumerations'},
+ :icon => 'list',
:html => {:class => 'icon icon-list'}
menu.push :settings, {:controller => 'settings'},
+ :icon => 'settings',
:html => {:class => 'icon icon-settings'}
menu.push :ldap_authentication,
{:controller => 'auth_sources', :action => 'index'},
+ :icon => 'server-authentication',
:html => {:class => 'icon icon-server-authentication'}
menu.push :plugins, {:controller => 'admin', :action => 'plugins'},
:last => true,
+ :icon => 'plugins',
:html => {:class => 'icon icon-plugins'}
menu.push :info, {:controller => 'admin', :action => 'info'},
:caption => :label_information_plural,
+ :icon => 'help',
:last => true,
:html => {:class => 'icon icon-help'}
end