diff --git a/app/components/groupe_gestionnaire/groupe_gestionnaire_tree_structures/tree_structure_component.rb b/app/components/groupe_gestionnaire/groupe_gestionnaire_tree_structures/tree_structure_component.rb new file mode 100644 index 00000000000..a24c6c487b4 --- /dev/null +++ b/app/components/groupe_gestionnaire/groupe_gestionnaire_tree_structures/tree_structure_component.rb @@ -0,0 +1,8 @@ +class GroupeGestionnaire::GroupeGestionnaireTreeStructures::TreeStructureComponent < ApplicationComponent + include ApplicationHelper + + def initialize(parent:, children:) + @parent = parent + @children = children + end +end diff --git a/app/components/groupe_gestionnaire/groupe_gestionnaire_tree_structures/tree_structure_component/tree_structure_component.html.haml b/app/components/groupe_gestionnaire/groupe_gestionnaire_tree_structures/tree_structure_component/tree_structure_component.html.haml new file mode 100644 index 00000000000..34f787bb9e7 --- /dev/null +++ b/app/components/groupe_gestionnaire/groupe_gestionnaire_tree_structures/tree_structure_component/tree_structure_component.html.haml @@ -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)) diff --git a/app/controllers/gestionnaires/groupe_gestionnaires_controller.rb b/app/controllers/gestionnaires/groupe_gestionnaires_controller.rb index b10e2081dd9..8f6d710a15a 100644 --- a/app/controllers/gestionnaires/groupe_gestionnaires_controller.rb +++ b/app/controllers/gestionnaires/groupe_gestionnaires_controller.rb @@ -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 @@ def destroy redirect_to gestionnaire_groupe_gestionnaires_path end + def tree_structure + @tree_structure = @groupe_gestionnaire.subtree.arrange + end + private def groupe_gestionnaires diff --git a/app/views/gestionnaires/groupe_gestionnaire_administrateurs/_add_admin_form.html.haml b/app/views/gestionnaires/groupe_gestionnaire_administrateurs/_add_administrateur_form.html.haml similarity index 100% rename from app/views/gestionnaires/groupe_gestionnaire_administrateurs/_add_admin_form.html.haml rename to app/views/gestionnaires/groupe_gestionnaire_administrateurs/_add_administrateur_form.html.haml diff --git a/app/views/gestionnaires/groupe_gestionnaire_administrateurs/create.turbo_stream.haml b/app/views/gestionnaires/groupe_gestionnaire_administrateurs/create.turbo_stream.haml index 1adda3a89fd..bf199bac2ec 100644 --- a/app/views/gestionnaires/groupe_gestionnaire_administrateurs/create.turbo_stream.haml +++ b/app/views/gestionnaires/groupe_gestionnaire_administrateurs/create.turbo_stream.haml @@ -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' diff --git a/app/views/gestionnaires/groupe_gestionnaire_administrateurs/index.html.haml b/app/views/gestionnaires/groupe_gestionnaire_administrateurs/index.html.haml index c32f71d91ac..7a25263e73c 100644 --- a/app/views/gestionnaires/groupe_gestionnaire_administrateurs/index.html.haml +++ b/app/views/gestionnaires/groupe_gestionnaire_administrateurs/index.html.haml @@ -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 diff --git a/app/views/gestionnaires/groupe_gestionnaire_children/_add_admin_form.html.haml b/app/views/gestionnaires/groupe_gestionnaire_children/_add_child_form.html.haml similarity index 100% rename from app/views/gestionnaires/groupe_gestionnaire_children/_add_admin_form.html.haml rename to app/views/gestionnaires/groupe_gestionnaire_children/_add_child_form.html.haml diff --git a/app/views/gestionnaires/groupe_gestionnaire_children/create.turbo_stream.haml b/app/views/gestionnaires/groupe_gestionnaire_children/create.turbo_stream.haml index 6abe9b64a74..bab9a71cc70 100644 --- a/app/views/gestionnaires/groupe_gestionnaire_children/create.turbo_stream.haml +++ b/app/views/gestionnaires/groupe_gestionnaire_children/create.turbo_stream.haml @@ -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' diff --git a/app/views/gestionnaires/groupe_gestionnaire_children/index.html.haml b/app/views/gestionnaires/groupe_gestionnaire_children/index.html.haml index 1a2c107864b..6b94e70b6e1 100644 --- a/app/views/gestionnaires/groupe_gestionnaire_children/index.html.haml +++ b/app/views/gestionnaires/groupe_gestionnaire_children/index.html.haml @@ -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 diff --git a/app/views/gestionnaires/groupe_gestionnaire_gestionnaires/_add_admin_form.html.haml b/app/views/gestionnaires/groupe_gestionnaire_gestionnaires/_add_gestionnaire_form.html.haml similarity index 100% rename from app/views/gestionnaires/groupe_gestionnaire_gestionnaires/_add_admin_form.html.haml rename to app/views/gestionnaires/groupe_gestionnaire_gestionnaires/_add_gestionnaire_form.html.haml diff --git a/app/views/gestionnaires/groupe_gestionnaire_gestionnaires/create.turbo_stream.haml b/app/views/gestionnaires/groupe_gestionnaire_gestionnaires/create.turbo_stream.haml index 035f006df71..f15e39812ee 100644 --- a/app/views/gestionnaires/groupe_gestionnaire_gestionnaires/create.turbo_stream.haml +++ b/app/views/gestionnaires/groupe_gestionnaire_gestionnaires/create.turbo_stream.haml @@ -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' diff --git a/app/views/gestionnaires/groupe_gestionnaire_gestionnaires/index.html.haml b/app/views/gestionnaires/groupe_gestionnaire_gestionnaires/index.html.haml index 44316561651..6b562bd9401 100644 --- a/app/views/gestionnaires/groupe_gestionnaire_gestionnaires/index.html.haml +++ b/app/views/gestionnaires/groupe_gestionnaire_gestionnaires/index.html.haml @@ -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 diff --git a/app/views/gestionnaires/groupe_gestionnaires/tree_structure.html.haml b/app/views/gestionnaires/groupe_gestionnaires/tree_structure.html.haml new file mode 100644 index 00000000000..9230e66dd81 --- /dev/null +++ b/app/views/gestionnaires/groupe_gestionnaires/tree_structure.html.haml @@ -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)) + diff --git a/config/routes.rb b/config/routes.rb index bf3894cc0f9..72d0a6fd4b4 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -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 diff --git a/spec/components/groupe_gestionnaire/groupe_gestionnaire_tree_structures/tree_structure_component_spec.rb b/spec/components/groupe_gestionnaire/groupe_gestionnaire_tree_structures/tree_structure_component_spec.rb new file mode 100644 index 00000000000..0c15eb94705 --- /dev/null +++ b/spec/components/groupe_gestionnaire/groupe_gestionnaire_tree_structures/tree_structure_component_spec.rb @@ -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 diff --git a/spec/controllers/gestionnaires/groupe_gestionnaires_controller_spec.rb b/spec/controllers/gestionnaires/groupe_gestionnaires_controller_spec.rb index 63c57d38556..450ccd2a772 100644 --- a/spec/controllers/gestionnaires/groupe_gestionnaires_controller_spec.rb +++ b/spec/controllers/gestionnaires/groupe_gestionnaires_controller_spec.rb @@ -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