diff --git a/app/views/active_storage/blobs/_blob.html.erb b/app/views/active_storage/blobs/_blob.html.erb new file mode 100644 index 0000000..cbec938 --- /dev/null +++ b/app/views/active_storage/blobs/_blob.html.erb @@ -0,0 +1,20 @@ +<%# Files are posted as a message's own attachment, which gets its preview when it's posted; the composer adds none to + the rich text. One that's there anyway shows a preview only if it was already made, rather than linking to a URL + that makes it, on any view, for as long as it fails. %> +<% preview = blob.variant(resize_to_limit: local_assigns[:in_gallery] ? [ 800, 600 ] : [ 1024, 768 ]) if blob.variable? %> +<% preview = nil unless preview&.processed? %> + +
attachment--<%= blob.filename.extension %>"> + <% if preview %> + <%= image_tag preview, alt: blob.try(:alt) %> + <% end %> + +
+ <% if caption = blob.try(:caption) %> + <%= caption %> + <% else %> + <%= blob.filename %> + <%= number_to_human_size blob.byte_size %> + <% end %> +
+
diff --git a/app/views/messages/_message.html.erb b/app/views/messages/_message.html.erb index d0c491f..77732cd 100644 --- a/app/views/messages/_message.html.erb +++ b/app/views/messages/_message.html.erb @@ -1,7 +1,7 @@ <%# Be sure to check/update messages/_template.html.erb when changing this file %> <%# Bump this version when the message presentation filters change what they emit. Editing this line changes the template digest, which busts BOTH this fragment cache and the collection cache that keys on this partial's digest (helper Ruby changes alone don't). %> -<% cache [ message, "presentation-v3" ] do %> +<% cache [ message, "presentation-v4" ] do %> <%= message_tag message do %>

<%= local_datetime_tag message.created_at, style: :date %>

diff --git a/test/helpers/messages_helper_test.rb b/test/helpers/messages_helper_test.rb index d2655a8..b49465f 100644 --- a/test/helpers/messages_helper_test.rb +++ b/test/helpers/messages_helper_test.rb @@ -24,4 +24,35 @@ class MessagesHelperTest < ActionView::TestCase assert_match /]*>example<\/a>/, presentation assert_match /bold<\/strong>/, presentation end + + test "message_presentation shows an image in the rich text as a file, rather than making its preview on view" do + presentation = view.message_presentation(message_with_file_in_rich_text("moon.jpg", "image/jpeg")) + + assert_no_match %r{/representations/}, presentation + assert_match %r{moon\.jpg}, presentation + end + + test "message_presentation shows an image in the rich text whose preview was already made" do + message = message_with_file_in_rich_text("moon.jpg", "image/jpeg") + message.body.embeds.first.blob.variant(resize_to_limit: [ 1024, 768 ]).processed + + presentation = view.message_presentation(message.reload) + + assert_match %r{]+src="[^"]*/representations/[^"]*moon\.jpg"}, presentation + end + + test "message_presentation shows a video in the rich text as a file" do + presentation = view.message_presentation(message_with_file_in_rich_text("alpha-centuri.mov", "video/quicktime")) + + assert_no_match %r{/representations/}, presentation + assert_match %r{alpha-centuri\.mov}, presentation + end + + private + def message_with_file_in_rich_text(file, content_type) + blob = ActiveStorage::Blob.create_and_upload!(io: file_fixture(file).open, filename: file, content_type: content_type) + body = %(
Here:
) + + Message.create! room: rooms(:pets), body: body, client_message_id: "0015", creator: users(:jason) + end end