diff --git a/app/assets/javascripts/attachments.js b/app/assets/javascripts/attachments.js
index 4c74b2d74..0d823a63f 100644
--- a/app/assets/javascripts/attachments.js
+++ b/app/assets/javascripts/attachments.js
@@ -45,10 +45,13 @@ 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');
}
@@ -76,6 +79,8 @@ 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');
@@ -87,6 +92,7 @@ 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 e3c4b8158..51332d53e 100644
--- a/app/assets/stylesheets/application.css
+++ b/app/assets/stylesheets/application.css
@@ -1161,20 +1161,6 @@ 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;}
@@ -2178,6 +2164,19 @@ 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 e5b10fb55..11c3ebf76 100644
--- a/app/views/attachments/_form.html.erb
+++ b/app/views/attachments/_form.html.erb
@@ -10,6 +10,8 @@
<%= 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/config/icon_source.yml b/config/icon_source.yml
index b6349461f..1e4c2ae09 100644
--- a/config/icon_source.yml
+++ b/config/icon_source.yml
@@ -237,4 +237,8 @@
svg: message-report
- name: quote-filled
svg: quote
- style: filled
\ No newline at end of file
+ style: filled
+- name: loader
+ svg: loader-2
+- name: hourglass
+ svg: hourglass
\ No newline at end of file