diff --git a/app/assets/fonts/pirata-one-regular.ttf b/app/assets/fonts/pirata-one-regular.ttf new file mode 100644 index 0000000..69d4bfc Binary files /dev/null and b/app/assets/fonts/pirata-one-regular.ttf differ 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/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/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/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/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/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/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 %> 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 %> 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" 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