diff --git a/app/controllers/accounts/profiles_controller.rb b/app/controllers/accounts/profiles_controller.rb index faebfc5ea..1a20e06fd 100644 --- a/app/controllers/accounts/profiles_controller.rb +++ b/app/controllers/accounts/profiles_controller.rb @@ -25,7 +25,7 @@ def set_user end def user_params - params.require(:user).permit(:email, :full_name) + params.require(:user).permit(:email, :full_name, :time_zone) end def after_update_url diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index d9b5f0424..98471625b 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -2,6 +2,7 @@ class ApplicationController < ActionController::Base before_action :prepare_meta_tags, if: -> { request.format.html? } + before_action :set_time_zone include StoreLocation @@ -56,4 +57,9 @@ def #{s}!(redirect_url: nil) end RUBY_EVAL end + + private + def set_time_zone + Time.zone = current_user.time_zone if current_user&.time_zone&.present? + end end diff --git a/app/views/accounts/profiles/show.html.erb b/app/views/accounts/profiles/show.html.erb index f21ed9439..3e2a50cd7 100644 --- a/app/views/accounts/profiles/show.html.erb +++ b/app/views/accounts/profiles/show.html.erb @@ -9,6 +9,12 @@

<%= t(".section.email.description") %>

+
+ <%= t(".section.time_zone.title") %> +
+

+ <%= t(".section.time_zone.description") %> +

<%= form_with(model: @user, url: account_profile_path, html: {method: :put}, local: true) do |f| %> @@ -17,6 +23,11 @@ <%= f.email_field :email, id: "user_email", autofocus: true, required: "required", class: "form-control", class_for_error: "is-invalid" %> <%= f.error_message :email, class: "invalid-feedback" %>
+
+ <%= f.label :time_zone %> + <%= f.select :time_zone, ActiveSupport::TimeZone::MAPPING.sort, {}, id: "user_time_zone", autofocus: true, required: "required", class: "form-control", class_for_error: "is-invalid" %> + <%= f.error_message :time_zone, class: "invalid-feedback" %> +
<%= f.submit t(".submit"), class: "btn btn-block btn-primary" %> <% end %> diff --git a/config/locales/views/accounts/profiles/en.yml b/config/locales/views/accounts/profiles/en.yml index e43859d3f..47aaa1e1c 100644 --- a/config/locales/views/accounts/profiles/en.yml +++ b/config/locales/views/accounts/profiles/en.yml @@ -9,3 +9,6 @@ en: email: title: "Email" description: "After a successful email update, you should use new email on next log in." + time_zone: + title: "Time zone" + description: "After a successful time zone update, the time will be shown in correct time zone" \ No newline at end of file diff --git a/config/locales/views/accounts/profiles/zh-CN.yml b/config/locales/views/accounts/profiles/zh-CN.yml index b315a7a73..b6eb074d6 100644 --- a/config/locales/views/accounts/profiles/zh-CN.yml +++ b/config/locales/views/accounts/profiles/zh-CN.yml @@ -9,3 +9,6 @@ zh-CN: email: title: "邮箱" description: "这些信息会影响到下一次登录,并且不能和其他用户的重复" + time_zone: + title: "时区" + description: "这个选项会影响显示的时间的时区" diff --git a/db/migrate/20190809022738_add_user_time_zone.rb b/db/migrate/20190809022738_add_user_time_zone.rb new file mode 100644 index 000000000..ca85d0f7c --- /dev/null +++ b/db/migrate/20190809022738_add_user_time_zone.rb @@ -0,0 +1,5 @@ +class AddUserTimeZone < ActiveRecord::Migration[6.0] + def change + add_column :users, :time_zone, :string + end +end diff --git a/db/schema.rb b/db/schema.rb index 45668e3c9..6131ab09e 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.define(version: 2019_03_02_174954) do +ActiveRecord::Schema.define(version: 2019_08_09_022738) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -43,6 +43,7 @@ t.integer "invitations_count", default: 0 t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false + t.string "time_zone" t.index ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true t.index ["email"], name: "index_users_on_email", unique: true t.index ["invitation_token"], name: "index_users_on_invitation_token", unique: true