add one_groupe_management_component
This commit is contained in:
parent
1754086c94
commit
174f7a7c53
7 changed files with 158 additions and 20 deletions
65
app/components/procedure/one_groupe_management_component.rb
Normal file
65
app/components/procedure/one_groupe_management_component.rb
Normal 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
|
|
@ -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
|
|
@ -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)
|
|
@ -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 d’instructeurs 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 d’instructeurs 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
|
||||||
|
|
|
@ -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))
|
||||||
|
|
|
@ -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'
|
||||||
|
|
|
@ -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
|
Loading…
Reference in a new issue