Merge pull request #10196 from tchak/remove-replace-pj

chore(attachment): remove unused replace code
This commit is contained in:
Paul Chavard 2024-03-25 15:10:03 +00:00 committed by GitHub
commit abb8ab2d59
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
12 changed files with 11 additions and 126 deletions

View file

@ -4,14 +4,12 @@ class Attachment::EditComponent < ApplicationComponent
attr_reader :attachment attr_reader :attachment
attr_reader :user_can_destroy attr_reader :user_can_destroy
alias user_can_destroy? user_can_destroy alias user_can_destroy? user_can_destroy
attr_reader :user_can_replace
alias user_can_replace? user_can_replace
attr_reader :as_multiple attr_reader :as_multiple
alias as_multiple? as_multiple alias as_multiple? as_multiple
EXTENSIONS_ORDER = ['jpeg', 'png', 'pdf', 'zip'].freeze EXTENSIONS_ORDER = ['jpeg', 'png', 'pdf', 'zip'].freeze
def initialize(champ: nil, auto_attach_url: nil, attached_file:, direct_upload: true, index: 0, as_multiple: false, view_as: :link, user_can_destroy: true, user_can_replace: false, **kwargs) def initialize(champ: nil, auto_attach_url: nil, attached_file:, direct_upload: true, index: 0, as_multiple: false, view_as: :link, user_can_destroy: true, **kwargs)
@as_multiple = as_multiple @as_multiple = as_multiple
@attached_file = attached_file @attached_file = attached_file
@auto_attach_url = auto_attach_url @auto_attach_url = auto_attach_url
@ -20,7 +18,6 @@ class Attachment::EditComponent < ApplicationComponent
@index = index @index = index
@view_as = view_as @view_as = view_as
@user_can_destroy = user_can_destroy @user_can_destroy = user_can_destroy
@user_can_replace = user_can_replace
# attachment passed by kwarg because we don't want a default (nil) value. # attachment passed by kwarg because we don't want a default (nil) value.
@attachment = if kwargs.key?(:attachment) @attachment = if kwargs.key?(:attachment)
@ -67,7 +64,7 @@ class Attachment::EditComponent < ApplicationComponent
def file_field_options def file_field_options
track_issue_with_missing_validators if missing_validators? track_issue_with_missing_validators if missing_validators?
{ {
class: class_names("fr-upload attachment-input": true, "#{attachment_input_class}": true, "hidden": persisted?, "fr-mt-2w": user_can_replace?), class: class_names("fr-upload attachment-input": true, "#{attachment_input_class}": true, "hidden": persisted?),
direct_upload: @direct_upload, direct_upload: @direct_upload,
id: input_id, id: input_id,
aria: { describedby: champ&.describedby_id }, aria: { describedby: champ&.describedby_id },
@ -75,7 +72,6 @@ class Attachment::EditComponent < ApplicationComponent
auto_attach_url:, auto_attach_url:,
turbo_force: :server turbo_force: :server
}.merge(has_file_size_validator? ? { max_file_size: } : {}) }.merge(has_file_size_validator? ? { max_file_size: } : {})
.merge(user_can_replace? ? { replace_attachment_target: "input" } : {})
}.merge(has_content_type_validator? ? { accept: accept_content_type } : {}) }.merge(has_content_type_validator? ? { accept: accept_content_type } : {})
end end
@ -118,14 +114,6 @@ class Attachment::EditComponent < ApplicationComponent
} }
end end
def replace_controller_attributes
return {} if !persisted? || !user_can_replace? || as_multiple?
{
"data-controller": 'replace-attachment'
}
end
def retry_button_options def retry_button_options
{ {
type: 'button', type: 'button',
@ -177,10 +165,7 @@ class Attachment::EditComponent < ApplicationComponent
def auto_attach_url def auto_attach_url
return @auto_attach_url if @auto_attach_url.present? return @auto_attach_url if @auto_attach_url.present?
return helpers.auto_attach_url(@champ) if @champ.present?
params = { replace_attachment_id: @attachment.id } if user_can_replace? && @attachment.present?
return helpers.auto_attach_url(@champ, params) if @champ.present?
nil nil
end end

View file

@ -1,12 +1,10 @@
.attachment.fr-upload-group{ { id: attachment ? dom_id(attachment, :edit) : nil, class: class_names("fr-mb-1w": !(as_multiple? && downloadable?)) }.compact, **replace_controller_attributes } .attachment.fr-upload-group{ { id: attachment ? dom_id(attachment, :edit) : nil, class: class_names("fr-mb-1w": !(as_multiple? && downloadable?)) }.compact }
- if persisted? - if persisted?
%div{ id: dom_id(attachment, :persisted_row) } %div{ id: dom_id(attachment, :persisted_row) }
.flex.flex-gap-2{ class: class_names("attachment-error": attachment.virus_scanner_error?) } .flex.flex-gap-2{ class: class_names("attachment-error": attachment.virus_scanner_error?) }
- if user_can_destroy? - if user_can_destroy?
= render NestedForms::OwnedButtonComponent.new(formaction: destroy_attachment_path, http_method: :delete, opt: {class: "fr-btn fr-btn--tertiary fr-btn--sm fr-icon-delete-line", title: t(".delete_file", filename: attachment.filename)}) do = render NestedForms::OwnedButtonComponent.new(formaction: destroy_attachment_path, http_method: :delete, opt: {class: "fr-btn fr-btn--tertiary fr-btn--sm fr-icon-delete-line", title: t(".delete_file", filename: attachment.filename)}) do
= t('.delete') = t('.delete')
- elsif user_can_replace?
= button_tag t('.replace'), **replace_button_options, class: "fr-btn fr-btn--tertiary fr-btn--sm", title: t(".replace_file", filename: attachment.filename)
- if downloadable? - if downloadable?
= render Dsfr::DownloadComponent.new(attachment:) = render Dsfr::DownloadComponent.new(attachment:)

View file

@ -12,18 +12,15 @@ class Attachment::MultipleComponent < ApplicationComponent
attr_reader :view_as attr_reader :view_as
attr_reader :user_can_destroy attr_reader :user_can_destroy
alias user_can_destroy? user_can_destroy alias user_can_destroy? user_can_destroy
attr_reader :user_can_replace
alias user_can_replace? user_can_replace
delegate :count, :empty?, to: :attachments, prefix: true delegate :count, :empty?, to: :attachments, prefix: true
def initialize(champ:, attached_file:, form_object_name: nil, view_as: :link, user_can_destroy: true, user_can_replace: false, max: nil) def initialize(champ:, attached_file:, form_object_name: nil, view_as: :link, user_can_destroy: true, max: nil)
@champ = champ @champ = champ
@attached_file = attached_file @attached_file = attached_file
@form_object_name = form_object_name @form_object_name = form_object_name
@view_as = view_as @view_as = view_as
@user_can_destroy = user_can_destroy @user_can_destroy = user_can_destroy
@user_can_replace = user_can_replace
@max = max || DEFAULT_MAX_ATTACHMENTS @max = max || DEFAULT_MAX_ATTACHMENTS
@attachments = attached_file.attachments || [] @attachments = attached_file.attachments || []
@ -51,12 +48,4 @@ class Attachment::MultipleComponent < ApplicationComponent
nil nil
end end
def replace_controller_attributes
return {} unless user_can_replace?
{
"data-controller": 'replace-attachment'
}
end
end end

View file

@ -1,14 +1,14 @@
.attachment-multiple{ class: class_names("fr-downloads-group": view_as == :download, "destroyable": user_can_destroy?), **replace_controller_attributes } .attachment-multiple{ class: class_names("fr-downloads-group": view_as == :download, "destroyable": user_can_destroy?) }
= template = template
- if @attachments.size >= 1 - if @attachments.size >= 1
%ul.fr-my-1v %ul.fr-my-1v
- each_attachment do |attachment, index| - each_attachment do |attachment, index|
%li{ id: dom_id(attachment) } %li{ id: dom_id(attachment) }
= render Attachment::EditComponent.new(champ:, attached_file:, attachment:, index:, as_multiple: true, view_as:, user_can_destroy:, user_can_replace:, form_object_name:) = render Attachment::EditComponent.new(champ:, attached_file:, attachment:, index:, as_multiple: true, view_as:, user_can_destroy:, form_object_name:)
%div{ id: empty_component_id, class: class_names("hidden": !can_attach_next?), data: { turbo_force: :server } } %div{ id: empty_component_id, class: class_names("hidden": !can_attach_next?), data: { turbo_force: :server } }
= render Attachment::EditComponent.new(champ:, attached_file:, attachment: nil, index: attachments_count, user_can_destroy:, user_can_replace:, form_object_name:) = render Attachment::EditComponent.new(champ:, attached_file:, attachment: nil, index: attachments_count, user_can_destroy:, form_object_name:)
// single poll and refresh message for all attachments // single poll and refresh message for all attachments
= render Attachment::PendingPollComponent.new(attachments: attachments, poll_url:, context: poll_context) = render Attachment::PendingPollComponent.new(attachments: attachments, poll_url:, context: poll_context)

View file

@ -15,10 +15,6 @@ class EditableChamp::PieceJustificativeComponent < EditableChamp::EditableChampB
!@champ.mandatory? || @champ.dossier.brouillon? !@champ.mandatory? || @champ.dossier.brouillon?
end end
def user_can_replace?
@champ.mandatory? && @champ.dossier.en_construction?
end
def max def max
[true, nil].include?(@champ.procedure&.piece_justificative_multiple?) ? Attachment::MultipleComponent::DEFAULT_MAX_ATTACHMENTS : 1 [true, nil].include?(@champ.procedure&.piece_justificative_multiple?) ? Attachment::MultipleComponent::DEFAULT_MAX_ATTACHMENTS : 1
end end

View file

@ -1,4 +1,4 @@
= render Attachment::MultipleComponent.new(champ: @champ, attached_file: @champ.piece_justificative_file, form_object_name: @form.object_name, view_as:, user_can_destroy: user_can_destroy?, user_can_replace: user_can_replace?, max:) do |c| = render Attachment::MultipleComponent.new(champ: @champ, attached_file: @champ.piece_justificative_file, form_object_name: @form.object_name, view_as:, user_can_destroy: user_can_destroy?, max:) do |c|
- if @champ.type_de_champ.piece_justificative_template&.attached? - if @champ.type_de_champ.piece_justificative_template&.attached?
- c.with_template do - c.with_template do
= render partial: "shared/piece_justificative_template", locals: { champ: @champ } = render partial: "shared/piece_justificative_template", locals: { champ: @champ }

View file

@ -6,8 +6,4 @@ class EditableChamp::TitreIdentiteComponent < EditableChamp::EditableChampBaseCo
def user_can_destroy? def user_can_destroy?
!@champ.mandatory? || @champ.dossier.brouillon? !@champ.mandatory? || @champ.dossier.brouillon?
end end
def user_can_replace?
@champ.mandatory? && @champ.dossier.en_construction?
end
end end

View file

@ -1,4 +1,4 @@
- if @champ.type_de_champ.piece_justificative_template&.attached? - if @champ.type_de_champ.piece_justificative_template&.attached?
= render partial: "shared/piece_justificative_template", locals: { champ: @champ } = render partial: "shared/piece_justificative_template", locals: { champ: @champ }
= render Attachment::EditComponent.new(champ: @form.object, attached_file: @champ.piece_justificative_file, attachment: @champ.piece_justificative_file[0], form_object_name: @form.object_name, = render Attachment::EditComponent.new(champ: @form.object, attached_file: @champ.piece_justificative_file, attachment: @champ.piece_justificative_file[0], form_object_name: @form.object_name,
user_can_destroy: user_can_destroy?, user_can_replace: user_can_replace?) user_can_destroy: user_can_destroy?)

View file

@ -31,14 +31,7 @@ class Champs::PieceJustificativeController < ApplicationController
save_succeed = nil save_succeed = nil
ActiveStorage::Attachment.transaction do ActiveStorage::Attachment.transaction do
if params.key?(:replace_attachment_id)
@champ.piece_justificative_file.attachments.find do
_1.id == params[:replace_attachment_id].to_i
end&.destroy
end
@champ.piece_justificative_file.attach(params[:blob_signed_id]) @champ.piece_justificative_file.attach(params[:blob_signed_id])
save_succeed = @champ.save save_succeed = @champ.save
end end

View file

@ -1,30 +0,0 @@
import { ApplicationController } from './application_controller';
import { show } from '@utils';
export class ReplaceAttachmentController extends ApplicationController {
static targets = ['input'];
declare readonly inputTarget: HTMLInputElement;
open(event: Event) {
show(this.inputTarget);
this.inputTarget.click(); // opens input prompt
const target = event.currentTarget as HTMLButtonElement;
if (target.dataset.autoAttachUrl) {
// set the auto attach url specific to this button to replace the related attachment
this.inputTarget.dataset.originalAutoAttachUrl =
this.inputTarget.dataset.autoAttachUrl;
this.inputTarget.dataset.autoAttachUrl = target.dataset.autoAttachUrl;
// reset autoAttachUrl which would add an attachment
// when replace is not finalized
this.on(this.inputTarget, 'cancel', () => {
this.inputTarget.dataset.autoAttachUrl =
this.inputTarget.dataset.originalAutoAttachUrl;
});
}
}
}

View file

@ -93,18 +93,6 @@ RSpec.describe Attachment::MultipleComponent, type: :component do
end end
end end
context 'when user can replace' do
let(:kwargs) { { user_can_replace: true } }
before do
attach_to_champ(attached_file, champ)
end
it 'setup controller' do
expect(subject).to have_selector('[data-controller=replace-attachment]').once
end
end
def attach_to_champ(attached_file, champ) def attach_to_champ(attached_file, champ)
attached_file.attach( attached_file.attach(
io: StringIO.new("x" * 2), io: StringIO.new("x" * 2),

View file

@ -5,8 +5,6 @@ describe Champs::PieceJustificativeController, type: :controller do
let(:champ) { dossier.champs_public.first } let(:champ) { dossier.champs_public.first }
describe '#update' do describe '#update' do
let(:replace_attachment_id) { nil }
render_views render_views
before { sign_in user } before { sign_in user }
@ -14,8 +12,7 @@ describe Champs::PieceJustificativeController, type: :controller do
put :update, params: { put :update, params: {
position: '1', position: '1',
champ_id: champ.id, champ_id: champ.id,
blob_signed_id: file, blob_signed_id: file
replace_attachment_id:
}.compact, format: :turbo_stream }.compact, format: :turbo_stream
end end
@ -68,33 +65,6 @@ describe Champs::PieceJustificativeController, type: :controller do
expect(response.parsed_body).to eq({ 'errors' => ['La pièce justificative nest pas dun type accepté'] }) expect(response.parsed_body).to eq({ 'errors' => ['La pièce justificative nest pas dun type accepté'] })
end end
end end
context 'replace an attachment' do
let(:file) { fixture_file_upload('spec/fixtures/files/piece_justificative_0.pdf', 'application/pdf') }
before { subject }
context "attachment associated to dossier" do
let(:champ) { create(:champ, :with_piece_justificative_file, dossier:) }
let(:replace_attachment_id) { champ.piece_justificative_file.first.id }
it "replaces an existing attachment" do
champ.reload
expect(champ.piece_justificative_file.attachments.count).to eq(1)
expect(champ.piece_justificative_file.attachments.first.filename).to eq("piece_justificative_0.pdf")
end
end
context "attachment not associated to dossier" do
let(:other_champ) { create(:champ, :with_piece_justificative_file) }
let(:replace_attachment_id) { other_champ.piece_justificative_file.first.id }
it "add attachment, don't replace attachment" do
expect(champ.reload.piece_justificative_file.attachments.count).to eq(1)
expect(other_champ.reload.piece_justificative_file.attachments.count).to eq(1)
end
end
end
end end
describe '#template' do describe '#template' do