diff --git a/app/controllers/prefill_descriptions_controller.rb b/app/controllers/prefill_descriptions_controller.rb
index 53975c61c..f7defbb5d 100644
--- a/app/controllers/prefill_descriptions_controller.rb
+++ b/app/controllers/prefill_descriptions_controller.rb
@@ -25,6 +25,6 @@ class PrefillDescriptionsController < ApplicationController
end
def prefill_description_params
- params.require(:type_de_champ).permit(:selected_type_de_champ_ids)
+ params.require(:procedure).permit(:selected_type_de_champ_ids, :identity_items_selected)
end
end
diff --git a/app/models/prefill_description.rb b/app/models/prefill_description.rb
index a2c66ac92..58853f600 100644
--- a/app/models/prefill_description.rb
+++ b/app/models/prefill_description.rb
@@ -4,22 +4,25 @@ class PrefillDescription < SimpleDelegator
MAX_PREFILL_LINK_LENGTH = 2000
attr_reader :selected_type_de_champ_ids
+ attr_reader :identity_items_selected
def initialize(procedure)
super(procedure)
@selected_type_de_champ_ids = []
+ @identity_items_selected = []
end
def update(attributes)
@selected_type_de_champ_ids = attributes[:selected_type_de_champ_ids]&.split(' ') || []
+ @identity_items_selected = attributes[:identity_items_selected]&.split(' ') || []
end
def types_de_champ
TypesDeChamp::PrefillTypeDeChamp.wrap(active_revision.types_de_champ_public.fillable.partition(&:prefillable?).flatten, active_revision)
end
- def include?(type_de_champ_id)
- selected_type_de_champ_ids.include?(type_de_champ_id.to_s)
+ def include?(entity)
+ selected_type_de_champ_ids.include?(entity) || identity_items_selected.include?(entity)
end
def link_too_long?
@@ -27,7 +30,7 @@ class PrefillDescription < SimpleDelegator
end
def prefill_link
- @prefill_link ||= CGI.unescape(commencer_url({ path: path }.merge(prefilled_champs_as_params)))
+ @prefill_link ||= CGI.unescape(commencer_url({ path: path }.merge(prefilled_champs_as_params).merge(prefilled_identity_as_params)))
end
def prefill_query
@@ -35,7 +38,7 @@ class PrefillDescription < SimpleDelegator
<<~TEXT
curl --request POST '#{api_public_v1_dossiers_url(self)}' \\
--header 'Content-Type: application/json' \\
- --data '#{prefilled_champs_as_params.to_json}'
+ --data '#{prefilled_identity_as_params.merge(prefilled_champs_as_params).to_json}'
TEXT
end
@@ -52,4 +55,8 @@ class PrefillDescription < SimpleDelegator
def prefilled_champs_as_params
prefilled_champs.map { |type_de_champ| ["champ_#{type_de_champ.to_typed_id_for_query}", type_de_champ.example_value] }.to_h
end
+
+ def prefilled_identity_as_params
+ identity_items_selected.map { |item| ["identite_#{item}", I18n.t("views.prefill_descriptions.edit.examples.#{item}")] }.to_h
+ end
end
diff --git a/app/views/prefill_descriptions/_prefill_link.html.haml b/app/views/prefill_descriptions/_prefill_link.html.haml
index 0e7d097fd..b92ac8d61 100644
--- a/app/views/prefill_descriptions/_prefill_link.html.haml
+++ b/app/views/prefill_descriptions/_prefill_link.html.haml
@@ -1,9 +1,9 @@
-= turbo_frame_tag "#{dom_id(prefill_description)}_url" do
+= turbo_frame_tag dom_id(prefill_description, :url) do
- theme = prefill_description.link_too_long? ? :warning : :success
- icon = prefill_description.link_too_long? ? "fr-icon-warning-fill" : "fr-icon-paint-fill"
- body = prefill_description.link_too_long? ? t("views.prefill_descriptions.edit.prefill_link_too_long") : t("views.prefill_descriptions.edit.prefill_link_info")
- - if prefill_description.prefilled_champs.any?
+ - if prefill_description.prefilled_champs.any? || prefill_description.identity_items_selected.any?
= render Dsfr::CalloutComponent.new(title: t("views.prefill_descriptions.edit.prefill_link_title"), theme: theme, icon: icon) do |c|
- c.with_html_body do
%p= body
diff --git a/app/views/prefill_descriptions/_prefill_query.html.haml b/app/views/prefill_descriptions/_prefill_query.html.haml
index a767cb87d..6e6464b89 100644
--- a/app/views/prefill_descriptions/_prefill_query.html.haml
+++ b/app/views/prefill_descriptions/_prefill_query.html.haml
@@ -1,7 +1,5 @@
-= turbo_frame_tag "#{dom_id(prefill_description)}_query" do
-
- - if prefill_description.prefilled_champs.any?
-
+= turbo_frame_tag dom_id(prefill_description, :query) do
+ - if prefill_description.prefilled_champs.any? || prefill_description.identity_items_selected.any?
= render Dsfr::CalloutComponent.new(title: t("views.prefill_descriptions.edit.prefill_query_title"), theme: :success, icon: "fr-icon-code-box-fill") do |c|
- c.with_html_body do
%p= t("views.prefill_descriptions.edit.prefill_query_info")
diff --git a/app/views/prefill_descriptions/_prefillable_entities.html.haml b/app/views/prefill_descriptions/_prefillable_entities.html.haml
new file mode 100644
index 000000000..369b11fb7
--- /dev/null
+++ b/app/views/prefill_descriptions/_prefillable_entities.html.haml
@@ -0,0 +1,18 @@
+= turbo_frame_tag dom_id(prefill_description, :prefillable_entities) do
+
+ .fr-grid-row.fr-grid-row--gutters.fr-pt-1w.fr-pb-5w
+ - if prefill_description.for_individual?
+ - ["prenom", "nom", "genre"].each do |identity_item|
+ = render "prefillable_entity_card",
+ prefill_description: prefill_description, type_de_champ: nil,
+ prefillable: true, already_included: prefill_description.include?(identity_item),
+ all_entities: prefill_description.identity_items_selected, new_entity: identity_item,
+ title: t("views.prefill_descriptions.edit.title.#{identity_item}"), description: t("views.prefill_descriptions.edit.description.#{identity_item}"), possible_values: t("views.prefill_descriptions.edit.possible_values.#{identity_item}"), example_value: t("views.prefill_descriptions.edit.examples.#{identity_item}")
+
+ .fr-grid-row.fr-grid-row--gutters.fr-pt-1w.fr-pb-5w
+ - prefill_description.types_de_champ.each do |type_de_champ|
+ = render "prefillable_entity_card",
+ prefill_description: prefill_description, type_de_champ: type_de_champ,
+ prefillable: type_de_champ.prefillable?, already_included: prefill_description.include?(type_de_champ.id.to_s),
+ all_entities: prefill_description.selected_type_de_champ_ids, new_entity: type_de_champ.id.to_s,
+ title: type_de_champ.libelle, description: type_de_champ.description, possible_values: type_de_champ.possible_values, example_value: type_de_champ.example_value
diff --git a/app/views/prefill_descriptions/_prefillable_entity_card.html.haml b/app/views/prefill_descriptions/_prefillable_entity_card.html.haml
new file mode 100644
index 000000000..d5c1f7107
--- /dev/null
+++ b/app/views/prefill_descriptions/_prefillable_entity_card.html.haml
@@ -0,0 +1,42 @@
+- form_field = type_de_champ ? :selected_type_de_champ_ids : :identity_items_selected
+.fr-col-md-6.fr-col-12
+ .card
+ .card-title.flex.justify-between.align-center
+ = title
+ = form_for prefill_description, url: prefill_description_path(prefill_description.path), data: { turbo: true } do |f|
+ - if already_included
+ = f.hidden_field form_field, value: all_entities - [new_entity]
+ = f.submit t("views.prefill_descriptions.edit.entity_remove"), class: 'fr-btn fr-btn--secondary fr-btn--md'
+ - elsif prefillable
+ = f.hidden_field form_field, value: all_entities + [new_entity]
+ = f.submit t("views.prefill_descriptions.edit.entity_add"), id: "#{new_entity}_add_button", class: 'fr-btn fr-btn--md'
+ - else
+ %button.fr-btn.fr-btn--secondary{ disabled: true }
+ = t("views.prefill_descriptions.edit.entity_unavailable")
+
+ %p
+ = description
+
+ %table.table.vertical
+ %tbody
+ - if type_de_champ
+ %tr
+ %th
+ = t("views.prefill_descriptions.edit.champ_id")
+ %td
+ = type_de_champ.to_typed_id_for_query
+ %tr
+ %th
+ = t("views.prefill_descriptions.edit.champ_type")
+ %td
+ = t("activerecord.attributes.type_de_champ.type_champs.#{type_de_champ.type_champ}")
+ %tr{ class: prefillable ? "" : "fr-text-mention--grey" }
+ %th
+ = t("views.prefill_descriptions.edit.possible_values.title")
+ %td
+ = possible_values
+ %tr{ class: prefillable ? "" : "fr-text-mention--grey" }
+ %th
+ = t("views.prefill_descriptions.edit.examples.title")
+ %td
+ = example_value
diff --git a/app/views/prefill_descriptions/_types_de_champs.html.haml b/app/views/prefill_descriptions/_types_de_champs.html.haml
deleted file mode 100644
index 49eab0fd0..000000000
--- a/app/views/prefill_descriptions/_types_de_champs.html.haml
+++ /dev/null
@@ -1,45 +0,0 @@
-= turbo_frame_tag "#{dom_id(prefill_description)}_types_de_champs" do
- .fr-grid-row.fr-grid-row--gutters.fr-py-5w
- - prefill_description.types_de_champ.each do |type_de_champ|
- - prefillable = type_de_champ.prefillable?
-
- .fr-col-md-6.fr-col-12
- .card
- .card-title.flex.justify-between.align-center
- = type_de_champ.libelle
- = form_for type_de_champ, url: prefill_description_path(prefill_description.path), data: { turbo: true } do |f|
- - if prefill_description.include?(type_de_champ.id)
- = f.hidden_field :selected_type_de_champ_ids, value: (prefill_description.selected_type_de_champ_ids - [type_de_champ.id.to_s])
- = f.submit t("views.prefill_descriptions.edit.champ_remove"), class: 'fr-btn fr-btn--secondary fr-btn--md'
- - elsif prefillable && !prefill_description.include?(type_de_champ.id)
- = f.hidden_field :selected_type_de_champ_ids, value: (prefill_description.selected_type_de_champ_ids + [type_de_champ.id.to_s])
- = f.submit t("views.prefill_descriptions.edit.champ_add"), class: 'fr-btn fr-btn--md'
- - else
- %button.fr-btn.fr-btn--secondary{ disabled: true }
- = t("views.prefill_descriptions.edit.champ_unavailable")
-
- %p
- = type_de_champ.description
-
- %table.table.vertical
- %tbody
- %tr
- %th
- = t("views.prefill_descriptions.edit.champ_id")
- %td
- = type_de_champ.to_typed_id_for_query
- %tr
- %th
- = t("views.prefill_descriptions.edit.champ_type")
- %td
- = t("activerecord.attributes.type_de_champ.type_champs.#{type_de_champ.type_champ}")
- %tr{ class: prefillable ? "" : "fr-text-mention--grey" }
- %th
- = t("views.prefill_descriptions.edit.possible_values.title")
- %td
- = type_de_champ.possible_values
- %tr{ class: prefillable ? "" : "fr-text-mention--grey" }
- %th
- = t("views.prefill_descriptions.edit.examples.title")
- %td
- = type_de_champ.example_value
diff --git a/app/views/prefill_descriptions/edit.html.haml b/app/views/prefill_descriptions/edit.html.haml
index 4c94fabf7..f7fc6a1f2 100644
--- a/app/views/prefill_descriptions/edit.html.haml
+++ b/app/views/prefill_descriptions/edit.html.haml
@@ -14,7 +14,7 @@
%p
= t("views.prefill_descriptions.edit.info_html")
- = render "types_de_champs", prefill_description: @prefill_description
+ = render "prefillable_entities", prefill_description: @prefill_description
= render "prefill_link", prefill_description: @prefill_description
diff --git a/app/views/prefill_descriptions/update.turbo_stream.haml b/app/views/prefill_descriptions/update.turbo_stream.haml
index 99f95c595..add0b11ae 100644
--- a/app/views/prefill_descriptions/update.turbo_stream.haml
+++ b/app/views/prefill_descriptions/update.turbo_stream.haml
@@ -1,8 +1,8 @@
-= turbo_stream.replace "#{dom_id(@prefill_description)}_types_de_champs" do
- = render "types_de_champs", prefill_description: @prefill_description
+= turbo_stream.replace dom_id(@prefill_description, :prefillable_entities) do
+ = render "prefillable_entities", prefill_description: @prefill_description
-= turbo_stream.replace "#{dom_id(@prefill_description)}_url" do
+= turbo_stream.replace dom_id(@prefill_description, :url) do
= render "prefill_link", prefill_description: @prefill_description
-= turbo_stream.replace "#{dom_id(@prefill_description)}_query" do
+= turbo_stream.replace dom_id(@prefill_description, :query) do
= render "prefill_query", prefill_description: @prefill_description
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 1e2c09f69..9825a22c5 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -230,14 +230,25 @@ en:
info_html: To do this, select the fields below that you want to prefill.
You will then find a prefill link at the bottom of this page, which you will just need to copy, adapt by replacing the default values, and share.
In the same way, you will find an example of a cURL request at the bottom of the page to adapt if you want to prefill the folders via API.
champ_id: ID
champ_type: Type
- champ_add: Add
- champ_remove: Remove
- champ_unavailable: Unavailable
+ entity_add: Add
+ entity_remove: Remove
+ entity_unavailable: Unavailable
+ title:
+ prenom: First name (identity)
+ nom: Last name (identity)
+ genre: Gender (identity)
+ description:
+ prenom: The first name of the owner of the file
+ nom: The last name of the owner of the file
+ genre: The gender name of the owner of the file
possible_values:
link:
title: All possible values
text: See all possible values
title: Values
+ prenom: A first name
+ nom: A last name
+ genre: '"M." for Mister, "Mme" for Madam'
text_html: A short text
textarea_html: A long text
decimal_number_html: A decimal number
@@ -265,6 +276,9 @@ en:
dossier_link_html: The file ID, as integer
examples:
title: Example
+ prenom: "Jean"
+ nom: "Dupont"
+ genre: "M."
text: Short text
textarea: Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
decimal_number: 49.3
@@ -284,6 +298,7 @@ en:
dossier_link: 42
rna: "W503726238"
siret: "13002526500013"
+ civilite: "M."
prefill_link_title: Prefill link (GET)
prefill_link_info: Use the button to copy the link, then remplace the values with your data.
prefill_link_too_long: Warning, the prefill link is too long and may not work on all browsers.
diff --git a/config/locales/fr.yml b/config/locales/fr.yml
index 17f86bfc0..5648f07fa 100644
--- a/config/locales/fr.yml
+++ b/config/locales/fr.yml
@@ -226,14 +226,25 @@ fr:
info_html: Pour cela, sélectionnez ci-dessous les champs que vous souhaitez préremplir.
Vous trouverez ensuite en bas de cette page un lien de préremplissage qu'il ne vous restera plus qu'à copier, à adapter en remplaçant les valeurs par défaut et à partager.
De la même façon, vous trouverez en bas de page un exemple de requête cURL à adapter si vous souhaitez préremplir les dossiers par API.
champ_id: ID
champ_type: Type
- champ_add: Ajouter
- champ_remove: Retirer
- champ_unavailable: Indisponible
+ entity_add: Ajouter
+ entity_remove: Retirer
+ entity_unavailable: Indisponible
+ title:
+ prenom: Prénom (identité)
+ nom: Nom (identité)
+ genre: Genre (identité)
+ description:
+ prenom: Le prénom du ou de la propriétaire du dossier
+ nom: Le nom du ou de la propriétaire du dossier
+ genre: Le genre du ou de la propriétaire du dossier
possible_values:
link:
title: Toutes les valeurs possibles
text: Voir toutes les valeurs possibles
title: Valeurs
+ prenom: Un prénom
+ nom: Un nom
+ genre: '"M." pour Monsieur, "Mme" pour Madame'
text_html: Un texte court
textarea_html: Un texte long
decimal_number_html: Un nombre décimal
@@ -261,6 +272,9 @@ fr:
epci_html: Un tableau contenant le code de département et celui de l'EPCI
examples:
title: Exemple
+ prenom: "Jean"
+ nom: "Dupont"
+ genre: "M."
text: Texte court
textarea: Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
decimal_number: 49.3