From d5312aea0646081bfba1e0cd4912d8a81fc903fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karel=20Pi=C4=8Dman?= Date: Fri, 22 Nov 2024 10:09:56 +0100 Subject: [PATCH] #1563 file icons --- app/helpers/dmsf_helper.rb | 13 ---- app/helpers/dmsf_queries_helper.rb | 64 +++++++++--------- app/views/dmsf_context_menus/_file.html.erb | 4 +- app/views/dmsf_files/_link.html.erb | 50 +++++++------- .../_approval_workflow_button.html.erb | 6 +- .../my/blocks/_locked_documents.html.erb | 4 +- .../my/blocks/_watched_documents.html.erb | 4 +- assets/images/filetypes/c_gray.png | Bin 437 -> 0 bytes assets/images/filetypes/csharp_gray.png | Bin 471 -> 0 bytes assets/images/filetypes/css_gray.png | Bin 452 -> 0 bytes assets/images/filetypes/doc.png | Bin 671 -> 0 bytes assets/images/filetypes/doc_gray.png | Bin 401 -> 0 bytes assets/images/filetypes/docx.png | Bin 671 -> 0 bytes assets/images/filetypes/html_gray.png | Bin 473 -> 0 bytes assets/images/filetypes/image_gray.png | Bin 416 -> 0 bytes assets/images/filetypes/java_gray.png | Bin 458 -> 0 bytes assets/images/filetypes/js_gray.png | Bin 434 -> 0 bytes assets/images/filetypes/mpp.png | Bin 717 -> 0 bytes assets/images/filetypes/mpp_gray.png | Bin 424 -> 0 bytes assets/images/filetypes/odg.png | Bin 566 -> 0 bytes assets/images/filetypes/odg_gray.png | Bin 385 -> 0 bytes assets/images/filetypes/odp.png | Bin 490 -> 0 bytes assets/images/filetypes/odp_gray.png | Bin 362 -> 0 bytes assets/images/filetypes/ods.png | Bin 427 -> 0 bytes assets/images/filetypes/ods_gray.png | Bin 348 -> 0 bytes assets/images/filetypes/odt.png | Bin 421 -> 0 bytes assets/images/filetypes/odt_gray.png | Bin 350 -> 0 bytes assets/images/filetypes/ott.png | Bin 421 -> 0 bytes assets/images/filetypes/ott_gray.png | Bin 350 -> 0 bytes assets/images/filetypes/pdf_gray.png | Bin 418 -> 0 bytes assets/images/filetypes/php_gray.png | Bin 431 -> 0 bytes assets/images/filetypes/ppt.png | Bin 775 -> 0 bytes assets/images/filetypes/ppt_gray.png | Bin 419 -> 0 bytes assets/images/filetypes/pptx.png | Bin 775 -> 0 bytes assets/images/filetypes/ruby_gray.png | Bin 446 -> 0 bytes assets/images/filetypes/vsd.png | Bin 698 -> 0 bytes assets/images/filetypes/vsd_gray.png | Bin 389 -> 0 bytes assets/images/filetypes/vsdx.png | Bin 698 -> 0 bytes assets/images/filetypes/xls.png | Bin 744 -> 0 bytes assets/images/filetypes/xls_gray.png | Bin 405 -> 0 bytes assets/images/filetypes/xlsm.png | Bin 744 -> 0 bytes assets/images/filetypes/xlsx.png | Bin 744 -> 0 bytes assets/images/filetypes/xml_gray.png | Bin 448 -> 0 bytes assets/images/filetypes/zip_gray.png | Bin 469 -> 0 bytes assets/images/folder_gray.png | Bin 312 -> 0 bytes assets/images/folder_system.png | Bin 412 -> 0 bytes .../dmsf_file_revision_format.rb | 5 +- .../hooks/views/issue_view_hooks.rb | 44 ++++++------ .../dmsf_context_menus_controller_test.rb | 6 +- 49 files changed, 94 insertions(+), 106 deletions(-) delete mode 100644 assets/images/filetypes/c_gray.png delete mode 100644 assets/images/filetypes/csharp_gray.png delete mode 100644 assets/images/filetypes/css_gray.png delete mode 100644 assets/images/filetypes/doc.png delete mode 100644 assets/images/filetypes/doc_gray.png delete mode 100644 assets/images/filetypes/docx.png delete mode 100644 assets/images/filetypes/html_gray.png delete mode 100644 assets/images/filetypes/image_gray.png delete mode 100644 assets/images/filetypes/java_gray.png delete mode 100644 assets/images/filetypes/js_gray.png delete mode 100644 assets/images/filetypes/mpp.png delete mode 100644 assets/images/filetypes/mpp_gray.png delete mode 100644 assets/images/filetypes/odg.png delete mode 100644 assets/images/filetypes/odg_gray.png delete mode 100644 assets/images/filetypes/odp.png delete mode 100644 assets/images/filetypes/odp_gray.png delete mode 100644 assets/images/filetypes/ods.png delete mode 100644 assets/images/filetypes/ods_gray.png delete mode 100644 assets/images/filetypes/odt.png delete mode 100644 assets/images/filetypes/odt_gray.png delete mode 100644 assets/images/filetypes/ott.png delete mode 100644 assets/images/filetypes/ott_gray.png delete mode 100644 assets/images/filetypes/pdf_gray.png delete mode 100644 assets/images/filetypes/php_gray.png delete mode 100644 assets/images/filetypes/ppt.png delete mode 100644 assets/images/filetypes/ppt_gray.png delete mode 100644 assets/images/filetypes/pptx.png delete mode 100644 assets/images/filetypes/ruby_gray.png delete mode 100644 assets/images/filetypes/vsd.png delete mode 100644 assets/images/filetypes/vsd_gray.png delete mode 100644 assets/images/filetypes/vsdx.png delete mode 100644 assets/images/filetypes/xls.png delete mode 100644 assets/images/filetypes/xls_gray.png delete mode 100644 assets/images/filetypes/xlsm.png delete mode 100644 assets/images/filetypes/xlsx.png delete mode 100644 assets/images/filetypes/xml_gray.png delete mode 100644 assets/images/filetypes/zip_gray.png delete mode 100644 assets/images/folder_gray.png delete mode 100644 assets/images/folder_system.png diff --git a/app/helpers/dmsf_helper.rb b/app/helpers/dmsf_helper.rb index 7b04103f..68196e59 100644 --- a/app/helpers/dmsf_helper.rb +++ b/app/helpers/dmsf_helper.rb @@ -53,19 +53,6 @@ module DmsfHelper just_filename end - def self.filetype_css(filename) - extension = File.extname(filename) - extension = extension[1, extension.length - 1] - path = File.join(Redmine::Plugin.public_directory, ['redmine_dmsf', 'images', 'filetypes', "#{extension}.png"]) - cls = if File.exist?(path) - "filetype-#{extension}" - else - Redmine::MimeType.css_class_of filename - end - cls << ' dmsf-icon-file' if cls - cls - end - def plugin_asset_path(plugin, asset_type, source) File.join('/plugin_assets', plugin.to_s, asset_type, source) end diff --git a/app/helpers/dmsf_queries_helper.rb b/app/helpers/dmsf_queries_helper.rb index bfe4aad6..37e8b552 100644 --- a/app/helpers/dmsf_queries_helper.rb +++ b/app/helpers/dmsf_queries_helper.rb @@ -32,24 +32,21 @@ module DmsfQueriesHelper when 'file' file = DmsfFile.find_by(id: item.id) if file&.locked? - return content_tag(:span, val) + - content_tag(:span, - '', - title: l(:title_locked_by_user, user: file.locked_by), - class: 'icon icon-unlock dmsf-icon-unlock') + return content_tag(:span, val) + content_tag('span', + sprite_icon('unlock', ''), + title: l(:title_locked_by_user, user: file.locked_by), + class: 'icon icon-unlock dmsf-icon-unlock') end when 'folder' folder = DmsfFolder.find_by(id: item.id) if folder&.locked? - return content_tag(:span, val) + - content_tag(:span, - '', - title: l(:title_locked_by_user, user: folder.locked_by), - class: 'icon icon-unlock dmsf-icon-unlock') + return content_tag(:span, val) + content_tag('span', + sprite_icon('unlock', ''), + title: l(:title_locked_by_user, user: folder.locked_by), + class: 'icon icon-unlock dmsf-icon-unlock') end end - content_tag(:span, val) + - content_tag(:span, '', class: 'icon icon-none') + content_tag(:span, val) + content_tag(:span, '', class: 'icon icon-none') when :id case item.type when 'file' @@ -109,9 +106,9 @@ module DmsfQueriesHelper when 'project' tag = h("[#{value}]") tag = if item.project.module_enabled?(:dmsf) - link_to tag, dmsf_folder_path(id: item.project), class: 'icon icon-folder' + link_to sprite_icon('folder', tag), dmsf_folder_path(id: item.project) else - content_tag 'span', tag, class: 'icon icon-folder' + sprite_icon 'folder', tag end unless filter_any? path = expand_folder_dmsf_path @@ -130,7 +127,7 @@ module DmsfQueriesHelper end tag += content_tag('div', item.filename, class: 'dmsf-filename', title: l(:title_filename_for_download)) if item.project.watched_by?(User.current) - tag += link_to('', + tag += link_to(sprite_icon('unlock', ''), watch_path(object_type: 'project', object_id: item.project.id), title: l(:button_unwatch), method: 'delete', @@ -139,9 +136,10 @@ module DmsfQueriesHelper tag when 'folder' if item&.deleted? - tag = content_tag('span', value, class: 'icon icon-folder') + tag = sprite_icon('folder', h(value)) else - tag = link_to(h(value), dmsf_folder_path(id: item.project, folder_id: item.id), class: 'icon icon-folder') + tag = link_to(sprite_icon('folder', h(value)), + dmsf_folder_path(id: item.project, folder_id: item.id)) unless filter_any? path = expand_folder_dmsf_path columns = params['c'] @@ -160,7 +158,7 @@ module DmsfQueriesHelper end tag += content_tag('div', item.filename, class: 'dmsf-filename', title: l(:title_filename_for_download)) if !item&.deleted? && item.watched_by?(User.current) - tag += link_to('', + tag += link_to(sprite_icon('fav', ''), watch_path(object_type: 'dmsf_folder', object_id: item.id), title: l(:button_unwatch), method: 'delete', @@ -169,32 +167,32 @@ module DmsfQueriesHelper tag when 'folder-link' if item&.deleted? - tag = content_tag('span', value, class: 'icon icon-folder') + tag = sprite_icon('folder', h(value)) else - # For links we use revision_id containing dmsf_folder.id in fact - tag = link_to(h(value), - dmsf_folder_path(id: item.project, folder_id: item.revision_id), - class: 'icon icon-folder') + # For links, we use revision_id containing dmsf_folder.id in fact + tag = link_to(sprite_icon('folder', h(value)), dmsf_folder_path(id: item.project, + folder_id: item.revision_id)) tag = content_tag('span', '', class: 'dmsf-expander') + tag unless filter_any? end tag + content_tag('div', item.filename, class: 'dmsf-filename', title: l(:label_target_folder)) when 'file', 'file-link' + icon_name = icon_for_mime_type(Redmine::MimeType.css_class_of(item.filename)) if item&.deleted? - tag = content_tag('span', value, class: "icon icon-file #{DmsfHelper.filetype_css(item.filename)}") + tag = sprite_icon(icon_name, h(value), css_class: 'icon icon-file') else - # For links we use revision_id containing dmsf_file.id in fact + # For links, we use revision_id containing dmsf_file.id in fact file_view_url = url_for( { controller: :dmsf_files, action: 'view', id: item.type == 'file' ? item.id : item.revision_id } ) content_type = Redmine::MimeType.of(item.filename) content_type = 'application/octet-stream' if content_type.blank? - options = { class: "icon icon-file #{DmsfHelper.filetype_css(item.filename)}", - 'data-downloadurl': "#{content_type}:#{h(value)}:#{file_view_url}" } + options = { class: 'icon icon-file', 'data-downloadurl': "#{content_type}:#{h(value)}:#{file_view_url}" } unless previewable?(item.filename, content_type) options[:target] = '_blank' options[:rel] = 'noopener' end - tag = link_to h(value), file_view_url, options + tag = link_to(sprite_icon(icon_name, h(value)), file_view_url, options) + tag = content_tag('span', '', class: 'dmsf-expander') + tag unless filter_any? end member = Member.find_by(user_id: User.current.id, project_id: item.project_id) @@ -202,7 +200,7 @@ module DmsfQueriesHelper filename = revision ? revision.formatted_name(member) : item.filename tag += content_tag('div', filename, class: 'dmsf-filename', title: l(:title_filename_for_download)) if (item.type == 'file') && !item&.deleted? && revision.dmsf_file&.watched_by?(User.current) - tag += link_to('', + tag += link_to(sprite_icon('fav', ''), watch_path(object_type: 'dmsf_file', object_id: item.id), title: l(:button_unwatch), method: 'delete', @@ -211,9 +209,13 @@ module DmsfQueriesHelper tag when 'url-link' if item&.deleted? - tag = content_tag('span', value, class: 'icon dmsf-icon-link') + tag = sprite_icon('link', h(value)) else - tag = link_to(h(value), item.filename, target: '_blank', rel: 'noopener', class: 'icon dmsf-icon-link') + tag = link_to(sprite_icon('link', h(value)), + item.filename, + target: '_blank', + rel: 'noopener', + class: 'icon dmsf-icon-link') tag = content_tag('span', '', class: 'dmsf-expander') + tag unless filter_any? end tag + content_tag('div', item.filename, class: 'dmsf-filename', title: l(:field_url)) diff --git a/app/views/dmsf_context_menus/_file.html.erb b/app/views/dmsf_context_menus/_file.html.erb index 978bfc7a..2dd41979 100644 --- a/app/views/dmsf_context_menus/_file.html.erb +++ b/app/views/dmsf_context_menus/_file.html.erb @@ -92,8 +92,8 @@ <% end %> <% url << dmsf_file.name %> <% end %> - <%= context_menu_link sprite_icon('edit', l(:button_edit_content)), url, - class: "icon icon-file #{DmsfHelper.filetype_css(dmsf_file.name)}", + <% icon_name = icon_for_mime_type(Redmine::MimeType.css_class_of(dmsf_file.name)) %> + <%= context_menu_link sprite_icon(icon_name, l(:button_edit_content)), url, class: 'icon icon-file', disabled: url.blank? || (locked && !unlockable) || (Setting.plugin_redmine_dmsf['dmsf_webdav_strategy'] != 'WEBDAV_READ_WRITE') %> diff --git a/app/views/dmsf_files/_link.html.erb b/app/views/dmsf_files/_link.html.erb index 46d80e5c..8b739801 100644 --- a/app/views/dmsf_files/_link.html.erb +++ b/app/views/dmsf_files/_link.html.erb @@ -22,11 +22,12 @@ <% file_view_url = url_for({ controller: :dmsf_files, action: 'view', id: dmsf_file }) %> - <%= link_to h(link ? link.name : dmsf_file.title), + <% icon_name = icon_for_mime_type(Redmine::MimeType.css_class_of(dmsf_file.name)) %> + <%= link_to sprite_icon(icon_name, h(link ? link.name : dmsf_file.title)), file_view_url, target: '_blank', rel: 'noopener', - class: "icon icon-file #{DmsfHelper.filetype_css(dmsf_file.name)}", + class: 'icon icon-file', title: h(dmsf_file.last_revision.try(:tooltip)), 'data-downloadurl' => "#{dmsf_file.last_revision.detect_content_type}:#{h(dmsf_file.name)}:#{file_view_url}" %> @@ -47,38 +48,37 @@ <% # Details %> <% if User.current.allowed_to? :file_manipulation, dmsf_file.project %> - <%= link_to '', dmsf_file_path(id: dmsf_file, back_url: issue_path(@issue)), + <%= link_to sprite_icon('edit', ''), dmsf_file_path(id: dmsf_file, back_url: issue_path(@issue)), title: l(:link_details, title: h(dmsf_file.last_revision.title)), class: 'icon-only icon-edit' %> <% else %> <% end %> <% # Email %> - <%= link_to '', entries_operations_dmsf_path(id: dmsf_file.project_id, email_entries: 'email', - ids: ["file-#{dmsf_file.id}"], back_url: issue_path(@issue)), method: :post, title: l(:heading_send_documents_by_email), - class: 'icon-only icon-email-disabled' %> + <%= link_to sprite_icon('email', ''), entries_operations_dmsf_path(id: dmsf_file.project_id, email_entries: 'email', + ids: ["file-#{dmsf_file.id}"], + back_url: issue_path(@issue)), + method: :post, title: l(:heading_send_documents_by_email), class: 'icon-only icon-email-disabled' %> <% # Lock %> <% if !dmsf_file.locked? %> - <%= link_to '', lock_dmsf_files_path(id: dmsf_file, back_url: issue_path(@issue)), - title: l(:title_lock_file), - class: 'icon-only icon-lock' %> + <%= link_to sprite_icon('lock', ''), lock_dmsf_files_path(id: dmsf_file, back_url: issue_path(@issue)), + title: l(:title_lock_file), class: 'icon-only icon-lock' %> <% elsif dmsf_file.unlockable? && (!dmsf_file.locked_for_user? || User.current.allowed_to?(:force_file_unlock, dmsf_file.project)) %> - <%= link_to '', unlock_dmsf_files_path(id: dmsf_file, back_url: issue_path(@issue)), - title: dmsf_file.locked_title, - class: 'icon-only icon-unlock' %> + <%= link_to sprite_icon('unlock', ''), unlock_dmsf_files_path(id: dmsf_file, back_url: issue_path(@issue)), + title: dmsf_file.locked_title, class: 'icon-only icon-unlock' %> <% else %> - + <%= content_tag('span', sprite_icon('unlock', ''), title: dmsf_file.locked_title) %> <% end %> <% if !dmsf_file.locked? %> <% # Notifications %> <% if dmsf_file.notification %> - <%= link_to '', notify_deactivate_dmsf_files_path(id: dmsf_file, back_url: issue_path(@issue)), - title: l(:title_notifications_active_deactivate), - class: 'icon-only icon-email' %> + <%= link_to sprite_icon('email', ''), notify_deactivate_dmsf_files_path(id: dmsf_file, + back_url: issue_path(@issue)), + title: l(:title_notifications_active_deactivate), class: 'icon-only icon-email' %> <% else %> - <%= link_to '', notify_activate_dmsf_files_path(id: dmsf_file, back_url: issue_path(@issue)), - title: l(:title_notifications_not_active_activate), - class: 'icon-only icon-email-add' %> + <%= link_to sprite_icon('email-disabled', ''), notify_activate_dmsf_files_path(id: dmsf_file, + back_url: issue_path(@issue)), + title: l(:title_notifications_not_active_activate), class: 'icon-only icon-email-add' %> <% end %> <% else %> @@ -88,12 +88,12 @@ <% if @issue.attributes_editable? && ((link && User.current.allowed_to?(:file_manipulation, dmsf_file.project)) || (!link && User.current.allowed_to?(:file_delete, dmsf_file.project))) %> - <%= link_to '', - link ? dmsf_link_path(link, commit: 'yes', back_url: issue_path(@issue)) : dmsf_file_path(id: dmsf_file, commit: 'yes', back_url: issue_path(@issue)), - data: { confirm: l(:text_are_you_sure) }, - method: :delete, - title: l(:button_delete), - class: 'icon-only icon-del' %> + <% url = if link + dmsf_link_path(link, commit: 'yes', back_url: issue_path(@issue)) + else + dmsf_file_path(id: dmsf_file, commit: 'yes', back_url: issue_path(@issue)) + end %> + <%= delete_link url %> <% end %> <% # Approval workflow %> <% wf = DmsfWorkflow.find_by(id: dmsf_file.last_revision.dmsf_workflow_id) if dmsf_file.last_revision.dmsf_workflow_id %> diff --git a/app/views/dmsf_workflows/_approval_workflow_button.html.erb b/app/views/dmsf_workflows/_approval_workflow_button.html.erb index fd32d199..92c76931 100644 --- a/app/views/dmsf_workflows/_approval_workflow_button.html.erb +++ b/app/views/dmsf_workflows/_approval_workflow_button.html.erb @@ -26,7 +26,7 @@ <% assignments = wf.next_assignments(file.last_revision.id) %> <% index = assignments.find_index{|assignment| assignment.user_id == User.current.id} if assignments %> <% if assignments && index %> - <%= link_to '', + <%= link_to sprite_icon('checked', ''), action_dmsf_workflow_path(project_id: project.id, id: wf.id, dmsf_workflow_step_assignment_id: assignments[index].id, dmsf_file_revision_id: file.last_revision.id, @@ -42,7 +42,7 @@ <% end %> <% when DmsfWorkflow::STATE_ASSIGNED %> <% if User.current && (file.last_revision.dmsf_workflow_assigned_by_user == User.current) && wf %> - <%= link_to '', + <%= link_to sprite_icon('checked', ''), start_dmsf_workflow_path(id: file.last_revision.dmsf_workflow_id, dmsf_file_revision_id: file.last_revision.id, back_url: back_url), @@ -55,7 +55,7 @@ <% else %> <% if workflows_available %> - <%= link_to '', + <%= link_to sprite_icon('checked', ''), dmsf_link_id ? assign_dmsf_workflow_path(id: project.id, project_id: project.id, dmsf_link_id: dmsf_link_id, back_url: back_url) : diff --git a/app/views/my/blocks/_locked_documents.html.erb b/app/views/my/blocks/_locked_documents.html.erb index ad06e514..ba1695b9 100644 --- a/app/views/my/blocks/_locked_documents.html.erb +++ b/app/views/my/blocks/_locked_documents.html.erb @@ -95,8 +95,8 @@ <%= link_to_project file.project %> - <%= link_to h(file.title), dmsf_file_path(id: file), - class: "icon icon-file #{DmsfHelper.filetype_css(file.name)}" %> + <% icon_name = icon_for_mime_type(Redmine::MimeType.css_class_of(file.name)) %> + <%= link_to sprite_icon(icon_name, h(file.title)), dmsf_file_path(id: file), class: 'icon icon-file' %> <% if file.dmsf_folder %> diff --git a/app/views/my/blocks/_watched_documents.html.erb b/app/views/my/blocks/_watched_documents.html.erb index fffc1dc3..cdccdcad 100644 --- a/app/views/my/blocks/_watched_documents.html.erb +++ b/app/views/my/blocks/_watched_documents.html.erb @@ -108,8 +108,8 @@ <%= link_to_project(file.project) if file.project %> - <%= link_to h(file.title), dmsf_file_path(id: file), - class: "icon icon-file #{DmsfHelper.filetype_css(file.name)}" %> + <% icon_name = icon_for_mime_type(Redmine::MimeType.css_class_of(file.name)) %> + <%= link_to sprite_icon(icon_name, h(file.title)), dmsf_file_path(id: file), class: 'icon icon-file' %> <% if file.dmsf_folder %> diff --git a/assets/images/filetypes/c_gray.png b/assets/images/filetypes/c_gray.png deleted file mode 100644 index 6edaf869b5474f1a122f4f5ff90fa0fb63f35511..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 437 zcmV;m0ZRUfP)Px#0%A)?L;(MXkIcUS000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^h<5Cj3+ zyKTh)00B8kL_t(2&s~wdN&`_4g}-}u6ANP?jX_jM5K$prASpyF(g@bJ0iQy#un`|1 zpoP|X0DFA`8}01;Ys3^Wnx9R`-aQt(YT}t{n2(vm86&_fk;h|NEnXD?LQo!d#xB%f z4RzL_fK>ui#;&Kn`s(XbA9`1)H=Q>qU=bK9p#qH*C{R}&wG?Wgo-P^`j5t|oA8*$o z%K}A2$cS8G#IO3N<+bZfPB=QWSjFLyrb9%?JYZ)Jvbme99d^kO5a8kAlP1Ls0CsV2 z$nz~gjUr$Y#3vOWaX_ydU)%z~U@^aO*!Cl2*W;$iQ-Xkpje&>DF`M-l`ZW0>LI`0{ zvcZV`!;Pct+=!48HTWHY#jhqo-Rmw1c|1{}sQ58k(vL4Q`LGBqNJK6m;=dv{z!?E% fnS5e;T8`E?PTixckS}2k00000NkvXXu0mjfj7_NS diff --git a/assets/images/filetypes/csharp_gray.png b/assets/images/filetypes/csharp_gray.png deleted file mode 100644 index 6c27ebc12247b29714ce661a3799ef005fef2f70..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 471 zcmV;|0Vw{7P)Px#0%A)?L;(MXkIcUS000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^h<5Cj@g z-lQo200CP`L_t(2&t1{KYf}Lf#qrO3mIf*jf?_LH8)^|NI29u3Ak^8>wctPCDlRVK z&@rHc&Mu-zcZ)xYI0#PJ95NI^8nB5rKN|DiyAH2n>-Q{oINZxUCkZ6;W*u{sj_oKA zf|dQ=B+ufX_TzC=T^a|5#w72@AO9y7 z$J3^I5*}UXJy>0%>a_DhX2TgvHr+CJb!vTO`OS%12z|R2<#r_MJ{dcOw0f^r+uB%l z(~RGGUi)a;dtJHbNEdF8wLimkXZ>(e#Yn}BIZH?jg~49=dPBvuv5Rs&i>@H;wW(by z4KKa5tPx#0%A)?L;(MXkIcUS000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^h<5C{+* zz5+V{00BrzL_t(2&t1^5YEuCe#_`|1xm5}#3Ms8Z0&&wtDoO&K1V<4CU!a}DLHZ01 zPF)Nr;vn`Nvg+Uil;|s%NHK7+V$)kmZjM6|wf?{1EFb5b?@Izn!-k5pjC_e1LU8N! zXi`q&uTJA-S4$cTLwiyl$2i6@jvw(ozQr^S<5gEnDoC`aQN*t(qKKby6r-5NNgT(U zu2vH6RX*Q&`~JX+uUL1(rppqLb&}ol@if_M7&@nl91Yjp7S?5*%#*dfZMlI>g}yDh zx}J&-NIkpjlYMoCzJWCZJ$$sXFjVKUd-`tL@(w$=Ae(<-|HIC|XKOgNC7oLT**vB|KD>$vWwa!^z{}^P0?1j)|J<9=W*K@TaJyCjV#}+L@(q-pq2$ unUNA!bY7!200;0000Px$EKp2TMgIW*0Wx?fK5Ymuiv>1<2t0@eLYoOovLQ^GI$D@ATed1V+0I%&8~ zYNtSEv_xvTRc)kQb*pE7vqEmfNp#Focgj_J&R>1QSbouWikxnazjBbja*@Awlf8PC zyL*+qewVscfXG>a##n;IU4+D5gv4Nh&0&bcVu{0Lio$1$!D)=aY>vQZiq&_K)qI!O zf||UAoxX#d+JK(sh@ilWqQZ=#!i%Kck*CI&tjUnB)}67! zyx*$6@vp$xv%}iA$n?q5;?~^i(&GBmipsC z{NwHX+=2W^ZoDi{qXYo@b>=l_x|+w{`L9(_xk?%`~Uy{|8ts| zXaE2J0d!JMQvg8b*k%9#00Cl4M??UK1szBL000SaNLh0L01FcU01FcV0GgZ_00007 zbV*G`2ipY`6C4vl$S~&s007@fL_t&-(>;#YRsul`K!Xf36v4#;Dn$lVte|uqSqmt2 zfd$sCAo>4)U<2xX%f06$0RVWsyS=%-D&?evCH2|Qbn^Z6A(4!(R|^-JozSN5T_PDB ze-UrCuuZj=PdC#>up(Y10RYdSG+u1y?QYxJ)GCvB=rU(ZPN)IS1}vG!Q*g!jAv|002ovPDHLk FV1mPx#0%A)?L;(MXkIcUS000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^h<5Csw6 z7fj#)009+AL_t(2&sEUBP84wz#qrN>CcK5EjfIT`hQy5x78X|8kXTv5BlrZ?Xl*nh z!3Qu_3#&Z^6|n#cC`dH&XTjN-o!_x=qU<@%P44&JoSXqLNv-YOXf@av_^)x=G?}H& zO|CP|W|GZ7^(i!t9Jn+!bK}B0uue7x6)!AmRr+b2RE@DiCtmvKl{c0VyzQZC=B`7X zC1;pBL9B_0ZNn>fT>Ig>V-x3|s{3UWR5gC$i!+~{x{nxRB#Pk$emVCX2VSEQkB#~t z!x|Gy?%{zaXvMCtB0AL+`(UrnJy$&HQ*^4|RzVFKE#eziM5pijeV+YGo?HH)`U`X- vb`~0asF*JTqlN1tw}CAbMW<5~b49@)qFbU1MYb`?00000NkvXXu0mjf(D9$6 diff --git a/assets/images/filetypes/docx.png b/assets/images/filetypes/docx.png deleted file mode 100644 index 8cca68cd195aefc21978dbc5798f6c7c23feb424..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 671 zcmV;Q0$}}#P)Px$EKp2TMgIW*0Wx?fK5Ymuiv>1<2t0@eLYoOovLQ^GI$D@ATed1V+0I%&8~ zYNtSEv_xvTRc)kQb*pE7vqEmfNp#Focgj_J&R>1QSbouWikxnazjBbja*@Awlf8PC zyL*+qewVscfXG>a##n;IU4+D5gv4Nh&0&bcVu{0Lio$1$!D)=aY>vQZiq&_K)qI!O zf||UAoxX#d+JK(sh@ilWqQZ=#!i%Kck*CI&tjUnB)}67! zyx*$6@vp$xv%}iA$n?q5;?~^i(&GBmipsC z{NwHX+=2W^ZoDi{qXYo@b>=l_x|+w{`L9(_xk?%`~Uy{|8ts| zXaE2J0d!JMQvg8b*k%9#00Cl4M??UK1szBL000SaNLh0L01FcU01FcV0GgZ_00007 zbV*G`2ipY`6C4vl$S~&s007@fL_t&-(>;#YRsul`K!Xf36v4#;Dn$lVte|uqSqmt2 zfd$sCAo>4)U<2xX%f06$0RVWsyS=%-D&?evCH2|Qbn^Z6A(4!(R|^-JozSN5T_PDB ze-UrCuuZj=PdC#>up(Y10RYdSG+u1y?QYxJ)GCvB=rU(ZPN)IS1}vG!Q*g!jAv|002ovPDHLk FV1mPx#0%A)?L;(MXkIcUS000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^h<5Cl6N zx3qTv00CV|L_t(2&sEV+YExkphVkEbdy`b#+JvGh)zCnoPLvKJir@xxDjkXwL7WH< z9J>Lr6m;Su9J+#TpgI$(C06iK$z-aRSathN>db<&uVw{9xob!~Ub$Uy=8s)n zsmlr-WhE7mgoia5wx#Cve7C40l`4%ORuY*5f0fP19I4CxdrInC|7NhSWY2FES7fS~ z5=V&mdEc?rz_eMH)cmk4jMpSS{rpl=H=}IMbv+AONF<}et4(jWwmYWHsoPc2wj>Aw z2vG=Y&t81ok*R8GS-KE5Oz)3e-0Ao730Zl}V_x*T+94t|)W^ul6b}CZ4R(@S#%pi) P00000NkvXXu0mjf?T^Nx diff --git a/assets/images/filetypes/image_gray.png b/assets/images/filetypes/image_gray.png deleted file mode 100644 index 2c6d6edb2ec4ec83ca7593b818f4a6ec08369ced..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 416 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf67>k44ofy`glX(f`FeQ1ryD>1lag0jfAcNO;GW4aSYKoA3AZj zA5)-+>vc&t4ugY7oTTJc!fs_aIVC-9kBItV>SlQBqSWK%5w{~&cQV#2Xk<)#b}#o} z%7MMNYtLEn3nxUIXnu@mj(ftWm~q~1<>@V7e9U8`SWYp|z0zxX(M9<0i|E?as_VJa z#TsK{ulOJTnl(j;DdEkfv}Ts`cfbBr-TUu?|CTSytE9vaDmGNWrKO1o*b1bPgxXs=9hC+mRhHC6s37t9)HsK^6=k{)~j4OQ&}X| zPURFUbyNSmdcMY+7c2@7?`~<(dm7tg%(%^WbHln*hCi4;FWlIwYxrjkFbEkuUHx3v IIVCg!0H*Vt-v9sr diff --git a/assets/images/filetypes/java_gray.png b/assets/images/filetypes/java_gray.png deleted file mode 100644 index e8ae43c3e9b896522685ab1e5f40147480a97c68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 458 zcmV;*0X6=KP)Px#0%A)?L;(MXkIcUS000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^h<5CtO_ zz#U)!00B-(L_t(2&t=a)Yg2I)#_`YZ=0=i+nppo-gO-4cL+zko1qEM#xQM%>n=it> zgo19);;4f!pg0M-b#M_u@K2gZsx)oN&ArE=0V(~S@q7=@c~T%d9g*+$zewn8YL|@h8SHh*|uM7n^#roY&Vj9&KkKR4BEz(DwLg?nytr zd3bK)Qm=*NNE#Vgbr$67dAq;5^1(ZQ6=-O?>xOOD&0Ih}Udh}xH1bulsHUV)ZTxtKGp7A>@3OUDg(c*X-bmh*~=7Cy7!>}c7RIZs-DLDI?2~_ z*!r~=l9NPx#0%A)?L;(MXkIcUS000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^h<5CQ7XhTCa7yS!u(a_M`)X*dZ zLJe&#HMP~)7PM3}2Q9UTLZqcWU%vNFgYT7g&TyB{z4zQ}1ejTp#28kcHwAzY6uOO` z@9EE79al(WDFli=zooX?YOARa)#RzFlL~1p1css~N3I+>`cgx6dFrU8(+X)Lwqmy{ z=Qqz}xdSH2kRgEqz%H4ixOPn$;%sn*OM)gY1r`ZNV3%xmOc@~0G!x_)C(bpG*kl2) zIOtz>4~P^s9{2>F7zu%~!Q(G+StbX3V~4=mAh1q?F0Viqs~?knrr3lO(B&cwInPqq zV(nGk?U%y^^5O1xW>{mD(Qv}=qaybP?1`dH#PvTDmA(S7KqBxR0{$!TJNQO`nIjpk c9FkA{2h}8;vc1q(0RR9107*qoM6N<$g1t4Ya{vGU diff --git a/assets/images/filetypes/mpp.png b/assets/images/filetypes/mpp.png deleted file mode 100644 index 91814977ca3162ca6d43c38e884f9b28bcd75039..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 717 zcmV;;0y6!HP)Px$O;Ai!MgIW*H%l=&PBS@AGdxo@JykY8SvWykIzwJOLS;HbW;{h=Jw|0eNohez zYC%bCK}>E#Om9O>Z$wUVMp0}{P<2UEcuZM-QC)#mVTM^|i(X-cVQG$HWRh-glxJ#^ zYH^oocb#u|o^X4ZczvXGex!A7j=yq{zjBekc9Xq&mAiYDyndIuRe;D@fyP*Z#a)EN zUWCM9h{Ixu!)1!XXN$pUjKOS~^q(Am(^;`-F% z`qt$7*X8@!=KI^{``qaJ-s$_`>EGz==Wl^7sDq`2O|z{`dO+`TPI>|Nql~eO&+m00DGTPE!Ct=GbNc0004E zOGiWihy@);00009a7bBm000XU000XU0RWnu7ytkO2XskIMF-mj6B8iR#=P`E z5nd2KR);}C-j>lfJ<4C2JHgd8Hd2d0%uawYJ<3bjn;j@08KKD_m=_>#?PV{W#~SDA z8WFC}zy-7`Kw2a(j|nIr9%jxUEG)#w!@}8A`QRWukbtGOwx))fnTe5szOF6++m$+g-zmAh00000NkvXXu0mjf-<4Q^ diff --git a/assets/images/filetypes/mpp_gray.png b/assets/images/filetypes/mpp_gray.png deleted file mode 100644 index 2095c3ec3267c2fd5b609ada7fea6df25912cb6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 424 zcmV;Z0ayNsP)Px#0%A)?L;(MXkIcUS000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^h<5C{cu zW9HBR00AsXL_t(2&sEU9Y86ow#qr-A1}rS>v=;=ixU~v~_)!TFYhNIN#0T&Ne1Zf7 zBZx(aHiAXUd?+G98{LU)zzQ zi)pkmiQjP+s}ZppP``>K`R=n;tI?Qx0hWoCQQcc~;)CSAyI@HSxywX7#ky`-QihBgMz$Ua`p7q=N zSALU$++BfMt+pwv)@9J$B{X7$Xc1sk;Pq_*-}lk)_y3~NXy8Nk63B50jTj+X1XSSV zj6kJQL9f@_lzP36_vQtV=Mow*LaeC3^J#%{xx8hd+wIEVd1s7*T$j*zrvgj21RTd< z@t;(yRpj-vAm1f46AjD@aEJ3eEYNvZ+Qad><~NB<&6qFye?2E6y)*giT(II zc@!I|Q8XV-AX=-!d36%=@d2>M4!iuV0_kf4wrwMdA}k&omVxGC0@3$1tmuc4nH<0u zeF*Ha!!CcTKE|-%>SHF+^*dc_?b-YaK~yNu zZP3dqMR63z@z2qwPDxROkz8sI+&U(NWN74)cQ|F_IXr-zsTa^0V5BW3QZ5-Fq?Can zL)!ngfwQ-x{MKx(Z@=|htCXqjsQT5J)#_XA*aBXv1EtJ%w%jy-bbD{nutV)^lp=zl zzW`dL@m*rk(ht%?kjjecG-@OcNq7oN;j#dl)n&|Z9Fp*~In@9{lS77X6NciDZ1oc5 z4yhx1TFqP0rpKfZKkS()GVI$oqvFP^D>Z!vh3SSvz=<(k%GO;w_a*Na4xi{S>(rT8 zkV$hOm151iX?3?ol?8b}%CDF=XV-^u5mH%WMR7%o3(q(PWg07@JOdS#rgvq3fy95x ff%?I+|5fK3&rE%L2Zp#W00000NkvXXu0mjfAorpT diff --git a/assets/images/filetypes/odp.png b/assets/images/filetypes/odp.png deleted file mode 100644 index 3552512002a32ede080859f03728e3830ccdf6b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 490 zcmVX>}A)?5_!VZdpIwnSdpDg7w>T|G0;|{VI52YjirD zSUx^UK>i1UCD=kFfS7{kr!|_*CZZ_%i}`$xe!q_okFPcIO)&@Gp69iVFl0gFc=JQ zb8`n4{+rkr(4#|_yD7MSNTE4nJ za0`PlBg3pY5H=O_WSI7?8ZX%_tv%mg?@XwIEHAP&z-Q)?{I=h>;8X|Y}3vv z33gQR1h)t{c^ONYuw9<;iEj^6nfEs?l_%efoMC#`rpYBfXq!H}^lVw@jNqNzulYk0nvYMk!UwTXn0-C*=m_ zrH;+Lx#v8S*KWDya{oW8NNW2Om1|zFKPj-VyskVlWpl*p%drw`^kObvxGK|o+FeaC zf#ZA5+UwhUEFb>d&@3Rs8W6DI2!rEG1t}Th1%EqRG%XCIL=K;5oHIvN?0`Xr{8c5f z14=OlEH9N>UdMHdCf$A1xNnX8kA%ri2mZt!ORN0BDto^xUWH-KdSEaxc)I$ztaD0e F0s!o0iZK8H diff --git a/assets/images/filetypes/ods.png b/assets/images/filetypes/ods.png deleted file mode 100644 index 7fac192dea936a2461c595c51b14a8052ee77239..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 427 zcmV;c0aX5pP)+AqfegA)#4VE?hW>DC57VC_3#= z?-|68#EDuw@V>t1J7WYu#Cp)T0wEk>jdQlZn8)9Og4KJCdc8i=*;@>9cZDUQ!WSS@ zaHmnJRN(vm52MittyT-CuLqEfD=ZNezAyzVHyWi<3B%!VCjOJ-mmNsX6_$vKPg8KM zQ79BJ7z{#ro`=KdElAcC7T-+@majDO`8@jl{;$gAGWMS~AbD38o>w$9^ z-iyT|b|2TdJClN?3yo|xi*C0I&L3azG(89RPN&0cu$zK&g-j+B965*JotWir3KmZk z9LGVs-3DiVk)~(fiCONZ;7B2zPNUguf^!JoiCONZU?HYp+cp}F1~~JJG(Gc9%yKsc zdkU#k3bk4doI~(V%yKsc^V4nJ za0`PlBg3pY5H=O_WSI7?8fFMw<-?g(?a~H*56jE`S_~e0thSL_dzZ`{Gdwd01d3|}yGe5JNRGrJT-2U$B?|mP1 z?w|f%pp^XMfaL$mrzN|j?2376{AW)r%oX4Hy*zH;i;d@ncN_F;E#TnIpF6`MW6{cQ zU)>wIII^!~U&$yIQJEO>>(fTlfGM&`QI0~M@A(gkhGopvTf5-oPq~oI@@`Lz7k0O7 zXO#_?I5gv)k6fs_YNE ztko1GRi+}`&8#n-A8SFE|9QLN=eOl?@N; zSZ5`?5VyX+HL~o=fkTFmK3c50s&%J(IaJz?A@+LU%8+A+Kx)tRN9eQ#tz`NB zWu5T7Uo%qOdC$C4mg-#;q04nJ za0`PlBg3pY5H=O_WSI7>?X1c6x1#Oh2DF*IEHAP&+Rw#c1jd!n_peHX~()g zKHl>Dl_!;a@>v8$IDGvco&O+j66(E0f`dzmMUZv-#+3_K9$b1>{z1igOTK&E^W*ou zFFSX*^1iUdTlQURz8-yAaPQv|zCXO#jfJ_}&;4tj9^ZHK@zhueRz(db)pD1~D%V2N zXT5N06qv$uHg`&9QIx{{{|v4-7rH6~B_`K$I11z(7UWdlxa4`LhNyUz-^FUBa}$2l z9!lhsDCbLXXjQ()_ldjdVq&mAN0;!&7mTYlr#PGl$g_DcljmTkL`B0-!SHiMJRABV rY7IZ_`_Lf2ZKa0g+xQK!!4XWtzp73hVAlu+dY!@3)z4*}Q$iB}Y)*xJ diff --git a/assets/images/filetypes/ott.png b/assets/images/filetypes/ott.png deleted file mode 100644 index cf6986d8ce3abce662d883b11135fcbf66476462..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 421 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKV9fD!aSW-rHT9gWw^O1FYr#eR zLi-+P5f=eh0Y?@`7kwvICntRqAlPEU!6s_TqTATm(sDty-P(hXFV1Dk>)k6fs_YNE ztko1GRi+}`&8#n-A8SFE|9QLN=eOl?@N; zSZ5`?5VyX+HL~o=fkTFmK3c50s&%J(IaJz?A@+LU%8+A+Kx)tRN9eQ#tz`NB zWu5T7Uo%qOdC$C4mg-#;q04nJ za0`PlBg3pY5H=O_WSI7>?X1c6x1#Oh2DF*IEHAP&+Rw#c1jd!n_peHX~()g zKHl>Dl_!;a@>v8$IDGvco&O+j66(E0f`dzmMUZv-#+3_K9$b1>{z1igOTK&E^W*ou zFFSX*^1iUdTlQURz8-yAaPQv|zCXO#jfJ_}&;4tj9^ZHK@zhueRz(db)pD1~D%V2N zXT5N06qv$uHg`&9QIx{{{|v4-7rH6~B_`K$I11z(7UWdlxa4`LhNyUz-^FUBa}$2l z9!lhsDCbLXXjQ()_ldjdVq&mAN0;!&7mTYlr#PGl$g_DcljmTkL`B0-!SHiMJRABV rY7IZ_`_Lf2ZKa0g+xQK!!4XWtzp73hVAlu+dY!@3)z4*}Q$iB}Y)*xJ diff --git a/assets/images/filetypes/pdf_gray.png b/assets/images/filetypes/pdf_gray.png deleted file mode 100644 index 7ee708a6a7def1d6aaa44d311542fefcd28b3d86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 418 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf67>k44ofy`glX(f`FeQ1ryD>1lUb4DxKO4G(pYN#W6(VeCWiz zUe1mJt^4opHs=&FX;SHR;*!?wy^(2UxOb`4g+qE<=k_Zw=GHWbgxNK1T|2jR(E>%r zlkz{6cT3LR`&}(PVO4&bMe!7dtjSD_r?Wom7CQ)N`0g@JS6$h8=ep*iqs;8a*QdKz zPF?tAiL&m-OHYTb;#^Z743BkI3RU(*27@jSU zHj7X{uJ_b+!9lb4B^J-7h)1#X{7GYO-|6^ta`dJKhR_B6$KuVODu+f|?o@fb*CoH} z?e603*Q@VMJdzi5B=N0(dzq$=cG#NPd>WdJSHxP6d}xw+Tkm65RZ|`RF9H~d44$rj JF6*2UngC@Ro$>$x diff --git a/assets/images/filetypes/php_gray.png b/assets/images/filetypes/php_gray.png deleted file mode 100644 index 6ef833889eb3f7e408e160730ee2e3272e776a80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 431 zcmV;g0Z{&lP)Px#0%A)?L;(MXkIcUS000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^h<5CkNU zzqx_{00A>eL_t(2&s~teOG0rJ#XsNYlLo0FP$7z(b1LCUR8UK61O@#I4KA(X5RT#? z6x0^@FEqCHCj>!@wnPqP*002ovPDHLkV1j$fuk!!^ diff --git a/assets/images/filetypes/ppt.png b/assets/images/filetypes/ppt.png deleted file mode 100644 index 06f3a26c19f5b6ce48a6c8c7eacc1b971ea9e0a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 775 zcmV+i1Ni)jP)Px$hEPmYMgIW*Rtyhz8WemW7;cWga*)4rk-v76y?T|qdzHL?m%3Ge$XS8LSc1h} zgv4Hi#9@fTVu{0Lio$1$!D)=aY>vQyBpib%9)>F|h%6zEF(r^RCz3TSk~S`xJS>qn zFp)YlkvlZ7IWM9_Go(i}uSYqmOgOJlJG@UXvQs^sT}ZHBM7LN$xLQKJUPZrQNZDB{ zz+p(kWlO_mOUG+Z$ZJo*bX&}EQ_OKx(05qTcUaYYT-AMC^?O3ufM3~xVB3RY?t)bC zl3VbRT=1P;@SI-gk81FdXYiJ2@Rn=vmum2vXYiSE@Stz-rE2h|bb^|^g`K{Lpumfw z!i=KAk*CI&tjUnB)}67ff@9_5i^7sDq`2O|z{`dO+|NHm(`~Uy^`v3j=|Ns9zIkk%b0004WQchC7p z82|tP?MXyIR2b7^U|?W~iHeK}3k?qB;$nb+=(?Kfs>+H|u11iEgM+=brG<%+zFrAe zBS^%dFh>Ge;E}JKZlFKTrnXr&fVQtMlL@*JSUTb!BpEdKGw(6Sz8JypP9kVV4SV$;^*O{ zlr5ec9-fiT%3#=-Z6+^kmfgqPx#0%A)?L;(MXkIcUS000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^h<5Ctn4 z8hj&aB!sbRW;`$pYIw zlsX%B3=J@6!7GjMR0!dXlpT9*(v-&@nsV%Je+(6=HEGF&-zH=kSHcmNg(_vUPRz=N ziVO383Xjyj<4(5bom1zE&Rc8#2p@eGLXol=FYWjyEZQ}rQ7!c=ic~z;x;Cxx)q9Or z_<}{D=>NSRPyQ{BF&{{Ofg*$t#Px$hEPmYMgIW*Rtyhz8WemW7;cWga*)4rk-v76y?T|qdzHL?m%3Ge$XS8LSc1h} zgv4Hi#9@fTVu{0Lio$1$!D)=aY>vQyBpib%9)>F|h%6zEF(r^RCz3TSk~S`xJS>qn zFp)YlkvlZ7IWM9_Go(i}uSYqmOgOJlJG@UXvQs^sT}ZHBM7LN$xLQKJUPZrQNZDB{ zz+p(kWlO_mOUG+Z$ZJo*bX&}EQ_OKx(05qTcUaYYT-AMC^?O3ufM3~xVB3RY?t)bC zl3VbRT=1P;@SI-gk81FdXYiJ2@Rn=vmum2vXYiSE@Stz-rE2h|bb^|^g`K{Lpumfw z!i=KAk*CI&tjUnB)}67ff@9_5i^7sDq`2O|z{`dO+|NHm(`~Uy^`v3j=|Ns9zIkk%b0004WQchC7p z82|tP?MXyIR2b7^U|?W~iHeK}3k?qB;$nb+=(?Kfs>+H|u11iEgM+=brG<%+zFrAe zBS^%dFh>Ge;E}JKZlFKTrnXr&fVQtMlL@*JSUTb!BpEdKGw(6Sz8JypP9kVV4SV$;^*O{ zlr5ec9-fiT%3#=-Z6+^kmfgqPx#0%A)?L;(MXkIcUS000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^h<5C#O9 z=ljS200BZtL_t(2&t=g)Yf}Lf#_`|1xgj)m2o&0iQDSlEtPm$Rmu{kq(AiOu3T~nw z!C*7^AspPDT>SuAu=uh_(xMfU+?d>(Eom$a?P)oPVGLs!KjTOAqKI$N?Py5_iFOfr{Ej^G_!TG7k0M4fh?gC$ zB52n& zdul3kH1B2H*7VwC2Ub0{A`z!2z#UER)a_YWfH}&R;qQ8*t$yYue+?nw<{4;4N`zUN ooB0oyBV`guF4|aLb4sQD9~V84gr;|EsQ>@~07*qoM6N<$f+M-RGXMYp diff --git a/assets/images/filetypes/vsd.png b/assets/images/filetypes/vsd.png deleted file mode 100644 index 9af5be18da475e1440b7b6f19f1632738a33827e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 698 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 diff --git a/assets/images/filetypes/xlsm.png b/assets/images/filetypes/xlsm.png deleted file mode 100644 index 0f227dc1c814a917f91a3a01b9d1baecfa6b18a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 744 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 "#{revision.detect_content_type}:#{h(revision.dmsf_file.name)}:#{file_view_url}" ) diff --git a/lib/redmine_dmsf/hooks/views/issue_view_hooks.rb b/lib/redmine_dmsf/hooks/views/issue_view_hooks.rb index b601061e..eb90059f 100644 --- a/lib/redmine_dmsf/hooks/views/issue_view_hooks.rb +++ b/lib/redmine_dmsf/hooks/views/issue_view_hooks.rb @@ -211,16 +211,17 @@ module RedmineDmsf def attachment_row(dmsf_file, link, issue, controller) html = link ? +'' : +'' # Checkbox - show_checkboxes = true # options[:show_checkboxes].nil? ? true : options[:show_checkboxes] - html << '' if show_checkboxes + html << '' file_view_url = url_for({ controller: :dmsf_files, action: 'view', id: dmsf_file }) # Title, size html << '' data = "#{dmsf_file.last_revision.detect_content_type}:#{h(dmsf_file.name)}:#{file_view_url}" - html << link_to(h(dmsf_file.title), file_view_url, + icon_name = icon_for_mime_type(Redmine::MimeType.css_class_of(item.filename)) + html << link_to(sprite_icon(icon_name, h(dmsf_file.title)), + file_view_url, target: '_blank', rel: 'noopener', - class: "icon icon-file #{DmsfHelper.filetype_css(dmsf_file.name)}", + class: 'icon icon-file', title: h(dmsf_file.last_revision.try(:tooltip)), 'data-downloadurl' => data) html << "(#{number_to_human_size(dmsf_file.last_revision.size)})" @@ -235,39 +236,41 @@ module RedmineDmsf html << '' # Details html << if User.current.allowed_to? :file_manipulation, dmsf_file.project - link_to '', dmsf_file_path(id: dmsf_file), + link_to sprite_icon('edit', ''), dmsf_file_path(id: dmsf_file), title: l(:link_details, title: h(dmsf_file.last_revision.title)), class: 'icon icon-edit' else '' end # Email - html << link_to('', entries_operations_dmsf_path(id: dmsf_file.project, - email_entries: 'email', - files: [dmsf_file.id]), - method: :post, - title: l(:heading_send_documents_by_email), class: 'icon icon-email-disabled') + html << link_to(sprite_icon('email', ''), + entries_operations_dmsf_path(id: dmsf_file.project, email_entries: 'email', + files: [dmsf_file.id]), + method: :post, title: l(:heading_send_documents_by_email), class: 'icon icon-email-disabled') # Lock html << if !dmsf_file.locked? - link_to '', lock_dmsf_files_path(id: dmsf_file), - title: l(:title_lock_file), - class: 'icon icon-lock' + link_to sprite_icon('lock', ''), lock_dmsf_files_path(id: dmsf_file), + title: l(:title_lock_file), class: 'icon icon-lock' elsif dmsf_file.unlockable? && (!dmsf_file.locked_for_user? || User.current.allowed_to?(:force_file_unlock, dmsf_file.project)) - link_to '', unlock_dmsf_files_path(id: dmsf_file), + link_to sprite_icon('unlock', ''), unlock_dmsf_files_path(id: dmsf_file), title: dmsf_file.locked_title, class: 'icon icon-unlock' else - "" + content_tag 'span', + sprite_icon('unlock', ''), + title: dmsf_file.locked_title, + class: 'icon icon-unlock' end if dmsf_file.locked? html << ('' * 2) else # Notifications html << if dmsf_file.notification - link_to '', notify_deactivate_dmsf_files_path(id: dmsf_file), + link_to sprite_icon('email', ''), notify_deactivate_dmsf_files_path(id: dmsf_file), title: l(:title_notifications_active_deactivate), class: 'icon icon-email' else - link_to '', notify_activate_dmsf_files_path(id: dmsf_file), + link_to sprite_icon('email-disabled', ''), + notify_activate_dmsf_files_path(id: dmsf_file), title: l(:title_notifications_not_active_activate), class: 'icon icon-email-add' end # Delete @@ -279,12 +282,7 @@ module RedmineDmsf else dmsf_file_path id: dmsf_file, commit: 'yes', back_url: issue_path(issue) end - html << link_to('', - url, - data: { confirm: l(:text_are_you_sure) }, - method: :delete, - title: l(:button_delete), - class: 'icon icon-del') + html << delete_link(url) end end # Approval workflow diff --git a/test/functional/dmsf_context_menus_controller_test.rb b/test/functional/dmsf_context_menus_controller_test.rb index 9dec8a1c..29a99a86 100644 --- a/test/functional/dmsf_context_menus_controller_test.rb +++ b/test/functional/dmsf_context_menus_controller_test.rb @@ -168,7 +168,7 @@ class DmsfContextMenusControllerTest < RedmineDmsf::Test::TestCase with_settings plugin_redmine_dmsf: { 'dmsf_webdav' => '1', 'dmsf_webdav_strategy' => 'WEBDAV_READ_WRITE' } do get '/projects/dmsf/context_menu', params: { id: @file1.project.id, ids: ["file-#{@file1.id}"] } assert_response :success - assert_select 'a.dmsf-icon-file', text: l(:button_edit_content) + assert_select 'a.icon-file', text: l(:button_edit_content) end end @@ -177,7 +177,7 @@ class DmsfContextMenusControllerTest < RedmineDmsf::Test::TestCase with_settings plugin_redmine_dmsf: { 'dmsf_webdav' => nil } do get '/projects/dmsf/context_menu', params: { id: @file1.project.id, ids: ["file-#{@file1.id}"] } assert_response :success - assert_select 'a:not(dmsf-icon-file)' + assert_select 'a:not(icon-file)' end end @@ -186,7 +186,7 @@ class DmsfContextMenusControllerTest < RedmineDmsf::Test::TestCase with_settings plugin_redmine_dmsf: { 'dmsf_webdav' => '1', 'dmsf_webdav_strategy' => 'WEBDAV_READ_ONLY' } do get '/projects/dmsf/context_menu', params: { id: @file1.project.id, ids: ["file-#{@file1.id}"] } assert_response :success - assert_select 'a.dmsf-icon-file.disabled', text: l(:button_edit_content) + assert_select 'a.icon-file.disabled', text: l(:button_edit_content) end end