Patch #21805 » 0001-Improve-accessibility-for-icon-only-links-v2.1.patch
| app/helpers/application_helper.rb | ||
|---|---|---|
| 454 | 454 |
end |
| 455 | 455 | |
| 456 | 456 |
def reorder_links(name, url, method = :post) |
| 457 |
link_to('',
|
|
| 457 |
link_to(l(:label_sort_highest),
|
|
| 458 | 458 |
url.merge({"#{name}[move_to]" => 'highest'}), :method => method,
|
| 459 | 459 |
:title => l(:label_sort_highest), :class => 'icon-only icon-move-top') + |
| 460 |
link_to('',
|
|
| 460 |
link_to(l(:label_sort_higher),
|
|
| 461 | 461 |
url.merge({"#{name}[move_to]" => 'higher'}), :method => method,
|
| 462 | 462 |
:title => l(:label_sort_higher), :class => 'icon-only icon-move-up') + |
| 463 |
link_to('',
|
|
| 463 |
link_to(l(:label_sort_lower),
|
|
| 464 | 464 |
url.merge({"#{name}[move_to]" => 'lower'}), :method => method,
|
| 465 | 465 |
:title => l(:label_sort_lower), :class => 'icon-only icon-move-down') + |
| 466 |
link_to('',
|
|
| 466 |
link_to(l(:label_sort_lowest),
|
|
| 467 | 467 |
url.merge({"#{name}[move_to]" => 'lowest'}), :method => method,
|
| 468 | 468 |
:title => l(:label_sort_lowest), :class => 'icon-only icon-move-bottom') |
| 469 | 469 |
end |
| ... | ... | |
| 887 | 887 |
@current_section += 1 |
| 888 | 888 |
if @current_section > 1 |
| 889 | 889 |
content_tag('div',
|
| 890 |
link_to('', options[:edit_section_links].merge(:section => @current_section),
|
|
| 890 |
link_to(l(:button_edit_section), options[:edit_section_links].merge(:section => @current_section),
|
|
| 891 | 891 |
:class => 'icon-only icon-edit'), |
| 892 | 892 |
:class => "contextual heading-#{level}",
|
| 893 | 893 |
:title => l(:button_edit_section), |
| app/helpers/email_addresses_helper.rb | ||
|---|---|---|
| 22 | 22 |
# Returns a link to enable or disable notifications for the address |
| 23 | 23 |
def toggle_email_address_notify_link(address) |
| 24 | 24 |
if address.notify? |
| 25 |
link_to '',
|
|
| 25 |
link_to l(:label_disable_notifications),
|
|
| 26 | 26 |
user_email_address_path(address.user, address, :notify => '0'), |
| 27 | 27 |
:method => :put, :remote => true, |
| 28 | 28 |
:title => l(:label_disable_notifications), |
| 29 |
:class => 'icon icon-email' |
|
| 29 |
:class => 'icon-only icon-email'
|
|
| 30 | 30 |
else |
| 31 |
link_to '',
|
|
| 31 |
link_to l(:label_enable_notifications),
|
|
| 32 | 32 |
user_email_address_path(address.user, address, :notify => '1'), |
| 33 | 33 |
:method => :put, :remote => true, |
| 34 | 34 |
:title => l(:label_enable_notifications), |
| 35 |
:class => 'icon icon-email-disabled' |
|
| 35 |
:class => 'icon-only icon-email-disabled'
|
|
| 36 | 36 |
end |
| 37 | 37 |
end |
| 38 | 38 |
end |
| app/helpers/issues_helper.rb | ||
|---|---|---|
| 442 | 442 |
# Link to the attachment if it has not been removed |
| 443 | 443 |
value = link_to_attachment(atta, :download => true, :only_path => options[:only_path]) |
| 444 | 444 |
if options[:only_path] != false && atta.is_text? |
| 445 |
value += link_to('',
|
|
| 445 |
value += link_to(l(:button_view),
|
|
| 446 | 446 |
{ :controller => 'attachments', :action => 'show',
|
| 447 | 447 |
:id => atta, :filename => atta.filename }, |
| 448 |
:class => 'icon icon-magnifier') |
|
| 448 |
:class => 'icon-only icon-magnifier', |
|
| 449 |
:title => l(:button_view)) |
|
| 449 | 450 |
end |
| 450 | 451 |
else |
| 451 | 452 |
value = content_tag("i", h(value)) if value
|
| app/helpers/journals_helper.rb | ||
|---|---|---|
| 30 | 30 |
editable = User.current.logged? && (User.current.allowed_to?(:edit_issue_notes, issue.project) || (journal.user == User.current && User.current.allowed_to?(:edit_own_issue_notes, issue.project))) |
| 31 | 31 |
links = [] |
| 32 | 32 |
if !journal.notes.blank? |
| 33 |
links << link_to('',
|
|
| 33 |
links << link_to(l(:button_quote),
|
|
| 34 | 34 |
quoted_issue_path(issue, :journal_id => journal), |
| 35 | 35 |
:remote => true, |
| 36 | 36 |
:method => 'post', |
| 37 | 37 |
:title => l(:button_quote), |
| 38 | 38 |
:class => 'icon-only icon-comment' |
| 39 | 39 |
) if options[:reply_links] |
| 40 |
links << link_to('',
|
|
| 40 |
links << link_to(l(:button_edit),
|
|
| 41 | 41 |
edit_journal_path(journal), |
| 42 | 42 |
:remote => true, |
| 43 | 43 |
:method => 'get', |
| 44 | 44 |
:title => l(:button_edit), |
| 45 | 45 |
:class => 'icon-only icon-edit' |
| 46 | 46 |
) if editable |
| 47 |
links << link_to('',
|
|
| 47 |
links << link_to(l(:button_delete),
|
|
| 48 | 48 |
journal_path(journal, :notes => ""), |
| 49 | 49 |
:remote => true, |
| 50 | 50 |
:method => 'put', :data => {:confirm => l(:text_are_you_sure)},
|
| app/helpers/watchers_helper.rb | ||
|---|---|---|
| 58 | 58 |
:object_id => object.id, |
| 59 | 59 |
:user_id => user} |
| 60 | 60 |
s << ' ' |
| 61 |
s << link_to('', url,
|
|
| 61 |
s << link_to(l(:button_delete), url,
|
|
| 62 | 62 |
:remote => true, :method => 'delete', |
| 63 | 63 |
:class => "delete icon-only icon-del", |
| 64 | 64 |
:title => l(:button_delete)) |
| app/views/attachments/_links.html.erb | ||
|---|---|---|
| 1 | 1 |
<div class="attachments"> |
| 2 | 2 |
<div class="contextual"> |
| 3 |
<%= link_to('',
|
|
| 3 |
<%= link_to(l(:label_edit_attachments),
|
|
| 4 | 4 |
container_attachments_edit_path(container), |
| 5 | 5 |
:title => l(:label_edit_attachments), |
| 6 | 6 |
:class => 'icon-only icon-edit' |
| ... | ... | |
| 9 | 9 |
<% for attachment in attachments %> |
| 10 | 10 |
<p><%= link_to_attachment attachment, :class => 'icon icon-attachment', :download => true -%> |
| 11 | 11 |
<% if attachment.is_text? %> |
| 12 |
<%= link_to '',
|
|
| 12 |
<%= link_to l(:button_view),
|
|
| 13 | 13 |
{ :controller => 'attachments', :action => 'show',
|
| 14 | 14 |
:id => attachment, :filename => attachment.filename }, |
| 15 |
:class => 'icon icon-magnifier', |
|
| 15 |
:class => 'icon-only icon-magnifier',
|
|
| 16 | 16 |
:title => l(:button_view) %> |
| 17 | 17 |
<% end %> |
| 18 | 18 |
<%= " - #{attachment.description}" unless attachment.description.blank? %>
|
| 19 | 19 |
<span class="size">(<%= number_to_human_size attachment.filesize %>)</span> |
| 20 | 20 |
<% if options[:deletable] %> |
| 21 |
<%= link_to '', attachment_path(attachment),
|
|
| 21 |
<%= link_to l(:button_delete), attachment_path(attachment),
|
|
| 22 | 22 |
:data => {:confirm => l(:text_are_you_sure)},
|
| 23 | 23 |
:method => :delete, |
| 24 | 24 |
:class => 'delete icon-only icon-del', |
| app/views/issues/_attributes.html.erb | ||
|---|---|---|
| 20 | 20 | |
| 21 | 21 |
<% if @issue.safe_attribute?('category_id') && @issue.project.issue_categories.any? %>
|
| 22 | 22 |
<p><%= f.select :category_id, (@issue.project.issue_categories.collect {|c| [c.name, c.id]}), :include_blank => true, :required => @issue.required_attribute?('category_id') %>
|
| 23 |
<%= link_to('',
|
|
| 23 |
<%= link_to(l(:label_issue_category_new),
|
|
| 24 | 24 |
new_project_issue_category_path(@issue.project), |
| 25 | 25 |
:remote => true, |
| 26 | 26 |
:method => 'get', |
| ... | ... | |
| 32 | 32 | |
| 33 | 33 |
<% if @issue.safe_attribute?('fixed_version_id') && @issue.assignable_versions.any? %>
|
| 34 | 34 |
<p><%= f.select :fixed_version_id, version_options_for_select(@issue.assignable_versions, @issue.fixed_version), :include_blank => true, :required => @issue.required_attribute?('fixed_version_id') %>
|
| 35 |
<%= link_to('',
|
|
| 35 |
<%= link_to(l(:label_version_new),
|
|
| 36 | 36 |
new_project_version_path(@issue.project), |
| 37 | 37 |
:remote => true, |
| 38 | 38 |
:method => 'get', |
| app/views/issues/_relations.html.erb | ||
|---|---|---|
| 19 | 19 |
<td class="status"><%= other_issue.status.name %></td> |
| 20 | 20 |
<td class="start_date"><%= format_date(other_issue.start_date) %></td> |
| 21 | 21 |
<td class="due_date"><%= format_date(other_issue.due_date) %></td> |
| 22 |
<td class="buttons"><%= link_to('',
|
|
| 22 |
<td class="buttons"><%= link_to(l(:label_relation_delete),
|
|
| 23 | 23 |
relation_path(relation), |
| 24 | 24 |
:remote => true, |
| 25 | 25 |
:method => :delete, |
| app/views/my/blocks/_timelog.html.erb | ||
|---|---|---|
| 42 | 42 |
<td class="hours"><%= html_hours("%.2f" % entry.hours) %></td>
|
| 43 | 43 |
<td class="buttons"> |
| 44 | 44 |
<% if entry.editable_by?(@user) -%> |
| 45 |
<%= link_to '', {:controller => 'timelog', :action => 'edit', :id => entry},
|
|
| 45 |
<%= link_to l(:button_edit), {:controller => 'timelog', :action => 'edit', :id => entry},
|
|
| 46 | 46 |
:title => l(:button_edit), |
| 47 | 47 |
:class => 'icon-only icon-edit' %> |
| 48 |
<%= link_to '', {:controller => 'timelog', :action => 'destroy', :id => entry},
|
|
| 48 |
<%= link_to l(:button_delete), {:controller => 'timelog', :action => 'destroy', :id => entry},
|
|
| 49 | 49 |
:data => {:confirm => l(:text_are_you_sure)}, :method => :delete,
|
| 50 | 50 |
:title => l(:button_delete), |
| 51 | 51 |
:class => 'icon-only icon-del' %> |
| app/views/news/show.html.erb | ||
|---|---|---|
| 36 | 36 |
<% @comments.each do |comment| %> |
| 37 | 37 |
<% next if comment.new_record? %> |
| 38 | 38 |
<div class="contextual"> |
| 39 |
<%= link_to_if_authorized '', {:controller => 'comments', :action => 'destroy', :id => @news, :comment_id => comment},
|
|
| 39 |
<%= link_to_if_authorized l(:button_delete), {:controller => 'comments', :action => 'destroy', :id => @news, :comment_id => comment},
|
|
| 40 | 40 |
:data => {:confirm => l(:text_are_you_sure)}, :method => :delete,
|
| 41 | 41 |
:title => l(:button_delete), |
| 42 | 42 |
:class => 'icon-only icon-del' %> |
| app/views/reports/issue_report.html.erb | ||
|---|---|---|
| 3 | 3 |
<div class="splitcontentleft"> |
| 4 | 4 |
<h3> |
| 5 | 5 |
<%=l(:field_tracker)%> |
| 6 |
<%= link_to '', project_issues_report_details_path(@project, :detail => 'tracker'), :class => 'icon-only icon-zoom-in' %> |
|
| 6 |
<%= link_to l(:label_details), |
|
| 7 |
project_issues_report_details_path(@project, :detail => 'tracker'), |
|
| 8 |
:class => 'icon-only icon-zoom-in', |
|
| 9 |
:title => l(:label_details) %> |
|
| 7 | 10 |
</h3> |
| 8 | 11 |
<%= render :partial => 'simple', :locals => { :data => @issues_by_tracker, :field_name => "tracker_id", :rows => @trackers } %>
|
| 9 | 12 |
<br /> |
| 10 | 13 |
<h3> |
| 11 | 14 |
<%=l(:field_priority)%> |
| 12 |
<%= link_to '', project_issues_report_details_path(@project, :detail => 'priority'), :class => 'icon-only icon-zoom-in' %> |
|
| 15 |
<%= link_to l(:label_details), |
|
| 16 |
project_issues_report_details_path(@project, :detail => 'priority'), |
|
| 17 |
:class => 'icon-only icon-zoom-in', |
|
| 18 |
:title => l(:label_details) %> |
|
| 13 | 19 |
</h3> |
| 14 | 20 |
<%= render :partial => 'simple', :locals => { :data => @issues_by_priority, :field_name => "priority_id", :rows => @priorities } %>
|
| 15 | 21 |
<br /> |
| 16 | 22 |
<h3> |
| 17 | 23 |
<%=l(:field_assigned_to)%> |
| 18 |
<%= link_to '', project_issues_report_details_path(@project, :detail => 'assigned_to'), :class => 'icon-only icon-zoom-in' %> |
|
| 24 |
<%= link_to l(:label_details), |
|
| 25 |
project_issues_report_details_path(@project, :detail => 'assigned_to'), |
|
| 26 |
:class => 'icon-only icon-zoom-in', |
|
| 27 |
:title => l(:label_details) %> |
|
| 19 | 28 |
</h3> |
| 20 | 29 |
<%= render :partial => 'simple', :locals => { :data => @issues_by_assigned_to, :field_name => "assigned_to_id", :rows => @assignees } %>
|
| 21 | 30 |
<br /> |
| 22 | 31 |
<h3> |
| 23 | 32 |
<%=l(:field_author)%> |
| 24 |
<%= link_to '', project_issues_report_details_path(@project, :detail => 'author'), :class => 'icon-only icon-zoom-in' %> |
|
| 33 |
<%= link_to l(:label_details), |
|
| 34 |
project_issues_report_details_path(@project, :detail => 'author'), |
|
| 35 |
:class => 'icon-only icon-zoom-in', |
|
| 36 |
:title => l(:label_details) %> |
|
| 25 | 37 |
</h3> |
| 26 | 38 |
<%= render :partial => 'simple', :locals => { :data => @issues_by_author, :field_name => "author_id", :rows => @authors } %>
|
| 27 | 39 |
<br /> |
| ... | ... | |
| 31 | 43 |
<div class="splitcontentright"> |
| 32 | 44 |
<h3> |
| 33 | 45 |
<%=l(:field_version)%> |
| 34 |
<%= link_to '', project_issues_report_details_path(@project, :detail => 'version'), :class => 'icon-only icon-zoom-in' %> |
|
| 46 |
<%= link_to l(:label_details), |
|
| 47 |
project_issues_report_details_path(@project, :detail => 'version'), |
|
| 48 |
:class => 'icon-only icon-zoom-in', |
|
| 49 |
:title => l(:label_details) %> |
|
| 35 | 50 |
</h3> |
| 36 | 51 |
<%= render :partial => 'simple', :locals => { :data => @issues_by_version, :field_name => "fixed_version_id", :rows => @versions } %>
|
| 37 | 52 |
<br /> |
| 38 | 53 |
<% if @project.children.any? %> |
| 39 | 54 |
<h3> |
| 40 | 55 |
<%=l(:field_subproject)%> |
| 41 |
<%= link_to '', project_issues_report_details_path(@project, :detail => 'subproject'), :class => 'icon-only icon-zoom-in' %> |
|
| 56 |
<%= link_to l(:label_details), |
|
| 57 |
project_issues_report_details_path(@project, :detail => 'subproject'), |
|
| 58 |
:class => 'icon-only icon-zoom-in', |
|
| 59 |
:title => l(:label_details) %> |
|
| 42 | 60 |
</h3> |
| 43 | 61 |
<%= render :partial => 'simple', :locals => { :data => @issues_by_subproject, :field_name => "project_id", :rows => @subprojects } %>
|
| 44 | 62 |
<br /> |
| 45 | 63 |
<% end %> |
| 46 | 64 |
<h3> |
| 47 | 65 |
<%=l(:field_category)%> |
| 48 |
<%= link_to '', project_issues_report_details_path(@project, :detail => 'category'), :class => 'icon-only icon-zoom-in' %> |
|
| 66 |
<%= link_to l(:label_details), |
|
| 67 |
project_issues_report_details_path(@project, :detail => 'category'), |
|
| 68 |
:class => 'icon-only icon-zoom-in', |
|
| 69 |
:title => l(:label_details) %> |
|
| 49 | 70 |
</h3> |
| 50 | 71 |
<%= render :partial => 'simple', :locals => { :data => @issues_by_category, :field_name => "category_id", :rows => @categories } %>
|
| 51 | 72 |
<br /> |
| app/views/repositories/_related_issues.html.erb | ||
|---|---|---|
| 11 | 11 |
<ul> |
| 12 | 12 |
<% @changeset.issues.visible.each do |issue| %> |
| 13 | 13 |
<li id="<%= "related-issue-#{issue.id}" %>"><%= link_to_issue issue %>
|
| 14 |
<%= link_to('',
|
|
| 14 |
<%= link_to(l(:label_relation_delete),
|
|
| 15 | 15 |
{:controller => 'repositories', :action => 'remove_related_issue',
|
| 16 | 16 |
:id => @project, :repository_id => @repository.identifier_param, |
| 17 | 17 |
:rev => @changeset.identifier, :issue_id => issue}, |
| app/views/settings/_repositories.html.erb | ||
|---|---|---|
| 119 | 119 |
) %> |
| 120 | 120 |
</td> |
| 121 | 121 |
<td class="buttons"> |
| 122 |
<%= link_to('', '#',
|
|
| 123 |
:class => 'delete-commit-keywords icon-only icon-del') %> |
|
| 122 |
<%= link_to(l(:button_delete), '#', |
|
| 123 |
:class => 'delete-commit-keywords icon-only icon-del', |
|
| 124 |
:title => l(:button_delete)) %> |
|
| 124 | 125 |
</td> |
| 125 | 126 |
</tr> |
| 126 | 127 |
<% end %> |
| ... | ... | |
| 130 | 131 |
<td></td> |
| 131 | 132 |
<td></td> |
| 132 | 133 |
<td class="buttons"> |
| 133 |
<%= link_to('', '#',
|
|
| 134 |
:class => 'add-commit-keywords icon-only icon-add') %> |
|
| 134 |
<%= link_to(l(:button_add), '#', |
|
| 135 |
:class => 'add-commit-keywords icon-only icon-add', |
|
| 136 |
:title => l(:button_add)) %> |
|
| 135 | 137 |
</td> |
| 136 | 138 |
</tr> |
| 137 | 139 |
</tbody> |
| app/views/timelog/_list.html.erb | ||
|---|---|---|
| 21 | 21 |
<%= raw @query.inline_columns.map {|column| "<td class=\"#{column.css_classes}\">#{column_content(column, entry)}</td>"}.join %>
|
| 22 | 22 |
<td class="buttons"> |
| 23 | 23 |
<% if entry.editable_by?(User.current) -%> |
| 24 |
<%= link_to '', edit_time_entry_path(entry),
|
|
| 24 |
<%= link_to l(:button_edit), edit_time_entry_path(entry),
|
|
| 25 | 25 |
:title => l(:button_edit), |
| 26 |
:class => 'icon icon-edit' %> |
|
| 27 |
<%= link_to '', time_entry_path(entry),
|
|
| 26 |
:class => 'icon-only icon-edit' %>
|
|
| 27 |
<%= link_to l(:button_delete), time_entry_path(entry),
|
|
| 28 | 28 |
:data => {:confirm => l(:text_are_you_sure)},
|
| 29 | 29 |
:method => :delete, |
| 30 | 30 |
:title => l(:button_delete), |
| public/stylesheets/application.css | ||
|---|---|---|
| 1101 | 1101 |
background-repeat: no-repeat; |
| 1102 | 1102 |
padding-left: 16px; |
| 1103 | 1103 |
} |
| 1104 |
a.icon-only {
|
|
| 1105 |
display: inline-block; |
|
| 1106 |
width: 0; |
|
| 1107 |
overflow: hidden; |
|
| 1108 |
padding-top: 0; |
|
| 1109 |
padding-bottom: 0; |
|
| 1110 |
font-size: 8px; |
|
| 1111 |
} |
|
| 1112 |
a.icon-only::after {
|
|
| 1113 |
content: " "; |
|
| 1114 |
} |
|
| 1104 | 1115 | |
| 1105 | 1116 |
.icon-add { background-image: url(../images/add.png); }
|
| 1106 | 1117 |
.icon-edit { background-image: url(../images/edit.png); }
|
| test/unit/helpers/application_helper_test.rb | ||
|---|---|---|
| 1243 | 1243 | |
| 1244 | 1244 |
# heading that contains inline code |
| 1245 | 1245 |
assert_match Regexp.new('<div class="contextual heading-2" title="Edit this section" id="section-4">' +
|
| 1246 |
'<a class="icon-only icon-edit" href="/projects/1/wiki/Test/edit\?section=4"></a></div>' + |
|
| 1246 |
'<a class="icon-only icon-edit" href="/projects/1/wiki/Test/edit\?section=4">Edit this section</a></div>' +
|
|
| 1247 | 1247 |
'<a name="Subtitle-with-inline-code"></a>' + |
| 1248 | 1248 |
'<h2 >Subtitle with <code>inline code</code><a href="#Subtitle-with-inline-code" class="wiki-anchor">¶</a></h2>'), |
| 1249 | 1249 |
result |
| 1250 | 1250 | |
| 1251 | 1251 |
# last heading |
| 1252 | 1252 |
assert_match Regexp.new('<div class="contextual heading-2" title="Edit this section" id="section-5">' +
|
| 1253 |
'<a class="icon-only icon-edit" href="/projects/1/wiki/Test/edit\?section=5"></a></div>' + |
|
| 1253 |
'<a class="icon-only icon-edit" href="/projects/1/wiki/Test/edit\?section=5">Edit this section</a></div>' +
|
|
| 1254 | 1254 |
'<a name="Subtitle-after-pre-tag"></a>' + |
| 1255 | 1255 |
'<h2 >Subtitle after pre tag<a href="#Subtitle-after-pre-tag" class="wiki-anchor">¶</a></h2>'), |
| 1256 | 1256 |
result |
- « Previous
- 1
- 2
- 3
- Next »