diff --git a/app/controllers/spree/admin/users_controller.rb b/app/controllers/spree/admin/users_controller.rb index 541fd7dbfb..4611095a9c 100644 --- a/app/controllers/spree/admin/users_controller.rb +++ b/app/controllers/spree/admin/users_controller.rb @@ -3,6 +3,8 @@ module Spree module Admin class UsersController < ::Admin::ResourceController + helper I18nHelper + rescue_from Spree::User::DestroyWithOrdersError, with: :user_destroy_with_orders_error after_action :sign_in_if_change_own_password, only: :update @@ -127,6 +129,10 @@ module Spree params[:user][:email] != @user.email end + def build_resource + model_class.new(locale: I18n.default_locale) + end + def user_params ::PermittedAttributes::User.new(params).call( %i[enterprise_limit show_api_key_view] diff --git a/app/helpers/i18n_helper.rb b/app/helpers/i18n_helper.rb index 6ca7d9d5b4..3fca93a061 100644 --- a/app/helpers/i18n_helper.rb +++ b/app/helpers/i18n_helper.rb @@ -1,6 +1,12 @@ # frozen_string_literal: true module I18nHelper + def locale_options + OpenFoodNetwork::I18nConfig.available_locales.map do |locale| + [t('language_name', locale:), locale] + end + end + def set_locale UserLocaleSetter.new(spree_current_user, params[:locale], cookies).set_locale end diff --git a/app/services/permitted_attributes/user.rb b/app/services/permitted_attributes/user.rb index 4bb29bbcc4..1e44a92c38 100644 --- a/app/services/permitted_attributes/user.rb +++ b/app/services/permitted_attributes/user.rb @@ -16,7 +16,7 @@ module PermittedAttributes def permitted_attributes [ - :email, :password, :password_confirmation, :disabled, + :email, :locale, :password, :password_confirmation, :disabled, { webhook_endpoints_attributes: [:id, :url] }, ] end diff --git a/app/views/spree/admin/users/_form.html.haml b/app/views/spree/admin/users/_form.html.haml index 866f7dffd1..3eeda73283 100644 --- a/app/views/spree/admin/users/_form.html.haml +++ b/app/views/spree/admin/users/_form.html.haml @@ -12,6 +12,9 @@ = check_box_tag "user[spree_role_ids][]", role.id, @user.spree_roles.include?(role), id: "user_spree_role_#{role.name}" = label_tag role.name = hidden_field_tag "user[spree_role_ids][]", "" + = f.field_container :locale do + = f.label :locale, t(".locale") + = f.select :locale, locale_options, class: "fullwidth" = f.field_container :enterprise_limit do = f.label :enterprise_limit, t(".enterprise_limit") = f.text_field :enterprise_limit, class: "fullwidth" diff --git a/config/locales/en.yml b/config/locales/en.yml index 4b40a6166e..efeaadafd3 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -4334,6 +4334,7 @@ See the %{link} to find out more about %{sitename}'s features and to start using enterprise_limit: "Enterprise Limit" confirm_password: "Confirm Password" password: "Password" + locale: "Language" email_confirmation: confirmation_pending: "Email confirmation is pending. We've sent a confirmation email to %{address}." variants: diff --git a/spec/controllers/spree/users_controller_spec.rb b/spec/controllers/spree/users_controller_spec.rb index 9a0e4298fa..3837cf8b71 100644 --- a/spec/controllers/spree/users_controller_spec.rb +++ b/spec/controllers/spree/users_controller_spec.rb @@ -83,7 +83,7 @@ describe Spree::UsersController, type: :controller do it 'should create a new user' do post :create, params: { user: { email: 'foobar@example.com', password: 'foobar123', - password_confirmation: 'foobar123' } } + password_confirmation: 'foobar123', locale: 'es' } } expect(assigns[:user].new_record?).to be_falsey end end diff --git a/spec/mailers/user_mailer_spec.rb b/spec/mailers/user_mailer_spec.rb index b90b3385fd..2d781fd4ef 100644 --- a/spec/mailers/user_mailer_spec.rb +++ b/spec/mailers/user_mailer_spec.rb @@ -34,15 +34,33 @@ describe Spree::UserMailer do end describe "#confirmation_instructions" do - it "sends an email" do - token = "random" - email = Spree::UserMailer.confirmation_instructions(user, token) + let(:token) { "random" } + subject(:email) { Spree::UserMailer.confirmation_instructions(user, token) } - expect { + it "sends an email" do + expect { email.deliver_now }.to change { ActionMailer::Base.deliveries.count }.by(1) + end + + context 'when the language is English' do + it 'sends an email with the translated subject' do email.deliver_now - }.to change { - ActionMailer::Base.deliveries.count - }.by(1) + + expect(ActionMailer::Base.deliveries.first.subject).to include( + "Please confirm your OFN account" + ) + end + end + + context 'when the language is Spanish' do + let(:user) { build(:user, locale: 'es') } + + it 'sends an email with the translated subject' do + email.deliver_now + + expect(ActionMailer::Base.deliveries.first.subject).to include( + "Por favor, confirma tu cuenta de OFN" + ) + end end end diff --git a/spec/system/admin/users_spec.rb b/spec/system/admin/users_spec.rb index 368483e2e7..5d1e7b0163 100644 --- a/spec/system/admin/users_spec.rb +++ b/spec/system/admin/users_spec.rb @@ -131,21 +131,32 @@ describe "Managing users" do end describe "creating a user" do - it "shows no confirmation message to start with" do - visit spree.new_admin_user_path - expect(page).to have_no_text "Email confirmation is pending" - end - it "confirms successful creation" do visit spree.new_admin_user_path + + # shows no confirmation message to start with + expect(page).to have_no_text "Email confirmation is pending" + fill_in "Email", with: "user1@example.org" fill_in "Password", with: "user1Secret" fill_in "Confirm Password", with: "user1Secret" - expect do - click_button "Create" - end.to change { Spree::User.count }.by 1 - expect(page).to have_text "Created Successfully" - expect(page).to have_text "Email confirmation is pending" + + expect(page).to have_select "Language", selected: "English" + select "EspaƱol", from: "Language" + + perform_enqueued_jobs do + expect do + click_button "Create" + end.to change { Spree::User.count }.by 1 + expect(page).to have_text "Created Successfully" + expect(page).to have_text "Email confirmation is pending" + + expect(Spree::User.last.locale).to eq "es" + + expect(ActionMailer::Base.deliveries.first.subject).to match( + "Por favor, confirma tu cuenta de OFN" + ) + end end end