From 093a808a3618a4f73cb2327b10b976a27cbc7e7f Mon Sep 17 00:00:00 2001 From: evazion Date: Fri, 18 Feb 2022 00:14:47 -0600 Subject: [PATCH] Fix #4986: Add ability to filter images in /media_assets and /uploads depending on if they have become posts --- .../upload_media_assets_controller.rb | 9 ++++++- app/controllers/uploads_controller.rb | 4 ++- app/javascript/src/styles/base/010_reset.scss | 3 +++ app/javascript/src/styles/base/040_colors.css | 4 +++ .../src/styles/common/utilities.scss | 10 +++++++ app/models/media_asset.rb | 6 +++++ app/models/upload.rb | 27 ++++++++++++++----- app/models/upload_media_asset.rb | 19 +++++++++++-- app/views/media_assets/index.html.erb | 15 +++++++---- .../upload_media_assets/_gallery.html.erb | 2 +- .../upload_media_assets/_preview.html.erb | 12 +++------ app/views/upload_media_assets/index.html.erb | 21 ++++++++++----- .../uploads/_multiple_asset_upload.html.erb | 7 ----- app/views/uploads/_preview.html.erb | 19 +++++-------- app/views/uploads/index.html.erb | 23 +++++++++------- app/views/uploads/show.html.erb | 12 +-------- 16 files changed, 121 insertions(+), 72 deletions(-) delete mode 100644 app/views/uploads/_multiple_asset_upload.html.erb diff --git a/app/controllers/upload_media_assets_controller.rb b/app/controllers/upload_media_assets_controller.rb index b225e7190..c7f74d59c 100644 --- a/app/controllers/upload_media_assets_controller.rb +++ b/app/controllers/upload_media_assets_controller.rb @@ -4,7 +4,14 @@ class UploadMediaAssetsController < ApplicationController respond_to :html, :xml, :json, :js def index - @upload_media_assets = authorize UploadMediaAsset.visible(CurrentUser.user).includes(media_asset: :post, upload: :uploader).where(upload: { uploader: CurrentUser.user }).paginated_search(params, count_pages: true) + @defaults = { upload_id: params[:upload_id] } + @defaults[:order] = "id_asc" if params[:upload_id].present? + @limit = params.fetch(:limit, 200).to_i.clamp(0, PostSets::Post::MAX_PER_PAGE) + @preview_size = params[:size].presence || cookies[:post_preview_size].presence || MediaAssetGalleryComponent::DEFAULT_SIZE + + @upload = Upload.find(params[:upload_id]) if params[:upload_id].present? + @upload_media_assets = authorize UploadMediaAsset.visible(CurrentUser.user).includes(:post, :media_asset, upload: :uploader).paginated_search(params, limit: @limit, count_pages: true, defaults: @defaults) + respond_with(@upload_media_assets) end diff --git a/app/controllers/uploads_controller.rb b/app/controllers/uploads_controller.rb index aac128285..febff59bf 100644 --- a/app/controllers/uploads_controller.rb +++ b/app/controllers/uploads_controller.rb @@ -38,7 +38,7 @@ class UploadsController < ApplicationController @preview_size = params[:size].presence || cookies[:post_preview_size].presence || MediaAssetGalleryComponent::DEFAULT_SIZE @uploads = authorize Upload.visible(CurrentUser.user).paginated_search(params, limit: @limit, count_pages: true, defaults: @defaults) - @uploads = @uploads.includes(:uploader, media_assets: :post, upload_media_assets: { media_asset: :post }) if request.format.html? + @uploads = @uploads.includes(:uploader, :posts, upload_media_assets: :media_asset) if request.format.html? respond_with(@uploads, include: { upload_media_assets: { include: :media_asset }}) end @@ -50,6 +50,8 @@ class UploadsController < ApplicationController if request.format.html? && @upload.media_asset_count == 1 && @upload.media_assets.first&.post.present? flash[:notice] = "Duplicate of post ##{@upload.media_assets.first.post.id}" redirect_to @upload.media_assets.first.post + elsif request.format.html? && @upload.media_asset_count > 1 + redirect_to [@upload, UploadMediaAsset] else respond_with(@upload, include: { upload_media_assets: { include: :media_asset }}) end diff --git a/app/javascript/src/styles/base/010_reset.scss b/app/javascript/src/styles/base/010_reset.scss index 794cc6ebf..ec7fe3ab4 100644 --- a/app/javascript/src/styles/base/010_reset.scss +++ b/app/javascript/src/styles/base/010_reset.scss @@ -12,6 +12,9 @@ html, body { *, ::before, ::after { box-sizing: border-box; + border-width: 0; + border-style: solid; + border-color: var(--default-border-color); } body, h1, h2, h3, h4, h5, h6, p, ul, ol, li, blockquote, dl, dd, menu, input { diff --git a/app/javascript/src/styles/base/040_colors.css b/app/javascript/src/styles/base/040_colors.css index c46846baa..d392ff5be 100644 --- a/app/javascript/src/styles/base/040_colors.css +++ b/app/javascript/src/styles/base/040_colors.css @@ -114,6 +114,8 @@ html { --link-color: var(--blue-5); --link-hover-color: var(--blue-3); + --default-border-color: var(--grey-1); + --error-background-color: var(--red-1); --success-background-color: var(--green-0); --target-background: var(--yellow-0); @@ -330,6 +332,8 @@ body[data-current-user-theme="dark"] { --link-color: var(--azure-4); --link-hover-color: var(--azure-3); + --default-border-color: var(--grey-7); + --error-background-color: var(--red-9); --success-background-color: var(--green-9); --target-background: var(--azure-8); diff --git a/app/javascript/src/styles/common/utilities.scss b/app/javascript/src/styles/common/utilities.scss index b2e4c3333..35b2ed496 100644 --- a/app/javascript/src/styles/common/utilities.scss +++ b/app/javascript/src/styles/common/utilities.scss @@ -61,6 +61,11 @@ $spacer: 0.25rem; /* 4px */ .border, %border { border-width: 1px; } +.border-b { border-bottom-width: 1px; } +.border-b-2 { border-bottom-width: 0.5 * $spacer; } + +.border-current { border-color: currentColor; } + .rounded-sm, %rounded-sm { border-radius: 0.5 * $spacer; } .rounded, %rounded { border-radius: 1 * $spacer; } .rounded-lg, %rounded-lg { border-radius: 2 * $spacer; } @@ -91,6 +96,8 @@ $spacer: 0.25rem; /* 4px */ .mb-4 { margin-bottom: 4 * $spacer; } .mb-8 { margin-bottom: 8 * $spacer; } +.-mb-px { margin-bottom: -1px; } + .ml-4 { margin-left: 4 * $spacer; } .p-0 { padding: 0; } @@ -112,6 +119,8 @@ $spacer: 0.25rem; /* 4px */ .pt-4 { padding-top: 4 * $spacer; } .pt-8 { padding-top: 8 * $spacer; } +.pb-2 { padding-bottom: 2 * $spacer; } + .pr-2 { padding-right: 2 * $spacer; } .pr-4 { padding-right: 4 * $spacer; } @@ -171,6 +180,7 @@ $spacer: 0.25rem; /* 4px */ .flex-initial { flex: 0 1 auto; } .flex-grow-1 { flex-grow: 1; } .flex-col { flex-direction: column; } +.flex-wrap { flex-wrap: wrap; } .items-start { align-items: flex-start; } .items-center { align-items: center; } diff --git a/app/models/media_asset.rb b/app/models/media_asset.rb index 07ab58878..a9105e29c 100644 --- a/app/models/media_asset.rb +++ b/app/models/media_asset.rb @@ -188,6 +188,12 @@ class MediaAsset < ApplicationRecord q = q.joins(:media_metadata).merge(MediaMetadata.search(metadata: params[:metadata])) end + if params[:is_posted].to_s.truthy? + q = q.where.associated(:post) + elsif params[:is_posted].to_s.falsy? + q = q.where.missing(:post) + end + q.apply_default_order(params) end end diff --git a/app/models/upload.rb b/app/models/upload.rb index 5b1d19e78..539e1e7aa 100644 --- a/app/models/upload.rb +++ b/app/models/upload.rb @@ -1,6 +1,7 @@ # frozen_string_literal: true class Upload < ApplicationRecord + extend Memoist class Error < StandardError; end attr_accessor :file @@ -8,6 +9,7 @@ class Upload < ApplicationRecord belongs_to :uploader, class_name: "User" has_many :upload_media_assets, dependent: :destroy has_many :media_assets, through: :upload_media_assets + has_many :posts, through: :media_assets normalize :source, :normalize_source @@ -72,7 +74,14 @@ class Upload < ApplicationRecord end def self.search(params) - q = search_attributes(params, :id, :created_at, :updated_at, :source, :referer_url, :status, :media_asset_count, :uploader, :upload_media_assets, :media_assets) + q = search_attributes(params, :id, :created_at, :updated_at, :source, :referer_url, :status, :media_asset_count, :uploader, :upload_media_assets, :media_assets, :posts) + + if params[:is_posted].to_s.truthy? + q = q.where.not(id: Upload.where.missing(:posts)) + elsif params[:is_posted].to_s.falsy? + q = q.where(id: Upload.where.missing(:posts)) + end + q.apply_default_order(params) end @@ -96,9 +105,8 @@ class Upload < ApplicationRecord update!(upload_media_assets: [upload_media_asset], status: "completed", media_asset_count: 1) elsif source.present? - strategy = Sources::Strategies.find(source, referer_url) - page_url = strategy.page_url - image_urls = strategy.image_urls + page_url = source_strategy.page_url + image_urls = source_strategy.image_urls if image_urls.empty? raise Error, "#{source} doesn't contain any images" @@ -116,7 +124,14 @@ class Upload < ApplicationRecord update!(status: "error", error: e.message) end - def self.available_includes - [:uploader, :upload_media_assets, :media_assets] + def source_strategy + return nil if source.blank? + Sources::Strategies.find(source, referer_url) end + + def self.available_includes + [:uploader, :upload_media_assets, :media_assets, :posts] + end + + memoize :source_strategy end diff --git a/app/models/upload_media_asset.rb b/app/models/upload_media_asset.rb index 0b3e8c659..3521dd2b7 100644 --- a/app/models/upload_media_asset.rb +++ b/app/models/upload_media_asset.rb @@ -5,6 +5,7 @@ class UploadMediaAsset < ApplicationRecord belongs_to :upload belongs_to :media_asset, optional: true + has_one :post, through: :media_asset after_create :async_process_upload! after_save :update_upload_status, if: :saved_change_to_status? @@ -25,8 +26,22 @@ class UploadMediaAsset < ApplicationRecord end def self.search(params) - q = search_attributes(params, :id, :created_at, :updated_at, :status, :source_url, :page_url, :error, :upload, :media_asset) - q.apply_default_order(params) + q = search_attributes(params, :id, :created_at, :updated_at, :status, :source_url, :page_url, :error, :upload, :media_asset, :post) + + if params[:is_posted].to_s.truthy? + q = q.where.associated(:post) + elsif params[:is_posted].to_s.falsy? + q = q.where.missing(:post) + end + + case params[:order] + when "id_desc" + q = q.order(id: :desc) + when "id_asc" + q = q.order(id: :asc) + else + q.apply_default_order(params) + end end def loading? diff --git a/app/views/media_assets/index.html.erb b/app/views/media_assets/index.html.erb index 8512bd58a..7d204cefd 100644 --- a/app/views/media_assets/index.html.erb +++ b/app/views/media_assets/index.html.erb @@ -1,11 +1,8 @@
-
-

All Uploads

- <%= render PreviewSizeMenuComponent.new(current_size: @preview_size) %> -
+

All Uploads

- <% if params[:search].present? %> + <% if search_params[:metadata].present? %> <%= search_form_for(media_assets_path) do |f| %> <%= f.simple_fields_for :metadata do |meta| %> <% params.dig(:search, :metadata).to_h.each do |key, value| %> @@ -17,6 +14,14 @@ <% end %> <% end %> +
+ <%= link_to "All", current_page_path(search: search_params.to_h.without("is_posted")), class: ["inline-block p-1 pb-2", (search_params[:is_posted].nil? ? "border-current border-b-2 -mb-px" : "inactive-link")] %> + <%= link_to "Posted", current_page_path(search: { is_posted: true }), class: ["inline-block p-1 pb-2", (search_params[:is_posted].to_s.truthy? ? "border-current border-b-2 -mb-px" : "inactive-link")] %> + <%= link_to "Unposted", current_page_path(search: { is_posted: false }), class: ["inline-block p-1 pb-2", (search_params[:is_posted].to_s.falsy? ? "border-current border-b-2 -mb-px" : "inactive-link")] %> + + <%= render PreviewSizeMenuComponent.new(current_size: @preview_size) %> +
+ <% if params[:mode] == "table" %> <%= render "media_assets/table" %> <% else %> diff --git a/app/views/upload_media_assets/_gallery.html.erb b/app/views/upload_media_assets/_gallery.html.erb index 0c8b90bb3..152f0cc88 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(classes: ["upload-media-asset-gallery"])) do |gallery| %> +<%= render(MediaAssetGalleryComponent.new(classes: ["upload-media-asset-gallery"], size: size)) 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 5de0761c0..3eb46bfe4 100644 --- a/app/views/upload_media_assets/_preview.html.erb +++ b/app/views/upload_media_assets/_preview.html.erb @@ -10,18 +10,12 @@ <% end %> <% preview.footer do %> -
- <% if media_asset&.post.present? %> +
+ <% if upload_media_asset.post.present? %>
- <%= link_to "post ##{media_asset.post.id}", media_asset.post, class: "leading-none" %> + <%= link_to "post ##{upload_media_asset.post.id}", upload_media_asset.post, class: "leading-none" %>
<% end %> - - <% if upload_media_asset.source_url.present? %> - <%= external_link_to upload_media_asset.source_url, Addressable::URI.parse(upload_media_asset.source_url).domain %> - <% else %> - No source - <% end %>
<% end %> <% end %> diff --git a/app/views/upload_media_assets/index.html.erb b/app/views/upload_media_assets/index.html.erb index bc9bd8b71..690718e50 100644 --- a/app/views/upload_media_assets/index.html.erb +++ b/app/views/upload_media_assets/index.html.erb @@ -1,16 +1,23 @@
-
-

My Uploads

+

Upload

- - Gallery | - <%= link_to "Table", user_uploads_path(CurrentUser.user.id.to_i, mode: "table") %> - + <% if policy(@upload).show? && @upload.source_strategy.present? %> + <%= render_source_data(@upload.source_strategy) %> + <% end %> + +
+ <%= link_to "All", current_page_path(search: search_params.to_h.without("is_posted")), class: ["inline-block p-1 pb-2", (search_params[:is_posted].nil? ? "border-current border-b-2 -mb-px" : "inactive-link")] %> + <%= link_to "Posted", current_page_path(search: { is_posted: true }), class: ["inline-block p-1 pb-2", (search_params[:is_posted].to_s.truthy? ? "border-current border-b-2 -mb-px" : "inactive-link")] %> + <%= link_to "Unposted", current_page_path(search: { is_posted: false }), class: ["inline-block p-1 pb-2", (search_params[:is_posted].to_s.falsy? ? "border-current border-b-2 -mb-px" : "inactive-link")] %> + + <%= render PreviewSizeMenuComponent.new(current_size: @preview_size) %>
- <%= render "upload_media_assets/gallery", upload_media_assets: @upload_media_assets %> + <%= render "upload_media_assets/gallery", upload_media_assets: @upload_media_assets, size: @preview_size %> <%= numbered_paginator(@upload_media_assets) %>
+ +<%= render "uploads/secondary_links" %> diff --git a/app/views/uploads/_multiple_asset_upload.html.erb b/app/views/uploads/_multiple_asset_upload.html.erb deleted file mode 100644 index 4ee0edd37..000000000 --- a/app/views/uploads/_multiple_asset_upload.html.erb +++ /dev/null @@ -1,7 +0,0 @@ -<%= render(MediaAssetGalleryComponent.new(size: size, 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 %> - <% end %> - <% end %> -<% end %> diff --git a/app/views/uploads/_preview.html.erb b/app/views/uploads/_preview.html.erb index 985a8afc4..4d17d8da9 100644 --- a/app/views/uploads/_preview.html.erb +++ b/app/views/uploads/_preview.html.erb @@ -1,7 +1,8 @@ <% upload_media_asset = upload.upload_media_assets.sort_by(&:id).first %> <% media_asset = upload_media_asset&.media_asset %> +<% link_target = upload.media_asset_count > 1 ? [upload, UploadMediaAsset] : upload %> -<%= render(MediaAssetPreviewComponent.new(media_asset: media_asset, size: size, link_target: upload, save_data: CurrentUser.save_data)) do |preview| %> +<%= render(MediaAssetPreviewComponent.new(media_asset: media_asset, size: size, link_target: link_target, save_data: CurrentUser.save_data)) do |preview| %> <% preview.missing_image do %> <% if upload.is_errored? || upload_media_asset&.failed? %> Upload failed @@ -20,20 +21,14 @@ <% end %> <% preview.footer do %> -
+
- <% if upload.media_asset_count == 1 && media_asset&.post.present? %> - <%= link_to "post ##{media_asset.post.id}", media_asset.post, class: "leading-none" %> - <% else %> - <%= link_to "upload ##{upload.id}", upload, class: "leading-none" %> + <% if upload.media_asset_count == 1 && upload.posts.first&.present? %> + <%= link_to "post ##{upload.posts.first.id}", upload.posts.first, class: "leading-none" %> + <% elsif upload.media_asset_count > 1 && upload.posts.length > 0 %> + <%= link_to "#{upload.posts.length}/#{upload.media_asset_count} posted", posts_path(tags: "id:#{upload.posts.map(&:id).join(",")}"), class: "leading-none" %> <% end %>
- - <% if upload.source.present? %> - <%= external_link_to upload.source, Addressable::URI.parse(upload.source).domain %> - <% else %> - No source - <% end %>
<% end %> <% end %> diff --git a/app/views/uploads/index.html.erb b/app/views/uploads/index.html.erb index c5b31dad9..1d32549e3 100644 --- a/app/views/uploads/index.html.erb +++ b/app/views/uploads/index.html.erb @@ -1,17 +1,20 @@
-
-

My Uploads

+

My Uploads

- - <%= render PreviewSizeMenuComponent.new(current_size: @preview_size) %> +
+ <%= link_to "All", current_page_path(search: search_params.to_h.without("is_posted")), class: ["inline-block p-1 pb-2", (search_params[:is_posted].nil? ? "border-current border-b-2 -mb-px" : "inactive-link")] %> + <%= link_to "Posted", current_page_path(search: { is_posted: true }), class: ["inline-block p-1 pb-2", (search_params[:is_posted].to_s.truthy? ? "border-current border-b-2 -mb-px" : "inactive-link")] %> + <%= link_to "Unposted", current_page_path(search: { is_posted: false }), class: ["inline-block p-1 pb-2", (search_params[:is_posted].to_s.falsy? ? "border-current border-b-2 -mb-px" : "inactive-link")] %> - <% if @mode == "table" %> - <%= link_to grid_icon, current_page_path(mode: nil), title: "Gallery", class: "inactive-link" %> - <% else %> - <%= link_to list_icon, current_page_path(mode: "table"), title: "Table", class: "inactive-link" %> - <% end %> - + + + <%= render PreviewSizeMenuComponent.new(current_size: @preview_size) %> + <% if @mode == "table" %> + <%= link_to grid_icon, current_page_path(mode: nil), title: "Gallery", class: "inline-block p-1 pb-2 rounded inactive-link" %> + <% else %> + <%= link_to list_icon, current_page_path(mode: "table"), title: "Table", class: "inline-block p-1 pb-2 rounded inactive-link" %> + <% end %>
<% if @mode == "gallery" %> diff --git a/app/views/uploads/show.html.erb b/app/views/uploads/show.html.erb index 0d11ca91a..c1565dbda 100644 --- a/app/views/uploads/show.html.erb +++ b/app/views/uploads/show.html.erb @@ -1,12 +1,6 @@
-
-

Upload

- - <% if @upload.media_asset_count > 1 %> - <%= render PreviewSizeMenuComponent.new(current_size: @preview_size) %> - <% end %> -
+

Upload

<% if @upload.is_errored? %>

Error: <%= @upload.error %>.

@@ -16,10 +10,6 @@ <% content_for(:html_header) do %> <% end %> - <% elsif @upload.media_asset_count > 1 %> -
- <%= render "multiple_asset_upload", upload: @upload, size: @preview_size %> -
<% elsif @upload.media_asset_count == 1 %>
<%= render "single_asset_upload", upload_media_asset: @upload.upload_media_assets.first %>