diff --git a/app/components/media_asset_gallery_component.rb b/app/components/media_asset_gallery_component.rb
index b33725c86..84cdd0797 100644
--- a/app/components/media_asset_gallery_component.rb
+++ b/app/components/media_asset_gallery_component.rb
@@ -3,14 +3,15 @@
class MediaAssetGalleryComponent < ApplicationComponent
DEFAULT_SIZE = 180
- attr_reader :inline, :size, :options
+ attr_reader :inline, :size, :classes
renders_many :media_assets
renders_one :footer
- def initialize(inline: false, size: DEFAULT_SIZE)
+ def initialize(inline: false, size: DEFAULT_SIZE, classes: [])
super
@inline = inline
@size = size
+ @classes = classes
end
end
diff --git a/app/components/media_asset_gallery_component/media_asset_gallery_component.html.erb b/app/components/media_asset_gallery_component/media_asset_gallery_component.html.erb
index b94be1dc5..8b3f33859 100644
--- a/app/components/media_asset_gallery_component/media_asset_gallery_component.html.erb
+++ b/app/components/media_asset_gallery_component/media_asset_gallery_component.html.erb
@@ -1,4 +1,4 @@
-
+<% end %>
diff --git a/app/components/media_asset_preview_component.rb b/app/components/media_asset_preview_component.rb
index c8bb35f7e..021aeff9a 100644
--- a/app/components/media_asset_preview_component.rb
+++ b/app/components/media_asset_preview_component.rb
@@ -5,7 +5,7 @@
class MediaAssetPreviewComponent < ApplicationComponent
DEFAULT_SIZE = 180
- attr_reader :media_asset, :size, :link_target, :classes, :save_data
+ attr_reader :media_asset, :size, :link_target, :classes, :html, :save_data
delegate :duration_to_hhmmss, :sound_icon, to: :helpers
renders_one :header
@@ -17,12 +17,13 @@ class MediaAssetPreviewComponent < ApplicationComponent
# @param link_target [ApplicationRecord] What the thumbnail links to (default: the media asset).
# @param save_data [Boolean] If true, save data by not serving higher quality thumbnails
# on 2x pixel density displays. Default: false.
- def initialize(media_asset:, size: DEFAULT_SIZE, link_target: media_asset, classes: [], save_data: CurrentUser.save_data)
+ def initialize(media_asset:, size: DEFAULT_SIZE, link_target: media_asset, classes: [], html: {}, save_data: CurrentUser.save_data)
super
@media_asset = media_asset
@size = size.presence&.to_i || DEFAULT_SIZE
@link_target = link_target
@classes = classes
+ @html = html
@save_data = save_data
end
diff --git a/app/components/media_asset_preview_component/media_asset_preview_component.html.erb b/app/components/media_asset_preview_component/media_asset_preview_component.html.erb
index daaea96f6..62ce73ffb 100644
--- a/app/components/media_asset_preview_component/media_asset_preview_component.html.erb
+++ b/app/components/media_asset_preview_component/media_asset_preview_component.html.erb
@@ -1,4 +1,4 @@
-<%= tag.article class: ["media-asset-preview media-asset-preview-#{size}", *classes] do -%>
+<%= tag.article class: ["media-asset-preview media-asset-preview-#{size}", *classes], **html do -%>
<%= link_to link_target, class: "inline-block relative", draggable: "false" do -%>
<%= header %>
diff --git a/app/javascript/src/javascripts/uploads.js b/app/javascript/src/javascripts/uploads.js
index 95359399c..c3d39d340 100644
--- a/app/javascript/src/javascripts/uploads.js
+++ b/app/javascript/src/javascripts/uploads.js
@@ -1,3 +1,5 @@
+import Utility from "./utility";
+
let Upload = {};
Upload.IQDB_LIMIT = 5;
@@ -22,6 +24,17 @@ Upload.initialize_all = function() {
if ($("#c-uploads #a-batch").length) {
$(document).on("click.danbooru", "#c-uploads #a-batch #link", Upload.batch_open_all);
}
+
+ Upload.loadAssets();
+}
+
+Upload.loadAssets = async function() {
+ while ($(".upload-media-asset-loading").length) {
+ let ids = $(".upload-media-asset-loading").map((i, el) => $(el).attr("data-id")).toArray().join(",");
+ let size = $(".upload-media-asset-gallery").attr("data-size");
+ $.get("/upload_media_assets.js", { search: { status: "active failed", id: ids }, size: size });
+ await Utility.delay(250);
+ }
}
Upload.initialize_similar = function() {
diff --git a/app/models/upload_media_asset.rb b/app/models/upload_media_asset.rb
index 911b65725..5d50f59af 100644
--- a/app/models/upload_media_asset.rb
+++ b/app/models/upload_media_asset.rb
@@ -29,6 +29,10 @@ class UploadMediaAsset < ApplicationRecord
q.apply_default_order(params)
end
+ def loading?
+ pending? || processing?
+ end
+
def finished?
active? || failed?
end
diff --git a/app/views/upload_media_assets/_gallery.html.erb b/app/views/upload_media_assets/_gallery.html.erb
index 0b4092375..0c8b90bb3 100644
--- a/app/views/upload_media_assets/_gallery.html.erb
+++ b/app/views/upload_media_assets/_gallery.html.erb
@@ -1,4 +1,4 @@
-<%= render(MediaAssetGalleryComponent.new) do |gallery| %>
+<%= render(MediaAssetGalleryComponent.new(classes: ["upload-media-asset-gallery"])) do |gallery| %>
<% upload_media_assets.each do |upload_media_asset| %>
<% gallery.media_asset do %>
<%= render "upload_media_assets/preview", upload_media_asset: upload_media_asset, size: gallery.size %>
diff --git a/app/views/upload_media_assets/_preview.html.erb b/app/views/upload_media_assets/_preview.html.erb
index a3f5b24fb..5de0761c0 100644
--- a/app/views/upload_media_assets/_preview.html.erb
+++ b/app/views/upload_media_assets/_preview.html.erb
@@ -1,6 +1,6 @@
<% media_asset = upload_media_asset.media_asset %>
-<%= render MediaAssetPreviewComponent.new(media_asset: media_asset, size: size, link_target: [upload_media_asset.upload, upload_media_asset]) do |preview| %>
+<%= render MediaAssetPreviewComponent.new(media_asset: media_asset, size: size, link_target: [upload_media_asset.upload, upload_media_asset], classes: ["upload-media-asset-preview", ("upload-media-asset-loading" if upload_media_asset.loading?)], html: { "data-id": upload_media_asset.id }) do |preview| %>
<% preview.missing_image do %>
<% if upload_media_asset.failed? %>
Failed
diff --git a/app/views/upload_media_assets/index.js.erb b/app/views/upload_media_assets/index.js.erb
new file mode 100644
index 000000000..188506e5d
--- /dev/null
+++ b/app/views/upload_media_assets/index.js.erb
@@ -0,0 +1,3 @@
+<% @upload_media_assets.each do |upload_media_asset| %>
+ $(".upload-media-asset-preview[data-id=<%= upload_media_asset.id %>]").replaceWith("<%= j render("upload_media_assets/preview", upload_media_asset: upload_media_asset, size: params.fetch(:size, 180)) %>");
+<% end %>
diff --git a/app/views/uploads/_multiple_asset_upload.html.erb b/app/views/uploads/_multiple_asset_upload.html.erb
index e11b1e934..87cad91ba 100644
--- a/app/views/uploads/_multiple_asset_upload.html.erb
+++ b/app/views/uploads/_multiple_asset_upload.html.erb
@@ -1,4 +1,4 @@
-<%= render(MediaAssetGalleryComponent.new) do |gallery| %>
+<%= render(MediaAssetGalleryComponent.new(classes: ["upload-media-asset-gallery"])) do |gallery| %>
<% upload.upload_media_assets.order(id: :asc).each do |upload_media_asset| %>
<% gallery.media_asset do %>
<%= render "upload_media_assets/preview", upload_media_asset: upload_media_asset, size: gallery.size %>