diff --git a/app/assets/javascripts/attachments.js b/app/assets/javascripts/attachments.js
index 0d823a63f..4c74b2d74 100644
--- a/app/assets/javascripts/attachments.js
+++ b/app/assets/javascripts/attachments.js
@@ -45,13 +45,10 @@ function addFile(inputEl, file, eagerUpload) {
addFile.nextAttachmentId = 1;
function ajaxUpload(file, attachmentId, fileSpan, inputEl) {
- let attachmentIcon = $(fileSpan).find('svg.svg-attachment');
function onLoadstart(e) {
fileSpan.removeClass('ajax-waiting');
fileSpan.addClass('ajax-loading');
- attachmentIcon.addClass('svg-loader');
- updateSVGIcon(attachmentIcon[0], 'loader')
$('input:submit', $(this).parents('form')).attr('disabled', 'disabled');
}
@@ -79,8 +76,6 @@ function ajaxUpload(file, attachmentId, fileSpan, inputEl) {
}).always(function() {
ajaxUpload.uploading--;
fileSpan.removeClass('ajax-loading');
- attachmentIcon.removeClass('svg-loader');
- updateSVGIcon(attachmentIcon[0], 'attachment');
var form = fileSpan.parents('form');
if (form.queue('upload').length == 0 && ajaxUpload.uploading == 0) {
$('input:submit', form).removeAttr('disabled');
@@ -92,7 +87,6 @@ function ajaxUpload(file, attachmentId, fileSpan, inputEl) {
var progressSpan = $('').insertAfter(fileSpan.find('input.filename'));
progressSpan.progressbar();
fileSpan.addClass('ajax-waiting');
- updateSVGIcon(attachmentIcon[0], 'hourglass');
var maxSyncUpload = $(inputEl).data('max-concurrent-uploads');
diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css
index 45a062e1e..e3c4b8158 100644
--- a/app/assets/stylesheets/application.css
+++ b/app/assets/stylesheets/application.css
@@ -1161,6 +1161,20 @@ span.required {color: #bb0000;}
padding-left: 3px;
padding-right: 0;
}
+.attachments_fields .ajax-waiting {
+ padding-left: 16px;
+ background:url(/hourglass-empty.svg) no-repeat 0px 50%;
+}
+.attachments_fields .ajax-waiting .svg-attachment {
+ display: none;
+}
+.attachments_fields .ajax-loading {
+ padding-left: 16px;
+ background: url(/loading.gif) no-repeat 0px 50%;
+}
+.attachments_fields .ajax-loading .svg-attachment {
+ display: none;
+}
a.remove-upload:hover {text-decoration:none !important;}
.existing-attachment.deleted .filename {text-decoration:line-through; color:#999 !important;}
@@ -1352,13 +1366,14 @@ opacity: 0.5;
html>body #ajax-indicator { position: fixed; }
-#ajax-indicator:not(:has(svg)) span {
- background-position: 0% 40%;
- background-repeat: no-repeat;
- background-image: url(/loading.gif);
- padding-left: 26px;
- vertical-align: bottom;
+#ajax-indicator span {
+background-position: 0% 40%;
+background-repeat: no-repeat;
+background-image: url(/loading.gif);
+padding-left: 26px;
+vertical-align: bottom;
}
+
/***** Calendar *****/
ul.cal {
list-style: none;
@@ -2163,19 +2178,6 @@ span.icon-label {
.sort-handle.ajax-loading { background-image: url(/loading.gif); }
tr.ui-sortable-helper { border:1px solid #e4e4e4; }
-svg.svg-loader {
- animation: spin 1s linear infinite;
- transform-origin: center;
-}
-
-@keyframes spin {
- 0% {
- transform: rotate(0deg);
- }
- 100% {
- transform: rotate(360deg);
- }
-}
.contextual>*:not(:first-child), .buttons>.icon:not(:first-child), .contextual .journal-actions>*:not(:first-child) { margin-left: 5px; }
diff --git a/app/views/attachments/_form.html.erb b/app/views/attachments/_form.html.erb
index 11c3ebf76..e5b10fb55 100644
--- a/app/views/attachments/_form.html.erb
+++ b/app/views/attachments/_form.html.erb
@@ -10,8 +10,6 @@
<%= sprite_icon('del', icon_only: true, css_class: 'svg-del') %>
<%= sprite_icon('attachment', icon_only: true, size: 16, css_class: 'svg-attachment') %>
- <%= sprite_icon('loader', icon_only: true, size: 16, css_class: 'svg-loader') %>
- <%= sprite_icon('hourglass', icon_only: true, size: 16, css_class: 'svg-hourglass') %>
<% if saved_attachments.present? %>
diff --git a/app/views/layouts/base.html.erb b/app/views/layouts/base.html.erb
index 4b7b401c1..9e2ef51b5 100644
--- a/app/views/layouts/base.html.erb
+++ b/app/views/layouts/base.html.erb
@@ -127,11 +127,7 @@
Powered by <%= link_to Redmine::Info.app_name, Redmine::Info.url, :target => '_blank', :rel => 'noopener' %> © 2006-2025 Jean-Philippe Lang
-
-
- <%= sprite_icon 'loader', l(:label_loading), css_class: 'svg-loader' %>
-
-
+<%= l(:label_loading) %>
<%= sprite_icon('') %>
diff --git a/config/icon_source.yml b/config/icon_source.yml
index 1e4c2ae09..b6349461f 100644
--- a/config/icon_source.yml
+++ b/config/icon_source.yml
@@ -237,8 +237,4 @@
svg: message-report
- name: quote-filled
svg: quote
- style: filled
-- name: loader
- svg: loader-2
-- name: hourglass
- svg: hourglass
\ No newline at end of file
+ style: filled
\ No newline at end of file