Skip to content

Commit

Permalink
Merge pull request demarches-simplifiees#9837 from adullact/feature-o…
Browse files Browse the repository at this point in the history
…uidou/admin_creation_delegation_display_all_descendant

Délégation de compte admin: affichage de l'arborescence des groupes descendants
  • Loading branch information
colinux authored Feb 5, 2024
2 parents 4602407 + c2c5408 commit 5b524e9
Show file tree
Hide file tree
Showing 20 changed files with 136 additions and 31 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
class GroupeGestionnaire::GroupeGestionnaireTreeStructures::TreeStructureComponent < ApplicationComponent
include ApplicationHelper

def initialize(parent:, children:)
@parent = parent
@children = children
end
end
Original file line number Diff line number Diff line change
@@ -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))
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -36,6 +36,10 @@ def destroy
redirect_to gestionnaire_groupe_gestionnaires_path
end

def tree_structure
@tree_structure = @groupe_gestionnaire.subtree.arrange
end

private

def groupe_gestionnaires
Expand Down
Original file line number Diff line number Diff line change
@@ -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'
Original file line number Diff line number Diff line change
Expand Up @@ -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
Original file line number Diff line number Diff line change
@@ -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'
Original file line number Diff line number Diff line change
Expand Up @@ -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
Original file line number Diff line number Diff line change
@@ -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'
Original file line number Diff line number Diff line change
Expand Up @@ -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
Original file line number Diff line number Diff line change
@@ -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))

Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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"
3 changes: 3 additions & 0 deletions config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -516,6 +516,9 @@
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

Expand Down
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,10 @@
end

context "when logged in" do
let(:gestionnaire_2) { create(:gestionnaire) }

before do
groupe_gestionnaire.gestionnaires << gestionnaire_2
sign_in(admin.user)
end

Expand All @@ -112,6 +115,10 @@
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
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,10 @@
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
Expand All @@ -15,10 +17,10 @@
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)
Expand All @@ -33,18 +35,22 @@
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

Expand All @@ -54,18 +60,22 @@
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

Expand All @@ -75,18 +85,22 @@
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

Expand All @@ -96,18 +110,47 @@
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)
end

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

it { expect(GroupeGestionnaire.all.count).to eq(1) }
it { expect(response).to redirect_to(gestionnaire_groupe_gestionnaires_path) }
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
2 changes: 1 addition & 1 deletion spec/models/administrateur_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -329,7 +329,7 @@
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
Expand Down

0 comments on commit 5b524e9

Please sign in to comment.