From ba0d3fa678fc02e8f45251ac8524fc466cf30ca6 Mon Sep 17 00:00:00 2001 From: Christophe Robillard Date: Sat, 12 Aug 2023 11:13:08 +0200 Subject: [PATCH] instructeur can create contact information for groupe instructeur --- .../contact_informations_controller.rb | 30 ++++++++++ .../contact_informations/_form.html.haml | 32 ++++++++++ .../contact_informations/new.html.haml | 10 ++++ .../groupe_instructeurs/show.html.haml | 6 ++ config/locales/models/service/fr.yml | 3 +- config/routes.rb | 1 + .../contact_informations_controller_spec.rb | 59 +++++++++++++++++++ 7 files changed, 140 insertions(+), 1 deletion(-) create mode 100644 app/controllers/instructeurs/contact_informations_controller.rb create mode 100644 app/views/instructeurs/contact_informations/_form.html.haml create mode 100644 app/views/instructeurs/contact_informations/new.html.haml create mode 100644 spec/controllers/instructeurs/contact_informations_controller_spec.rb diff --git a/app/controllers/instructeurs/contact_informations_controller.rb b/app/controllers/instructeurs/contact_informations_controller.rb new file mode 100644 index 000000000..797627894 --- /dev/null +++ b/app/controllers/instructeurs/contact_informations_controller.rb @@ -0,0 +1,30 @@ +module Instructeurs + class ContactInformationsController < InstructeurController + def new + assign_procedure_and_groupe_instructeur + @contact_information = @groupe_instructeur.build_contact_information + end + + def create + assign_procedure_and_groupe_instructeur + @contact_information = @groupe_instructeur.build_contact_information(contact_information_params) + if @contact_information.save + redirect_to instructeur_groupe_path(@groupe_instructeur, procedure_id: @procedure.id), notice: "Les informations de contact ont bien été ajoutées" + else + flash[:alert] = @contact_information.errors.full_messages + render :new + end + end + + private + + def assign_procedure_and_groupe_instructeur + @procedure = current_instructeur.procedures.find params[:procedure_id] + @groupe_instructeur = current_instructeur.groupe_instructeurs.find params[:groupe_id] + end + + def contact_information_params + params.require(:contact_information).permit(:nom, :email, :telephone, :horaires, :adresse) + end + end +end diff --git a/app/views/instructeurs/contact_informations/_form.html.haml b/app/views/instructeurs/contact_informations/_form.html.haml new file mode 100644 index 000000000..47395ea55 --- /dev/null +++ b/app/views/instructeurs/contact_informations/_form.html.haml @@ -0,0 +1,32 @@ += form_with url: instructeur_groupe_contact_information_path, model: @contact_information, local: true do |f| + + = render Dsfr::CalloutComponent.new(title: "Informations de contact") do |c| + - c.body do + Votre démarche est hébergée par #{APPLICATION_NAME} – mais nous ne pouvons pas assurer le support des démarches. Et malgré la dématérialisation, les usagers se posent parfois des questions légitimes sur le processus administratif. + %br + %br + %strong Il est donc indispensable que les usagers puissent vous contacter + par le moyen de leur choix s’ils ont des questions sur votre démarche. + %br + %br + Ces informations de contact seront visibles par les utilisateurs de la démarche, affichées dans le menu « Aide », ainsi qu’en pied de page lors du dépôt d’un dossier. + %br + %br + ⚠️ En cas d’informations invalides, #{APPLICATION_NAME} se réserve le droit de suspendre la publication de la démarche. + + = render Dsfr::InputComponent.new(form: f, attribute: :nom, input_type: :text_field) do |c| + - c.with_hint do + Indiquez le nom à utiliser pour contacter le groupe instructeur + (Exemple: Secrétariat de la Mairie) + + = render Dsfr::InputComponent.new(form: f, attribute: :email, input_type: :email_field) + = render Dsfr::InputComponent.new(form: f, attribute: :telephone, input_type: :telephone_field) + = render Dsfr::InputComponent.new(form: f, attribute: :horaires, input_type: :text_area) + = render Dsfr::InputComponent.new(form: f, attribute: :adresse, input_type: :text_area) + + - if procedure_id.present? + = hidden_field_tag :procedure_id, procedure_id + + .sticky-action-footer + = f.submit "Enregistrer", class: "fr-btn fr-mr-2w" + = link_to "Annuler", instructeur_groupe_path(@groupe_instructeur, procedure_id: procedure_id), class: "fr-btn fr-btn--secondary" diff --git a/app/views/instructeurs/contact_informations/new.html.haml b/app/views/instructeurs/contact_informations/new.html.haml new file mode 100644 index 000000000..18450ac3e --- /dev/null +++ b/app/views/instructeurs/contact_informations/new.html.haml @@ -0,0 +1,10 @@ += render partial: 'administrateurs/breadcrumbs', + locals: { steps: [[@procedure.libelle.truncate_words(10), instructeur_procedure_path(@procedure)], + ['Groupes d’instructeurs', instructeur_groupes_path(@procedure)], + [@groupe_instructeur.label, instructeur_groupe_path(@groupe_instructeur, procedure_id: @procedure.id) ], + ['Service']]} +.container + %h1 Informations de contact + + = render partial: 'form', + locals: { contact_information: @contact_information, procedure_id: @procedure.id } diff --git a/app/views/instructeurs/groupe_instructeurs/show.html.haml b/app/views/instructeurs/groupe_instructeurs/show.html.haml index ef16232c2..dd6ec4118 100644 --- a/app/views/instructeurs/groupe_instructeurs/show.html.haml +++ b/app/views/instructeurs/groupe_instructeurs/show.html.haml @@ -48,3 +48,9 @@ class: 'button' } = paginate @instructeurs, views_prefix: 'shared' + .card.mt-2 + .card-title Informations de contact + - if @groupe_instructeur.contact_information.nil? + = "Le groupe #{@groupe_instructeur.label} n'a pas d'informations de contact. Les informations de contact affichées à l'usager seront celles du service de la procédure" + %p.mt-3 + = link_to "+ Ajouter des informations de contact", new_instructeur_groupe_contact_information_path(procedure_id: @procedure.id, groupe_id: @groupe_instructeur.id), class: "fr-btn" diff --git a/config/locales/models/service/fr.yml b/config/locales/models/service/fr.yml index 40b6a2e0b..1abe6afdb 100644 --- a/config/locales/models/service/fr.yml +++ b/config/locales/models/service/fr.yml @@ -5,7 +5,7 @@ fr: one: 'Service' other: 'Services' attributes: - service: + service: &service adresse: 'Adresse postale' email: 'Email de contact' telephone: 'Téléphone' @@ -27,6 +27,7 @@ fr: Exemple : Du lundi au vendredi de 9h30 à 17h30, le samedi de 9h30 à 12h. adresse: | Indiquez l’adresse à laquelle un usager peut vous contacter, par exemple s’il n’est pas en capacité de compléter son formulaire en ligne. + contact_information: *service errors: models: diff --git a/config/routes.rb b/config/routes.rb index eb74b18a6..8857a0890 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -394,6 +394,7 @@ Rails.application.routes.draw do resources :archives, only: [:index, :create] resources :groupes, only: [:index, :show], controller: 'groupe_instructeurs' do + resource :contact_information member do post 'add_instructeur' delete 'remove_instructeur' diff --git a/spec/controllers/instructeurs/contact_informations_controller_spec.rb b/spec/controllers/instructeurs/contact_informations_controller_spec.rb new file mode 100644 index 000000000..986bcc046 --- /dev/null +++ b/spec/controllers/instructeurs/contact_informations_controller_spec.rb @@ -0,0 +1,59 @@ +describe Instructeurs::ContactInformationsController, type: :controller do + let(:instructeur) { create(:instructeur) } + let(:procedure) { create(:procedure) } + let(:assign_to) { create(:assign_to, instructeur: instructeur, groupe_instructeur: build(:groupe_instructeur, procedure: procedure)) } + let(:gi) { assign_to.groupe_instructeur } + + before do + sign_in(instructeur.user) + end + + describe '#create' do + context 'when submitting a new contact_information' do + let(:params) do + { + contact_information: { + nom: 'super service', + email: 'email@toto.com', + telephone: '1234', + horaires: 'horaires', + adresse: 'adresse' + }, + procedure_id: procedure.id, + groupe_id: gi.id + } + end + + it do + post :create, params: params + expect(flash.alert).to be_nil + expect(flash.notice).to eq('Les informations de contact ont bien été ajoutées') + expect(ContactInformation.last.nom).to eq('super service') + expect(ContactInformation.last.email).to eq('email@toto.com') + expect(ContactInformation.last.telephone).to eq('1234') + expect(ContactInformation.last.horaires).to eq('horaires') + expect(ContactInformation.last.adresse).to eq('adresse') + end + end + + context 'when submitting an invalid contact_information' do + before do + post :create, params: params + end + + let(:params) { + { + contact_information: { + nom: 'super service' + }, + procedure_id: procedure.id, + groupe_id: gi.id + } + } + + it { expect(flash.alert).not_to be_nil } + it { expect(response).to render_template(:new) } + it { expect(assigns(:contact_information).nom).to eq('super service') } + end + end +end