Project

General

Profile

Feature #43797 » 0002-Update-attachments-list-to-show-MIME-type-icons-inst.patch

Go MAEDA, 2026-02-08 09:45

View differences:

app/assets/javascripts/attachments.js
80 80
        ajaxUpload.uploading--;
81 81
        fileSpan.removeClass('ajax-loading');
82 82
        attachmentIcon.removeClass('svg-loader');
83
        updateSVGIcon(attachmentIcon[0], 'attachment');
83
        updateSVGIcon(attachmentIcon[0], 'file');
84 84
        var form = fileSpan.parents('form');
85 85
        if (form.queue('upload').length == 0 && ajaxUpload.uploading == 0) {
86 86
          $('input:submit', form).removeAttr('disabled');
app/helpers/application_helper.rb
126 126
  # Options:
127 127
  # * :text - Link text (default to attachment filename)
128 128
  # * :download - Force download (default: false)
129
  # * :icon - Sprite icon name
129 130
  def link_to_attachment(attachment, options={})
130 131
    text = options.delete(:text) || attachment.filename
131 132
    icon = options.delete(:icon)
app/helpers/icons_helper.rb
90 90
    sprite_icon(icon_name, **)
91 91
  end
92 92

  
93
  def mime_type_icon(mime_type, ...)
94
    icon_name = icon_for_mime_type(mime_type)
95
    sprite_icon(icon_name, ...)
96
  end
97

  
93 98
  private
94 99

  
95 100
  def svg_sprite_icon(icon_name, size: DEFAULT_ICON_SIZE, style: :outline, sprite: DEFAULT_SPRITE, css_class: nil, rtl: false)
app/views/attachments/_form.html.erb
9 9
<span class="attachments_form">
10 10
  <span class="attachments_icons hidden">
11 11
    <%= sprite_icon('del', icon_only: true, css_class: 'svg-del') %>
12
    <%= sprite_icon('attachment', icon_only: true, size: 16, css_class: 'svg-attachment') %>
12
    <%= sprite_icon('file', icon_only: true, size: 16, css_class: 'svg-attachment') %>
13 13
    <%= sprite_icon('loader', icon_only: true, size: 16, css_class: 'svg-loader') %>
14 14
    <%= sprite_icon('hourglass', icon_only: true, size: 16, css_class: 'svg-hourglass') %>
15 15
  </span>
......
17 17
  <% if saved_attachments.present? %>
18 18
    <% saved_attachments.each_with_index do |attachment, i| %>
19 19
      <span id="attachments_p<%= i %>">
20
        <%= sprite_icon('attachment', icon_only: true, size: 16, css_class: 'svg-attachment') %>
20
        <%= sprite_icon('file', icon_only: true, size: 16, css_class: 'svg-attachment') %>
21 21
        <%= text_field_tag("#{attachment_param}[p#{i}][filename]", attachment.filename, :class => 'filename') %>
22 22
        <% if attachment.container_id.present? %>
23 23
          <%= link_to sprite_icon('del', l(:button_delete), icon_only: true), "#", :onclick => "$(this).closest('.attachments_form').find('.add_attachment').show(); $(this).parent().remove(); return false;", :class => 'icon-only icon-del' %>
app/views/attachments/_links.html.erb
15 15
<% for attachment in attachments %>
16 16
<tr>
17 17
  <td>
18
    <%= link_to_attachment attachment, class: 'icon icon-attachment ', icon: 'attachment' -%>
18
    <%= link_to_attachment attachment, class: 'icon icon-attachment ', icon: icon_for_mime_type(attachment.content_type) -%>
19 19
    <span class="size">(<%= number_to_human_size attachment.filesize %>)</span>
20 20
    <%= link_to_attachment attachment, class: 'icon-only icon-download ', title: l(:button_download), download: true, icon: 'download' -%>
21 21
  </td>
app/views/attachments/edit_all.html.erb
11 11
  <% @attachments.each do |attachment| %>
12 12
    <tr>
13 13
      <td colspan="2">
14
        <span class="icon icon-attachment"><%= sprite_icon('attachment', attachment.filename_was) %></span>
14
        <span class="icon icon-attachment"><%= mime_type_icon(attachment.content_type_was, attachment.filename_was) %></span>
15 15
        <span class="size">(<%= number_to_human_size attachment.filesize %>)</span>
16 16
        <span class="author"><%= attachment.author %>, <%= format_time(attachment.created_on) %></span>
17 17
      </td>
app/views/issues/_edit.html.erb
54 54
        <div id="existing-attachments" style="<%= @issue.deleted_attachment_ids.blank? ? 'display:none;' : '' %>">
55 55
          <% @issue.attachments.each do |attachment| %>
56 56
          <span class="existing-attachment">
57
            <%= sprite_icon('attachment', size: 12) %>
57
            <%= mime_type_icon(attachment.content_type, size: 12) %>
58 58
            <%= text_field_tag '', attachment.filename, :class => "icon icon-attachment filename", :disabled => true %>
59 59
            <label>
60 60
              <%= check_box_tag 'issue[deleted_attachment_ids][]',
app/views/wiki/edit.html.erb
41 41
<div id="existing-attachments" style="<%= @page.deleted_attachment_ids.blank? ? 'display:none;' : '' %>">
42 42
  <% @page.attachments.each do |attachment| %>
43 43
  <span class="existing-attachment">
44
    <%= sprite_icon('attachment', size: 12) %>
44
    <%= mime_type_icon(attachment.content_type, size: 12) %>
45 45
    <%= text_field_tag '', attachment.filename, :class => "icon icon-attachment filename", :disabled => true %>
46 46
    <label class='inline'>
47 47
      <%= check_box_tag 'wiki_page[deleted_attachment_ids][]',
test/functional/issues_controller_test.rb
2253 2253
    end
2254 2254
  end
2255 2255

  
2256
  def test_show_should_display_attachment_icons_by_mime_type
2257
    @request.session[:user_id] = 2
2258
    get(:show, :params => {:id => 3})
2259

  
2260
    assert_response :success
2261
    assert_select 'div.attachments' do
2262
      assert_select 'a.icon-attachment[href=?]', '/attachments/1' do
2263
        assert_select "svg.icon-svg use:match('href', ?)", /assets\/icons-\w+.svg#icon--text-plain/
2264
      end
2265
      assert_select 'a.icon-attachment[href=?]', '/attachments/6' do
2266
        assert_select "svg.icon-svg use:match('href', ?)", /assets\/icons-\w+.svg#icon--application-zip/
2267
      end
2268
    end
2269
  end
2270

  
2256 2271
  def test_show_should_display_update_form
2257 2272
    @request.session[:user_id] = 2
2258 2273
    get(:show, :params => {:id => 1})
test/helpers/icons_helper_test.rb
124 124
    assert_match expected, activity_event_type_icon('time-entry')
125 125
  end
126 126

  
127
  def test_mime_type_icon_should_return_specific_icon_for_known_mime_types
128
    expected = %r{<svg class="s18 icon-svg" aria-hidden="true"><use href="/assets/icons-\w+.svg#icon--text-plain"></use></svg>}
129
    assert_match expected, mime_type_icon('text/plain')
130
  end
131

  
132
  def test_mime_type_icon_should_return_generic_file_icon_for_unknown_mime_types
133
    expected = %r{<svg class="s18 icon-svg" aria-hidden="true"><use href="/assets/icons-\w+.svg#icon--file"></use></svg>}
134
    assert_match expected, mime_type_icon('unknown-type/unknown-subtype')
135
  end
136

  
127 137
  def test_icon_for_mime_type_should_return_specific_icon_for_known_mime_types
128 138
    assert_equal 'text-plain', icon_for_mime_type('text/plain')
129 139
    assert_equal 'application-pdf', icon_for_mime_type('application/pdf')
(6-6/6)