commit
7953bd423d
25 changed files with 181 additions and 161 deletions
|
@ -35,16 +35,6 @@
|
||||||
display: block;
|
display: block;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
|
|
||||||
.notice {
|
|
||||||
@include notice-text-style;
|
|
||||||
display: block;
|
|
||||||
margin-top: $default-spacer;
|
|
||||||
|
|
||||||
p {
|
|
||||||
margin-bottom: $default-spacer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&.required {
|
&.required {
|
||||||
&::after {
|
&::after {
|
||||||
color: $dark-red;
|
color: $dark-red;
|
||||||
|
@ -53,6 +43,17 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.notice {
|
||||||
|
@include notice-text-style;
|
||||||
|
font-weight: bold;
|
||||||
|
margin-top: - $default-spacer;
|
||||||
|
margin-bottom: $default-padding;
|
||||||
|
|
||||||
|
p {
|
||||||
|
margin-bottom: $default-spacer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.editable-champ {
|
.editable-champ {
|
||||||
position: relative;
|
position: relative;
|
||||||
|
|
||||||
|
@ -73,6 +74,7 @@
|
||||||
&.editable-champ-checkbox,
|
&.editable-champ-checkbox,
|
||||||
&.editable-champ-radio.vertical,
|
&.editable-champ-radio.vertical,
|
||||||
&.editable-champ-engagement {
|
&.editable-champ-engagement {
|
||||||
|
p,
|
||||||
label {
|
label {
|
||||||
padding-left: 28px;
|
padding-left: 28px;
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,7 @@ class AdministrateurDashboard < Administrate::BaseDashboard
|
||||||
# on pages throughout the dashboard.
|
# on pages throughout the dashboard.
|
||||||
ATTRIBUTE_TYPES = {
|
ATTRIBUTE_TYPES = {
|
||||||
id: Field::Number,
|
id: Field::Number,
|
||||||
email: Field::String,
|
user: Field::HasOne.with_options(searchable: true, searchable_field: 'email'),
|
||||||
created_at: Field::DateTime,
|
created_at: Field::DateTime,
|
||||||
updated_at: Field::DateTime,
|
updated_at: Field::DateTime,
|
||||||
procedures: Field::HasMany.with_options(limit: 20),
|
procedures: Field::HasMany.with_options(limit: 20),
|
||||||
|
@ -24,7 +24,7 @@ class AdministrateurDashboard < Administrate::BaseDashboard
|
||||||
# By default, it's limited to four items to reduce clutter on index pages.
|
# By default, it's limited to four items to reduce clutter on index pages.
|
||||||
# Feel free to add, remove, or rearrange items.
|
# Feel free to add, remove, or rearrange items.
|
||||||
COLLECTION_ATTRIBUTES = [
|
COLLECTION_ATTRIBUTES = [
|
||||||
:email,
|
:user,
|
||||||
:created_at,
|
:created_at,
|
||||||
:procedures,
|
:procedures,
|
||||||
:registration_state
|
:registration_state
|
||||||
|
@ -34,7 +34,7 @@ class AdministrateurDashboard < Administrate::BaseDashboard
|
||||||
# an array of attributes that will be displayed on the model's show page.
|
# an array of attributes that will be displayed on the model's show page.
|
||||||
SHOW_PAGE_ATTRIBUTES = [
|
SHOW_PAGE_ATTRIBUTES = [
|
||||||
:id,
|
:id,
|
||||||
:email,
|
:user,
|
||||||
:created_at,
|
:created_at,
|
||||||
:updated_at,
|
:updated_at,
|
||||||
:registration_state,
|
:registration_state,
|
||||||
|
@ -46,9 +46,7 @@ class AdministrateurDashboard < Administrate::BaseDashboard
|
||||||
# FORM_ATTRIBUTES
|
# FORM_ATTRIBUTES
|
||||||
# an array of attributes that will be displayed
|
# an array of attributes that will be displayed
|
||||||
# on the model's form (`new` and `edit`) pages.
|
# on the model's form (`new` and `edit`) pages.
|
||||||
FORM_ATTRIBUTES = [
|
FORM_ATTRIBUTES = [].freeze
|
||||||
:email
|
|
||||||
].freeze
|
|
||||||
|
|
||||||
# Overwrite this method to customize how procedures are displayed
|
# Overwrite this method to customize how procedures are displayed
|
||||||
# across all pages of the admin dashboard.
|
# across all pages of the admin dashboard.
|
||||||
|
|
|
@ -9,7 +9,7 @@ class InstructeurDashboard < Administrate::BaseDashboard
|
||||||
# on pages throughout the dashboard.
|
# on pages throughout the dashboard.
|
||||||
ATTRIBUTE_TYPES = {
|
ATTRIBUTE_TYPES = {
|
||||||
id: Field::Number,
|
id: Field::Number,
|
||||||
email: Field::String,
|
user: Field::HasOne.with_options(searchable: true, searchable_field: 'email'),
|
||||||
created_at: Field::DateTime,
|
created_at: Field::DateTime,
|
||||||
updated_at: Field::DateTime,
|
updated_at: Field::DateTime,
|
||||||
current_sign_in_at: Field::DateTime,
|
current_sign_in_at: Field::DateTime,
|
||||||
|
@ -24,7 +24,7 @@ class InstructeurDashboard < Administrate::BaseDashboard
|
||||||
# By default, it's limited to four items to reduce clutter on index pages.
|
# By default, it's limited to four items to reduce clutter on index pages.
|
||||||
# Feel free to add, remove, or rearrange items.
|
# Feel free to add, remove, or rearrange items.
|
||||||
COLLECTION_ATTRIBUTES = [
|
COLLECTION_ATTRIBUTES = [
|
||||||
:email,
|
:user,
|
||||||
:created_at
|
:created_at
|
||||||
].freeze
|
].freeze
|
||||||
|
|
||||||
|
@ -34,7 +34,7 @@ class InstructeurDashboard < Administrate::BaseDashboard
|
||||||
:procedures,
|
:procedures,
|
||||||
:dossiers,
|
:dossiers,
|
||||||
:id,
|
:id,
|
||||||
:email,
|
:user,
|
||||||
:current_sign_in_at,
|
:current_sign_in_at,
|
||||||
:created_at,
|
:created_at,
|
||||||
:features
|
:features
|
||||||
|
|
|
@ -25,4 +25,10 @@ module ChampHelper
|
||||||
end
|
end
|
||||||
simple_format(auto_linked_text, {}, sanitize: false)
|
simple_format(auto_linked_text, {}, sanitize: false)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def describedby_id(champ)
|
||||||
|
if champ.description.present?
|
||||||
|
"desc-#{champ.type_de_champ.id}-#{champ.row}"
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -13,10 +13,10 @@ class ActiveStorage::DownloadableFile
|
||||||
|
|
||||||
def self.create_list_from_dossier(dossier)
|
def self.create_list_from_dossier(dossier)
|
||||||
pjs = PiecesJustificativesService.liste_pieces_justificatives(dossier)
|
pjs = PiecesJustificativesService.liste_pieces_justificatives(dossier)
|
||||||
pjs.map do |pj|
|
pjs.map do |piece_justificative|
|
||||||
[
|
[
|
||||||
ActiveStorage::DownloadableFile.new(pj.piece_justificative_file),
|
ActiveStorage::DownloadableFile.new(piece_justificative),
|
||||||
pj.piece_justificative_file.filename.to_s
|
piece_justificative.filename.to_s
|
||||||
]
|
]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -30,4 +30,10 @@ class Service < ApplicationRecord
|
||||||
service_cloned.administrateur = administrateur
|
service_cloned.administrateur = administrateur
|
||||||
service_cloned
|
service_cloned
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def telephone_url
|
||||||
|
if telephone.present?
|
||||||
|
"tel:#{telephone.gsub(/[[:blank:]]/, '')}"
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,17 +1,21 @@
|
||||||
class PiecesJustificativesService
|
class PiecesJustificativesService
|
||||||
def self.liste_pieces_justificatives(dossier)
|
def self.liste_pieces_justificatives(dossier)
|
||||||
|
pjs_commentaires = dossier.commentaires
|
||||||
|
.map(&:piece_jointe)
|
||||||
|
.filter(&:attached?)
|
||||||
|
|
||||||
champs_blocs_repetables = dossier.champs
|
champs_blocs_repetables = dossier.champs
|
||||||
.filter { |c| c.type_champ == TypeDeChamp.type_champs.fetch(:repetition) }
|
.filter { |c| c.type_champ == TypeDeChamp.type_champs.fetch(:repetition) }
|
||||||
.flat_map(&:champs)
|
.flat_map(&:champs)
|
||||||
|
|
||||||
champs_pieces_justificatives_with_attachments(
|
pjs_commentaires + champs_pieces_justificatives_with_attachments(
|
||||||
champs_blocs_repetables + dossier.champs
|
champs_blocs_repetables + dossier.champs
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.pieces_justificatives_total_size(dossier)
|
def self.pieces_justificatives_total_size(dossier)
|
||||||
liste_pieces_justificatives(dossier)
|
liste_pieces_justificatives(dossier)
|
||||||
.sum { |pj| pj.piece_justificative_file.byte_size }
|
.sum(&:byte_size)
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.serialize_types_de_champ_as_type_pj(procedure)
|
def self.serialize_types_de_champ_as_type_pj(procedure)
|
||||||
|
@ -48,5 +52,6 @@ class PiecesJustificativesService
|
||||||
champs
|
champs
|
||||||
.filter { |c| c.type_champ == TypeDeChamp.type_champs.fetch(:piece_justificative) }
|
.filter { |c| c.type_champ == TypeDeChamp.type_champs.fetch(:piece_justificative) }
|
||||||
.filter { |pj| pj.piece_justificative_file.attached? }
|
.filter { |pj| pj.piece_justificative_file.attached? }
|
||||||
|
.map(&:piece_justificative_file)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -41,9 +41,8 @@
|
||||||
%h2.header-section
|
%h2.header-section
|
||||||
Créer une nouvelle démarche à partir d'une démarche existante
|
Créer une nouvelle démarche à partir d'une démarche existante
|
||||||
|
|
||||||
%label
|
%p.notice
|
||||||
.notice
|
Pour rechercher dans cette liste, utilisez la fonction "Recherche" de votre navigateur (CTRL+F ou command+F)
|
||||||
Pour rechercher dans cette liste, utilisez la fonction "Recherche" de votre navigateur (CTRL+F ou command+F)
|
|
||||||
|
|
||||||
%table.table.vertical.procedure-library-list
|
%table.table.vertical.procedure-library-list
|
||||||
- @grouped_procedures.each do |_, procedures|
|
- @grouped_procedures.each do |_, procedures|
|
||||||
|
|
|
@ -11,13 +11,12 @@
|
||||||
.explication
|
.explication
|
||||||
Configurez sur cette page les notifications que vous souhaitez recevoir par email pour cette démarche.
|
Configurez sur cette page les notifications que vous souhaitez recevoir par email pour cette démarche.
|
||||||
|
|
||||||
= form.label :email_notification do
|
= form.label :email_notification, "Recevoir une notification quotidienne"
|
||||||
Recevoir une notification quotidienne
|
|
||||||
|
|
||||||
%span.notice
|
%p.notice
|
||||||
Cet email vous signale le dépôt de nouveaux dossiers sur cette démarche, ou des changements sur vos dossiers suivis.
|
Cet email vous signale le dépôt de nouveaux dossiers sur cette démarche, ou des changements sur vos dossiers suivis.
|
||||||
%span.notice
|
%p.notice
|
||||||
Il est envoyé une fois par jour, du lundi au samedi, vers 10 h du matin.
|
Il est envoyé une fois par jour, du lundi au samedi, vers 10 h du matin.
|
||||||
|
|
||||||
.radios
|
.radios
|
||||||
%label
|
%label
|
||||||
|
@ -28,12 +27,11 @@
|
||||||
= form.radio_button :email_notifications_enabled, false
|
= form.radio_button :email_notifications_enabled, false
|
||||||
Non
|
Non
|
||||||
|
|
||||||
= form.label nil do
|
= form.label nil, "Recevoir un récapitulatif hebdomadaire"
|
||||||
Recevoir un récapitulatif hebdomadaire
|
%p.notice
|
||||||
%span.notice
|
Cet email récapitule l’activité de la semaine sur l’ensemble de vos démarches.
|
||||||
Cet email récapitule l’activité de la semaine sur l’ensemble de vos démarches.
|
%p.notice
|
||||||
%span.notice
|
Il est envoyé chaque semaine le lundi matin, et n’est pas désactivable.
|
||||||
Il est envoyé chaque semaine le lundi matin, et n’est pas désactivable.
|
|
||||||
|
|
||||||
.radios
|
.radios
|
||||||
%label
|
%label
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
.dropdown.header-menu-opener
|
.dropdown.header-menu-opener
|
||||||
%button.button.dropdown-button.header-menu-button
|
%button.button.dropdown-button.header-menu-button{ title: "Mon compte" }
|
||||||
= image_tag "icons/account-circle.svg", title: "Mon compte"
|
= image_tag "icons/account-circle.svg", alt: ''
|
||||||
%ul.header-menu.dropdown-content
|
%ul.header-menu.dropdown-content
|
||||||
%li
|
%li
|
||||||
.menu-item{ title: current_email }
|
.menu-item{ title: current_email }
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
= link_to service.email, "mailto:#{service.email}"
|
= link_to service.email, "mailto:#{service.email}"
|
||||||
%br
|
%br
|
||||||
Par téléphone :
|
Par téléphone :
|
||||||
= link_to service.telephone, "tel:#{service.telephone}"
|
= link_to service.telephone, service.telephone_url
|
||||||
%br
|
%br
|
||||||
Horaires : #{ formatted_horaires(service.horaires) }
|
Horaires : #{ formatted_horaires(service.horaires) }
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
|
|
||||||
= f.label :routing_criteria_name do
|
= f.label :routing_criteria_name do
|
||||||
Libellé du routage
|
Libellé du routage
|
||||||
%span.notice Ce texte apparaitra sur le formulaire usager comme le libellé d'une liste
|
%p.notice Ce texte apparaitra sur le formulaire usager comme le libellé d'une liste
|
||||||
= f.text_field :routing_criteria_name, placeholder: 'ex. Votre ville', required: true
|
= f.text_field :routing_criteria_name, placeholder: 'ex. Votre ville', required: true
|
||||||
= f.submit 'Renommer', class: 'button primary send'
|
= f.submit 'Renommer', class: 'button primary send'
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@
|
||||||
= form_for :groupe_instructeur, html: { class: 'form' } do |f|
|
= form_for :groupe_instructeur, html: { class: 'form' } do |f|
|
||||||
= f.label :label do
|
= f.label :label do
|
||||||
Ajouter un groupe
|
Ajouter un groupe
|
||||||
%span.notice Ce groupe sera un choix de la liste « #{@procedure.routing_criteria_name} » .
|
%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.text_field :label, placeholder: 'ex. Ville de Bordeaux', required: true
|
||||||
= f.submit 'Ajouter le groupe', class: 'button primary send'
|
= f.submit 'Ajouter le groupe', class: 'button primary send'
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,6 @@
|
||||||
remote: true do |f|
|
remote: true do |f|
|
||||||
= f.label :email do
|
= f.label :email do
|
||||||
Ajouter un administrateur
|
Ajouter un administrateur
|
||||||
%span.notice= "Renseignez l’email d’un administrateur déjà enregistré sur demarches-simplifiees.fr pour lui permettre de modifier « #{procedure.libelle} »."
|
%p.notice Renseignez l’email d’un administrateur déjà enregistré sur demarches-simplifiees.fr pour lui permettre de modifier « #{procedure.libelle} ».
|
||||||
= f.email_field :email, placeholder: 'marie.dupont@exemple.fr', required: true
|
= f.email_field :email, placeholder: 'marie.dupont@exemple.fr', required: true
|
||||||
= f.submit 'Ajouter comme administrateur', class: 'button primary send'
|
= f.submit 'Ajouter comme administrateur', class: 'button primary send'
|
||||||
|
|
|
@ -25,13 +25,13 @@
|
||||||
= f.label :duree_conservation_dossiers_dans_ds do
|
= f.label :duree_conservation_dossiers_dans_ds do
|
||||||
Sur demarches-simplifiees.fr
|
Sur demarches-simplifiees.fr
|
||||||
%span.mandatory *
|
%span.mandatory *
|
||||||
.notice (durée en mois après le début de l’instruction)
|
%p.notice (durée en mois après le début de l’instruction)
|
||||||
= f.number_field :duree_conservation_dossiers_dans_ds, class: 'form-control', placeholder: '6', required: true
|
= f.number_field :duree_conservation_dossiers_dans_ds, class: 'form-control', placeholder: '6', required: true
|
||||||
|
|
||||||
= f.label :duree_conservation_dossiers_hors_ds do
|
= f.label :duree_conservation_dossiers_hors_ds do
|
||||||
Hors demarches-simplifiees.fr
|
Hors demarches-simplifiees.fr
|
||||||
%span.mandatory *
|
%span.mandatory *
|
||||||
.notice (durée en mois après la fin de l'instruction)
|
%p.notice (durée en mois après la fin de l'instruction)
|
||||||
= f.number_field :duree_conservation_dossiers_hors_ds, class: 'form-control', placeholder: '6', required: true
|
= f.number_field :duree_conservation_dossiers_hors_ds, class: 'form-control', placeholder: '6', required: true
|
||||||
|
|
||||||
- if @procedure.created_at.present?
|
- if @procedure.created_at.present?
|
||||||
|
@ -43,19 +43,19 @@
|
||||||
Cadre juridique
|
Cadre juridique
|
||||||
%span.mandatory *
|
%span.mandatory *
|
||||||
|
|
||||||
= f.label :cadre_juridique do
|
%p.notice
|
||||||
.notice
|
Le cadre juridique justifie le droit de collecter les données demandées dans votre démarche auprès des usagers. Par exemple :
|
||||||
%p
|
%br
|
||||||
Le cadre juridique justifie le droit de collecter les données demandées dans votre démarche auprès des usagers. Par exemple :
|
• Texte de loi (loi, décret, circulaire, arrêté…)
|
||||||
%br
|
%br
|
||||||
• Texte de loi (loi, décret, circulaire, arrêté…)
|
• Texte juridique (statuts, délibération, décision du conseil d'administration…)
|
||||||
%br
|
%br
|
||||||
• Texte juridique (statuts, délibération, décision du conseil d'administration…)
|
= link_to("En savoir plus avec cette vidéo de 5 minutes", CADRE_JURIDIQUE_URL, target: "_blank", rel: "noopener")
|
||||||
%br
|
|
||||||
= link_to("En savoir plus avec cette vidéo de 5 minutes", CADRE_JURIDIQUE_URL, target: "_blank", rel: "noopener")
|
%p.notice
|
||||||
%p
|
Vous pouvez saisir un lien web vers ce texte, ou l’importer depuis un fichier.
|
||||||
Vous pouvez saisir un lien web vers ce texte, ou l’importer depuis un fichier.
|
|
||||||
Lien vers le texte
|
= f.label :cadre_juridique, 'Lien vers le texte'
|
||||||
= f.text_field :cadre_juridique, class: 'form-control', placeholder: 'https://www.legifrance.gouv.fr/'
|
= f.text_field :cadre_juridique, class: 'form-control', placeholder: 'https://www.legifrance.gouv.fr/'
|
||||||
|
|
||||||
= f.label :deliberation, 'Importer le texte'
|
= f.label :deliberation, 'Importer le texte'
|
||||||
|
@ -64,14 +64,13 @@
|
||||||
attached_file: @procedure.deliberation,
|
attached_file: @procedure.deliberation,
|
||||||
user_can_destroy: true }
|
user_can_destroy: true }
|
||||||
|
|
||||||
%h2.header-section
|
%h2.header-section Notice explicative de la démarche
|
||||||
Notice explicative de la démarche
|
|
||||||
|
|
||||||
|
%p.notice
|
||||||
|
Une notice explicative est un document destiné à guider l’usager dans sa démarche. C’est un document que vous avez élaboré et qui peut prendre la forme d’un fichier doc, d’un pdf ou encore de diapositives. Le bouton pour télécharger cette notice apparaît en haut du formulaire pour l’usager.
|
||||||
|
|
||||||
|
= f.label :notice, 'Notice'
|
||||||
- notice = @procedure.notice
|
- notice = @procedure.notice
|
||||||
= f.label :notice do
|
|
||||||
.notice
|
|
||||||
%p
|
|
||||||
Une notice explicative est un document destiné à guider l’usager dans sa démarche. C’est un document que vous avez élaboré et qui peut prendre la forme d’un fichier doc, d’un pdf ou encore de diapositives. Le bouton pour télécharger cette notice apparaît en haut du formulaire pour l’usager.
|
|
||||||
= render 'shared/attachment/edit',
|
= render 'shared/attachment/edit',
|
||||||
{ form: f,
|
{ form: f,
|
||||||
attached_file: @procedure.notice,
|
attached_file: @procedure.notice,
|
||||||
|
@ -82,15 +81,14 @@
|
||||||
.editable-champ.editable-champ-radio.vertical
|
.editable-champ.editable-champ-radio.vertical
|
||||||
= f.label :for_individual, value: true do
|
= f.label :for_individual, value: true do
|
||||||
Ma démarche s’adresse à un particulier
|
Ma démarche s’adresse à un particulier
|
||||||
%span.notice
|
%p.notice En choisissant cette option, l’usager devra renseigner son nom et prénom avant d’accéder au formulaire
|
||||||
%p En choisissant cette option, l’usager devra renseigner son nom et prénom avant d’accéder au formulaire
|
|
||||||
= f.radio_button :for_individual, true
|
= f.radio_button :for_individual, true
|
||||||
|
|
||||||
.editable-champ.editable-champ-radio.vertical
|
.editable-champ.editable-champ-radio.vertical
|
||||||
= f.label :for_individual, value: false do
|
= f.label :for_individual, value: false do
|
||||||
Ma démarche s’adresse à une personne morale
|
Ma démarche s’adresse à une personne morale
|
||||||
%span.notice
|
%p.notice
|
||||||
%p En choisissant cette option, l’usager devra renseigner son n° SIRET.<br>Grâce à l’API Entreprise, les informations sur la personne morale (raison sociale, adresse du siège, etc.) seront automatiquement renseignées.
|
En choisissant cette option, l’usager devra renseigner son n° SIRET.<br>Grâce à l’API Entreprise, les informations sur la personne morale (raison sociale, adresse du siège, etc.) seront automatiquement renseignées.
|
||||||
= f.radio_button :for_individual, false
|
= f.radio_button :for_individual, false
|
||||||
|
|
||||||
%p.explication
|
%p.explication
|
||||||
|
@ -103,10 +101,9 @@
|
||||||
- if feature_enabled?(:administrateur_web_hook)
|
- if feature_enabled?(:administrateur_web_hook)
|
||||||
= f.label :web_hook_url do
|
= f.label :web_hook_url do
|
||||||
Lien de rappel HTTP (webhook)
|
Lien de rappel HTTP (webhook)
|
||||||
.notice
|
%p.notice
|
||||||
%p
|
Vous pouvez définir un lien de rappel HTTP (aussi appelé webhook) pour notifier un service tiers du changement de l'état d’un dossier de cette démarche sur demarches-simplifiees.fr.
|
||||||
Vous pouvez définir un lien de rappel HTTP (aussi appelé webhook) pour notifier un service tiers du changement de l'état d’un dossier de cette démarche sur demarches-simplifiees.fr.
|
= link_to("Consulter la documentation du webhook", WEBHOOK_DOC_URL, target: "_blank", rel: "noopener")
|
||||||
= link_to("Consulter la documentation du webhook", WEBHOOK_DOC_URL, target: "_blank", rel: "noopener")
|
|
||||||
= f.text_field :web_hook_url, class: 'form-control', placeholder: 'https://callback.exemple.fr/'
|
= f.text_field :web_hook_url, class: 'form-control', placeholder: 'https://callback.exemple.fr/'
|
||||||
|
|
||||||
= f.label :auto_archive_on do
|
= f.label :auto_archive_on do
|
||||||
|
|
|
@ -54,16 +54,13 @@
|
||||||
|
|
||||||
%h2.header-section Bouton radio verticaux
|
%h2.header-section Bouton radio verticaux
|
||||||
.editable-champ.editable-champ-radio.vertical
|
.editable-champ.editable-champ-radio.vertical
|
||||||
= f.label :archived, value: true do
|
= f.label :archived, 'Option A', value: true
|
||||||
Option A
|
%p.notice Une option tout à fait valable.
|
||||||
%span.notice
|
|
||||||
%p Une option tout à fait valable.
|
|
||||||
= f.radio_button :archived, true
|
= f.radio_button :archived, true
|
||||||
|
|
||||||
.editable-champ.editable-champ-radio.vertical
|
.editable-champ.editable-champ-radio.vertical
|
||||||
= f.label :archived, value: false do
|
= f.label :archived, 'Option B', value: false
|
||||||
Option B
|
%p.notice Une autre option, pas mal non plus.
|
||||||
%span.notice
|
|
||||||
%p Une autre option, pas mal non plus.
|
|
||||||
= f.radio_button :archived, false
|
= f.radio_button :archived, false
|
||||||
|
|
||||||
.send-wrapper
|
.send-wrapper
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
= form.label champ.main_value_name, { class: champ.repetition? ? 'header-section' : '' } do
|
= form.label champ.main_value_name do
|
||||||
#{champ.libelle}
|
#{champ.libelle}
|
||||||
- if champ.mandatory?
|
- if champ.mandatory?
|
||||||
%span.mandatory *
|
%span.mandatory *
|
||||||
|
@ -7,5 +7,5 @@
|
||||||
%span.updated-at{ class: highlight_if_unseen_class(seen_at, champ.updated_at) }
|
%span.updated-at{ class: highlight_if_unseen_class(seen_at, champ.updated_at) }
|
||||||
= "modifié le #{try_format_datetime(champ.updated_at)}"
|
= "modifié le #{try_format_datetime(champ.updated_at)}"
|
||||||
|
|
||||||
- if champ.description.present?
|
- if champ.description.present?
|
||||||
%span.notice= string_to_html(champ.description)
|
.notice{ id: describedby_id(champ) }= string_to_html(champ.description)
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
= form.date_field :value,
|
= form.date_field :value,
|
||||||
value: champ.value,
|
value: champ.value,
|
||||||
placeholder: 'JJ/MM/AAAA',
|
|
||||||
required: champ.mandatory?
|
required: champ.mandatory?
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
.editable-champ{ class: "editable-champ-#{champ.type_champ}" }
|
.editable-champ{ class: "editable-champ-#{champ.type_champ}" }
|
||||||
- if has_label?(champ)
|
- if champ.repetition?
|
||||||
|
= render partial: 'shared/dossiers/editable_champs/header_section', locals: { champ: champ }
|
||||||
|
- elsif has_label?(champ)
|
||||||
= render partial: 'shared/dossiers/editable_champs/champ_label', locals: { form: form, champ: champ, seen_at: defined?(seen_at) ? seen_at : nil }
|
= render partial: 'shared/dossiers/editable_champs/champ_label', locals: { form: form, champ: champ, seen_at: defined?(seen_at) ? seen_at : nil }
|
||||||
|
|
||||||
= render partial: "shared/dossiers/editable_champs/#{champ.type_champ}",
|
= render partial: "shared/dossiers/editable_champs/#{champ.type_champ}",
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
= form.text_field :value,
|
= form.text_field :value,
|
||||||
placeholder: champ.libelle,
|
placeholder: champ.libelle,
|
||||||
required: champ.mandatory?
|
required: champ.mandatory?,
|
||||||
|
aria: { describedby: describedby_id(champ) }
|
||||||
|
|
|
@ -5,10 +5,10 @@
|
||||||
= f.text_area :body, rows: 5, placeholder: placeholder, required: true, class: 'message-textarea'
|
= f.text_area :body, rows: 5, placeholder: placeholder, required: true, class: 'message-textarea'
|
||||||
.flex.justify-between.wrap
|
.flex.justify-between.wrap
|
||||||
%div
|
%div
|
||||||
|
= f.label :piece_jointe, for: :piece_jointe do
|
||||||
|
Joindre un document
|
||||||
|
%span.notice (taille max : 20 Mo)
|
||||||
= f.file_field :piece_jointe, id: 'piece_jointe', direct_upload: true
|
= f.file_field :piece_jointe, id: 'piece_jointe', direct_upload: true
|
||||||
%label{ for: :piece_jointe }
|
|
||||||
%span.notice
|
|
||||||
(taille max : 20 Mo)
|
|
||||||
|
|
||||||
%div
|
%div
|
||||||
= f.submit 'Envoyer le message', class: 'button primary send', data: { disable: true }
|
= f.submit 'Envoyer le message', class: 'button primary send', data: { disable: true }
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
= link_to service.email, "mailto:#{service.email}"
|
= link_to service.email, "mailto:#{service.email}"
|
||||||
%p.help-dropdown-service-item
|
%p.help-dropdown-service-item
|
||||||
%span.icon.small.phone
|
%span.icon.small.phone
|
||||||
= link_to service.telephone, "tel:#{service.telephone}"
|
= link_to service.telephone, service.telephone_url
|
||||||
%p.help-dropdown-service-item
|
%p.help-dropdown-service-item
|
||||||
%span.icon.small.clock
|
%span.icon.small.clock
|
||||||
= service.horaires
|
= service.horaires
|
||||||
|
|
|
@ -3,40 +3,43 @@
|
||||||
- service = procedure.service
|
- service = procedure.service
|
||||||
- if service.present?
|
- if service.present?
|
||||||
.footer-row.footer-columns
|
.footer-row.footer-columns
|
||||||
%ul.footer-column
|
.footer-column
|
||||||
%p.footer-header Cette démarche est gérée par :
|
%p.footer-header Cette démarche est gérée par :
|
||||||
%li
|
%ul
|
||||||
= service.nom
|
%li
|
||||||
%br
|
= service.nom
|
||||||
= service.organisme
|
%br
|
||||||
%br
|
= service.organisme
|
||||||
= string_to_html(service.adresse, wrapper_tag = 'span')
|
%br
|
||||||
|
= string_to_html(service.adresse, wrapper_tag = 'span')
|
||||||
|
|
||||||
%ul.footer-column
|
.footer-column
|
||||||
%p.footer-header Poser une question sur votre dossier :
|
%p.footer-header Poser une question sur votre dossier :
|
||||||
%li
|
%ul
|
||||||
- if dossier.present? && dossier.messagerie_available?
|
%li
|
||||||
Directement
|
- if dossier.present? && dossier.messagerie_available?
|
||||||
= link_to "par la messagerie", messagerie_dossier_path(dossier)
|
Directement
|
||||||
- else
|
= link_to "par la messagerie", messagerie_dossier_path(dossier)
|
||||||
Par email :
|
- else
|
||||||
= link_to service.email, "mailto:#{service.email}"
|
Par email :
|
||||||
|
= link_to service.email, "mailto:#{service.email}"
|
||||||
|
|
||||||
%li
|
%li
|
||||||
Par téléphone :
|
Par téléphone :
|
||||||
%a{ href: "tel:#{service.telephone}" }= service.telephone
|
= link_to service.telephone, service.telephone_url
|
||||||
|
|
||||||
%li
|
%li
|
||||||
- horaires = "Horaires : #{formatted_horaires(service.horaires)}"
|
- horaires = "Horaires : #{formatted_horaires(service.horaires)}"
|
||||||
= simple_format(horaires, {}, wrapper_tag: 'span')
|
= simple_format(horaires, {}, wrapper_tag: 'span')
|
||||||
|
|
||||||
|
|
||||||
- politiques = politiques_conservation_de_donnees(procedure)
|
- politiques = politiques_conservation_de_donnees(procedure)
|
||||||
- if politiques.present?
|
- if politiques.present?
|
||||||
%ul.footer-column
|
.footer-column
|
||||||
%p.footer-header Conservation des données :
|
%p.footer-header Conservation des données :
|
||||||
- politiques.each do |politique|
|
%ul
|
||||||
%li= politique
|
- politiques.each do |politique|
|
||||||
|
%li= politique
|
||||||
|
|
||||||
= render partial: 'users/general_footer_row', locals: { dossier: dossier }
|
= render partial: 'users/general_footer_row', locals: { dossier: dossier }
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@ FactoryBot.define do
|
||||||
end
|
end
|
||||||
|
|
||||||
trait :with_file do
|
trait :with_file do
|
||||||
file { Rack::Test::UploadedFile.new("./spec/fixtures/files/logo_test_procedure.png", 'image/png') }
|
piece_jointe { Rack::Test::UploadedFile.new("./spec/fixtures/files/logo_test_procedure.png", 'image/png') }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -19,33 +19,36 @@ feature 'The routing', js: true do
|
||||||
click_on "Groupe d'instructeurs"
|
click_on "Groupe d'instructeurs"
|
||||||
|
|
||||||
# rename routing criteria to spécialité
|
# rename routing criteria to spécialité
|
||||||
fill_in 'procedure_routing_criteria_name', with: 'spécialité'
|
fill_in 'Libellé du routage', with: 'spécialité'
|
||||||
click_on 'Renommer'
|
click_on 'Renommer'
|
||||||
expect(procedure.reload.routing_criteria_name).to eq('spécialité')
|
expect(page).to have_text('Le libellé est maintenant « spécialité ».')
|
||||||
|
expect(page).to have_field('Libellé du routage', with: 'spécialité')
|
||||||
|
|
||||||
# rename defaut groupe to littéraire
|
# rename defaut groupe to littéraire
|
||||||
click_on 'voir'
|
click_on 'voir'
|
||||||
expect(page).to have_css('#groupe_instructeur_label')
|
fill_in 'Nom du groupe', with: 'littéraire'
|
||||||
2.times { find(:css, "#groupe_instructeur_label").set("littéraire") }
|
|
||||||
click_on 'Renommer'
|
click_on 'Renommer'
|
||||||
|
expect(page).to have_text('Le nom est à présent « littéraire ».')
|
||||||
expect(procedure.defaut_groupe_instructeur.reload.label).to eq('littéraire')
|
expect(page).to have_field('Nom du groupe', with: 'littéraire')
|
||||||
|
|
||||||
# add victor to littéraire groupe
|
# add victor to littéraire groupe
|
||||||
try_twice { find('input.select2-search__field').send_keys('victor@inst.com', :enter) }
|
find('input.select2-search__field').send_keys('victor@inst.com', :enter)
|
||||||
|
|
||||||
perform_enqueued_jobs { click_on 'Affecter' }
|
perform_enqueued_jobs { click_on 'Affecter' }
|
||||||
|
expect(page).to have_text("L’instructeur victor@inst.com a été affecté")
|
||||||
|
|
||||||
victor = User.find_by(email: 'victor@inst.com').instructeur
|
victor = User.find_by(email: 'victor@inst.com').instructeur
|
||||||
|
|
||||||
click_on "Groupes d’instructeurs"
|
|
||||||
|
|
||||||
# add scientifique groupe
|
# add scientifique groupe
|
||||||
fill_in 'groupe_instructeur_label', with: 'scientifique'
|
click_on 'Groupes d’instructeurs'
|
||||||
|
fill_in 'Ajouter un groupe', with: 'scientifique'
|
||||||
click_on 'Ajouter le groupe'
|
click_on 'Ajouter le groupe'
|
||||||
|
expect(page).to have_text('Le groupe d’instructeurs « scientifique » a été créé.')
|
||||||
|
|
||||||
# add marie to scientifique groupe
|
# add marie to scientifique groupe
|
||||||
try_twice { find('input.select2-search__field').send_keys('marie@inst.com', :enter) }
|
find('input.select2-search__field').send_keys('marie@inst.com', :enter)
|
||||||
perform_enqueued_jobs { click_on 'Affecter' }
|
perform_enqueued_jobs { click_on 'Affecter' }
|
||||||
|
expect(page).to have_text("L’instructeur marie@inst.com a été affecté")
|
||||||
|
|
||||||
marie = User.find_by(email: 'marie@inst.com').instructeur
|
marie = User.find_by(email: 'marie@inst.com').instructeur
|
||||||
|
|
||||||
# publish
|
# publish
|
||||||
|
@ -93,11 +96,10 @@ feature 'The routing', js: true do
|
||||||
log_out
|
log_out
|
||||||
|
|
||||||
# litteraire_user change its dossier
|
# litteraire_user change its dossier
|
||||||
visit root_path
|
visit new_user_session_path
|
||||||
click_on 'Connexion'
|
|
||||||
sign_in_with litteraire_user.email, password
|
sign_in_with litteraire_user.email, password
|
||||||
|
|
||||||
click_on litteraire_user.dossiers.first.id
|
click_on litteraire_user.dossiers.first.id.to_s
|
||||||
click_on 'Modifier mon dossier'
|
click_on 'Modifier mon dossier'
|
||||||
|
|
||||||
fill_in 'dossier_champs_attributes_0_value', with: 'some value'
|
fill_in 'dossier_champs_attributes_0_value', with: 'some value'
|
||||||
|
@ -105,29 +107,32 @@ feature 'The routing', js: true do
|
||||||
log_out
|
log_out
|
||||||
|
|
||||||
# the litteraires instructeurs should have a notification
|
# the litteraires instructeurs should have a notification
|
||||||
visit root_path
|
visit new_user_session_path
|
||||||
click_on 'Connexion'
|
|
||||||
sign_in_with victor.user.email, password
|
sign_in_with victor.user.email, password
|
||||||
|
|
||||||
## on the procedures list
|
## on the procedures list
|
||||||
visit instructeur_procedures_path
|
expect(page).to have_current_path(instructeur_procedures_path)
|
||||||
expect(page).to have_css("span.notifications")
|
expect(find('.procedure-stats')).to have_css('span.notifications')
|
||||||
|
|
||||||
## on the dossiers list
|
## on the dossiers list
|
||||||
click_on procedure.libelle
|
click_on procedure.libelle
|
||||||
expect(page).to have_css("span.notifications")
|
expect(page).to have_current_path(instructeur_procedure_path(procedure))
|
||||||
|
expect(find('.tabs')).to have_css('span.notifications')
|
||||||
|
|
||||||
## on the dossier it self
|
## on the dossier itself
|
||||||
click_on 'suivi'
|
click_on 'suivi'
|
||||||
click_on litteraire_user.email
|
click_on litteraire_user.email
|
||||||
expect(page).to have_css("span.notifications")
|
expect(page).to have_current_path(instructeur_dossier_path(procedure, litteraire_user.dossiers.first))
|
||||||
|
expect(page).to have_text('Annotations privées') # ensure Turbolinks DID load the DOM content
|
||||||
|
expect(find('.tabs')).to have_css('span.notifications')
|
||||||
log_out
|
log_out
|
||||||
|
|
||||||
# the scientifiques instructeurs should not have a notification
|
# the scientifiques instructeurs should not have a notification
|
||||||
login_as marie.user, scope: :user
|
visit new_user_session_path
|
||||||
visit instructeur_procedures_path
|
sign_in_with marie.user.email, password
|
||||||
expect(page).not_to have_css("span.notifications")
|
|
||||||
|
expect(page).to have_current_path(instructeur_procedures_path)
|
||||||
|
expect(find('.procedure-stats')).not_to have_css('span.notifications')
|
||||||
log_out
|
log_out
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -136,7 +141,7 @@ feature 'The routing', js: true do
|
||||||
find('#publish-procedure').click
|
find('#publish-procedure').click
|
||||||
within '#publish-modal' do
|
within '#publish-modal' do
|
||||||
fill_in 'lien_site_web', with: 'http://some.website'
|
fill_in 'lien_site_web', with: 'http://some.website'
|
||||||
click_on 'publish'
|
click_on 'Publier'
|
||||||
end
|
end
|
||||||
|
|
||||||
expect(page).to have_text('Démarche publiée')
|
expect(page).to have_text('Démarche publiée')
|
||||||
|
@ -154,6 +159,7 @@ feature 'The routing', js: true do
|
||||||
select(groupe, from: 'dossier_groupe_instructeur_id')
|
select(groupe, from: 'dossier_groupe_instructeur_id')
|
||||||
|
|
||||||
click_on 'Déposer le dossier'
|
click_on 'Déposer le dossier'
|
||||||
|
expect(page).to have_text('Merci')
|
||||||
|
|
||||||
log_out
|
log_out
|
||||||
end
|
end
|
||||||
|
@ -166,31 +172,18 @@ feature 'The routing', js: true do
|
||||||
|
|
||||||
visit "users/activate?#{token_params}"
|
visit "users/activate?#{token_params}"
|
||||||
fill_in :user_password, with: password
|
fill_in :user_password, with: password
|
||||||
|
|
||||||
click_button 'Définir le mot de passe'
|
click_button 'Définir le mot de passe'
|
||||||
|
|
||||||
expect(page).to have_content 'Mot de passe enregistré'
|
expect(page).to have_text('Mot de passe enregistré')
|
||||||
end
|
end
|
||||||
|
|
||||||
def log_out(old_layout: false)
|
def log_out(old_layout: false)
|
||||||
if old_layout
|
if old_layout
|
||||||
expect(page).to have_content('Se déconnecter')
|
|
||||||
click_on 'Se déconnecter'
|
click_on 'Se déconnecter'
|
||||||
else
|
else
|
||||||
try_twice do
|
click_button(title: 'Mon compte')
|
||||||
expect(page).to have_css('[title="Mon compte"]')
|
click_on 'Se déconnecter'
|
||||||
find('[title="Mon compte"]').click
|
|
||||||
expect(page).to have_content('Se déconnecter')
|
|
||||||
click_on 'Se déconnecter'
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def try_twice
|
|
||||||
begin
|
|
||||||
yield
|
|
||||||
rescue Selenium::WebDriver::Error::ElementNotInteractableError, Capybara::ElementNotFound
|
|
||||||
yield
|
|
||||||
end
|
end
|
||||||
|
expect(page).to have_current_path(root_path)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -24,5 +24,19 @@ describe ActiveStorage::DownloadableFile do
|
||||||
expect(list.size).to eq(4)
|
expect(list.size).to eq(4)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'when there is a message with no attachment' do
|
||||||
|
let(:commentaire) { create(:commentaire) }
|
||||||
|
let(:dossier) { commentaire.dossier }
|
||||||
|
|
||||||
|
it { expect(list.length).to be 0 }
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when there is a message with an attachment' do
|
||||||
|
let(:commentaire) { create(:commentaire, :with_file) }
|
||||||
|
let(:dossier) { commentaire.dossier }
|
||||||
|
|
||||||
|
it { expect(list.length).to be 1 }
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue