diff --git a/app/components/media_asset_preview_component.rb b/app/components/media_asset_preview_component.rb
index 243b76f48..c8bb35f7e 100644
--- a/app/components/media_asset_preview_component.rb
+++ b/app/components/media_asset_preview_component.rb
@@ -5,25 +5,25 @@
class MediaAssetPreviewComponent < ApplicationComponent
DEFAULT_SIZE = 180
- attr_reader :media_asset, :size, :fit, :link_target, :shrink_to_fit, :save_data
+ attr_reader :media_asset, :size, :link_target, :classes, :save_data
delegate :duration_to_hhmmss, :sound_icon, to: :helpers
+ renders_one :header
+ renders_one :missing_image
renders_one :footer
# @param media_asset [MediaAsset] The media asset to show the thumbnail for.
# @param size [String] The size of the thumbnail. One of 150, 180, 225, 270, or 360.
# @param link_target [ApplicationRecord] What the thumbnail links to (default: the media asset).
- # @param shrink_to_fit [Boolean] If true, allow the thumbnail to shrink to fit the containing element.
- # If false, make the thumbnail a fixed width and height.
# @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, shrink_to_fit: true, save_data: CurrentUser.save_data)
+ def initialize(media_asset:, size: DEFAULT_SIZE, link_target: media_asset, classes: [], save_data: CurrentUser.save_data)
super
@media_asset = media_asset
@size = size.presence&.to_i || DEFAULT_SIZE
@link_target = link_target
+ @classes = classes
@save_data = save_data
- @shrink_to_fit = shrink_to_fit
end
def variant
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 b13dd9777..daaea96f6 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,28 +1,44 @@
-<%= tag.article class: "media-asset-preview media-asset-preview-#{size}" do -%>
- <%= link_to link_target, class: "inline-block relative flex justify-center", draggable: "false" do -%>
- <% if media_asset.is_animated? %>
-
-
- <%= duration_to_hhmmss(media_asset.duration) %>
-
-
- <% end %>
+<%= tag.article class: ["media-asset-preview media-asset-preview-#{size}", *classes] do -%>
+ <%= link_to link_target, class: "inline-block relative", draggable: "false" do -%>
+ <%= header %>
-
- <% unless save_data %>
- <% case size %>
- <% when 150, 180 %>
- <%= tag.source type: "image/jpeg", srcset: "#{media_asset.variant("180x180").file_url} 1x, #{media_asset.variant("360x360").file_url} 2x" %>
- <% when 225, 270, 360 %>
- <%= tag.source type: "image/webp", srcset: "#{media_asset.variant("360x360").file_url} 1x, #{media_asset.variant("720x720").file_url} 2x" %>
- <% end %>
+ <% if media_asset.nil? %>
+
+ <%= missing_image || "No image" %>
+
+ <% elsif media_asset.active? %>
+ <% if media_asset.is_animated? %>
+
+
+ <%= duration_to_hhmmss(media_asset.duration) %>
+
+
<% end %>
- <%= tag.img src: variant.file_url, width: variant.width, height: variant.height, class: "media-asset-preview-image w-auto h-auto max-h-#{size}px #{"max-w-full" if shrink_to_fit}", crossorigin: "anonymous", draggable: "false" -%>
-
+
+ <% unless save_data %>
+ <% case size %>
+ <% when 150, 180 %>
+ <%= tag.source type: "image/jpeg", srcset: "#{media_asset.variant("180x180").file_url} 1x, #{media_asset.variant("360x360").file_url} 2x" %>
+ <% when 225, 270, 360 %>
+ <%= tag.source type: "image/webp", srcset: "#{media_asset.variant("360x360").file_url} 1x, #{media_asset.variant("720x720").file_url} 2x" %>
+ <% end %>
+ <% end %>
+
+ <%= tag.img src: variant.file_url, width: variant.width, height: variant.height, class: "media-asset-preview-image w-auto h-auto max-h-#{size}px max-w-full", crossorigin: "anonymous", draggable: "false" -%>
+
+ <% else %>
+
+ <% if media_asset.processing? %>
+ Loading
+ <% elsif media_asset.failed? %>
+ Failed
+ <% else %>
+ Deleted
+ <% end %>
+
+ <% end %>
<% end %>
-
- <%= footer %>
-
+ <%= footer %>
<% end %>
diff --git a/app/components/media_asset_preview_component/media_asset_preview_component.scss b/app/components/media_asset_preview_component/media_asset_preview_component.scss
index 3288e8bd7..0e57de337 100644
--- a/app/components/media_asset_preview_component/media_asset_preview_component.scss
+++ b/app/components/media_asset_preview_component/media_asset_preview_component.scss
@@ -2,3 +2,7 @@
color: var(--preview-icon-color);
background: var(--preview-icon-background);
}
+
+.media-asset-placeholder {
+ background-color: var(--media-asset-placeholder-background-color);
+}
diff --git a/app/javascript/src/styles/base/040_colors.css b/app/javascript/src/styles/base/040_colors.css
index cfc700211..c46846baa 100644
--- a/app/javascript/src/styles/base/040_colors.css
+++ b/app/javascript/src/styles/base/040_colors.css
@@ -163,6 +163,8 @@ html {
--preview-icon-color: var(--inverse-text-color);
--preview-icon-background: rgba(0, 0, 0, 0.7);
+ --media-asset-placeholder-background-color: var(--grey-1);
+
--modqueue-tag-warning-color: var(--red-1);
--file-upload-component-background-color: var(--body-background-color);
@@ -374,6 +376,8 @@ body[data-current-user-theme="dark"] {
--preview-has-parent-color: var(--orange-3);
--preview-selected-color: rgba(255, 255, 255, 0.25);
+ --media-asset-placeholder-background-color: var(--grey-8);
+
--modqueue-tag-warning-color: var(--red-7);
--file-upload-component-background-color: var(--grey-8);
diff --git a/app/javascript/src/styles/common/utilities.scss b/app/javascript/src/styles/common/utilities.scss
index 2ffaa408d..b2e4c3333 100644
--- a/app/javascript/src/styles/common/utilities.scss
+++ b/app/javascript/src/styles/common/utilities.scss
@@ -116,10 +116,17 @@ $spacer: 0.25rem; /* 4px */
.pr-4 { padding-right: 4 * $spacer; }
.w-auto { width: auto; }
+.w-min { width: min-content; }
+.w-max { width: max-content; }
.w-sm { width: 24rem; }
.w-md { width: 28rem; }
.w-1\/4 { width: 25%; }
.w-full { width: 100%; }
+.w-150px { width: 150px; }
+.w-180px { width: 180px; }
+.w-225px { width: 225px; }
+.w-270px { width: 270px; }
+.w-360px { width: 360px; }
.max-w-full { max-width: 100%; }
@@ -130,6 +137,11 @@ $spacer: 0.25rem; /* 4px */
.h-8 { height: 8 * $spacer; }
.h-10 { height: 10 * $spacer; }
.h-12 { height: 12 * $spacer; }
+.h-150px { height: 150px; }
+.h-180px { height: 180px; }
+.h-225px { height: 225px; }
+.h-270px { height: 270px; }
+.h-360px { height: 360px; }
.max-h-150px { max-height: 150px; }
.max-h-180px { max-height: 180px; }
diff --git a/app/views/media_assets/_table.html.erb b/app/views/media_assets/_table.html.erb
index eb444b80b..f9334821a 100644
--- a/app/views/media_assets/_table.html.erb
+++ b/app/views/media_assets/_table.html.erb
@@ -1,7 +1,7 @@
<%= table_for @media_assets, class: "striped autofit" do |t| %>
<% t.column "File", td: { class: "text-center" } do |media_asset| %>
<% if policy(media_asset).can_see_image? %>
- <%= render MediaAssetPreviewComponent.new(media_asset: media_asset, save_data: CurrentUser.save_data, shrink_to_fit: false) %>
+ <%= render MediaAssetPreviewComponent.new(media_asset: media_asset, save_data: CurrentUser.save_data) %>
<% end %>
<% end %>
diff --git a/app/views/uploads/_table.html.erb b/app/views/uploads/_table.html.erb
index 033ac407e..186e6a85d 100644
--- a/app/views/uploads/_table.html.erb
+++ b/app/views/uploads/_table.html.erb
@@ -7,14 +7,14 @@
-<%= table_for @uploads, class: "striped autofit", width: "100%" do |t| %>
+<%= table_for @uploads, class: "striped", 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) %>
+ <%= render MediaAssetPreviewComponent.new(media_asset: media_asset, link_target: media_asset.post, save_data: CurrentUser.save_data) %>
<% else %>
- <%= render MediaAssetPreviewComponent.new(media_asset: media_asset, link_target: upload, save_data: CurrentUser.save_data, shrink_to_fit: false) %>
+ <%= render MediaAssetPreviewComponent.new(media_asset: media_asset, link_target: upload, save_data: CurrentUser.save_data) %>
<% end %>
<% end %>
<% end %>