diff --git a/app/assets/images/icons.svg b/app/assets/images/icons.svg new file mode 100644 index 000000000..88f17e2ae --- /dev/null +++ b/app/assets/images/icons.svg @@ -0,0 +1,352 @@ + diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 8ab85f269..5dd96340d 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -121,8 +121,8 @@ pre, code {font-family: Consolas, Menlo, "Liberation Mono", Courier, monospace;} #sidebar ul li, ul.flat li {list-style-type:none;margin: 0px 2px 0px 0px; padding: 0px 0px 0px 0px;} #sidebar div.wiki ul {margin:inherit; padding-left:40px;} #sidebar div.wiki ul li {list-style-type:inherit;} -#sidebar a.icon-only {opacity: 0.4; margin-left: 5px;} -#sidebar a.icon-only:hover {opacity: 1;} +#sidebar a.icon-only svg {opacity: 0.2; margin-left: 5px;} +#sidebar a.icon-only:hover svg {opacity: 1;} #sidebar span.icon-warning {margin-left: 5px;} #sidebar li input[type=checkbox] {height: 20px;} @@ -238,8 +238,8 @@ div + .drdn-items {border-top:1px solid #ccc;} .contextual .drdn-content {top:18px;} .contextual .drdn-items {padding:2px; min-width: 160px;} -.contextual .drdn-items>a {padding: 5px 8px;} -.contextual .drdn-items>a.icon {padding-left: 24px; background-position-x: 4px;} +.contextual .drdn-items>a {display: flex; padding: 5px 8px;} +.contextual .drdn-items>a.icon:not(:has(svg)) {padding-left: 24px; background-position-x: 4px;} .contextual .drdn-items>a:hover {color:#2A5685; border:1px solid #628db6; background-color:#eef5fd; border-radius:3px;} #project-jump.drdn {width:200px;display:inline-block;} @@ -275,7 +275,7 @@ table.list td.tick {width:15%} table.list td.checkbox { width: 15px; padding: 2px 0 0 0; } table.list .checkbox input {padding:0px; height: initial;} table.list td.buttons, div.buttons { white-space:nowrap; text-align: right; } -table.list td.buttons a, div.buttons a { margin-right: 0.6em; } +table.list td.buttons a, div.buttons a, table.list td.buttons span.icon-only { margin-right: 0.6em; } table.list td.buttons a:last-child, div.buttons a:last-child { margin-right: 0; } table.list td.buttons img, div.buttons img {vertical-align:middle;} table.list td.reorder {width:15%; white-space:nowrap; text-align:center; } @@ -336,7 +336,7 @@ tr.changeset td.author { text-align: center; width: 15%; white-space:nowrap;} tr.changeset td.committed_on { text-align: center; width: 15%; white-space:nowrap;} table.files tbody th {text-align:left;} -table.files tr.file td.filename { text-align: left; padding-left: 24px; } +table.files tr.file td.filename { text-align: left; } table.files tr.file td.digest { font-size: 80%; } table.members td.roles, table.memberships td.roles { width: 45%; } @@ -640,7 +640,6 @@ fieldset#date-range p { margin: 2px 0 2px 0; } #issue_is_private_wrap {float:right; margin-right:1em;} .toggle-multiselect { margin-right:5px; cursor:pointer;} .buttons { font-size: 0.9em; margin-bottom: 1.4em; margin-top: 1em; } -.buttons .icon {padding-bottom:3px; padding-top:1px;} div#issue-changesets {float:right; width:45%; margin-left: 1em; margin-bottom: 1em; background: #fff; padding-left: 1em; font-size: 90%;} div#issue-changesets div.changeset {border-bottom: 1px solid #ddd; padding: 4px;} @@ -815,7 +814,7 @@ select.expandable {vertical-align:top;} textarea#custom_field_possible_values {width: 95%; resize:vertical} textarea#custom_field_default_value {width: 95%; resize:vertical} -.sort-handle {display:inline-block; vertical-align:middle; cursor: move;} +.sort-handle { cursor: move; } input#content_comments {width: 99%} @@ -1621,13 +1620,51 @@ td.gantt_selected_column .gantt_hdr,.gantt_selected_column_container { white-space: pre-wrap; } -/***** Icons *****/ -.icon { +/***** SVG Icons *****/ +.icon, .icon-only { + display: inline-flex; +} + +a.icon svg, a.icon-only svg { + fill: #169; +} + +a.icon:hover svg, a.icon-only:hover svg { + fill: #c61a1a; +} + +.icon-only span { + display: none; +} + +svg { + width: 0; + height: 0; + + &.s14 { + width: 14px; + height: 14px; + } +} + +span.icon-label { + margin-left: 4px; +} + +.icon-bookmarked-project svg { + fill: #169; +} +.icon-user svg { + fill: #169; +} + +/***** Legacy icons *****/ +.icon:not(:has(svg)) { background-position: 0% 50%; background-repeat: no-repeat; padding-left: 20px; } -.icon-only { +.icon-only:not(:has(svg)) { background-position: 0% 50%; background-repeat: no-repeat; padding-left: 16px; @@ -1640,59 +1677,59 @@ td.gantt_selected_column .gantt_hdr,.gantt_selected_column_container { font-size: 8px; vertical-align: middle; } -.icon-only::after { +.icon-only:not(:has(svg))::after { content: "\a0"; } -.icon-add { background-image: url(/add.png); } -.icon-edit { background-image: url(/edit.png); } -.icon-copy { background-image: url(/copy.png); } +.icon-add:not(:has(svg)) { background-image: url(/add.png); } +.icon-edit:not(:has(svg)) { background-image: url(/edit.png); } +.icon-copy:not(:has(svg)) { background-image: url(/copy.png); } .icon-duplicate { background-image: url(/duplicate.png); } -.icon-del { background-image: url(/delete.png); } -.icon-move { background-image: url(/move.png); } -.icon-save { background-image: url(/save.png); } -.icon-download { background-image: url(/download.png); } +.icon-del:not(:has(svg)) { background-image: url(/delete.png); } +.icon-move:not(:has(svg)) { background-image: url(/move.png); } +.icon-save:not(:has(svg)) { background-image: url(/save.png); } +.icon-download:not(:has(svg)) { background-image: url(/download.png); } .icon-cancel { background-image: url(/cancel.png); } .icon-multiple { background-image: url(/table_multiple.png); } .icon-folder { background-image: url(/folder.png); } .open .icon-folder { background-image: url(/folder_open.png); } .icon-package { background-image: url(/package.png); } -.icon-user { background-image: url(/user.png); } +.icon-user:not(:has(svg)) { background-image: url(/user.png); } .icon-project, .icon-projects { background-image: url(/projects.png); } -.icon-help { background-image: url(/help.png); } -.icon-attachment { background-image: url(/attachment.png); } -.icon-history { background-image: url(/history.png); } +.icon-help:not(:has(svg)) { background-image: url(/help.png); } +.icon-attachment:not(:has(svg)) { background-image: url(/attachment.png); } +.icon-history:not(:has(svg)) { background-image: url(/history.png); } .icon-time-entry, .icon-time { background-image: url(/time.png); } -.icon-time-add { background-image: url(/time_add.png); } -.icon-stats { background-image: url(/stats.png); } +.icon-time-add:not(:has(svg)) { background-image: url(/time_add.png); } +.icon-stats:not(:has(svg)) { background-image: url(/stats.png); } .icon-warning { background-image: url(/warning.png); } .icon-error { background-image: url(/exclamation.png); } .icon-fav { background-image: url(/fav.png); } .icon-fav-off { background-image: url(/fav_off.png); } -.icon-reload { background-image: url(/reload.png); } -.icon-lock, .icon-locked { background-image: url(/locked.png); } -.icon-unlock { background-image: url(/unlock.png); } -.icon-checked { background-image: url(/toggle_check.png); } +.icon-reload:not(:has(svg)) { background-image: url(/reload.png); } +.icon-lock:not(:has(svg)), .icon-locked:not(:has(svg)) { background-image: url(/locked.png); } +.icon-unlock:not(:has(svg)) { background-image: url(/unlock.png); } +.icon-checked:not(:has(svg)) { background-image: url(/toggle_check.png); } .icon-report { background-image: url(/report.png); } -.icon-comment, .icon-comments { background-image: url(/comment.png); } -.icon-summary { background-image: url(/lightning.png); } +.icon-comment:not(:has(svg)), .icon-comments { 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-issue { background-image: url(/ticket.png); } .icon-zoom-in { background-image: url(/zoom_in.png); } .icon-zoom-out { background-image: url(/zoom_out.png); } .icon-magnifier { background-image: url(/magnifier.png); } .icon-passwd { background-image: url(/textfield_key.png); } -.icon-arrow-right, .icon-test, .icon-sticky { background-image: url(/bullet_go.png); } +.icon-arrow-right, .icon-test:not(:has(svg)), .icon-sticky { background-image: url(/bullet_go.png); } .icon-email { background-image: url(/email.png); } .icon-email-disabled { background-image: url(/email_disabled.png); } .icon-email-add { background-image: url(/email_add.png); } .icon-ok { background-image: url(/true.png); } .icon-not-ok { background-image: url(/false.png); } -.icon-link-break { background-image: url(/link_break.png); } -.icon-list { background-image: url(/text_list_bullets.png); } -.icon-close { background-image: url(/close.png); } -.icon-close:hover { background-image: url(/close_hl.png); } -.icon-settings { background-image: url(/changeset.png); } +.icon-link-break:not(:has(svg)) { background-image: url(/link_break.png); } +.icon-list:not(:has(svg)) { background-image: url(/text_list_bullets.png); } +.icon-close:not(:has(svg)) { background-image: url(/close.png); } +.icon-close:hover:not(:has(svg)) { background-image: url(/close_hl.png); } +.icon-settings:not(:has(svg)) { background-image: url(/changeset.png); } .icon-group, .icon-groupnonmember, .icon-groupanonymous { background-image: url(/group.png); } .icon-roles { background-image: url(/database_key.png); } .icon-issue-edit { background-image: url(/ticket_edit.png); } @@ -1710,19 +1747,19 @@ td.gantt_selected_column .gantt_hdr,.gantt_selected_column_container { .icon-project { background-image: url(/projects.png); } .icon-add-bullet { background-image: url(/bullet_add.png); } .icon-shared { background-image: url(/link.png); } -.icon-actions { background-image: url(/3_bullets.png); } -.icon-sort-handle { background-image: url(/reorder.png); } +.icon-actions:not(:has(svg)) { background-image: url(/3_bullets.png); } +.icon-sort-handle:not(:has(svg)) { background-image: url(/reorder.png); } .icon-expanded { background-image: url(/arrow_down.png); } .icon-collapsed { background-image: url(/arrow_right.png); } -.icon-bookmark { background-image: url(/tag_blue_delete.png); } -.icon-bookmark-off { background-image: url(/tag_blue_add.png); } -.icon-bookmarked-project { background-image: url(/tag_blue.png); } +.icon-bookmark:not(:has(svg)) { background-image: url(/tag_blue_delete.png); } +.icon-bookmark-off:not(:has(svg)) { background-image: url(/tag_blue_add.png); } +.icon-bookmarked-project:not(:has(svg)) { background-image: url(/tag_blue.png); } .icon-sorted-asc { background-image: url(/arrow_down.png); } .icon-sorted-desc { background-image: url(/arrow_up.png); } .icon-toggle-plus { background-image: url(/bullet_toggle_plus.png) } .icon-toggle-minus { background-image: url(/bullet_toggle_minus.png) } -.icon-clear-query { background-image: url(/close_hl.png); } -.icon-import { background-image: url(/database_go.png); } +.icon-clear-query:not(:has(svg)) { background-image: url(/close_hl.png); } +.icon-import:not(:has(svg)) { background-image: url(/database_go.png); } .icon-file { background-image: url(/files/default.png); } .icon-file.text-plain { background-image: url(/files/text.png); } @@ -1742,7 +1779,7 @@ td.gantt_selected_column .gantt_hdr,.gantt_selected_column_container { .icon-file.application-pdf { background-image: url(/files/pdf.png); } .icon-file.application-zip { background-image: url(/files/zip.png); } .icon-file.application-gzip { background-image: url(/files/zip.png); } -.icon-copy-link { background-image: url(/copy_link.png); } +.icon-copy-link:not(:has(svg)) { background-image: url(/copy_link.png); } .sort-handle.ajax-loading { background-image: url(/loading.gif); } tr.ui-sortable-helper { border:1px solid #e4e4e4; } diff --git a/app/assets/stylesheets/context_menu.css b/app/assets/stylesheets/context_menu.css index b0acdcca9..ca25697f6 100644 --- a/app/assets/stylesheets/context_menu.css +++ b/app/assets/stylesheets/context_menu.css @@ -41,7 +41,7 @@ #context-menu a { text-decoration:none !important; - padding: 2px 0px 2px 20px; + padding: 4px 8px; width:100%; /* IE */ } #context-menu li>a { width:auto; } /* others */ diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 15d2ff72b..111c85bc5 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -28,9 +28,11 @@ class ApplicationController < ActionController::Base include Redmine::Hook::Helper include RoutesHelper include AvatarsHelper + include IconsHelper helper :routes helper :avatars + helper :icons class_attribute :accept_api_auth_actions class_attribute :accept_atom_auth_actions diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index ca8e1c266..315868de9 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -127,7 +127,9 @@ module ApplicationHelper # * :download - Force download (default: false) def link_to_attachment(attachment, options={}) text = options.delete(:text) || attachment.filename + icon = 'attachment' if options.delete(:download) + icon = 'download' route_method = :download_named_attachment_url options[:filename] = attachment.filename else @@ -136,9 +138,10 @@ module ApplicationHelper options.delete(:filename) end html_options = options.slice!(:only_path, :filename) + options[:only_path] = true unless options.key?(:only_path) url = send(route_method, attachment, options) - link_to text, url, html_options + link_to icon_with_label(icon, text), url, html_options end # Generates a link to a SCM revision @@ -744,7 +747,7 @@ module ApplicationHelper :reorder_url => options[:url] || url_for(object), :reorder_param => options[:param] || object.class.name.underscore } - content_tag('span', '', + content_tag('span', icon_with_label('reorder', ''), :class => "icon-only icon-sort-handle sort-handle", :data => data, :title => l(:button_sort)) @@ -824,7 +827,7 @@ module ApplicationHelper content = capture(&) if content.present? trigger = - content_tag('span', l(:button_actions), :class => 'icon-only icon-actions', + content_tag('span', icon_with_label('3-bullets', l(:button_actions)), :class => 'icon-only icon-actions ', :title => l(:button_actions)) trigger = content_tag('span', trigger, :class => 'drdn-trigger') content = content_tag('div', content, :class => 'drdn-items') @@ -1365,7 +1368,7 @@ module ApplicationHelper content_tag( 'div', link_to( - l(:button_edit_section), + icon_with_label('edit', l(:button_edit_section)), options[:edit_section_links].merge( :section => @current_section), :class => 'icon-only icon-edit'), @@ -1559,7 +1562,7 @@ module ApplicationHelper :class => 'icon icon-del' }.merge(options) - link_to button_name, url, options + link_to icon_with_label('del', button_name), url, options end def link_to_function(name, function, html_options={}) @@ -1567,7 +1570,7 @@ module ApplicationHelper end def link_to_context_menu - link_to l(:button_actions), '#', title: l(:button_actions), class: 'icon-only icon-actions js-contextmenu' + link_to icon_with_label('3-bullets', l(:button_actions)), '#', title: l(:button_actions), class: 'icon-only icon-actions js-contextmenu ' end # Helper to render JSON in views @@ -1897,8 +1900,8 @@ module ApplicationHelper def copy_object_url_link(url) link_to_function( - l(:button_copy_link), 'copyTextToClipboard(this);', - class: 'icon icon-copy-link', + icon_with_label('copy-link', l(:button_copy_link)), 'copyTextToClipboard(this);', + class: 'icon icon-copy-link ', data: {'clipboard-text' => url} ) end diff --git a/app/helpers/icons_helper.rb b/app/helpers/icons_helper.rb new file mode 100644 index 000000000..d82a74611 --- /dev/null +++ b/app/helpers/icons_helper.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +# Redmine - project management software +# Copyright (C) 2006- Jean-Philippe Lang +# +# 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. +# +# 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. +# +# 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 IconsHelper + DEFAULT_ICON_SIZE = "14" + DEFAULT_SPRITE = "icons" + + def icon_with_label(icon_name, label_text, icon_only: false) + sprite_icon(icon_name) + content_tag(:span, label_text, class: "icon-label") + end + + def sprite_icon(icon_name, size: DEFAULT_ICON_SIZE, sprite: DEFAULT_SPRITE) + sprite_path = "#{sprite}.svg" + + content_tag( + :svg, + content_tag(:use, '', { 'href' => "#{asset_path(sprite_path)}#icon--#{icon_name}" }), + class: "s#{size}", + aria: { + hidden: true + } + ) + end +end diff --git a/app/helpers/issues_helper.rb b/app/helpers/issues_helper.rb index 1455fa1c5..c92dd75e7 100644 --- a/app/helpers/issues_helper.rb +++ b/app/helpers/issues_helper.rb @@ -101,7 +101,7 @@ module IssuesHelper buttons = if manage_relations link_to( - l(:label_delete_link_to_subtask), + icon_with_label('link-break', l(:label_delete_link_to_subtask)), issue_path( {:id => child.id, :issue => {:parent_issue_id => ''}, :back_url => issue_path(issue.id), :no_flash => '1'} @@ -207,7 +207,7 @@ module IssuesHelper buttons = if manage_relations link_to( - l(:label_relation_delete), + icon_with_label('link-break', l(:label_relation_delete)), relation_path(relation, issue_id: issue.id), :remote => true, :method => :delete, diff --git a/app/helpers/journals_helper.rb b/app/helpers/journals_helper.rb index d5c996d87..c3ba50180 100644 --- a/app/helpers/journals_helper.rb +++ b/app/helpers/journals_helper.rb @@ -31,37 +31,37 @@ module JournalsHelper dropbown_links << copy_object_url_link(issue_url(issue, anchor: "note-#{indice}", only_path: false)) if journal.attachments.size > 1 - dropbown_links << link_to(l(:label_download_all_attachments), + dropbown_links << link_to(icon_with_label('download', l(:label_download_all_attachments)), container_attachments_download_path(journal), :title => l(:label_download_all_attachments), - :class => 'icon icon-download' + :class => 'icon icon-download ' ) end if journal.notes.present? if options[:reply_links] - links << link_to(l(:button_quote), + links << link_to(icon_with_label('comment', l(:button_quote)), quoted_issue_path(issue, :journal_id => journal, :journal_indice => indice), :remote => true, :method => 'post', :title => l(:button_quote), - :class => 'icon-only icon-comment' + :class => 'icon-only icon-comment ' ) end if journal.editable_by?(User.current) - links << link_to(l(:button_edit), + links << link_to(icon_with_label('edit', l(:button_edit)), edit_journal_path(journal), :remote => true, :method => 'get', :title => l(:button_edit), - :class => 'icon-only icon-edit' + :class => 'icon-only icon-edit ' ) - dropbown_links << link_to(l(:button_delete), + dropbown_links << link_to(icon_with_label('del', l(:button_delete)), journal_path(journal, :journal => {:notes => ""}), :remote => true, :method => 'put', :data => {:confirm => l(:text_are_you_sure)}, - :class => 'icon icon-del' + :class => 'icon icon-del ' ) end end diff --git a/app/helpers/my_helper.rb b/app/helpers/my_helper.rb index f65288de1..2957f4e90 100644 --- a/app/helpers/my_helper.rb +++ b/app/helpers/my_helper.rb @@ -34,8 +34,8 @@ module MyHelper def render_block(block, user) content = render_block_content(block, user) if content.present? - handle = content_tag('span', '', :class => 'icon-only icon-sort-handle sort-handle', :title => l(:button_move)) - close = link_to(l(:button_delete), + handle = content_tag('span', icon_with_label('reorder', ''), :class => 'icon-only icon-sort-handle sort-handle', :title => l(:button_move)) + close = link_to(icon_with_label('close', l(:button_delete)), {:action => "remove_block", :block => block}, :remote => true, :method => 'post', :class => "icon-only icon-close", :title => l(:button_delete)) diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index 5a8649dc3..bb05a3ef1 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -63,10 +63,10 @@ module ProjectsHelper def render_project_action_links links = (+"").html_safe if User.current.allowed_to?(:add_project, nil, :global => true) - links << link_to(l(:label_project_new), new_project_path, :class => 'icon icon-add') + links << link_to(icon_with_label('add', l(:label_project_new)), new_project_path, :class => 'icon icon-add') end if User.current.admin? - links << link_to(l(:label_administration), admin_projects_path, :class => 'icon icon-settings') + links << link_to(icon_with_label('settings', l(:label_administration)), admin_projects_path, :class => 'icon icon-settings') end links end @@ -182,12 +182,14 @@ module ProjectsHelper if bookmarked css << "icon-bookmark" + icon = "bookmark" method = "delete" - text = l(:button_project_bookmark_delete) + text = icon_with_label(icon, l(:button_project_bookmark_delete)) else css << "icon-bookmark-off" + icon = "bookmark-off" method = "post" - text = l(:button_project_bookmark) + text = icon_with_label(icon, l(:button_project_bookmark)) end url = bookmark_project_path(project) diff --git a/app/helpers/queries_helper.rb b/app/helpers/queries_helper.rb index 516088f8d..26d1ee48b 100644 --- a/app/helpers/queries_helper.rb +++ b/app/helpers/queries_helper.rb @@ -517,7 +517,7 @@ module QueriesHelper def link_to_clear_query(params = {:set_filter => 1, :sort => '', :project_id => @project}) link_to( - l(:button_clear), + icon_with_label('clear-query', l(:button_clear)), params, :class => 'icon-only icon-clear-query', :title => l(:button_clear) diff --git a/app/helpers/versions_helper.rb b/app/helpers/versions_helper.rb index 5ad319c7f..4f88ba5ee 100644 --- a/app/helpers/versions_helper.rb +++ b/app/helpers/versions_helper.rb @@ -101,7 +101,7 @@ module VersionsHelper :tracker_id => new_issue_tracker, :fixed_version_id => version.id } - link_to l(:label_issue_new), new_project_issue_path(project, :issue => attrs, :back_url => version_path(version)), :class => 'icon icon-add' + link_to icon_with_label('add', l(:label_issue_new)), new_project_issue_path(project, :issue => attrs, :back_url => version_path(version)), :class => 'icon icon-add' end end end diff --git a/app/helpers/watchers_helper.rb b/app/helpers/watchers_helper.rb index 8afd5af31..2071879e3 100644 --- a/app/helpers/watchers_helper.rb +++ b/app/helpers/watchers_helper.rb @@ -25,7 +25,8 @@ module WatchersHelper return '' unless objects.any? watched = Watcher.any_watched?(objects, user) - css = [watcher_css(objects), watched ? 'icon icon-fav' : 'icon icon-fav-off'].join(' ') + icon = watched ? 'fav' : 'fav-off' + css = [watcher_css(objects), '', 'icon', icon].join(' ') text = watched ? l(:button_unwatch) : l(:button_watch) url = watch_path( :object_type => objects.first.class.to_s.underscore, @@ -33,7 +34,7 @@ module WatchersHelper ) method = watched ? 'delete' : 'post' - link_to text, url, :remote => true, :method => method, :class => css + link_to icon_with_label(icon, text), url, :remote => true, :method => method, :class => css end # Returns the css class used to identify watch links for a given +object+ @@ -61,7 +62,7 @@ module WatchersHelper :object_id => object.id, :user_id => user} s << ' ' - s << link_to(l(:button_delete), url, + s << link_to(icon_with_label('del', l(:button_delete)), url, :remote => true, :method => 'delete', :class => "delete icon-only icon-del", :title => l(:button_delete)) diff --git a/app/views/admin/projects.html.erb b/app/views/admin/projects.html.erb index c0e2a713e..91a981a59 100644 --- a/app/views/admin/projects.html.erb +++ b/app/views/admin/projects.html.erb @@ -1,5 +1,5 @@