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 @@
Error: <%= @upload.error %>.
@@ -16,10 +10,6 @@ <% content_for(:html_header) do %> <% end %> - <% elsif @upload.media_asset_count > 1 %> -