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 %>