uploads: add thumbnail view to /uploads listing.

Add a thumbnail view to the /uploads listing. You can click on images to
resume the upload, or go to the post if it's already been posted.
This commit is contained in:
evazion
2022-02-02 01:35:20 -06:00
parent 92a4d045e2
commit 054b0b4d0a
5 changed files with 133 additions and 70 deletions

View File

@@ -29,10 +29,19 @@ class UploadsController < ApplicationController
end
def index
@uploads = authorize Upload.visible(CurrentUser.user).paginated_search(params, count_pages: true)
@uploads = @uploads.includes(:uploader, :media_assets) if request.format.html?
@mode = params.fetch(:mode, "table")
respond_with(@uploads)
case @mode
when "table"
@uploads = authorize Upload.visible(CurrentUser.user).paginated_search(params, count_pages: true)
@uploads = @uploads.includes(:uploader, media_assets: [:post]) if request.format.html?
respond_with(@uploads)
when "gallery"
@media_assets = authorize MediaAsset.distinct.visible(CurrentUser.user).joins(:uploads).where(uploads: { uploader: CurrentUser.user }).paginated_search(params, count_pages: true)
respond_with(@media_assets)
else
raise "Invalid mode '#{mode}'"
end
end
def show

View File

@@ -0,0 +1,33 @@
<div class="flex items-center mb-2">
<h1 class="flex-1">My Uploads</h1>
<span>
<strong>Gallery</strong> |
<%= link_to "Table", uploads_path(mode: "table") %>
</span>
</div>
<%= render(MediaAssetGalleryComponent.new) do |gallery| %>
<% @media_assets.each do |media_asset| %>
<% gallery.media_asset(media_asset: media_asset, size: gallery.size, link_target: media_asset.post || media_asset.uploads.first) do |preview| %>
<% preview.footer do %>
<div class="text-center text-muted text-xs h-12">
<% if media_asset.post.present? %>
<div class="leading-none">
<%= link_to "post ##{media_asset.post.id}", media_asset.post, class: "leading-none" %>
</div>
<% end %>
<% if media_asset.uploads.first.source.present? %>
<%= external_link_to media_asset.uploads.first.source, Addressable::URI.parse(media_asset.uploads.first.source).domain %>
<% else %>
<em>No source</em>
<% end %>
</div>
<% end %>
<% end %>
<% end %>
<% end %>
<%= numbered_paginator(@media_assets) %>

View File

@@ -1,7 +1,7 @@
<% content_for(:secondary_links) do %>
<%= subnav_link_to "New Upload", new_upload_path %>
<%= subnav_link_to "Batch Upload", batch_uploads_path %> |
<%= subnav_link_to "My Uploads", uploads_path %>
<%= subnav_link_to "My Uploads", uploads_path(mode: "gallery") %>
<%= subnav_link_to "All Uploads", media_assets_path %>
<%= subnav_link_to "Reverse Image Search", iqdb_queries_path %> |
<%= subnav_link_to "Help", wiki_page_path("help:upload") %>

View File

@@ -0,0 +1,83 @@
<div class="flex items-center mb-2">
<h1 class="flex-1">My Uploads</h1>
<span>
<%= link_to "Gallery", uploads_path(mode: "gallery") %> |
<strong>Table</strong>
</span>
</div>
<%= table_for @uploads, class: "striped autofit", width: "100%" do |t| %>
<% t.column "Upload", td: { class: "text-center" } do |upload| %>
<% upload.media_assets.first.tap do |media_asset| %>
<% if media_asset.present? %>
<% if media_asset.post.present? %>
<%= render MediaAssetPreviewComponent.new(media_asset: media_asset, link_target: media_asset.post, save_data: CurrentUser.save_data, shrink_to_fit: false) %>
<% else %>
<%= render MediaAssetPreviewComponent.new(media_asset: media_asset, link_target: upload, save_data: CurrentUser.save_data, shrink_to_fit: false) %>
<% end %>
<% end %>
<% end %>
<% end %>
<% t.column "Info", td: { class: "col-expand" } do |upload| %>
<div>
<% upload.media_assets.first.tap do |media_asset| %>
<% if media_asset&.post.present? %>
<strong>Post</strong>
<span><%= link_to "##{media_asset.post.id}", media_asset.post %></span>
<% else %>
<strong>Upload</strong>
<span><%= link_to "##{upload.id}", upload %></span>
<% end %>
<% end %>
</div>
<div>
<strong>Source</strong>
<span>
<% if upload.source.present? %>
<%= external_link_to upload.source %>
<%= link_to "»", uploads_path(mode: "table", search: params[:search].merge(source_like: upload.source)) %>
<% else %>
<em>none</em>
<% end %>
</span>
</div>
<% if upload.referer_url.present? %>
<div>
<strong>Referrer</strong>
<span>
<%= external_link_to upload.referer_url %>
<%= link_to "»", uploads_path(mode: "table", search: params[:search].merge(referer_url: upload.referer_url)) %>
</span>
</div>
<% end %>
<% if upload.is_errored? %>
<div>
<strong>Error</strong>
<span>
<%= upload.status.delete_prefix("error: ") %>
</span>
</div>
<% end %>
<% end %>
<% t.column "Uploader" do |upload| %>
<%= link_to_user upload.uploader %>
<%= link_to "»", uploads_path(mode: "table", search: params[:search].merge(uploader_name: upload.uploader.name)) %>
<div><%= time_ago_in_words_tagged upload.created_at %></div>
<% end %>
<% t.column :status do |upload| %>
<% if upload.is_errored? %>
error
<% elsif !upload.is_completed? %>
<%= upload.status %>
<% end %>
<% end %>
<% end %>
<%= numbered_paginator(@uploads) %>

View File

@@ -1,72 +1,10 @@
<div id="c-uploads">
<div id="a-index">
<%= search_form_for(uploads_path) do |f| %>
<%= f.input :uploader_name, label: "Uploader", input_html: { value: params[:search][:uploader_name], data: { autocomplete: "user" } } %>
<%= f.input :source_like, label: "Source", input_html: { value: params[:search][:source_like] } %>
<%= f.input :status_like, label: "Status", collection: [%w[Completed completed], %w[Processing processing], %w[Pending pending], %w[Error error*]], include_blank: true, selected: params[:search][:status_like] %>
<%= f.submit "Search" %>
<% if @mode == "gallery" %>
<%= render "uploads/gallery" %>
<% elsif @mode == "table" %>
<%= render "uploads/table" %>
<% end %>
<%= table_for @uploads, class: "striped autofit" do |t| %>
<% t.column "File", td: { class: "text-center" } do |upload| %>
<% upload.media_assets.first.tap do |media_asset| %>
<% if media_asset.present? %>
<%= render MediaAssetPreviewComponent.new(media_asset: media_asset, link_target: upload, save_data: CurrentUser.save_data, shrink_to_fit: false) %>
<% end %>
<% end %>
<% end %>
<% t.column "Info", td: {class: "upload-info"} do |upload| %>
<div>
<strong>Upload</strong>
<span><%= link_to "##{upload.id}", upload %></span>
</div>
<div>
<strong>Source</strong>
<span>
<% if upload.source.present? %>
<%= external_link_to upload.source %>
<%= link_to "»", uploads_path(search: params[:search].merge(source_like: upload.source)) %>
<% else %>
<em>none</em>
<% end %>
</span>
</div>
<% if upload.referer_url.present? %>
<div>
<strong>Referrer</strong>
<span>
<%= external_link_to upload.referer_url %>
<%= link_to "»", uploads_path(search: params[:search].merge(referer_url: upload.referer_url)) %>
</span>
</div>
<% end %>
<% if upload.is_errored? %>
<div>
<strong>Error</strong>
<span>
<%= upload.status.delete_prefix("error: ") %>
</span>
</div>
<% end %>
<% end %>
<% t.column "Uploader" do |upload| %>
<%= link_to_user upload.uploader %>
<%= link_to "»", uploads_path(search: params[:search].merge(uploader_name: upload.uploader.name)) %>
<div><%= time_ago_in_words_tagged upload.created_at %></div>
<% end %>
<% t.column :status do |upload| %>
<%= upload.is_errored? ? "error" : upload.status %>
<% end %>
<% end %>
<%= numbered_paginator(@uploads) %>
</div>
</div>