Project

General

Profile

Feature #43805 » 0001-Add-file-type-icons-for-audio-image-and-video-media-.patch

Go MAEDA, 2026-02-09 08:53

View differences:

app/assets/images/icons.svg
215 215
      <path d="M14 3v4a1 1 0 0 0 1 1h4"/>
216 216
      <path d="M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2z"/>
217 217
    </symbol>
218
    <symbol viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" id="icon--file-music">
219
      <path d="M14 3v4a1 1 0 0 0 1 1h4"/>
220
      <path d="M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2z"/>
221
      <path d="M11 16m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"/>
222
      <path d="M12 16l0 -5l2 1"/>
223
    </symbol>
218 224
    <symbol viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" id="icon--folder">
219 225
      <path d="M5 4h4l3 3h7a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2v-11a2 2 0 0 1 2 -2"/>
220 226
    </symbol>
......
244 250
      <path d="M6 20v-2a6 6 0 1 1 12 0v2a1 1 0 0 1 -1 1h-10a1 1 0 0 1 -1 -1z"/>
245 251
      <path d="M6 4v2a6 6 0 1 0 12 0v-2a1 1 0 0 0 -1 -1h-10a1 1 0 0 0 -1 1z"/>
246 252
    </symbol>
247
    <symbol viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" id="icon--image-gif">
248
      <path d="M14 3v4a1 1 0 0 0 1 1h4"/>
249
      <path d="M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2z"/>
250
    </symbol>
251
    <symbol viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" id="icon--image-jpeg">
252
      <path d="M14 3v4a1 1 0 0 0 1 1h4"/>
253
      <path d="M5 12v-7a2 2 0 0 1 2 -2h7l5 5v4"/>
254
      <path d="M11 18h1.5a1.5 1.5 0 0 0 0 -3h-1.5v6"/>
255
      <path d="M20 15h-1a2 2 0 0 0 -2 2v2a2 2 0 0 0 2 2h1v-3"/>
256
      <path d="M5 15h3v4.5a1.5 1.5 0 0 1 -3 0"/>
257
    </symbol>
258
    <symbol viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" id="icon--image-png">
259
      <path d="M14 3v4a1 1 0 0 0 1 1h4"/>
260
      <path d="M5 12v-7a2 2 0 0 1 2 -2h7l5 5v4"/>
261
      <path d="M20 15h-1a2 2 0 0 0 -2 2v2a2 2 0 0 0 2 2h1v-3"/>
262
      <path d="M5 18h1.5a1.5 1.5 0 0 0 0 -3h-1.5v6"/>
263
      <path d="M11 21v-6l3 6v-6"/>
264
    </symbol>
265
    <symbol viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" id="icon--image-tiff">
266
      <path d="M14 3v4a1 1 0 0 0 1 1h4"/>
267
      <path d="M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2z"/>
268
    </symbol>
269 253
    <symbol viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" id="icon--import">
270 254
      <path d="M4 6c0 1.657 3.582 3 8 3s8 -1.343 8 -3s-3.582 -3 -8 -3s-8 1.343 -8 3"/>
271 255
      <path d="M4 6v6c0 1.657 3.582 3 8 3c1.118 0 2.183 -.086 3.15 -.241"/>
......
339 323
      <path d="M15 14l4 -4l-4 -4"/>
340 324
      <path d="M19 10h-11a4 4 0 1 0 0 8h1"/>
341 325
    </symbol>
326
    <symbol viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" id="icon--movie">
327
      <path d="M4 4m0 2a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2z"/>
328
      <path d="M8 4l0 16"/>
329
      <path d="M16 4l0 16"/>
330
      <path d="M4 8l4 0"/>
331
      <path d="M4 16l4 0"/>
332
      <path d="M4 12l16 0"/>
333
      <path d="M16 8l4 0"/>
334
      <path d="M16 16l4 0"/>
335
    </symbol>
342 336
    <symbol viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" id="icon--news">
343 337
      <path d="M16 6h3a1 1 0 0 1 1 1v11a2 2 0 0 1 -4 0v-13a1 1 0 0 0 -1 -1h-10a1 1 0 0 0 -1 1v12a3 3 0 0 0 3 3h11"/>
344 338
      <path d="M8 8l4 0"/>
......
352 346
      <path d="M12 12l-8 -4.5"/>
353 347
      <path d="M16 5.25l-8 4.5"/>
354 348
    </symbol>
349
    <symbol viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" id="icon--photo">
350
      <path d="M15 8h.01"/>
351
      <path d="M3 6a3 3 0 0 1 3 -3h12a3 3 0 0 1 3 3v12a3 3 0 0 1 -3 3h-12a3 3 0 0 1 -3 -3v-12z"/>
352
      <path d="M3 16l5 -5c.928 -.893 2.072 -.893 3 0l5 5"/>
353
      <path d="M14 14l1 -1c.928 -.893 2.072 -.893 3 0l3 3"/>
354
    </symbol>
355 355
    <symbol viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" id="icon--plugins">
356 356
      <path d="M4 7h3a1 1 0 0 0 1 -1v-1a2 2 0 0 1 4 0v1a1 1 0 0 0 1 1h3a1 1 0 0 1 1 1v3a1 1 0 0 0 1 1h1a2 2 0 0 1 0 4h-1a1 1 0 0 0 -1 1v3a1 1 0 0 1 -1 1h-3a1 1 0 0 1 -1 -1v-1a2 2 0 0 0 -4 0v1a1 1 0 0 1 -1 1h-3a1 1 0 0 1 -1 -1v-3a1 1 0 0 1 1 -1h1a2 2 0 0 0 0 -4h-1a1 1 0 0 1 -1 -1v-3a1 1 0 0 1 1 -1"/>
357 357
    </symbol>
app/helpers/icons_helper.rb
116 116
  def icon_for_mime_type(mime)
117 117
    if %w(text/plain text/x-c text/x-csharp text/x-java text/x-php
118 118
          text/x-ruby text/xml text/css text/html text/css text/html
119
          image/gif image/jpeg image/png image/tiff
120 119
          application/pdf application/zip application/gzip application/javascript).include?(mime)
121
      mime.tr('/', '-')
120
      icon_name = mime.tr('/', '-')
122 121
    else
123
      "file"
122
      top_level_type, subtype = mime.to_s.split('/')
123
      icon_name =
124
        case top_level_type # rubocop:disable Style/HashLikeCase
125
        when 'audio' then 'file-music'
126
        when 'image' then 'photo'
127
        when 'video' then 'movie'
128
        end
124 129
    end
130
    icon_name || 'file'
125 131
  end
126 132
end
config/icon_source.yml
185 185
  svg: file-type-css
186 186
- name: text-html
187 187
  svg: file-type-html
188
- name: image-gif
189
  svg: file
190
- name: image-jpeg
191
  svg: file-type-jpg
192
- name: image-png
193
  svg: file-type-png
194
- name: image-tiff
195
  svg: file
196 188
- name: application-javascript
197 189
  svg: file-type-js
198 190
- name: application-pdf
......
252 244
  svg: arrow-narrow-left
253 245
- name: arrow-narrow-right
254 246
  svg: arrow-narrow-right
247
- name: photo
248
  svg: photo
249
- name: movie
250
  svg: movie
251
- name: file-music
252
  svg: file-music
test/helpers/icons_helper_test.rb
139 139
    assert_equal 'application-pdf', icon_for_mime_type('application/pdf')
140 140
  end
141 141

  
142
  def test_icon_for_mime_type_should_return_icon_for_top_level_types
143
    assert_equal 'file-music', icon_for_mime_type('audio/aac')
144
    assert_equal 'file-music', icon_for_mime_type('audio/mpeg')
145
    assert_equal 'photo', icon_for_mime_type('image/jpeg')
146
    assert_equal 'photo', icon_for_mime_type('image/png')
147
    assert_equal 'movie', icon_for_mime_type('video/raw')
148
    assert_equal 'movie', icon_for_mime_type('video/mp4')
149
  end
150

  
142 151
  def test_icon_for_mime_type_should_return_generic_file_icon_for_unknown_mime_types
143 152
    assert_equal 'file', icon_for_mime_type('unknown-type')
144 153
  end
(3-3/4)