Skip to content

feature: add open attachment without download #3681

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 15 commits into
base: main
Choose a base branch
from
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@
<% elsif is_video? %>
<%= video_tag(helpers.main_app.url_for(file), controls: true, preload: false, class: 'w-full') %>
<% else %>
<div class="relative flex flex-col justify-evenly items-center px-2 rounded-lg border bg-white border-gray-500 min-h-24">
<%= content_tag file.representable? ? :a : :div, **document_arguments do %>
<div class="flex flex-col justify-center items-center w-full">
<%= helpers.svg "heroicons/outline/document-text", class: 'h-10 text-gray-600 mb-2' %>
</div>
</div>
<% end %>
<% end %>
<% if @field.display_filename %>
<span class="text-gray-500 mt-1 text-sm truncate" title="<%= file.filename %>"><%= file.filename %></span>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
# frozen_string_literal: true

class Avo::Fields::Common::Files::ViewType::GridItemComponent < Avo::BaseComponent
include Avo::Fields::Concerns::FileAuthorization

prop :field
prop :resource
prop :file
Expand Down Expand Up @@ -45,4 +47,27 @@ def record_persisted?
ActiveStorage::Blob.destroy(file.blob_id) if file.blob_id.present?
false
end

def document_arguments
args = {
class: class_names(
"relative flex flex-col justify-evenly items-center px-2 rounded-lg border bg-white border-gray-500 min-h-24",
{
"hover:bg-gray-100 transition": file.representable?
}
)
}

if file.representable? && can_download_file?
args.merge!(
{
href: helpers.main_app.url_for(file),
target: "_blank",
rel: "noopener noreferrer"
}
)
end

args
end
end
Empty file.
Empty file.
57 changes: 57 additions & 0 deletions spec/system/avo/open_field_attachment_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
require "rails_helper"

RSpec.describe "OpenFieldAttachment", type: :system do
let!(:user) { User.first }
let!(:cv_file) { Rails.root.join("app", "assets", "pdfs", "cv_sample.pdf") }
let!(:csv_file) { Rails.root.join("app", "assets", "csvs", "sample.csv") }
let(:path) { "/admin/resources/field_discovery_users/#{user.slug}" }

context "with PDF attachment" do
before do
user.cv.attach(io: File.open(cv_file), filename: "cv_sample.pdf", content_type: "application/pdf")
end

it "opens attachment in new window without download" do
test_open_PDF_attachment(path)
end
end

context "with CSV attachment" do
before do
user.cv.attach(io: File.open(csv_file), filename: "sample.csv", content_type: "application/csv")
end

it "can not open or download attachment in new window" do
test_open_CSV_attachment(path)
end
end

def test_open_PDF_attachment(path)
visit path

link = find('a[rel="noopener noreferrer"][target="_blank"]', visible: :all)

expect(link).to be_present
expect(link[:target]).to eq("_blank")
expect(link[:rel]).to eq("noopener noreferrer")
link.click

expect(page.driver.browser.current_url).not_to include("download")
expect(page.driver.browser.window_handles.length).to eq 2
end

def test_open_CSV_attachment(path)
visit path

div = find('span[title="' + csv_file.basename.to_s + '"]').find(:xpath, './ancestor::div[@class="flex flex-col h-full"]')

link = div.find("a")
expect(link[:rel]).to eq("")
expect(link[:target]).to eq("")

div.find('svg[data-slot="icon"]').find(:xpath, "./ancestor::a").click

expect(page.driver.browser.current_url).not_to include("download")
expect(page.driver.browser.window_handles.length).to eq 1
end
end
Loading