refactor(instructeur): instruction menu as component

This commit is contained in:
Colin Darie 2023-04-18 15:09:02 +02:00
parent a85e10582d
commit 3c4ea6f8cf
No known key found for this signature in database
GPG key ID: 4FB865FDBCA4BCC4
7 changed files with 140 additions and 54 deletions

View file

@ -0,0 +1,24 @@
# frozen_string_literal: true
class Instructeurs::InstructionMenuComponent < ApplicationComponent
attr_reader :dossier
def initialize(dossier:)
@dossier = dossier
end
def render?
return true if dossier.en_instruction?
return true if dossier.en_construction? && dossier.may_flag_as_pending_correction?
false
end
def menu_label
if dossier.en_instruction?
t(".instruct")
else
"Demander une correction"
end
end
end

View file

@ -0,0 +1,3 @@
---
en:
instruct: Instruct the file

View file

@ -0,0 +1,3 @@
---
fr:
instruct: Instruire le dossier

View file

@ -0,0 +1,54 @@
= render Dropdown::MenuComponent.new(wrapper: :div, wrapper_options: { data: { turbo_force: :server } }, role: :region) do |menu|
- menu.with_button_inner_html do
= menu_label
- if dossier.en_instruction?
- menu.with_item do
= link_to('#', onclick: "DS.showMotivation(event, 'accept');", role: 'menuitem') do
%span.icon.accept
.dropdown-description
%h4 Accepter
Lusager sera informé que son dossier a été accepté
- menu.with_item(class: "hidden inactive form-inside") do
= render partial: 'instructeurs/dossiers/instruction_button_motivation', locals: { dossier: dossier, placeholder: 'Expliquez au demandeur pourquoi ce dossier est accepté (facultatif)', popup_class: 'accept', process_action: 'accepter', title: 'Accepter', confirm: "Confirmez-vous l'acceptation ce dossier ?" }
- menu.with_item do
= link_to('#', onclick: "DS.showMotivation(event, 'without-continuation');", role: 'menuitem') do
%span.icon.without-continuation
.dropdown-description
%h4 Classer sans suite
Lusager sera informé que son dossier a été classé sans suite
- menu.with_item(class: "hidden inactive form-inside") do
= render partial: 'instructeurs/dossiers/instruction_button_motivation', locals: { dossier: dossier, placeholder: 'Expliquez au demandeur pourquoi ce dossier est classé sans suite (obligatoire)', popup_class: 'without-continuation', process_action: 'classer_sans_suite', title: 'Classer sans suite', confirm: 'Confirmez-vous le classement sans suite de ce dossier ?' }
- menu.with_item do
= link_to('#', onclick: "DS.showMotivation(event, 'refuse');", role: 'menuitem') do
%span.icon.refuse
.dropdown-description
%h4 Refuser
Lusager sera informé que son dossier a été refusé
- menu.with_item(class: "hidden inactive form-inside") do
= render partial: 'instructeurs/dossiers/instruction_button_motivation', locals: { dossier: dossier, placeholder: 'Expliquez au demandeur pourquoi ce dossier est refusé (obligatoire)', popup_class: 'refuse', process_action: 'refuser', title: 'Refuser', confirm: 'Confirmez-vous le refus de ce dossier ?' }
- if dossier.may_flag_as_pending_correction?
- menu.with_item do
= link_to('#', onclick: "DS.showMotivation(event, 'pending_correction');", role: 'menuitem') do
%span.fr-icon.fr-icon-error-warning-line.fr-text-default--info{ "aria-hidden": "true" }
.dropdown-description
%h4 Demander une correction
Lusager sera informé que des modifications sont attendues
- menu.with_item(class: class_names("inactive form-inside": true, hidden: dossier.en_instruction?)) do
= render partial: 'instructeurs/dossiers/instruction_button_motivation', locals: { dossier: dossier,
visible: !dossier.en_instruction?,
form_path: pending_correction_instructeur_dossier_path(dossier.procedure, dossier),
placeholder: 'Expliquez au demandeur quelle(s) correction(s) sont attendues',
popup_class: 'pending_correction',
button_justificatif_label: "Ajouter une pièce jointe (facultatif)",
process_button: dossier.en_construction? ? 'Valider' : 'Valider et repasser en construction',
process_action: nil,
title: 'Marquer en attente de corrections',
confirm: 'Envoyer la demande de corrections ?'}

View file

@ -10,4 +10,4 @@
turbo: true }
%li.instruction-button
= render partial: "instruction_button", locals: { dossier: dossier }
= render Instructeurs::InstructionMenuComponent.new(dossier:)

View file

@ -0,0 +1,55 @@
# frozen_string_literal: true
RSpec.describe Instructeurs::InstructionMenuComponent, type: :component do
include DossierHelper
subject do
render_inline(described_class.new(dossier:))
end
matcher :have_dropdown_title do |expected_title|
match do |subject|
expect(subject).to have_selector('.dropdown .dropdown-button', text: expected_title)
end
end
matcher :have_dropdown_items do |options|
match do |subject|
expected_count = options[:count] || 1
expect(subject).to have_selector('ul.dropdown-items li:not(.hidden)', count: expected_count)
end
end
matcher :have_dropdown_item do |expected_title, options = {}|
match do |subject|
expected_href = options[:href]
if (expected_href.present?)
expect(subject).to have_selector("ul.dropdown-items li a[href='#{expected_href}']", text: expected_title)
else
expect(subject).to have_selector('ul.dropdown-items li', text: expected_title)
end
end
end
context 'en_construction' do
let(:dossier) { create(:dossier, :en_construction) }
it 'renders a dropdown' do
expect(subject).to have_dropdown_title('Demander une correction')
expect(subject).to have_dropdown_items(count: 2) # form is already expanded so we have 2 visible items
end
end
context 'en_instruction' do
let(:dossier) { create(:dossier, :en_instruction) }
it 'renders a dropdown' do
expect(subject).to have_dropdown_title('Instruire le dossier')
expect(subject).to have_dropdown_items(count: 4)
expect(subject).to have_dropdown_item('Accepter')
expect(subject).to have_dropdown_item('Classer sans suite')
expect(subject).to have_dropdown_item('Refuser')
expect(subject).to have_dropdown_item('Demander une correction')
end
end
end

View file

@ -1,53 +0,0 @@
describe 'instructeurs/dossiers/instruction_button', type: :view do
include DossierHelper
subject! do
render('instructeurs/dossiers/instruction_button', dossier: dossier)
end
matcher :have_dropdown_title do |expected_title|
match do |rendered|
expect(rendered).to have_selector('.dropdown .dropdown-button', text: expected_title)
end
end
matcher :have_dropdown_items do |options|
match do |rendered|
expected_count = options[:count] || 1
expect(rendered).to have_selector('ul.dropdown-items li:not(.hidden)', count: expected_count)
end
end
matcher :have_dropdown_item do |expected_title, options = {}|
match do |rendered|
expected_href = options[:href]
if (expected_href.present?)
expect(rendered).to have_selector("ul.dropdown-items li a[href='#{expected_href}']", text: expected_title)
else
expect(rendered).to have_selector('ul.dropdown-items li', text: expected_title)
end
end
end
context 'en_construction' do
let(:dossier) { create(:dossier, :en_construction) }
it 'renders a dropdown' do
expect(rendered).to have_dropdown_title('Demander une correction')
expect(rendered).to have_dropdown_items(count: 2) # form is already expanded so we have 2 visible items
end
end
context 'en_instruction' do
let(:dossier) { create(:dossier, :en_instruction) }
it 'renders a dropdown' do
expect(rendered).to have_dropdown_title('Instruire le dossier')
expect(rendered).to have_dropdown_items(count: 4)
expect(rendered).to have_dropdown_item('Accepter')
expect(rendered).to have_dropdown_item('Classer sans suite')
expect(rendered).to have_dropdown_item('Refuser')
expect(rendered).to have_dropdown_item('Demander une correction')
end
end
end