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
|
||||
@groupe_instructeur = groupe_instructeur
|
||||
|
||||
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(groupe_instructeur_params)
|
||||
if @groupe_instructeur.update(groupe_instructeur_params)
|
||||
redirect_to admin_procedure_groupe_instructeur_path(procedure, groupe_instructeur),
|
||||
notice: "Le nom est à présent « #{@groupe_instructeur.label} »."
|
||||
else
|
||||
|
@ -64,6 +61,26 @@ module Administrateurs
|
|||
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
|
||||
@groupe_instructeur = groupe_instructeur
|
||||
|
||||
|
@ -264,7 +281,7 @@ module Administrateurs
|
|||
private
|
||||
|
||||
def closed_params?
|
||||
groupe_instructeur_params[:closed] == "1"
|
||||
params[:closed] == "1"
|
||||
end
|
||||
|
||||
def procedure
|
||||
|
@ -287,7 +304,7 @@ module Administrateurs
|
|||
end
|
||||
|
||||
def groupe_instructeur_params
|
||||
params.require(:groupe_instructeur).permit(:label, :closed)
|
||||
params.require(:groupe_instructeur).permit(:label)
|
||||
end
|
||||
|
||||
def paginated_groupe_instructeurs
|
||||
|
|
|
@ -1,2 +1,3 @@
|
|||
= turbo_stream.replace 'routing-rules', render(Procedure::RoutingRulesComponent.new(revision: @procedure.active_revision,
|
||||
groupe_instructeurs: @procedure.groupe_instructeurs))
|
||||
= turbo_stream.replace dom_id(@groupe_instructeur, :routing),
|
||||
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 :groupe_instructeurs, only: [:index, :show, :create, :update, :destroy] do
|
||||
patch 'update_state' => 'groupe_instructeurs#update_state'
|
||||
|
||||
member do
|
||||
post 'add_instructeur'
|
||||
delete 'remove_instructeur'
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
describe Procedure::RoutingRulesComponent, type: :component do
|
||||
describe Procedure::OneGroupeManagementComponent, type: :component do
|
||||
include Logic
|
||||
|
||||
describe 'render' do
|
||||
|
@ -9,16 +9,7 @@ describe Procedure::RoutingRulesComponent, type: :component do
|
|||
|
||||
subject do
|
||||
render_inline(described_class.new(revision: procedure.active_revision,
|
||||
groupe_instructeurs: procedure.groupe_instructeurs))
|
||||
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') }
|
||||
groupe_instructeur: procedure.defaut_groupe_instructeur))
|
||||
end
|
||||
|
||||
context 'when there are types de champ that can be routed' do
|
||||
|
@ -32,7 +23,7 @@ describe Procedure::RoutingRulesComponent, type: :component do
|
|||
procedure.reload
|
||||
subject
|
||||
end
|
||||
it { expect(page).to have_text('Router vers') }
|
||||
it { expect(page).to have_text('à configurer') }
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue