From 2555a0a86770e0b36fd32d598d7d35cebac06adf Mon Sep 17 00:00:00 2001 From: Istarengwa Date: Wed, 11 Mar 2026 21:31:58 +0100 Subject: [PATCH 1/4] update feature for boutique number in home page --- app/controllers/home_pages_controller.rb | 2 +- app/models/home_page.rb | 16 ++++++-- app/views/home_pages/_form.html.erb | 11 ++++-- app/views/home_pages/admin.html.erb | 7 ++-- app/views/home_pages/index.html.erb | 24 +++++++++--- ...0_add_shop_products_limit_to_home_pages.rb | 5 +++ db/schema.rb | 3 +- spec/models/home_page_spec.rb | 39 ++++++++++++++++++- 8 files changed, 88 insertions(+), 19 deletions(-) create mode 100644 db/migrate/20260311161000_add_shop_products_limit_to_home_pages.rb diff --git a/app/controllers/home_pages_controller.rb b/app/controllers/home_pages_controller.rb index 8c2234e..1348248 100644 --- a/app/controllers/home_pages_controller.rb +++ b/app/controllers/home_pages_controller.rb @@ -81,6 +81,6 @@ def set_home_page # Only allow a list of trusted parameters through. def home_page_params params.expect(home_page: [ :title, :content, :position, :bloc_type, :target_id, :shop_scope, :image, :button_label, - :layout_background, :layout_text_tone, :layout_image_position ]) + :layout_background, :layout_text_tone, :layout_image_position, :shop_products_limit ]) end end diff --git a/app/models/home_page.rb b/app/models/home_page.rb index f33a680..00f0377 100644 --- a/app/models/home_page.rb +++ b/app/models/home_page.rb @@ -38,6 +38,12 @@ class HomePage < ApplicationRecord has_one_attached :image validates :button_url, length: { maximum: 1024 }, allow_blank: true + validates :shop_products_limit, + numericality: { + only_integer: true, + greater_than: 0, + message: "doit être un entier supérieur à 0" + } def target_record case bloc_type @@ -47,18 +53,20 @@ def target_record end end - def shop_products(limit = 5) + def shop_products(limit = shop_products_limit) + safe_limit = [limit.to_i, 1].max + case shop_scope when "last" - Product.order(created_at: :desc).limit(limit) + Product.order(created_at: :desc).limit(safe_limit) when "top_sellers" Product.left_joins(:order_products) .select("products.*, COALESCE(SUM(order_products.quantity), 0) AS total_sold") .group("products.id") .order(Arel.sql("total_sold DESC")) - .limit(limit) + .limit(safe_limit) else - Product.order(created_at: :asc).limit(limit) + Product.order(created_at: :asc).limit(safe_limit) end end diff --git a/app/views/home_pages/_form.html.erb b/app/views/home_pages/_form.html.erb index 28d1aa0..635f578 100644 --- a/app/views/home_pages/_form.html.erb +++ b/app/views/home_pages/_form.html.erb @@ -91,12 +91,17 @@
<%= form.label :shop_scope, "Sélection boutique", class: "form-label" %> <%= form.select :shop_scope, - [["5 premiers", "first"], - ["5 derniers", "last"], - ["5 plus achetés", "top_sellers"]], + [["Premiers produits", "first"], + ["Derniers produits", "last"], + ["Produits les plus achetés", "top_sellers"]], {}, class: "form-select" %>
Utilisé si le type est “Bloc boutique”.
+
+ <%= form.label :shop_products_limit, "Nombre d’articles à afficher", class: "form-label" %> + <%= form.number_field :shop_products_limit, class: "form-control", min: 1, step: 1 %> +
Minimum 1. L’affichage s’adapte automatiquement.
+
diff --git a/app/views/home_pages/admin.html.erb b/app/views/home_pages/admin.html.erb index 8d30cea..0d9e065 100644 --- a/app/views/home_pages/admin.html.erb +++ b/app/views/home_pages/admin.html.erb @@ -41,10 +41,11 @@ end when "repair" then "Bloc Réparation ##{home_page.target_id}" when "shop" + product_limit = [home_page.shop_products_limit.to_i, 1].max case home_page.shop_scope - when "first" then "Boutique - 5 premiers" - when "last" then "Boutique - 5 derniers" - else "Boutique - 5 plus achetés" + when "first" then "Boutique - #{product_limit} premiers" + when "last" then "Boutique - #{product_limit} derniers" + else "Boutique - #{product_limit} plus achetés" end else "Bloc personnalisé" diff --git a/app/views/home_pages/index.html.erb b/app/views/home_pages/index.html.erb index c882229..c8eac6c 100644 --- a/app/views/home_pages/index.html.erb +++ b/app/views/home_pages/index.html.erb @@ -73,15 +73,27 @@

<%= home_page.title %>

<% products = home_page.shop_products %> <% if products.any? %> -
+ <% product_count = products.size %> + <% grid_classes = + if product_count == 1 + "row row-cols-1 justify-content-center g-3" + elsif product_count == 2 + "row row-cols-1 row-cols-md-2 g-3" + else + "row row-cols-1 row-cols-md-2 row-cols-lg-3 row-cols-xl-4 g-3" + end %> +
<% products.each do |product| %> -
+ <% column_classes = product_count == 1 ? "col-12 col-md-8 col-lg-6 col-xl-5" : "col" %> +
<% if product.primary_image.present? %> - <%= attachment_thumb(product.primary_image, - variant_options: { resize_to_fill: [600, 600] }, - class: "card-img-top", - style: "aspect-ratio: 1 / 1; object-fit: cover;") %> +
+ <%= attachment_thumb(product.primary_image, + variant_options: { resize_to_limit: [700, 520] }, + alt: product.title, + class: "w-100 h-100 product-card-media-image") %> +
<% end %>
<% if product.category.present? %> diff --git a/db/migrate/20260311161000_add_shop_products_limit_to_home_pages.rb b/db/migrate/20260311161000_add_shop_products_limit_to_home_pages.rb new file mode 100644 index 0000000..1c120b5 --- /dev/null +++ b/db/migrate/20260311161000_add_shop_products_limit_to_home_pages.rb @@ -0,0 +1,5 @@ +class AddShopProductsLimitToHomePages < ActiveRecord::Migration[8.1] + def change + add_column :home_pages, :shop_products_limit, :integer, default: 5, null: false + end +end diff --git a/db/schema.rb b/db/schema.rb index 6d864bd..26e1cf1 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[8.1].define(version: 2026_03_10_203000) do +ActiveRecord::Schema[8.1].define(version: 2026_03_11_161000) do create_table "about_pages", force: :cascade do |t| t.text "content" t.datetime "created_at", null: false @@ -158,6 +158,7 @@ t.string "layout_text_tone", default: "theme", null: false t.string "layout_variant", default: "split", null: false t.integer "position" + t.integer "shop_products_limit", default: 5, null: false t.string "shop_scope", default: "first", null: false t.boolean "show_button", default: true, null: false t.integer "target_id" diff --git a/spec/models/home_page_spec.rb b/spec/models/home_page_spec.rb index ed2060e..2e0dab8 100644 --- a/spec/models/home_page_spec.rb +++ b/spec/models/home_page_spec.rb @@ -1,5 +1,42 @@ require 'rails_helper' RSpec.describe HomePage, type: :model do - pending "add some examples to (or delete) #{__FILE__}" + describe "validations" do + it "requires a shop_products_limit greater than 0" do + home_page = described_class.new(bloc_type: :shop, shop_products_limit: 0) + + expect(home_page).not_to be_valid + expect(home_page.errors.details[:shop_products_limit]).to include(hash_including(error: :greater_than, value: 0)) + end + end + + describe "#shop_products" do + let!(:product_1) { Product.create!(title: "Produit 1") } + let!(:product_2) { Product.create!(title: "Produit 2") } + let!(:product_3) { Product.create!(title: "Produit 3") } + + before do + product_1.update_columns(created_at: Time.zone.local(2026, 1, 1, 9, 0, 0), updated_at: Time.zone.local(2026, 1, 1, 9, 0, 0)) + product_2.update_columns(created_at: Time.zone.local(2026, 1, 2, 9, 0, 0), updated_at: Time.zone.local(2026, 1, 2, 9, 0, 0)) + product_3.update_columns(created_at: Time.zone.local(2026, 1, 3, 9, 0, 0), updated_at: Time.zone.local(2026, 1, 3, 9, 0, 0)) + end + + it "uses shop_products_limit for first scope" do + home_page = described_class.create!(bloc_type: :shop, shop_scope: :first, shop_products_limit: 2) + + expect(home_page.shop_products.pluck(:id)).to eq([product_1.id, product_2.id]) + end + + it "uses shop_products_limit for last scope" do + home_page = described_class.create!(bloc_type: :shop, shop_scope: :last, shop_products_limit: 2) + + expect(home_page.shop_products.pluck(:id)).to eq([product_3.id, product_2.id]) + end + + it "falls back to at least 1 product when an invalid limit is passed" do + home_page = described_class.create!(bloc_type: :shop, shop_scope: :first, shop_products_limit: 3) + + expect(home_page.shop_products(0).size).to eq(1) + end + end end From 008c2a46995e646e21bc626d144e12d893a3f212 Mon Sep 17 00:00:00 2001 From: Istarengwa Date: Thu, 12 Mar 2026 20:01:57 +0100 Subject: [PATCH 2/4] add new style for partenariat system --- app/assets/fonts/pirata-one-regular.ttf | Bin 0 -> 53672 bytes .../stylesheets/application.bootstrap.scss | 166 +++++++++++++++++- app/views/repair_pages/index.html.erb | 12 +- 3 files changed, 170 insertions(+), 8 deletions(-) create mode 100644 app/assets/fonts/pirata-one-regular.ttf diff --git a/app/assets/fonts/pirata-one-regular.ttf b/app/assets/fonts/pirata-one-regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..69d4bfc3e1638b7840c5c5cfde1d9bb0dfe45331 GIT binary patch literal 53672 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 literal 0 HcmV?d00001 diff --git a/app/assets/stylesheets/application.bootstrap.scss b/app/assets/stylesheets/application.bootstrap.scss index e37c8c3..8bf2bb1 100644 --- a/app/assets/stylesheets/application.bootstrap.scss +++ b/app/assets/stylesheets/application.bootstrap.scss @@ -1140,22 +1140,180 @@ dialog { transform: translateY(-3px); } +@font-face { + font-family: "Pirata One Local"; + src: url("/pirata-one-regular.ttf") format("truetype"); + font-style: normal; + font-weight: 400; + font-display: swap; +} + .repair-partner-logo-link { + --repair-partner-title-color: #f3e2bf; + --repair-partner-shadow: rgba(18, 10, 3, 0.35); width: 100%; - max-width: 190px; + max-width: 210px; aspect-ratio: 1 / 1; + position: relative; display: inline-flex; - align-items: center; + align-items: flex-end; justify-content: center; - padding: 0.35rem; + padding: 0 1rem 1rem; + text-decoration: none; + perspective: 2500px; + isolation: isolate; + color: var(--repair-partner-title-color); +} + +.repair-partner-logo-link:hover, +.repair-partner-logo-link:focus-visible { + color: var(--repair-partner-title-color); text-decoration: none; - border-radius: 0.65rem; +} + +.repair-partner-logo-link:focus-visible { + outline: 2px solid rgba(113, 28, 28, 0.55); + outline-offset: 0.35rem; +} + +.repair-partner-logo-link__wrapper { + position: absolute; + inset: 0; + z-index: 0; + display: flex; + align-items: center; + justify-content: center; + padding: 0.2rem; + overflow: visible; + transition: transform 0.5s ease; + transform-origin: center; +} + +.repair-partner-logo-link__wrapper::before, +.repair-partner-logo-link__wrapper::after { + content: ""; + position: absolute; + inset-inline: 0; + pointer-events: none; + transition: opacity 0.5s ease, height 0.5s ease; +} + +.repair-partner-logo-link__wrapper::before { + inset-block: 0; + opacity: 0; + background-image: linear-gradient( + to top, + transparent 42%, + rgba(18, 10, 3, 0.24) 70%, + rgba(18, 10, 3, 0.7) 100% + ); +} + +.repair-partner-logo-link__wrapper::after { + bottom: 0; + height: 88px; + opacity: 0.78; + background-image: linear-gradient( + to bottom, + transparent 18%, + rgba(18, 10, 3, 0.12) 60%, + rgba(18, 10, 3, 0.76) 100% + ); +} + +.repair-partner-logo-link:hover .repair-partner-logo-link__wrapper, +.repair-partner-logo-link:focus-visible .repair-partner-logo-link__wrapper { + transform: perspective(900px) translateY(-5%) rotateX(25deg); +} + +.repair-partner-logo-link:hover .repair-partner-logo-link__wrapper::before, +.repair-partner-logo-link:focus-visible .repair-partner-logo-link__wrapper::before, +.repair-partner-logo-link:hover .repair-partner-logo-link__wrapper::after, +.repair-partner-logo-link:focus-visible .repair-partner-logo-link__wrapper::after { + opacity: 1; +} + +.repair-partner-logo-link:hover .repair-partner-logo-link__wrapper::after, +.repair-partner-logo-link:focus-visible .repair-partner-logo-link__wrapper::after { + height: 128px; } .repair-partner-logo-link__image { width: 100%; height: 100%; object-fit: contain; + filter: drop-shadow(0 16px 24px rgba(47, 20, 4, 0.15)); + transition: transform 0.5s ease, filter 0.5s ease; +} + +.repair-partner-logo-link:hover .repair-partner-logo-link__image, +.repair-partner-logo-link:focus-visible .repair-partner-logo-link__image { + transform: translateY(-0.4rem) scale(1.03); + filter: + drop-shadow(0 22px 32px rgba(18, 10, 3, 0.2)) + drop-shadow(2px 35px 32px var(--repair-partner-shadow)); +} + +.repair-partner-logo-link__title { + position: relative; + z-index: 1; + display: block; + max-width: 85%; + margin-bottom: 0.1rem; + text-align: center; + font-family: "Pirata One Local", "Times New Roman", serif; + font-size: clamp(1.3rem, 1.05rem + 0.75vw, 1.85rem); + line-height: 0.95; + letter-spacing: 0.08em; + text-transform: uppercase; + text-shadow: 0 10px 18px rgba(0, 0, 0, 0.48); + opacity: 0; + transform: translate3d(0, 0.75rem, 70px) scale(0.92); + transform-origin: bottom center; + transition: transform 0.5s ease, opacity 0.35s ease; + pointer-events: none; +} + +.repair-partner-logo-link:hover .repair-partner-logo-link__title, +.repair-partner-logo-link:focus-visible .repair-partner-logo-link__title { + opacity: 1; + transform: translate3d(0, -2.1rem, 100px) scale(1); +} + +@media (hover: none) { + .repair-partner-logo-link { + padding: 0; + aspect-ratio: auto; + display: flex; + flex-direction: column; + gap: 0.75rem; + align-items: stretch; + } + + .repair-partner-logo-link__wrapper { + position: relative; + inset: auto; + aspect-ratio: 1 / 1; + } + + .repair-partner-logo-link__title { + max-width: none; + margin-bottom: 0; + opacity: 1; + color: #4c1f12; + text-shadow: none; + transform: none; + } +} + +@media (prefers-reduced-motion: reduce) { + .repair-partner-logo-link__wrapper, + .repair-partner-logo-link__wrapper::before, + .repair-partner-logo-link__wrapper::after, + .repair-partner-logo-link__image, + .repair-partner-logo-link__title { + transition: none; + } } @media (max-width: 991.98px) { diff --git a/app/views/repair_pages/index.html.erb b/app/views/repair_pages/index.html.erb index 363202f..0c9b236 100644 --- a/app/views/repair_pages/index.html.erb +++ b/app/views/repair_pages/index.html.erb @@ -50,12 +50,16 @@
<%= link_to partner.url, class: "repair-partner-logo-link", + aria: { label: partner.title }, target: "_blank", rel: "noopener noreferrer" do %> - <%= attachment_thumb(partner.logo, - variant_options: { resize_to_limit: [420, 420] }, - class: "repair-partner-logo-link__image", - alt: partner.title) %> + + <%= attachment_thumb(partner.logo, + variant_options: { resize_to_limit: [420, 420] }, + class: "repair-partner-logo-link__image", + alt: partner.title) %> + + <% end %>
<% end %> From fb58385ce0177d199fe1f36f05eb32b214331e0d Mon Sep 17 00:00:00 2001 From: Istarengwa Date: Thu, 12 Mar 2026 20:27:55 +0100 Subject: [PATCH 3/4] fix calendar translation --- config/locales/fr.yml | 48 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 6e983c0..1aee210 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -2,6 +2,54 @@ fr: hello: "Bonjour" date: + month_names: + - ~ + - janvier + - février + - mars + - avril + - mai + - juin + - juillet + - août + - septembre + - octobre + - novembre + - décembre + abbr_month_names: + - ~ + - janv. + - févr. + - mars + - avr. + - mai + - juin + - juil. + - août + - sept. + - oct. + - nov. + - déc. + day_names: + - dimanche + - lundi + - mardi + - mercredi + - jeudi + - vendredi + - samedi + abbr_day_names: + - dim. + - lun. + - mar. + - mer. + - jeu. + - ven. + - sam. + order: + - :day + - :month + - :year formats: default: "%d/%m/%Y" short: "%d/%m/%Y" From ad89e0f75ebcdc44895873eae556796137537954 Mon Sep 17 00:00:00 2001 From: Istarengwa Date: Thu, 12 Mar 2026 20:39:38 +0100 Subject: [PATCH 4/4] fix mailer system --- app/mailers/application_mailer.rb | 2 +- app/mailers/user_mailer.rb | 33 ++++++++++--------- .../mailer/confirmation_instructions.html.erb | 6 ++-- .../devise/mailer/email_changed.html.erb | 6 ++-- .../devise/mailer/password_change.html.erb | 4 +-- .../reset_password_instructions.html.erb | 10 +++--- .../mailer/unlock_instructions.html.erb | 8 ++--- .../user_mailer/admin_contact_email.html.erb | 9 +++-- .../user_mailer/admin_contact_email.text.erb | 4 +-- .../user_mailer/admin_order_email.html.erb | 10 ++++-- .../user_mailer/admin_order_email.text.erb | 8 +++-- app/views/user_mailer/order_email.html.erb | 32 +++++++++--------- app/views/user_mailer/order_email.text.erb | 12 ++++--- .../order_status_update_email.html.erb | 3 +- .../order_status_update_email.text.erb | 2 +- .../request_treatment_email.html.erb | 21 +++++++----- .../request_treatment_email.text.erb | 12 ++++--- app/views/user_mailer/welcome_email.html.erb | 31 +++++++++-------- app/views/user_mailer/welcome_email.text.erb | 12 ++++--- 19 files changed, 129 insertions(+), 96 deletions(-) diff --git a/app/mailers/application_mailer.rb b/app/mailers/application_mailer.rb index 3c34c81..66666d1 100644 --- a/app/mailers/application_mailer.rb +++ b/app/mailers/application_mailer.rb @@ -1,4 +1,4 @@ class ApplicationMailer < ActionMailer::Base - default from: "from@example.com" + default from: ENV["GMAIL_LOGIN"] layout "mailer" end diff --git a/app/mailers/user_mailer.rb b/app/mailers/user_mailer.rb index f98a297..4fd2510 100644 --- a/app/mailers/user_mailer.rb +++ b/app/mailers/user_mailer.rb @@ -3,20 +3,17 @@ class UserMailer < Devise::Mailer layout "mailer" def welcome_email(user) - # on récupère l'instance user pour ensuite pouvoir la passer à la view en @user @user = user + @login_url = "#{app_host}/users/sign_in" + @home_url = app_host - # on définit une variable @url qu'on utilisera dans la view d’e-mail - @url = "http://monsite.fr/login" - - # c'est cet appel à mail() qui permet d'envoyer l’e-mail en définissant destinataire et sujet. - mail(to: @user.email, subject: "Bienvenue Templier !") + mail(to: @user.email, subject: "Bienvenue sur l'atelier") end def order_email(order) @order = order @user = order.user - @url = "http://localhost:3000/orders/#{order.id}" + @order_url = "#{app_host}/orders/#{order.id}" mail(to: @user.email, subject: "Confirmation de commande ##{order.id}") end @@ -25,18 +22,18 @@ def admin_order_email(order) @admins = User.where(is_admin: true) @order = order @user = order.user - @url = "http://localhost:3000/orders/#{order.id}" + @order_url = "#{app_host}/orders/#{order.id}" mail( to: @admins.pluck(:email), - subject: "Nouvelle commande ##{@order.id} reçue !" + subject: "Nouvelle commande ##{@order.id}" ) end def order_status_update_email(order, previous_status:) @order = order @user = order.user - @url = "http://localhost:3000/orders/#{order.id}" + @order_url = "#{app_host}/orders/#{order.id}" @current_status = order.status_label if previous_status.present? && previous_status != order.status @previous_status = order.status_label(previous_status) @@ -51,19 +48,25 @@ def order_status_update_email(order, previous_status:) def request_treatment_email(contact) @contact = contact - @url = "http://localhost:3000/contacts/new" - mail(to: @contact.email, subject: "Demande en cours de traitement") + @contact_url = "#{app_host}/contacts/new" + @home_url = app_host + mail(to: @contact.email, subject: "Confirmation de réception de votre message") end def admin_contact_email(contact) @admins = User.where(is_admin: true) @contact = contact - @url = "http://localhost:3000/contacts/new" - + @contact_url = "#{app_host}/contacts/new" + mail( to: @admins.pluck(:email), - subject: "Nouvelle demande de contact !" + subject: "Nouvelle demande de contact" ) end + private + + def app_host + ENV["APP_HOST"].to_s.chomp("/") + end end diff --git a/app/views/devise/mailer/confirmation_instructions.html.erb b/app/views/devise/mailer/confirmation_instructions.html.erb index dc55f64..ef5d1e6 100644 --- a/app/views/devise/mailer/confirmation_instructions.html.erb +++ b/app/views/devise/mailer/confirmation_instructions.html.erb @@ -1,5 +1,5 @@ -

Welcome <%= @email %>!

+

Bonjour <%= @email %>,

-

You can confirm your account email through the link below:

+

Vous pouvez confirmer votre adresse e-mail via le lien ci-dessous :

-

<%= link_to 'Confirm my account', confirmation_url(@resource, confirmation_token: @token) %>

+

<%= link_to "Confirmer mon compte", confirmation_url(@resource, confirmation_token: @token) %>

diff --git a/app/views/devise/mailer/email_changed.html.erb b/app/views/devise/mailer/email_changed.html.erb index 32f4ba8..07946bb 100644 --- a/app/views/devise/mailer/email_changed.html.erb +++ b/app/views/devise/mailer/email_changed.html.erb @@ -1,7 +1,7 @@ -

Hello <%= @email %>!

+

Bonjour <%= @email %>,

<% if @resource.try(:unconfirmed_email?) %> -

We're contacting you to notify you that your email is being changed to <%= @resource.unconfirmed_email %>.

+

Nous vous informons que votre adresse e-mail est en cours de modification vers <%= @resource.unconfirmed_email %>.

<% else %> -

We're contacting you to notify you that your email has been changed to <%= @resource.email %>.

+

Nous vous informons que votre adresse e-mail a bien été modifiée en <%= @resource.email %>.

<% end %> diff --git a/app/views/devise/mailer/password_change.html.erb b/app/views/devise/mailer/password_change.html.erb index b41daf4..c350a41 100644 --- a/app/views/devise/mailer/password_change.html.erb +++ b/app/views/devise/mailer/password_change.html.erb @@ -1,3 +1,3 @@ -

Hello <%= @resource.email %>!

+

Bonjour <%= @resource.email %>,

-

We're contacting you to notify you that your password has been changed.

+

Nous vous confirmons que votre mot de passe a bien été modifié.

diff --git a/app/views/devise/mailer/reset_password_instructions.html.erb b/app/views/devise/mailer/reset_password_instructions.html.erb index f667dc1..bf6d1ea 100644 --- a/app/views/devise/mailer/reset_password_instructions.html.erb +++ b/app/views/devise/mailer/reset_password_instructions.html.erb @@ -1,8 +1,8 @@ -

Hello <%= @resource.email %>!

+

Bonjour <%= @resource.email %>,

-

Someone has requested a link to change your password. You can do this through the link below.

+

Une demande de réinitialisation de mot de passe a été effectuée pour votre compte.

-

<%= link_to 'Change my password', edit_password_url(@resource, reset_password_token: @token) %>

+

<%= link_to "Changer mon mot de passe", edit_password_url(@resource, reset_password_token: @token) %>

-

If you didn't request this, please ignore this email.

-

Your password won't change until you access the link above and create a new one.

+

Si vous n'êtes pas à l'origine de cette demande, vous pouvez ignorer cet e-mail.

+

Votre mot de passe ne changera pas tant que vous n'aurez pas ouvert le lien ci-dessus et défini un nouveau mot de passe.

diff --git a/app/views/devise/mailer/unlock_instructions.html.erb b/app/views/devise/mailer/unlock_instructions.html.erb index 41e148b..3c3c81e 100644 --- a/app/views/devise/mailer/unlock_instructions.html.erb +++ b/app/views/devise/mailer/unlock_instructions.html.erb @@ -1,7 +1,7 @@ -

Hello <%= @resource.email %>!

+

Bonjour <%= @resource.email %>,

-

Your account has been locked due to an excessive number of unsuccessful sign in attempts.

+

Votre compte a été verrouillé après un trop grand nombre de tentatives de connexion échouées.

-

Click the link below to unlock your account:

+

Vous pouvez le déverrouiller via le lien ci-dessous :

-

<%= link_to 'Unlock my account', unlock_url(@resource, unlock_token: @token) %>

+

<%= link_to "Déverrouiller mon compte", unlock_url(@resource, unlock_token: @token) %>

diff --git a/app/views/user_mailer/admin_contact_email.html.erb b/app/views/user_mailer/admin_contact_email.html.erb index 210c4bb..564f6f4 100644 --- a/app/views/user_mailer/admin_contact_email.html.erb +++ b/app/views/user_mailer/admin_contact_email.html.erb @@ -1,15 +1,18 @@ - + -

Nouvelle demande de contact

+

Nouveau message de contact

Nom : <%= @contact.name.presence || "Non renseigné" %>

Email : <%= @contact.email %>

Sujet : <%= @contact.subject %>

Message :

<%= simple_format(@contact.message) %>

-

Consulter toutes les demandes sur <%= link_to "l'espace admin", @url || root_url %>.

+

+ Formulaire de contact : + <%= link_to @contact_url, @contact_url %> +

diff --git a/app/views/user_mailer/admin_contact_email.text.erb b/app/views/user_mailer/admin_contact_email.text.erb index e8dd3b5..fad97e3 100644 --- a/app/views/user_mailer/admin_contact_email.text.erb +++ b/app/views/user_mailer/admin_contact_email.text.erb @@ -1,4 +1,4 @@ -Nouvelle demande de contact +Nouveau message de contact ========================== Nom : <%= @contact.name.presence || "Non renseigné" %> @@ -8,4 +8,4 @@ Sujet : <%= @contact.subject %> Message : <%= @contact.message %> -Consultez l'espace admin via <%= @url || root_url %>. +Formulaire de contact : <%= @contact_url %> diff --git a/app/views/user_mailer/admin_order_email.html.erb b/app/views/user_mailer/admin_order_email.html.erb index fe5a2da..64f876c 100644 --- a/app/views/user_mailer/admin_order_email.html.erb +++ b/app/views/user_mailer/admin_order_email.html.erb @@ -5,7 +5,13 @@

Nouvelle commande reçue

-

Commande n°<%= @order.id %> passée par <%= @user.email %>.

-

Consulter : <%= @url %>

+

La commande n°<%= @order.id %> a été validée par <%= @user.email %>.

+ <% if @order.order_date.present? %> +

Date de commande : <%= @order.order_date.strftime("%d/%m/%Y") %>

+ <% end %> +

+ Consulter la commande : + <%= link_to @order_url, @order_url %> +

diff --git a/app/views/user_mailer/admin_order_email.text.erb b/app/views/user_mailer/admin_order_email.text.erb index a1c0539..86187b7 100644 --- a/app/views/user_mailer/admin_order_email.text.erb +++ b/app/views/user_mailer/admin_order_email.text.erb @@ -1,6 +1,10 @@ Nouvelle commande reçue ======================= -Commande n°<%= @order.id %> passée par <%= @user.email %>. +La commande n°<%= @order.id %> a été validée par <%= @user.email %>. -Consulter : <%= @url %> +<% if @order.order_date.present? %> +Date de commande : <%= @order.order_date.strftime("%d/%m/%Y") %>. +<% end %> + +Consulter la commande : <%= @order_url %> diff --git a/app/views/user_mailer/order_email.html.erb b/app/views/user_mailer/order_email.html.erb index 086e8a5..c2934c4 100644 --- a/app/views/user_mailer/order_email.html.erb +++ b/app/views/user_mailer/order_email.html.erb @@ -1,19 +1,19 @@ - - - - -

Salut <%= @user.email %> et merci pour ta commande jeune templier !

- <% if @order.order_date.present? %> -

Date de commande : <%= @order.order_date.strftime("%d/%m/%Y") %>

- <% end %> -

- Tu viens de gagner 30 points d'armure grâce à ta commande n°<%= @order.id %>. -

-

- Pour accéder à ton espace client et consulter ta commande, connecte-toi via : <%= @url %>. -

-

À très vite sur monsite.fr !

- + + + + +

Commande n°<%= @order.id %> confirmée

+

Bonjour <%= @user.email %>,

+ <% if @order.order_date.present? %> +

Date de commande : <%= @order.order_date.strftime("%d/%m/%Y") %>

+ <% end %> +

Nous vous confirmons la bonne réception de votre commande.

+

+ Vous pouvez consulter son détail ici : + <%= link_to @order_url, @order_url %> +

+

Merci pour votre confiance.

+ diff --git a/app/views/user_mailer/order_email.text.erb b/app/views/user_mailer/order_email.text.erb index 33dea9e..2075a01 100644 --- a/app/views/user_mailer/order_email.text.erb +++ b/app/views/user_mailer/order_email.text.erb @@ -1,12 +1,14 @@ -Salut <%= @user.email %> et merci pour ta commande jeune templier ! -========================================================== +Commande n°<%= @order.id %> confirmée +==================================== + +Bonjour <%= @user.email %>, <% if @order.order_date.present? %> Date de commande : <%= @order.order_date.strftime("%d/%m/%Y") %>. <% end %> -Tu viens de gagner 30 points d'armure grâce à ta commande n°<%= @order.id %>. +Nous vous confirmons la bonne réception de votre commande. -Pour accéder à ton espace client et consulter ta commande, connecte-toi via : <%= @url %>. +Vous pouvez consulter son détail ici : <%= @order_url %> -À très vite sur monsite.fr ! +Merci pour votre confiance. diff --git a/app/views/user_mailer/order_status_update_email.html.erb b/app/views/user_mailer/order_status_update_email.html.erb index 970be55..63bea71 100644 --- a/app/views/user_mailer/order_status_update_email.html.erb +++ b/app/views/user_mailer/order_status_update_email.html.erb @@ -30,7 +30,8 @@ <% end %> <% end %>

- Consultez le détail et le suivi : <%= @url %> + Consultez le détail et le suivi : + <%= link_to @order_url, @order_url %>

Merci pour votre confiance.

diff --git a/app/views/user_mailer/order_status_update_email.text.erb b/app/views/user_mailer/order_status_update_email.text.erb index f658c4c..ce1f843 100644 --- a/app/views/user_mailer/order_status_update_email.text.erb +++ b/app/views/user_mailer/order_status_update_email.text.erb @@ -21,6 +21,6 @@ Numéro de suivi : <%= @tracking_number %>. <% end %> <% end %> -Consultez le détail et le suivi : <%= @url %> +Consultez le détail et le suivi : <%= @order_url %> Merci pour votre confiance. diff --git a/app/views/user_mailer/request_treatment_email.html.erb b/app/views/user_mailer/request_treatment_email.html.erb index 30854fd..fdde981 100644 --- a/app/views/user_mailer/request_treatment_email.html.erb +++ b/app/views/user_mailer/request_treatment_email.html.erb @@ -1,11 +1,16 @@ - - - - -

Salut <%= @contact.name.presence || @contact.email %>, ta demande sera bientôt traitée !

-

Pour accéder à ton espace client et consulter ta demande, connecte-toi via : <%= @url %>.

-

À très vite sur monsite.fr !

- + + + + +

Nous avons bien reçu votre message

+

Bonjour <%= @contact.name.presence || @contact.email %>,

+

Votre demande a bien été transmise. Nous reviendrons vers vous dès que possible.

+

+ Vous pouvez retrouver le formulaire de contact ici : + <%= link_to @contact_url, @contact_url %> +

+

Merci pour votre message.

+ diff --git a/app/views/user_mailer/request_treatment_email.text.erb b/app/views/user_mailer/request_treatment_email.text.erb index 55d44ab..b1aabf9 100644 --- a/app/views/user_mailer/request_treatment_email.text.erb +++ b/app/views/user_mailer/request_treatment_email.text.erb @@ -1,6 +1,10 @@ -Salut <%= @contact.name.presence || @contact.email %>, ta demande sera bientôt traitée ! -====================================================================================== +Nous avons bien reçu votre message +================================== -Pour accéder à ton espace client et consulter ta demande, connecte-toi via : <%= @url %>. +Bonjour <%= @contact.name.presence || @contact.email %>, -À très vite sur monsite.fr ! +Votre demande a bien été transmise. Nous reviendrons vers vous dès que possible. + +Vous pouvez retrouver le formulaire de contact ici : <%= @contact_url %> + +Merci pour votre message. diff --git a/app/views/user_mailer/welcome_email.html.erb b/app/views/user_mailer/welcome_email.html.erb index 39ae938..74dd85a 100644 --- a/app/views/user_mailer/welcome_email.html.erb +++ b/app/views/user_mailer/welcome_email.html.erb @@ -1,16 +1,19 @@ - - - - -

Salut <%= @user.email %> et bienvenue chez nous !

-

- Tu t'es inscrit sur monsite.fr en utilisant l'e-mail suivant : <%= @user.email %>. -

-

- Pour accéder à ton espace client, connecte-toi via : <%= @url %>. -

-

À très vite sur monsite.fr !

- - \ No newline at end of file + + + + +

Bienvenue sur l'atelier

+

Bonjour <%= @user.email %>,

+

Votre compte a bien été créé avec l'adresse <%= @user.email %>.

+

+ Vous pouvez vous connecter ici : + <%= link_to @login_url, @login_url %> +

+

+ Accéder au site : + <%= link_to @home_url, @home_url %> +

+ + diff --git a/app/views/user_mailer/welcome_email.text.erb b/app/views/user_mailer/welcome_email.text.erb index 50887e6..bfcec0b 100644 --- a/app/views/user_mailer/welcome_email.text.erb +++ b/app/views/user_mailer/welcome_email.text.erb @@ -1,8 +1,10 @@ -Salut <%= @user.email %> et bienvenue chez nous ! -========================================================== +Bienvenue sur l'atelier +======================= -Tu t'es inscrit sur monsite.fr en utilisant l'e-mail suivant : <%= @user.email %>. +Bonjour <%= @user.email %>, -Pour accéder à ton espace client, connecte-toi via : <%= @url %>. +Votre compte a bien été créé avec l'adresse <%= @user.email %>. -À très vite sur monsite.fr ! \ No newline at end of file +Vous pouvez vous connecter ici : <%= @login_url %> + +Accéder au site : <%= @home_url %>