Merge pull request #9837 from adullact/feature-ouidou/admin_creation_delegation_display_all_descendant
Délégation de compte admin: affichage de l'arborescence des groupes descendants
This commit is contained in:
commit
5b524e9000
20 changed files with 137 additions and 32 deletions
|
@ -0,0 +1,8 @@
|
|||
class GroupeGestionnaire::GroupeGestionnaireTreeStructures::TreeStructureComponent < ApplicationComponent
|
||||
include ApplicationHelper
|
||||
|
||||
def initialize(parent:, children:)
|
||||
@parent = parent
|
||||
@children = children
|
||||
end
|
||||
end
|
|
@ -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))
|
|
@ -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
|
||||
|
|
|
@ -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'
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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'
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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'
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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))
|
||||
|
|
@ -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"
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue