Skip to content

Commit

Permalink
Merge pull request demarches-simplifiees#9578 from adullact/feature-o…
Browse files Browse the repository at this point in the history
…uidou/admin_creation_delegation_administrateur_pages

Feature ouidou/admin creation delegation administrateur pages
  • Loading branch information
colinux authored Dec 22, 2023
2 parents c4adee6 + e79de57 commit deab400
Show file tree
Hide file tree
Showing 25 changed files with 221 additions and 55 deletions.
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -23,23 +24,19 @@ def registration_state
end

def remove_button
if is_there_at_least_another_active_admin?
button_to 'Retirer',
remove_gestionnaire_groupe_gestionnaire_administrateur_path(@groupe_gestionnaire, @administrateur),
method: :delete,
class: 'fr-btn fr-btn--sm fr-btn--tertiary',
form: { data: { turbo: true, turbo_confirm: "Retirer « #{@administrateur.email} » des administrateurs de « #{@groupe_gestionnaire.name} » ?" } }
end
button_to 'Retirer',
remove_gestionnaire_groupe_gestionnaire_administrateur_path(@groupe_gestionnaire, @administrateur),
method: :delete,
class: 'fr-btn fr-btn--sm fr-btn--tertiary',
form: { data: { turbo: true, turbo_confirm: "Retirer « #{@administrateur.email} » des administrateurs de « #{@groupe_gestionnaire.name} » ?" } }
end

def destroy_button
if is_there_at_least_another_active_admin?
button_to 'Supprimer',
gestionnaire_groupe_gestionnaire_administrateur_path(@groupe_gestionnaire, @administrateur),
method: :delete,
class: 'fr-btn fr-btn--sm fr-btn--tertiary',
form: { data: { turbo: true, turbo_confirm: "Supprimer « #{@administrateur.email} » en tant qu'administrateurs ?" } }
end
button_to 'Supprimer',
gestionnaire_groupe_gestionnaire_administrateur_path(@groupe_gestionnaire, @administrateur),
method: :delete,
class: 'fr-btn fr-btn--sm fr-btn--tertiary',
form: { data: { turbo: true, turbo_confirm: "Supprimer « #{@administrateur.email} » en tant qu'administrateurs ?" } }
end

def is_there_at_least_another_active_admin?
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Original file line number Diff line number Diff line change
@@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,5 @@
%td= email
%td= created_at
%td= registration_state
%td= remove_button
- if @is_gestionnaire
%td= remove_button
28 changes: 28 additions & 0 deletions app/controllers/administrateurs/groupe_gestionnaire_controller.rb
Original file line number Diff line number Diff line change
@@ -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
5 changes: 4 additions & 1 deletion app/dashboards/administrateur_dashboard.rb
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ class AdministrateurDashboard < Administrate::BaseDashboard
created_at: Field::DateTime,
updated_at: Field::DateTime,
procedures: Field::HasMany.with_options(limit: 20),
groupe_gestionnaire: Field::BelongsTo,
registration_state: Field::String.with_options(searchable: false),
features: FeaturesField,
email: Field::Email.with_options(searchable: false)
Expand All @@ -28,6 +29,7 @@ class AdministrateurDashboard < Administrate::BaseDashboard
:user,
:created_at,
:procedures,
:groupe_gestionnaire,
:registration_state
].freeze

Expand All @@ -40,7 +42,8 @@ class AdministrateurDashboard < Administrate::BaseDashboard
:updated_at,
:registration_state,
:features,
:procedures
:procedures,
:groupe_gestionnaire
].freeze

# FORM_ATTRIBUTES
Expand Down
9 changes: 6 additions & 3 deletions app/dashboards/groupe_gestionnaire_dashboard.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -26,7 +27,8 @@ class GroupeGestionnaireDashboard < Administrate::BaseDashboard
:created_at,
:name,
:gestionnaires,
:administrateurs
:administrateurs,
:parent_name
].freeze

# SHOW_PAGE_ATTRIBUTES
Expand All @@ -35,7 +37,8 @@ class GroupeGestionnaireDashboard < Administrate::BaseDashboard
:gestionnaires,
:administrateurs,
:id,
:created_at
:created_at,
:parent_name
].freeze

# FORM_ATTRIBUTES
Expand Down
4 changes: 4 additions & 0 deletions app/models/groupe_gestionnaire.rb
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,8 @@ def add_administrateur(administrateur)
def can_be_deleted?(current_user)
(gestionnaires.empty? || (gestionnaires == [current_user])) && administrateurs.empty? && children.empty?
end

def parent_name
parent&.name
end
end
2 changes: 2 additions & 0 deletions app/views/administrateurs/_main_navigation.html.haml
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,7 @@
%li.fr-nav__item= link_to 'Mes démarches', admin_procedures_path, class:'fr-nav__link', 'aria-current': current_page?(controller: 'administrateurs/procedures', action: :index) ? 'page' : 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

= render MainNavigation::AnnouncesLinkComponent.new
Original file line number Diff line number Diff line change
@@ -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))
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
= 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))
9 changes: 9 additions & 0 deletions app/views/administrateurs/groupe_gestionnaire/show.html.haml
Original file line number Diff line number Diff line change
@@ -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)
6 changes: 3 additions & 3 deletions app/views/gestionnaires/groupe_gestionnaires/show.html.haml
Original file line number Diff line number Diff line change
Expand Up @@ -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))
4 changes: 4 additions & 0 deletions config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -650,6 +650,10 @@
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'
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,11 @@
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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,9 +42,11 @@ def remove_gestionnaire(gestionnaire)
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
Expand All @@ -53,9 +55,11 @@ def remove_gestionnaire(gestionnaire)
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
Loading

0 comments on commit deab400

Please sign in to comment.