From 15401749f5a8e7705d96796b6520ee03eaf13f37 Mon Sep 17 00:00:00 2001 From: Colin Darie Date: Fri, 2 Jun 2023 12:31:39 +0200 Subject: [PATCH 01/41] fix(schema): missing procedures#description_target_audience introduced in 7340206 --- db/schema.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/db/schema.rb b/db/schema.rb index 0c7119b4a88..ff1c88ded4e 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,8 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.0].define(version: 2023_05_08_160551) do - +ActiveRecord::Schema[7.0].define(version: 2023_05_16_132925) do # These are extensions that must be enabled in order to support this database enable_extension "pgcrypto" enable_extension "plpgsql" @@ -711,6 +710,7 @@ t.string "declarative_with_state" t.bigint "defaut_groupe_instructeur_id" t.string "description" + t.string "description_target_audience" t.string "direction" t.datetime "dossiers_count_computed_at", precision: 6 t.bigint "draft_revision_id" From 7de608cd647c9479adc99bed8b28465a1f08f7e0 Mon Sep 17 00:00:00 2001 From: Lisa Durand Date: Mon, 5 Jun 2023 14:25:51 +0200 Subject: [PATCH 02/41] add link notice on procedure presentation page and small refactor of download component --- app/assets/stylesheets/02_utils.scss | 8 -------- .../attachment/show_component/show_component.en.yml | 1 - .../attachment/show_component/show_component.fr.yml | 1 - .../show_component/show_component.html.haml | 5 +---- app/components/dsfr/download_component.rb | 8 +++++--- .../download_component/download_component.en.yml | 2 ++ .../download_component/download_component.fr.yml | 2 ++ .../download_component/download_component.html.haml | 8 +++++++- .../shared/_piece_justificative_template.html.haml | 8 +------- app/views/shared/_procedure_description.html.haml | 4 ++++ app/views/shared/dossiers/_edit.html.haml | 13 +------------ config/locales/en.yml | 2 -- config/locales/fr.yml | 2 -- 13 files changed, 23 insertions(+), 41 deletions(-) diff --git a/app/assets/stylesheets/02_utils.scss b/app/assets/stylesheets/02_utils.scss index ac37efcbd16..cad30c22542 100644 --- a/app/assets/stylesheets/02_utils.scss +++ b/app/assets/stylesheets/02_utils.scss @@ -90,14 +90,6 @@ display: none !important; } -.visible-on-previous-hover { - visibility: hidden; -} - -:hover + .visible-on-previous-hover { - visibility: visible; -} - // sizing .width-100 { width: 100%; diff --git a/app/components/attachment/show_component/show_component.en.yml b/app/components/attachment/show_component/show_component.en.yml index 00e599d650c..b8e1f6059e2 100644 --- a/app/components/attachment/show_component/show_component.en.yml +++ b/app/components/attachment/show_component/show_component.en.yml @@ -1,6 +1,5 @@ --- en: - virus_not_analyzed: this file has not been scanned by our antivirus, download it with care errors: virus_infected: Virus detected, download is blocked. corrupted_file: The file is corrupted, the download is blocked. diff --git a/app/components/attachment/show_component/show_component.fr.yml b/app/components/attachment/show_component/show_component.fr.yml index dc82c353f19..72b202fe7f3 100644 --- a/app/components/attachment/show_component/show_component.fr.yml +++ b/app/components/attachment/show_component/show_component.fr.yml @@ -1,6 +1,5 @@ --- fr: - virus_not_analyzed: ce fichier n’a pas été analysé par notre antivirus, téléchargez-le avec précaution errors: virus_infected: "Virus détecté, le téléchargement est bloqué." corrupted_file: "Le fichier est corrompu, le téléchargement est bloqué." diff --git a/app/components/attachment/show_component/show_component.html.haml b/app/components/attachment/show_component/show_component.html.haml index 7a91132faa2..681aab1fb88 100644 --- a/app/components/attachment/show_component/show_component.html.haml +++ b/app/components/attachment/show_component/show_component.html.haml @@ -1,9 +1,6 @@ %div{ id: dom_id(attachment, :show), class: class_names("attachment-error": error?, "fr-mb-2w": !should_display_link?) } - if should_display_link? - = render Dsfr::DownloadComponent.new(attachment: attachment, new_tab: new_tab) do |c| - - if !attachment.virus_scanner.started? - - c.right do - = "(#{t(".virus_not_analyzed")})" + = render Dsfr::DownloadComponent.new(attachment: attachment, virus_not_analized: !attachment.virus_scanner.started?, new_tab: new_tab) - else .attachment-filename.fr-mb-1w.fr-mr-1w= attachment.filename.to_s diff --git a/app/components/dsfr/download_component.rb b/app/components/dsfr/download_component.rb index 2b92ca77cd8..b129c41936b 100644 --- a/app/components/dsfr/download_component.rb +++ b/app/components/dsfr/download_component.rb @@ -1,15 +1,17 @@ class Dsfr::DownloadComponent < ApplicationComponent - renders_one :right - attr_reader :attachment attr_reader :html_class attr_reader :name + attr_reader :ephemeral_link + attr_reader :virus_not_analized attr_reader :new_tab - def initialize(attachment:, name: nil, url: nil, new_tab: false) + def initialize(attachment:, name: nil, url: nil, ephemeral_link: false, virus_not_analized: false, new_tab: false) @attachment = attachment @name = name || attachment.filename.to_s @url = url + @ephemeral_link = ephemeral_link + @virus_not_analized = virus_not_analized @new_tab = new_tab end diff --git a/app/components/dsfr/download_component/download_component.en.yml b/app/components/dsfr/download_component/download_component.en.yml index 8e05b9ca3c9..8eb96693ca4 100644 --- a/app/components/dsfr/download_component/download_component.en.yml +++ b/app/components/dsfr/download_component/download_component.en.yml @@ -1,3 +1,5 @@ --- en: title: "Download file %{filename}" + ephemeral_link: This link is ephemeral and should not be shared. + virus_not_analyzed: this file has not been scanned by our antivirus, download it with care diff --git a/app/components/dsfr/download_component/download_component.fr.yml b/app/components/dsfr/download_component/download_component.fr.yml index 230a588edc7..0de6b11d934 100644 --- a/app/components/dsfr/download_component/download_component.fr.yml +++ b/app/components/dsfr/download_component/download_component.fr.yml @@ -1,3 +1,5 @@ --- fr: title: "Télécharger le fichier %{filename}" + ephemeral_link: Ce lien est éphémère et ne devrait pas être partagé. + virus_not_analyzed: ce fichier n’a pas été analysé par notre antivirus, téléchargez-le avec précaution diff --git a/app/components/dsfr/download_component/download_component.html.haml b/app/components/dsfr/download_component/download_component.html.haml index aed3645c30e..6b0a63b5830 100644 --- a/app/components/dsfr/download_component/download_component.html.haml +++ b/app/components/dsfr/download_component/download_component.html.haml @@ -4,5 +4,11 @@ = name %span.fr-download__detail = helpers.download_details(attachment) + - if ephemeral_link + %span.fr-ml-2w.fr-text--xs.fr-text-mention--grey + %span.fr-icon-questionnaire-line{ "aria-hidden": "true" } + = t('.ephemeral_link') - = right + - if virus_not_analized + .fr-text--xs.fr-text-mention--grey + = t('.virus_not_analyzed') diff --git a/app/views/shared/_piece_justificative_template.html.haml b/app/views/shared/_piece_justificative_template.html.haml index 6bf7ef00517..abb90edbfc7 100644 --- a/app/views/shared/_piece_justificative_template.html.haml +++ b/app/views/shared/_piece_justificative_template.html.haml @@ -1,7 +1 @@ -= render Dsfr::DownloadComponent.new(attachment: champ.type_de_champ.piece_justificative_template, url: champs_piece_justificative_template_path(champ), name: "Modèle à télécharger") do |c| - - if administrateur_signed_in? - - c.with_right do - %span.fr-ml-2w.fr-text--xs.fr-text-mention--grey.visible-on-previous-hover - %span.fr-text-action-high--blue-france.fr-icon-questionnaire-line{ "aria-hidden": "true" } - = t('shared.ephemeral_link') - += render Dsfr::DownloadComponent.new(attachment: champ.type_de_champ.piece_justificative_template, url: champs_piece_justificative_template_path(champ), name: "Modèle à télécharger", ephemeral_link: administrateur_signed_in? ) diff --git a/app/views/shared/_procedure_description.html.haml b/app/views/shared/_procedure_description.html.haml index 886fbb258ef..8be58f2aaf9 100644 --- a/app/views/shared/_procedure_description.html.haml +++ b/app/views/shared/_procedure_description.html.haml @@ -49,3 +49,7 @@ = t('shared.procedure_description.estimated_fill_duration_title') #accordion-116.fr-collapse.js_description_target_audience = t('shared.procedure_description.estimated_fill_duration_detail', estimated_minutes: estimated_fill_duration_minutes(procedure)) + +- if notice_url(procedure).present? + .fr-my-3w + = render Dsfr::DownloadComponent.new(attachment: procedure.notice , url: notice_url(procedure), name: t("views.shared.dossiers.edit.notice"), ephemeral_link: administrateur_signed_in?) diff --git a/app/views/shared/dossiers/_edit.html.haml b/app/views/shared/dossiers/_edit.html.haml index 1f1dbefcd4a..f1c5853942f 100644 --- a/app/views/shared/dossiers/_edit.html.haml +++ b/app/views/shared/dossiers/_edit.html.haml @@ -17,18 +17,7 @@ = t('views.shared.dossiers.edit.autosave') - if notice_url(dossier.procedure).present? - .fr-download - %p - = link_to notice_url(dossier.procedure), download: "", class: "fr-download__link mr-2", title: t("views.shared.dossiers.edit.notice_title") do - = t("views.shared.dossiers.edit.notice") - - if dossier.procedure.notice.attached? - %span.fr-download__detail - = download_details(dossier.procedure.notice) - - - if administrateur_signed_in? - %span.fr-text--xs.fr-text-mention--grey.visible-on-previous-hover - %span.fr-text-action-high--blue-france.fr-icon-questionnaire-line{ "aria-hidden": "true" } - = t('shared.ephemeral_link') + = render Dsfr::DownloadComponent.new(attachment: dossier.procedure.notice , url: notice_url(dossier.procedure), name: t("views.shared.dossiers.edit.notice"), ephemeral_link: administrateur_signed_in?) - if dossier.show_groupe_instructeur_selector? %span{ data: { controller: 'autosave' } } diff --git a/config/locales/en.yml b/config/locales/en.yml index 0711e91be4a..ad5e60bf4c6 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -331,7 +331,6 @@ en: edit: autosave: Your file is automatically saved after each modification. You can close the window at any time and pick up where you left off later. notice: "Download the notice of the procedure" - notice_title: "To help you complete your file, you can consult the notice to this procedure." pending_correction: confirm_label: I certify that I have made all corrections requested by the administration. messages: @@ -803,7 +802,6 @@ en: connection_done: "The accounts for FranceConnect and %{application_name} are now merged." merger_token_expired: "Le delay to merge your FranceConnect and %{application_name} accounts is expired. Please retry." shared: - ephemeral_link: This link is ephemeral and should not be shared. procedures: stats: usual_processing_time: "Usual processing time" diff --git a/config/locales/fr.yml b/config/locales/fr.yml index f3a1131b3ca..af3df97947c 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -331,7 +331,6 @@ fr: edit: autosave: Votre dossier est enregistré automatiquement après chaque modification. Vous pouvez à tout moment fermer la fenêtre et reprendre plus tard là où vous en étiez. notice: Télécharger le guide de la démarche - notice_title: "Pour vous aider à remplir votre dossier, vous pouvez consulter le guide de cette démarche." pending_correction: confirm_label: Je certifie avoir effectué toutes les corrections demandées par l’administration. messages: @@ -849,7 +848,6 @@ fr: connection_done: "Les comptes FranceConnect et %{application_name} sont à présent fusionnés" merger_token_expired: "Le délai pour fusionner les comptes FranceConnect et %{application_name} est expirée. Veuillez recommencer la procédure pour vous fusionner les comptes." shared: - ephemeral_link: Ce lien est éphémère et ne devrait pas être partagé. procedures: stats: usual_processing_time: "Temps de traitement usuel" From 84909b85979992fb4d74677262e9a46ea736f690 Mon Sep 17 00:00:00 2001 From: Lisa Durand Date: Mon, 5 Jun 2023 17:18:14 +0200 Subject: [PATCH 03/41] improve design to make it more like figma --- app/assets/stylesheets/procedure_form.scss | 2 +- .../procedures/_informations.html.haml | 133 +++++++++--------- 2 files changed, 69 insertions(+), 66 deletions(-) diff --git a/app/assets/stylesheets/procedure_form.scss b/app/assets/stylesheets/procedure_form.scss index b4d64c83920..a65e38ec6dd 100644 --- a/app/assets/stylesheets/procedure_form.scss +++ b/app/assets/stylesheets/procedure_form.scss @@ -95,7 +95,7 @@ .procedure-form__options-summary { cursor: pointer; - .header-subsection { + h3 { display: inline-block; } } diff --git a/app/views/administrateurs/procedures/_informations.html.haml b/app/views/administrateurs/procedures/_informations.html.haml index be2eca6f043..39b533d04f2 100644 --- a/app/views/administrateurs/procedures/_informations.html.haml +++ b/app/views/administrateurs/procedures/_informations.html.haml @@ -9,93 +9,92 @@ = render Dsfr::InputComponent.new(form: f, attribute: :description_target_audience, input_type: :text_area, opts: {}, required: false) -%h3.header-subsection Logo de la démarche += f.label :logo, 'Ajouter un logo de la démarche (facultatif)', class: 'fr-label' = render Attachment::EditComponent.new(attached_file: @procedure.logo, view_as: :link) -%h3.header-subsection Conservation des données -= f.label :duree_conservation_dossiers_dans_ds, class: 'fr-label' do - Sur #{APPLICATION_NAME} - %span.mandatory * - -%p.notice - = t(:notice, scope: [:administrateurs, :duree_conservation_dossiers_dans_ds]) - - if f.object.duree_conservation_dossiers_dans_ds.to_i < Procedure::NEW_MAX_DUREE_CONSERVATION - = t(:new_duration_constraint, scope: [:administrateurs, :duree_conservation_dossiers_dans_ds], new_duration_in_month: f.object.max_duree_conservation_dossiers_dans_ds) += render Dsfr::CalloutComponent.new(title: "Conservation des données") do |c| + - c.with_body do + %p + = t(:notice, scope: [:administrateurs, :duree_conservation_dossiers_dans_ds]) + - if f.object.duree_conservation_dossiers_dans_ds.to_i < Procedure::NEW_MAX_DUREE_CONSERVATION + %p + = t(:new_duration_constraint, scope: [:administrateurs, :duree_conservation_dossiers_dans_ds], new_duration_in_month: f.object.max_duree_conservation_dossiers_dans_ds) .fr-input-group + = f.label :duree_conservation_dossiers_dans_ds, class: 'fr-label' do + Sur #{APPLICATION_NAME} + %span.mandatory * + = f.number_field :duree_conservation_dossiers_dans_ds, { class: 'fr-input', placeholder: '6', required: true, max: f.object.max_duree_conservation_dossiers_dans_ds } - if @procedure.created_at.present? = render Dsfr::InputComponent.new(form: f, attribute: :lien_site_web, input_type: :text_field, opts: {}, required: false) -%h3.header-subsection - Cadre juridique - %span.mandatory * - -%p.notice - Le cadre juridique justifie le droit de collecter les données demandées dans votre démarche auprès des usagers. Par exemple : - %br - • Texte de loi (loi, décret, circulaire, arrêté…) - %br - • Texte juridique (statuts, délibération, décision du conseil d’administration…) - %br - = link_to("En savoir plus avec cette vidéo de 5 minutes", CADRE_JURIDIQUE_URL, target: "_blank", rel: "noopener") += render Dsfr::CalloutComponent.new(title: "Cadre juridique") do |c| + - c.with_body do + %p + Le cadre juridique justifie le droit de collecter les données demandées dans votre démarche auprès des usagers. Par exemple : + %br + • Texte de loi (loi, décret, circulaire, arrêté…) + %br + • Texte juridique (statuts, délibération, décision du conseil d’administration…) + %br + = link_to("En savoir plus avec cette vidéo de 5 minutes", CADRE_JURIDIQUE_URL, target: "_blank", rel: "noopener") + %p Vous pouvez saisir un lien web vers ce texte, ou l’importer depuis un fichier. -%p.notice - Vous pouvez saisir un lien web vers ce texte, ou l’importer depuis un fichier. = render Dsfr::InputComponent.new(form: f, attribute: :cadre_juridique, input_type: :text_field, opts: {}) = f.label :deliberation, 'Importer le texte', class: 'fr-label' = render Attachment::EditComponent.new(attached_file: @procedure.deliberation, view_as: :download) -%h3.header-subsection - RGPD -%p.notice - Pour certaines démarches, veuillez indiquer soit le mail de contact de votre délégué à la protection des données, soit un lien web pointant vers les informations += render Dsfr::CalloutComponent.new(title: "RGPD") do |c| + - c.with_body do + %p Pour certaines démarches, veuillez indiquer soit le mail de contact de votre délégué à la protection des données, soit un lien web pointant vers les informations = render Dsfr::InputComponent.new(form: f, attribute: :lien_dpo, input_type: :text_field, opts: {}, required: false) - if Rails.application.config.ds_opendata_enabled - %h3.header-subsection= t(:opendata_header, scope: [:administrateurs, :informations]) - %p.notice= t(:opendata_notice_html, scope: [:administrateurs, :informations]) - %p.notice= t(:opendata, scope: [:administrateurs, :informations]) - - %label.toggle-switch - = f.check_box :opendata, class: 'toggle-switch-checkbox' - %span.toggle-switch-control.round - %span.toggle-switch-label.on Oui - %span.toggle-switch-label.off Non - -%h3.header-subsection 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. + = render Dsfr::CalloutComponent.new(title: t(:opendata_header, scope: [:administrateurs, :informations])) do |c| + - c.with_body do + %p= t(:opendata_notice_html, scope: [:administrateurs, :informations]) + + .fr-input-group + = f.label :opendata, t(:opendata, scope: [:administrateurs, :informations]), class: 'fr-label' + %label.toggle-switch + = f.check_box :opendata, class: 'toggle-switch-checkbox' + %span.toggle-switch-control.round + %span.toggle-switch-label.on Oui + %span.toggle-switch-label.off Non + += render Dsfr::CalloutComponent.new(title: "Notice explicative de la démarche") do |c| + - c.with_body do + %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. = f.label :notice, 'Notice', class: 'fr-label' -%p.notice +%p.fr-hint-text Formats acceptés : .doc, .odt, .pdf, .ppt, .pptx = render Attachment::EditComponent.new(attached_file: @procedure.notice, view_as: :download) - if !@procedure.locked? - %h3.header-subsection À qui s’adresse ma démarche ? + %h3.fr-h6 À qui s’adresse ma démarche ? .radios.vertical = f.label :for_individual, value: true do = f.radio_button :for_individual, true Ma démarche s’adresse à un particulier - %p.notice En choisissant cette option, l’usager devra renseigner son nom et prénom avant d’accéder au formulaire + %p.fr-hint-text En choisissant cette option, l’usager devra renseigner son nom et prénom avant d’accéder au formulaire = f.label :for_individual, value: false, class: 'fr-label' do = f.radio_button :for_individual, false Ma démarche s’adresse à une personne morale - %p.notice + %p.fr-hint-text En choisissant cette option, l’usager devra renseigner son n° SIRET.
Grâce à l’API Entreprise, les informations sur la personne morale (raison sociale, adresse du siège, etc.) seront automatiquement renseignées. + .fr-highlight + %p + Si votre démarche s’adresse indifféremment à une personne morale ou un particulier, choisissez l'option « Particuliers ». Vous pourrez ajouter un champ SIRET directement dans le formulaire. - %p - Si votre démarche s’adresse indifféremment à une personne morale ou un particulier, choisissez l'option « Particuliers ». Vous pourrez ajouter un champ SIRET directement dans le formulaire. - -%h3.header-subsection Ajouter des tags -%p Les tags sont des mots ou des expressions que vous attribuez aux démarches pour décrire leur contenu et pour les retrouver. Les tags sont partagés avec la communauté, ce qui vous permet de voir les tags attribués aux démarches créées par les autres administrateurs. += f.label :tags, 'Associez les tags à la démarche (facultatif)', class: 'fr-label' +%p.fr-hint-text Les tags sont des mots ou des expressions que vous attribuez aux démarches pour décrire leur contenu et pour les retrouver. Les tags sont partagés avec la communauté, ce qui vous permet de voir les tags attribués aux démarches créées par les autres administrateurs. = hidden_field_tag 'procedure[tags]', JSON.generate(@procedure.tags) = react_component("ComboMultiple", id: "procedure_tags_combo", @@ -110,33 +109,37 @@ %details.procedure-form__options-details %summary.procedure-form__options-summary - %h3.header-subsection Options avancées + %h3.fr-h6 Options avancées - if feature_enabled?(:administrateur_web_hook) = f.label :web_hook_url, class: 'fr-label' do Lien de rappel HTTP (webhook) - %p.notice + %p.fr-hint-text Vous pouvez définir un lien de rappel HTTP (aussi appelé webhook) pour informer un service tiers du changement de l'état d’un dossier de cette démarche sur #{APPLICATION_NAME}. = link_to("Consulter la documentation du webhook", WEBHOOK_DOC_URL, target: "_blank", rel: "noopener") = f.text_field :web_hook_url, class: 'fr-input', placeholder: 'https://callback.exemple.fr/' - = f.label :auto_archive_on, class: 'fr-label' do - Date limite de dépôt des dossiers - %p.notice - Si une date est définie, aucun dossier ne pourra plus être déposé ou modifié après cette limite. - %strong Les dossiers en construction passeront en instruction et la démarche sera clôturée. + = render Dsfr::CalloutComponent.new(title: "Date limite de dépôt des dossiers") do |c| + - c.with_body do + %p + Si une date est définie, aucun dossier ne pourra plus être déposé ou modifié après cette limite. + Les dossiers en construction passeront en instruction et la démarche sera clôturée. + + = f.label :auto_archive_on, 'Mentionnez une date (facultatif)', class: 'fr-label fr-mb-2w' %p.notice Le - value = @procedure.auto_archive_on ? @procedure.auto_archive_on - 1.day : nil = f.date_field :auto_archive_on, id: 'auto_archive_on', value: value #{procedure_auto_archive_time(@procedure)}. - = f.label :declarative_with_state, class: 'fr-label' do - Démarche déclarative - %p.notice - Par défaut, un dossier déposé peut être complété ou corrigé par le demandeur jusqu'à sa mise en instruction.
- Dans une démarche déclarative, une fois déposé, un dossier ne peut plus être modifié. - Soit il passe immédiatement « en instruction » pour être traité soit il est immédiatement « accepté ». + = render Dsfr::CalloutComponent.new(title: "Démarche déclarative") do |c| + - c.with_body do + %p + Par défaut, un dossier déposé peut être complété ou corrigé par le demandeur jusqu'à sa mise en instruction.
+ Dans une démarche déclarative, une fois déposé, un dossier ne peut plus être modifié. + Soit il passe immédiatement « en instruction » pour être traité soit il est immédiatement « accepté ». + + = f.label :declarative_with_state, 'Mentionnez l’état d’avancement (facultatif)', class: 'fr-label fr-mb-2w' = f.select :declarative_with_state, Procedure.declarative_attributes_for_select, { include_blank: 'Non' }, class: 'form-control' - if !@procedure.piece_justificative_multiple? @@ -144,5 +147,5 @@ = f.check_box :piece_justificative_multiple = f.label :piece_justificative_multiple, class: 'fr-label' do Champ “Pièce justificative” avec multiples fichiers - %p.notice + %p.fr-hint-text Autorise les usagers à envoyer plusieurs fichiers pour les champs de type “Pièce justificative”. L'activation de cette option est irréversible et peut nécessiter des modifications si vous utilisez des systèmes automatisés pour traiter les dossiers. From 7e1d88da03e58e376be6208585c7ca2689339cfb Mon Sep 17 00:00:00 2001 From: Lisa Durand Date: Mon, 5 Jun 2023 17:28:38 +0200 Subject: [PATCH 04/41] fix design for auto archive procedure date display --- app/assets/stylesheets/procedure_context.scss | 24 ------------------- .../shared/_procedure_description.html.haml | 13 ++++------ 2 files changed, 5 insertions(+), 32 deletions(-) diff --git a/app/assets/stylesheets/procedure_context.scss b/app/assets/stylesheets/procedure_context.scss index cd8e35e6521..061500aae99 100644 --- a/app/assets/stylesheets/procedure_context.scss +++ b/app/assets/stylesheets/procedure_context.scss @@ -30,30 +30,6 @@ $procedure-context-breakpoint: $two-columns-breakpoint; font-size: 12px; } - .procedure-configuration--auto-archive { - cursor: pointer; - - summary { - font-size: 20px; - - // Hide the default triangle details marker - list-style: none; - // (using the non-standard way for Chrome.) - &::-webkit-details-marker { - display: none; - } - } - - p { - padding-top: 8px; - font-size: 16px; - } - } - - .procedure-auto-archive-title { - border-bottom: 1px dotted $blue-france-500; - } - .procedure-logos { display: flex; align-items: center; diff --git a/app/views/shared/_procedure_description.html.haml b/app/views/shared/_procedure_description.html.haml index 886fbb258ef..0663b10be18 100644 --- a/app/views/shared/_procedure_description.html.haml +++ b/app/views/shared/_procedure_description.html.haml @@ -14,16 +14,13 @@ %span.fr-icon-timer-line = t('shared.procedure_description.estimated_fill_duration', estimated_minutes: estimated_fill_duration_minutes(procedure)) - -= yield - - if procedure.auto_archive_on - %details.procedure-configuration--auto-archive - %summary - %span.icon.edit + %p + %small + %span.fr-icon-calendar-line + Date limite : #{procedure_auto_archive_datetime(procedure)}. - %span.procedure-auto-archive-title Date limite : #{procedure_auto_archive_date(procedure)} - %p Vous pouvez déposer vos dossiers jusqu’au #{procedure_auto_archive_datetime(procedure)}. += yield - unless @no_description .fr-accordions-group From 74da12bd1e9fa46a3af224cb7469614f4c0ff16d Mon Sep 17 00:00:00 2001 From: Lisa Durand Date: Mon, 5 Jun 2023 17:37:52 +0200 Subject: [PATCH 05/41] fix typo --- .../attachment/show_component/show_component.html.haml | 2 +- app/components/dsfr/download_component.rb | 6 +++--- .../dsfr/download_component/download_component.html.haml | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/components/attachment/show_component/show_component.html.haml b/app/components/attachment/show_component/show_component.html.haml index 681aab1fb88..49b9768df1c 100644 --- a/app/components/attachment/show_component/show_component.html.haml +++ b/app/components/attachment/show_component/show_component.html.haml @@ -1,6 +1,6 @@ %div{ id: dom_id(attachment, :show), class: class_names("attachment-error": error?, "fr-mb-2w": !should_display_link?) } - if should_display_link? - = render Dsfr::DownloadComponent.new(attachment: attachment, virus_not_analized: !attachment.virus_scanner.started?, new_tab: new_tab) + = render Dsfr::DownloadComponent.new(attachment: attachment, virus_not_analyzed: !attachment.virus_scanner.started?, new_tab: new_tab) - else .attachment-filename.fr-mb-1w.fr-mr-1w= attachment.filename.to_s diff --git a/app/components/dsfr/download_component.rb b/app/components/dsfr/download_component.rb index b129c41936b..ef1e8862f8a 100644 --- a/app/components/dsfr/download_component.rb +++ b/app/components/dsfr/download_component.rb @@ -3,15 +3,15 @@ class Dsfr::DownloadComponent < ApplicationComponent attr_reader :html_class attr_reader :name attr_reader :ephemeral_link - attr_reader :virus_not_analized + attr_reader :virus_not_analyzed attr_reader :new_tab - def initialize(attachment:, name: nil, url: nil, ephemeral_link: false, virus_not_analized: false, new_tab: false) + def initialize(attachment:, name: nil, url: nil, ephemeral_link: false, virus_not_analyzed: false, new_tab: false) @attachment = attachment @name = name || attachment.filename.to_s @url = url @ephemeral_link = ephemeral_link - @virus_not_analized = virus_not_analized + @virus_not_analyzed = virus_not_analyzed @new_tab = new_tab end diff --git a/app/components/dsfr/download_component/download_component.html.haml b/app/components/dsfr/download_component/download_component.html.haml index 6b0a63b5830..71d53624a50 100644 --- a/app/components/dsfr/download_component/download_component.html.haml +++ b/app/components/dsfr/download_component/download_component.html.haml @@ -9,6 +9,6 @@ %span.fr-icon-questionnaire-line{ "aria-hidden": "true" } = t('.ephemeral_link') - - if virus_not_analized + - if virus_not_analyzed .fr-text--xs.fr-text-mention--grey = t('.virus_not_analyzed') From eac0e22c54b2f9ed4f95dcb45d5907da81b4ca79 Mon Sep 17 00:00:00 2001 From: Paul Chavard Date: Tue, 6 Jun 2023 11:28:10 +0200 Subject: [PATCH 06/41] fix(carto): include champ carto modifications in fork diff and show submit button --- app/controllers/champs/carte_controller.rb | 6 +++++- app/views/champs/carte/index.turbo_stream.haml | 4 ++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/app/controllers/champs/carte_controller.rb b/app/controllers/champs/carte_controller.rb index 0bc927f5a68..dee8e5853a1 100644 --- a/app/controllers/champs/carte_controller.rb +++ b/app/controllers/champs/carte_controller.rb @@ -39,6 +39,7 @@ def update def destroy champ = policy_scope(Champ).find(params[:champ_id]) champ.geo_areas.find(params[:id]).destroy! + champ.touch head :no_content end @@ -80,6 +81,9 @@ def save_feature(geo_area, feature) if feature[:properties] geo_area.properties.merge!(feature[:properties]) end - geo_area.save + if geo_area.save + geo_area.champ.touch + true + end end end diff --git a/app/views/champs/carte/index.turbo_stream.haml b/app/views/champs/carte/index.turbo_stream.haml index e5e4080a414..ebbdd946f5b 100644 --- a/app/views/champs/carte/index.turbo_stream.haml +++ b/app/views/champs/carte/index.turbo_stream.haml @@ -2,3 +2,7 @@ - if @focus = turbo_stream.dispatch 'map:feature:focus', bbox: @champ.bounding_box + +- if @champ.dossier.editing_fork? + = turbo_stream.replace_all '.dossier-edit-sticky-footer' do + = render Dossiers::EditFooterComponent.new(dossier: @champ.dossier, annotation: @champ.private?) From c4432b1b4700ab4eee04e094f2cb67a129528b38 Mon Sep 17 00:00:00 2001 From: Paul Chavard Date: Fri, 7 Apr 2023 15:24:28 +0200 Subject: [PATCH 07/41] perf(carto): use json schema to validate geojson instead of rgeo --- Gemfile | 1 - Gemfile.lock | 4 - app/jobs/migrations/normalize_geo_area_job.rb | 11 - app/models/geo_area.rb | 18 - app/schemas/geojson.json | 1279 +++++++++++++++++ app/services/geojson_service.rb | 5 + app/validators/geo_json_validator.rb | 4 +- .../20230215100231_normalize_geometries.rake | 19 - .../champs/carte_controller_spec.rb | 4 +- spec/factories/geo_area.rb | 9 + spec/models/geo_area_spec.rb | 57 +- 11 files changed, 1312 insertions(+), 99 deletions(-) delete mode 100644 app/jobs/migrations/normalize_geo_area_job.rb create mode 100644 app/schemas/geojson.json delete mode 100644 lib/tasks/deployment/20230215100231_normalize_geometries.rake diff --git a/Gemfile b/Gemfile index 74571dd797c..1ad129515ab 100644 --- a/Gemfile +++ b/Gemfile @@ -73,7 +73,6 @@ gem 'rails-i18n' # Locales par défaut gem 'rake-progressbar', require: false gem 'redcarpet' gem 'rexml' # add missing gem due to ruby3 (https://github.com/Shopify/bootsnap/issues/325) -gem 'rgeo-geojson' gem 'rqrcode' gem 'saml_idp' gem 'sanitize-url' diff --git a/Gemfile.lock b/Gemfile.lock index 6138e810e31..6f809f41c20 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -566,9 +566,6 @@ GEM mime-types (>= 1.16, < 4.0) netrc (~> 0.8) rexml (3.2.5) - rgeo (2.2.0) - rgeo-geojson (2.1.1) - rgeo (>= 1.0.0) rodf (1.1.1) builder (>= 3.0) dry-inflector (~> 0.1) @@ -890,7 +887,6 @@ DEPENDENCIES rake-progressbar redcarpet rexml - rgeo-geojson rqrcode rspec-rails rspec_junit_formatter diff --git a/app/jobs/migrations/normalize_geo_area_job.rb b/app/jobs/migrations/normalize_geo_area_job.rb deleted file mode 100644 index e5f8e7d1d1e..00000000000 --- a/app/jobs/migrations/normalize_geo_area_job.rb +++ /dev/null @@ -1,11 +0,0 @@ -class Migrations::NormalizeGeoAreaJob < ApplicationJob - def perform(ids) - GeoArea.where(id: ids).find_each do |geo_area| - geojson = RGeo::GeoJSON.decode(geo_area.geometry.to_json, geo_factory: RGeo::Geographic.simple_mercator_factory) - geometry = RGeo::GeoJSON.encode(geojson) - geo_area.update_column(:geometry, geometry) - rescue RGeo::Error::InvalidGeometry - geo_area.destroy - end - end -end diff --git a/app/models/geo_area.rb b/app/models/geo_area.rb index 9f691c39e83..501f64e3dfe 100644 --- a/app/models/geo_area.rb +++ b/app/models/geo_area.rb @@ -52,7 +52,6 @@ def filename scope :cadastres, -> { where(source: sources.fetch(:cadastre)) } validates :geometry, geo_json: true, allow_nil: false - before_validation :normalize_geometry def to_feature { @@ -230,21 +229,4 @@ def cid properties['id'] end end - - private - - def normalize_geometry - if geometry.present? - normalized_geometry = rgeo_geometry - if normalized_geometry.present? - self.geometry = RGeo::GeoJSON.encode(normalized_geometry) - end - end - end - - def rgeo_geometry - RGeo::GeoJSON.decode(geometry.to_json, geo_factory: RGeo::Geographic.simple_mercator_factory) - rescue RGeo::Error::InvalidGeometry - nil - end end diff --git a/app/schemas/geojson.json b/app/schemas/geojson.json new file mode 100644 index 00000000000..d80657d4c03 --- /dev/null +++ b/app/schemas/geojson.json @@ -0,0 +1,1279 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://geojson.org/schema/GeoJSON.json", + "title": "GeoJSON", + "oneOf": [ + { + "title": "GeoJSON Point", + "type": "object", + "required": ["type", "coordinates"], + "properties": { + "type": { + "type": "string", + "enum": ["Point"] + }, + "coordinates": { + "type": "array", + "minItems": 2, + "items": { + "type": "number" + } + }, + "bbox": { + "type": "array", + "minItems": 4, + "items": { + "type": "number" + } + } + } + }, + { + "title": "GeoJSON LineString", + "type": "object", + "required": ["type", "coordinates"], + "properties": { + "type": { + "type": "string", + "enum": ["LineString"] + }, + "coordinates": { + "type": "array", + "minItems": 2, + "items": { + "type": "array", + "minItems": 2, + "items": { + "type": "number" + } + } + }, + "bbox": { + "type": "array", + "minItems": 4, + "items": { + "type": "number" + } + } + } + }, + { + "title": "GeoJSON Polygon", + "type": "object", + "required": ["type", "coordinates"], + "properties": { + "type": { + "type": "string", + "enum": ["Polygon"] + }, + "coordinates": { + "type": "array", + "items": { + "type": "array", + "minItems": 4, + "items": { + "type": "array", + "minItems": 2, + "items": { + "type": "number" + } + } + } + }, + "bbox": { + "type": "array", + "minItems": 4, + "items": { + "type": "number" + } + } + } + }, + { + "title": "GeoJSON MultiPoint", + "type": "object", + "required": ["type", "coordinates"], + "properties": { + "type": { + "type": "string", + "enum": ["MultiPoint"] + }, + "coordinates": { + "type": "array", + "items": { + "type": "array", + "minItems": 2, + "items": { + "type": "number" + } + } + }, + "bbox": { + "type": "array", + "minItems": 4, + "items": { + "type": "number" + } + } + } + }, + { + "title": "GeoJSON MultiLineString", + "type": "object", + "required": ["type", "coordinates"], + "properties": { + "type": { + "type": "string", + "enum": ["MultiLineString"] + }, + "coordinates": { + "type": "array", + "items": { + "type": "array", + "minItems": 2, + "items": { + "type": "array", + "minItems": 2, + "items": { + "type": "number" + } + } + } + }, + "bbox": { + "type": "array", + "minItems": 4, + "items": { + "type": "number" + } + } + } + }, + { + "title": "GeoJSON MultiPolygon", + "type": "object", + "required": ["type", "coordinates"], + "properties": { + "type": { + "type": "string", + "enum": ["MultiPolygon"] + }, + "coordinates": { + "type": "array", + "items": { + "type": "array", + "items": { + "type": "array", + "minItems": 4, + "items": { + "type": "array", + "minItems": 2, + "items": { + "type": "number" + } + } + } + } + }, + "bbox": { + "type": "array", + "minItems": 4, + "items": { + "type": "number" + } + } + } + }, + { + "title": "GeoJSON GeometryCollection", + "type": "object", + "required": ["type", "geometries"], + "properties": { + "type": { + "type": "string", + "enum": ["GeometryCollection"] + }, + "geometries": { + "type": "array", + "items": { + "oneOf": [ + { + "title": "GeoJSON Point", + "type": "object", + "required": ["type", "coordinates"], + "properties": { + "type": { + "type": "string", + "enum": ["Point"] + }, + "coordinates": { + "type": "array", + "minItems": 2, + "items": { + "type": "number" + } + }, + "bbox": { + "type": "array", + "minItems": 4, + "items": { + "type": "number" + } + } + } + }, + { + "title": "GeoJSON LineString", + "type": "object", + "required": ["type", "coordinates"], + "properties": { + "type": { + "type": "string", + "enum": ["LineString"] + }, + "coordinates": { + "type": "array", + "minItems": 2, + "items": { + "type": "array", + "minItems": 2, + "items": { + "type": "number" + } + } + }, + "bbox": { + "type": "array", + "minItems": 4, + "items": { + "type": "number" + } + } + } + }, + { + "title": "GeoJSON Polygon", + "type": "object", + "required": ["type", "coordinates"], + "properties": { + "type": { + "type": "string", + "enum": ["Polygon"] + }, + "coordinates": { + "type": "array", + "items": { + "type": "array", + "minItems": 4, + "items": { + "type": "array", + "minItems": 2, + "items": { + "type": "number" + } + } + } + }, + "bbox": { + "type": "array", + "minItems": 4, + "items": { + "type": "number" + } + } + } + }, + { + "title": "GeoJSON MultiPoint", + "type": "object", + "required": ["type", "coordinates"], + "properties": { + "type": { + "type": "string", + "enum": ["MultiPoint"] + }, + "coordinates": { + "type": "array", + "items": { + "type": "array", + "minItems": 2, + "items": { + "type": "number" + } + } + }, + "bbox": { + "type": "array", + "minItems": 4, + "items": { + "type": "number" + } + } + } + }, + { + "title": "GeoJSON MultiLineString", + "type": "object", + "required": ["type", "coordinates"], + "properties": { + "type": { + "type": "string", + "enum": ["MultiLineString"] + }, + "coordinates": { + "type": "array", + "items": { + "type": "array", + "minItems": 2, + "items": { + "type": "array", + "minItems": 2, + "items": { + "type": "number" + } + } + } + }, + "bbox": { + "type": "array", + "minItems": 4, + "items": { + "type": "number" + } + } + } + }, + { + "title": "GeoJSON MultiPolygon", + "type": "object", + "required": ["type", "coordinates"], + "properties": { + "type": { + "type": "string", + "enum": ["MultiPolygon"] + }, + "coordinates": { + "type": "array", + "items": { + "type": "array", + "items": { + "type": "array", + "minItems": 4, + "items": { + "type": "array", + "minItems": 2, + "items": { + "type": "number" + } + } + } + } + }, + "bbox": { + "type": "array", + "minItems": 4, + "items": { + "type": "number" + } + } + } + } + ] + } + }, + "bbox": { + "type": "array", + "minItems": 4, + "items": { + "type": "number" + } + } + } + }, + { + "title": "GeoJSON Feature", + "type": "object", + "required": ["type", "properties", "geometry"], + "properties": { + "type": { + "type": "string", + "enum": ["Feature"] + }, + "id": { + "oneOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + "properties": { + "oneOf": [ + { + "type": "null" + }, + { + "type": "object" + } + ] + }, + "geometry": { + "oneOf": [ + { + "type": "null" + }, + { + "title": "GeoJSON Point", + "type": "object", + "required": ["type", "coordinates"], + "properties": { + "type": { + "type": "string", + "enum": ["Point"] + }, + "coordinates": { + "type": "array", + "minItems": 2, + "items": { + "type": "number" + } + }, + "bbox": { + "type": "array", + "minItems": 4, + "items": { + "type": "number" + } + } + } + }, + { + "title": "GeoJSON LineString", + "type": "object", + "required": ["type", "coordinates"], + "properties": { + "type": { + "type": "string", + "enum": ["LineString"] + }, + "coordinates": { + "type": "array", + "minItems": 2, + "items": { + "type": "array", + "minItems": 2, + "items": { + "type": "number" + } + } + }, + "bbox": { + "type": "array", + "minItems": 4, + "items": { + "type": "number" + } + } + } + }, + { + "title": "GeoJSON Polygon", + "type": "object", + "required": ["type", "coordinates"], + "properties": { + "type": { + "type": "string", + "enum": ["Polygon"] + }, + "coordinates": { + "type": "array", + "items": { + "type": "array", + "minItems": 4, + "items": { + "type": "array", + "minItems": 2, + "items": { + "type": "number" + } + } + } + }, + "bbox": { + "type": "array", + "minItems": 4, + "items": { + "type": "number" + } + } + } + }, + { + "title": "GeoJSON MultiPoint", + "type": "object", + "required": ["type", "coordinates"], + "properties": { + "type": { + "type": "string", + "enum": ["MultiPoint"] + }, + "coordinates": { + "type": "array", + "items": { + "type": "array", + "minItems": 2, + "items": { + "type": "number" + } + } + }, + "bbox": { + "type": "array", + "minItems": 4, + "items": { + "type": "number" + } + } + } + }, + { + "title": "GeoJSON MultiLineString", + "type": "object", + "required": ["type", "coordinates"], + "properties": { + "type": { + "type": "string", + "enum": ["MultiLineString"] + }, + "coordinates": { + "type": "array", + "items": { + "type": "array", + "minItems": 2, + "items": { + "type": "array", + "minItems": 2, + "items": { + "type": "number" + } + } + } + }, + "bbox": { + "type": "array", + "minItems": 4, + "items": { + "type": "number" + } + } + } + }, + { + "title": "GeoJSON MultiPolygon", + "type": "object", + "required": ["type", "coordinates"], + "properties": { + "type": { + "type": "string", + "enum": ["MultiPolygon"] + }, + "coordinates": { + "type": "array", + "items": { + "type": "array", + "items": { + "type": "array", + "minItems": 4, + "items": { + "type": "array", + "minItems": 2, + "items": { + "type": "number" + } + } + } + } + }, + "bbox": { + "type": "array", + "minItems": 4, + "items": { + "type": "number" + } + } + } + }, + { + "title": "GeoJSON GeometryCollection", + "type": "object", + "required": ["type", "geometries"], + "properties": { + "type": { + "type": "string", + "enum": ["GeometryCollection"] + }, + "geometries": { + "type": "array", + "items": { + "oneOf": [ + { + "title": "GeoJSON Point", + "type": "object", + "required": ["type", "coordinates"], + "properties": { + "type": { + "type": "string", + "enum": ["Point"] + }, + "coordinates": { + "type": "array", + "minItems": 2, + "items": { + "type": "number" + } + }, + "bbox": { + "type": "array", + "minItems": 4, + "items": { + "type": "number" + } + } + } + }, + { + "title": "GeoJSON LineString", + "type": "object", + "required": ["type", "coordinates"], + "properties": { + "type": { + "type": "string", + "enum": ["LineString"] + }, + "coordinates": { + "type": "array", + "minItems": 2, + "items": { + "type": "array", + "minItems": 2, + "items": { + "type": "number" + } + } + }, + "bbox": { + "type": "array", + "minItems": 4, + "items": { + "type": "number" + } + } + } + }, + { + "title": "GeoJSON Polygon", + "type": "object", + "required": ["type", "coordinates"], + "properties": { + "type": { + "type": "string", + "enum": ["Polygon"] + }, + "coordinates": { + "type": "array", + "items": { + "type": "array", + "minItems": 4, + "items": { + "type": "array", + "minItems": 2, + "items": { + "type": "number" + } + } + } + }, + "bbox": { + "type": "array", + "minItems": 4, + "items": { + "type": "number" + } + } + } + }, + { + "title": "GeoJSON MultiPoint", + "type": "object", + "required": ["type", "coordinates"], + "properties": { + "type": { + "type": "string", + "enum": ["MultiPoint"] + }, + "coordinates": { + "type": "array", + "items": { + "type": "array", + "minItems": 2, + "items": { + "type": "number" + } + } + }, + "bbox": { + "type": "array", + "minItems": 4, + "items": { + "type": "number" + } + } + } + }, + { + "title": "GeoJSON MultiLineString", + "type": "object", + "required": ["type", "coordinates"], + "properties": { + "type": { + "type": "string", + "enum": ["MultiLineString"] + }, + "coordinates": { + "type": "array", + "items": { + "type": "array", + "minItems": 2, + "items": { + "type": "array", + "minItems": 2, + "items": { + "type": "number" + } + } + } + }, + "bbox": { + "type": "array", + "minItems": 4, + "items": { + "type": "number" + } + } + } + }, + { + "title": "GeoJSON MultiPolygon", + "type": "object", + "required": ["type", "coordinates"], + "properties": { + "type": { + "type": "string", + "enum": ["MultiPolygon"] + }, + "coordinates": { + "type": "array", + "items": { + "type": "array", + "items": { + "type": "array", + "minItems": 4, + "items": { + "type": "array", + "minItems": 2, + "items": { + "type": "number" + } + } + } + } + }, + "bbox": { + "type": "array", + "minItems": 4, + "items": { + "type": "number" + } + } + } + } + ] + } + }, + "bbox": { + "type": "array", + "minItems": 4, + "items": { + "type": "number" + } + } + } + } + ] + }, + "bbox": { + "type": "array", + "minItems": 4, + "items": { + "type": "number" + } + } + } + }, + { + "title": "GeoJSON FeatureCollection", + "type": "object", + "required": ["type", "features"], + "properties": { + "type": { + "type": "string", + "enum": ["FeatureCollection"] + }, + "features": { + "type": "array", + "items": { + "title": "GeoJSON Feature", + "type": "object", + "required": ["type", "properties", "geometry"], + "properties": { + "type": { + "type": "string", + "enum": ["Feature"] + }, + "id": { + "oneOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + "properties": { + "oneOf": [ + { + "type": "null" + }, + { + "type": "object" + } + ] + }, + "geometry": { + "oneOf": [ + { + "type": "null" + }, + { + "title": "GeoJSON Point", + "type": "object", + "required": ["type", "coordinates"], + "properties": { + "type": { + "type": "string", + "enum": ["Point"] + }, + "coordinates": { + "type": "array", + "minItems": 2, + "items": { + "type": "number" + } + }, + "bbox": { + "type": "array", + "minItems": 4, + "items": { + "type": "number" + } + } + } + }, + { + "title": "GeoJSON LineString", + "type": "object", + "required": ["type", "coordinates"], + "properties": { + "type": { + "type": "string", + "enum": ["LineString"] + }, + "coordinates": { + "type": "array", + "minItems": 2, + "items": { + "type": "array", + "minItems": 2, + "items": { + "type": "number" + } + } + }, + "bbox": { + "type": "array", + "minItems": 4, + "items": { + "type": "number" + } + } + } + }, + { + "title": "GeoJSON Polygon", + "type": "object", + "required": ["type", "coordinates"], + "properties": { + "type": { + "type": "string", + "enum": ["Polygon"] + }, + "coordinates": { + "type": "array", + "items": { + "type": "array", + "minItems": 4, + "items": { + "type": "array", + "minItems": 2, + "items": { + "type": "number" + } + } + } + }, + "bbox": { + "type": "array", + "minItems": 4, + "items": { + "type": "number" + } + } + } + }, + { + "title": "GeoJSON MultiPoint", + "type": "object", + "required": ["type", "coordinates"], + "properties": { + "type": { + "type": "string", + "enum": ["MultiPoint"] + }, + "coordinates": { + "type": "array", + "items": { + "type": "array", + "minItems": 2, + "items": { + "type": "number" + } + } + }, + "bbox": { + "type": "array", + "minItems": 4, + "items": { + "type": "number" + } + } + } + }, + { + "title": "GeoJSON MultiLineString", + "type": "object", + "required": ["type", "coordinates"], + "properties": { + "type": { + "type": "string", + "enum": ["MultiLineString"] + }, + "coordinates": { + "type": "array", + "items": { + "type": "array", + "minItems": 2, + "items": { + "type": "array", + "minItems": 2, + "items": { + "type": "number" + } + } + } + }, + "bbox": { + "type": "array", + "minItems": 4, + "items": { + "type": "number" + } + } + } + }, + { + "title": "GeoJSON MultiPolygon", + "type": "object", + "required": ["type", "coordinates"], + "properties": { + "type": { + "type": "string", + "enum": ["MultiPolygon"] + }, + "coordinates": { + "type": "array", + "items": { + "type": "array", + "items": { + "type": "array", + "minItems": 4, + "items": { + "type": "array", + "minItems": 2, + "items": { + "type": "number" + } + } + } + } + }, + "bbox": { + "type": "array", + "minItems": 4, + "items": { + "type": "number" + } + } + } + }, + { + "title": "GeoJSON GeometryCollection", + "type": "object", + "required": ["type", "geometries"], + "properties": { + "type": { + "type": "string", + "enum": ["GeometryCollection"] + }, + "geometries": { + "type": "array", + "items": { + "oneOf": [ + { + "title": "GeoJSON Point", + "type": "object", + "required": ["type", "coordinates"], + "properties": { + "type": { + "type": "string", + "enum": ["Point"] + }, + "coordinates": { + "type": "array", + "minItems": 2, + "items": { + "type": "number" + } + }, + "bbox": { + "type": "array", + "minItems": 4, + "items": { + "type": "number" + } + } + } + }, + { + "title": "GeoJSON LineString", + "type": "object", + "required": ["type", "coordinates"], + "properties": { + "type": { + "type": "string", + "enum": ["LineString"] + }, + "coordinates": { + "type": "array", + "minItems": 2, + "items": { + "type": "array", + "minItems": 2, + "items": { + "type": "number" + } + } + }, + "bbox": { + "type": "array", + "minItems": 4, + "items": { + "type": "number" + } + } + } + }, + { + "title": "GeoJSON Polygon", + "type": "object", + "required": ["type", "coordinates"], + "properties": { + "type": { + "type": "string", + "enum": ["Polygon"] + }, + "coordinates": { + "type": "array", + "items": { + "type": "array", + "minItems": 4, + "items": { + "type": "array", + "minItems": 2, + "items": { + "type": "number" + } + } + } + }, + "bbox": { + "type": "array", + "minItems": 4, + "items": { + "type": "number" + } + } + } + }, + { + "title": "GeoJSON MultiPoint", + "type": "object", + "required": ["type", "coordinates"], + "properties": { + "type": { + "type": "string", + "enum": ["MultiPoint"] + }, + "coordinates": { + "type": "array", + "items": { + "type": "array", + "minItems": 2, + "items": { + "type": "number" + } + } + }, + "bbox": { + "type": "array", + "minItems": 4, + "items": { + "type": "number" + } + } + } + }, + { + "title": "GeoJSON MultiLineString", + "type": "object", + "required": ["type", "coordinates"], + "properties": { + "type": { + "type": "string", + "enum": ["MultiLineString"] + }, + "coordinates": { + "type": "array", + "items": { + "type": "array", + "minItems": 2, + "items": { + "type": "array", + "minItems": 2, + "items": { + "type": "number" + } + } + } + }, + "bbox": { + "type": "array", + "minItems": 4, + "items": { + "type": "number" + } + } + } + }, + { + "title": "GeoJSON MultiPolygon", + "type": "object", + "required": ["type", "coordinates"], + "properties": { + "type": { + "type": "string", + "enum": ["MultiPolygon"] + }, + "coordinates": { + "type": "array", + "items": { + "type": "array", + "items": { + "type": "array", + "minItems": 4, + "items": { + "type": "array", + "minItems": 2, + "items": { + "type": "number" + } + } + } + } + }, + "bbox": { + "type": "array", + "minItems": 4, + "items": { + "type": "number" + } + } + } + } + ] + } + }, + "bbox": { + "type": "array", + "minItems": 4, + "items": { + "type": "number" + } + } + } + } + ] + }, + "bbox": { + "type": "array", + "minItems": 4, + "items": { + "type": "number" + } + } + } + } + }, + "bbox": { + "type": "array", + "minItems": 4, + "items": { + "type": "number" + } + } + } + } + ] +} diff --git a/app/services/geojson_service.rb b/app/services/geojson_service.rb index 15438719369..d23bc9e97be 100644 --- a/app/services/geojson_service.rb +++ b/app/services/geojson_service.rb @@ -1,4 +1,9 @@ class GeojsonService + def self.valid?(json) + schemer = JSONSchemer.schema(Rails.root.join('app/schemas/geojson.json')) + schemer.valid?(json) + end + def self.to_json_polygon_for_cadastre(coordinates) polygon = { geom: { diff --git a/app/validators/geo_json_validator.rb b/app/validators/geo_json_validator.rb index 085d0225ea3..ed55e8326d0 100644 --- a/app/validators/geo_json_validator.rb +++ b/app/validators/geo_json_validator.rb @@ -4,9 +4,7 @@ def validate_each(record, attribute, value) record.errors.add(attribute, :blank, message: options[:message] || "ne peut pas être vide") end - begin - RGeo::GeoJSON.decode(value.to_json, geo_factory: RGeo::Geographic.simple_mercator_factory) - rescue RGeo::Error::InvalidGeometry + unless value.blank? || GeojsonService.valid?(value) record.errors.add(attribute, :invalid_geometry, message: options[:message] || "n'est pas un GeoJSON valide") end end diff --git a/lib/tasks/deployment/20230215100231_normalize_geometries.rake b/lib/tasks/deployment/20230215100231_normalize_geometries.rake deleted file mode 100644 index 275e37169fa..00000000000 --- a/lib/tasks/deployment/20230215100231_normalize_geometries.rake +++ /dev/null @@ -1,19 +0,0 @@ -namespace :after_party do - desc 'Deployment task: normalize_geometries' - task normalize_geometries: :environment do - puts "Running deploy task 'normalize_geometries'" - - progress = ProgressReport.new(GeoArea.count) - GeoArea.in_batches(of: 100) do |geo_areas| - ids = geo_areas.ids - Migrations::NormalizeGeoAreaJob.perform_later(ids) - progress.inc(ids.size) - end - progress.finish - - # Update task as completed. If you remove the line below, the task will - # run with every deploy (or every time you call after_party:run). - AfterParty::TaskRecord - .create version: AfterParty::TaskRecorder.new(__FILE__).timestamp - end -end diff --git a/spec/controllers/champs/carte_controller_spec.rb b/spec/controllers/champs/carte_controller_spec.rb index 6b0c90cede2..0e0d86657a1 100644 --- a/spec/controllers/champs/carte_controller_spec.rb +++ b/spec/controllers/champs/carte_controller_spec.rb @@ -46,7 +46,7 @@ end context 'error' do - let(:feature) { attributes_for(:geo_area, :invalid_right_hand_rule_polygon) } + let(:feature) { attributes_for(:geo_area, :invalid_point) } let(:params) do { champ_id: champ.id, @@ -92,7 +92,7 @@ end context 'error' do - let(:feature) { attributes_for(:geo_area, :invalid_right_hand_rule_polygon) } + let(:feature) { attributes_for(:geo_area, :invalid_point) } it { expect(response.status).to eq 422 } end diff --git a/spec/factories/geo_area.rb b/spec/factories/geo_area.rb index 457f88884d8..5dc7369c5de 100644 --- a/spec/factories/geo_area.rb +++ b/spec/factories/geo_area.rb @@ -116,6 +116,15 @@ end end + trait :invalid_point do + geometry do + { + "type": "Point", + "coordinates": [46.538476837725796] + } + end + end + trait :multi_polygon do geometry do { diff --git a/spec/models/geo_area_spec.rb b/spec/models/geo_area_spec.rb index aa9f037f44b..c592717d1b0 100644 --- a/spec/models/geo_area_spec.rb +++ b/spec/models/geo_area_spec.rb @@ -23,36 +23,6 @@ it { expect(geo_area.location).to eq("46°32'19\"N 2°25'42\"E") } end - describe '#geometry' do - let(:geo_area) { build(:geo_area, :polygon, champ: nil) } - let(:polygon) do - { - "type" => "Polygon", - "coordinates" => [ - [ - [2.428439855575562, 46.538476837725796], - [2.4284291267395024, 46.53842148758162], - [2.4282521009445195, 46.53841410755813], - [2.42824137210846, 46.53847314771794], - [2.428284287452698, 46.53847314771794], - [2.428364753723145, 46.538487907747864], - [2.4284291267395024, 46.538491597754714], - [2.428439855575562, 46.538476837725796] - ] - ] - } - end - - it { expect(geo_area.geometry).to eq(polygon) } - - context 'polygon_with_extra_coordinate' do - let(:geo_area) { build(:geo_area, :polygon_with_extra_coordinate, champ: nil) } - before { geo_area.valid? } - - it { expect(geo_area.geometry).to eq(polygon) } - end - end - describe 'validations' do context 'geometry' do subject! { geo_area.validate } @@ -62,11 +32,6 @@ it { expect(geo_area.errors).not_to have_key(:geometry) } end - context 'hourglass_polygon' do - let(:geo_area) { build(:geo_area, :hourglass_polygon, champ: nil) } - it { expect(geo_area.errors).to have_key(:geometry) } - end - context 'line_string' do let(:geo_area) { build(:geo_area, :line_string, champ: nil) } it { expect(geo_area.errors).not_to have_key(:geometry) } @@ -77,9 +42,9 @@ it { expect(geo_area.errors).not_to have_key(:geometry) } end - context 'invalid_right_hand_rule_polygon' do - let(:geo_area) { build(:geo_area, :invalid_right_hand_rule_polygon, champ: nil) } - it { expect(geo_area.errors).to have_key(:geometry) } + context "allow empty {}" do + let(:geo_area) { build(:geo_area, geometry: {}) } + it { expect(geo_area.errors).not_to have_key(:geometry) } end context "nil" do @@ -87,9 +52,19 @@ it { expect(geo_area.errors).to have_key(:geometry) } end - context "allow empty {}" do - let(:geo_area) { build(:geo_area, geometry: {}) } - it { expect(geo_area.errors).not_to have_key(:geometry) } + context 'invalid point' do + let(:geo_area) { build(:geo_area, :invalid_point, champ: nil) } + it { expect(geo_area.errors).to have_key(:geometry) } + end + + context.skip 'invalid_right_hand_rule_polygon' do + let(:geo_area) { build(:geo_area, :invalid_right_hand_rule_polygon, champ: nil) } + it { expect(geo_area.errors).to have_key(:geometry) } + end + + context.skip 'hourglass_polygon' do + let(:geo_area) { build(:geo_area, :hourglass_polygon, champ: nil) } + it { expect(geo_area.errors).to have_key(:geometry) } end end end From 650e1ca118a90bb134e7d7374c8d6436f9cd214c Mon Sep 17 00:00:00 2001 From: simon lehericey Date: Mon, 5 Jun 2023 17:43:48 +0200 Subject: [PATCH 08/41] wording: affichage au clique -> au clic --- .../revision_changes_component.fr.yml | 16 ++++++++-------- .../champ_component/champ_component.html.haml | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/app/components/procedure/revision_changes_component/revision_changes_component.fr.yml b/app/components/procedure/revision_changes_component/revision_changes_component.fr.yml index 6fb5a8df548..35fa2ef65b9 100644 --- a/app/components/procedure/revision_changes_component/revision_changes_component.fr.yml +++ b/app/components/procedure/revision_changes_component/revision_changes_component.fr.yml @@ -30,10 +30,10 @@ fr: enable_drop_down_other: Le champ « %{label} » comporte maintenant un choix « Autre ». disable_drop_down_other: Le champ « %{label} » ne comporte plus de choix « Autre ». update_carte_layers: "Les référentiels cartographiques du champ « %{label} » ont été modifiés :" - enable_update_collapsible_explanation: Le texte complementaire affichable au clique du champ « %{label} » a été ajouté. - disable_update_collapsible_explanation: Le texte complementaire affichable au clique du champ « %{label} » a été supprimée. - update_collapsible_explanation_text: Le texte complementaire affichable au clique du champ « %{label} » a été modifié. Le nouveau texte est « %{to} ». - remove_collapsible_explanation_text: Le texte complementaire affichable au clique du champ « %{label} » a été supprimée. + enable_update_collapsible_explanation: Le texte complementaire affichable au clic du champ « %{label} » a été ajouté. + disable_update_collapsible_explanation: Le texte complementaire affichable au clic du champ « %{label} » a été supprimée. + update_collapsible_explanation_text: Le texte complementaire affichable au clic du champ « %{label} » a été modifié. Le nouveau texte est « %{to} ». + remove_collapsible_explanation_text: Le texte complementaire affichable au clic du champ « %{label} » a été supprimée. add_condition: Une condition a été ajoutée sur le champ « %{label} ». La nouvelle condition est « %{to} ». remove_condition: La condition du champ « %{label} » a été supprimée. update_condition: La condition du champ « %{label} » a été modifiée. La nouvelle condition est « %{to} ». @@ -56,10 +56,10 @@ fr: update_carte_layers: "Les référentiels cartographiques de l’annotation privée « %{label} » ont été modifiés :" enable_drop_down_other: L’annotation privée « %{label} » comporte maintenant un choix « Autre ». disable_drop_down_other: L’annotation privée « %{label} » ne comporte plus de choix « Autre ». - enable_collapsible_explanation: Le texte complementaire affichable au clique de l’annotation privée « %{label} » a été ajouté. - disable_collapsible_explanation: Le texte complementaire affichable au clique de l’annotation privée « %{label} » a été supprimée. - update_collapsible_explanation: Le texte complementaire affichable au clique de l’annotation privée « %{label} » a été modifié. Le nouveau texte est « %{to} ». - remove_collapsible_explanation: Le texte complementaire affichable au clique de l’annotation privée « %{label} » a été supprimée. + enable_collapsible_explanation: Le texte complementaire affichable au clic de l’annotation privée « %{label} » a été ajouté. + disable_collapsible_explanation: Le texte complementaire affichable au clic de l’annotation privée « %{label} » a été supprimée. + update_collapsible_explanation: Le texte complementaire affichable au clic de l’annotation privée « %{label} » a été modifié. Le nouveau texte est « %{to} ». + remove_collapsible_explanation: Le texte complementaire affichable au clic de l’annotation privée « %{label} » a été supprimée. add_condition: Une condition a été ajoutée sur l’annotation privée « %{label} ». La nouvelle condition est « %{to} ». remove_condition: La condition de l’annotation privée « %{label} » a été supprimée. update_condition: La condition de l’annotation privée « %{label} » a été modifiée. La nouvelle condition est « %{to} ». diff --git a/app/components/types_de_champ_editor/champ_component/champ_component.html.haml b/app/components/types_de_champ_editor/champ_component/champ_component.html.haml index 206243564ed..b2dd9f91bad 100644 --- a/app/components/types_de_champ_editor/champ_component/champ_component.html.haml +++ b/app/components/types_de_champ_editor/champ_component/champ_component.html.haml @@ -95,7 +95,7 @@ - if type_de_champ.explication? .cell.width-66 = form.label :collapsible_explanation_enabled, for: dom_id(type_de_champ, :collapsible_explanation_enabled) do - Afficher un texte complementaire affichable au clique + Afficher un texte complementaire affichable au clic = form.check_box :collapsible_explanation_enabled, class: "small-margin small", id: dom_id(type_de_champ, :collapsible_explanation_enabled) - if form.object.collapsible_explanation_enabled? = form.label :collapsible_explanation_text, for: dom_id(type_de_champ, :collapsible_explanation_text) do From 0a72596bcee7e6333e17040c22e8c79b9706401d Mon Sep 17 00:00:00 2001 From: simon lehericey Date: Tue, 6 Jun 2023 16:07:02 +0200 Subject: [PATCH 09/41] =?UTF-8?q?wording:=20complementaire=20->=20compl?= =?UTF-8?q?=C3=A9mentaire,=20supprim=C3=A9e=20->=20supprim=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../revision_changes_component.fr.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/app/components/procedure/revision_changes_component/revision_changes_component.fr.yml b/app/components/procedure/revision_changes_component/revision_changes_component.fr.yml index 35fa2ef65b9..cd7dcb4e07e 100644 --- a/app/components/procedure/revision_changes_component/revision_changes_component.fr.yml +++ b/app/components/procedure/revision_changes_component/revision_changes_component.fr.yml @@ -30,10 +30,10 @@ fr: enable_drop_down_other: Le champ « %{label} » comporte maintenant un choix « Autre ». disable_drop_down_other: Le champ « %{label} » ne comporte plus de choix « Autre ». update_carte_layers: "Les référentiels cartographiques du champ « %{label} » ont été modifiés :" - enable_update_collapsible_explanation: Le texte complementaire affichable au clic du champ « %{label} » a été ajouté. - disable_update_collapsible_explanation: Le texte complementaire affichable au clic du champ « %{label} » a été supprimée. - update_collapsible_explanation_text: Le texte complementaire affichable au clic du champ « %{label} » a été modifié. Le nouveau texte est « %{to} ». - remove_collapsible_explanation_text: Le texte complementaire affichable au clic du champ « %{label} » a été supprimée. + enable_update_collapsible_explanation: Le texte complémentaire affichable au clic du champ « %{label} » a été ajouté. + disable_update_collapsible_explanation: Le texte complémentaire affichable au clic du champ « %{label} » a été supprimé. + update_collapsible_explanation_text: Le texte complémentaire affichable au clic du champ « %{label} » a été modifié. Le nouveau texte est « %{to} ». + remove_collapsible_explanation_text: Le texte complémentaire affichable au clic du champ « %{label} » a été supprimé. add_condition: Une condition a été ajoutée sur le champ « %{label} ». La nouvelle condition est « %{to} ». remove_condition: La condition du champ « %{label} » a été supprimée. update_condition: La condition du champ « %{label} » a été modifiée. La nouvelle condition est « %{to} ». @@ -56,10 +56,10 @@ fr: update_carte_layers: "Les référentiels cartographiques de l’annotation privée « %{label} » ont été modifiés :" enable_drop_down_other: L’annotation privée « %{label} » comporte maintenant un choix « Autre ». disable_drop_down_other: L’annotation privée « %{label} » ne comporte plus de choix « Autre ». - enable_collapsible_explanation: Le texte complementaire affichable au clic de l’annotation privée « %{label} » a été ajouté. - disable_collapsible_explanation: Le texte complementaire affichable au clic de l’annotation privée « %{label} » a été supprimée. - update_collapsible_explanation: Le texte complementaire affichable au clic de l’annotation privée « %{label} » a été modifié. Le nouveau texte est « %{to} ». - remove_collapsible_explanation: Le texte complementaire affichable au clic de l’annotation privée « %{label} » a été supprimée. + enable_collapsible_explanation: Le texte complémentaire affichable au clic de l’annotation privée « %{label} » a été ajouté. + disable_collapsible_explanation: Le texte complémentaire affichable au clic de l’annotation privée « %{label} » a été supprimé. + update_collapsible_explanation: Le texte complémentaire affichable au clic de l’annotation privée « %{label} » a été modifié. Le nouveau texte est « %{to} ». + remove_collapsible_explanation: Le texte complémentaire affichable au clic de l’annotation privée « %{label} » a été supprimé. add_condition: Une condition a été ajoutée sur l’annotation privée « %{label} ». La nouvelle condition est « %{to} ». remove_condition: La condition de l’annotation privée « %{label} » a été supprimée. update_condition: La condition de l’annotation privée « %{label} » a été modifiée. La nouvelle condition est « %{to} ». From 6945b3f438d60c6095c44d0c36fca4087e6df897 Mon Sep 17 00:00:00 2001 From: Paul Chavard Date: Tue, 6 Jun 2023 15:54:03 +0200 Subject: [PATCH 10/41] fix(carte): no autosave on champ carte --- .../editable_champ/editable_champ_component.rb | 6 +++++- app/javascript/components/MapEditor/hooks.ts | 16 +++++++++++----- .../controllers/geo_area_controller.tsx | 2 +- .../editable_champ_component_spec.rb | 6 ++++++ 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/app/components/editable_champ/editable_champ_component.rb b/app/components/editable_champ/editable_champ_component.rb index d0cde546135..f2051df8a7f 100644 --- a/app/components/editable_champ/editable_champ_component.rb +++ b/app/components/editable_champ/editable_champ_component.rb @@ -30,7 +30,7 @@ def html_options end def stimulus_controller - if !@champ.block? && @champ.fillable? + if autosave_enabled? # This is an editable champ. Lets find what controllers it might need. controllers = ['autosave'] @@ -45,4 +45,8 @@ def data_dependent_conditions {} end end + + def autosave_enabled? + !@champ.carte? && !@champ.block? && @champ.fillable? + end end diff --git a/app/javascript/components/MapEditor/hooks.ts b/app/javascript/components/MapEditor/hooks.ts index a20391c96bd..eae70cb521e 100644 --- a/app/javascript/components/MapEditor/hooks.ts +++ b/app/javascript/components/MapEditor/hooks.ts @@ -29,6 +29,12 @@ export function useFeatureCollection( const [featureCollection, setFeatureCollection] = useState( initialFeatureCollection ); + const refreshFeatureList = useCallback<() => void>(() => { + httpRequest(url) + .turbo() + .catch(() => null); + }, [url]); + const updateFeatureCollection = useCallback< (callback: (features: Feature[]) => Feature[]) => void >( @@ -37,11 +43,9 @@ export function useFeatureCollection( type: 'FeatureCollection', features: callback(features) })); - httpRequest(url) - .turbo() - .catch(() => null); + refreshFeatureList(); }, - [url, setFeatureCollection] + [refreshFeatureList, setFeatureCollection] ); const addFeatures = useCallback( @@ -153,13 +157,15 @@ export function useFeatureCollection( if (newFeatures.length > 0) { addFeatures(newFeatures, external); updateFeatureCollection((features) => [...features, ...newFeatures]); + } else { + refreshFeatureList(); } } catch (error) { console.error(error); onError('Le polygone dessiné n’est pas valide.'); } }, - [url, updateFeatureCollection, addFeatures, onError] + [url, refreshFeatureList, updateFeatureCollection, addFeatures, onError] ); const deleteFeatures = useCallback( diff --git a/app/javascript/controllers/geo_area_controller.tsx b/app/javascript/controllers/geo_area_controller.tsx index fd73a236e9f..d5d82da054f 100644 --- a/app/javascript/controllers/geo_area_controller.tsx +++ b/app/javascript/controllers/geo_area_controller.tsx @@ -19,7 +19,7 @@ export class GeoAreaController extends ApplicationController { } onInput() { - this.debounce(this.updateDescription, 200); + this.debounce(this.updateDescription, 500); } private updateDescription(): void { diff --git a/spec/components/editable_champ/editable_champ_component_spec.rb b/spec/components/editable_champ/editable_champ_component_spec.rb index de9250670dd..5aa862ba643 100644 --- a/spec/components/editable_champ/editable_champ_component_spec.rb +++ b/spec/components/editable_champ/editable_champ_component_spec.rb @@ -21,6 +21,12 @@ it { expect(subject).to eq(nil) } end + context 'when a carte champ' do + let(:champ) { create(:champ_carte, dossier: dossier) } + + it { expect(subject).to eq(nil) } + end + context 'when a private champ' do let(:champ) { create(:champ, dossier: dossier, private: true) } From 9cb82ba6f86c496f6a6ab9b49957db964bea4ac2 Mon Sep 17 00:00:00 2001 From: Eric Leroy-Terquem Date: Mon, 5 Jun 2023 12:18:07 +0200 Subject: [PATCH 11/41] feat(groupes instructeurs): add dossiers count in index --- .../groupes_management_component.html.haml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/components/procedure/groupes_management_component/groupes_management_component.html.haml b/app/components/procedure/groupes_management_component/groupes_management_component.html.haml index d98152d1dcd..64719d0a9b8 100644 --- a/app/components/procedure/groupes_management_component/groupes_management_component.html.haml +++ b/app/components/procedure/groupes_management_component/groupes_management_component.html.haml @@ -11,7 +11,6 @@ %th{ scope: "col" } .flex .flex.auto= table_header - %span.fr-icon.fr-icon-user-line %tbody - @groupe_instructeurs.each do |gi| %tr @@ -25,9 +24,15 @@ - elsif gi.routing_to_configure? %p.fr-badge.fr-badge--warning.fr-badge--sm.fr-ml-1w à configurer - %div{ style: 'width: 25px; text-align: center;' } + %span.fr-mr-1w + #{gi.dossiers.visible_by_administration.size} + %span.fr-icon.fr-icon-folder-2-line.fr-mr-2w{ style: 'width: 25px; text-align: center;' } + %span.fr-mr-1w #{gi.instructeurs.count} + %span.fr-icon.fr-icon-user-line{ style: 'width: 25px; text-align: center;' } + %p= gi.routing_rule&.to_s(@procedure.active_revision.types_de_champ) + .fr-mt-1w = paginate @groupe_instructeurs From b8ba41472487d34e8220d3c2c5fb3b7204462973 Mon Sep 17 00:00:00 2001 From: Eric Leroy-Terquem Date: Mon, 5 Jun 2023 12:25:56 +0200 Subject: [PATCH 12/41] UI(groupe instructeur): do not wrap text --- app/assets/stylesheets/02_utils.scss | 12 ++++++++++++ .../one_groupe_management_component.html.haml | 4 ++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/app/assets/stylesheets/02_utils.scss b/app/assets/stylesheets/02_utils.scss index cad30c22542..6e1a39bf1b1 100644 --- a/app/assets/stylesheets/02_utils.scss +++ b/app/assets/stylesheets/02_utils.scss @@ -90,6 +90,18 @@ display: none !important; } +.visible-on-previous-hover { + visibility: hidden; +} + +:hover + .visible-on-previous-hover { + visibility: visible; +} + +.no-wrap { + white-space: nowrap; +} + // sizing .width-100 { width: 100%; diff --git a/app/components/procedure/one_groupe_management_component/one_groupe_management_component.html.haml b/app/components/procedure/one_groupe_management_component/one_groupe_management_component.html.haml index 1cbbd231a3d..b728a894fa7 100644 --- a/app/components/procedure/one_groupe_management_component/one_groupe_management_component.html.haml +++ b/app/components/procedure/one_groupe_management_component/one_groupe_management_component.html.haml @@ -32,10 +32,10 @@ %p.fr-mb-1w.fr-badge.fr-badge--warning.fr-badge--sm à configurer .flex.align-baseline - .fr-mr-2w si le champ + .fr-mr-2w.no-wrap si le champ .target.fr-mr-2w = targeted_champ_tag - .operator.fr-mr-2w est égal à + .operator.fr-mr-2w.no-wrap est égal à .value = value_tag From 22d0aaa298abd0f79c736b08bf7da552d977a5f2 Mon Sep 17 00:00:00 2001 From: Eric Leroy-Terquem Date: Mon, 5 Jun 2023 18:16:51 +0200 Subject: [PATCH 13/41] UI(groupe instructeur): add a confirm modal before deleting --- .../one_groupe_management_component.fr.yml | 2 ++ .../one_groupe_management_component.html.haml | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/app/components/procedure/one_groupe_management_component/one_groupe_management_component.fr.yml b/app/components/procedure/one_groupe_management_component/one_groupe_management_component.fr.yml index cf63e7e03e3..b39822cdd35 100644 --- a/app/components/procedure/one_groupe_management_component/one_groupe_management_component.fr.yml +++ b/app/components/procedure/one_groupe_management_component/one_groupe_management_component.fr.yml @@ -6,3 +6,5 @@ fr: zero: Déplacer les dossiers en brouillon one: Déplacer un dossier other: Déplacer les %{count} dossiers + delete: Supprimer le groupe + delete_confirmation: Êtes-vous sûr de vouloir supprimer le groupe "%{group_name}" ? diff --git a/app/components/procedure/one_groupe_management_component/one_groupe_management_component.html.haml b/app/components/procedure/one_groupe_management_component/one_groupe_management_component.html.haml index b728a894fa7..67231a72db7 100644 --- a/app/components/procedure/one_groupe_management_component/one_groupe_management_component.html.haml +++ b/app/components/procedure/one_groupe_management_component/one_groupe_management_component.html.haml @@ -42,10 +42,11 @@ %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 + %p= t('.delete') = 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 + method: :delete, + data: { confirm: t('.delete_confirmation', group_name: @groupe_instructeur.label) } do Supprimer - else = button_to reaffecter_dossiers_admin_procedure_groupe_instructeur_path(@procedure_id, @groupe_instructeur), From 77c49e079f963c84851ced28eca69c1d3a8a95e6 Mon Sep 17 00:00:00 2001 From: simon lehericey Date: Wed, 7 Jun 2023 10:52:24 +0200 Subject: [PATCH 14/41] use attached --- app/views/shared/_procedure_description.html.haml | 2 +- app/views/shared/dossiers/_edit.html.haml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/shared/_procedure_description.html.haml b/app/views/shared/_procedure_description.html.haml index f6845f28b52..f688155464d 100644 --- a/app/views/shared/_procedure_description.html.haml +++ b/app/views/shared/_procedure_description.html.haml @@ -47,6 +47,6 @@ #accordion-116.fr-collapse.js_description_target_audience = t('shared.procedure_description.estimated_fill_duration_detail', estimated_minutes: estimated_fill_duration_minutes(procedure)) -- if notice_url(procedure).present? +- if procedure.notice.attached? .fr-my-3w = render Dsfr::DownloadComponent.new(attachment: procedure.notice , url: notice_url(procedure), name: t("views.shared.dossiers.edit.notice"), ephemeral_link: administrateur_signed_in?) diff --git a/app/views/shared/dossiers/_edit.html.haml b/app/views/shared/dossiers/_edit.html.haml index f1c5853942f..682a79d3a7d 100644 --- a/app/views/shared/dossiers/_edit.html.haml +++ b/app/views/shared/dossiers/_edit.html.haml @@ -16,7 +16,7 @@ - if dossier.brouillon? = t('views.shared.dossiers.edit.autosave') - - if notice_url(dossier.procedure).present? + - if dossier.procedure.notice.attached? = render Dsfr::DownloadComponent.new(attachment: dossier.procedure.notice , url: notice_url(dossier.procedure), name: t("views.shared.dossiers.edit.notice"), ephemeral_link: administrateur_signed_in?) - if dossier.show_groupe_instructeur_selector? From 61bc59109d369baf2d51d1f4f1b2d44c8a11b8ad Mon Sep 17 00:00:00 2001 From: Colin Darie Date: Thu, 8 Jun 2023 11:16:55 +0200 Subject: [PATCH 15/41] fix(turbo): PJ deletion: turbo: true must be set on button in addition to form --- .../multiple_drop_down_list_component.html.haml | 2 +- .../repetition_component/repetition_component.html.haml | 2 +- .../repetition_row_component/repetition_row_component.html.haml | 2 +- app/components/nested_forms/owned_button_component.rb | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/components/editable_champ/multiple_drop_down_list_component/multiple_drop_down_list_component.html.haml b/app/components/editable_champ/multiple_drop_down_list_component/multiple_drop_down_list_component.html.haml index d1faf35c945..d667b87bcc9 100644 --- a/app/components/editable_champ/multiple_drop_down_list_component/multiple_drop_down_list_component.html.haml +++ b/app/components/editable_champ/multiple_drop_down_list_component/multiple_drop_down_list_component.html.haml @@ -7,7 +7,7 @@ - else %div{ 'data-turbo-focus-group': true } - if @champ.selected_options.present? - .fr-mb-2w{ "data-turbo": "true" } + .fr-mb-2w - @champ.selected_options.each do |option| = render NestedForms::OwnedButtonComponent.new(formaction: champs_options_path(@champ.id, option:), http_method: :delete, opt: { class: 'fr-tag fr-tag--dismiss fr-mb-1w fr-mr-1w', id: @champ.checkbox_id(option) }) do = option diff --git a/app/components/editable_champ/repetition_component/repetition_component.html.haml b/app/components/editable_champ/repetition_component/repetition_component.html.haml index 1a434b96b28..d81bd8f6474 100644 --- a/app/components/editable_champ/repetition_component/repetition_component.html.haml +++ b/app/components/editable_champ/repetition_component/repetition_component.html.haml @@ -8,6 +8,6 @@ - @champ.rows.each do |champs| = render EditableChamp::RepetitionRowComponent.new(form: @form, champ: @champ, row: champs, seen_at: @seen_at) - .actions{ 'data-turbo': 'true' } + .actions = render NestedForms::OwnedButtonComponent.new(formaction: champs_repetition_path(@champ.id), http_method: :create, opt: { class: "fr-btn fr-btn--secondary fr-btn--icon-left fr-icon-add-circle-line fr-mb-3w", title: t(".add_title", libelle: @champ.libelle), id: dom_id(@champ, :create_repetition)}) do = t(".add", libelle: @champ.libelle) diff --git a/app/components/editable_champ/repetition_row_component/repetition_row_component.html.haml b/app/components/editable_champ/repetition_row_component/repetition_row_component.html.haml index addb1c152a2..8b49d0f9937 100644 --- a/app/components/editable_champ/repetition_row_component/repetition_row_component.html.haml +++ b/app/components/editable_champ/repetition_row_component/repetition_row_component.html.haml @@ -7,6 +7,6 @@ - else = render EditableChamp::SectionComponent.new(champs: @row) - .flex.row-reverse{ 'data-turbo': 'true' } + .flex.row-reverse = render NestedForms::OwnedButtonComponent.new(formaction: champs_repetition_path(@champ.id, row_id: @row.first.row_id), http_method: :delete, opt: { class: "fr-btn fr-btn--sm fr-btn--tertiary fr-text-action-high--red-marianne", title: t(".delete_title", row_number: @champ.rows.find_index(@row))}) do = t(".delete") diff --git a/app/components/nested_forms/owned_button_component.rb b/app/components/nested_forms/owned_button_component.rb index d8bfe3d1903..6148ebc2135 100644 --- a/app/components/nested_forms/owned_button_component.rb +++ b/app/components/nested_forms/owned_button_component.rb @@ -8,6 +8,6 @@ def initialize(formaction:, http_method:, opt: {}) end def call - button_tag(content, @opt.merge(formaction: @formaction, form: NestedForms::FormOwnerComponent.form_id(@http_method))) + button_tag(content, @opt.merge(formaction: @formaction, form: NestedForms::FormOwnerComponent.form_id(@http_method), data: { turbo: 'true' })) end end From c9bb4dc38e727121a8f54febf670ffcdf9651fa5 Mon Sep 17 00:00:00 2001 From: Lisa Durand Date: Thu, 8 Jun 2023 10:43:24 +0200 Subject: [PATCH 16/41] change badge color for dossier status and add icons for succes and instruction --- app/helpers/dossier_helper.rb | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/app/helpers/dossier_helper.rb b/app/helpers/dossier_helper.rb index 81099a16145..1648b663425 100644 --- a/app/helpers/dossier_helper.rb +++ b/app/helpers/dossier_helper.rb @@ -62,14 +62,14 @@ def dossier_legacy_state(dossier) def class_badge_state(state) case state - when Dossier.states.fetch(:en_construction), Dossier.states.fetch(:en_instruction) - 'fr-badge--info' + when Dossier.states.fetch(:en_construction) + 'fr-badge--purple-glycine' + when Dossier.states.fetch(:en_instruction) + 'fr-badge--new' when Dossier.states.fetch(:accepte) 'fr-badge--success' - when Dossier.states.fetch(:refuse) + when Dossier.states.fetch(:refuse), Dossier.states.fetch(:sans_suite) 'fr-badge--warning' - when Dossier.states.fetch(:sans_suite) - 'fr-badge--new' when Dossier.states.fetch(:brouillon) '' else @@ -79,7 +79,11 @@ def class_badge_state(state) def status_badge(state, alignment_class = '') status_text = dossier_display_state(state, lower: true) - tag.span(status_text, class: "fr-badge fr-badge--sm #{class_badge_state(state)} fr-badge--no-icon #{alignment_class}", role: 'status') + if [Dossier.states.fetch(:en_instruction), Dossier.states.fetch(:accepte)].include?(state) + tag.span(status_text, class: "fr-badge fr-badge--sm #{class_badge_state(state)} #{alignment_class}", role: 'status') + else + tag.span(status_text, class: "fr-badge fr-badge--sm #{class_badge_state(state)} fr-badge--no-icon #{alignment_class}", role: 'status') + end end def deletion_reason_badge(reason) From 1335a3192c9f669b91c362c70ab55528a7c3c268 Mon Sep 17 00:00:00 2001 From: Lisa Durand Date: Thu, 8 Jun 2023 14:21:51 +0200 Subject: [PATCH 17/41] refacto for better readability Co-authored-by: Colin Darie --- app/helpers/dossier_helper.rb | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/app/helpers/dossier_helper.rb b/app/helpers/dossier_helper.rb index 1648b663425..a4b827d0d02 100644 --- a/app/helpers/dossier_helper.rb +++ b/app/helpers/dossier_helper.rb @@ -79,11 +79,12 @@ def class_badge_state(state) def status_badge(state, alignment_class = '') status_text = dossier_display_state(state, lower: true) - if [Dossier.states.fetch(:en_instruction), Dossier.states.fetch(:accepte)].include?(state) - tag.span(status_text, class: "fr-badge fr-badge--sm #{class_badge_state(state)} #{alignment_class}", role: 'status') - else - tag.span(status_text, class: "fr-badge fr-badge--sm #{class_badge_state(state)} fr-badge--no-icon #{alignment_class}", role: 'status') - end + tag.span status_text, role: 'status', class: class_names( + 'fr-badge fr-badge--sm' => true, + 'fr-badge--no-icon' => [Dossier.states.fetch(:en_instruction), Dossier.states.fetch(:accepte)].include?(state), + class_badge_state(state) => true, + alignment_class => true + ) end def deletion_reason_badge(reason) From a1ace0f17321c78c893f96086a0e01f7c464bcaa Mon Sep 17 00:00:00 2001 From: Lisa Durand Date: Thu, 8 Jun 2023 14:41:42 +0200 Subject: [PATCH 18/41] fix linter --- app/helpers/dossier_helper.rb | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/helpers/dossier_helper.rb b/app/helpers/dossier_helper.rb index a4b827d0d02..218fde5a149 100644 --- a/app/helpers/dossier_helper.rb +++ b/app/helpers/dossier_helper.rb @@ -79,12 +79,12 @@ def class_badge_state(state) def status_badge(state, alignment_class = '') status_text = dossier_display_state(state, lower: true) - tag.span status_text, role: 'status', class: class_names( - 'fr-badge fr-badge--sm' => true, - 'fr-badge--no-icon' => [Dossier.states.fetch(:en_instruction), Dossier.states.fetch(:accepte)].include?(state), - class_badge_state(state) => true, - alignment_class => true - ) + tag.span status_text, role: 'status', class: class_names( + 'fr-badge fr-badge--sm' => true, + 'fr-badge--no-icon' => [Dossier.states.fetch(:en_instruction), Dossier.states.fetch(:accepte)].include?(state), + class_badge_state(state) => true, + alignment_class => true + ) end def deletion_reason_badge(reason) From 75b2685230462ac15d4fec894e7de3586928cc49 Mon Sep 17 00:00:00 2001 From: Colin Darie Date: Thu, 8 Jun 2023 19:01:23 +0200 Subject: [PATCH 19/41] fix(instructeurs): human format a filtered date --- app/models/procedure_presentation.rb | 14 ++++++++++++++ spec/models/procedure_presentation_spec.rb | 8 ++++++++ 2 files changed, 22 insertions(+) diff --git a/app/models/procedure_presentation.rb b/app/models/procedure_presentation.rb index 34f194a8d57..42edc7947b0 100644 --- a/app/models/procedure_presentation.rb +++ b/app/models/procedure_presentation.rb @@ -261,10 +261,24 @@ def human_value_for_filter(filter) instructeur.groupe_instructeurs .find { _1.id == filter['value'].to_i }&.label || filter['value'] else + field = find_field(filter[TABLE], filter[COLUMN]) + + if field["type"] == :date + parsed_date = safe_parse_date(filter['value']) + + return parsed_date.present? ? I18n.l(parsed_date) : nil + end + filter['value'] end end + def safe_parse_date(string) + Date.parse(string) + rescue Date::Error + nil + end + def add_filter(statut, field, value) if value.present? table, column = field.split(SLASH) diff --git a/spec/models/procedure_presentation_spec.rb b/spec/models/procedure_presentation_spec.rb index 319c38b2d00..53538ed87d0 100644 --- a/spec/models/procedure_presentation_spec.rb +++ b/spec/models/procedure_presentation_spec.rb @@ -823,6 +823,14 @@ expect(subject).to eq("En construction") end end + + context 'when filter is a date' do + let(:filters) { { "suivis" => [{ "table" => "self", "column" => "en_instruction_at", "value" => "15/06/2023" }] } } + + it 'should get formatted value' do + expect(subject).to eq("15/06/2023") + end + end end describe "#add_filter" do From f85fa08415e0e572b13fd900aabbcf57f422aa20 Mon Sep 17 00:00:00 2001 From: simon lehericey Date: Fri, 9 Jun 2023 11:03:04 +0200 Subject: [PATCH 20/41] fix: sentry use http_proxy if available --- config/initializers/sentry.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/config/initializers/sentry.rb b/config/initializers/sentry.rb index 084cb805e33..473efa285b2 100644 --- a/config/initializers/sentry.rb +++ b/config/initializers/sentry.rb @@ -13,6 +13,10 @@ def self.current Sentry.init do |config| secrets = Rails.application.secrets.sentry + if ENV['http_proxy'].present? + config.transport.proxy = ENV['http_proxy'] + end + config.dsn = secrets[:enabled] ? secrets[:rails_client_key] : nil config.send_default_pii = false config.release = SentryRelease.current From f563e210f37adc22d0487659806ddef1a172b8ea Mon Sep 17 00:00:00 2001 From: Paul Chavard Date: Fri, 9 Jun 2023 16:29:42 +0200 Subject: [PATCH 21/41] refactor(carto): geo area as component --- .../dossiers/geo_area_component.html.haml} | 2 +- app/components/dossiers/geo_area_component.rb | 7 +++++++ .../dossiers/geo_areas_component.html.haml} | 4 ++-- app/components/dossiers/geo_areas_component.rb | 7 +++++++ .../carte_component/carte_component.html.haml | 2 +- app/views/champs/carte/index.turbo_stream.haml | 3 ++- app/views/shared/champs/carte/_show.html.haml | 2 +- 7 files changed, 21 insertions(+), 6 deletions(-) rename app/{views/shared/champs/carte/_geo_area.html.haml => components/dossiers/geo_area_component.html.haml} (91%) create mode 100644 app/components/dossiers/geo_area_component.rb rename app/{views/shared/champs/carte/_geo_areas.html.haml => components/dossiers/geo_areas_component.html.haml} (68%) create mode 100644 app/components/dossiers/geo_areas_component.rb diff --git a/app/views/shared/champs/carte/_geo_area.html.haml b/app/components/dossiers/geo_area_component.html.haml similarity index 91% rename from app/views/shared/champs/carte/_geo_area.html.haml rename to app/components/dossiers/geo_area_component.html.haml index bfab2f8aee8..99e6f8aef57 100644 --- a/app/views/shared/champs/carte/_geo_area.html.haml +++ b/app/components/dossiers/geo_area_component.html.haml @@ -2,7 +2,7 @@ - if editing = link_to '#', data: { action: 'geo-area#onClick' } do = geo_area.label - = text_field_tag :description, geo_area.description, data: { action: 'focus->geo-area#onFocus input->geo-area#onInput', geo_area_target: 'description' }, placeholder: 'Description', class: 'no-margin' + = text_field_tag :description, geo_area.description, data: { action: 'focus->geo-area#onFocus input->geo-area#onInput', geo_area_target: 'description' }, placeholder: 'Description', class: 'no-margin', id: "geo_area_#{geo_area.id}_description" - else = link_to '#', data: { action: 'geo-area#onClick' } do = geo_area.label diff --git a/app/components/dossiers/geo_area_component.rb b/app/components/dossiers/geo_area_component.rb new file mode 100644 index 00000000000..6e004d635c0 --- /dev/null +++ b/app/components/dossiers/geo_area_component.rb @@ -0,0 +1,7 @@ +class Dossiers::GeoAreaComponent < ApplicationComponent + attr_reader :geo_area, :editing + + def initialize(geo_area:, editing:) + @geo_area, @editing = geo_area, editing + end +end diff --git a/app/views/shared/champs/carte/_geo_areas.html.haml b/app/components/dossiers/geo_areas_component.html.haml similarity index 68% rename from app/views/shared/champs/carte/_geo_areas.html.haml rename to app/components/dossiers/geo_areas_component.html.haml index d9de25f331e..52f8168f41d 100644 --- a/app/views/shared/champs/carte/_geo_areas.html.haml +++ b/app/components/dossiers/geo_areas_component.html.haml @@ -3,7 +3,7 @@ .areas %ul - champ.selections_utilisateur.slice(0, 20).each do |geo_area| - = render partial: 'shared/champs/carte/geo_area', locals: { geo_area: geo_area, editing: editing } + = render Dossiers::GeoAreaComponent.new(geo_area:, editing:) - if champ.selections_utilisateur.size > 20 %li %span @@ -14,4 +14,4 @@ .areas %ul - champ.cadastres.each do |geo_area| - = render partial: 'shared/champs/carte/geo_area', locals: { geo_area: geo_area, editing: editing } + = render Dossiers::GeoAreaComponent.new(geo_area:, editing:) diff --git a/app/components/dossiers/geo_areas_component.rb b/app/components/dossiers/geo_areas_component.rb new file mode 100644 index 00000000000..51e0b93abe3 --- /dev/null +++ b/app/components/dossiers/geo_areas_component.rb @@ -0,0 +1,7 @@ +class Dossiers::GeoAreasComponent < ApplicationComponent + attr_reader :champ, :editing + + def initialize(champ:, editing:) + @champ, @editing = champ, editing + end +end diff --git a/app/components/editable_champ/carte_component/carte_component.html.haml b/app/components/editable_champ/carte_component/carte_component.html.haml index ce5df6c7efa..f217fc9e9bc 100644 --- a/app/components/editable_champ/carte_component/carte_component.html.haml +++ b/app/components/editable_champ/carte_component/carte_component.html.haml @@ -8,4 +8,4 @@ autocompleteScreenReaderInstructions: t("combo_search_component.screen_reader_instructions")) .geo-areas{ id: dom_id(@champ, :geo_areas) } - = render partial: 'shared/champs/carte/geo_areas', locals: { champ: @champ, editing: true } + = render Dossiers::GeoAreasComponent.new(champ: @champ, editing: true) diff --git a/app/views/champs/carte/index.turbo_stream.haml b/app/views/champs/carte/index.turbo_stream.haml index ebbdd946f5b..55694596aeb 100644 --- a/app/views/champs/carte/index.turbo_stream.haml +++ b/app/views/champs/carte/index.turbo_stream.haml @@ -1,4 +1,5 @@ -= turbo_stream.update dom_id(@champ, :geo_areas), partial: 'shared/champs/carte/geo_areas', locals: { champ: @champ, editing: true } += turbo_stream.update dom_id(@champ, :geo_areas) do + = render Dossiers::GeoAreasComponent.new(champ: @champ, editing: true) - if @focus = turbo_stream.dispatch 'map:feature:focus', bbox: @champ.bounding_box diff --git a/app/views/shared/champs/carte/_show.html.haml b/app/views/shared/champs/carte/_show.html.haml index a4fbda3ebbb..4b957d1326a 100644 --- a/app/views/shared/champs/carte/_show.html.haml +++ b/app/views/shared/champs/carte/_show.html.haml @@ -1,4 +1,4 @@ - if champ.geometry? = react_component("MapReader", { featureCollection: champ.to_feature_collection, options: champ.render_options } ) .geo-areas - = render partial: 'shared/champs/carte/geo_areas', locals: { champ: champ, editing: false } + = render Dossiers::GeoAreasComponent.new(champ:, editing: false) From 44859b8217e650d49ccb08bb4183bbb8e1184a19 Mon Sep 17 00:00:00 2001 From: simon lehericey Date: Thu, 8 Jun 2023 17:28:08 +0200 Subject: [PATCH 22/41] fix(user dossiers index): do not crash with a deleted dossier and a discarded procedure --- app/controllers/users/dossiers_controller.rb | 2 +- .../users/dossiers/_deleted_dossiers_list.html.haml | 4 +--- spec/controllers/users/dossiers_controller_spec.rb | 12 ++++++++++++ 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/app/controllers/users/dossiers_controller.rb b/app/controllers/users/dossiers_controller.rb index 3f979c4c2ae..31a504023fc 100644 --- a/app/controllers/users/dossiers_controller.rb +++ b/app/controllers/users/dossiers_controller.rb @@ -27,7 +27,7 @@ def index @dossiers_traites = current_user.dossiers.state_termine.merge(dossiers_visibles) @dossiers_invites = current_user.dossiers_invites.merge(dossiers_visibles) @dossiers_supprimes_recemment = current_user.dossiers.hidden_by_user.merge(dossiers) - @dossiers_supprimes_definitivement = current_user.deleted_dossiers.order_by_updated_at + @dossiers_supprimes_definitivement = current_user.deleted_dossiers.includes(:procedure).order_by_updated_at @dossier_transfers = DossierTransfer.for_email(current_user.email) @dossiers_close_to_expiration = current_user.dossiers.close_to_expiration.merge(dossiers_visibles) @statut = statut(@user_dossiers, @dossiers_traites, @dossiers_invites, @dossiers_supprimes_recemment, @dossiers_supprimes_definitivement, @dossier_transfers, @dossiers_close_to_expiration, params[:statut]) diff --git a/app/views/users/dossiers/_deleted_dossiers_list.html.haml b/app/views/users/dossiers/_deleted_dossiers_list.html.haml index d467793fa8a..1bedcba59f6 100644 --- a/app/views/users/dossiers/_deleted_dossiers_list.html.haml +++ b/app/views/users/dossiers/_deleted_dossiers_list.html.haml @@ -13,14 +13,12 @@ %th Date de suppression %tbody - deleted_dossiers.each do |dossier| - - libelle_demarche = Procedure.find(dossier.procedure_id).libelle - %tr{ data: { 'dossier-id': dossier.dossier_id } } %td.number-col %span.icon.folder = dossier.dossier_id %td - = libelle_demarche + = dossier.procedure.libelle %td.cell-link = deletion_reason_badge(dossier.reason) diff --git a/spec/controllers/users/dossiers_controller_spec.rb b/spec/controllers/users/dossiers_controller_spec.rb index eddcc77327c..fc91e29f826 100644 --- a/spec/controllers/users/dossiers_controller_spec.rb +++ b/spec/controllers/users/dossiers_controller_spec.rb @@ -913,6 +913,18 @@ expect(assigns(:dossiers_invites).second.updated_at.to_date).to eq(4.days.ago.to_date) end end + + context 'when the user has a deleted dossier on a discarded procedure' do + render_views + + let!(:deleted_dossier) { create(:deleted_dossier, user_id: user.id) } + + before { deleted_dossier.procedure.discard! } + + subject { get(:index, params: { statut: 'dossiers-supprimes-definitivement' }) } + + it { is_expected.to have_http_status(200) } + end end describe '#show' do From 95513682039da3acff4670efea8305b3616f6c8b Mon Sep 17 00:00:00 2001 From: Paul Chavard Date: Mon, 12 Jun 2023 14:24:54 +0200 Subject: [PATCH 23/41] refactor: use persisted? instead of created_at.present? --- app/components/dossiers/message_component.rb | 2 +- app/views/administrateurs/procedures/_informations.html.haml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/components/dossiers/message_component.rb b/app/components/dossiers/message_component.rb index af19bc2f820..40a9c391615 100644 --- a/app/components/dossiers/message_component.rb +++ b/app/components/dossiers/message_component.rb @@ -63,6 +63,6 @@ def commentaire_date end def highlight? - commentaire.created_at.present? && @messagerie_seen_at&.<(commentaire.created_at) + commentaire.persisted? && @messagerie_seen_at&.<(commentaire.created_at) end end diff --git a/app/views/administrateurs/procedures/_informations.html.haml b/app/views/administrateurs/procedures/_informations.html.haml index 39b533d04f2..062fc4d219a 100644 --- a/app/views/administrateurs/procedures/_informations.html.haml +++ b/app/views/administrateurs/procedures/_informations.html.haml @@ -27,7 +27,7 @@ = f.number_field :duree_conservation_dossiers_dans_ds, { class: 'fr-input', placeholder: '6', required: true, max: f.object.max_duree_conservation_dossiers_dans_ds } -- if @procedure.created_at.present? +- if @procedure.persisted? = render Dsfr::InputComponent.new(form: f, attribute: :lien_site_web, input_type: :text_field, opts: {}, required: false) = render Dsfr::CalloutComponent.new(title: "Cadre juridique") do |c| From 6723bdcd9d3b1c40c83afda9229eb164e6e7522e Mon Sep 17 00:00:00 2001 From: Paul Chavard Date: Mon, 12 Jun 2023 14:56:41 +0200 Subject: [PATCH 24/41] fix(carto): no crash on points with elevation --- app/models/geo_area.rb | 2 +- spec/factories/geo_area.rb | 9 +++++++++ spec/models/geo_area_spec.rb | 14 ++++++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/app/models/geo_area.rb b/app/models/geo_area.rb index 501f64e3dfe..22a40fa00bf 100644 --- a/app/models/geo_area.rb +++ b/app/models/geo_area.rb @@ -110,7 +110,7 @@ def length def location if point? - Geo::Coord.new(*geometry['coordinates'].reverse).to_s + Geo::Coord.new(*geometry['coordinates'][0..1].reverse).to_s end end diff --git a/spec/factories/geo_area.rb b/spec/factories/geo_area.rb index 5dc7369c5de..b521ba5eaea 100644 --- a/spec/factories/geo_area.rb +++ b/spec/factories/geo_area.rb @@ -116,6 +116,15 @@ end end + trait :point_with_z do + geometry do + { + "type": "Point", + "coordinates": [2.428439855575562, 46.538476837725796, 42] + } + end + end + trait :invalid_point do geometry do { diff --git a/spec/models/geo_area_spec.rb b/spec/models/geo_area_spec.rb index c592717d1b0..fd66e27d713 100644 --- a/spec/models/geo_area_spec.rb +++ b/spec/models/geo_area_spec.rb @@ -122,6 +122,20 @@ end end + context "when geo is a point" do + let(:geo_area) { build(:geo_area, :selection_utilisateur, :point, champ: nil) } + it "should return the label" do + expect(geo_area.label).to eq("Un point situé à 46°32'19\"N 2°25'42\"E") + end + end + + context "when geo is a point with elevation" do + let(:geo_area) { build(:geo_area, :selection_utilisateur, :point_with_z, champ: nil) } + it "should return the label" do + expect(geo_area.label).to eq("Un point situé à 46°32'19\"N 2°25'42\"E") + end + end + context "when geo is a cadastre parcelle" do let(:geo_area) { build(:geo_area, :selection_utilisateur, :cadastre, champ: nil) } it "should return the label" do From 2cc0baf4db74b11f1400c8fcb75aad6ccf571552 Mon Sep 17 00:00:00 2001 From: Eric Leroy-Terquem Date: Wed, 7 Jun 2023 16:49:44 +0200 Subject: [PATCH 25/41] fix typos in model locales --- config/locales/models/avis/fr.yml | 4 ++-- config/locales/models/champs/iban_champ/fr.yml | 3 +-- config/locales/models/dossier_transfer/fr.yml | 2 +- config/locales/models/dubious_procedure/fr.yml | 2 +- config/locales/models/groupe_instructeur/fr.yml | 2 +- config/locales/models/logic/fr.yml | 2 +- config/locales/models/procedure/fr.yml | 6 +++--- 7 files changed, 10 insertions(+), 11 deletions(-) diff --git a/config/locales/models/avis/fr.yml b/config/locales/models/avis/fr.yml index 292972a97fb..996da890a90 100644 --- a/config/locales/models/avis/fr.yml +++ b/config/locales/models/avis/fr.yml @@ -15,8 +15,8 @@ fr: other: Inviter aussi l’expert sur les dossiers liés n° %{ids} revoke: Révoquer la demande d’avis remind: Relancer l’expert - question_label: Posez une question à l'expert - question_label_hint: (facultatif) l'expert pourra répondre par oui/non + question_label: Posez une question à l’expert + question_label_hint: (facultatif) l’expert pourra répondre par oui/non introduction: Message d'introduction question_answer: true: oui diff --git a/config/locales/models/champs/iban_champ/fr.yml b/config/locales/models/champs/iban_champ/fr.yml index f00ab4d0c0e..5d14ed4f6ef 100644 --- a/config/locales/models/champs/iban_champ/fr.yml +++ b/config/locales/models/champs/iban_champ/fr.yml @@ -5,5 +5,4 @@ fr: champs/iban_champ: attributes: value: - invalid_iban: n'est pas au format IBAN - + invalid_iban: n’est pas au format IBAN diff --git a/config/locales/models/dossier_transfer/fr.yml b/config/locales/models/dossier_transfer/fr.yml index 751410cefae..12f9d09a96a 100644 --- a/config/locales/models/dossier_transfer/fr.yml +++ b/config/locales/models/dossier_transfer/fr.yml @@ -5,5 +5,5 @@ fr: dossier_transfer: attributes: email: - format: "L'adresse email %{message}" + format: "L’adresse email %{message}" invalid: "est invalide" diff --git a/config/locales/models/dubious_procedure/fr.yml b/config/locales/models/dubious_procedure/fr.yml index 211a9802671..c50bd2b75dd 100644 --- a/config/locales/models/dubious_procedure/fr.yml +++ b/config/locales/models/dubious_procedure/fr.yml @@ -5,4 +5,4 @@ fr: other: Démarches sans expiration attributes: outdated_procedure: - dossiers_close_to_expiration: Dossier pouvant être expirés + dossiers_close_to_expiration: Dossiers pouvant être expirés diff --git a/config/locales/models/groupe_instructeur/fr.yml b/config/locales/models/groupe_instructeur/fr.yml index b48e4b4a75e..fe08d730d9f 100644 --- a/config/locales/models/groupe_instructeur/fr.yml +++ b/config/locales/models/groupe_instructeur/fr.yml @@ -15,4 +15,4 @@ fr: format: "Le libellé %{message}" closed: format: "%{message}" - accepted: Il doit y avoir au moins un groupe instructeur actif sur chaque démarche + accepted: Il doit y avoir au moins un groupe d’instructeurs actif sur chaque démarche diff --git a/config/locales/models/logic/fr.yml b/config/locales/models/logic/fr.yml index c6f1f744d01..27688d67f53 100644 --- a/config/locales/models/logic/fr.yml +++ b/config/locales/models/logic/fr.yml @@ -11,5 +11,5 @@ fr: 'Logic::GreaterThanEq': Supérieur ou égal à 'Logic::And': Et 'Logic::Or': Ou - 'Logic::NotEq': N'est pas + 'Logic::NotEq': N’est pas 'Logic::IncludeOperator': Contient diff --git a/config/locales/models/procedure/fr.yml b/config/locales/models/procedure/fr.yml index 339a0860df6..a6578ecee47 100644 --- a/config/locales/models/procedure/fr.yml +++ b/config/locales/models/procedure/fr.yml @@ -7,14 +7,14 @@ fr: attributes: procedure: hints: - description: Décrivez en quelques lignes le contexte, la finalité etc. + description: Décrivez en quelques lignes le contexte, la finalité, etc. description_target_audience: Décrivez en quelques lignes les destinataires finaux de la démarche, les critères d’éligibilité s’il y en a, les pré-requis, etc. lien_site_web: "Exemple: 'https://exemple.gouv.fr/ma_demarche'" cadre_juridique: "Exemple: 'https://www.legifrance.gouv.fr/'" path: Lien public organisation: Organisme duree_conservation_dossiers_dans_ds: Durée de conservation des dossiers sur demarches-simplifiees.fr (choisi par un usager) - max_duree_conservation_dossiers_dans_ds: Durée de conservation des dossiers maximum (autorisé par un super admin de DS) + max_duree_conservation_dossiers_dans_ds: Durée maximale de conservation des dossiers (autorisée par un super admin de DS) id: Id libelle: Titre de la démarche description: Quel est l’objet de la démarche ? @@ -36,7 +36,7 @@ fr: api_particulier_token: Jeton API Particulier routing_criteria_name: Nomination du routage initiated_mail: L’email de notification de passage de dossier en instruction - received_mail: L’email de notification de dépot de dossier + received_mail: L’email de notification de dépôt de dossier closed_mail: L’email de notification d’acceptation de dossier refused_mail: L’email de notification de refus de dossier without_continuation_mail: L’email de notification de classement sans suite de dossier From ef73d9187dcbcd87532165b386c664c03a735bae Mon Sep 17 00:00:00 2001 From: Eric Leroy-Terquem Date: Wed, 7 Jun 2023 17:10:48 +0200 Subject: [PATCH 26/41] fix typos in view locales --- .../locales/views/administrateurs/experts_procedures/fr.yml | 4 ++-- .../locales/views/administrateurs/groupe_instructeurs/fr.yml | 4 ++-- config/locales/views/administrateurs/informations/fr.yml | 2 +- config/locales/views/administrateurs/revision_changes/fr.yml | 2 +- config/locales/views/agent_connect/agent/fr.yml | 2 +- .../notify_automatic_deletion_to_administration/fr.yml | 4 ++-- .../dossier_mailer/notify_automatic_deletion_to_user/fr.yml | 4 ++-- .../views/dossier_mailer/notify_brouillon_deletion/fr.yml | 4 ++-- .../dossier_mailer/notify_brouillon_near_deletion/fr.yml | 2 +- .../dossier_mailer/notify_groupe_instructeur_changed/fr.yml | 2 +- .../notify_near_deletion_to_administration/fr.yml | 4 ++-- .../dossier_mailer/notify_new_avis_to_instructeur/fr.yml | 2 +- config/locales/views/instructeurs/commentaires/fr.yml | 2 +- config/locales/views/instructeurs/header/fr.yml | 4 ++-- config/locales/views/instructeurs/procedures/fr.yml | 2 +- config/locales/views/support/fr.yml | 2 +- config/locales/views/users/dossier_transfer/fr.yml | 4 ++-- config/locales/views/users/header/fr.yml | 4 ++-- 18 files changed, 27 insertions(+), 27 deletions(-) diff --git a/config/locales/views/administrateurs/experts_procedures/fr.yml b/config/locales/views/administrateurs/experts_procedures/fr.yml index 8b462816d76..62db8096ce8 100644 --- a/config/locales/views/administrateurs/experts_procedures/fr.yml +++ b/config/locales/views/administrateurs/experts_procedures/fr.yml @@ -5,9 +5,9 @@ fr: titles: main: Experts invités sur %{libelle} allow_invite_experts: "Autoriser les instructeurs à solliciter des experts invités" - allow_expert_messaging: "Autoriser les experts à acceder à la messagerie usager" + allow_expert_messaging: "Autoriser les experts à accéder à la messagerie usager" manage_procedure_experts: "Gérer les experts invités de la démarche" descriptions: allow_invite_experts : Lorsque cette fonctionnalité est active, les instructeurs peuvent solliciter les experts allow_expert_messaging: Lorsque cette fonctionnalité est active, les experts peuvent demander des informations aux usagers - manage_procedure_experts: Lorsque cette fonctionnalité est active, les instructeurs ne peuvent uniquement solliciter les experts de votre liste + manage_procedure_experts: Lorsque cette fonctionnalité est active, les instructeurs peuvent uniquement solliciter les experts de votre liste diff --git a/config/locales/views/administrateurs/groupe_instructeurs/fr.yml b/config/locales/views/administrateurs/groupe_instructeurs/fr.yml index d9ed954963f..0a2011b6885 100644 --- a/config/locales/views/administrateurs/groupe_instructeurs/fr.yml +++ b/config/locales/views/administrateurs/groupe_instructeurs/fr.yml @@ -37,11 +37,11 @@ fr: import_file_procedure_not_published: L’import par fichier CSV est disponible une fois la démarche publiée groupes: title: Import / Export en masse - notice_1_html: Pour l'import, votre fichier csv doit comporter 2 colonnes (Groupe, Email) et être séparé par des virgules (exemple de fichier). Le poids du fichier doit être inférieur %{csv_max_size}. + notice_1_html: Pour l’import, votre fichier csv doit comporter 2 colonnes (Groupe, Email) et être séparé par des virgules (exemple de fichier). Le poids du fichier doit être inférieur %{csv_max_size}. notice_2: L’import n’écrase pas les groupes existants. Il permet uniquement d'en ajouter. Pour supprimer un groupe, allez dans la page dédiée et cliquez sur le bouton « Supprimer ». instructeurs: title: Import en masse - notice_1_html: Pour l'import, le fichier csv doit comporter 1 seule colonne (Email) avec une adresse email d'instructeur par ligne (exemple de fichier). Le poids du fichier doit être inférieur %{csv_max_size}. + notice_1_html: Pour l’import, le fichier csv doit comporter 1 seule colonne (Email) avec une adresse email d'instructeur par ligne (exemple de fichier). Le poids du fichier doit être inférieur %{csv_max_size}. notice_2: L’import n’écrase pas les instructeurs existants. Il permet uniquement d'en ajouter. Pour supprimer un instructeur, cliquez sur le bouton « Retirer ». existing_groupe: one: "%{count} groupe existe" diff --git a/config/locales/views/administrateurs/informations/fr.yml b/config/locales/views/administrateurs/informations/fr.yml index 7aaa9dd01a3..df3e6d433f8 100644 --- a/config/locales/views/administrateurs/informations/fr.yml +++ b/config/locales/views/administrateurs/informations/fr.yml @@ -2,7 +2,7 @@ fr: administrateurs: informations: opendata_header: Open data - opendata_notice_html: "Les démarches à destination du public hébergées par Démarches Simplifiées sont dans leur majorité à destination des usagers ou des personnes morales, mais aussi aux agents ou contribuent au fonctionnement des services.
+ opendata_notice_html: "Les démarches à destination du public hébergées par Démarches Simplifiées sont dans leur majorité à destination des usagers ou des personnes morales mais aussi des agents, ou contribuent au fonctionnement des services.
Dans leur majorité, les descriptions des formulaires, le titre des champs, sont des informations qui peuvent être communiquées au public en Open data, sous un format numérique facilement exploitable. Les valeurs saisies par les usagers restent évidemment confidentielles.
Ces informations seront publiées sur data.gouv.fr et seront mises à jour régulièrement." opendata: "Autorisez-vous la publication du descriptif de la démarche ?" diff --git a/config/locales/views/administrateurs/revision_changes/fr.yml b/config/locales/views/administrateurs/revision_changes/fr.yml index e3c4473d6e6..e22bc142bcd 100644 --- a/config/locales/views/administrateurs/revision_changes/fr.yml +++ b/config/locales/views/administrateurs/revision_changes/fr.yml @@ -1,7 +1,7 @@ fr: administrateurs: revision_changes: - has_changes: Modifications en cours (appliqué à la prochaine publication) + has_changes: Modifications en cours (appliquées à la prochaine publication) carte_layers: unesco: UNESCO arretes_protection: Arrêtés de protection diff --git a/config/locales/views/agent_connect/agent/fr.yml b/config/locales/views/agent_connect/agent/fr.yml index 75f72459f3d..15d65fc39c3 100644 --- a/config/locales/views/agent_connect/agent/fr.yml +++ b/config/locales/views/agent_connect/agent/fr.yml @@ -16,6 +16,6 @@ fr: you_are_a_citizen: Vous êtes un particulier ? citizen_page: Accéder à notre page dédiée connect: Connectez-vous - signin_with: "S'identifier avec" + signin_with: "S’identifier avec" whats_agentconnect: 'Quʼest ce quʼAgentConnect ?' pro_email: Email professionnel diff --git a/config/locales/views/dossier_mailer/notify_automatic_deletion_to_administration/fr.yml b/config/locales/views/dossier_mailer/notify_automatic_deletion_to_administration/fr.yml index 1fcfd619875..df144cd8c9a 100644 --- a/config/locales/views/dossier_mailer/notify_automatic_deletion_to_administration/fr.yml +++ b/config/locales/views/dossier_mailer/notify_automatic_deletion_to_administration/fr.yml @@ -5,5 +5,5 @@ fr: one: "Un dossier a été supprimé automatiquement" other: "Des dossiers ont été supprimés automatiquement" header: - one: "Le délai maximum de conservation du dossier suivant a été atteint, il a donc été supprimé :" - other: "Le délai maximum de conservation des dossiers suivants a été atteint, ils ont donc été supprimés :" + one: "Le délai maximal de conservation du dossier suivant a été atteint, celui-ci a donc été supprimé :" + other: "Le délai maximal de conservation des dossiers suivants a été atteint, ceux-ci ont donc été supprimés :" diff --git a/config/locales/views/dossier_mailer/notify_automatic_deletion_to_user/fr.yml b/config/locales/views/dossier_mailer/notify_automatic_deletion_to_user/fr.yml index e4b738fc9b4..33c9e58de20 100644 --- a/config/locales/views/dossier_mailer/notify_automatic_deletion_to_user/fr.yml +++ b/config/locales/views/dossier_mailer/notify_automatic_deletion_to_user/fr.yml @@ -11,5 +11,5 @@ fr: one: Votre compte reste activé sur Démarches Simplifiées, seul le dossier est supprimé. other: Votre compte reste activé sur Démarches Simplifiées, seuls les dossiers ont été supprimés. footer_en_construction: - one: "Le dossier ne sera pas traité, nous nous excusons de la gène occasionnée." - other: "Les dossiers ne seront pas traités, nous nous excusons de la gène occasionnée." + one: "Le dossier ne sera pas traité, nous nous excusons de la gêne occasionnée." + other: "Les dossiers ne seront pas traités, nous nous excusons de la gêne occasionnée." diff --git a/config/locales/views/dossier_mailer/notify_brouillon_deletion/fr.yml b/config/locales/views/dossier_mailer/notify_brouillon_deletion/fr.yml index bcb8ce43927..a06ba578872 100644 --- a/config/locales/views/dossier_mailer/notify_brouillon_deletion/fr.yml +++ b/config/locales/views/dossier_mailer/notify_brouillon_deletion/fr.yml @@ -5,5 +5,5 @@ fr: one: "Un dossier en brouillon a été supprimé automatiquement" other: "Des dossiers en brouillon ont été supprimés automatiquement" header: - one: "Le délai maximum de conservation du dossier en brouillon suivant a été atteint, il a donc été supprimé :" - other: "Le délai maximum de conservation des dossiers en brouillon suivants a été atteint, ils ont donc été supprimés :" + one: "Le délai maximum de conservation du dossier en brouillon suivant a été atteint, celui-ci a donc été supprimé :" + other: "Le délai maximum de conservation des dossiers en brouillon suivants a été atteint, ceux-ci ont donc été supprimés :" diff --git a/config/locales/views/dossier_mailer/notify_brouillon_near_deletion/fr.yml b/config/locales/views/dossier_mailer/notify_brouillon_near_deletion/fr.yml index 10440e6ddc2..63859a1b9be 100644 --- a/config/locales/views/dossier_mailer/notify_brouillon_near_deletion/fr.yml +++ b/config/locales/views/dossier_mailer/notify_brouillon_near_deletion/fr.yml @@ -6,7 +6,7 @@ fr: other: Des dossiers en brouillon vont bientôt être supprimés header: one: "Afin de limiter la conservation de vos données personnelles, le dossier en brouillon suivant sera bientôt automatiquement supprimé :" - other: "Afin de limiter la conservation de vos données personnelles, les dossiers en brouillon suivant seront bientôt automatiquement supprimés :" + other: "Afin de limiter la conservation de vos données personnelles, les dossiers en brouillon suivants seront bientôt automatiquement supprimés :" footer: one: "Si vous souhaitez toujours déposer ce dossier, vous pouvez retrouver votre brouillon pendant encore un mois. Si vous souhaitez conserver votre dossier plus longtemps, vous pouvez prolonger sa durée de conservation dans l’interface. Et sinon, vous n’avez rien à faire." other: "Si vous souhaitez toujours déposer ces dossiers, vous pouvez retrouver vos brouillons pendant encore un mois. Si vous souhaitez conserver vos dossiers plus longtemps, vous pouvez prolonger leur durée de conservation au cas par cas dans l’interface. Et sinon, vous n’avez rien à faire." diff --git a/config/locales/views/dossier_mailer/notify_groupe_instructeur_changed/fr.yml b/config/locales/views/dossier_mailer/notify_groupe_instructeur_changed/fr.yml index 541d2607d5d..d38c8176f2d 100644 --- a/config/locales/views/dossier_mailer/notify_groupe_instructeur_changed/fr.yml +++ b/config/locales/views/dossier_mailer/notify_groupe_instructeur_changed/fr.yml @@ -1,4 +1,4 @@ fr: dossier_mailer: notify_groupe_instructeur_changed: - subject: Le dossier nº %{dossier_id} a changé de groupe instructeur + subject: Le dossier nº %{dossier_id} a changé de groupe d’instructeurs diff --git a/config/locales/views/dossier_mailer/notify_near_deletion_to_administration/fr.yml b/config/locales/views/dossier_mailer/notify_near_deletion_to_administration/fr.yml index 6e679332f57..cba9b626b3d 100644 --- a/config/locales/views/dossier_mailer/notify_near_deletion_to_administration/fr.yml +++ b/config/locales/views/dossier_mailer/notify_near_deletion_to_administration/fr.yml @@ -9,10 +9,10 @@ fr: other: Des dossiers dont le traitement est terminé vont bientôt être supprimés header_en_construction: one: "Le dossier en construction suivant sera bientôt automatiquement supprimé :" - other: "Les dossiers en construction suivant seront bientôt automatiquement supprimés :" + other: "Les dossiers en construction suivants seront bientôt automatiquement supprimés :" header_termine: one: "Le dossier suivant dont le traitement est terminé sera bientôt automatiquement supprimé :" - other: "Les dossiers suivant dont le traitement est terminé seront bientôt automatiquement supprimés :" + other: "Les dossiers suivants dont le traitement est terminé seront bientôt automatiquement supprimés :" footer_en_construction: one: "Vous avez deux semaines pour commencer l’instruction du dossier." other: "Vous avez deux semaines pour commencer l’instruction des dossiers." diff --git a/config/locales/views/dossier_mailer/notify_new_avis_to_instructeur/fr.yml b/config/locales/views/dossier_mailer/notify_new_avis_to_instructeur/fr.yml index df076042b11..dc480ddaa94 100644 --- a/config/locales/views/dossier_mailer/notify_new_avis_to_instructeur/fr.yml +++ b/config/locales/views/dossier_mailer/notify_new_avis_to_instructeur/fr.yml @@ -2,4 +2,4 @@ fr: dossier_mailer: notify_new_avis_to_instructeur: subject: Nouvel avis déposé sur le dossier n°%{dossier_id} - body: Un nouvel a été déposé par un expert sur le dossier n° %{dossier_id} de la démarche %{libelle_demarche}. + body: Un nouvel avis a été déposé par un expert sur le dossier n° %{dossier_id} de la démarche %{libelle_demarche}. diff --git a/config/locales/views/instructeurs/commentaires/fr.yml b/config/locales/views/instructeurs/commentaires/fr.yml index fd2b20b78fb..3871c097dc1 100644 --- a/config/locales/views/instructeurs/commentaires/fr.yml +++ b/config/locales/views/instructeurs/commentaires/fr.yml @@ -3,5 +3,5 @@ fr: commentaires: destroy: notice: Votre message a été supprimé - alert_acl: Impossible de supprimer le message, celui ci ne vous appartient pas + alert_acl: Impossible de supprimer le message, celui-ci ne vous appartient pas alert_already_discarded: Ce message a déjà été supprimé diff --git a/config/locales/views/instructeurs/header/fr.yml b/config/locales/views/instructeurs/header/fr.yml index e99b3a4b734..f8396928a09 100644 --- a/config/locales/views/instructeurs/header/fr.yml +++ b/config/locales/views/instructeurs/header/fr.yml @@ -3,12 +3,12 @@ fr: dossiers: header: banner: - expiration_date_extended: " – la date de conservation a déjà été etendue" + expiration_date_extended: " – la date de conservation a déjà été étendue" title: Ce dossier va expirer states: brouillon: "" # not applicable, instructeur does not see brouillons en_construction: Ce dossier est en attente de prise en charge. Vous pouvez toutefois étendre cette durée d’un mois en cliquant sur le bouton suivant. - termine: Le traitement de ce dossier est terminé, mais il va bientôt expirer. Cela signifie qu’il va bientôt être supprimé. Si vous souhaitez conserver une trace, vous pouvez le télécharger au format PDF. + termine: Le traitement de ce dossier est terminé, mais il va bientôt expirer. Cela signifie qu’il va bientôt être supprimé. Si vous souhaitez en conserver une trace, vous pouvez le télécharger au format PDF. button_delay_expiration: "Conserver un mois de plus" notification_management: gestion des notifications administrators_list: voir les administrateurs diff --git a/config/locales/views/instructeurs/procedures/fr.yml b/config/locales/views/instructeurs/procedures/fr.yml index 24fad0c49c4..e2d6433943c 100644 --- a/config/locales/views/instructeurs/procedures/fr.yml +++ b/config/locales/views/instructeurs/procedures/fr.yml @@ -9,7 +9,7 @@ fr: archived: archivés dossiers_close_to_expiration: expirant dossiers_supprimes_recemment: supprimés - copy_link_button: Copier le lien de la démarche dans le presse papier + copy_link_button: Copier le lien de la démarche dans le presse-papiers 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}." diff --git a/config/locales/views/support/fr.yml b/config/locales/views/support/fr.yml index 45ec8aaaab6..260a0f06832 100644 --- a/config/locales/views/support/fr.yml +++ b/config/locales/views/support/fr.yml @@ -25,7 +25,7 @@ fr: lost_user: question: Je ne trouve pas la démarche que je veux faire answer_html: "

Nous vous invitons à contacter l’administration en charge de votre démarche pour qu’elle vous indique le lien à suivre. Celui-ci devrait ressembler à cela : %{base_url}/commencer/NOM_DE_LA_DEMARCHE.

-

Vous pouvez aussi consulter ici la liste de nos démarches les plus fréquentes (permis, detr etc).

" +

Vous pouvez aussi consulter ici la liste de nos démarches les plus fréquentes (permis, detr, etc.).

" other: question: Autre sujet admin: diff --git a/config/locales/views/users/dossier_transfer/fr.yml b/config/locales/views/users/dossier_transfer/fr.yml index 130a8b3a1a6..9a00f535186 100644 --- a/config/locales/views/users/dossier_transfer/fr.yml +++ b/config/locales/views/users/dossier_transfer/fr.yml @@ -8,6 +8,6 @@ fr: irrevocable_html: Une fois la demande de transfert acceptée, le dossier sera associé au compte du destinataire et vous ne pourrez plus y accéder. email_label: Email du compte destinataire submit: Envoyer la demande de transfert - notice_sent: L'invitation au transfert a été envoyée avec succès + notice_sent: L’invitation au transfert a été envoyée avec succès destroy: La demande de transfert a été supprimée avec succès - unauthorized_destroy: Vous n'avez pas l'autorisation pour supprimer cette demande de transfert + unauthorized_destroy: Vous n’avez pas l’autorisation pour supprimer cette demande de transfert diff --git a/config/locales/views/users/header/fr.yml b/config/locales/views/users/header/fr.yml index 9f30a061af0..8246d82a5b6 100644 --- a/config/locales/views/users/header/fr.yml +++ b/config/locales/views/users/header/fr.yml @@ -14,8 +14,8 @@ fr: title: Votre dossier va expirer states: brouillon: Votre dossier est en brouillon, mais va bientôt expirer. Cela signifie qu’il va bientôt être supprimé sans avoir été déposé. Si vous souhaitez le conserver afin de poursuivre la démarche, vous pouvez étendre la durée de conversation en cliquant sur le bouton ci-dessous. - en_construction: Votre dossier est en attente de prise en charge par l’administration. Le délai de prise en charge maximale est de %{nominal_duration_months} mois. Vous pouvez toutefois étendre cette durée en cliquant sur le bouton ci-dessous. - termine: Le traitement de votre dossier est terminé, mais il va bientôt expirer. Cela signifie qu’il va bientôt être supprimé. Si vous souhaitez conserver une trace, vous pouvez le télécharger au format PDF. + en_construction: Votre dossier est en attente de prise en charge par l’administration. Le délai de prise en charge maximal est de %{nominal_duration_months} mois. Vous pouvez toutefois étendre cette durée en cliquant sur le bouton ci-dessous. + termine: Le traitement de votre dossier est terminé, mais il va bientôt expirer. Cela signifie qu’il va bientôt être supprimé. Si vous souhaitez en conserver une trace, vous pouvez le télécharger au format PDF. button_delay_expiration: one: "Conserver %{count} mois supplémentaire" other: "Conserver %{count} mois supplémentaires" From cbd1f09e55ded4def767651feafb103d0d908502 Mon Sep 17 00:00:00 2001 From: Eric Leroy-Terquem Date: Wed, 7 Jun 2023 18:48:20 +0200 Subject: [PATCH 27/41] fix remaining locales --- config/locales/fr.yml | 22 +++++++++++----------- config/locales/links.fr.yml | 4 ++-- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/config/locales/fr.yml b/config/locales/fr.yml index af3df97947c..5b92f2555f4 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -255,7 +255,7 @@ fr: siret_html: Un numéro de SIRET repetition_html: Un tableau de dictionnaires avec les valeurs possibles pour chaque champ de la répétition. annuaire_education_html: Un code d'établissement scolaire, tel que défini par l'Annuaire de l'Éducation Nationale - dossier_link_html: L'identifiant du dossier, sous forme de nombre entier + dossier_link_html: L’identifiant du dossier, sous forme de nombre entier epci_html: Un tableau contenant le code de département et celui de l'EPCI examples: title: Exemple @@ -289,7 +289,7 @@ fr: prefill_query_copy: Copier la requête de préremplissage json_description_title: Description JSON de la démarche json_description_info: Copiez la requête grâce au bouton ci-dessous pour découvrir les détails de la démarche et de ses champs au format JSON - json_description_copy: Copier la requête d'obtention de la description JSON + json_description_copy: Copier la requête d’obtention de la description JSON registrations: new: title: "Creation de compte sur %{name}" @@ -355,7 +355,7 @@ fr: messaging: Messagerie involved_persons: Personnes impliquées tab_explainations: - a_suivre: Aucun instructeur n’est affecté au suivi de ces dossiers. Soyez le premier ! + a_suivre: Aucun instructeur n’est affecté au suivi de ces dossiers. Soyez le premier ! suivis: Les dossiers qui sont dans cet onglet sont uniquement ceux que vous suivez. Vous pouvez échanger avec le demandeur jusqu’à pouvoir les accepter, les refuser ou les classer sans suite. traites_html: "Les dossiers dans cet onglet sont terminés : ils ont été acceptés, refusés ou classés sans suite. Vous pouvez télécharger les archives au format zip des dossiers terminés et leurs pièces jointes." tous: Tous les dossiers déposés sur cette démarche, qu'ils soient à suivre, suivis par vous ou suivis par d'autres instructeurs. @@ -372,7 +372,7 @@ fr: title: Sélectionner un filtre select_all: Tout selectionner batch_operation: - enabled: "Ajouter le dossier %{dossier_id} à la selection pour un traitement de masse" + enabled: "Ajouter le dossier %{dossier_id} à la sélection pour un traitement de masse" disabled: "Impossible d'ajouter le dossier %{dossier_id} à la selection car il est déjà dans un traitement de masse" show_deleted_dossiers: Afficher les dossiers supprimés personalize: Personnaliser le tableau @@ -392,7 +392,7 @@ fr: empty: "Aucun dossier" detail_one: "Pour remplir une démarche, contactez votre administration en lui demandant le lien de la démarche." detail_two: "Celui ci doit ressembler à" - fix_champ: "corriger l'erreur" + fix_champ: "corriger l’erreur" archived_dossier: "Votre dossier sera conservé %{duree_conservation_dossiers_dans_ds} mois supplémentaire" identite: identity_data: Données d’identité @@ -404,7 +404,7 @@ fr: complete_data: Merci de remplir vos informations personnelles pour accéder à la démarche. continue: Continuer merci: - thanks: Merci ! + thanks: Merci ! dossier_send_l1: Votre dossier sur la démarche dossier_send_l2: a bien été envoyé. dossier_acces_l1: Vous avez désormais accès à votre @@ -476,8 +476,8 @@ fr: edit_draft: "Modifier le brouillon" actions: "Actions" transfers: - sender_demande_en_cours: "Une demande de transfert est en cours sur le dossier Nº %{id} pour %{email}" - receiver_demande_en_cours: "Demande de transfert pour le dossier Nº %{id} envoyé par %{email}" + sender_demande_en_cours: "Une demande de transfert est en cours sur le dossier Nº %{id} pour %{email}" + receiver_demande_en_cours: "Demande de transfert pour le dossier Nº %{id} envoyé par %{email}" revoke: Révoquer cette demande accept: Accepter reject: Rejeter @@ -500,7 +500,7 @@ fr: reset_link_sent: email_sent_html: "Si un compte %{application_name} existe avec l’adresse %{email}, nous vous avons envoyé un email." click_link_to_reset_password: "Cliquez sur le lien contenu dans l’email pour changer votre mot de passe." - no_mail: "Vous n’avez pas reçu l’email ?" + no_mail: "Vous n’avez pas reçu l’email ?" check_spams: "Vérifiez la boite Indésirables ou Spam de votre boite email." check_account: "Avez-vous bien créé un compte %{application_name} avec l’adresse %{email} ? Si aucun compte n’existe avec cette adresse, vous ne recevrez pas de message." check_france_connect_html: "Vous êtes-vous connecté avec France Connect par le passé ? Dans ce cas essayez à nouveau avec France Connect." @@ -812,8 +812,8 @@ fr: token_description: "Il doit contenir au minimum 15 caractères." update: token_ok: "Le jeton a bien été mis à jour" - no_scopes_token: "Mise à jour impossible : le jeton n’a pas acces aux données.

Vérifiez-le auprès de https://datapass.api.gouv.fr/" - not_found_token: "Mise à jour impossible : le jeton n’a pas été trouvé ou n’est pas actif

Vérifiez-le auprès de https://datapass.api.gouv.fr/" + no_scopes_token: "Mise à jour impossible : le jeton n’a pas acces aux données.

Vérifiez-le auprès de https://datapass.api.gouv.fr/" + not_found_token: "Mise à jour impossible : le jeton n’a pas été trouvé ou n’est pas actif

Vérifiez-le auprès de https://datapass.api.gouv.fr/" network_error: "Mise à jour impossible : une erreur réseau est survenue" api_particulier: already_configured: "Déjà rempli" diff --git a/config/locales/links.fr.yml b/config/locales/links.fr.yml index 59fe2d39108..b9abf26357c 100644 --- a/config/locales/links.fr.yml +++ b/config/locales/links.fr.yml @@ -30,14 +30,14 @@ fr: copy_html: "Sauf mention contraire, tous les contenus de ce site sont sous %{link}" license: "licence etalab 2.0" accessibilite: - label: "Accessibilité : partiellement conforme" + label: "Accessibilité : partiellement conforme" title: "Consulter notre déclaration d’accessibilité" api_doc: label: "Documentation de l’API" title: "Documentation graphql de l’API" url: "https://doc.demarches-simplifiees.fr/pour-aller-plus-loin/graphql" dinum: - title: "Le site de la DINUM — Gouvernement" + title: "Le site de la DINUM — Gouvernement" url: "https://www.numerique.gouv.fr/dinum/" alt: "Direction interministérielle du numérique" cgu: From bd846e721d2b3b0a058caca5684cec272d66612e Mon Sep 17 00:00:00 2001 From: Eric Leroy-Terquem Date: Wed, 7 Jun 2023 21:52:31 +0200 Subject: [PATCH 28/41] fix typos in views --- .../notify_procedure_expires_when_termine_forced.haml | 2 +- .../dossier_submitted_messages/_informations.html.haml | 2 +- .../groupe_instructeurs/reaffecter_dossiers.html.haml | 2 +- .../groupe_instructeurs/simple_routing.html.haml | 2 +- .../administrateurs/procedures/_publication_form.html.haml | 2 +- app/views/administrateurs/procedures/publication.html.haml | 2 +- app/views/administrateurs/services/_form.html.haml | 4 ++-- app/views/administration_mailer/refuse_admin.html.haml | 4 ++-- app/views/instructeur_mailer/last_week_overview.html.haml | 2 +- app/views/instructeurs/procedures/email_usagers.html.haml | 4 ++-- app/views/invite_mailer/invite_guest.html.haml | 2 +- app/views/user_mailer/ask_for_merge.haml | 2 +- 12 files changed, 15 insertions(+), 15 deletions(-) diff --git a/app/views/administrateur_mailer/notify_procedure_expires_when_termine_forced.haml b/app/views/administrateur_mailer/notify_procedure_expires_when_termine_forced.haml index 55338101d0e..95ef2a3efa9 100644 --- a/app/views/administrateur_mailer/notify_procedure_expires_when_termine_forced.haml +++ b/app/views/administrateur_mailer/notify_procedure_expires_when_termine_forced.haml @@ -10,7 +10,7 @@ Dans le cadre du respect du RGPD, nous (la plateforme #{APPLICATION_NAME}) venons d'activer la suppression automatique des dossiers sur la démarche : "#{@procedure.libelle}". %p - Vous pouvez d'ores et déjà archiver ces données en accédant à + Vous pouvez d’ores et déjà archiver ces données en accédant à = link_to("notre systeme d'archivage pour les admnistrateurs de démarche",admin_procedures_archived_url(@procedure) ) \. diff --git a/app/views/administrateurs/dossier_submitted_messages/_informations.html.haml b/app/views/administrateurs/dossier_submitted_messages/_informations.html.haml index fa06d1c8438..e9fb291e9ae 100644 --- a/app/views/administrateurs/dossier_submitted_messages/_informations.html.haml +++ b/app/views/administrateurs/dossier_submitted_messages/_informations.html.haml @@ -1,3 +1,3 @@ = f.label :message_on_submit_by_usager do Message affiché après l'envoi du dossier -= f.text_area :message_on_submit_by_usager, placeholder: "Merci, votre dossier sera traité dans les plus bref delais" += f.text_area :message_on_submit_by_usager, placeholder: "Merci, votre dossier sera traité dans les plus brefs délais" diff --git a/app/views/administrateurs/groupe_instructeurs/reaffecter_dossiers.html.haml b/app/views/administrateurs/groupe_instructeurs/reaffecter_dossiers.html.haml index 7a54ec12469..1d2c5c456b6 100644 --- a/app/views/administrateurs/groupe_instructeurs/reaffecter_dossiers.html.haml +++ b/app/views/administrateurs/groupe_instructeurs/reaffecter_dossiers.html.haml @@ -9,7 +9,7 @@ .card .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. + Le groupe « #{@groupe_instructeur.label} » contient des dossiers. Afin de procéder à sa suppression, vous devez réaffecter ses dossiers à un autre groupe d’instructeurs. %table.table.mt-2 %thead %tr diff --git a/app/views/administrateurs/groupe_instructeurs/simple_routing.html.haml b/app/views/administrateurs/groupe_instructeurs/simple_routing.html.haml index 0882440bab2..16dfb386720 100644 --- a/app/views/administrateurs/groupe_instructeurs/simple_routing.html.haml +++ b/app/views/administrateurs/groupe_instructeurs/simple_routing.html.haml @@ -14,7 +14,7 @@ %div{ data: { 'action': "click->radio-enabled-submit#click" } } .notice - Sélectionner le champ à partir duquel créer des groupes d'instructeurs + Sélectionner le champ à partir duquel créer des groupes d’instructeurs - buttons_content = @procedure.active_revision.routable_types_de_champ.map { |tdc| { label: tdc.libelle, value: tdc.stable_id } } = render Dsfr::RadioButtonListComponent.new(form: f, target: :stable_id, diff --git a/app/views/administrateurs/procedures/_publication_form.html.haml b/app/views/administrateurs/procedures/_publication_form.html.haml index df358c3b351..d4c606f9d74 100644 --- a/app/views/administrateurs/procedures/_publication_form.html.haml +++ b/app/views/administrateurs/procedures/_publication_form.html.haml @@ -4,7 +4,7 @@ = render Procedure::PublicationWarningComponent.new(procedure: procedure) .mt-2 - if procedure.draft_changed? - %p.mb-2 Publiez une nouvelle version de votre démarche. Les modifications suivantes seront appliquées : + %p.mb-2 Publiez une nouvelle version de votre démarche. Les modifications suivantes seront appliquées : = render Procedure::RevisionChangesComponent.new changes: procedure.revision_changes, previous_revision: procedure.published_revision - if procedure.close? = render partial: 'publication_form_inputs', locals: { procedure: procedure, closed_procedures: @closed_procedures } diff --git a/app/views/administrateurs/procedures/publication.html.haml b/app/views/administrateurs/procedures/publication.html.haml index 9efa4a88347..e0b36bfd0af 100644 --- a/app/views/administrateurs/procedures/publication.html.haml +++ b/app/views/administrateurs/procedures/publication.html.haml @@ -6,7 +6,7 @@ .container - if @procedure.draft_revision.types_de_champ_public.dubious.present? .card.warning.mb-3 - .card-title Attention, certains champs ne peuvent être demandé par l'administration. Voici les champs qui nous semblent suspect : + .card-title Attention, certains champs ne peuvent être demandés par l’administration. Voici les champs qui nous semblent suspects : %ul - @procedure.draft_revision.types_de_champ_public.dubious.each do |dubious_champs| %li.dubious-champs= "#{dubious_champs.libelle} (#{dubious_champs.description})" diff --git a/app/views/administrateurs/services/_form.html.haml b/app/views/administrateurs/services/_form.html.haml index 72e6c33ef30..414a291b4fc 100644 --- a/app/views/administrateurs/services/_form.html.haml +++ b/app/views/administrateurs/services/_form.html.haml @@ -11,7 +11,7 @@ = f.label :organisme do Organisme/s %span.mandatory * - %p.notice Indiquez les organismes depuis l’échelon territoriale jusqu’au ministère séparés par une virgule + %p.notice Indiquez les organismes depuis l’échelon territorial jusqu’au ministère séparés par une virgule = f.text_field :organisme, placeholder: "mairie de Mours, préfecture de l'Oise, ministère de la Culture", required: true = f.label :type_organisme do @@ -25,7 +25,7 @@ %span.mandatory * %p.notice - Veuillez saisir le numéro de SIRET de l'organisme dont ce service dépend. + Veuillez saisir le numéro de SIRET de l’organisme dont ce service dépend. %br = link_to "➡ Rechercher le numéro SIRET sur « annuaire-entreprises.data.gouv.fr »", annuaire_link, target: "_blank" diff --git a/app/views/administration_mailer/refuse_admin.html.haml b/app/views/administration_mailer/refuse_admin.html.haml index 68fac924c9e..94e688c9c7b 100644 --- a/app/views/administration_mailer/refuse_admin.html.haml +++ b/app/views/administration_mailer/refuse_admin.html.haml @@ -8,7 +8,7 @@ %p - Pour les usagers ou les administrations publiques (collectivités, etc.) qui souhaitent remplir une démarche ou un déposer un dossier en ligne, l’entrée dans #{APPLICATION_NAME} se fait via un lien fourni par l’administration responsable, sur son propre site web. Ce lien vous permettra de créer un compte et de remplir le formulaire dans la foulée. + Pour les usagers ou les administrations publiques (collectivités, etc.) qui souhaitent remplir une démarche ou déposer un dossier en ligne, l’entrée dans #{APPLICATION_NAME} se fait via un lien fourni par l’administration responsable, sur son propre site web. Ce lien vous permettra de créer un compte et de remplir le formulaire dans la foulée. %p Si par contre vous rencontrez des problèmes lors de l'utilisation de #{APPLICATION_NAME} en tant qu'usager, merci d’expliciter le problème rencontré sur notre @@ -16,7 +16,7 @@ \. %p - Si vous avez fait une demande de compte administrateur légitime avec une adresse email grand public (Orange, Wanadoo etc), merci de nous contacter sur notre + Si vous avez fait une demande de compte administrateur légitime avec une adresse email grand public (Orange, Wanadoo, etc.), merci de nous contacter sur notre = link_to("formulaire de contact administrateur", contact_admin_url) \. diff --git a/app/views/instructeur_mailer/last_week_overview.html.haml b/app/views/instructeur_mailer/last_week_overview.html.haml index 7b873410f54..5a14e30eb18 100644 --- a/app/views/instructeur_mailer/last_week_overview.html.haml +++ b/app/views/instructeur_mailer/last_week_overview.html.haml @@ -4,7 +4,7 @@ Bonjour, %p - Voici le résumé de votre activité hebdomadaire : + Voici le résumé de votre activité hebdomadaire : - @overview[:procedure_overviews].each_with_index do |procedure_overview, index| diff --git a/app/views/instructeurs/procedures/email_usagers.html.haml b/app/views/instructeurs/procedures/email_usagers.html.haml index 84e8f78b6f4..115a47a3308 100644 --- a/app/views/instructeurs/procedures/email_usagers.html.haml +++ b/app/views/instructeurs/procedures/email_usagers.html.haml @@ -13,7 +13,7 @@ - if @bulk_messages.present? %section.list-avis.mt-8 %h1.tab-title - Messages envoyés précedemment + Messages envoyés précédemment %span.fr-badge= @bulk_messages.count %ul @@ -29,4 +29,4 @@ = render Attachment::ShowComponent.new(attachment: message.piece_jointe.attachment) - else .page-title.center - %h2 Il n'y a aucun dossier en brouillon dans vos groupes instructeurs + %h2 Il n’y a aucun dossier en brouillon dans vos groupes d’instructeurs diff --git a/app/views/invite_mailer/invite_guest.html.haml b/app/views/invite_mailer/invite_guest.html.haml index 6ed9c74302a..80996fa462a 100644 --- a/app/views/invite_mailer/invite_guest.html.haml +++ b/app/views/invite_mailer/invite_guest.html.haml @@ -4,7 +4,7 @@ %p L’utilisateur = @invite.email_sender - souhaite que vous participiez à l'élaboration d’un dossier pour la démarche + souhaite que vous participiez à l’élaboration d’un dossier pour la démarche %strong= @invite.dossier.procedure.libelle sur #{APPLICATION_NAME}. diff --git a/app/views/user_mailer/ask_for_merge.haml b/app/views/user_mailer/ask_for_merge.haml index d61072a8971..77ceffd1929 100644 --- a/app/views/user_mailer/ask_for_merge.haml +++ b/app/views/user_mailer/ask_for_merge.haml @@ -4,7 +4,7 @@ Bonjour, %p - L’utilisateur « #{@user.email} » a demandé la fusion de son compte avec le votre « #{@requested_email} ». + L’utilisateur « #{@user.email} » a demandé la fusion de son compte avec le vôtre « #{@requested_email} ». %p Si vous désirez confirmer la fusion de ces comptes : From ea9213bf900d86e43441461cce4dc5cc44b8b989 Mon Sep 17 00:00:00 2001 From: Eric Leroy-Terquem Date: Thu, 8 Jun 2023 09:48:55 +0200 Subject: [PATCH 29/41] fix typos in components --- .../batch_alert_component/batch_alert_component.fr.yml | 2 +- .../user_filter_component/user_filter_component.fr.yml | 2 +- .../champ_label_content_component.fr.yml | 2 +- .../textarea_component/textarea_component.fr.yml | 2 +- .../dossier_submitted_message_component.fr.yml | 2 +- .../instructeurs_options_component.fr.yml | 4 ++-- .../one_groupe_management_component.html.haml | 2 +- .../api_token_component/api_token_component.fr.yml | 4 ++-- .../champ_component/champ_component.fr.yml | 2 +- .../errors_summary/errors_summary.fr.yml | 9 ++++----- 10 files changed, 15 insertions(+), 16 deletions(-) diff --git a/app/components/dossiers/batch_alert_component/batch_alert_component.fr.yml b/app/components/dossiers/batch_alert_component/batch_alert_component.fr.yml index 43ba3b568de..88bab81876b 100644 --- a/app/components/dossiers/batch_alert_component/batch_alert_component.fr.yml +++ b/app/components/dossiers/batch_alert_component/batch_alert_component.fr.yml @@ -54,7 +54,7 @@ fr: one: 1 dossier sera repassé en construction other: "%{success_count}/%{count} dossiers ont été repassés en construction" title: - finish: L'action de masse est terminée + finish: L’action de masse est terminée in_progress: Une action de masse est en cours link_text: Recharger la page after_link_text: pour voir si l'opération est finie. diff --git a/app/components/dossiers/user_filter_component/user_filter_component.fr.yml b/app/components/dossiers/user_filter_component/user_filter_component.fr.yml index 83348118c42..6e42f40fb7a 100644 --- a/app/components/dossiers/user_filter_component/user_filter_component.fr.yml +++ b/app/components/dossiers/user_filter_component/user_filter_component.fr.yml @@ -2,7 +2,7 @@ fr: legend: states: États created_at: Date de création - depose_at: Date de dépot + depose_at: Date de dépôt button: apply_filters: Appliquer les filtres reset_filters: Réinitialiser les filtres diff --git a/app/components/editable_champ/champ_label_content_component/champ_label_content_component.fr.yml b/app/components/editable_champ/champ_label_content_component/champ_label_content_component.fr.yml index f23db0dabce..8ae8a9d065b 100644 --- a/app/components/editable_champ/champ_label_content_component/champ_label_content_component.fr.yml +++ b/app/components/editable_champ/champ_label_content_component/champ_label_content_component.fr.yml @@ -2,4 +2,4 @@ fr: changes_to_save: "modification à déposer" modified_at: "modifié le %{datetime}" - check_content_rebased: Le type de ce champ ou sa description ont été modifiés par l'administration. Vérifier son contenu. + check_content_rebased: Le type de ce champ ou sa description ont été modifiés par l’administration. Vérifier son contenu. diff --git a/app/components/editable_champ/textarea_component/textarea_component.fr.yml b/app/components/editable_champ/textarea_component/textarea_component.fr.yml index ed78a799853..e9d5a7a1227 100644 --- a/app/components/editable_champ/textarea_component/textarea_component.fr.yml +++ b/app/components/editable_champ/textarea_component/textarea_component.fr.yml @@ -1,4 +1,4 @@ fr: remaining_characters: Il vous reste %{remaining_words} caractères. - excess_characters: Vous avez dépassé la taille conseillée de %{excess_words} caractères. Réduire le nombre de caractère. + excess_characters: Vous avez dépassé la taille conseillée de %{excess_words} caractères. Réduire le nombre de caractères. recommended_size: La taille maximale conseillée est de %{size} caractères. diff --git a/app/components/procedure/card/dossier_submitted_message_component/dossier_submitted_message_component.fr.yml b/app/components/procedure/card/dossier_submitted_message_component/dossier_submitted_message_component.fr.yml index 508adc976c9..66d8942ad24 100644 --- a/app/components/procedure/card/dossier_submitted_message_component/dossier_submitted_message_component.fr.yml +++ b/app/components/procedure/card/dossier_submitted_message_component/dossier_submitted_message_component.fr.yml @@ -1,3 +1,3 @@ --- fr: - title: Fin de dépot + title: Fin de dépôt diff --git a/app/components/procedure/instructeurs_options_component/instructeurs_options_component.fr.yml b/app/components/procedure/instructeurs_options_component/instructeurs_options_component.fr.yml index 5758e8df29c..50ceef36810 100644 --- a/app/components/procedure/instructeurs_options_component/instructeurs_options_component.fr.yml +++ b/app/components/procedure/instructeurs_options_component/instructeurs_options_component.fr.yml @@ -6,6 +6,6 @@ fr:

Pour le configurer, votre formulaire doit comporter au moins un champ « choix simple ».

Ajoutez ce champ dans la page « Configuration des champs ».

- delete_title: Aucun dossier ne sera supprimé. Les groupes d'instructeurs vont être supprimés. Seuls les instructeurs du groupe « %{defaut_label} » resteront affectés à la procédure. + delete_title: Aucun dossier ne sera supprimé. Les groupes d'instructeurs vont être supprimés. Seuls les instructeurs du groupe « %{defaut_label} » resteront affectés à la démarche. delete_confirmation: | - Attention : tous les dossiers vont être déplacés dans le groupe « %{defaut_label} » et seuls les instructeurs présent dans ce groupe resteront affectés à la procédure. Souhaitez-vous continuer ? + Attention : tous les dossiers vont être déplacés dans le groupe « %{defaut_label} » et seuls les instructeurs présent dans ce groupe resteront affectés à la démarche. Souhaitez-vous continuer ? diff --git a/app/components/procedure/one_groupe_management_component/one_groupe_management_component.html.haml b/app/components/procedure/one_groupe_management_component/one_groupe_management_component.html.haml index 67231a72db7..f534caac139 100644 --- a/app/components/procedure/one_groupe_management_component/one_groupe_management_component.html.haml +++ b/app/components/procedure/one_groupe_management_component/one_groupe_management_component.html.haml @@ -17,7 +17,7 @@ = 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 + %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, diff --git a/app/components/profile/api_token_component/api_token_component.fr.yml b/app/components/profile/api_token_component/api_token_component.fr.yml index ef4f2b028ca..5d8902c83cf 100644 --- a/app/components/profile/api_token_component/api_token_component.fr.yml +++ b/app/components/profile/api_token_component/api_token_component.fr.yml @@ -2,8 +2,8 @@ fr: allowed_full_access_html: Ce jeton a accès à toutes les démarches attachées à votre compte administrateur allowed_procedures_html: zero: Ce jeton n’a accès à aucune démarche - one: Ce jeton a accès a une démarche sélectionnée - other: Ce jeton a accès a %{count} démarches sélectionnées + one: Ce jeton a accès à une démarche sélectionnée + other: Ce jeton a accès à %{count} démarches sélectionnées security_one: Pour des raisons de sécurité, il ne sera plus ré-affiché, notez-le bien. security_two: Pour des raisons de sécurité, nous ne pouvons vous l’afficher que lors de sa création. security_title: "Options de sécurité" diff --git a/app/components/types_de_champ_editor/champ_component/champ_component.fr.yml b/app/components/types_de_champ_editor/champ_component/champ_component.fr.yml index bdee6be2099..012e5311e33 100644 --- a/app/components/types_de_champ_editor/champ_component/champ_component.fr.yml +++ b/app/components/types_de_champ_editor/champ_component/champ_component.fr.yml @@ -11,5 +11,5 @@ fr: zones_humides: Zones humides d’importance internationale znieff: ZNIEFF character_limit: - unlimited: Pas de limite de caractère + unlimited: Pas de limite de caractères limit: Limité à %{limit} caractères diff --git a/app/components/types_de_champ_editor/errors_summary/errors_summary.fr.yml b/app/components/types_de_champ_editor/errors_summary/errors_summary.fr.yml index e22a7e22555..7a97025db98 100644 --- a/app/components/types_de_champ_editor/errors_summary/errors_summary.fr.yml +++ b/app/components/types_de_champ_editor/errors_summary/errors_summary.fr.yml @@ -1,9 +1,8 @@ fr: fix_conditional: - one: 'La logique conditionnelle du champ suivant est invalide, veuillez la corriger :' - other: 'La logique conditionnelle des champs suivants sont invalides, veuillez les corriger :' + one: 'La logique conditionnelle du champ suivant est invalide, veuillez la corriger :' + other: 'La logique conditionnelle des champs suivants sont invalides, veuillez les corriger :' fix_header_section: - one: 'Le titre de section suivant est invalide, veuillez le corriger :' - other: 'Les titres de section suivants sont invalides, veuillez les corriger :' - + one: 'Le titre de section suivant est invalide, veuillez le corriger :' + other: 'Les titres de section suivants sont invalides, veuillez les corriger :' From 0164b5f008cb1d4b6f8096494052558407c1317f Mon Sep 17 00:00:00 2001 From: Eric Leroy-Terquem Date: Thu, 8 Jun 2023 10:03:34 +0200 Subject: [PATCH 30/41] fix tests after typos corrections --- .../dossiers/batch_alert_component_spec.rb | 24 +++++++++---------- .../jeton_particulier_controller_spec.rb | 2 +- .../graphql_controller_stored_queries_spec.rb | 2 +- .../users/dossiers_controller_spec.rb | 2 +- .../users/profil_controller_spec.rb | 2 +- spec/mailers/dossier_mailer_spec.rb | 4 ++-- .../administrateurs/procedure_publish_spec.rb | 2 +- .../instructeurs/batch_operation_spec.rb | 4 ++-- 8 files changed, 21 insertions(+), 21 deletions(-) diff --git a/spec/components/dossiers/batch_alert_component_spec.rb b/spec/components/dossiers/batch_alert_component_spec.rb index 91bfb68bcba..303e004cd9b 100644 --- a/spec/components/dossiers/batch_alert_component_spec.rb +++ b/spec/components/dossiers/batch_alert_component_spec.rb @@ -34,7 +34,7 @@ } it { is_expected.to have_selector('.fr-alert--success') } - it { is_expected.to have_text("L'action de masse est terminée") } + it { is_expected.to have_text("L’action de masse est terminée") } it { is_expected.to have_text("2 dossiers ont été archivés") } it { expect(batch_operation.seen_at).to eq(nil) } end @@ -47,7 +47,7 @@ } it { is_expected.to have_selector('.fr-alert--warning') } - it { is_expected.to have_text("L'action de masse est terminée") } + it { is_expected.to have_text("L’action de masse est terminée") } it { is_expected.to have_text("1/2 dossiers ont été archivés") } it { expect(batch_operation.seen_at).to eq(nil) } @@ -88,7 +88,7 @@ } it { is_expected.to have_selector('.fr-alert--success') } - it { is_expected.to have_text("L'action de masse est terminée") } + it { is_expected.to have_text("L’action de masse est terminée") } it { is_expected.to have_text("2 dossiers ont été passés en instruction") } it { expect(batch_operation.seen_at).to eq(nil) } end @@ -101,7 +101,7 @@ } it { is_expected.to have_selector('.fr-alert--warning') } - it { is_expected.to have_text("L'action de masse est terminée") } + it { is_expected.to have_text("L’action de masse est terminée") } it { is_expected.to have_text("1/2 dossiers ont été passés en instruction") } it { expect(batch_operation.seen_at).to eq(nil) } @@ -142,7 +142,7 @@ } it { is_expected.to have_selector('.fr-alert--success') } - it { is_expected.to have_text("L'action de masse est terminée") } + it { is_expected.to have_text("L’action de masse est terminée") } it { is_expected.to have_text("2 dossiers ont été acceptés") } it { expect(batch_operation.seen_at).to eq(nil) } end @@ -155,7 +155,7 @@ } it { is_expected.to have_selector('.fr-alert--warning') } - it { is_expected.to have_text("L'action de masse est terminée") } + it { is_expected.to have_text("L’action de masse est terminée") } it { is_expected.to have_text("1/2 dossiers ont été acceptés") } it { expect(batch_operation.seen_at).to eq(nil) } @@ -196,7 +196,7 @@ } it { is_expected.to have_selector('.fr-alert--success') } - it { is_expected.to have_text("L'action de masse est terminée") } + it { is_expected.to have_text("L’action de masse est terminée") } it { is_expected.to have_text("2 dossiers ont été suivis") } it { expect(batch_operation.seen_at).to eq(nil) } end @@ -209,7 +209,7 @@ } it { is_expected.to have_selector('.fr-alert--warning') } - it { is_expected.to have_text("L'action de masse est terminée") } + it { is_expected.to have_text("L’action de masse est terminée") } it { is_expected.to have_text("1/2 dossiers ont été suivis") } it { expect(batch_operation.seen_at).to eq(nil) } @@ -250,7 +250,7 @@ } it { is_expected.to have_selector('.fr-alert--success') } - it { is_expected.to have_text("L'action de masse est terminée") } + it { is_expected.to have_text("L’action de masse est terminée") } it { is_expected.to have_text("2 dossiers ne sont plus suivis") } it { expect(batch_operation.seen_at).to eq(nil) } end @@ -263,7 +263,7 @@ } it { is_expected.to have_selector('.fr-alert--warning') } - it { is_expected.to have_text("L'action de masse est terminée") } + it { is_expected.to have_text("L’action de masse est terminée") } it { is_expected.to have_text("1/2 dossiers ne sont plus suivis") } it { expect(batch_operation.seen_at).to eq(nil) } @@ -304,7 +304,7 @@ } it { is_expected.to have_selector('.fr-alert--success') } - it { is_expected.to have_text("L'action de masse est terminée") } + it { is_expected.to have_text("L’action de masse est terminée") } it { is_expected.to have_text("2 dossiers ont été repassés en construction") } it { expect(batch_operation.seen_at).to eq(nil) } end @@ -317,7 +317,7 @@ } it { is_expected.to have_selector('.fr-alert--warning') } - it { is_expected.to have_text("L'action de masse est terminée") } + it { is_expected.to have_text("L’action de masse est terminée") } it { is_expected.to have_text("1/2 dossiers ont été repassés en construction") } it { expect(batch_operation.seen_at).to eq(nil) } diff --git a/spec/controllers/administrateurs/jeton_particulier_controller_spec.rb b/spec/controllers/administrateurs/jeton_particulier_controller_spec.rb index 11f12c1241d..d659f628874 100644 --- a/spec/controllers/administrateurs/jeton_particulier_controller_spec.rb +++ b/spec/controllers/administrateurs/jeton_particulier_controller_spec.rb @@ -105,7 +105,7 @@ let(:cassette) { "api_particulier/unauthorized/introspect" } it 'rejects the jeton' do - expect(flash.alert).to include("Mise à jour impossible : le jeton n’a pas été trouvé ou n’est pas actif") + expect(flash.alert).to include("Mise à jour impossible : le jeton n’a pas été trouvé ou n’est pas actif") expect(flash.notice).to be_nil expect(procedure.reload.api_particulier_token).not_to eql(token) end diff --git a/spec/controllers/api/v2/graphql_controller_stored_queries_spec.rb b/spec/controllers/api/v2/graphql_controller_stored_queries_spec.rb index f357a7c84aa..d8ee268f0ae 100644 --- a/spec/controllers/api/v2/graphql_controller_stored_queries_spec.rb +++ b/spec/controllers/api/v2/graphql_controller_stored_queries_spec.rb @@ -654,7 +654,7 @@ context 'validation error' do it { expect(gql_errors).to be_nil - expect(gql_data[:groupeInstructeurModifier][:errors].first[:message]).to eq('Il doit y avoir au moins un groupe instructeur actif sur chaque démarche') + expect(gql_data[:groupeInstructeurModifier][:errors].first[:message]).to eq('Il doit y avoir au moins un groupe d’instructeurs actif sur chaque démarche') } end end diff --git a/spec/controllers/users/dossiers_controller_spec.rb b/spec/controllers/users/dossiers_controller_spec.rb index fc91e29f826..de80a2ff25b 100644 --- a/spec/controllers/users/dossiers_controller_spec.rb +++ b/spec/controllers/users/dossiers_controller_spec.rb @@ -746,7 +746,7 @@ subject end - it { expect(flash.alert).to include("Le champ « l » n'est pas au format IBAN, #{anchor_to_first_champ}") } + it { expect(flash.alert).to include("Le champ « l » n’est pas au format IBAN, #{anchor_to_first_champ}") } end context 'when the user has an invitation but is not the owner' do diff --git a/spec/controllers/users/profil_controller_spec.rb b/spec/controllers/users/profil_controller_spec.rb index 3a12ad493f9..07ce6fa7bf2 100644 --- a/spec/controllers/users/profil_controller_spec.rb +++ b/spec/controllers/users/profil_controller_spec.rb @@ -134,7 +134,7 @@ it "should not transfer to an empty email" do expect { subject }.not_to change { DossierTransfer.count } - expect(flash.alert).to eq(["L'adresse email est invalide"]) + expect(flash.alert).to eq(["L’adresse email est invalide"]) end end end diff --git a/spec/mailers/dossier_mailer_spec.rb b/spec/mailers/dossier_mailer_spec.rb index 8a5a318f1f7..5f15ece6b71 100644 --- a/spec/mailers/dossier_mailer_spec.rb +++ b/spec/mailers/dossier_mailer_spec.rb @@ -128,7 +128,7 @@ def notify_deletion_to_administration(deleted_dossier, to_email) it { expect(subject.subject).to eq("Un dossier a été supprimé automatiquement de votre compte") } it { expect(subject.body).to include("N° #{dossier.id} ") } it { expect(subject.body).to include(dossier.procedure.libelle) } - it { expect(subject.body).to include("nous nous excusons de la gène occasionnée") } + it { expect(subject.body).to include("nous nous excusons de la gêne occasionnée") } end describe 'termine' do @@ -223,7 +223,7 @@ def notify_deletion_to_administration(deleted_dossier, to_email) subject { described_class.notify_groupe_instructeur_changed(instructeur, dossier) } - it { expect(subject.subject).to eq("Le dossier nº #{dossier.id} a changé de groupe instructeur") } + it { expect(subject.subject).to eq("Le dossier nº #{dossier.id} a changé de groupe d’instructeurs") } it { expect(subject.body).to include("n° #{dossier.id}") } it { expect(subject.body).to include(dossier.procedure.libelle) } it { expect(subject.body).to include("Suite à cette modification, vous ne suivez plus ce dossier.") } diff --git a/spec/system/administrateurs/procedure_publish_spec.rb b/spec/system/administrateurs/procedure_publish_spec.rb index 82a970052be..8a0bef270bb 100644 --- a/spec/system/administrateurs/procedure_publish_spec.rb +++ b/spec/system/administrateurs/procedure_publish_spec.rb @@ -149,7 +149,7 @@ click_on procedure.libelle find('#publish-procedure-link').click - expect(page).to have_content("Attention, certains champs ne peuvent être demandé par l'administration.") + expect(page).to have_content("Attention, certains champs ne peuvent être demandés par l’administration.") expect(page).to have_selector(".dubious-champs", count: dubious_champs.size) end end diff --git a/spec/system/instructeurs/batch_operation_spec.rb b/spec/system/instructeurs/batch_operation_spec.rb index 10f5ecfb77c..9be184ffde8 100644 --- a/spec/system/instructeurs/batch_operation_spec.rb +++ b/spec/system/instructeurs/batch_operation_spec.rb @@ -52,12 +52,12 @@ # ensure alert updates when jobs are run click_on "Recharger la page" - expect(page).to have_content("L'action de masse est terminée") + expect(page).to have_content("L’action de masse est terminée") expect(page).to have_content("1 dossier a été archivé") # clean alert after reload visit instructeur_procedure_path(procedure, statut: 'traites') - expect(page).not_to have_content("L'action de masse est terminée") + expect(page).not_to have_content("L’action de masse est terminée") # try checkall find("##{dom_id(BatchOperation.new, :checkbox_all)}").check From dd1b67bbc7a952d95efabcc5a1d24bf68301e7dd Mon Sep 17 00:00:00 2001 From: Eric Leroy-Terquem Date: Wed, 7 Jun 2023 11:00:38 +0200 Subject: [PATCH 31/41] UI(groupe instructeur): update heading level and wording --- .../one_groupe_management_component.html.haml | 2 +- spec/system/routing/rules_full_scenario_spec.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/components/procedure/one_groupe_management_component/one_groupe_management_component.html.haml b/app/components/procedure/one_groupe_management_component/one_groupe_management_component.html.haml index 67231a72db7..fbb3004d4a0 100644 --- a/app/components/procedure/one_groupe_management_component/one_groupe_management_component.html.haml +++ b/app/components/procedure/one_groupe_management_component/one_groupe_management_component.html.haml @@ -1,5 +1,5 @@ %div{ id: dom_id(@groupe_instructeur, :routing) } - %h2 Paramètres principaux + %h1 Paramètres du groupe = form_for @groupe_instructeur, url: admin_procedure_groupe_instructeur_path(@procedure_id, @groupe_instructeur), diff --git a/spec/system/routing/rules_full_scenario_spec.rb b/spec/system/routing/rules_full_scenario_spec.rb index 93b487e1016..94a1b908221 100644 --- a/spec/system/routing/rules_full_scenario_spec.rb +++ b/spec/system/routing/rules_full_scenario_spec.rb @@ -60,7 +60,7 @@ # update defaut groupe click_on 'défaut' - expect(page).to have_text('Paramètres principaux') + expect(page).to have_text('Paramètres du groupe') fill_in 'Nom du groupe', with: 'littéraire' click_on 'Renommer' expect(page).to have_text('Le nom est à présent « littéraire ». ') From f2dffc2ba3f46d180dd361304ac8755063eb0099 Mon Sep 17 00:00:00 2001 From: Eric Leroy-Terquem Date: Wed, 7 Jun 2023 11:01:28 +0200 Subject: [PATCH 32/41] UI(groupe instructeur): add a hint for adding routing value --- .../one_groupe_management_component.html.haml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/components/procedure/one_groupe_management_component/one_groupe_management_component.html.haml b/app/components/procedure/one_groupe_management_component/one_groupe_management_component.html.haml index fbb3004d4a0..9c2668a8f1c 100644 --- a/app/components/procedure/one_groupe_management_component/one_groupe_management_component.html.haml +++ b/app/components/procedure/one_groupe_management_component/one_groupe_management_component.html.haml @@ -31,13 +31,17 @@ - if @groupe_instructeur.routing_to_configure? %p.fr-mb-1w.fr-badge.fr-badge--warning.fr-badge--sm à configurer - .flex.align-baseline + .flex.align-baseline.fr-mb-1w .fr-mr-2w.no-wrap si le champ .target.fr-mr-2w = targeted_champ_tag .operator.fr-mr-2w.no-wrap est égal à .value = value_tag + .fr-hint-text + %span Si vous ne trouvez pas l'option correspondant à votre groupe, veuillez l'ajouter dans le champ dédié au + %span + = link_to 'routage', champs_admin_procedure_path(@procedure_id) %ul.fr-btns-group.fr-btns-group--sm.fr-btns-group--inline.fr-btns-group--icon-right %li From 68c81c8d230fe3fe509c929e81930df591c44e50 Mon Sep 17 00:00:00 2001 From: Eric Leroy-Terquem Date: Wed, 7 Jun 2023 11:49:22 +0200 Subject: [PATCH 33/41] UI(groupe instructeur): update css to keep content in container --- .../one_groupe_management_component.html.haml | 29 +++++++++---------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/app/components/procedure/one_groupe_management_component/one_groupe_management_component.html.haml b/app/components/procedure/one_groupe_management_component/one_groupe_management_component.html.haml index 9c2668a8f1c..8969290e757 100644 --- a/app/components/procedure/one_groupe_management_component/one_groupe_management_component.html.haml +++ b/app/components/procedure/one_groupe_management_component/one_groupe_management_component.html.haml @@ -43,18 +43,17 @@ %span = link_to 'routage', champs_admin_procedure_path(@procedure_id) - %ul.fr-btns-group.fr-btns-group--sm.fr-btns-group--inline.fr-btns-group--icon-right - %li - - if @groupe_instructeur.can_delete? - %p= t('.delete') - = 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, - data: { confirm: t('.delete_confirmation', group_name: @groupe_instructeur.label) } 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) + .flex.fr-btns-group--sm.fr-btns-group--inline.fr-btns-group--icon-right + - if @groupe_instructeur.can_delete? + %p= t('.delete') + = 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, + data: { confirm: t('.delete_confirmation', group_name: @groupe_instructeur.label) } 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) From 804f89f444d95f3d5fd4c8f24f6f09d7a355a3b3 Mon Sep 17 00:00:00 2001 From: Kara Diaby Date: Mon, 15 May 2023 14:54:07 +0200 Subject: [PATCH 34/41] =?UTF-8?q?Changements=20sur=20le=20caract=C3=A8re?= =?UTF-8?q?=20obligatoire=20/=20facultatif=20et=20l'asterisque=20interface?= =?UTF-8?q?=20usager=20et=20page=20de=20connexion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/assets/stylesheets/forms.scss | 1 + app/assets/stylesheets/icons.scss | 4 ++++ .../input_component/input_component.html.haml | 3 --- .../asterisk_mandatory_component.rb | 2 ++ .../asterisk_mandatory_component.en.yml | 2 ++ .../asterisk_mandatory_component.fr.yml | 2 ++ .../asterisk_mandatory_component.html.haml | 3 +++ .../champ_label_content_component.en.yml | 1 + .../champ_label_content_component.fr.yml | 3 ++- .../champ_label_content_component.html.haml | 9 ++++++--- .../checkbox_component.html.haml | 2 +- app/components/simple_format_component.rb | 4 ++-- app/views/support/index.html.haml | 2 +- app/views/users/registrations/new.html.haml | 2 +- app/views/users/sessions/new.html.haml | 2 +- config/locales/en.yml | 1 + config/locales/fr.yml | 3 ++- spec/system/users/brouillon_spec.rb | 20 +++++++++---------- 18 files changed, 42 insertions(+), 24 deletions(-) create mode 100644 app/components/editable_champ/asterisk_mandatory_component.rb create mode 100644 app/components/editable_champ/asterisk_mandatory_component/asterisk_mandatory_component.en.yml create mode 100644 app/components/editable_champ/asterisk_mandatory_component/asterisk_mandatory_component.fr.yml create mode 100644 app/components/editable_champ/asterisk_mandatory_component/asterisk_mandatory_component.html.haml diff --git a/app/assets/stylesheets/forms.scss b/app/assets/stylesheets/forms.scss index a2f45af60de..274679c691c 100644 --- a/app/assets/stylesheets/forms.scss +++ b/app/assets/stylesheets/forms.scss @@ -17,6 +17,7 @@ color: $dark-grey; } + .mandatory { color: $dark-red; } diff --git a/app/assets/stylesheets/icons.scss b/app/assets/stylesheets/icons.scss index 8bf4fb12dfd..37c0a156a9f 100644 --- a/app/assets/stylesheets/icons.scss +++ b/app/assets/stylesheets/icons.scss @@ -173,4 +173,8 @@ &.move-handle { background-image: image-url("icons/move-handle.svg"); } + + &.mandatory { + width: 10px; + } } diff --git a/app/components/dsfr/input_component/input_component.html.haml b/app/components/dsfr/input_component/input_component.html.haml index 018def6afa5..5fb6b0615df 100644 --- a/app/components/dsfr/input_component/input_component.html.haml +++ b/app/components/dsfr/input_component/input_component.html.haml @@ -2,11 +2,8 @@ = @form.label @attribute, label_opts do - capture do = label - - if @required - %span.mandatory  * - if hint? %span.fr-hint-text= hint - = @form.public_send(@input_type, @attribute, input_opts) - if errors_on_attribute? diff --git a/app/components/editable_champ/asterisk_mandatory_component.rb b/app/components/editable_champ/asterisk_mandatory_component.rb new file mode 100644 index 00000000000..d71d395a091 --- /dev/null +++ b/app/components/editable_champ/asterisk_mandatory_component.rb @@ -0,0 +1,2 @@ +class EditableChamp::AsteriskMandatoryComponent < ApplicationComponent +end diff --git a/app/components/editable_champ/asterisk_mandatory_component/asterisk_mandatory_component.en.yml b/app/components/editable_champ/asterisk_mandatory_component/asterisk_mandatory_component.en.yml new file mode 100644 index 00000000000..907c5b002de --- /dev/null +++ b/app/components/editable_champ/asterisk_mandatory_component/asterisk_mandatory_component.en.yml @@ -0,0 +1,2 @@ +en: + required: required diff --git a/app/components/editable_champ/asterisk_mandatory_component/asterisk_mandatory_component.fr.yml b/app/components/editable_champ/asterisk_mandatory_component/asterisk_mandatory_component.fr.yml new file mode 100644 index 00000000000..7b0e090ee96 --- /dev/null +++ b/app/components/editable_champ/asterisk_mandatory_component/asterisk_mandatory_component.fr.yml @@ -0,0 +1,2 @@ +fr: + required: obligatoire diff --git a/app/components/editable_champ/asterisk_mandatory_component/asterisk_mandatory_component.html.haml b/app/components/editable_champ/asterisk_mandatory_component/asterisk_mandatory_component.html.haml new file mode 100644 index 00000000000..fbea9237465 --- /dev/null +++ b/app/components/editable_champ/asterisk_mandatory_component/asterisk_mandatory_component.html.haml @@ -0,0 +1,3 @@ +%svg.icon.mandatory{ xmlns: "http://www.w3.org/2000/svg", role: "img", 'aria-label': t('.required'), width: 10, height: 10, viewBox: "0 0 1200 1200", "xml:space" => "preserve" } + %desc= t('.required') + %path{ d: "M489.838 29.354v443.603L68.032 335.894 0 545.285l421.829 137.086-260.743 358.876 178.219 129.398L600.048 811.84l260.673 358.806 178.146-129.398-260.766-358.783L1200 545.379l-68.032-209.403-421.899 137.07V29.443H489.84l-.002-.089z" } diff --git a/app/components/editable_champ/champ_label_content_component/champ_label_content_component.en.yml b/app/components/editable_champ/champ_label_content_component/champ_label_content_component.en.yml index 052df2f893d..9d642dd7263 100644 --- a/app/components/editable_champ/champ_label_content_component/champ_label_content_component.en.yml +++ b/app/components/editable_champ/champ_label_content_component/champ_label_content_component.en.yml @@ -3,3 +3,4 @@ en: changes_to_save: "modifications to submit" modified_at: "modified on %{datetime}" check_content_rebased: The type of this field or its description has been modified by the administration. Check its content. + optional_champ: (optional) diff --git a/app/components/editable_champ/champ_label_content_component/champ_label_content_component.fr.yml b/app/components/editable_champ/champ_label_content_component/champ_label_content_component.fr.yml index 8ae8a9d065b..0201f614036 100644 --- a/app/components/editable_champ/champ_label_content_component/champ_label_content_component.fr.yml +++ b/app/components/editable_champ/champ_label_content_component/champ_label_content_component.fr.yml @@ -2,4 +2,5 @@ fr: changes_to_save: "modification à déposer" modified_at: "modifié le %{datetime}" - check_content_rebased: Le type de ce champ ou sa description ont été modifiés par l’administration. Vérifier son contenu. + check_content_rebased: Le type de ce champ ou sa description ont été modifiés par l'administration. Vérifier son contenu. + optional_champ: (facultatif) diff --git a/app/components/editable_champ/champ_label_content_component/champ_label_content_component.html.haml b/app/components/editable_champ/champ_label_content_component/champ_label_content_component.html.haml index 298c3a8672f..5aeff2c6bea 100644 --- a/app/components/editable_champ/champ_label_content_component/champ_label_content_component.html.haml +++ b/app/components/editable_champ/champ_label_content_component/champ_label_content_component.html.haml @@ -1,6 +1,8 @@ -#{@champ.libelle} -- if @champ.mandatory? - %span.mandatory * += @champ.libelle +- if @champ.mandatory? && @champ.type_champ != "checkbox" + = render EditableChamp::AsteriskMandatoryComponent.new +- elsif !@champ.mandatory? + = "#{t('.optional_champ')}" - if @champ.forked_with_changes? %span.updated-at.highlighted @@ -9,6 +11,7 @@ %span.updated-at{ class: highlight_if_unseen_class } = t('.modified_at', datetime: try_format_datetime(@champ.updated_at)) + - if @champ.rebased_at.present? && @champ.rebased_at > (@seen_at || @champ.updated_at) && current_user.owns_or_invite?(@champ.dossier) %span.updated-at.highlighted = t('.check_content_rebased') diff --git a/app/components/editable_champ/checkbox_component/checkbox_component.html.haml b/app/components/editable_champ/checkbox_component/checkbox_component.html.haml index a1e3b5e940b..34e6a0a5a5a 100644 --- a/app/components/editable_champ/checkbox_component/checkbox_component.html.haml +++ b/app/components/editable_champ/checkbox_component/checkbox_component.html.haml @@ -1,4 +1,4 @@ = @form.check_box :value, - { required: @champ.required?, id: @champ.input_id, checked: @champ.true?, aria: { describedby: @champ.describedby_id } }, + { required: @champ.required?, id: @champ.input_id, checked: @champ.true?, aria: { describedby: @champ.describedby_id }, class: class_names('required' => @champ.required?)}, 'true', 'false' diff --git a/app/components/simple_format_component.rb b/app/components/simple_format_component.rb index 74819a00220..ac3a061c6a0 100644 --- a/app/components/simple_format_component.rb +++ b/app/components/simple_format_component.rb @@ -28,8 +28,8 @@ def initialize(text, allow_a: true, class_names_map: {}) @allow_a = allow_a @text = (text || "").gsub(/\R/, "\n\n") # force double \n otherwise a single one won't split paragraph - .split("\n\n") # - .map(&:lstrip) # this block prevent redcarpet to consider " text" as block code by lstriping + .split("\n\n") + .map(&:lstrip) # this block prevent redcarpet to consider " text" as block code by lstriping .join("\n\n") .gsub(EMAIL_IN_TEXT_REGEX) { _1.gsub('_', '\\_') } # Workaround for redcarpet bug on autolink email having _. Cf tests diff --git a/app/views/support/index.html.haml b/app/views/support/index.html.haml index e8101b9746c..01c05c156ca 100644 --- a/app/views/support/index.html.haml +++ b/app/views/support/index.html.haml @@ -13,7 +13,7 @@ .recommandations %h2 = t('.intro_html') - %p.mandatory-explanation= t('asterisk_html', scope: [:utils]) + %p.mandatory-explanation= t('mandatory_champs', scope: [:utils]) - if !user_signed_in? .fr-input-group diff --git a/app/views/users/registrations/new.html.haml b/app/views/users/registrations/new.html.haml index e86419ad20f..ac584b92c66 100644 --- a/app/views/users/registrations/new.html.haml +++ b/app/views/users/registrations/new.html.haml @@ -13,7 +13,7 @@ %h2.fr-h6= I18n.t('views.registrations.new.subtitle') .fr-fieldset__element - %p.fr-text--sm= t('utils.asterisk_html') + %p.fr-text--sm= t('utils.mandatory_champs') .fr-fieldset__element= render Dsfr::InputComponent.new(form: f, attribute: :email, input_type: :email_field, opts: { autocomplete: 'email', autofocus: true }) diff --git a/app/views/users/sessions/new.html.haml b/app/views/users/sessions/new.html.haml index 85247fc5e93..2b33d54375a 100644 --- a/app/views/users/sessions/new.html.haml +++ b/app/views/users/sessions/new.html.haml @@ -14,7 +14,7 @@ %h2.fr-h6= I18n.t('views.users.sessions.new.subtitle') .fr-fieldset__element - %p.fr-text--sm= t('utils.asterisk_html') + %p.fr-text--sm= t('utils.mandatory_champs') .fr-fieldset__element= render Dsfr::InputComponent.new(form: f, attribute: :email, input_type: :email_field, opts: { autocomplete: 'email', autofocus: true }) diff --git a/config/locales/en.yml b/config/locales/en.yml index ad5e60bf4c6..e002d01d96a 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -50,6 +50,7 @@ en: deconnexion: "Log out" pj: "Attachments" asterisk_html: Fields marked by an asterisk ( * ) are mandatory. + mandatory_champs: All fields are mandatory. file_number: File number subject: Subject message: Message diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 5b92f2555f4..8691585526a 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -40,7 +40,8 @@ fr: i_dont_know: Je ne sais pas deconnexion: "Déconnexion" pj: "Pièces jointes" - asterisk_html: Les champs suivis d’un astérisque ( * ) sont obligatoires. + asterisk_html: Les champs suivis d’un astérisque ( * ) sont obligatoires. + mandatory_champs: Tous les champs sont obligatoires. file_number: Numéro de dossier subject: Sujet message: Message diff --git a/spec/system/users/brouillon_spec.rb b/spec/system/users/brouillon_spec.rb index f5a8a89d1bd..bdddc6797a5 100644 --- a/spec/system/users/brouillon_spec.rb +++ b/spec/system/users/brouillon_spec.rb @@ -12,9 +12,9 @@ fill_individual # fill data - fill_in('text *', with: 'super texte') + fill_in('text', with: 'super texte', match: :first) fill_in('textarea', with: 'super textarea') - fill_in('date *', with: '12-12-2012') + fill_in('date', with: '12-12-2012', match: :first) fill_in('datetime', with: Time.zone.parse('2023-01-06T07:05')) find("input[type=datetime-local]").send_keys(:arrow_up).send_keys(:arrow_down) # triggers onChange fill_in('number', with: '42') @@ -329,7 +329,7 @@ fill_individual - fill_in('age', with: 10) + fill_in('age (facultatif)', with: 10) click_on 'Déposer le dossier' expect(page).to have_current_path(merci_dossier_path(user_dossier)) end @@ -400,9 +400,9 @@ fill_individual - fill_in('age', with: '18') - expect(page).to have_css('label', text: 'nom *', visible: :visible) - + fill_in('age (facultatif)', with: '18') + expect(page).to have_css('label', text: 'nom', visible: :visible) + expect(page).to have_css('.icon.mandatory') click_on 'Déposer le dossier' expect(page).to have_current_path(brouillon_dossier_path(user_dossier)) end @@ -437,7 +437,7 @@ expect(page).to have_no_css('legend h2', text: 'info voiture', visible: true) expect(page).to have_no_css('label', text: 'tonnage', visible: true) - fill_in('age', with: '18') + fill_in('age (facultatif)', with: '18') expect(page).to have_css('label', text: 'permis de conduire', visible: true) expect(page).to have_css('legend h2', text: 'info voiture', visible: true) expect(page).to have_no_css('label', text: 'tonnage', visible: true) @@ -450,10 +450,10 @@ expect(page).to have_css('label', text: 'parking', visible: true) # try to fill with invalid data - fill_in('tonnage', with: 'a') + fill_in('tonnage (facultatif)', with: 'a') expect(page).to have_no_css('label', text: 'parking', visible: true) - fill_in('age', with: '2') + fill_in('age (facultatif)', with: '2') expect(page).to have_no_css('label', text: 'permis de conduire', visible: true) expect(page).to have_no_css('label', text: 'tonnage', visible: true) @@ -465,7 +465,7 @@ expect(page).to have_no_css('label', text: 'permis de conduire', visible: true) expect(page).to have_no_css('label', text: 'tonnage', visible: true) - fill_in('age', with: '18') + fill_in('age (facultatif)', with: '18') wait_for_autosave(false) # the champ keeps their previous value so they are all displayed From 68f1d10e19699f1dda5799e5dd97f2a5465037fd Mon Sep 17 00:00:00 2001 From: Colin Darie Date: Mon, 12 Jun 2023 17:46:01 +0200 Subject: [PATCH 35/41] style(dossier-badge): en_instruction & accepte should have badge --- app/helpers/dossier_helper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/helpers/dossier_helper.rb b/app/helpers/dossier_helper.rb index 218fde5a149..6dfeb1f40c7 100644 --- a/app/helpers/dossier_helper.rb +++ b/app/helpers/dossier_helper.rb @@ -81,7 +81,7 @@ def status_badge(state, alignment_class = '') status_text = dossier_display_state(state, lower: true) tag.span status_text, role: 'status', class: class_names( 'fr-badge fr-badge--sm' => true, - 'fr-badge--no-icon' => [Dossier.states.fetch(:en_instruction), Dossier.states.fetch(:accepte)].include?(state), + 'fr-badge--no-icon' => [Dossier.states.fetch(:en_instruction), Dossier.states.fetch(:accepte)].exclude?(state), class_badge_state(state) => true, alignment_class => true ) From e4e47a4e97abce66ff783bf405a2d59863efd74c Mon Sep 17 00:00:00 2001 From: Colin Darie Date: Mon, 12 Jun 2023 17:48:03 +0200 Subject: [PATCH 36/41] =?UTF-8?q?fix(instructeur):=20corrections=20notifi?= =?UTF-8?q?=C3=A9=20=3D>=20inform=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../en_construction_menu_component.html.haml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/components/instructeurs/en_construction_menu_component/en_construction_menu_component.html.haml b/app/components/instructeurs/en_construction_menu_component/en_construction_menu_component.html.haml index 0c691ca45e7..0983ca0ed4c 100644 --- a/app/components/instructeurs/en_construction_menu_component/en_construction_menu_component.html.haml +++ b/app/components/instructeurs/en_construction_menu_component/en_construction_menu_component.html.haml @@ -8,7 +8,7 @@ %span.fr-icon.fr-icon-draft-line.fr-text-default--info.fr-mt-1v{ "aria-hidden": "true" } .dropdown-description %h4= t('.revert_en_construction') - L’usager sera notifié qu’il peut modifier son dossier + L’usager sera informé qu’il peut modifier son dossier - menu.with_item do = link_to('#', onclick: "DS.showMotivation(event, 'pending_correction');", role: 'menuitem') do @@ -16,7 +16,7 @@ .dropdown-description %h4= t('.request_correction') - L’usager sera notifié que des modifications sont attendues + L’usager sera informé que des modifications sont attendues - menu.with_item(class: "inactive form-inside fr-pt-1v") do = render partial: 'instructeurs/dossiers/instruction_button_motivation', locals: { dossier:, From 8c2f838fd1b87aca3fe771f73060f224e546bdb0 Mon Sep 17 00:00:00 2001 From: simon lehericey Date: Thu, 8 Jun 2023 11:25:39 +0200 Subject: [PATCH 37/41] wording: add doc link concerning excel macros --- app/assets/stylesheets/menu_component.scss | 10 ++++++++++ app/components/dossiers/export_component.rb | 2 ++ .../dossiers/export_component/export_component.en.yml | 3 +++ .../dossiers/export_component/export_component.fr.yml | 3 +++ .../export_component/export_component.html.haml | 8 ++++++++ app/components/dropdown/menu_component.rb | 1 + .../dropdown/menu_component/menu_component.html.haml | 1 + 7 files changed, 28 insertions(+) create mode 100644 app/assets/stylesheets/menu_component.scss diff --git a/app/assets/stylesheets/menu_component.scss b/app/assets/stylesheets/menu_component.scss new file mode 100644 index 00000000000..3bc0c9f53e6 --- /dev/null +++ b/app/assets/stylesheets/menu_component.scss @@ -0,0 +1,10 @@ +@import "colors"; + +.menu-component-header { + color: $dark-grey; + font-size: 12px; + + a { + text-decoration: underline; + } +} diff --git a/app/components/dossiers/export_component.rb b/app/components/dossiers/export_component.rb index 8e6c56233a3..bb955c21ea5 100644 --- a/app/components/dossiers/export_component.rb +++ b/app/components/dossiers/export_component.rb @@ -1,4 +1,6 @@ class Dossiers::ExportComponent < ApplicationComponent + include ApplicationHelper + def initialize(procedure:, exports:, statut: nil, count: nil, class_btn: nil, export_url: nil) @procedure = procedure @exports = exports diff --git a/app/components/dossiers/export_component/export_component.en.yml b/app/components/dossiers/export_component/export_component.en.yml index 67b50432455..ecc6600502f 100644 --- a/app/components/dossiers/export_component/export_component.en.yml +++ b/app/components/dossiers/export_component/export_component.en.yml @@ -12,3 +12,6 @@ en: download: one: Download a file other: Download %{count} files + macros_doc: + title: "Macros documentation" + url: "https://doc.demarches-simplifiees.fr/pour-aller-plus-loin/exports-et-macros" diff --git a/app/components/dossiers/export_component/export_component.fr.yml b/app/components/dossiers/export_component/export_component.fr.yml index 7895c00f30a..c89310c8902 100644 --- a/app/components/dossiers/export_component/export_component.fr.yml +++ b/app/components/dossiers/export_component/export_component.fr.yml @@ -12,3 +12,6 @@ fr: download: one: Télécharger un dossier other: Télécharger %{count} dossiers + macros_doc: + title: "documentation sur les macros" + url: "https://doc.demarches-simplifiees.fr/pour-aller-plus-loin/exports-et-macros" diff --git a/app/components/dossiers/export_component/export_component.html.haml b/app/components/dossiers/export_component/export_component.html.haml index d60b6b49069..e4e2be3e234 100644 --- a/app/components/dossiers/export_component/export_component.html.haml +++ b/app/components/dossiers/export_component/export_component.html.haml @@ -1,4 +1,12 @@ = render Dropdown::MenuComponent.new(wrapper: :span, button_options: { class: ['fr-btn--sm', @class_btn.present? ? @class_btn : 'fr-btn--secondary']}, menu_options: { id: @count.nil? ? "download_menu" : "download_all_menu", class: ['dropdown-export'] }) do |menu| + - menu.with_menu_header_html do + %p.menu-component-header.fr-px-2w.fr-pt-2w.fr-mb-0 + %span.fr-icon-info-line{ aria: { hidden: true } } + Des macros ? Lisez la + = link_to('doc', t('.macros_doc.url'), + title: t('.macros_doc.title'), + **external_link_attributes) + - menu.with_button_inner_html do = @count.nil? ? t(".download_all") : t(".download", count: @count) - exports.each do |item| diff --git a/app/components/dropdown/menu_component.rb b/app/components/dropdown/menu_component.rb index eb9f3889782..1bbbbd1cf96 100644 --- a/app/components/dropdown/menu_component.rb +++ b/app/components/dropdown/menu_component.rb @@ -1,5 +1,6 @@ class Dropdown::MenuComponent < ApplicationComponent renders_one :button_inner_html + renders_one :menu_header_html # beware, items elements like button_to/link_to must include role: 'menuitem' for aria reason renders_many :items, -> (options = {}, &block) do tag.li(**options.merge(role: 'none'), &block) diff --git a/app/components/dropdown/menu_component/menu_component.html.haml b/app/components/dropdown/menu_component/menu_component.html.haml index a1f3859edc3..441ba1db743 100644 --- a/app/components/dropdown/menu_component/menu_component.html.haml +++ b/app/components/dropdown/menu_component/menu_component.html.haml @@ -3,6 +3,7 @@ = button_inner_html %div{ data: { menu_button_target: 'menu' }, id: menu_id, 'aria-labelledby': button_id, role: menu_role, 'tab-index': -1, class: menu_class_names } + = menu_header_html -# the dropdown can be a menu with a list of item - if items? From 5b02ff8ae246790b78660c27f6212beffa748a06 Mon Sep 17 00:00:00 2001 From: simon lehericey Date: Mon, 12 Jun 2023 22:00:18 +0200 Subject: [PATCH 38/41] fix: remove /rails/ path from search engine --- public/robots.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/public/robots.txt b/public/robots.txt index 25783613712..ebc7f94ca7a 100644 --- a/public/robots.txt +++ b/public/robots.txt @@ -3,3 +3,4 @@ # To ban all spiders from the entire site uncomment the next two lines: User-agent: * Disallow: /commencer* +Disallow: /rails/ From d18ba7fbe68f9e02c353b526e4e48eee257d8ee2 Mon Sep 17 00:00:00 2001 From: Eric Leroy-Terquem Date: Tue, 13 Jun 2023 14:20:21 +0200 Subject: [PATCH 39/41] add routing rules for cloned routed procedure --- ...routing_engine_for_a_cloned_procedure.rake | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 lib/tasks/deployment/20230613114744_replay_routing_engine_for_a_cloned_procedure.rake diff --git a/lib/tasks/deployment/20230613114744_replay_routing_engine_for_a_cloned_procedure.rake b/lib/tasks/deployment/20230613114744_replay_routing_engine_for_a_cloned_procedure.rake new file mode 100644 index 00000000000..9d4f3a28491 --- /dev/null +++ b/lib/tasks/deployment/20230613114744_replay_routing_engine_for_a_cloned_procedure.rake @@ -0,0 +1,25 @@ +namespace :after_party do + desc 'Deployment task: replay_routing_engine_for_a_cloned_procedure' + task replay_routing_engine_for_a_cloned_procedure: :environment do + puts "Running deploy task 'replay_routing_engine_for_a_cloned_procedure'" + + # Put your task implementation HERE. + dossiers = Procedure + .find(76266) + .dossiers + .en_construction + + progress = ProgressReport.new(dossiers.count) + + dossiers.find_each do |dossier| + RoutingEngine.compute(dossier) + progress.inc + end + progress.finish + + # Update task as completed. If you remove the line below, the task will + # run with every deploy (or every time you call after_party:run). + AfterParty::TaskRecord + .create version: AfterParty::TaskRecorder.new(__FILE__).timestamp + end +end From 71c6b6eea0ccd5c88b797c0d55f9d722e38b552f Mon Sep 17 00:00:00 2001 From: Christian Lautier <15379878+maatinito@users.noreply.github.com> Date: Mon, 28 Aug 2023 10:16:48 -1000 Subject: [PATCH 40/41] fix dossier_specs --- spec/models/dossier_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/models/dossier_spec.rb b/spec/models/dossier_spec.rb index 0b70fa6096b..7775ebba1b2 100644 --- a/spec/models/dossier_spec.rb +++ b/spec/models/dossier_spec.rb @@ -1170,7 +1170,7 @@ it "can't accepter_automatiquement" do expect(dossier_incomplete.may_accepter_automatiquement?(instructeur:, motivation:)).to be_falsey - expect(dossier_ok.accepter_automatiquement.to be_truthy + expect(dossier_ok.accepter_automatiquement).to be_truthy end end From 10f7cbafb72a22564790a5c917ea4293922c8037 Mon Sep 17 00:00:00 2001 From: Christian Lautier <15379878+maatinito@users.noreply.github.com> Date: Mon, 28 Aug 2023 13:31:18 -1000 Subject: [PATCH 41/41] fix linked_drop_down_spec --- spec/system/users/linked_dropdown_spec.rb | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/spec/system/users/linked_dropdown_spec.rb b/spec/system/users/linked_dropdown_spec.rb index e13e02c25c2..b379c7be65e 100644 --- a/spec/system/users/linked_dropdown_spec.rb +++ b/spec/system/users/linked_dropdown_spec.rb @@ -13,8 +13,8 @@ 'Secondary 2.3' ] end - - let(:procedure) { create(:procedure, :published, :for_individual, types_de_champ_public: [{ type: :linked_drop_down_list, libelle: 'linked dropdown', options: options, mandatory: mandatory }]) } + let(:secondary_label) { 'level 2' } + let(:procedure) { create(:procedure, :published, :for_individual, types_de_champ_public: [{ type: :linked_drop_down_list, libelle: 'linked dropdown', options: options, mandatory: mandatory, secondary_libelle: secondary_label }]) } let(:user_dossier) { user.dossiers.first } context 'not mandatory' do @@ -29,13 +29,13 @@ select('Primary 2', from: 'linked dropdown') # Secondary menu reflects chosen primary value - expect(page).to have_select('linked dropdown : précisez', options: ['', 'Secondary 2.1', 'Secondary 2.2', 'Secondary 2.3']) + expect(page).to have_select(secondary_label, options: ['', 'Secondary 2.1', 'Secondary 2.2', 'Secondary 2.3']) # Select another primary value select('Primary 1', from: 'linked dropdown') # Secondary menu gets updated - expect(page).to have_select("linked dropdown : précisez", options: ['', 'Secondary 1.1', 'Secondary 1.2']) + expect(page).to have_select(secondary_label, options: ['', 'Secondary 1.1', 'Secondary 1.2']) end end @@ -49,16 +49,16 @@ expect(page).to have_select("linked dropdown", options: ['', 'Primary 1', 'Primary 2']) # Select a primary value - select('Primary 2', from: 'linked dropdown *') + select('Primary 2', from: 'linked dropdown') # Secondary menu reflects chosen primary value - expect(page).to have_select('linked dropdown : précisez', options: ['', 'Secondary 2.1', 'Secondary 2.2', 'Secondary 2.3']) + expect(page).to have_select(secondary_label, options: ['', 'Secondary 2.1', 'Secondary 2.2', 'Secondary 2.3']) # Select another primary value - select('Primary 1', from: 'linked dropdown *') + select('Primary 1', from: 'linked dropdown') # Secondary menu gets updated - expect(page).to have_select("linked dropdown : précisez", options: ['', 'Secondary 1.1', 'Secondary 1.2']) + expect(page).to have_select(secondary_label, options: ['', 'Secondary 1.1', 'Secondary 1.2']) end end