add one_groupe_management_component

This commit is contained in:
simon lehericey 2023-04-24 15:47:46 +02:00 committed by LeSim
parent 1754086c94
commit 174f7a7c53
7 changed files with 158 additions and 20 deletions

View file

@ -0,0 +1,65 @@
class Procedure::OneGroupeManagementComponent < ApplicationComponent
include Logic
def initialize(revision:, groupe_instructeur:)
@revision = revision
@groupe_instructeur = groupe_instructeur
@procedure_id = revision.procedure_id
end
private
def targeted_champ
@groupe_instructeur.routing_rule&.left || empty
end
def value
@groupe_instructeur.routing_rule&.right || empty
end
def targeted_champ_tag
select_tag(
'targeted_champ',
options_for_select(targeted_champs_for_select, selected: targeted_champ.to_json),
class: 'fr-select'
)
end
def targeted_champs_for_select
empty_target_for_select + available_targets_for_select
end
def empty_target_for_select
[[t('.select'), empty.to_json]]
end
def available_targets_for_select
@revision.types_de_champ_public
.filter { |tdc| [:drop_down_list].include?(tdc.type_champ.to_sym) }
.map { |tdc| [tdc.libelle, champ_value(tdc.stable_id).to_json] }
end
def value_tag
select_tag(
'value',
options_for_select(
values_for_select(targeted_champ),
selected: value.to_json
),
class: 'fr-select'
)
end
def values_for_select(targeted_champ)
(empty_target_for_select + available_values_for_select(targeted_champ))
# add id to help morph render selected option
.map { |(libelle, json)| [libelle, json, { id: "option-#{libelle}" }] }
end
def available_values_for_select(targeted_champ)
return [] if targeted_champ.is_a?(Logic::Empty)
targeted_champ
.options(@revision.types_de_champ_public)
.map { |tdc| [tdc.first, constant(tdc.first).to_json] }
end
end

View file

@ -0,0 +1,8 @@
---
fr:
select: Sélectionner
move_files_confirmation: Réaffecter les dossiers à un autre groupe afin de pouvoir le supprimer
move_files:
zero: Déplacer les dossiers en brouillon
one: Déplacer un dossier
other: Déplacer les %{count} dossiers

View file

@ -0,0 +1,54 @@
%div{ id: dom_id(@groupe_instructeur, :routing) }
%h2 Paramètres principaux
= form_for @groupe_instructeur,
url: { controller: 'administrateurs/groupe_instructeurs', action: :update } do |f|
= f.label :label, 'Nom du groupe', class: 'fr-label fr-mb-1w'
.flex
= f.text_field :label, required: true, class: 'fr-input flex auto fr-mr-2w'
= f.button 'Renommer', class: 'fr-btn fr-btn--secondary'
= form_for @groupe_instructeur,
url: admin_procedure_groupe_instructeur_update_state_path(@procedure_id, @groupe_instructeur),
method: :patch,
data: { turbo: true, controller: 'autosubmit' } do |f|
.fr-checkbox-group.fr-my-3w
= f.check_box :closed, { id: 'closed', "aria-describedby" => "closed-messages", :name => "closed" }
%label.fr-label{ :for => "closed" }
Groupe inactif
%span.fr-hint-text Si cette option est activée, les usagers ne pourront plus sélectionner ce groupe d'instructeurs
= form_tag admin_procedure_routing_rules_path(@procedure_id),
method: :post,
data: { controller: 'autosave' },
class: 'fr-mb-3w' do
= hidden_field_tag('groupe_instructeur_id', @groupe_instructeur.id)
.flex
%p.fr-mb-1w.fr-mr-2w Routage
- if @groupe_instructeur.routing_to_configure?
%p.fr-mb-1w.fr-badge.fr-badge--warning.fr-badge--sm à configurer
.flex.align-baseline
.fr-mr-2w si le champ
.target.fr-mr-2w
= targeted_champ_tag
.operator.fr-mr-2w est égal à
.value
= value_tag
%ul.fr-btns-group.fr-btns-group--sm.fr-btns-group--inline.fr-btns-group--icon-right
%li
- if @groupe_instructeur.can_delete?
%p Supprimer le groupe
= button_to admin_procedure_groupe_instructeur_path(@procedure_id, @groupe_instructeur),
class: 'fr-btn fr-btn--tertiary fr-btn--icon-left fr-icon-delete-line',
method: :delete do
Supprimer
- else
= button_to reaffecter_dossiers_admin_procedure_groupe_instructeur_path(@procedure_id, @groupe_instructeur),
class: 'fr-btn fr-btn--tertiary fr-icon-folder-2-line',
title: t('.move_files_confirmation'),
method: :get do
= t('.move_files', count: @groupe_instructeur.dossiers.visible_by_administration.size)

View file

@ -48,10 +48,7 @@ module Administrateurs
def update def update
@groupe_instructeur = groupe_instructeur @groupe_instructeur = groupe_instructeur
if closed_params? && @groupe_instructeur.id == procedure.defaut_groupe_instructeur.id if @groupe_instructeur.update(groupe_instructeur_params)
redirect_to admin_procedure_groupe_instructeur_path(procedure, groupe_instructeur),
alert: "Il est impossible de désactiver le groupe dinstructeurs par défaut."
elsif @groupe_instructeur.update(groupe_instructeur_params)
redirect_to admin_procedure_groupe_instructeur_path(procedure, groupe_instructeur), redirect_to admin_procedure_groupe_instructeur_path(procedure, groupe_instructeur),
notice: "Le nom est à présent « #{@groupe_instructeur.label} »." notice: "Le nom est à présent « #{@groupe_instructeur.label} »."
else else
@ -64,6 +61,26 @@ module Administrateurs
end end
end end
def update_state
@groupe_instructeur = procedure.groupe_instructeurs.find(params[:groupe_instructeur_id])
if closed_params? && @groupe_instructeur.id == procedure.defaut_groupe_instructeur.id
redirect_to admin_procedure_groupe_instructeur_path(procedure, @groupe_instructeur),
alert: "Il est impossible de désactiver le groupe dinstructeurs par défaut."
elsif @groupe_instructeur.update(closed: params[:closed])
state_for_notice = @groupe_instructeur.closed ? 'désactivé' : 'activé'
redirect_to admin_procedure_groupe_instructeur_path(procedure, @groupe_instructeur),
notice: "Le groupe #{@groupe_instructeur.label} est #{state_for_notice}."
else
@procedure = procedure
@instructeurs = paginated_instructeurs
@available_instructeur_emails = available_instructeur_emails
flash.now[:alert] = @groupe_instructeur.errors.full_messages
render :show
end
end
def destroy def destroy
@groupe_instructeur = groupe_instructeur @groupe_instructeur = groupe_instructeur
@ -264,7 +281,7 @@ module Administrateurs
private private
def closed_params? def closed_params?
groupe_instructeur_params[:closed] == "1" params[:closed] == "1"
end end
def procedure def procedure
@ -287,7 +304,7 @@ module Administrateurs
end end
def groupe_instructeur_params def groupe_instructeur_params
params.require(:groupe_instructeur).permit(:label, :closed) params.require(:groupe_instructeur).permit(:label)
end end
def paginated_groupe_instructeurs def paginated_groupe_instructeurs

View file

@ -1,2 +1,3 @@
= turbo_stream.replace 'routing-rules', render(Procedure::RoutingRulesComponent.new(revision: @procedure.active_revision, = turbo_stream.replace dom_id(@groupe_instructeur, :routing),
groupe_instructeurs: @procedure.groupe_instructeurs)) render(Procedure::OneGroupeManagementComponent.new(revision: @procedure.active_revision,
groupe_instructeur: @groupe_instructeur))

View file

@ -522,6 +522,8 @@ Rails.application.routes.draw do
resources :mail_templates, only: [:edit, :update, :show] resources :mail_templates, only: [:edit, :update, :show]
resources :groupe_instructeurs, only: [:index, :show, :create, :update, :destroy] do resources :groupe_instructeurs, only: [:index, :show, :create, :update, :destroy] do
patch 'update_state' => 'groupe_instructeurs#update_state'
member do member do
post 'add_instructeur' post 'add_instructeur'
delete 'remove_instructeur' delete 'remove_instructeur'

View file

@ -1,4 +1,4 @@
describe Procedure::RoutingRulesComponent, type: :component do describe Procedure::OneGroupeManagementComponent, type: :component do
include Logic include Logic
describe 'render' do describe 'render' do
@ -9,16 +9,7 @@ describe Procedure::RoutingRulesComponent, type: :component do
subject do subject do
render_inline(described_class.new(revision: procedure.active_revision, render_inline(described_class.new(revision: procedure.active_revision,
groupe_instructeurs: procedure.groupe_instructeurs)) groupe_instructeur: procedure.defaut_groupe_instructeur))
end
context 'when there are no types de champ that can be routed' do
before do
procedure.publish_revision!
procedure.reload
subject
end
it { expect(page).to have_text('Ajoutez ce champ dans la page') }
end end
context 'when there are types de champ that can be routed' do context 'when there are types de champ that can be routed' do
@ -32,7 +23,7 @@ describe Procedure::RoutingRulesComponent, type: :component do
procedure.reload procedure.reload
subject subject
end end
it { expect(page).to have_text('Router vers') } it { expect(page).to have_text('à configurer') }
end end
end end
end end