Merge branch 'main' into US/sentry#3144617191

This commit is contained in:
mfo 2022-04-21 17:52:08 +02:00 committed by GitHub
commit 9e8da8dc06
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
23 changed files with 256 additions and 61 deletions

View file

@ -1,6 +1,10 @@
module ApplicationHelper
include SanitizeUrl
def html_lang
I18n.locale.to_s
end
def sanitize_url(url)
if !url.nil?
super(url, schemes: ['http', 'https'], replace_evil_with: root_url)

View file

@ -5,37 +5,44 @@
html: { class: 'form' } do |f|
= f.label :routing_criteria_name do
Libellé du routage
%p.notice Ce texte apparaitra sur le formulaire usager comme le libellé dune liste
= f.text_field :routing_criteria_name, placeholder: 'ex. Votre ville', required: true
= f.submit 'Renommer', class: 'button primary send'
= t('.routing.title')
%p.notice
= t('.routing.notice')
= f.text_field :routing_criteria_name, placeholder: t('.add_a_group.placeholder'), required: true
= f.submit t('.button.rename'), class: 'button primary send'
.card
.card-title Gestion des Groupes
.card-title
= t('.group_management.title')
= form_for :groupe_instructeur, html: { class: 'form' } do |f|
= f.label :label do
Ajouter un groupe
%p.notice Ce groupe sera un choix de la liste « #{procedure.routing_criteria_name} » .
= f.text_field :label, placeholder: 'ex. Ville de Bordeaux', required: true
= f.submit 'Ajouter le groupe', class: "button primary send"
= t('.add_a_group.title')
%p.notice
= t('.add_a_group.notice', routing_criteria_name: procedure.routing_criteria_name)
= f.text_field :label, placeholder: t('.add_a_group.placeholder'), required: true
= f.submit t('.button.add_group'), class: "button primary send"
- csv_max_size = Administrateurs::GroupeInstructeursController::CSV_MAX_SIZE
- if procedure.publiee?
= form_tag import_admin_procedure_groupe_instructeurs_path(procedure), method: :post, multipart: true, class: "mt-4 form" do
= label_tag "Importer par fichier CSV"
%p.notice Le fichier csv doit comporter 2 colonnes (Groupe, Email) et être séparé par des virgules. L'import n'écrase pas les groupes et les instructeurs existants.
%p.notice Le poids du fichier doit être inférieur à #{number_to_human_size(csv_max_size)}
%p.mt-2.mb-2= link_to "Télécharger l'exemple de fichier CSV", "/csv/#{I18n.locale}/import-groupe-test.csv"
= label_tag t('.csv_import.title')
%p.notice
= t('.csv_import.notice_1')
%p.notice
= t('.csv_import.notice_2', csv_max_size: number_to_human_size(csv_max_size))
%p.mt-2.mb-2= link_to t('.csv_import.download_exemple'), "/csv/#{I18n.locale}/import-groupe-test.csv"
= file_field_tag :group_csv_file, required: true, accept: 'text/csv', size: "1"
= submit_tag "Importer le fichier", class: 'button primary send', data: { disable_with: "Envoi..." }
= submit_tag t('.csv_import.import_file'), class: 'button primary send', data: { disable_with: "Envoi..." }
- else
%p.mt-4.form.bold.mb-2.text-lg Importer par fichier CSV
%p.notice Limport dinstructeurs par fichier CSV est disponible une fois la démarche publiée
%p.mt-4.form.bold.mb-2.text-lg
= t('.csv_import.title')
%p.notice
= t('.csv_import.import_file_procedure_not_published')
%table.table.mt-2
%thead
%tr
// i18n-tasks-use t('.existing_groupe')
%th{ colspan: 2 }= t(".existing_groupe", count: groupes_instructeurs.total_count)
%th
- if groupe_instructeurs_count > 1
@ -44,18 +51,18 @@
- groupes_instructeurs.each do |group|
%tr
%td= group.label
%td.actions= link_to "voir", admin_procedure_groupe_instructeur_path(procedure, group)
%td.actions= link_to t('.view'), admin_procedure_groupe_instructeur_path(procedure, group)
- if groupes_instructeurs.many?
- if group.dossiers.empty?
%td.actions
= link_to admin_procedure_groupe_instructeur_path(procedure, group), { method: :delete, class: 'button', data: { confirm: "Êtes-vous sûr de vouloir supprimer le groupe « #{group.label} » ?" }} do
= link_to admin_procedure_groupe_instructeur_path(procedure, group), { method: :delete, class: 'button', data: { confirm: t('.group_management.delete_confirmation', group_name: group.label) }} do
%span.icon.delete
supprimer ce groupe
= t('.group_management.delete')
- else
%td.actions
= link_to reaffecter_dossiers_admin_procedure_groupe_instructeur_path(procedure, group), class: 'button', title:'Réaffecter les dossiers à un autre groupe afin de pouvoir le supprimer' do
= link_to reaffecter_dossiers_admin_procedure_groupe_instructeur_path(procedure, group), class: 'button', title: t('.group_management.move_folders_confirmation') do
%span.icon.follow
déplacer les dossiers
= t('.group_management.move_folders')
= paginate groupes_instructeurs

View file

@ -1,5 +1,6 @@
.card
.card-title Routage
.card-title
= t('.title')
- if !procedure.routee?
%p.notice= t('.notice_html')

View file

@ -1,8 +1,8 @@
- if @procedure.routee?
= render partial: 'administrateurs/breadcrumbs',
locals: { steps: [link_to('Démarches', admin_procedures_path),
locals: { steps: [link_to(t('.procedures'), admin_procedures_path),
link_to(@procedure.libelle, admin_procedure_path(@procedure)),
'Groupes dinstructeurs'] }
t('.instructors_group')] }
- else
= render partial: 'administrateurs/breadcrumbs',
locals: { steps: [link_to('Démarches', admin_procedures_path),

View file

@ -10,7 +10,6 @@
.card-title Réaffectation des dossiers du groupe « #{@groupe_instructeur.label} »
%p
Le groupe « #{@groupe_instructeur.label} » contient des dossiers. Afin de procéder à sa suppression, vous devez réaffecter ses dossiers à un autre groupe instructeur.
%table.table.mt-2
%thead
%tr

View file

@ -5,74 +5,75 @@
'Notifications'] }
.container
%h1 Notifications par email
%h1
= t('.title')
= form_for @assign_to, url: update_email_notifications_instructeur_procedure_path(@procedure), html: { class: 'form' } do |form|
.explication
Configurez sur cette page les notifications que vous souhaitez recevoir par email pour cette démarche.
= t('.subtitle')
= form.label :email_notification, "Recevoir une notification à chaque dossier déposé"
= form.label :email_notification, t('.for_each_file_submitted.title')
%p.notice
Cet email vous signale le dépôt dun nouveau dossier.
= t('.for_each_file_submitted.notice_1')
%p.notice
Il est envoyé à chaque fois qu'un usager dépose un dossier.
= t('.for_each_file_submitted.notice_2')
.radios
%label
= form.radio_button :instant_email_dossier_notifications_enabled, true
Oui
= t('.utils.positive')
%label
= form.radio_button :instant_email_dossier_notifications_enabled, false
Non
= t('.utils.negative')
= form.label :email_notification, "Recevoir une notification à chaque message déposé"
= form.label :email_notification, t('.for_each_message_submitted.title')
%p.notice
Cet email vous signale le dépôt dun nouveau message sur vos dossiers suivis.
= t('.for_each_message_submitted.notice_1')
%p.notice
Il est envoyé à chaque fois qu'un usager dépose un message.
= t('.for_each_message_submitted.notice_2')
.radios
%label
= form.radio_button :instant_email_message_notifications_enabled, true
Oui
= t('.utils.positive')
%label
= form.radio_button :instant_email_message_notifications_enabled, false
Non
= t('.utils.negative')
= form.label :email_notification, "Recevoir une notification quotidienne"
= form.label :email_notification, t('.daily_notifications.title')
%p.notice
Cet email vous signale le dépôt de nouveaux dossiers sur cette démarche, ou des changements sur vos dossiers suivis.
= t('.daily_notifications.notice_1')
%p.notice
Il est envoyé une fois par jour, du lundi au samedi, vers 10 h du matin.
= t('.daily_notifications.notice_2')
.radios
%label
= form.radio_button :daily_email_notifications_enabled, true
Oui
= t('.utils.positive')
%label
= form.radio_button :daily_email_notifications_enabled, false
Non
= t('.utils.negative')
= form.label :email_notification, "Recevoir un récapitulatif hebdomadaire"
= form.label :email_notification, t('.hebdo_recap.title')
%p.notice
Cet email récapitule lactivité de la semaine sur lensemble de vos démarches.
= t('.hebdo_recap.notice_1')
%p.notice
Il est envoyé chaque semaine le lundi matin.
= t('.hebdo_recap.notice_2')
.radios
%label
= form.radio_button :weekly_email_notifications_enabled, true
Oui
= t('.utils.positive')
%label
= form.radio_button :weekly_email_notifications_enabled, false
Non
= t('.utils.negative')
.send-wrapper
= link_to "Revenir à la procédure", instructeur_procedure_path(@procedure), class: 'button mr-1'
= form.submit "Enregistrer", class: "button primary"
= link_to t('.buttons.back_to_procedure'), instructeur_procedure_path(@procedure), class: 'button mr-1'
= form.submit t('.buttons.save'), class: "button primary"

View file

@ -2,10 +2,12 @@
= render partial: 'administrateurs/breadcrumbs',
locals: { steps: [link_to(@procedure.libelle, instructeur_procedure_path(@procedure)),
'Contacter les usagers (brouillon)'] }
t('.contact_users')] }
.messagerie.container
- if @email_usagers_dossiers.present?
%p.notice.mb-2.mt-4 Vous allez envoyer un message à #{pluralize(@dossiers_count, 'personne')} dont les dossiers sont en brouillon, dans les groupes instructeurs : #{@groupe_instructeurs.join(', ')}.
%p.notice.mb-2.mt-4
= t('.notice', dossiers_count: pluralize(@dossiers_count, 'personne'), groupe_instructeurs: @groupe_instructeurs.join(', '))
= render partial: 'shared/dossiers/messages/form', locals: { commentaire: @commentaire, form_url: create_multiple_commentaire_instructeur_procedure_path(@procedure), disable_piece_jointe: true }
- if @bulk_messages.present?

View file

@ -3,6 +3,6 @@
= render partial: 'administrateurs/breadcrumbs',
locals: { steps: [link_to(@procedure.libelle, instructeur_procedure_path(@procedure)),
'Statistiques'] }
t('.title')] }
= render partial: 'shared/procedures/stats', locals: { title: title }

View file

@ -39,7 +39,7 @@
- if nav_bar_profile == :user
%ul.header-tabs
%li
= active_link_to "Dossiers", dossiers_path, active: :inclusive, class: 'tab-link'
= active_link_to t('.files'), dossiers_path, active: :inclusive, class: 'tab-link'
- if current_user.expert && current_expert.avis_summary[:total] > 0
= render partial: 'layouts/header/avis_tab', locals: { current_expert: current_expert }

View file

@ -1,5 +1,5 @@
!!! 5
%html{ lang: "fr", class: yield(:root_class) }
%html{ lang: html_lang, class: yield(:root_class) }
%head
%meta{ "http-equiv": "Content-Type", content: "text/html; charset=UTF-8" }
%meta{ "http-equiv": "X-UA-Compatible", content: "IE=edge" }

View file

@ -2,5 +2,7 @@
= mail_to CONTACT_EMAIL do
%span.icon.mail
.dropdown-description
%span.help-dropdown-title Contact technique
%p Envoyez nous un message à #{CONTACT_EMAIL}.
%span.help-dropdown-title
= t('help_dropdown.technical_contact_title')
%p
= t('help_dropdown.technical_contact_description', contact_email: CONTACT_EMAIL)

View file

@ -2,5 +2,8 @@
= link_to FAQ_URL, target: "_blank", rel: "noopener" do
%span.icon.help
.dropdown-description
%span.help-dropdown-title Un problème avec le site ?
%p Trouvez votre réponse dans laide en ligne.
%span.help-dropdown-title
= t('help_dropdown.problem_title')
%p
= t('help_dropdown.problem_description')

View file

@ -34,6 +34,11 @@ en:
custom_message: 'If you are a human, ignore this field'
help: 'Help'
help_dropdown:
problem_title: A problem with the website ?
problem_description: Find your answer in the online help.
technical_contact_title: Technical contact
technical_contact_description: Send us a message to %{contact_email}.
utils:
'yes': Yes
'no': No

View file

@ -22,8 +22,12 @@
fr:
invisible_captcha:
custom_message: 'Si vous êtes un humain, veuillez ignorer ce champs'
help: 'Aide'
help_dropdown:
problem_title: Un problème avec le site ?
problem_description: Trouvez votre réponse dans laide en ligne.
technical_contact_title: Contact technique
technical_contact_description: Envoyez nous un message à %{contact_email}.
utils:
'yes': Oui
'no': Non

View file

@ -1,4 +1,4 @@
fr:
en:
activerecord:
attributes:
procedure_presentation:

View file

@ -0,0 +1,67 @@
en:
administrateurs:
experts_procedures:
create:
experts_assignment:
one: "The expert %{value} was assigned to the procedure n° %{procedure}"
other: "The experts %{value} were assigned to the procedure n° %{procedure}"
groupe_instructeurs:
index:
procedures: Procedures
instructors_group: Group of instructors
add_instructeur:
wrong_address:
one: "%{value} is not a valid email address"
other: "%{value} are not valid email addresses"
assignment:
one: "The instructor %{value} was assigned to the group « %{groupe} »."
other: "The instructors %{value} were assigned to the group « %{groupe} »."
reaffecter_dossiers:
existing_groupe:
one: "%{count} group exist"
other: "%{count} groups exist"
instructeurs:
assigned_instructeur:
one: "%{count} instructor is assigned"
other: "%{count} instructors are assigned"
edit:
routing:
title: Routing label
notice: This text will appear on the user form as the label of a list
group_management:
title: Group management
delete: delete the group
delete_confirmation: Are you sure you want to delete the group "%{group_name}"
move_folders: move folders
move_folders_confirmation: Reassign folders to another group so you can delete it
add_a_group:
title: Add a group
notice: This group will be a choice from the list "%{routing_criteria_name}"
placeholder: ex. City of Bordeaux
csv_import:
title: CSV Import
notice_1: The csv file must have 2 columns (Group, Email) and be separated by commas. The import does not overwrite existing groups and instructors.
notice_2: The size of the file must be less than %{csv_max_size}.
download_exemple: Download sample CSV file
import_file: Import file
import_file_procedure_not_published: The import of instructors by CSV file is available once the process has been published
view: view
button:
add_group: Add group
rename: Rename
existing_groupe:
one: "%{count} group exist"
other: "%{count} groups exist"
routing:
title: Routing
notice_html: |
Routing is a feature for procedures requiring the sharing of instructions between different groups according to a specific criterion (territory, theme or other).
<br><br>
This feature makes it possible to route the files to each group, and to no longer need to filter its files among a large quantity of requests. It is therefore particularly suitable for national approaches instructed locally.
<br><br>
Instructors only see the files that concern them, and therefore do not have access to data outside their scope.
self_managment_notice_html: |
Instructor Self-Management allows instructors to self-manage the list of Gait Instructors.
button:
routing_enable: Enable routing
routing_disable: Disable routing

View file

@ -10,6 +10,8 @@ fr:
other: "Les experts %{value} ont été affectés à la démarche n° %{procedure}"
groupe_instructeurs:
index:
procedures: Démarches
instructors_group: Groupe d'instructeurs
existing_groupe:
one: "%{count} groupe existe"
other: "%{count} groupes existent"
@ -29,10 +31,35 @@ fr:
one: "%{count} instructeur est affecté"
other: "%{count} instructeurs sont affectés"
edit:
routing:
title: Libellé du routage
notice: Ce texte apparaitra sur le formulaire usager comme le libellé dune liste
group_management:
title: Gestion des Groupes
delete: supprimer le groupe
delete_confirmation: Êtes-vous sûr de vouloir supprimer le groupe "%{group_name}"
move_folders: déplacer les dossiers
move_folders_confirmation: Réaffecter les dossiers à un autre groupe afin de pouvoir le supprimer
add_a_group:
title: Ajouter un groupe
notice: Ce groupe sera un choix de la liste "%{routing_criteria_name}"
placeholder: ex. Ville de Bordeaux
csv_import:
title: Importer par CSV
notice_1: Le fichier csv doit comporter 2 colonnes (Groupe, Email) et être séparé par des virgules. L'import n'écrase pas les groupes et les instructeurs existants.
notice_2: Le poids du fichier doit être inférieur à %{csv_max_size}
download_exemple: Télécharger l'exemple de fichier CSV
import_file: Importer le fichier
import_file_procedure_not_published: Limport dinstructeurs par fichier CSV est disponible une fois la démarche publiée
view: voir
button:
add_group: Ajouter le groupe
rename: Renommer
existing_groupe:
one: "%{count} groupe existe"
other: "%{count} groupes existent"
routing:
title: Routage
notice_html: |
Le routage est une fonctionnalité pour les démarches nécessitant le partage de linstruction entre différents groupes en fonction dun critère précis (territoire, thématique ou autre).
<br><br>
@ -45,3 +72,4 @@ fr:
routing_enable: Activer le routage
routing_disable: Désactiver le routage
self_managment_toggle: Activer lautogestion des instructeurs
add_group: Ajouter le groupe

View file

@ -0,0 +1,30 @@
en:
instructeurs:
procedures:
email_notifications:
utils:
positive: "Yes"
negative: "No"
title: Email notifications
subtitle: On this page, configure the notifications you wish to receive by email for this procedure.
for_each_file_submitted:
title: Receive a notification for each file submitted
notice_1: This email notifies you that a new file has been submitted.
notice_2: It is sent each time a user submits a file.
for_each_message_submitted:
title: Receive a notification for each message submitted
notice_1: This email notifies you that a new message has been submitted on your following files.
notice_2: It is sent each time a user submits a message.
daily_notifications:
title: Receive a daily notification
notice_1: This email notifies you of the filing of new files on this approach, or of changes to your monitored files.
notice_2: It is sent once a day, Monday to Saturday, around 10 a.m.
hebdo_recap:
title: Receive a weekly recap
notice_1: This email summarizes the activity of the week on all of your procedures.
notice_2: It is sent weekly on Monday morning.
buttons:
back_to_procedure: Back to procedure
save: Save

View file

@ -0,0 +1,28 @@
fr:
instructeurs:
procedures:
email_notifications:
utils:
positive: Oui
negative: Non
title: Notifications par email
subtitle: Configurez sur cette page les notifications que vous souhaitez recevoir par email pour cette démarche.
for_each_file_submitted:
title: Recevoir une notification à chaque dossier déposé
notice_1: Cet email vous signale le dépôt dun nouveau dossier.
notice_2: Il est envoyé à chaque fois qu'un usager dépose un dossier.
for_each_message_submitted:
title: Recevoir une notification à chaque message déposé
notice_1: Cet email vous signale le dépôt dun nouveau message sur vos dossiers suivis.
notice_2: Il est envoyé à chaque fois qu'un usager dépose un message.
daily_notifications:
title: Recevoir une notification quotidienne
notice_1: Cet email vous signale le dépôt de nouveaux dossiers sur cette démarche, ou des changements sur vos dossiers suivis.
notice_2: Il est envoyé une fois par jour, du lundi au samedi, vers 10 h du matin.
hebdo_recap:
title: Recevoir un récapitulatif hebdomadaire
notice_1: Cet email récapitule lactivité de la semaine sur lensemble de vos démarches.
notice_2: Il est envoyé chaque semaine le lundi matin.
buttons:
back_to_procedure: Revenir à la procédure
save: Enregistrer

View file

@ -35,3 +35,8 @@ en:
export_monthly_pending_html: An export of the last 30 days in the format %{export_format} is being generated<br>(asked %{export_time} ago)
download_archive: Download a .zip archive of all files and their attachments
download: Download all files
email_usagers:
contact_users: Contact users (draft)
notice: "You will send a message to %{dossiers_count} whose files are in draft, in the instructor groups : %{groupe_instructeurs}."
stats:
title: Statistics

View file

@ -35,3 +35,8 @@ fr:
export_monthly_pending_html: Un export des 30 derniers jours au format %{export_format} est en train dêtre généré<br>(demandé il y a %{export_time})
download_archive: Télécharger une archive au format .zip de tous les dossiers et leurs pièces jointes
download: Télécharger tous les dossiers
email_usagers:
contact_users: Contacter les usagers (brouillon)
notice: "Vous allez envoyer un message à %{dossiers_count} dont les dossiers sont en brouillon, dans les groupes instructeurs : %{groupe_instructeurs}."
stats:
title: Statistiques

View file

@ -1,5 +1,7 @@
en:
layouts:
header:
files: Files
go_superadmin: "Switch to super-admin"
go_user: "Switch to user"
go_instructor: "Switch to instructor"

View file

@ -1,5 +1,7 @@
fr:
layouts:
header:
files: Dossiers
go_superadmin: "Passer en super-admin"
go_user: "Passer en usager"
go_instructor: "Passer en instructeur"