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 } : {})
|
}.merge(has_content_type_validator? ? { accept: accept_content_type } : {})
|
||||||
end
|
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
|
def poll_url
|
||||||
if champ.present?
|
if champ.present?
|
||||||
auto_attach_url
|
auto_attach_url
|
||||||
|
|
|
@ -27,11 +27,10 @@
|
||||||
- if !as_multiple?
|
- if !as_multiple?
|
||||||
= file_field(champ, field_name, **file_field_options)
|
= file_field(champ, field_name, **file_field_options)
|
||||||
|
|
||||||
- if in_progress?
|
- if persisted?
|
||||||
%div{ data: poll_controller_options }
|
- Attachment::PendingPollComponent.new(attachment: attachment, poll_url:).then do |component|
|
||||||
- if attachment.created_at < 30.seconds.ago
|
.fr-mt-2w
|
||||||
.fr-mt-2w
|
= render component
|
||||||
= render Attachment::LongProcessingRefreshComponent.new(attachment: attachment)
|
|
||||||
|
|
||||||
.attachment-error.hidden
|
.attachment-error.hidden
|
||||||
%p.fr-error-text= t('.errors.uploading')
|
%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
|
renders_one :template
|
||||||
|
|
||||||
attr_reader :champ
|
|
||||||
attr_reader :attached_file
|
attr_reader :attached_file
|
||||||
attr_reader :user_can_download
|
attr_reader :attachments
|
||||||
attr_reader :user_can_destroy
|
attr_reader :champ
|
||||||
attr_reader :max
|
attr_reader :max
|
||||||
|
attr_reader :user_can_destroy
|
||||||
|
attr_reader :user_can_download
|
||||||
|
|
||||||
delegate :count, :empty?, to: :attachments, prefix: true
|
delegate :count, :empty?, to: :attachments, prefix: true
|
||||||
|
|
||||||
|
@ -34,36 +35,8 @@ class Attachment::MultipleComponent < ApplicationComponent
|
||||||
"attachment-multiple-empty-#{champ.id}"
|
"attachment-multiple-empty-#{champ.id}"
|
||||||
end
|
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
|
def auto_attach_url
|
||||||
helpers.auto_attach_url(champ)
|
helpers.auto_attach_url(champ)
|
||||||
end
|
end
|
||||||
|
alias poll_url auto_attach_url
|
||||||
private
|
|
||||||
|
|
||||||
def attachments
|
|
||||||
@attachments
|
|
||||||
end
|
|
||||||
|
|
||||||
def attachment_in_progress?(attachment)
|
|
||||||
attachment.virus_scanner.pending? || attachment.watermark_pending?
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -9,7 +9,4 @@
|
||||||
= render Attachment::EditComponent.new(champ:, attached_file:, attachment: nil, index: attachments_count, user_can_destroy:)
|
= render Attachment::EditComponent.new(champ:, attached_file:, attachment: nil, index: attachments_count, user_can_destroy:)
|
||||||
|
|
||||||
// single poll and refresh message for all attachments
|
// single poll and refresh message for all attachments
|
||||||
- if in_progress?
|
= render Attachment::PendingPollComponent.new(attachments: attachments, poll_url:)
|
||||||
%div{ data: poll_controller_options }
|
|
||||||
- if in_progress_long?
|
|
||||||
= render Attachment::LongProcessingRefreshComponent.new
|
|
||||||
|
|
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]')
|
expect(subject).to have_selector('[data-controller=turbo-poll]')
|
||||||
end
|
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
|
context "when used as multiple context" do
|
||||||
let(:kwargs) { { as_multiple: true } }
|
let(:kwargs) { { as_multiple: true } }
|
||||||
|
|
||||||
|
|
|
@ -97,12 +97,5 @@ RSpec.describe Attachment::MultipleComponent, type: :component do
|
||||||
it 'setup polling' do
|
it 'setup polling' do
|
||||||
expect(subject).to have_selector('[data-controller=turbo-poll]')
|
expect(subject).to have_selector('[data-controller=turbo-poll]')
|
||||||
end
|
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
|
||||||
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