feat: display tree structure of a group

This commit is contained in:
seb-by-ouidou 2023-12-10 17:25:58 +00:00 committed by Colin Darie
parent 460240713f
commit c2c54083e8
No known key found for this signature in database
GPG key ID: 8C76CADD40253590
20 changed files with 137 additions and 32 deletions

View file

@ -0,0 +1,8 @@
class GroupeGestionnaire::GroupeGestionnaireTreeStructures::TreeStructureComponent < ApplicationComponent
include ApplicationHelper
def initialize(parent:, children:)
@parent = parent
@children = children
end
end

View file

@ -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))

View file

@ -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

View file

@ -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'

View file

@ -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

View file

@ -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'

View file

@ -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 larborescence', tree_structure_gestionnaire_groupe_gestionnaire_path(@groupe_gestionnaire)
.fr-mt-4w
= render 'add_child_form', groupe_gestionnaire: @groupe_gestionnaire

View file

@ -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'

View file

@ -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

View file

@ -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))

View file

@ -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"

View file

@ -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"

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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