From eea6b961d7d761387bda3e0cf2b70cd7dec82c46 Mon Sep 17 00:00:00 2001 From: Paul Chavard Date: Tue, 14 Sep 2021 19:47:53 +0200 Subject: [PATCH 1/9] refactor(routage): remove administrateur_routage feature flag --- .../procedures/_procedures_list.html.haml | 2 +- .../new_administrateur/procedures/show.html.haml | 14 ++++---------- config/initializers/flipper.rb | 1 - spec/features/routing/full_scenario_spec.rb | 1 - 4 files changed, 5 insertions(+), 13 deletions(-) diff --git a/app/views/new_administrateur/procedures/_procedures_list.html.haml b/app/views/new_administrateur/procedures/_procedures_list.html.haml index b01e0944f..f22fd03c4 100644 --- a/app/views/new_administrateur/procedures/_procedures_list.html.haml +++ b/app/views/new_administrateur/procedures/_procedures_list.html.haml @@ -18,7 +18,7 @@ .admin-procedures-list-row.actions.flex.justify-between %div - - if feature_enabled?(:administrateur_routage) + - if procedure.routee? %span.icon.person %span.badge.baseline= procedure.groupe_instructeurs.count - else diff --git a/app/views/new_administrateur/procedures/show.html.haml b/app/views/new_administrateur/procedures/show.html.haml index ace97a9b7..1614d180f 100644 --- a/app/views/new_administrateur/procedures/show.html.haml +++ b/app/views/new_administrateur/procedures/show.html.haml @@ -107,14 +107,8 @@ %p.card-admin-subtitle Gestion de la démarche %p.button Modifier - - - if feature_enabled?(:administrateur_routage) - - instructeur_link = admin_procedure_groupe_instructeurs_path(@procedure) - - else - - instructeur_link = admin_procedure_groupe_instructeur_path(@procedure, @procedure.defaut_groupe_instructeur) - - = link_to instructeur_link, id: 'groupe-instructeurs', class: 'card-admin' do - - if feature_enabled?(:administrateur_routage) || @procedure.instructeurs.count > 1 + = link_to admin_procedure_groupe_instructeurs_path(@procedure), id: 'groupe-instructeurs', class: 'card-admin' do + - if @procedure.routee? || @procedure.instructeurs.count > 1 %div %span.icon.accept %p.card-admin-status-accept Validé @@ -124,12 +118,12 @@ %p.card-admin-status-todo À faire %div %p.card-admin-title - - if feature_enabled?(:administrateur_routage) + - if @procedure.routee? %span.badge.baseline= @procedure.groupe_instructeurs.count - else %span.badge.baseline= @procedure.instructeurs.count - = feature_enabled?(:administrateur_routage) ? "Groupe Instructeurs" : "#{"Instructeur".pluralize(@procedure.instructeurs.count)}" + = @procedure.routee? ? "Groupe Instructeurs" : "#{"Instructeur".pluralize(@procedure.instructeurs.count)}" %p.card-admin-subtitle Suivi des dossiers %p.button Modifier diff --git a/config/initializers/flipper.rb b/config/initializers/flipper.rb index 568077eb8..1dd25d5cd 100644 --- a/config/initializers/flipper.rb +++ b/config/initializers/flipper.rb @@ -25,7 +25,6 @@ end # A list of features to be deployed on first push features = [ - :administrateur_routage, :administrateur_web_hook, :api_particulier, :dossier_pdf_vide, diff --git a/spec/features/routing/full_scenario_spec.rb b/spec/features/routing/full_scenario_spec.rb index 516da20dd..dc5853468 100644 --- a/spec/features/routing/full_scenario_spec.rb +++ b/spec/features/routing/full_scenario_spec.rb @@ -7,7 +7,6 @@ feature 'The routing', js: true do before do procedure.defaut_groupe_instructeur.instructeurs << administrateur.instructeur - Flipper.enable_actor(:administrateur_routage, administrateur.user) end scenario 'works' do From 8b4bef2816491e3a1ba9e9c10a8eebdcf579a931 Mon Sep 17 00:00:00 2001 From: Paul Chavard Date: Tue, 14 Sep 2021 19:48:38 +0200 Subject: [PATCH 2/9] refactor(routage): simplify goupe_instructeur assign code --- .../groupe_instructeurs_controller.rb | 4 +--- app/models/instructeur.rb | 14 +++++--------- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/app/controllers/new_administrateur/groupe_instructeurs_controller.rb b/app/controllers/new_administrateur/groupe_instructeurs_controller.rb index 34855c64b..ad8a5478b 100644 --- a/app/controllers/new_administrateur/groupe_instructeurs_controller.rb +++ b/app/controllers/new_administrateur/groupe_instructeurs_controller.rb @@ -131,9 +131,7 @@ module NewAdministrateur else if instructeurs.present? - instructeurs.each do |instructeur| - instructeur.assign_to_procedure(procedure) - end + procedure.defaut_groupe_instructeur.instructeurs << instructeurs flash[:notice] = "Les instructeurs ont bien été affectés à la démarche" end end diff --git a/app/models/instructeur.rb b/app/models/instructeur.rb index 588502504..13caa3026 100644 --- a/app/models/instructeur.rb +++ b/app/models/instructeur.rb @@ -73,19 +73,15 @@ class Instructeur < ApplicationRecord end def assign_to_procedure(procedure) - begin - assign_to.create({ - procedure: procedure, - groupe_instructeur: procedure.defaut_groupe_instructeur - }) - true - rescue ActiveRecord::RecordNotUnique - false + if !procedure.defaut_groupe_instructeur.in?(groupe_instructeurs) + groupe_instructeurs << procedure.defaut_groupe_instructeur end end def remove_from_procedure(procedure) - !!(procedure.defaut_groupe_instructeur.in?(groupe_instructeurs) && groupe_instructeurs.destroy(procedure.defaut_groupe_instructeur)) + if procedure.defaut_groupe_instructeur.in?(groupe_instructeurs) + groupe_instructeurs.destroy(procedure.defaut_groupe_instructeur) + end end def last_week_overview From 0ff62c5a5e8672544db619d64634873c68f18ad7 Mon Sep 17 00:00:00 2001 From: Paul Chavard Date: Sat, 18 Sep 2021 11:22:35 +0200 Subject: [PATCH 3/9] feat(routage): add routing_enabled to procedures --- app/models/procedure.rb | 3 ++- .../20210915083823_add_routing_enabled_to_procedures.rb | 5 +++++ db/schema.rb | 3 ++- 3 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 db/migrate/20210915083823_add_routing_enabled_to_procedures.rb diff --git a/app/models/procedure.rb b/app/models/procedure.rb index c989d40e1..5cfc9b618 100644 --- a/app/models/procedure.rb +++ b/app/models/procedure.rb @@ -35,6 +35,7 @@ # path :string not null # published_at :datetime # routing_criteria_name :text default("Votre ville") +# routing_enabled :boolean # test_started_at :datetime # unpublished_at :datetime # web_hook_url :string @@ -628,7 +629,7 @@ class Procedure < ApplicationRecord end def routee? - groupe_instructeurs.size > 1 + routing_enabled? || groupe_instructeurs.size > 1 end def defaut_groupe_instructeur_for_new_dossier diff --git a/db/migrate/20210915083823_add_routing_enabled_to_procedures.rb b/db/migrate/20210915083823_add_routing_enabled_to_procedures.rb new file mode 100644 index 000000000..a10975ac3 --- /dev/null +++ b/db/migrate/20210915083823_add_routing_enabled_to_procedures.rb @@ -0,0 +1,5 @@ +class AddRoutingEnabledToProcedures < ActiveRecord::Migration[6.1] + def change + add_column :procedures, :routing_enabled, :boolean + end +end diff --git a/db/schema.rb b/db/schema.rb index 1934e453c..43760d140 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2021_09_08_170019) do +ActiveRecord::Schema.define(version: 2021_09_15_170019) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -622,6 +622,7 @@ ActiveRecord::Schema.define(version: 2021_09_08_170019) do t.text "api_particulier_scopes", default: [], array: true t.jsonb "api_particulier_sources", default: {} t.index ["api_particulier_sources"], name: "index_procedures_on_api_particulier_sources", using: :gin + t.boolean "routing_enabled" t.index ["declarative_with_state"], name: "index_procedures_on_declarative_with_state" t.index ["draft_revision_id"], name: "index_procedures_on_draft_revision_id" t.index ["hidden_at"], name: "index_procedures_on_hidden_at" From 0c5c8faf16ff72cbb9085ac4829e37518f6bcc3a Mon Sep 17 00:00:00 2001 From: Paul Chavard Date: Tue, 14 Sep 2021 19:54:35 +0200 Subject: [PATCH 4/9] feat(routage): enable routage for everyone --- .../groupe_instructeurs_controller.rb | 36 ++++++++- .../groupe_instructeurs/_edit.html.haml | 52 +++++++++++++ .../_instructeurs.html.haml | 37 ++++++++++ .../groupe_instructeurs/_routing.html.haml | 12 +++ .../groupe_instructeurs/index.html.haml | 73 +++++-------------- .../groupe_instructeurs/show.html.haml | 63 +++------------- config/routes.rb | 1 + 7 files changed, 164 insertions(+), 110 deletions(-) create mode 100644 app/views/new_administrateur/groupe_instructeurs/_edit.html.haml create mode 100644 app/views/new_administrateur/groupe_instructeurs/_instructeurs.html.haml create mode 100644 app/views/new_administrateur/groupe_instructeurs/_routing.html.haml diff --git a/app/controllers/new_administrateur/groupe_instructeurs_controller.rb b/app/controllers/new_administrateur/groupe_instructeurs_controller.rb index ad8a5478b..2e28b23c2 100644 --- a/app/controllers/new_administrateur/groupe_instructeurs_controller.rb +++ b/app/controllers/new_administrateur/groupe_instructeurs_controller.rb @@ -11,7 +11,15 @@ module NewAdministrateur def index @procedure = procedure - @groupes_instructeurs = paginated_groupe_instructeurs + if procedure.routee? + @groupes_instructeurs = paginated_groupe_instructeurs + @instructeurs = [] + @available_instructeur_emails = [] + else + @groupes_instructeurs = [] + @instructeurs = paginated_instructeurs + @available_instructeur_emails = available_instructeur_emails + end end def show @@ -137,7 +145,11 @@ module NewAdministrateur end end - redirect_to admin_procedure_groupe_instructeur_path(procedure, groupe_instructeur) + if procedure.routee? + redirect_to admin_procedure_groupe_instructeur_path(procedure, groupe_instructeur) + else + redirect_to admin_procedure_groupe_instructeurs_path(procedure) + end end def remove_instructeur @@ -162,7 +174,12 @@ module NewAdministrateur end end end - redirect_to admin_procedure_groupe_instructeur_path(procedure, groupe_instructeur) + + if procedure.routee? + redirect_to admin_procedure_groupe_instructeur_path(procedure, groupe_instructeur) + else + redirect_to admin_procedure_groupe_instructeurs_path(procedure) + end end def update_routing_criteria_name @@ -172,6 +189,13 @@ module NewAdministrateur notice: "Le libellé est maintenant « #{procedure.routing_criteria_name} »." end + def update_routing_enabled + procedure.update!(routing_enabled: true) + + redirect_to admin_procedure_groupe_instructeurs_path(procedure), + notice: "Le routage est activé." + end + def import if !CSV_ACCEPTED_CONTENT_TYPES.include?(group_csv_file.content_type) && !CSV_ACCEPTED_CONTENT_TYPES.include?(marcel_content_type) flash[:alert] = "Importation impossible : veuillez importer un fichier CSV" @@ -225,7 +249,11 @@ module NewAdministrateur end def groupe_instructeur - procedure.groupe_instructeurs.find(params[:id]) + if params[:id].present? + procedure.groupe_instructeurs.find(params[:id]) + else + procedure.defaut_groupe_instructeur + end end def instructeur_id diff --git a/app/views/new_administrateur/groupe_instructeurs/_edit.html.haml b/app/views/new_administrateur/groupe_instructeurs/_edit.html.haml new file mode 100644 index 000000000..9a21d519a --- /dev/null +++ b/app/views/new_administrateur/groupe_instructeurs/_edit.html.haml @@ -0,0 +1,52 @@ +.card + = form_for procedure, + url: { action: :update_routing_criteria_name }, + html: { class: 'form' } do |f| + + = f.label :routing_criteria_name do + Libellé du routage + %p.notice Ce texte apparaitra sur le formulaire usager comme le libellé d’une liste + = f.text_field :routing_criteria_name, placeholder: 'ex. Votre ville', required: true + = f.submit 'Renommer', class: 'button primary send' + +.card + .card-title Gestion des Groupes + + = form_for :groupe_instructeur, html: { class: 'form' } do |f| + = f.label :label do + Ajouter un groupe + %p.notice Ce groupe sera un choix de la liste « #{procedure.routing_criteria_name} » . + = f.text_field :label, placeholder: 'ex. Ville de Bordeaux', required: true + = f.submit 'Ajouter le groupe', class: 'button primary send' + + - csv_max_size = NewAdministrateur::GroupeInstructeursController::CSV_MAX_SIZE + = form_tag import_admin_procedure_groupe_instructeurs_path(procedure), method: :post, multipart: true, class: "mt-4 form" do + = label_tag "Importer par fichier CSV" + %p.notice Le fichier csv doit comporter 2 colonnes (Groupe, Email) et être séparé par des virgules. L'import n'écrase pas les groupes et les instructeurs existants. + %p.notice Le poids du fichier doit être inférieur à #{number_to_human_size(csv_max_size)} + %p.mt-2.mb-2= link_to "Télécharger l'exemple de fichier CSV", "/import-groupe-test.csv" + = file_field_tag :group_csv_file, required: true, accept: 'text/csv', size: "1" + = submit_tag "Importer le fichier", class: 'button primary send', data: { disable_with: "Envoi..." } + + %table.table.mt-2 + %thead + %tr + %th{ colspan: 2 }= t(".existing_groupe", count: groupes_instructeurs.total_count) + %tbody + - groupes_instructeurs.each do |group| + %tr + %td= group.label + %td.actions= link_to "voir", admin_procedure_groupe_instructeur_path(procedure, group) + - if groupes_instructeurs.many? + - if group.dossiers.empty? + %td.actions + = link_to admin_procedure_groupe_instructeur_path(procedure, group), { method: :delete, class: 'button', data: { confirm: "Êtes-vous sûr de vouloir supprimer le groupe « #{group.label} » ?" }} do + %span.icon.delete + supprimer ce groupe + - else + %td.actions + = link_to reaffecter_dossiers_admin_procedure_groupe_instructeur_path(procedure, group), class: 'button', title:'Réaffecter les dossiers à un autre groupe afin de pouvoir le supprimer' do + %span.icon.follow + déplacer les dossiers + + = paginate groupes_instructeurs diff --git a/app/views/new_administrateur/groupe_instructeurs/_instructeurs.html.haml b/app/views/new_administrateur/groupe_instructeurs/_instructeurs.html.haml new file mode 100644 index 000000000..ea2baa00e --- /dev/null +++ b/app/views/new_administrateur/groupe_instructeurs/_instructeurs.html.haml @@ -0,0 +1,37 @@ + +.card + .card-title Affectation des instructeurs + = form_for :instructeur, url: { action: :add_instructeur, id: groupe_instructeur.id }, html: { class: 'form' } do |f| + .instructeur-wrapper + - if !procedure.routee? + %p.notice Entrez les adresses email des instructeurs que vous souhaitez affecter à cette démarche + - hidden_field_id = SecureRandom.uuid + = hidden_field_tag :emails, nil, data: { uuid: hidden_field_id } + = react_component("ComboMultipleDropdownList", + options: available_instructeur_emails, selected: [], disabled: [], + hiddenFieldId: hidden_field_id, + label: 'email instructeur', + acceptNewValues: true) + + = f.submit 'Affecter', class: 'button primary send' + + %table.table.mt-2 + %thead + %tr + %th{ colspan: 2 }= t('.assigned_instructeur', count: instructeurs.count) + %tbody + - instructeurs.each do |instructeur| + %tr + %td + %span.icon.person + #{instructeur.email} + + - confirmation_message = procedure.routee? ? "Êtes-vous sûr de vouloir retirer l’instructeur « #{instructeur.email} » du groupe « #{groupe_instructeur.label} » ?" : "Êtes-vous sûr de vouloir retirer l’instructeur « #{instructeur.email} » de la démarche ?" + %td.actions= button_to 'retirer', + { action: :remove_instructeur, id: groupe_instructeur.id }, + { method: :delete, + data: { confirm: confirmation_message }, + params: { instructeur: { id: instructeur.id }}, + class: 'button' } + + = paginate instructeurs diff --git a/app/views/new_administrateur/groupe_instructeurs/_routing.html.haml b/app/views/new_administrateur/groupe_instructeurs/_routing.html.haml new file mode 100644 index 000000000..0ae62a2d9 --- /dev/null +++ b/app/views/new_administrateur/groupe_instructeurs/_routing.html.haml @@ -0,0 +1,12 @@ +.card + .card-title Routage + %p.notice + Le routage est une fonctionnalité pour les démarches nécessitant le partage de l’instruction entre différents groupes en fonction d’un critère précis (territoire, thématique ou autre). + %br + %br + Cette fonctionnalité permet d’acheminer les dossier vers chaque groupe, et de ne plus avoir besoin de filtrer ses dossiers parmi une grande quantité de demandes. Elle est donc particulièrement adaptée pour les démarches nationales instruites localement. + %br + %br + Les instructeurs ne voient que les dossiers les concernant et n'ont donc pas accès aux données extérieures à leur périmètre. + + = link_to 'Activer le routage', update_routing_enabled_admin_procedure_groupe_instructeurs_path(procedure), class: 'button primary', method: 'patch' diff --git a/app/views/new_administrateur/groupe_instructeurs/index.html.haml b/app/views/new_administrateur/groupe_instructeurs/index.html.haml index facd55648..1dc56c03d 100644 --- a/app/views/new_administrateur/groupe_instructeurs/index.html.haml +++ b/app/views/new_administrateur/groupe_instructeurs/index.html.haml @@ -1,57 +1,22 @@ -= render partial: 'new_administrateur/breadcrumbs', - locals: { steps: [link_to('Démarches', admin_procedures_path), - link_to(@procedure.libelle, admin_procedure_path(@procedure)), - 'Groupes d’instructeurs'] } +- if @procedure.routee? + = render partial: 'new_administrateur/breadcrumbs', + locals: { steps: [link_to('Démarches', admin_procedures_path), + link_to(@procedure.libelle, admin_procedure_path(@procedure)), + 'Groupes d’instructeurs'] } +- else + = render partial: 'new_administrateur/breadcrumbs', + locals: { steps: [link_to('Démarches', admin_procedures_path), + link_to(@procedure.libelle, admin_procedure_path(@procedure)), + 'Instructeurs'] } .container.groupe-instructeur - .card - = form_for @procedure, - url: { action: :update_routing_criteria_name }, - html: { class: 'form' } do |f| + - if @procedure.routee? + = render partial: 'new_administrateur/groupe_instructeurs/edit', locals: { procedure: @procedure, groupes_instructeurs: @groupes_instructeurs } + - else + = render partial: 'new_administrateur/groupe_instructeurs/routing', locals: { procedure: @procedure } + = render partial: 'new_administrateur/groupe_instructeurs/instructeurs', + locals: { procedure: @procedure, + groupe_instructeur: @procedure.defaut_groupe_instructeur, + instructeurs: @instructeurs, + available_instructeur_emails: @available_instructeur_emails } - = f.label :routing_criteria_name do - Libellé du routage - %p.notice Ce texte apparaitra sur le formulaire usager comme le libellé d’une liste - = f.text_field :routing_criteria_name, placeholder: 'ex. Votre ville', required: true - = f.submit 'Renommer', class: 'button primary send' - - .card - .card-title Gestion des Groupes - - = form_for :groupe_instructeur, html: { class: 'form' } do |f| - = f.label :label do - Ajouter un groupe - %p.notice Ce groupe sera un choix de la liste « #{@procedure.routing_criteria_name} » . - = f.text_field :label, placeholder: 'ex. Ville de Bordeaux', required: true - = f.submit 'Ajouter le groupe', class: 'button primary send' - - - csv_max_size = NewAdministrateur::GroupeInstructeursController::CSV_MAX_SIZE - = form_tag import_admin_procedure_groupe_instructeurs_path(@procedure), method: :post, multipart: true, class: "mt-4 form" do - = label_tag "Importer par fichier CSV" - %p.notice Le fichier csv doit comporter 2 colonnes (Groupe, Email) et être séparé par des virgules. L'import n'écrase pas les groupes et les instructeurs existants. - %p.notice Le poids du fichier doit être inférieur à #{number_to_human_size(csv_max_size)} - %p.mt-2.mb-2= link_to "Télécharger l'exemple de fichier CSV", "/import-groupe-test.csv" - = file_field_tag :group_csv_file, required: true, accept: 'text/csv', size: "1" - = submit_tag "Importer le fichier", class: 'button primary send', data: { disable_with: "Envoi..." } - - %table.table.mt-2 - %thead - %tr - %th{ colspan: 2 }= t(".existing_groupe", count: @groupes_instructeurs.total_count) - %tbody - - @groupes_instructeurs.each do |group| - %tr - %td= group.label - %td.actions= link_to "voir", admin_procedure_groupe_instructeur_path(@procedure, group) - - if @groupes_instructeurs.many? - - if group.dossiers.empty? - %td.actions - = link_to admin_procedure_groupe_instructeur_path(@procedure, group), { method: :delete, class: 'button', data: { confirm: "Êtes-vous sûr de vouloir supprimer le groupe « #{group.label} » ?" }} do - %span.icon.delete - supprimer ce groupe - - else - %td.actions - = link_to reaffecter_dossiers_admin_procedure_groupe_instructeur_path(@procedure, group), class: 'button', title:'Réaffecter les dossiers à un autre groupe afin de pouvoir le supprimer' do - %span.icon.follow - déplacer les dossiers - = paginate @groupes_instructeurs diff --git a/app/views/new_administrateur/groupe_instructeurs/show.html.haml b/app/views/new_administrateur/groupe_instructeurs/show.html.haml index 19edc6b40..6a347bbd9 100644 --- a/app/views/new_administrateur/groupe_instructeurs/show.html.haml +++ b/app/views/new_administrateur/groupe_instructeurs/show.html.haml @@ -1,55 +1,14 @@ -- if feature_enabled?(:administrateur_routage) - = render partial: 'new_administrateur/breadcrumbs', - locals: { steps: [link_to('Démarches', admin_procedures_path), - link_to(@procedure.libelle, admin_procedure_path(@procedure)), - link_to('Groupes d’instructeurs', admin_procedure_groupe_instructeurs_path(@procedure)), - @groupe_instructeur.label] } -- else - = render partial: 'new_administrateur/breadcrumbs', - locals: { steps: [link_to('Démarches', admin_procedures_path), - link_to(@procedure.libelle, admin_procedure_path(@procedure)), - 'Instructeurs'] } += render partial: 'new_administrateur/breadcrumbs', + locals: { steps: [link_to('Démarches', admin_procedures_path), + link_to(@procedure.libelle, admin_procedure_path(@procedure)), + link_to('Groupes d’instructeurs', admin_procedure_groupe_instructeurs_path(@procedure)), + @groupe_instructeur.label] } .container.groupe-instructeur - - - if feature_enabled?(:administrateur_routage) - = render partial: 'new_administrateur/groups_header' - - .card - .card-title Affectation des instructeurs - = form_for :instructeur, - url: { action: :add_instructeur }, - html: { class: 'form' } do |f| - - .instructeur-wrapper - - if !@procedure.routee? - %p.notice Entrez les adresses email des instructeurs que vous souhaitez affecter à cette démarche - - hidden_field_id = SecureRandom.uuid - = hidden_field_tag :emails, nil, data: { uuid: hidden_field_id } - = react_component("ComboMultipleDropdownList", - options: @available_instructeur_emails, selected: [], disabled: [], - hiddenFieldId: hidden_field_id, - label: 'email instructeur', - acceptNewValues: true) - - = f.submit 'Affecter', class: 'button primary send' - - %table.table.mt-2 - %thead - %tr - %th{ colspan: 2 }= t('.assigned_instructeur', count: @instructeurs.count) - %tbody - - @instructeurs.each do |instructeur| - %tr - %td - %span.icon.person - #{instructeur.email} - %td.actions= button_to 'retirer', - { action: :remove_instructeur }, - { method: :delete, - data: { confirm: feature_enabled?(:administrateur_routage) ? "Êtes-vous sûr de vouloir retirer l’instructeur « #{instructeur.email} » du groupe  « #{@groupe_instructeur.label} » ?" : "Êtes-vous sûr de vouloir retirer l’instructeur « #{instructeur.email} » de la démarche ?" }, - params: { instructeur: { id: instructeur.id }}, - class: 'button' } - - = paginate @instructeurs + = render partial: 'new_administrateur/groups_header' + = render partial: 'new_administrateur/groupe_instructeurs/instructeurs', + locals: { procedure: @procedure, + groupe_instructeur: @groupe_instructeur, + instructeurs: @instructeurs, + available_instructeur_emails: @available_instructeur_emails } diff --git a/config/routes.rb b/config/routes.rb index 9278e5c80..9889c3ee4 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -422,6 +422,7 @@ Rails.application.routes.draw do collection do patch 'update_routing_criteria_name' + patch 'update_routing_enabled' post 'import' end end From ad5279f4ab6edb5869f7ef9c2151eac3e66ab1df Mon Sep 17 00:00:00 2001 From: Paul Chavard Date: Wed, 15 Sep 2021 12:55:54 +0200 Subject: [PATCH 5/9] test(groupe_instructeur): fix groupe_instructeur controller spec --- .../groupe_instructeurs_controller_spec.rb | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/spec/controllers/new_administrateur/groupe_instructeurs_controller_spec.rb b/spec/controllers/new_administrateur/groupe_instructeurs_controller_spec.rb index ddd292612..3444b7361 100644 --- a/spec/controllers/new_administrateur/groupe_instructeurs_controller_spec.rb +++ b/spec/controllers/new_administrateur/groupe_instructeurs_controller_spec.rb @@ -2,7 +2,7 @@ describe NewAdministrateur::GroupeInstructeursController, type: :controller do render_views let(:admin) { create(:administrateur) } - let(:procedure) { create(:procedure, :published, :for_individual, administrateurs: [admin]) } + let(:procedure) { create(:procedure, :published, :for_individual, administrateurs: [admin], routing_enabled: true) } let!(:gi_1_1) { procedure.defaut_groupe_instructeur } let(:procedure2) { create(:procedure, :published) } @@ -222,7 +222,7 @@ describe NewAdministrateur::GroupeInstructeursController, type: :controller do it { expect(response.status).to eq(200) } it { expect(subject.request.flash[:alert]).to be_nil } it { expect(subject.request.flash[:notice]).to be_present } - it { expect(subject).to redirect_to admin_procedure_groupe_instructeur_path(procedure, procedure.defaut_groupe_instructeur) } + it { expect(subject).to redirect_to admin_procedure_groupe_instructeurs_path(procedure) } end context 'when there is at least one bad email' do @@ -230,13 +230,13 @@ describe NewAdministrateur::GroupeInstructeursController, type: :controller do it { expect(response.status).to eq(200) } it { expect(subject.request.flash[:alert]).to be_present } it { expect(subject.request.flash[:notice]).to be_present } - it { expect(subject).to redirect_to admin_procedure_groupe_instructeur_path(procedure, procedure.defaut_groupe_instructeur) } + it { expect(subject).to redirect_to admin_procedure_groupe_instructeurs_path(procedure) } end context 'when the admin wants to assign an instructor who is already assigned on this procedure' do let(:emails) { ['instructeur_1@ministere_a.gouv.fr'].to_json } it { expect(subject.request.flash[:alert]).to be_present } - it { expect(subject).to redirect_to admin_procedure_groupe_instructeur_path(procedure, procedure.defaut_groupe_instructeur) } + it { expect(subject).to redirect_to admin_procedure_groupe_instructeurs_path(procedure) } end end @@ -344,7 +344,7 @@ describe NewAdministrateur::GroupeInstructeursController, type: :controller do it { expect(subject.request.flash[:notice]).to be_present } it { expect(subject.request.flash[:alert]).to be_nil } it { expect(response.status).to eq(302) } - it { expect(subject).to redirect_to admin_procedure_groupe_instructeur_path(procedure, gi_1_1) } + it { expect(subject).to redirect_to admin_procedure_groupe_instructeurs_path(procedure) } end context 'when the instructor is not assigned to the procedure' do @@ -352,7 +352,7 @@ describe NewAdministrateur::GroupeInstructeursController, type: :controller do it { expect(subject.request.flash[:alert]).to be_present } it { expect(subject.request.flash[:notice]).to be_nil } it { expect(response.status).to eq(302) } - it { expect(subject).to redirect_to admin_procedure_groupe_instructeur_path(procedure, gi_1_1) } + it { expect(subject).to redirect_to admin_procedure_groupe_instructeurs_path(procedure) } end end From a8d04d6fc82a92eba699baa227104b1294b9a1d5 Mon Sep 17 00:00:00 2001 From: Paul Chavard Date: Wed, 15 Sep 2021 13:35:48 +0200 Subject: [PATCH 6/9] test(routing): fix routing feature spec --- spec/features/routing/full_scenario_spec.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/spec/features/routing/full_scenario_spec.rb b/spec/features/routing/full_scenario_spec.rb index dc5853468..c09c3f706 100644 --- a/spec/features/routing/full_scenario_spec.rb +++ b/spec/features/routing/full_scenario_spec.rb @@ -6,6 +6,7 @@ feature 'The routing', js: true do let(:litteraire_user) { create(:user, password: password) } before do + procedure.update(routing_enabled: true) procedure.defaut_groupe_instructeur.instructeurs << administrateur.instructeur end @@ -31,14 +32,14 @@ feature 'The routing', js: true do # add victor to littéraire groupe find("input[aria-label='email instructeur'").send_keys('victor@inst.com', :enter) perform_enqueued_jobs { click_on 'Affecter' } - expect(page).to have_text("Les instructeurs ont bien été affectés à la démarche") + expect(page).to have_text("L’instructeur victor@inst.com a été affecté au groupe « littéraire »") victor = User.find_by(email: 'victor@inst.com').instructeur # add superwoman to littéraire groupe find("input[aria-label='email instructeur'").send_keys('superwoman@inst.com', :enter) perform_enqueued_jobs { click_on 'Affecter' } - expect(page).to have_text("Les instructeurs ont bien été affectés à la démarche") + expect(page).to have_text("L’instructeur superwoman@inst.com a été affecté au groupe « littéraire »") superwoman = User.find_by(email: 'superwoman@inst.com').instructeur From 4db059a54c46e0db1b1cd36492d3fb71334f7eba Mon Sep 17 00:00:00 2001 From: Paul Chavard Date: Sat, 18 Sep 2021 11:10:13 +0200 Subject: [PATCH 7/9] Update app/views/new_administrateur/groupe_instructeurs/_routing.html.haml Co-authored-by: Pierre de La Morinerie --- .../new_administrateur/groupe_instructeurs/_routing.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/new_administrateur/groupe_instructeurs/_routing.html.haml b/app/views/new_administrateur/groupe_instructeurs/_routing.html.haml index 0ae62a2d9..7b1317c6b 100644 --- a/app/views/new_administrateur/groupe_instructeurs/_routing.html.haml +++ b/app/views/new_administrateur/groupe_instructeurs/_routing.html.haml @@ -7,6 +7,6 @@ Cette fonctionnalité permet d’acheminer les dossier vers chaque groupe, et de ne plus avoir besoin de filtrer ses dossiers parmi une grande quantité de demandes. Elle est donc particulièrement adaptée pour les démarches nationales instruites localement. %br %br - Les instructeurs ne voient que les dossiers les concernant et n'ont donc pas accès aux données extérieures à leur périmètre. + Les instructeurs ne voient que les dossiers les concernant, et n’ont donc pas accès aux données extérieures à leur périmètre. = link_to 'Activer le routage', update_routing_enabled_admin_procedure_groupe_instructeurs_path(procedure), class: 'button primary', method: 'patch' From 64298503b1e460e5c291c496853874afd0f96d28 Mon Sep 17 00:00:00 2001 From: Paul Chavard Date: Sat, 18 Sep 2021 11:44:41 +0200 Subject: [PATCH 8/9] fix(i18n): fix missing translations in partials --- .../new_administrateur/groupe_instructeurs/fr.yml | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/config/locales/views/new_administrateur/groupe_instructeurs/fr.yml b/config/locales/views/new_administrateur/groupe_instructeurs/fr.yml index 82a426f39..5cebd405e 100644 --- a/config/locales/views/new_administrateur/groupe_instructeurs/fr.yml +++ b/config/locales/views/new_administrateur/groupe_instructeurs/fr.yml @@ -13,10 +13,6 @@ fr: existing_groupe: one: "%{count} groupe existe" other: "%{count} groupes existent" - show: - assigned_instructeur: - one: "%{count} instructeur est affecté" - other: "%{count} instructeurs sont affectés" add_instructeur: wrong_address: one: "%{value} n’est pas une adresse email valide" @@ -28,3 +24,11 @@ fr: existing_groupe: one: "%{count} groupe existe" other: "%{count} groupes existent" + instructeurs: + assigned_instructeur: + one: "%{count} instructeur est affecté" + other: "%{count} instructeurs sont affectés" + edit: + existing_groupe: + one: "%{count} groupe existe" + other: "%{count} groupes existent" From c9accbf5a5c6d6b4f9882dafa90d2c499541d37f Mon Sep 17 00:00:00 2001 From: Paul Chavard Date: Sat, 18 Sep 2021 11:51:27 +0200 Subject: [PATCH 9/9] refactor(i18n): localize routage description --- .../groupe_instructeurs/_routing.html.haml | 9 +-------- .../views/new_administrateur/groupe_instructeurs/fr.yml | 7 +++++++ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/app/views/new_administrateur/groupe_instructeurs/_routing.html.haml b/app/views/new_administrateur/groupe_instructeurs/_routing.html.haml index 7b1317c6b..1bed0804a 100644 --- a/app/views/new_administrateur/groupe_instructeurs/_routing.html.haml +++ b/app/views/new_administrateur/groupe_instructeurs/_routing.html.haml @@ -1,12 +1,5 @@ .card .card-title Routage - %p.notice - Le routage est une fonctionnalité pour les démarches nécessitant le partage de l’instruction entre différents groupes en fonction d’un critère précis (territoire, thématique ou autre). - %br - %br - Cette fonctionnalité permet d’acheminer les dossier vers chaque groupe, et de ne plus avoir besoin de filtrer ses dossiers parmi une grande quantité de demandes. Elle est donc particulièrement adaptée pour les démarches nationales instruites localement. - %br - %br - Les instructeurs ne voient que les dossiers les concernant, et n’ont donc pas accès aux données extérieures à leur périmètre. + %p.notice= t('.notice_html') = link_to 'Activer le routage', update_routing_enabled_admin_procedure_groupe_instructeurs_path(procedure), class: 'button primary', method: 'patch' diff --git a/config/locales/views/new_administrateur/groupe_instructeurs/fr.yml b/config/locales/views/new_administrateur/groupe_instructeurs/fr.yml index 5cebd405e..08104eb30 100644 --- a/config/locales/views/new_administrateur/groupe_instructeurs/fr.yml +++ b/config/locales/views/new_administrateur/groupe_instructeurs/fr.yml @@ -32,3 +32,10 @@ fr: existing_groupe: one: "%{count} groupe existe" other: "%{count} groupes existent" + routing: + notice_html: | + Le routage est une fonctionnalité pour les démarches nécessitant le partage de l’instruction entre différents groupes en fonction d’un critère précis (territoire, thématique ou autre). +

+ Cette fonctionnalité permet d’acheminer les dossier vers chaque groupe, et de ne plus avoir besoin de filtrer ses dossiers parmi une grande quantité de demandes. Elle est donc particulièrement adaptée pour les démarches nationales instruites localement. +

+ Les instructeurs ne voient que les dossiers les concernant, et n’ont donc pas accès aux données extérieures à leur périmètre.