feat: display tree structure of a group
This commit is contained in:
parent
460240713f
commit
c2c54083e8
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
|
module Gestionnaires
|
||||||
class GroupeGestionnairesController < GestionnaireController
|
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
|
def index
|
||||||
@groupe_gestionnaires = groupe_gestionnaires
|
@groupe_gestionnaires = groupe_gestionnaires
|
||||||
|
@ -36,6 +36,10 @@ module Gestionnaires
|
||||||
redirect_to gestionnaire_groupe_gestionnaires_path
|
redirect_to gestionnaire_groupe_gestionnaires_path
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def tree_structure
|
||||||
|
@tree_structure = @groupe_gestionnaire.subtree.arrange
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def groupe_gestionnaires
|
def groupe_gestionnaires
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
- if @administrateur.present?
|
- if @administrateur.present?
|
||||||
= turbo_stream.update 'administrateurs' do
|
= turbo_stream.update 'administrateurs' do
|
||||||
= render GroupeGestionnaire::GroupeGestionnaireAdministrateurs::AdministrateurComponent.with_collection(@groupe_gestionnaire.administrateurs.order('users.email'), groupe_gestionnaire: @groupe_gestionnaire)
|
= 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'
|
= 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))
|
= render(GroupeGestionnaire::GroupeGestionnaireAdministrateurs::AdministrateurComponent.with_collection(@groupe_gestionnaire.administrateurs.order('users.email'), groupe_gestionnaire: @groupe_gestionnaire))
|
||||||
|
|
||||||
.fr-mt-4w
|
.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?
|
- if @child.present?
|
||||||
= turbo_stream.update 'children' do
|
= turbo_stream.update 'children' do
|
||||||
= render GroupeGestionnaire::GroupeGestionnaireChildren::ChildComponent.with_collection(@groupe_gestionnaire.children, groupe_gestionnaire: @groupe_gestionnaire)
|
= 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'
|
= turbo_stream.focus 'groupe_gestionnaire_name'
|
||||||
|
|
|
@ -16,4 +16,7 @@
|
||||||
= render(GroupeGestionnaire::GroupeGestionnaireChildren::ChildComponent.with_collection(@groupe_gestionnaire.children, groupe_gestionnaire: @groupe_gestionnaire))
|
= render(GroupeGestionnaire::GroupeGestionnaireChildren::ChildComponent.with_collection(@groupe_gestionnaire.children, groupe_gestionnaire: @groupe_gestionnaire))
|
||||||
|
|
||||||
.fr-mt-4w
|
.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?
|
- if @gestionnaire.present?
|
||||||
= turbo_stream.update 'gestionnaires' do
|
= turbo_stream.update 'gestionnaires' do
|
||||||
= render GroupeGestionnaire::GroupeGestionnaireGestionnaires::GestionnaireComponent.with_collection(@groupe_gestionnaire.gestionnaires.order('users.email'), groupe_gestionnaire: @groupe_gestionnaire)
|
= 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'
|
= 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))
|
= render(GroupeGestionnaire::GroupeGestionnaireGestionnaires::GestionnaireComponent.with_collection(@groupe_gestionnaire.gestionnaires.order('users.email'), groupe_gestionnaire: @groupe_gestionnaire))
|
||||||
|
|
||||||
.fr-mt-4w
|
.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
|
%p
|
||||||
= t('.body', groupe_gestionnaire_name: @groupe_gestionnaire.name, sender_email: @sender_email)
|
= 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"
|
= render partial: "layouts/mailers/signature"
|
||||||
|
|
||||||
|
|
|
@ -2,3 +2,4 @@ fr:
|
||||||
groupe_gestionnaire_mailer:
|
groupe_gestionnaire_mailer:
|
||||||
notify_new_commentaire_groupe_gestionnaire:
|
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}
|
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
|
end
|
||||||
resources :children, controller: 'groupe_gestionnaire_children', only: [:index, :create, :destroy]
|
resources :children, controller: 'groupe_gestionnaire_children', only: [:index, :create, :destroy]
|
||||||
resources :commentaires, controller: 'groupe_gestionnaire_commentaires', only: [:index, :show, :create, :destroy]
|
resources :commentaires, controller: 'groupe_gestionnaire_commentaires', only: [:index, :show, :create, :destroy]
|
||||||
|
member do
|
||||||
|
get :tree_structure, path: 'arborescence'
|
||||||
|
end
|
||||||
end
|
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
|
end
|
||||||
|
|
||||||
context "when logged in" do
|
context "when logged in" do
|
||||||
|
let(:gestionnaire_2) { create(:gestionnaire) }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
|
groupe_gestionnaire.gestionnaires << gestionnaire_2
|
||||||
sign_in(admin.user)
|
sign_in(admin.user)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -112,6 +115,10 @@ describe Administrateurs::GroupeGestionnaireController, type: :controller do
|
||||||
expect(response).to redirect_to(admin_groupe_gestionnaire_commentaires_path)
|
expect(response).to redirect_to(admin_groupe_gestionnaire_commentaires_path)
|
||||||
expect(flash.notice).to be_present
|
expect(flash.notice).to be_present
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it '2 emails are sent' do
|
||||||
|
expect { perform_enqueued_jobs { subject } }.to change { ActionMailer::Base.deliveries.count }.by(2)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -5,8 +5,10 @@ describe Gestionnaires::GroupeGestionnairesController, type: :controller do
|
||||||
subject { get :index }
|
subject { get :index }
|
||||||
|
|
||||||
context "when not logged" do
|
context "when not logged" do
|
||||||
before { subject }
|
it do
|
||||||
it { expect(response).to redirect_to(new_user_session_path) }
|
subject
|
||||||
|
expect(response).to redirect_to(new_user_session_path)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context "when logged in" do
|
context "when logged in" do
|
||||||
|
@ -15,10 +17,10 @@ describe Gestionnaires::GroupeGestionnairesController, type: :controller do
|
||||||
let!(:not_my_groupe_gestionnaire) { create(:groupe_gestionnaire) }
|
let!(:not_my_groupe_gestionnaire) { create(:groupe_gestionnaire) }
|
||||||
before do
|
before do
|
||||||
sign_in(gestionnaire.user)
|
sign_in(gestionnaire.user)
|
||||||
subject
|
|
||||||
end
|
end
|
||||||
|
|
||||||
it do
|
it do
|
||||||
|
subject
|
||||||
expect(response).to have_http_status(:ok)
|
expect(response).to have_http_status(:ok)
|
||||||
expect(assigns(:groupe_gestionnaires)).to include(groupe_gestionnaire)
|
expect(assigns(:groupe_gestionnaires)).to include(groupe_gestionnaire)
|
||||||
expect(assigns(:groupe_gestionnaires)).to include(other_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]) }
|
let!(:child_groupe_gestionnaire) { create(:groupe_gestionnaire, ancestry: "/#{groupe_gestionnaire_root.id}/", gestionnaires: [gestionnaire]) }
|
||||||
|
|
||||||
context "when not logged" do
|
context "when not logged" do
|
||||||
before { subject }
|
it do
|
||||||
it { expect(response).to redirect_to(new_user_session_path) }
|
subject
|
||||||
|
expect(response).to redirect_to(new_user_session_path)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context "when logged in" do
|
context "when logged in" do
|
||||||
before do
|
before do
|
||||||
sign_in(gestionnaire.user)
|
sign_in(gestionnaire.user)
|
||||||
subject
|
|
||||||
end
|
end
|
||||||
|
|
||||||
it { expect(response).to have_http_status(:ok) }
|
it do
|
||||||
it { expect(assigns(:groupe_gestionnaire)).to eq(child_groupe_gestionnaire) }
|
subject
|
||||||
|
expect(response).to have_http_status(:ok)
|
||||||
|
expect(assigns(:groupe_gestionnaire)).to eq(child_groupe_gestionnaire)
|
||||||
|
end
|
||||||
end
|
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]) }
|
let!(:child_groupe_gestionnaire) { create(:groupe_gestionnaire, ancestry: "/#{groupe_gestionnaire_root.id}/", gestionnaires: [gestionnaire]) }
|
||||||
|
|
||||||
context "when not logged" do
|
context "when not logged" do
|
||||||
before { subject }
|
it do
|
||||||
it { expect(response).to redirect_to(new_user_session_path) }
|
subject
|
||||||
|
expect(response).to redirect_to(new_user_session_path)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context "when logged in" do
|
context "when logged in" do
|
||||||
before do
|
before do
|
||||||
sign_in(gestionnaire.user)
|
sign_in(gestionnaire.user)
|
||||||
subject
|
|
||||||
end
|
end
|
||||||
|
|
||||||
it { expect(response).to have_http_status(:ok) }
|
it do
|
||||||
it { expect(assigns(:groupe_gestionnaire)).to eq(child_groupe_gestionnaire) }
|
subject
|
||||||
|
expect(response).to have_http_status(:ok)
|
||||||
|
expect(assigns(:groupe_gestionnaire)).to eq(child_groupe_gestionnaire)
|
||||||
|
end
|
||||||
end
|
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]) }
|
let!(:child_groupe_gestionnaire) { create(:groupe_gestionnaire, ancestry: "/#{groupe_gestionnaire_root.id}/", gestionnaires: [gestionnaire]) }
|
||||||
|
|
||||||
context "when not logged" do
|
context "when not logged" do
|
||||||
before { subject }
|
it do
|
||||||
it { expect(response).to redirect_to(new_user_session_path) }
|
subject
|
||||||
|
expect(response).to redirect_to(new_user_session_path)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context "when logged in" do
|
context "when logged in" do
|
||||||
before do
|
before do
|
||||||
sign_in(gestionnaire.user)
|
sign_in(gestionnaire.user)
|
||||||
subject
|
|
||||||
end
|
end
|
||||||
|
|
||||||
it { expect(child_groupe_gestionnaire.reload.name).to eq('new child name') }
|
it do
|
||||||
it { expect(response).to redirect_to(gestionnaire_groupe_gestionnaire_path(child_groupe_gestionnaire)) }
|
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
|
||||||
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]) }
|
let!(:child_groupe_gestionnaire) { create(:groupe_gestionnaire, ancestry: "/#{groupe_gestionnaire_root.id}/", gestionnaires: [gestionnaire]) }
|
||||||
|
|
||||||
context "when not logged" do
|
context "when not logged" do
|
||||||
before { subject }
|
it do
|
||||||
it { expect(response).to redirect_to(new_user_session_path) }
|
subject
|
||||||
|
expect(response).to redirect_to(new_user_session_path)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context "when logged in" do
|
context "when logged in" do
|
||||||
before do
|
before do
|
||||||
sign_in(gestionnaire.user)
|
sign_in(gestionnaire.user)
|
||||||
subject
|
|
||||||
end
|
end
|
||||||
|
|
||||||
it { expect(GroupeGestionnaire.all.count).to eq(1) }
|
it do
|
||||||
it { expect(response).to redirect_to(gestionnaire_groupe_gestionnaires_path) }
|
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
|
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) }
|
let!(:commentaire_groupe_gestionnaire) { create(:commentaire_groupe_gestionnaire, groupe_gestionnaire: groupe_gestionnaire, sender: administrateur, created_at: 12.hours.ago) }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
Timecop.freeze(now) do
|
travel_to(now) do
|
||||||
administrateur.mark_commentaire_as_seen
|
administrateur.mark_commentaire_as_seen
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue