From ac7090817c88f36057539dab8364bbd70fe86f6a Mon Sep 17 00:00:00 2001 From: drummer83 Date: Tue, 26 Dec 2023 00:12:23 +0100 Subject: [PATCH] Improve email footer of all emails Use wrap style full width background like header Move 'Powered by...' message to footer and rephrase to suit all recipients (not shoppers only) Always show link to openfoodnetwork.org instead of email (if present) because email will be available via icon in the row below now Add social media buttons of instance to email footer Make footer text and icons dark gray (as instance name in email header) --- app/assets/stylesheets/mail/all.scss | 1 + app/assets/stylesheets/mail/email.scss | 28 ++++++++++----- app/helpers/mailer_helper.rb | 10 ------ app/mailers/payment_mailer.rb | 1 + app/mailers/spree/shipment_mailer.rb | 2 ++ app/mailers/spree/user_mailer.rb | 2 -- app/views/layouts/mailer.html.haml | 32 +++++++++++++++--- .../shared/mailers/_powered_by.html.haml | 2 -- .../spree/order_mailer/cancel_email.html.haml | 1 - .../confirm_email_for_customer.html.haml | 1 - .../confirmation_instructions.html.haml | 2 -- .../confirmation_summary_email.html.haml | 1 - .../placement_summary_email.html.haml | 1 - config/locales/en.yml | 9 +++-- public/map_icons/social-logos/x999.png | Bin 0 -> 9017 bytes 15 files changed, 56 insertions(+), 37 deletions(-) delete mode 100644 app/views/shared/mailers/_powered_by.html.haml create mode 100644 public/map_icons/social-logos/x999.png diff --git a/app/assets/stylesheets/mail/all.scss b/app/assets/stylesheets/mail/all.scss index fa8445d726..1b00c44995 100644 --- a/app/assets/stylesheets/mail/all.scss +++ b/app/assets/stylesheets/mail/all.scss @@ -1,3 +1,4 @@ @import '../../../webpacker/css/admin/globals/palette.scss'; @import 'email'; @import 'payments_list'; +@import '../../../webpacker/css/darkswarm/style.scss'; diff --git a/app/assets/stylesheets/mail/email.scss b/app/assets/stylesheets/mail/email.scss index 844cd3b342..caa20499ca 100644 --- a/app/assets/stylesheets/mail/email.scss +++ b/app/assets/stylesheets/mail/email.scss @@ -55,18 +55,29 @@ p.callout { color: #0096ad; } +p.footer, p.footer_icons a { + color: #999; +} + +p.footer_icons { + font-size: 0px; + + a { + text-decoration: none; + margin-right: 5px; + } +} + +p.footer_icons a:not(.ofn-i_image) { + font-size: 20px; +} + p.notice { font-style: italic; font-size: 12px; margin-top: 20px; } -.powered-by-ofn { - background-color: #ebebeb; - padding: .5em; - text-align: center; -} - table.social { background-color: #ebebeb; @@ -177,11 +188,12 @@ del.quantity_was { } /* ------------------------------------- - * HEADER + * HEADER & FOOTER *------------------------------------- */ -table.head-wrap { +.wrap { width: 100%; + background-color: #f2f2f2; } .header.container table td { diff --git a/app/helpers/mailer_helper.rb b/app/helpers/mailer_helper.rb index b07b04ca45..7d4fb3bbee 100644 --- a/app/helpers/mailer_helper.rb +++ b/app/helpers/mailer_helper.rb @@ -1,16 +1,6 @@ # frozen_string_literal: true module MailerHelper - def footer_ofn_link - ofn = I18n.t("shared.mailers.powered_by.open_food_network") - - if ContentConfig.footer_email.present? - mail_to ContentConfig.footer_email, ofn - else - link_to ofn, "https://www.openfoodnetwork.org" - end - end - def order_reply_email(order) order.distributor.email_address.presence || order.distributor.contact.email end diff --git a/app/mailers/payment_mailer.rb b/app/mailers/payment_mailer.rb index ae38604b98..3a10103fe8 100644 --- a/app/mailers/payment_mailer.rb +++ b/app/mailers/payment_mailer.rb @@ -2,6 +2,7 @@ class PaymentMailer < ApplicationMailer include I18nHelper + helper MailerHelper def authorize_payment(payment) @payment = payment diff --git a/app/mailers/spree/shipment_mailer.rb b/app/mailers/spree/shipment_mailer.rb index 0be7b55cca..c5d3307571 100644 --- a/app/mailers/spree/shipment_mailer.rb +++ b/app/mailers/spree/shipment_mailer.rb @@ -2,6 +2,8 @@ module Spree class ShipmentMailer < ApplicationMailer + helper MailerHelper + def shipped_email(shipment, delivery:) @shipment = shipment.respond_to?(:id) ? shipment : Spree::Shipment.find(shipment) @delivery = delivery diff --git a/app/mailers/spree/user_mailer.rb b/app/mailers/spree/user_mailer.rb index 3797fcd9b4..6f2853de2b 100644 --- a/app/mailers/spree/user_mailer.rb +++ b/app/mailers/spree/user_mailer.rb @@ -6,8 +6,6 @@ module Spree class UserMailer < ApplicationMailer include I18nHelper - helper MailerHelper - # Overrides `Devise::Mailer.reset_password_instructions` def reset_password_instructions(user, token, _opts = {}) @edit_password_reset_url = spree. diff --git a/app/views/layouts/mailer.html.haml b/app/views/layouts/mailer.html.haml index 46b7078516..4e5739ba79 100644 --- a/app/views/layouts/mailer.html.haml +++ b/app/views/layouts/mailer.html.haml @@ -8,7 +8,7 @@ = stylesheet_link_tag 'mail' %body{:bgcolor => "#FFFFFF" } - unless @hide_ofn_navigation - %table.head-wrap{:bgcolor => "#f2f2f2"} + %table.wrap %tr %td %td.header.container @@ -34,15 +34,39 @@ = yield %td - %table.footer-wrap + %table.wrap %tr %td %td.container .content %table %tr - %td{:align => "center"} - %p + %td.text-center + %p.footer + = t(".powered_html", open_food_network: link_to(t(".open_food_network"), "https://www.openfoodnetwork.org", target: '_blank')) + + %tr + %td.text-center + %p.footer_icons + - if ContentConfig.footer_email.present? + %a.ofn-i_050-mail-circle{:href => "mailto:#{ContentConfig.footer_email}", :target => "_blank"} + - if ContentConfig.footer_instagram_url.present? + %a.ofn-i_043-instagram{:href => ContentConfig.footer_instagram_url, :target => "_blank"} + - if ContentConfig.footer_facebook_url.present? + %a.ofn-i_044-facebook{:href => ContentConfig.footer_facebook_url, :target => "_blank"} + - if ContentConfig.footer_linkedin_url.present? + %a.ofn-i_042-linkedin{:href => ContentConfig.footer_linkedin_url, :target => "_blank"} + - if ContentConfig.footer_googleplus_url.present? + %a.ofn-i_046-g{:href => ContentConfig.footer_googleplus_url, :target => "_blank"} + - if ContentConfig.footer_pinterest_url.present? + %a.ofn-i_045-pintrest{:href => ContentConfig.footer_pinterest_url, :target => "_blank"} + - if ContentConfig.footer_twitter_url.present? + %a.ofn-i_image{:href => ContentConfig.footer_twitter_url, :target => "_blank"} + %img{src: image_path("/map_icons/social-logos/x999.png"), style: "width: 20px; position: relative; top: 1.5px;" } + + %tr + %td.text-center + %p.footer - if platform_terms_required? = link_to_platform_terms | diff --git a/app/views/shared/mailers/_powered_by.html.haml b/app/views/shared/mailers/_powered_by.html.haml deleted file mode 100644 index 1d71037a9a..0000000000 --- a/app/views/shared/mailers/_powered_by.html.haml +++ /dev/null @@ -1,2 +0,0 @@ -%p.powered-by-ofn - = t(".powered_html", open_food_network: footer_ofn_link) diff --git a/app/views/spree/order_mailer/cancel_email.html.haml b/app/views/spree/order_mailer/cancel_email.html.haml index edfc66f162..e96d2bdeb2 100755 --- a/app/views/spree/order_mailer/cancel_email.html.haml +++ b/app/views/spree/order_mailer/cancel_email.html.haml @@ -27,4 +27,3 @@ = t(".unpaid_order") = render 'signoff' -= render 'shared/mailers/powered_by' diff --git a/app/views/spree/order_mailer/confirm_email_for_customer.html.haml b/app/views/spree/order_mailer/confirm_email_for_customer.html.haml index 8894805243..4d85b463b1 100644 --- a/app/views/spree/order_mailer/confirm_email_for_customer.html.haml +++ b/app/views/spree/order_mailer/confirm_email_for_customer.html.haml @@ -26,4 +26,3 @@ = render 'shipping' = render 'special_instructions' = render 'signoff' -= render 'shared/mailers/powered_by' diff --git a/app/views/spree/user_mailer/confirmation_instructions.html.haml b/app/views/spree/user_mailer/confirmation_instructions.html.haml index 2a7852d94f..20d2424a4a 100644 --- a/app/views/spree/user_mailer/confirmation_instructions.html.haml +++ b/app/views/spree/user_mailer/confirmation_instructions.html.haml @@ -12,7 +12,5 @@ = render 'shared/mailers/signoff' -= render 'shared/mailers/powered_by' - %p.notice = t :email_confirmation_notice_unexpected, sitename: @instance, contact: @contact diff --git a/app/views/subscription_mailer/confirmation_summary_email.html.haml b/app/views/subscription_mailer/confirmation_summary_email.html.haml index 4cdefdffe1..ed53f341a1 100644 --- a/app/views/subscription_mailer/confirmation_summary_email.html.haml +++ b/app/views/subscription_mailer/confirmation_summary_email.html.haml @@ -20,4 +20,3 @@ %p   = render 'shared/mailers/signoff' -= render 'shared/mailers/powered_by' diff --git a/app/views/subscription_mailer/placement_summary_email.html.haml b/app/views/subscription_mailer/placement_summary_email.html.haml index 4cdefdffe1..ed53f341a1 100644 --- a/app/views/subscription_mailer/placement_summary_email.html.haml +++ b/app/views/subscription_mailer/placement_summary_email.html.haml @@ -20,4 +20,3 @@ %p   = render 'shared/mailers/signoff' -= render 'shared/mailers/powered_by' diff --git a/config/locales/en.yml b/config/locales/en.yml index f1041c92bb..7e0a4a5768 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -360,6 +360,10 @@ en: report_failed: | This report failed. It may be too big to process. We will look into it but please let us know if the problem persists. + layouts: + mailer: + open_food_network: "Open Food Network" + powered_html: "This service is powered by the %{open_food_network}." enterprise_mailer: confirmation_instructions: subject: "Please confirm the email address for %{enterprise}" @@ -2073,11 +2077,6 @@ en: show_closed_shops: "Show closed shops" hide_closed_shops: "Hide closed shops" show_on_map: "Show all on the map" - shared: - mailers: - powered_by: - open_food_network: "Open Food Network" - powered_html: "Your shopping experience is powered by the %{open_food_network}." menu: cart: cart: "Cart" diff --git a/public/map_icons/social-logos/x999.png b/public/map_icons/social-logos/x999.png new file mode 100644 index 0000000000000000000000000000000000000000..cbe9d15b22e381194e7c82d1ae8da8003eda4c67 GIT binary patch literal 9017 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 OSW0kp`BK?uLH`fK=VuWB literal 0 HcmV?d00001