diff --git a/Gemfile b/Gemfile index db7e7f209b..96a7c04982 100644 --- a/Gemfile +++ b/Gemfile @@ -132,6 +132,7 @@ gem "rails_autolink" # ActionView helper to render currently active links gem "active_link_to" gem "dsfr-view-components" +gem "dsfr-form_builder", "= 0.0.2" # On fixe la version tant qu’on est pas en 1.0 # Easily create styled HTML emails in Rails. gem "premailer-rails" # Mail formatting diff --git a/Gemfile.lock b/Gemfile.lock index ddfa999ad4..f721f3ef73 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -239,6 +239,10 @@ GEM railties (>= 3.2) drb (2.2.1) dsfr-assets (1.13.0.1) + dsfr-form_builder (0.0.2) + actionview (>= 6.1, < 9.0) + activemodel (>= 6.1, < 9.0) + activesupport (>= 6.1, < 9.0) dsfr-view-components (2.1.0) dsfr-assets (~> 1.13) html-attributes-utils (~> 1) @@ -763,6 +767,7 @@ DEPENDENCIES doorkeeper-i18n dotenv-rails drb + dsfr-form_builder (= 0.0.2) dsfr-view-components factory_bot faker diff --git a/app/form_builders/dsfr_form_builder.rb b/app/form_builders/dsfr_form_builder.rb deleted file mode 100644 index bb67287fcf..0000000000 --- a/app/form_builders/dsfr_form_builder.rb +++ /dev/null @@ -1,99 +0,0 @@ -# Source: https://github.com/etalab/data_pass/blob/develop/app/form_builders/dsfr_form_builder.rb -# Quelques modifications ont été appliquées car nous n’utilisons pas i18n pour les labels et les hints -# et nous n’utilisons pas tous les types de champs -class DsfrFormBuilder < ActionView::Helpers::FormBuilder - include Rails.application.routes.url_helpers - include ActionView::Helpers::OutputSafetyHelper - - attr_accessor :display_required_tags - - def initialize(object_name, object, template, options) - super - self.display_required_tags = options.fetch(:display_required_tags, true) - end - - def dsfr_text_field(attribute, opts = {}) - dsfr_input_field(attribute, :text_field, opts) - end - - def dsfr_email_field(attribute, opts = {}) - dsfr_input_field(attribute, :email_field, opts) - end - - def dsfr_phone_field(attribute, opts = {}) - dsfr_input_field(attribute, :phone_field, opts) - end - - def dsfr_input_group(attribute, opts, &block) - @template.content_tag(:div, class: input_group_classes(attribute, opts), data: opts[:data]) do - yield(block) - end - end - - def dsfr_input_field(attribute, input_kind, opts = {}) - dsfr_input_group(attribute, opts) do - @template.safe_join( - [ - dsfr_label_with_hint(attribute, opts), - public_send(input_kind, attribute, class: "fr-input", **opts.except(:class)), - dsfr_error_message(attribute), - ] - ) - end - end - - def dsfr_label_with_hint(attribute, opts = {}) - label_class = "fr-label #{opts[:class]}" - label(attribute, class: label_class) do - label_and_tags = [label_value(attribute, opts)] - label_and_tags.push(required_tag) if opts[:required] && display_required_tags - label_and_tags.push(hint_tag(opts[:hint])) if opts[:hint] - - @template.safe_join(label_and_tags) - end - end - - def required_tag - @template.content_tag(:span, "*", class: "fr-text-error") - end - - def dsfr_error_message(attr) - return if @object.errors[attr].none? - - @template.content_tag(:p, class: "fr-messages-group") do - safe_join(@object.errors.full_messages_for(attr).map do |msg| - @template.content_tag(:span, msg, class: "fr-message fr-message--error") - end) - end - end - - def hint_tag(text) - return "" unless text - - @template.content_tag(:span, class: "fr-hint-text") do - text - end - - @template.content_tag(:span, text, class: "fr-hint-text") - end - - def join_classes(arr) - arr.compact.join(" ") - end - - def input_group_classes(attribute, opts) - join_classes( - [ - "fr-input-group", - @object.errors[attribute].any? ? "fr-input-group--error" : nil, - opts[:class], - ] - ) - end - - def label_value(attribute, opts) - return opts[:label] if opts[:label] - - (@object.try(:object) || @object).class.human_attribute_name(attribute) - end -end diff --git a/app/views/admin/territories/invitations_devise/edit.html.slim b/app/views/admin/territories/invitations_devise/edit.html.slim index 958d7056b3..1cc2146e2e 100644 --- a/app/views/admin/territories/invitations_devise/edit.html.slim +++ b/app/views/admin/territories/invitations_devise/edit.html.slim @@ -12,7 +12,7 @@ p.fr-mt-3w.fr-hr-or = "ou" h2 Se créer un compte avec un mot de passe - = form_for resource, as: resource_name, url: invitation_path(resource_name), html: { method: :put }, builder: DsfrFormBuilder, display_required_tags: false do |f| + = form_for resource, as: resource_name, url: invitation_path(resource_name), html: { method: :put }, builder: Dsfr::FormBuilder, display_required_tags: false do |f| p.fr-hint-text Tous les champs sont obligatoires. = render "devise/shared/dsfr_error_messages", resource: resource = f.hidden_field :invitation_token diff --git a/app/views/agents/sessions/new.html.slim b/app/views/agents/sessions/new.html.slim index ae1ff17286..cb1bb5d903 100644 --- a/app/views/agents/sessions/new.html.slim +++ b/app/views/agents/sessions/new.html.slim @@ -14,7 +14,7 @@ h1.rdv-text-align-center.text-dark.mt-0.font-weight-bold.mb-4 Connexion à #{cur p.fr-hr-or ou p.text-muted.mb-2 Entrez votre email et votre mot de passe. -= form_for resource, as: resource_name, url: session_path(resource_name), builder: DsfrFormBuilder do |f| += form_for resource, as: resource_name, url: session_path(resource_name), builder: Dsfr::FormBuilder do |f| = render "devise/shared/error_messages", resource: resource .form-group = f.dsfr_email_field :email, label: "Adresse email", hint: "Format attendu : nom@domaine.fr" diff --git a/app/views/devise/passwords/edit.html.slim b/app/views/devise/passwords/edit.html.slim index a56b13d587..2fe63d308a 100644 --- a/app/views/devise/passwords/edit.html.slim +++ b/app/views/devise/passwords/edit.html.slim @@ -4,7 +4,7 @@ - if @from_confirmation p.text-muted Pour finaliser votre inscription, veuillez définir un mot de passe. -= form_for resource, as: resource_name, url: password_path(resource_name), html: { method: :put }, builder: DsfrFormBuilder do |f| += form_for resource, as: resource_name, url: password_path(resource_name), html: { method: :put }, builder: Dsfr::FormBuilder do |f| = f.hidden_field :reset_password_token .form-group = render "common/form/new_password_input", f: f diff --git a/app/views/devise/passwords/new.html.slim b/app/views/devise/passwords/new.html.slim index dcf41b2269..410fe22c24 100644 --- a/app/views/devise/passwords/new.html.slim +++ b/app/views/devise/passwords/new.html.slim @@ -1,4 +1,4 @@ -= form_for resource, as: resource_name, url: password_path(resource_name), builder: DsfrFormBuilder do |f| += form_for resource, as: resource_name, url: password_path(resource_name), builder: Dsfr::FormBuilder do |f| .text-center.w-75.m-auto h4.text-dark-50.text-center.mt-0.font-weight-bold Mot de passe oublié ? p.text-muted.mb-4 Entrez votre email pour recevoir un lien de réinitialisation de mot de passe diff --git a/app/views/users/invitations/edit.html.slim b/app/views/users/invitations/edit.html.slim index ef21ac511d..4ab15b98ac 100644 --- a/app/views/users/invitations/edit.html.slim +++ b/app/views/users/invitations/edit.html.slim @@ -4,7 +4,7 @@ = render "users/rdv_wizard_steps/rdv_wizard_summary", rdv_wizard: @rdv_wizard if @rdv_wizard.present? .card-body - = form_for resource, as: resource_name, url: invitation_path(resource_name), html: { method: :put }, builder: DsfrFormBuilder do |f| + = form_for resource, as: resource_name, url: invitation_path(resource_name), html: { method: :put }, builder: Dsfr::FormBuilder do |f| .rdv-text-align-center.w-75.m-auto = render "devise/shared/dsfr_error_messages", resource: resource = f.hidden_field :invitation_token diff --git a/app/views/users/passwords/edit.html.slim b/app/views/users/passwords/edit.html.slim index c8c9837ade..e41443fb50 100644 --- a/app/views/users/passwords/edit.html.slim +++ b/app/views/users/passwords/edit.html.slim @@ -5,7 +5,7 @@ - if @from_confirmation p.rdv-color-text-mention-grey Pour finaliser votre inscription, veuillez définir un mot de passe. - = form_for resource, as: resource_name, url: password_path(resource_name), html: { method: :put }, builder: DsfrFormBuilder do |f| + = form_for resource, as: resource_name, url: password_path(resource_name), html: { method: :put }, builder: Dsfr::FormBuilder do |f| = f.hidden_field :reset_password_token .form-group = render "common/form/new_password_input", f: f diff --git a/app/views/users/registrations/edit.html.slim b/app/views/users/registrations/edit.html.slim index 351e1a8932..630c964e0c 100644 --- a/app/views/users/registrations/edit.html.slim +++ b/app/views/users/registrations/edit.html.slim @@ -5,7 +5,7 @@ - if resource.logged_once_with_franceconnect? .fr-alert.fr-alert--info.fr-mb-3w | Vous pouvez ici changer l'email et le mot de passe de votre compte #{current_domain.name}, et pas ceux de FranceConnect - = form_for resource, as: resource_name, url: registration_path(resource_name), remote: request.xhr?, html: { method: :put }, builder: DsfrFormBuilder do |f| + = form_for resource, as: resource_name, url: registration_path(resource_name), remote: request.xhr?, html: { method: :put }, builder: Dsfr::FormBuilder do |f| = f.dsfr_email_field :email, value: (resource.pending_reconfirmation? ? resource.unconfirmed_email : resource.email) - if devise_mapping.confirmable? && resource.pending_reconfirmation? .form-text.rdv-color-text-mention-grey.mb-2 diff --git a/app/views/users/registrations/new.html.slim b/app/views/users/registrations/new.html.slim index f45e33c35c..65ec67a6d8 100644 --- a/app/views/users/registrations/new.html.slim +++ b/app/views/users/registrations/new.html.slim @@ -4,7 +4,7 @@ = render "users/rdv_wizard_steps/rdv_wizard_summary", rdv_wizard: @rdv_wizard if @rdv_wizard.present? .card-body - = form_for resource, as: :user, url: registration_path(resource_name), builder: DsfrFormBuilder do |f| + = form_for resource, as: :user, url: registration_path(resource_name), builder: Dsfr::FormBuilder do |f| - if current_domain.france_connect_enabled || params[:force_franceconnect].present? h2 Se créer un compte avec FranceConnect = render "common/franceconnect_button" diff --git a/app/views/users/sessions/new.html.slim b/app/views/users/sessions/new.html.slim index 80fdbf1938..4eb5ddf452 100644 --- a/app/views/users/sessions/new.html.slim +++ b/app/views/users/sessions/new.html.slim @@ -12,7 +12,7 @@ h2 Se connecter avec son compte - = form_for resource, as: resource_name, url: session_path(resource_name), builder: DsfrFormBuilder do |f| + = form_for resource, as: resource_name, url: session_path(resource_name), builder: Dsfr::FormBuilder do |f| = render "devise/shared/error_messages", resource: resource = f.dsfr_email_field :email, autofocus: true, hint: "Format attendu : nom@domaine.fr", require: true, label: "Adresse email" = render "common/form/current_password_input", f:, forgotten_password_link: true