Skip to content

Commit

Permalink
feat: display tree structure of a group
Browse files Browse the repository at this point in the history
  • Loading branch information
seb-by-ouidou authored and seb-by-ouidou committed Jan 31, 2024
1 parent aaacddc commit 8355d09
Show file tree
Hide file tree
Showing 16 changed files with 84 additions and 7 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 'voir plus', tree_structure_gestionnaire_groupe_gestionnaire_path(@groupe_gestionnaire), class: 'fr-btn fr-btn--sm fr-btn--tertiary'

.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 }

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

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 @@ -110,4 +110,27 @@
it { expect(response).to redirect_to(gestionnaire_groupe_gestionnaires_path) }
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
before { subject }
it { expect(response).to redirect_to(new_user_session_path) }
end

context "when logged in" do
let!(:child_groupe_gestionnaire) { create(:groupe_gestionnaire, ancestry: "/#{groupe_gestionnaire.id}/", gestionnaires: []) }
before do
sign_in(gestionnaire.user)
subject
end

it do
expect(response).to have_http_status(:ok)
expect(assigns(:tree_structure)).to eq(groupe_gestionnaire => { child_groupe_gestionnaire => {} })
end
end
end
end

0 comments on commit 8355d09

Please sign in to comment.