Use a select2 box for looking to instructeurs
This commit is contained in:
parent
9fb72ea8e6
commit
9ca026a630
10 changed files with 136 additions and 35 deletions
38
app/assets/stylesheets/new_design/add_instructeur.scss
Normal file
38
app/assets/stylesheets/new_design/add_instructeur.scss
Normal file
|
@ -0,0 +1,38 @@
|
|||
@import "constants";
|
||||
@import "colors";
|
||||
|
||||
.instructeur-wrapper {
|
||||
.select-instructeurs {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.select2-container--default {
|
||||
.select2-selection--multiple {
|
||||
border: solid 1px $border-grey;
|
||||
|
||||
.select2-selection__choice, // scss-lint:disable SelectorFormat
|
||||
.select2-search--inline {
|
||||
padding: $default-spacer;
|
||||
}
|
||||
}
|
||||
|
||||
&.select2-container--focus {
|
||||
.select2-selection--multiple {
|
||||
border: 1px solid $blue;
|
||||
box-shadow: 0px 0px 2px 1px $blue;
|
||||
}
|
||||
}
|
||||
|
||||
.select2-results__option { // scss-lint:disable SelectorFormat
|
||||
padding: $default-spacer;
|
||||
}
|
||||
|
||||
.custom-select2-option {
|
||||
.icon {
|
||||
margin-right: $default-spacer;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -24,7 +24,7 @@ module Instructeurs
|
|||
groupe_instructeur.instructeurs << @instructeur
|
||||
flash[:notice] = "L’instructeur « #{instructeur_email} » a été affecté au groupe."
|
||||
GroupeInstructeurMailer
|
||||
.add_instructeur(groupe_instructeur, @instructeur, current_user.email)
|
||||
.add_instructeurs(groupe_instructeur, [@instructeur], current_user.email)
|
||||
.deliver_later
|
||||
end
|
||||
|
||||
|
|
|
@ -12,6 +12,7 @@ module NewAdministrateur
|
|||
@procedure = procedure
|
||||
@groupe_instructeur = groupe_instructeur
|
||||
@instructeurs = paginated_instructeurs
|
||||
@available_instructeur_emails = available_instructeur_emails
|
||||
end
|
||||
|
||||
def create
|
||||
|
@ -40,6 +41,7 @@ module NewAdministrateur
|
|||
else
|
||||
@procedure = procedure
|
||||
@instructeurs = paginated_instructeurs
|
||||
@available_instructeur_emails = available_instructeur_emails
|
||||
|
||||
flash[:alert] = "le nom « #{label} » est déjà pris par un autre groupe."
|
||||
render :show
|
||||
|
@ -47,18 +49,35 @@ module NewAdministrateur
|
|||
end
|
||||
|
||||
def add_instructeur
|
||||
@instructeur = Instructeur.by_email(instructeur_email) ||
|
||||
create_instructeur(instructeur_email)
|
||||
emails = params['emails'].map(&:strip).map(&:downcase)
|
||||
|
||||
if groupe_instructeur.instructeurs.include?(@instructeur)
|
||||
flash[:alert] = "L’instructeur « #{instructeur_email} » est déjà dans le groupe."
|
||||
correct_emails, bad_emails = emails
|
||||
.partition { |email| URI::MailTo::EMAIL_REGEXP.match?(email) }
|
||||
|
||||
if bad_emails.present?
|
||||
flash[:alert] = t('.wrong_address',
|
||||
count: bad_emails.count,
|
||||
value: bad_emails.join(', '))
|
||||
end
|
||||
|
||||
email_to_adds = correct_emails - groupe_instructeur.instructeurs.pluck(:email)
|
||||
|
||||
if email_to_adds.present?
|
||||
instructeurs = email_to_adds.map do |instructeur_email|
|
||||
Instructeur.by_email(instructeur_email) ||
|
||||
create_instructeur(instructeur_email)
|
||||
end
|
||||
|
||||
else
|
||||
groupe_instructeur.instructeurs << @instructeur
|
||||
flash[:notice] = "L’instructeur « #{instructeur_email} » a été affecté au groupe."
|
||||
GroupeInstructeurMailer
|
||||
.add_instructeur(groupe_instructeur, @instructeur, current_user.email)
|
||||
.add_instructeurs(groupe_instructeur, instructeurs, current_user.email)
|
||||
.deliver_later
|
||||
|
||||
groupe_instructeur.instructeurs << instructeurs
|
||||
|
||||
flash[:notice] = t('.assignment',
|
||||
count: email_to_adds.count,
|
||||
value: email_to_adds.join(', '),
|
||||
groupe: groupe_instructeur.label)
|
||||
end
|
||||
|
||||
redirect_to procedure_groupe_instructeur_path(procedure, groupe_instructeur)
|
||||
|
@ -110,10 +129,6 @@ module NewAdministrateur
|
|||
procedure.groupe_instructeurs.find(params[:id])
|
||||
end
|
||||
|
||||
def instructeur_email
|
||||
params[:instructeur][:email].strip.downcase
|
||||
end
|
||||
|
||||
def instructeur_id
|
||||
params[:instructeur][:id]
|
||||
end
|
||||
|
@ -141,5 +156,11 @@ module NewAdministrateur
|
|||
def routing_criteria_name
|
||||
params[:procedure][:routing_criteria_name]
|
||||
end
|
||||
|
||||
def available_instructeur_emails
|
||||
all = current_administrateur.instructeurs.pluck(:email)
|
||||
assigned = groupe_instructeur.instructeurs.pluck(:email)
|
||||
(all - assigned).sort
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,6 +1,13 @@
|
|||
import $ from 'jquery';
|
||||
import 'select2';
|
||||
|
||||
const optionTemplate = email =>
|
||||
$(
|
||||
'<span class="custom-select2-option"><span class="icon person"></span>' +
|
||||
email.text +
|
||||
'</span>'
|
||||
);
|
||||
|
||||
addEventListener('ds:page:update', () => {
|
||||
$('select.select2').select2({
|
||||
language: 'fr',
|
||||
|
@ -20,4 +27,20 @@ addEventListener('ds:page:update', () => {
|
|||
maximumSelectionLength: '30',
|
||||
width: '300px'
|
||||
});
|
||||
|
||||
$('select.select2-limited.select-instructeurs').select2({
|
||||
language: 'fr',
|
||||
dropdownParent: $('.instructeur-wrapper'),
|
||||
placeholder: 'Saisir l’adresse email de l’instructeur',
|
||||
tags: true,
|
||||
tokenSeparators: [',', ' '],
|
||||
templateResult: optionTemplate,
|
||||
templateSelection: function(email) {
|
||||
return $(
|
||||
'<span class="custom-select2-option"><span class="icon person"></span>' +
|
||||
email.text +
|
||||
'</span>'
|
||||
);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
class GroupeInstructeurMailer < ApplicationMailer
|
||||
layout 'mailers/layout'
|
||||
|
||||
def add_instructeur(group, instructeur, current_instructeur_email)
|
||||
@email = instructeur.email
|
||||
@group = group
|
||||
def add_instructeurs(group, instructeurs, current_instructeur_email)
|
||||
@new_instructeur_emails = instructeurs.map(&:email)
|
||||
@group = Procedure.last.defaut_groupe_instructeur
|
||||
@current_instructeur_email = current_instructeur_email
|
||||
|
||||
subject = "Ajout d’un instructeur dans le groupe \"#{group.label}\""
|
||||
|
|
|
@ -1,11 +0,0 @@
|
|||
%p
|
||||
Bonjour,
|
||||
|
||||
%p
|
||||
L’instructeur « #{@email} » a été affecté au groupe « #{@group.label} » par « #{@current_instructeur_email} », en charge de la démarche « #{@group.procedure.libelle} ».
|
||||
|
||||
%p
|
||||
Cliquez sur le lien ci-dessous pour voir la liste des instructeurs de ce groupe :
|
||||
= link_to(@group.label, procedure_groupe_instructeur_url(@group.procedure, @group))
|
||||
|
||||
= render partial: "layouts/mailers/signature"
|
|
@ -0,0 +1,11 @@
|
|||
%p
|
||||
Bonjour,
|
||||
|
||||
%p
|
||||
#{t('new_administrateur.groupe_instructeurs.add_instructeur.assignment', count: @new_instructeur_emails.count, value: @new_instructeur_emails.join(', '), groupe: @group.label).chomp('.')} par « #{@current_instructeur_email} », en charge de la démarche « #{@group.procedure.libelle} ».
|
||||
|
||||
%p
|
||||
Cliquez sur le lien ci-dessous pour voir la liste des instructeurs de ce groupe :
|
||||
= link_to(@group.label, procedure_groupe_instructeur_url(@group.procedure, @group))
|
||||
|
||||
= render partial: "layouts/mailers/signature"
|
|
@ -22,9 +22,12 @@
|
|||
url: { action: :add_instructeur },
|
||||
html: { class: 'form' } do |f|
|
||||
|
||||
= f.label :email do
|
||||
Affecter un nouvel instructeur
|
||||
= f.email_field :email, placeholder: 'marie.dupont@exemple.fr', required: true
|
||||
.instructeur-wrapper
|
||||
= select_tag :emails,
|
||||
options_for_select(@available_instructeur_emails),
|
||||
multiple: true,
|
||||
class: 'select-instructeurs select2-limited'
|
||||
|
||||
= f.submit 'Affecter', class: 'button primary send'
|
||||
|
||||
%table.table.mt-2
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
fr:
|
||||
new_administrateur:
|
||||
groupe_instructeurs:
|
||||
add_instructeur:
|
||||
wrong_address:
|
||||
one: "%{value} n'est pas une adresse email valide"
|
||||
other: "%{value} ne sont pas des adresses emails valides"
|
||||
assignment:
|
||||
one: "L’instructeur %{value} a été affecté au groupe « %{groupe} »."
|
||||
other: "Les instructeurs %{value} ont été affectés au groupe « %{groupe} »."
|
|
@ -93,20 +93,26 @@ describe NewAdministrateur::GroupeInstructeursController, type: :controller do
|
|||
params: {
|
||||
procedure_id: procedure.id,
|
||||
id: gi_1_1.id,
|
||||
instructeur: { email: new_instructeur_email }
|
||||
emails: new_instructeur_emails
|
||||
}
|
||||
end
|
||||
|
||||
context 'of a new instructeur' do
|
||||
let(:new_instructeur_email) { 'new_instructeur@mail.com' }
|
||||
context 'of a news instructeurs' do
|
||||
let(:new_instructeur_emails) { ['new_i1@mail.com', 'new_i2@mail.com'] }
|
||||
|
||||
it { expect(gi_1_1.instructeurs.map(&:email)).to include(new_instructeur_email) }
|
||||
it { expect(gi_1_1.instructeurs.pluck(:email)).to include(*new_instructeur_emails) }
|
||||
it { expect(flash.notice).to be_present }
|
||||
it { expect(response).to redirect_to(procedure_groupe_instructeur_path(procedure, gi_1_1)) }
|
||||
end
|
||||
|
||||
context 'of an instructeur already in the group' do
|
||||
let(:new_instructeur_email) { instructeur.email }
|
||||
let(:new_instructeur_emails) { [instructeur.email] }
|
||||
|
||||
it { expect(response).to redirect_to(procedure_groupe_instructeur_path(procedure, procedure.defaut_groupe_instructeur)) }
|
||||
end
|
||||
|
||||
context 'of badly formed email' do
|
||||
let(:new_instructeur_emails) { ['badly_formed_email'] }
|
||||
|
||||
it { expect(flash.alert).to be_present }
|
||||
it { expect(response).to redirect_to(procedure_groupe_instructeur_path(procedure, procedure.defaut_groupe_instructeur)) }
|
||||
|
|
Loading…
Reference in a new issue