diff --git a/app/components/groupe_gestionnaire/groupe_gestionnaire_tree_structures/tree_structure_component.rb b/app/components/groupe_gestionnaire/groupe_gestionnaire_tree_structures/tree_structure_component.rb new file mode 100644 index 000000000..a24c6c487 --- /dev/null +++ b/app/components/groupe_gestionnaire/groupe_gestionnaire_tree_structures/tree_structure_component.rb @@ -0,0 +1,8 @@ +class GroupeGestionnaire::GroupeGestionnaireTreeStructures::TreeStructureComponent < ApplicationComponent + include ApplicationHelper + + def initialize(parent:, children:) + @parent = parent + @children = children + end +end diff --git a/app/components/groupe_gestionnaire/groupe_gestionnaire_tree_structures/tree_structure_component/tree_structure_component.html.haml b/app/components/groupe_gestionnaire/groupe_gestionnaire_tree_structures/tree_structure_component/tree_structure_component.html.haml new file mode 100644 index 000000000..34f787bb9 --- /dev/null +++ b/app/components/groupe_gestionnaire/groupe_gestionnaire_tree_structures/tree_structure_component/tree_structure_component.html.haml @@ -0,0 +1,6 @@ += @parent.name +- unless @children.empty? + %ul + - @children.each do |parent, children| + %li + = render(GroupeGestionnaire::GroupeGestionnaireTreeStructures::TreeStructureComponent.new(parent: parent, children: children)) diff --git a/app/controllers/gestionnaires/groupe_gestionnaires_controller.rb b/app/controllers/gestionnaires/groupe_gestionnaires_controller.rb index b10e2081d..8f6d710a1 100644 --- a/app/controllers/gestionnaires/groupe_gestionnaires_controller.rb +++ b/app/controllers/gestionnaires/groupe_gestionnaires_controller.rb @@ -1,6 +1,6 @@ module Gestionnaires class GroupeGestionnairesController < GestionnaireController - before_action :retrieve_groupe_gestionnaire, only: [:show, :edit, :update, :destroy] + before_action :retrieve_groupe_gestionnaire, only: [:show, :edit, :update, :destroy, :tree_structure] def index @groupe_gestionnaires = groupe_gestionnaires @@ -36,6 +36,10 @@ module Gestionnaires redirect_to gestionnaire_groupe_gestionnaires_path end + def tree_structure + @tree_structure = @groupe_gestionnaire.subtree.arrange + end + private def groupe_gestionnaires diff --git a/app/views/gestionnaires/groupe_gestionnaire_administrateurs/_add_admin_form.html.haml b/app/views/gestionnaires/groupe_gestionnaire_administrateurs/_add_administrateur_form.html.haml similarity index 100% rename from app/views/gestionnaires/groupe_gestionnaire_administrateurs/_add_admin_form.html.haml rename to app/views/gestionnaires/groupe_gestionnaire_administrateurs/_add_administrateur_form.html.haml diff --git a/app/views/gestionnaires/groupe_gestionnaire_administrateurs/create.turbo_stream.haml b/app/views/gestionnaires/groupe_gestionnaire_administrateurs/create.turbo_stream.haml index 1adda3a89..bf199bac2 100644 --- a/app/views/gestionnaires/groupe_gestionnaire_administrateurs/create.turbo_stream.haml +++ b/app/views/gestionnaires/groupe_gestionnaire_administrateurs/create.turbo_stream.haml @@ -1,5 +1,5 @@ - if @administrateur.present? = turbo_stream.update 'administrateurs' do = render GroupeGestionnaire::GroupeGestionnaireAdministrateurs::AdministrateurComponent.with_collection(@groupe_gestionnaire.administrateurs.order('users.email'), groupe_gestionnaire: @groupe_gestionnaire) - = turbo_stream.replace "new_administrateur", partial: 'add_admin_form', locals: { groupe_gestionnaire: @groupe_gestionnaire } + = turbo_stream.replace "new_administrateur", partial: 'add_administrateur_form', locals: { groupe_gestionnaire: @groupe_gestionnaire } = turbo_stream.focus 'administrateur_email' diff --git a/app/views/gestionnaires/groupe_gestionnaire_administrateurs/index.html.haml b/app/views/gestionnaires/groupe_gestionnaire_administrateurs/index.html.haml index c32f71d91..7a25263e7 100644 --- a/app/views/gestionnaires/groupe_gestionnaire_administrateurs/index.html.haml +++ b/app/views/gestionnaires/groupe_gestionnaire_administrateurs/index.html.haml @@ -19,4 +19,4 @@ = render(GroupeGestionnaire::GroupeGestionnaireAdministrateurs::AdministrateurComponent.with_collection(@groupe_gestionnaire.administrateurs.order('users.email'), groupe_gestionnaire: @groupe_gestionnaire)) .fr-mt-4w - = render 'add_admin_form', groupe_gestionnaire: @groupe_gestionnaire + = render 'add_administrateur_form', groupe_gestionnaire: @groupe_gestionnaire diff --git a/app/views/gestionnaires/groupe_gestionnaire_children/_add_admin_form.html.haml b/app/views/gestionnaires/groupe_gestionnaire_children/_add_child_form.html.haml similarity index 100% rename from app/views/gestionnaires/groupe_gestionnaire_children/_add_admin_form.html.haml rename to app/views/gestionnaires/groupe_gestionnaire_children/_add_child_form.html.haml diff --git a/app/views/gestionnaires/groupe_gestionnaire_children/create.turbo_stream.haml b/app/views/gestionnaires/groupe_gestionnaire_children/create.turbo_stream.haml index 6abe9b64a..bab9a71cc 100644 --- a/app/views/gestionnaires/groupe_gestionnaire_children/create.turbo_stream.haml +++ b/app/views/gestionnaires/groupe_gestionnaire_children/create.turbo_stream.haml @@ -1,5 +1,5 @@ - if @child.present? = turbo_stream.update 'children' do = render GroupeGestionnaire::GroupeGestionnaireChildren::ChildComponent.with_collection(@groupe_gestionnaire.children, groupe_gestionnaire: @groupe_gestionnaire) - = turbo_stream.replace "new_child", partial: 'add_admin_form', locals: { groupe_gestionnaire: @groupe_gestionnaire } + = turbo_stream.replace "new_child", partial: 'add_child_form', locals: { groupe_gestionnaire: @groupe_gestionnaire } = turbo_stream.focus 'groupe_gestionnaire_name' diff --git a/app/views/gestionnaires/groupe_gestionnaire_children/index.html.haml b/app/views/gestionnaires/groupe_gestionnaire_children/index.html.haml index 1a2c10786..fc2428b28 100644 --- a/app/views/gestionnaires/groupe_gestionnaire_children/index.html.haml +++ b/app/views/gestionnaires/groupe_gestionnaire_children/index.html.haml @@ -16,4 +16,7 @@ = render(GroupeGestionnaire::GroupeGestionnaireChildren::ChildComponent.with_collection(@groupe_gestionnaire.children, groupe_gestionnaire: @groupe_gestionnaire)) .fr-mt-4w - = render 'add_admin_form', groupe_gestionnaire: @groupe_gestionnaire + = link_to 'Afficher l’arborescence', tree_structure_gestionnaire_groupe_gestionnaire_path(@groupe_gestionnaire) + + .fr-mt-4w + = render 'add_child_form', groupe_gestionnaire: @groupe_gestionnaire diff --git a/app/views/gestionnaires/groupe_gestionnaire_gestionnaires/_add_admin_form.html.haml b/app/views/gestionnaires/groupe_gestionnaire_gestionnaires/_add_gestionnaire_form.html.haml similarity index 100% rename from app/views/gestionnaires/groupe_gestionnaire_gestionnaires/_add_admin_form.html.haml rename to app/views/gestionnaires/groupe_gestionnaire_gestionnaires/_add_gestionnaire_form.html.haml diff --git a/app/views/gestionnaires/groupe_gestionnaire_gestionnaires/create.turbo_stream.haml b/app/views/gestionnaires/groupe_gestionnaire_gestionnaires/create.turbo_stream.haml index 035f006df..f15e39812 100644 --- a/app/views/gestionnaires/groupe_gestionnaire_gestionnaires/create.turbo_stream.haml +++ b/app/views/gestionnaires/groupe_gestionnaire_gestionnaires/create.turbo_stream.haml @@ -1,5 +1,5 @@ - if @gestionnaire.present? = turbo_stream.update 'gestionnaires' do = render GroupeGestionnaire::GroupeGestionnaireGestionnaires::GestionnaireComponent.with_collection(@groupe_gestionnaire.gestionnaires.order('users.email'), groupe_gestionnaire: @groupe_gestionnaire) - = turbo_stream.replace "new_gestionnaire", partial: 'add_admin_form', locals: { groupe_gestionnaire: @groupe_gestionnaire } + = turbo_stream.replace "new_gestionnaire", partial: 'add_gestionnaire_form', locals: { groupe_gestionnaire: @groupe_gestionnaire } = turbo_stream.focus 'gestionnaire_email' diff --git a/app/views/gestionnaires/groupe_gestionnaire_gestionnaires/index.html.haml b/app/views/gestionnaires/groupe_gestionnaire_gestionnaires/index.html.haml index 443165616..6b562bd94 100644 --- a/app/views/gestionnaires/groupe_gestionnaire_gestionnaires/index.html.haml +++ b/app/views/gestionnaires/groupe_gestionnaire_gestionnaires/index.html.haml @@ -18,4 +18,4 @@ = render(GroupeGestionnaire::GroupeGestionnaireGestionnaires::GestionnaireComponent.with_collection(@groupe_gestionnaire.gestionnaires.order('users.email'), groupe_gestionnaire: @groupe_gestionnaire)) .fr-mt-4w - = render 'add_admin_form', groupe_gestionnaire: @groupe_gestionnaire + = render 'add_gestionnaire_form', groupe_gestionnaire: @groupe_gestionnaire diff --git a/app/views/gestionnaires/groupe_gestionnaires/tree_structure.html.haml b/app/views/gestionnaires/groupe_gestionnaires/tree_structure.html.haml new file mode 100644 index 000000000..f3757a96d --- /dev/null +++ b/app/views/gestionnaires/groupe_gestionnaires/tree_structure.html.haml @@ -0,0 +1,14 @@ += render partial: 'gestionnaires/breadcrumbs', + locals: { steps: [['Groupes gestionnaire', gestionnaire_groupe_gestionnaires_path], + ["#{@groupe_gestionnaire.name.truncate_words(10)}", gestionnaire_groupe_gestionnaire_path(@groupe_gestionnaire)], + ['Arborescence']], preview: false } + +.fr-container + %h1 Arborescence de « #{@groupe_gestionnaire.name} » + + .fr-mt-4w + %ul + - @tree_structure.each do |parent, children| + %li + = render(GroupeGestionnaire::GroupeGestionnaireTreeStructures::TreeStructureComponent.new(parent: parent, children: children)) + diff --git a/app/views/groupe_gestionnaire_mailer/notify_new_commentaire_groupe_gestionnaire.html.haml b/app/views/groupe_gestionnaire_mailer/notify_new_commentaire_groupe_gestionnaire.html.haml index b99ccf964..760458458 100644 --- a/app/views/groupe_gestionnaire_mailer/notify_new_commentaire_groupe_gestionnaire.html.haml +++ b/app/views/groupe_gestionnaire_mailer/notify_new_commentaire_groupe_gestionnaire.html.haml @@ -4,7 +4,7 @@ %p = t('.body', groupe_gestionnaire_name: @groupe_gestionnaire.name, sender_email: @sender_email) -%p= round_button("consulter le message", @commentaire_url, :primary) +%p= round_button(t('.see_message'), @commentaire_url, :primary) = render partial: "layouts/mailers/signature" diff --git a/config/locales/views/groupe_gestionnaire_mailer/notify_new_commentaire_groupe_gestionnaire/fr.yml b/config/locales/views/groupe_gestionnaire_mailer/notify_new_commentaire_groupe_gestionnaire/fr.yml index 5dffa340d..2f0be4aab 100644 --- a/config/locales/views/groupe_gestionnaire_mailer/notify_new_commentaire_groupe_gestionnaire/fr.yml +++ b/config/locales/views/groupe_gestionnaire_mailer/notify_new_commentaire_groupe_gestionnaire/fr.yml @@ -2,3 +2,4 @@ fr: groupe_gestionnaire_mailer: notify_new_commentaire_groupe_gestionnaire: body: Vous avez un nouveau message envoyé de la part de %{sender_email} dans la messagerie du groupe gestionnaire %{groupe_gestionnaire_name} + see_message: "Consulter le message" diff --git a/config/routes.rb b/config/routes.rb index bf3894cc0..72d0a6fd4 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -516,6 +516,9 @@ Rails.application.routes.draw do end resources :children, controller: 'groupe_gestionnaire_children', only: [:index, :create, :destroy] resources :commentaires, controller: 'groupe_gestionnaire_commentaires', only: [:index, :show, :create, :destroy] + member do + get :tree_structure, path: 'arborescence' + end end end diff --git a/spec/components/groupe_gestionnaire/groupe_gestionnaire_tree_structures/tree_structure_component_spec.rb b/spec/components/groupe_gestionnaire/groupe_gestionnaire_tree_structures/tree_structure_component_spec.rb new file mode 100644 index 000000000..0c15eb947 --- /dev/null +++ b/spec/components/groupe_gestionnaire/groupe_gestionnaire_tree_structures/tree_structure_component_spec.rb @@ -0,0 +1,16 @@ +RSpec.describe GroupeGestionnaire::GroupeGestionnaireTreeStructures::TreeStructureComponent, type: :component do + let(:component) do + described_class.new( + parent: groupe_gestionnaire, + children: { child_groupe_gestionnaire => {} } + ) + end + let(:gestionnaire) { create(:gestionnaire) } + let!(:groupe_gestionnaire) { create(:groupe_gestionnaire, gestionnaires: [gestionnaire]) } + let!(:child_groupe_gestionnaire) { create(:groupe_gestionnaire, ancestry: "/#{groupe_gestionnaire.id}/", gestionnaires: []) } + + subject { render_inline(component).to_html } + + it { is_expected.to include(groupe_gestionnaire.name) } + it { is_expected.to include(child_groupe_gestionnaire.name) } +end diff --git a/spec/controllers/administrateurs/groupe_gestionnaire_controller_spec.rb b/spec/controllers/administrateurs/groupe_gestionnaire_controller_spec.rb index c24b8b95c..ce3c59c08 100644 --- a/spec/controllers/administrateurs/groupe_gestionnaire_controller_spec.rb +++ b/spec/controllers/administrateurs/groupe_gestionnaire_controller_spec.rb @@ -102,7 +102,10 @@ describe Administrateurs::GroupeGestionnaireController, type: :controller do end context "when logged in" do + let(:gestionnaire_2) { create(:gestionnaire) } + before do + groupe_gestionnaire.gestionnaires << gestionnaire_2 sign_in(admin.user) end @@ -112,6 +115,10 @@ describe Administrateurs::GroupeGestionnaireController, type: :controller do expect(response).to redirect_to(admin_groupe_gestionnaire_commentaires_path) expect(flash.notice).to be_present end + + it '2 emails are sent' do + expect { perform_enqueued_jobs { subject } }.to change { ActionMailer::Base.deliveries.count }.by(2) + end end end end diff --git a/spec/controllers/gestionnaires/groupe_gestionnaires_controller_spec.rb b/spec/controllers/gestionnaires/groupe_gestionnaires_controller_spec.rb index 63c57d385..7faee5eb4 100644 --- a/spec/controllers/gestionnaires/groupe_gestionnaires_controller_spec.rb +++ b/spec/controllers/gestionnaires/groupe_gestionnaires_controller_spec.rb @@ -5,8 +5,10 @@ describe Gestionnaires::GroupeGestionnairesController, type: :controller do subject { get :index } context "when not logged" do - before { subject } - it { expect(response).to redirect_to(new_user_session_path) } + it do + subject + expect(response).to redirect_to(new_user_session_path) + end end context "when logged in" do @@ -15,10 +17,10 @@ describe Gestionnaires::GroupeGestionnairesController, type: :controller do let!(:not_my_groupe_gestionnaire) { create(:groupe_gestionnaire) } before do sign_in(gestionnaire.user) - subject end it do + subject expect(response).to have_http_status(:ok) expect(assigns(:groupe_gestionnaires)).to include(groupe_gestionnaire) expect(assigns(:groupe_gestionnaires)).to include(other_groupe_gestionnaire) @@ -33,18 +35,22 @@ describe Gestionnaires::GroupeGestionnairesController, type: :controller do let!(:child_groupe_gestionnaire) { create(:groupe_gestionnaire, ancestry: "/#{groupe_gestionnaire_root.id}/", gestionnaires: [gestionnaire]) } context "when not logged" do - before { subject } - it { expect(response).to redirect_to(new_user_session_path) } + it do + subject + expect(response).to redirect_to(new_user_session_path) + end end context "when logged in" do before do sign_in(gestionnaire.user) - subject end - it { expect(response).to have_http_status(:ok) } - it { expect(assigns(:groupe_gestionnaire)).to eq(child_groupe_gestionnaire) } + it do + subject + expect(response).to have_http_status(:ok) + expect(assigns(:groupe_gestionnaire)).to eq(child_groupe_gestionnaire) + end end end @@ -54,18 +60,22 @@ describe Gestionnaires::GroupeGestionnairesController, type: :controller do let!(:child_groupe_gestionnaire) { create(:groupe_gestionnaire, ancestry: "/#{groupe_gestionnaire_root.id}/", gestionnaires: [gestionnaire]) } context "when not logged" do - before { subject } - it { expect(response).to redirect_to(new_user_session_path) } + it do + subject + expect(response).to redirect_to(new_user_session_path) + end end context "when logged in" do before do sign_in(gestionnaire.user) - subject end - it { expect(response).to have_http_status(:ok) } - it { expect(assigns(:groupe_gestionnaire)).to eq(child_groupe_gestionnaire) } + it do + subject + expect(response).to have_http_status(:ok) + expect(assigns(:groupe_gestionnaire)).to eq(child_groupe_gestionnaire) + end end end @@ -75,18 +85,22 @@ describe Gestionnaires::GroupeGestionnairesController, type: :controller do let!(:child_groupe_gestionnaire) { create(:groupe_gestionnaire, ancestry: "/#{groupe_gestionnaire_root.id}/", gestionnaires: [gestionnaire]) } context "when not logged" do - before { subject } - it { expect(response).to redirect_to(new_user_session_path) } + it do + subject + expect(response).to redirect_to(new_user_session_path) + end end context "when logged in" do before do sign_in(gestionnaire.user) - subject end - it { expect(child_groupe_gestionnaire.reload.name).to eq('new child name') } - it { expect(response).to redirect_to(gestionnaire_groupe_gestionnaire_path(child_groupe_gestionnaire)) } + it do + subject + expect(child_groupe_gestionnaire.reload.name).to eq('new child name') + expect(response).to redirect_to(gestionnaire_groupe_gestionnaire_path(child_groupe_gestionnaire)) + end end end @@ -96,18 +110,47 @@ describe Gestionnaires::GroupeGestionnairesController, type: :controller do let!(:child_groupe_gestionnaire) { create(:groupe_gestionnaire, ancestry: "/#{groupe_gestionnaire_root.id}/", gestionnaires: [gestionnaire]) } context "when not logged" do - before { subject } - it { expect(response).to redirect_to(new_user_session_path) } + it do + subject + expect(response).to redirect_to(new_user_session_path) + end end context "when logged in" do before do sign_in(gestionnaire.user) - subject end - it { expect(GroupeGestionnaire.all.count).to eq(1) } - it { expect(response).to redirect_to(gestionnaire_groupe_gestionnaires_path) } + it do + subject + expect(GroupeGestionnaire.all.count).to eq(1) + expect(response).to redirect_to(gestionnaire_groupe_gestionnaires_path) + end + end + end + + describe "#tree_structure" do + let!(:groupe_gestionnaire) { create(:groupe_gestionnaire, gestionnaires: [gestionnaire]) } + subject { get :tree_structure, params: { id: groupe_gestionnaire.id } } + + context "when not logged" do + it do + subject + expect(response).to redirect_to(new_user_session_path) + end + end + + context "when logged in" do + let!(:child_groupe_gestionnaire) { create(:groupe_gestionnaire, ancestry: "/#{groupe_gestionnaire.id}/", gestionnaires: []) } + before do + sign_in(gestionnaire.user) + end + + it do + subject + expect(response).to have_http_status(:ok) + expect(assigns(:tree_structure)).to eq(groupe_gestionnaire => { child_groupe_gestionnaire => {} }) + end end end end diff --git a/spec/models/administrateur_spec.rb b/spec/models/administrateur_spec.rb index 50d97976f..cd2e82184 100644 --- a/spec/models/administrateur_spec.rb +++ b/spec/models/administrateur_spec.rb @@ -329,7 +329,7 @@ describe Administrateur, type: :model do let!(:commentaire_groupe_gestionnaire) { create(:commentaire_groupe_gestionnaire, groupe_gestionnaire: groupe_gestionnaire, sender: administrateur, created_at: 12.hours.ago) } before do - Timecop.freeze(now) do + travel_to(now) do administrateur.mark_commentaire_as_seen end end