refactor(attachment): extract PendingPoll component
This commit is contained in:
parent
b110e58f2f
commit
42363e0b0d
13 changed files with 109 additions and 83 deletions
|
@ -72,21 +72,6 @@ class Attachment::EditComponent < ApplicationComponent
|
|||
}.merge(has_content_type_validator? ? { accept: accept_content_type } : {})
|
||||
end
|
||||
|
||||
def in_progress?
|
||||
return false if attachment.nil?
|
||||
return true if attachment.virus_scanner.pending?
|
||||
return true if attachment.watermark_pending?
|
||||
|
||||
false
|
||||
end
|
||||
|
||||
def poll_controller_options
|
||||
{
|
||||
controller: 'turbo-poll',
|
||||
turbo_poll_url_value: poll_url
|
||||
}
|
||||
end
|
||||
|
||||
def poll_url
|
||||
if champ.present?
|
||||
auto_attach_url
|
||||
|
|
|
@ -27,11 +27,10 @@
|
|||
- if !as_multiple?
|
||||
= file_field(champ, field_name, **file_field_options)
|
||||
|
||||
- if in_progress?
|
||||
%div{ data: poll_controller_options }
|
||||
- if attachment.created_at < 30.seconds.ago
|
||||
- if persisted?
|
||||
- Attachment::PendingPollComponent.new(attachment: attachment, poll_url:).then do |component|
|
||||
.fr-mt-2w
|
||||
= render Attachment::LongProcessingRefreshComponent.new(attachment: attachment)
|
||||
= render component
|
||||
|
||||
.attachment-error.hidden
|
||||
%p.fr-error-text= t('.errors.uploading')
|
||||
|
|
|
@ -1,5 +0,0 @@
|
|||
class Attachment::LongProcessingRefreshComponent < ApplicationComponent
|
||||
def initialize(attachment: nil)
|
||||
@attachment = attachment
|
||||
end
|
||||
end
|
|
@ -1,5 +0,0 @@
|
|||
= render Dsfr::CalloutComponent.new(title: nil) do |c|
|
||||
- c.with_body do
|
||||
= t(".explanation")
|
||||
- c.with_bottom do
|
||||
= button_tag t(".reload"), type: "button", class: "fr-btn", data: { action: 'click->turbo-poll#refresh' }
|
|
@ -4,11 +4,12 @@ class Attachment::MultipleComponent < ApplicationComponent
|
|||
|
||||
renders_one :template
|
||||
|
||||
attr_reader :champ
|
||||
attr_reader :attached_file
|
||||
attr_reader :user_can_download
|
||||
attr_reader :user_can_destroy
|
||||
attr_reader :attachments
|
||||
attr_reader :champ
|
||||
attr_reader :max
|
||||
attr_reader :user_can_destroy
|
||||
attr_reader :user_can_download
|
||||
|
||||
delegate :count, :empty?, to: :attachments, prefix: true
|
||||
|
||||
|
@ -34,36 +35,8 @@ class Attachment::MultipleComponent < ApplicationComponent
|
|||
"attachment-multiple-empty-#{champ.id}"
|
||||
end
|
||||
|
||||
def in_progress?
|
||||
@attachments.any? do
|
||||
attachment_in_progress?(_1)
|
||||
end
|
||||
end
|
||||
|
||||
def in_progress_long?
|
||||
@attachments.any? do
|
||||
attachment_in_progress?(_1) && _1.created_at < 30.seconds.ago
|
||||
end
|
||||
end
|
||||
|
||||
def poll_controller_options
|
||||
{
|
||||
controller: 'turbo-poll',
|
||||
turbo_poll_url_value: auto_attach_url
|
||||
}
|
||||
end
|
||||
|
||||
def auto_attach_url
|
||||
helpers.auto_attach_url(champ)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def attachments
|
||||
@attachments
|
||||
end
|
||||
|
||||
def attachment_in_progress?(attachment)
|
||||
attachment.virus_scanner.pending? || attachment.watermark_pending?
|
||||
end
|
||||
alias poll_url auto_attach_url
|
||||
end
|
||||
|
|
|
@ -9,7 +9,4 @@
|
|||
= render Attachment::EditComponent.new(champ:, attached_file:, attachment: nil, index: attachments_count, user_can_destroy:)
|
||||
|
||||
// single poll and refresh message for all attachments
|
||||
- if in_progress?
|
||||
%div{ data: poll_controller_options }
|
||||
- if in_progress_long?
|
||||
= render Attachment::LongProcessingRefreshComponent.new
|
||||
= render Attachment::PendingPollComponent.new(attachments: attachments, poll_url:)
|
||||
|
|
33
app/components/attachment/pending_poll_component.rb
Normal file
33
app/components/attachment/pending_poll_component.rb
Normal file
|
@ -0,0 +1,33 @@
|
|||
class Attachment::PendingPollComponent < ApplicationComponent
|
||||
def initialize(poll_url:, attachment: nil, attachments: nil)
|
||||
@poll_url = poll_url
|
||||
@attachments = if attachment.present?
|
||||
[attachment]
|
||||
else
|
||||
attachments
|
||||
end
|
||||
end
|
||||
|
||||
def render?
|
||||
@attachments.any? { pending_attachment?(_1) }
|
||||
end
|
||||
|
||||
def long_pending?
|
||||
@attachments.any? do
|
||||
pending_attachment?(_1) && _1.created_at < 30.seconds.ago
|
||||
end
|
||||
end
|
||||
|
||||
def poll_controller_options
|
||||
{
|
||||
controller: 'turbo-poll',
|
||||
turbo_poll_url_value: @poll_url
|
||||
}
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def pending_attachment?(attachment)
|
||||
attachment.virus_scanner.pending? || attachment.watermark_pending?
|
||||
end
|
||||
end
|
|
@ -0,0 +1,7 @@
|
|||
%div{ data: poll_controller_options }
|
||||
- if long_pending?
|
||||
= render Dsfr::CalloutComponent.new(title: nil) do |c|
|
||||
- c.with_body do
|
||||
= t(".explanation")
|
||||
- c.with_bottom do
|
||||
= button_tag t(".reload"), type: "button", class: "fr-btn", data: { action: 'click->turbo-poll#refresh' }
|
|
@ -122,16 +122,6 @@ RSpec.describe Attachment::EditComponent, type: :component do
|
|||
expect(subject).to have_selector('[data-controller=turbo-poll]')
|
||||
end
|
||||
|
||||
context "process is taking longer than expected" do
|
||||
before do
|
||||
champ.piece_justificative_file.attachments[0].update!(created_at: 5.minutes.ago)
|
||||
end
|
||||
|
||||
it 'renders a refresh button' do
|
||||
expect(subject).to have_button("Recharger")
|
||||
end
|
||||
end
|
||||
|
||||
context "when used as multiple context" do
|
||||
let(:kwargs) { { as_multiple: true } }
|
||||
|
||||
|
|
|
@ -97,12 +97,5 @@ RSpec.describe Attachment::MultipleComponent, type: :component do
|
|||
it 'setup polling' do
|
||||
expect(subject).to have_selector('[data-controller=turbo-poll]')
|
||||
end
|
||||
|
||||
context "process is taking longer than expected" do
|
||||
let(:created_at) { 5.minutes.ago }
|
||||
it 'renders a refresh button' do
|
||||
expect(subject).to have_button("Recharger")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
59
spec/components/attachment/pending_poll_component_spec.rb
Normal file
59
spec/components/attachment/pending_poll_component_spec.rb
Normal file
|
@ -0,0 +1,59 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require "rails_helper"
|
||||
|
||||
RSpec.describe Attachment::PendingPollComponent, type: :component do
|
||||
let(:champ) { create(:champ_titre_identite) }
|
||||
let(:attachment) { champ.piece_justificative_file.attachments.first }
|
||||
let(:component) {
|
||||
described_class.new(poll_url: "poll-here", attachment:)
|
||||
}
|
||||
|
||||
subject {
|
||||
render_inline(component).to_html
|
||||
}
|
||||
|
||||
context "when watermark is pending" do
|
||||
it "renders turbo poll attributes" do
|
||||
expect(subject).to have_selector("[data-controller='turbo-poll'][data-turbo-poll-url-value='poll-here']")
|
||||
end
|
||||
|
||||
it "renders" do
|
||||
expect(component).to be_render
|
||||
end
|
||||
|
||||
it "does not render manual reload" do
|
||||
expect(component).not_to have_content("Recharger")
|
||||
end
|
||||
|
||||
context "when watermark is pending for a long time" do
|
||||
before do
|
||||
attachment.created_at = 5.minutes.ago
|
||||
end
|
||||
|
||||
it "renders manual reload" do
|
||||
expect(subject).to have_content("Recharger")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context "when waterkmark is done" do
|
||||
before do
|
||||
attachment.blob[:metadata] = { watermark: true }
|
||||
end
|
||||
|
||||
it "does not render" do
|
||||
expect(component).not_to be_render
|
||||
end
|
||||
|
||||
context "when antivirus is in progress" do
|
||||
before do
|
||||
attachment.blob[:metadata] = { virus_scan_result: ActiveStorage::VirusScanner::PENDING }
|
||||
end
|
||||
|
||||
it "renders" do
|
||||
expect(component).to be_render
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue