From dd57953b76232652d05ee7fb2d0ec21f12d82a91 Mon Sep 17 00:00:00 2001 From: Pierre de La Morinerie Date: Mon, 14 Oct 2019 11:18:59 +0000 Subject: [PATCH] views: refactor the state button Now that all states have a dropdown, we can simplify the code. This also brings the "Repasser en instruction" action for all states (including when no attestation or motivation is present). --- .../dossiers/_state_button.html.haml | 164 +++++++++--------- .../dossiers/_state_button.html.haml_spec.rb | 34 +--- 2 files changed, 91 insertions(+), 107 deletions(-) diff --git a/app/views/instructeurs/dossiers/_state_button.html.haml b/app/views/instructeurs/dossiers/_state_button.html.haml index 84e39f9f8..def2c8496 100644 --- a/app/views/instructeurs/dossiers/_state_button.html.haml +++ b/app/views/instructeurs/dossiers/_state_button.html.haml @@ -1,93 +1,95 @@ -- if dossier.en_construction? || dossier.en_instruction? +%span.dropdown + -# Dropdown button title + %button.button.primary.dropdown-button{ class: button_or_label_class(dossier) } + = dossier_display_state dossier - -# ----------------------------------------- - -# Dossier EN CONSTRUCTION ou EN INSTRUCTION - -# ----------------------------------------- + -# Dropdown content + .dropdown-content.fade-in-down{ class: ('terminated' if dossier.termine?) } - %span.dropdown - %button.button.primary.dropdown-button - = dossier_display_state dossier - .dropdown-content.fade-in-down + - if dossier.en_construction? + -# ------------------------------------------------------ + -# EN CONSTRUCTION + -# ------------------------------------------------------ %ul.dropdown-items - - if dossier.en_construction? - %li.selected - %span.icon.edit - .dropdown-description - %h4 En construction - Vous permettez à l'usager de modifier ses réponses au formulaire - %li - = link_to passer_en_instruction_instructeur_dossier_path(dossier.procedure, dossier), method: :post, data: { remote: true, confirm: "Confirmez-vous le passage en instruction de ce dossier ?" } do - %span.icon.in-progress - .dropdown-description - %h4 Passer en instruction - L'usager ne pourra plus modifier le formulaire - - if dossier.en_instruction? - %li - = link_to repasser_en_construction_instructeur_dossier_path(dossier.procedure, dossier), method: :post, data: { remote:true, confirm: "Confirmez-vous le passage en construction de ce dossier ?" } do - %span.icon.edit - .dropdown-description - %h4 Repasser en construction - Vous permettrez à l'usager de modifier ses réponses au formulaire - %li.selected + %li.selected + %span.icon.edit + .dropdown-description + %h4 En construction + Vous permettez à l'usager de modifier ses réponses au formulaire + + %li + = link_to passer_en_instruction_instructeur_dossier_path(dossier.procedure, dossier), method: :post, data: { remote: true, confirm: "Confirmez-vous le passage en instruction de ce dossier ?" } do %span.icon.in-progress .dropdown-description - %h4 En instruction - L'usager ne peut modifier son dossier pendant l'instruction - %li - %a{ href: '#', onclick: "DS.showMotivation(event, 'accept');" } - %span.icon.accept - .dropdown-description - %h4 Accepter - L'usager sera notifié que son dossier a été accepté - %li - %a{ href: '#', onclick: "DS.showMotivation(event, 'without-continuation');" } - %span.icon.without-continuation - .dropdown-description - %h4 Classer sans suite - L'usager sera notifié que son dossier a été classé sans suite - %li - %a{ href: '#', onclick: "DS.showMotivation(event, 'refuse');" } - %span.icon.refuse - .dropdown-description - %h4 Refuser - L'usager sera notifié que son dossier a été refusé - = render partial: 'instructeurs/dossiers/state_button_motivation', locals: { dossier: dossier, popup_title: 'Accepter le 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 ?" } - = render partial: 'instructeurs/dossiers/state_button_motivation', locals: { dossier: dossier, popup_title: 'Classer le dossier sans suite', 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 ?' } - = render partial: 'instructeurs/dossiers/state_button_motivation', locals: { dossier: dossier, popup_title: 'Refuser le 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 ?' } + %h4 Passer en instruction + L'usager ne pourra plus modifier le formulaire -- else + - elsif dossier.en_instruction? + -# ------------------------------------------------------ + -# EN INSTRUCTION + -# ------------------------------------------------------ + %ul.dropdown-items - -# --------------------------------------------------- - -# Dossier TERMINÉ - -# --------------------------------------------------- + %li + = link_to repasser_en_construction_instructeur_dossier_path(dossier.procedure, dossier), method: :post, data: { remote:true, confirm: "Confirmez-vous le passage en construction de ce dossier ?" } do + %span.icon.edit + .dropdown-description + %h4 Repasser en construction + Vous permettrez à l'usager de modifier ses réponses au formulaire - - if dossier.motivation.present? || dossier.attestation.present? - %span.dropdown - %button.button.dropdown-button{ class: button_or_label_class(dossier) } - = dossier_display_state(dossier, lower: true) - .dropdown-content.fade-in-down.terminated - - if dossier.motivation.present? - %h4.title Motivation - %p.dossier-motivation= dossier.motivation - = render partial: 'users/dossiers/show/download_justificatif', locals: { dossier: dossier } + %li.selected + %span.icon.in-progress + .dropdown-description + %h4 En instruction + L'usager ne peut modifier son dossier pendant l'instruction - - if dossier.attestation.present? - %h4.title Attestation - %p.attestation L'acceptation du dossier a envoyé automatiquement une attestation au demandeur - = link_to "Voir l'attestation", attestation_instructeur_dossier_path(dossier.procedure, dossier), target: '_blank', rel: 'noopener', class: 'button' + %li + %a{ href: '#', onclick: "DS.showMotivation(event, 'accept');" } + %span.icon.accept + .dropdown-description + %h4 Accepter + L'usager sera notifié que son dossier a été accepté - - if dossier.termine? - %ul.dropdown-items.with-top-border - %li - = link_to repasser_en_instruction_instructeur_dossier_path(dossier.procedure, dossier), method: :post, data: { remote:true, confirm: "Voulez vous remettre le dossier #{dossier.id} en instruction ?" } do - %span.icon.in-progress - .dropdown-description - %h4 Repasser en instruction - L’usager sera notifié que son dossier est réexaminé. + %li + %a{ href: '#', onclick: "DS.showMotivation(event, 'without-continuation');" } + %span.icon.without-continuation + .dropdown-description + %h4 Classer sans suite + L'usager sera notifié que son dossier a été classé sans suite - - else - -# No actions to perform: only display a label with the dossier state - -# FIXME: we still should be able to move back the dossier to instruction - %span.label{ class: button_or_label_class(dossier) } - = dossier_display_state(dossier, lower: true) + %li + %a{ href: '#', onclick: "DS.showMotivation(event, 'refuse');" } + %span.icon.refuse + .dropdown-description + %h4 Refuser + L'usager sera notifié que son dossier a été refusé + + = render partial: 'instructeurs/dossiers/state_button_motivation', locals: { dossier: dossier, popup_title: 'Accepter le 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 ?" } + + = render partial: 'instructeurs/dossiers/state_button_motivation', locals: { dossier: dossier, popup_title: 'Classer le dossier sans suite', 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 ?' } + + = render partial: 'instructeurs/dossiers/state_button_motivation', locals: { dossier: dossier, popup_title: 'Refuser le 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 ?' } + + - elsif dossier.termine? + -# --------------------------------------------------- + -# TERMINÉ + -# --------------------------------------------------- + -# TODO: turn the motivation and attestation into regular dropdown items + - if dossier.motivation.present? + %h4.title Motivation + %p.dossier-motivation= dossier.motivation + = render partial: 'users/dossiers/show/download_justificatif', locals: { dossier: dossier } + + - if dossier.attestation.present? + %h4.title Attestation + %p.attestation L'acceptation du dossier a envoyé automatiquement une attestation au demandeur + = link_to "Voir l'attestation", attestation_instructeur_dossier_path(dossier.procedure, dossier), target: '_blank', rel: 'noopener', class: 'button' + + %ul.dropdown-items.with-top-border + %li + = link_to repasser_en_instruction_instructeur_dossier_path(dossier.procedure, dossier), method: :post, data: { remote:true, confirm: "Voulez vous remettre le dossier #{dossier.id} en instruction ?" } do + %span.icon.in-progress + .dropdown-description + %h4 Repasser en instruction + L’usager sera notifié que son dossier est réexaminé. diff --git a/spec/views/instructeur/dossiers/_state_button.html.haml_spec.rb b/spec/views/instructeur/dossiers/_state_button.html.haml_spec.rb index 49599613e..32030a098 100644 --- a/spec/views/instructeur/dossiers/_state_button.html.haml_spec.rb +++ b/spec/views/instructeur/dossiers/_state_button.html.haml_spec.rb @@ -7,13 +7,6 @@ describe 'instructeurs/dossiers/state_button.html.haml', type: :view do render('instructeurs/dossiers/state_button.html.haml', dossier: dossier) end - matcher :have_state_label do |expected_title| - match do |rendered| - expect(rendered).to have_selector('.label', text: expected_title) - expect(rendered).not_to have_selector('.dropdown') - end - end - matcher :have_dropdown_title do |expected_title| match do |rendered| expect(rendered).to have_selector('.dropdown .dropdown-button', text: expected_title) @@ -39,13 +32,13 @@ describe 'instructeurs/dossiers/state_button.html.haml', type: :view do end context 'brouillon' do - let(:dossier) { create(:dossier) } - # Currently the state button is not supposed to be displayed for brouillons. # But better have a sane fallback than crashing. + let(:dossier) { create(:dossier) } - it 'renders a label' do - expect(rendered).to have_state_label('brouillon') + it 'renders a dropdown' do + expect(rendered).to have_dropdown_title('Brouillon') + expect(rendered).to have_dropdown_items(count: 0) end end @@ -77,20 +70,15 @@ describe 'instructeurs/dossiers/state_button.html.haml', type: :view do shared_examples 'a dropdown for a closed state' do |state| let(:dossier) { create :dossier, state } - # FIXME: it should also render the link to move back to instruction - it 'renders a simple label' do - expect(rendered).to have_state_label(dossier_display_state(dossier, lower: true)) + it 'renders a dropdown' do + expect(rendered).to have_dropdown_title(dossier_display_state(dossier)) + expect(rendered).to have_dropdown_items(count: 1) + expect(rendered).to have_dropdown_item('Repasser en instruction', href: repasser_en_instruction_instructeur_dossier_path(dossier.procedure, dossier)) end context 'with a motivation' do let(:dossier) { create :dossier, state, motivation: 'Correspond au programme' } - it 'renders a dropdown' do - expect(rendered).to have_dropdown_title(dossier_display_state(dossier, lower: true)) - expect(rendered).to have_dropdown_items(count: 1) - expect(rendered).to have_dropdown_item('Repasser en instruction', href: repasser_en_instruction_instructeur_dossier_path(dossier.procedure, dossier)) - end - it 'displays the motivation text' do expect(rendered).to have_content('Motivation') expect(rendered).to have_content(dossier.motivation) @@ -100,12 +88,6 @@ describe 'instructeurs/dossiers/state_button.html.haml', type: :view do context 'with an attestation' do let(:dossier) { create :dossier, state, :with_attestation } - it 'renders a dropdown' do - expect(rendered).to have_dropdown_title(dossier_display_state(dossier, lower: true)) - expect(rendered).to have_dropdown_items(count: 1) - expect(rendered).to have_dropdown_item('Repasser en instruction', href: repasser_en_instruction_instructeur_dossier_path(dossier.procedure, dossier)) - end - it 'provides a link to the attestation' do expect(rendered).to have_content('Attestation') expect(rendered).to have_link(href: attestation_instructeur_dossier_path(dossier.procedure, dossier))