feat: US5.1 US5.2 administrateur in admin

This commit is contained in:
seb-by-ouidou 2023-10-09 17:18:38 +00:00 committed by seb-by-ouidou
parent 91602ee1c1
commit c253e7dd65
24 changed files with 218 additions and 42 deletions

View file

@ -1,5 +1,6 @@
class GroupeGestionnaire::Card::AdministrateursComponent < ApplicationComponent
def initialize(groupe_gestionnaire:)
def initialize(groupe_gestionnaire:, path:)
@groupe_gestionnaire = groupe_gestionnaire
@path = path
end
end

View file

@ -1,5 +1,5 @@
.fr-col-6.fr-col-md-4.fr-col-lg-3
= link_to gestionnaire_groupe_gestionnaire_administrateurs_path(@groupe_gestionnaire), id: 'administrateurs', class: 'fr-tile fr-enlarge-link' do
= link_to @path, id: 'administrateurs', class: 'fr-tile fr-enlarge-link' do
.fr-tile__body.flex.column.align-center.justify-between
%p.fr-badge.fr-badge--success Validé
%div

View file

@ -1,5 +1,6 @@
class GroupeGestionnaire::Card::ChildrenComponent < ApplicationComponent
def initialize(groupe_gestionnaire:)
def initialize(groupe_gestionnaire:, path:)
@groupe_gestionnaire = groupe_gestionnaire
@path = path
end
end

View file

@ -1,5 +1,5 @@
.fr-col-6.fr-col-md-4.fr-col-lg-3
= link_to gestionnaire_groupe_gestionnaire_children_path(@groupe_gestionnaire), id: 'gestionnaires', class: 'fr-tile fr-enlarge-link' do
= link_to @path, id: 'gestionnaires', class: 'fr-tile fr-enlarge-link' do
.fr-tile__body.flex.column.align-center.justify-between
%p.fr-badge.fr-badge--success Validé
%div

View file

@ -1,5 +1,6 @@
class GroupeGestionnaire::Card::GestionnairesComponent < ApplicationComponent
def initialize(groupe_gestionnaire:)
def initialize(groupe_gestionnaire:, path:)
@groupe_gestionnaire = groupe_gestionnaire
@path = path
end
end

View file

@ -1,5 +1,5 @@
.fr-col-6.fr-col-md-4.fr-col-lg-3
= link_to gestionnaire_groupe_gestionnaire_gestionnaires_path(@groupe_gestionnaire), id: 'gestionnaires', class: 'fr-tile fr-enlarge-link' do
= link_to @path, id: 'gestionnaires', class: 'fr-tile fr-enlarge-link' do
.fr-tile__body.flex.column.align-center.justify-between
%p.fr-badge.fr-badge--success Validé
%div

View file

@ -1,9 +1,10 @@
class GroupeGestionnaire::GroupeGestionnaireAdministrateurs::AdministrateurComponent < ApplicationComponent
include ApplicationHelper
def initialize(groupe_gestionnaire:, administrateur:)
def initialize(groupe_gestionnaire:, administrateur:, is_gestionnaire: true)
@groupe_gestionnaire = groupe_gestionnaire
@administrateur = administrateur
@is_gestionnaire = is_gestionnaire
end
def email
@ -23,7 +24,7 @@ class GroupeGestionnaire::GroupeGestionnaireAdministrateurs::AdministrateurCompo
end
def remove_button
if is_there_at_least_another_active_admin?
if is_there_at_least_another_active_admin? && @is_gestionnaire
button_to 'Retirer',
remove_gestionnaire_groupe_gestionnaire_administrateur_path(@groupe_gestionnaire, @administrateur),
method: :delete,

View file

@ -2,5 +2,6 @@
%td= email
%td= created_at
%td= registration_state
%td= remove_button
%td= destroy_button
- if @is_gestionnaire
%td= remove_button
%td= destroy_button

View file

@ -1,9 +1,10 @@
class GroupeGestionnaire::GroupeGestionnaireGestionnaires::GestionnaireComponent < ApplicationComponent
include ApplicationHelper
def initialize(groupe_gestionnaire:, gestionnaire:)
def initialize(groupe_gestionnaire:, gestionnaire:, is_gestionnaire: true)
@groupe_gestionnaire = groupe_gestionnaire
@gestionnaire = gestionnaire
@is_gestionnaire = is_gestionnaire
end
def email
@ -23,7 +24,7 @@ class GroupeGestionnaire::GroupeGestionnaireGestionnaires::GestionnaireComponent
end
def remove_button
if is_there_at_least_another_active_admin?
if is_there_at_least_another_active_admin? && @is_gestionnaire
button_to 'Retirer',
gestionnaire_groupe_gestionnaire_gestionnaire_path(@groupe_gestionnaire, @gestionnaire),
method: :delete,

View file

@ -2,4 +2,5 @@
%td= email
%td= created_at
%td= registration_state
%td= remove_button
- if @is_gestionnaire
%td= remove_button

View file

@ -0,0 +1,28 @@
module Administrateurs
class GroupeGestionnaireController < AdministrateurController
before_action :retrieve_groupe_gestionnaire, only: [:show, :administrateurs, :gestionnaires]
def show
end
def administrateurs
end
def gestionnaires
end
private
def retrieve_groupe_gestionnaire
id = current_administrateur.groupe_gestionnaire_id
@groupe_gestionnaire = GroupeGestionnaire.find(id)
Sentry.configure_scope do |scope|
scope.set_tags(groupe_gestionnaire: @groupe_gestionnaire.id)
end
rescue ActiveRecord::RecordNotFound
flash.alert = 'Groupe inexistant'
redirect_to admin_procedures_path, status: 404
end
end
end

View file

@ -13,7 +13,8 @@ class GroupeGestionnaireDashboard < Administrate::BaseDashboard
created_at: Field::DateTime,
updated_at: Field::DateTime,
gestionnaires: Field::HasMany,
administrateurs: Field::HasMany
administrateurs: Field::HasMany,
parent_name: Field::String
}.freeze
# COLLECTION_ATTRIBUTES
@ -26,7 +27,8 @@ class GroupeGestionnaireDashboard < Administrate::BaseDashboard
:created_at,
:name,
:gestionnaires,
:administrateurs
:administrateurs,
:parent_name
].freeze
# SHOW_PAGE_ATTRIBUTES
@ -35,7 +37,8 @@ class GroupeGestionnaireDashboard < Administrate::BaseDashboard
:gestionnaires,
:administrateurs,
:id,
:created_at
:created_at,
:parent_name
].freeze
# FORM_ATTRIBUTES

View file

@ -21,4 +21,8 @@ class GroupeGestionnaire < ApplicationRecord
def can_be_deleted?(current_user)
(gestionnaires.empty? || (gestionnaires == [current_user])) && administrateurs.empty? && children.empty?
end
def parent_name
parent&.name
end
end

View file

@ -0,0 +1,15 @@
= render partial: 'gestionnaires/breadcrumbs',
locals: { steps: [['Mon groupe gestionnaire', admin_groupe_gestionnaire_path],
['Administrateurs']], preview: false }
.container
%h1 Administrateurs de « #{@groupe_gestionnaire.name} »
%table.table
%thead
%tr
%th= 'Adresse email'
%th= 'Enregistré le'
%th= 'État'
%tbody#administrateurs
= render(GroupeGestionnaire::GroupeGestionnaireAdministrateurs::AdministrateurComponent.with_collection(@groupe_gestionnaire.administrateurs.order('users.email'), groupe_gestionnaire: @groupe_gestionnaire, is_gestionnaire: false))

View file

@ -0,0 +1,18 @@
= render partial: 'gestionnaires/breadcrumbs',
locals: { steps: [['Mon groupe gestionnaire', admin_groupe_gestionnaire_path],
['Gestionnaires']], preview: false }
.container
%h1 Gestionnaires de « #{@groupe_gestionnaire.name} »
%table.table
%thead
%tr
%th= 'Adresse email'
%th= 'Enregistré le'
%th= 'État'
%tbody#gestionnaires
= render(GroupeGestionnaire::GroupeGestionnaireGestionnaires::GestionnaireComponent.with_collection(@groupe_gestionnaire.gestionnaires.order('users.email'), groupe_gestionnaire: @groupe_gestionnaire, is_gestionnaire: false))
.fr-mt-4w
= #render 'add_admin_form', groupe_gestionnaire: @groupe_gestionnaire

View file

@ -0,0 +1,9 @@
= render partial: 'gestionnaires/breadcrumbs',
locals: { steps: [["Mon groupe gestionnaire"]],
metadatas: true }
.fr-container
%h2= "Gestion du groupe gestionnaire № #{@groupe_gestionnaire.id}"
.fr-grid-row.fr-grid-row--gutters.fr-mb-5w
= render GroupeGestionnaire::Card::GestionnairesComponent.new(groupe_gestionnaire: @groupe_gestionnaire, path: admin_groupe_gestionnaire_gestionnaires_path)
= render GroupeGestionnaire::Card::AdministrateursComponent.new(groupe_gestionnaire: @groupe_gestionnaire, path: admin_groupe_gestionnaire_administrateurs_path)

View file

@ -0,0 +1,8 @@
.fr-container
%nav#header-navigation.fr-nav{ role: 'navigation', 'aria-label': 'Menu principal administrateur' }
%ul.fr-nav__list
%li.fr-nav__item= link_to 'Mes démarches', admin_procedures_path, class:'fr-nav__link', 'aria-current': current_page?(controller: 'procedures', action: :index) ? 'true' : nil
- if Rails.application.config.ds_zonage_enabled
%li.fr-nav__item= link_to 'Toutes les démarches', all_admin_procedures_path(zone_ids: current_administrateur.zones), class:'fr-nav__link', 'aria-current': current_page?(all_admin_procedures_path) ? 'page' : nil
- if current_administrateur.groupe_gestionnaire_id
%li.fr-nav__item= link_to 'Mon groupe gestionnaire', admin_groupe_gestionnaire_path, class:'fr-nav__link', 'aria-current': current_page?(admin_groupe_gestionnaire_path) ? 'page' : nil

View file

@ -19,6 +19,6 @@
groupe parent :
%a{ href: gestionnaire_groupe_gestionnaire_path(@groupe_gestionnaire.groupe_gestionnaire) }= @groupe_gestionnaire.groupe_gestionnaire.name
.fr-grid-row.fr-grid-row--gutters.fr-mb-5w
= render GroupeGestionnaire::Card::GestionnairesComponent.new(groupe_gestionnaire: @groupe_gestionnaire)
= render GroupeGestionnaire::Card::AdministrateursComponent.new(groupe_gestionnaire: @groupe_gestionnaire)
= render GroupeGestionnaire::Card::ChildrenComponent.new(groupe_gestionnaire: @groupe_gestionnaire)
= render GroupeGestionnaire::Card::GestionnairesComponent.new(groupe_gestionnaire: @groupe_gestionnaire, path: gestionnaire_groupe_gestionnaire_gestionnaires_path(@groupe_gestionnaire))
= render GroupeGestionnaire::Card::AdministrateursComponent.new(groupe_gestionnaire: @groupe_gestionnaire, path: gestionnaire_groupe_gestionnaire_administrateurs_path(@groupe_gestionnaire))
= render GroupeGestionnaire::Card::ChildrenComponent.new(groupe_gestionnaire: @groupe_gestionnaire, path: gestionnaire_groupe_gestionnaire_children_path(@groupe_gestionnaire))

View file

@ -650,6 +650,10 @@ Rails.application.routes.draw do
resource :sva_svr, only: [:show, :edit, :update], controller: 'sva_svr'
end
get 'mon-groupe' => 'groupe_gestionnaire#show', as: :groupe_gestionnaire
get 'mon-groupe/administrateurs' => 'groupe_gestionnaire#administrateurs', as: :groupe_gestionnaire_administrateurs
get 'mon-groupe/gestionnaires' => 'groupe_gestionnaire#gestionnaires', as: :groupe_gestionnaire_gestionnaires
resources :services, except: [:show] do
collection do
patch 'add_to_procedure'

View file

@ -0,0 +1,66 @@
describe Administrateurs::GroupeGestionnaireController, type: :controller do
let(:admin) { create(:administrateur) }
describe "#show" do
subject { get :show }
context "when not logged" do
before { subject }
it { expect(response).to redirect_to(new_user_session_path) }
end
context "when logged in" do
let(:gestionnaire) { create(:gestionnaire) }
let!(:groupe_gestionnaire) { create(:groupe_gestionnaire, gestionnaires: [gestionnaire], administrateurs: [admin]) }
before do
sign_in(admin.user)
subject
end
it { expect(response).to have_http_status(:ok) }
it { expect(assigns(:groupe_gestionnaire)).to eq(groupe_gestionnaire) }
end
end
describe "#gestionnaires" do
subject { get :gestionnaires }
let(:gestionnaire) { create(:gestionnaire) }
let!(:groupe_gestionnaire) { create(:groupe_gestionnaire, gestionnaires: [gestionnaire], administrateurs: [admin]) }
context "when not logged" do
before { subject }
it { expect(response).to redirect_to(new_user_session_path) }
end
context "when logged in" do
before do
sign_in(admin.user)
subject
end
it { expect(response).to have_http_status(:ok) }
it { expect(assigns(:groupe_gestionnaire)).to eq(groupe_gestionnaire) }
end
end
describe "#administrateurs" do
subject { get :administrateurs }
let(:gestionnaire) { create(:gestionnaire) }
let!(:groupe_gestionnaire) { create(:groupe_gestionnaire, gestionnaires: [gestionnaire], administrateurs: [admin]) }
context "when not logged" do
before { subject }
it { expect(response).to redirect_to(new_user_session_path) }
end
context "when logged in" do
before do
sign_in(admin.user)
subject
end
it { expect(response).to have_http_status(:ok) }
it { expect(assigns(:groupe_gestionnaire)).to eq(groupe_gestionnaire) }
end
end
end

View file

@ -18,9 +18,11 @@ describe Gestionnaires::GroupeGestionnaireChildrenController, type: :controller
subject
end
it { expect(response).to have_http_status(:ok) }
it { expect(assigns(:groupe_gestionnaire).children).to include(child_groupe_gestionnaire) }
it { expect(response.body).to include(child_groupe_gestionnaire.name) }
it do
expect(response).to have_http_status(:ok)
expect(assigns(:groupe_gestionnaire).children).to include(child_groupe_gestionnaire)
expect(response.body).to include(child_groupe_gestionnaire.name)
end
end
end

View file

@ -42,9 +42,11 @@ describe Gestionnaires::GroupeGestionnaireGestionnairesController, type: :contro
context 'when there are many gestionnaires' do
before { remove_gestionnaire(new_gestionnaire) }
it { expect(groupe_gestionnaire.gestionnaires).to include(gestionnaire) }
it { expect(groupe_gestionnaire.reload.gestionnaires.count).to eq(1) }
it { expect(flash.notice).to eq("Le gestionnaire « #{new_gestionnaire.email} » a été retiré du groupe gestionnaire.") }
it do
expect(groupe_gestionnaire.gestionnaires).to include(gestionnaire)
expect(groupe_gestionnaire.reload.gestionnaires.count).to eq(1)
expect(flash.notice).to eq("Le gestionnaire « #{new_gestionnaire.email} » a été retiré du groupe gestionnaire.")
end
end
context 'when there is only one gestionnaire' do
@ -53,9 +55,11 @@ describe Gestionnaires::GroupeGestionnaireGestionnairesController, type: :contro
remove_gestionnaire(gestionnaire)
end
it { expect(groupe_gestionnaire.gestionnaires).to include(gestionnaire) }
it { expect(groupe_gestionnaire.gestionnaires.count).to eq(1) }
it { expect(flash.alert).to eq('Suppression impossible : il doit y avoir au moins un gestionnaire dans le groupe racine') }
it do
expect(groupe_gestionnaire.gestionnaires).to include(gestionnaire)
expect(groupe_gestionnaire.gestionnaires.count).to eq(1)
expect(flash.alert).to eq('Suppression impossible : il doit y avoir au moins un gestionnaire dans le groupe racine')
end
end
end
end

View file

@ -18,10 +18,12 @@ describe Gestionnaires::GroupeGestionnairesController, type: :controller do
subject
end
it { expect(response).to have_http_status(:ok) }
it { expect(assigns(:groupe_gestionnaires)).to include(groupe_gestionnaire) }
it { expect(assigns(:groupe_gestionnaires)).to include(other_groupe_gestionnaire) }
it { expect(assigns(:groupe_gestionnaires)).not_to include(not_my_groupe_gestionnaire) }
it do
expect(response).to have_http_status(:ok)
expect(assigns(:groupe_gestionnaires)).to include(groupe_gestionnaire)
expect(assigns(:groupe_gestionnaires)).to include(other_groupe_gestionnaire)
expect(assigns(:groupe_gestionnaires)).not_to include(not_my_groupe_gestionnaire)
end
end
end

View file

@ -37,9 +37,11 @@ describe Manager::GroupeGestionnairesController, type: :controller do
context 'of a new gestionnaire' do
let(:new_gestionnaire_email) { 'new_gestionnaire@mail.com' }
it { expect(groupe_gestionnaire.gestionnaires.map(&:email)).to include(new_gestionnaire_email) }
it { expect(flash.notice).to be_present }
it { expect(response).to redirect_to(manager_groupe_gestionnaire_path(groupe_gestionnaire)) }
it do
expect(groupe_gestionnaire.gestionnaires.map(&:email)).to include(new_gestionnaire_email)
expect(flash.notice).to be_present
expect(response).to redirect_to(manager_groupe_gestionnaire_path(groupe_gestionnaire))
end
end
end
@ -62,9 +64,11 @@ describe Manager::GroupeGestionnairesController, type: :controller do
context 'when there are many gestionnaires' do
before { remove_gestionnaire(new_gestionnaire) }
it { expect(groupe_gestionnaire.gestionnaires).to include(gestionnaire) }
it { expect(groupe_gestionnaire.reload.gestionnaires.count).to eq(1) }
it { expect(response).to redirect_to(manager_groupe_gestionnaire_path(groupe_gestionnaire)) }
it do
expect(groupe_gestionnaire.gestionnaires).to include(gestionnaire)
expect(groupe_gestionnaire.reload.gestionnaires.count).to eq(1)
expect(response).to redirect_to(manager_groupe_gestionnaire_path(groupe_gestionnaire))
end
end
context 'when there is only one gestionnaire' do
@ -73,10 +77,12 @@ describe Manager::GroupeGestionnairesController, type: :controller do
remove_gestionnaire(gestionnaire)
end
it { expect(groupe_gestionnaire.gestionnaires).to include(gestionnaire) }
it { expect(groupe_gestionnaire.gestionnaires.count).to eq(1) }
it { expect(flash.alert).to eq('Suppression impossible : il doit y avoir au moins un gestionnaire dans le groupe racine') }
it { expect(response).to redirect_to(manager_groupe_gestionnaire_path(groupe_gestionnaire)) }
it do
expect(groupe_gestionnaire.gestionnaires).to include(gestionnaire)
expect(groupe_gestionnaire.gestionnaires.count).to eq(1)
expect(flash.alert).to eq('Suppression impossible : il doit y avoir au moins un gestionnaire dans le groupe racine')
expect(response).to redirect_to(manager_groupe_gestionnaire_path(groupe_gestionnaire))
end
end
end
end