From 6993666953f786d67c74c64b541b50aacc047e97 Mon Sep 17 00:00:00 2001 From: nakamura Date: Thu, 7 Nov 2024 12:11:43 +0000 Subject: [PATCH] Add timezone support and localization for date and time fields --- lib/administrate/field/date.rb | 6 +++- lib/administrate/field/date_time.rb | 5 ++-- lib/administrate/field/time.rb | 9 +++--- .../app/dashboards/customer_dashboard.rb | 2 ++ spec/lib/fields/time_spec.rb | 30 +++++++++++++++++++ 5 files changed, 44 insertions(+), 8 deletions(-) diff --git a/lib/administrate/field/date.rb b/lib/administrate/field/date.rb index 1d17b34d97..5041ba118f 100644 --- a/lib/administrate/field/date.rb +++ b/lib/administrate/field/date.rb @@ -5,7 +5,7 @@ module Field class Date < Base def date I18n.localize( - data.to_date, + data.in_time_zone(timezone).to_date, format: format ) end @@ -15,6 +15,10 @@ def date def format options.fetch(:format, :default) end + + def timezone + options.fetch(:timezone, ::Time.zone) + end end end end diff --git a/lib/administrate/field/date_time.rb b/lib/administrate/field/date_time.rb index 2263af4d2a..28f4c74457 100644 --- a/lib/administrate/field/date_time.rb +++ b/lib/administrate/field/date_time.rb @@ -13,8 +13,7 @@ def date def datetime I18n.localize( data.in_time_zone(timezone), - format: format, - default: data + format: format ) end @@ -25,7 +24,7 @@ def format end def timezone - options.fetch(:timezone, ::Time.zone.name || "UTC") + options.fetch(:timezone, ::Time.zone) end end end diff --git a/lib/administrate/field/time.rb b/lib/administrate/field/time.rb index 628987d110..ff461df09e 100644 --- a/lib/administrate/field/time.rb +++ b/lib/administrate/field/time.rb @@ -4,15 +4,16 @@ module Administrate module Field class Time < Base def time - return I18n.localize(data, format: format) if options[:format] - - data.strftime("%I:%M%p") + I18n.localize( + data, + format: format + ) end private def format - options[:format] + options.fetch(:format, "%I:%M%p") end end end diff --git a/spec/example_app/app/dashboards/customer_dashboard.rb b/spec/example_app/app/dashboards/customer_dashboard.rb index 79786fa4f7..1ada1ceb7e 100644 --- a/spec/example_app/app/dashboards/customer_dashboard.rb +++ b/spec/example_app/app/dashboards/customer_dashboard.rb @@ -17,6 +17,7 @@ class CustomerDashboard < Administrate::BaseDashboard searchable_fields: ["name"], include_blank: true ), + example_time: Field::Time, password: Field::Password } @@ -28,6 +29,7 @@ class CustomerDashboard < Administrate::BaseDashboard :email_subscriber, :kind, :territory, + :example_time, :password ].freeze diff --git a/spec/lib/fields/time_spec.rb b/spec/lib/fields/time_spec.rb index bce4994696..b15a9d6048 100644 --- a/spec/lib/fields/time_spec.rb +++ b/spec/lib/fields/time_spec.rb @@ -37,5 +37,35 @@ expect(field.time).to eq("04:38PM") end + + it "formats the time with localized AM/PM markers" do + time = DateTime.new(2021, 3, 26, 16, 38) + formats = { + time: { + am: "午前", + pm: "午後" + } + } + + field = Administrate::Field::Time.new(:time, time, :index) + + I18n.with_locale(:ja) do + with_translations(:ja, formats) do + expect(field.time).to eq("04:38午後") + end + end + end + + it "returns a missing translation message if the translation is not available" do + time = DateTime.new(2021, 3, 26, 16, 38) + field = Administrate::Field::Time.new(:time, time, :index) + formats = {} + + I18n.with_locale(:ja) do + with_translations(:ja, formats) do + expect(field.time).to eq("Translation missing: ja.time.pm") + end + end + end end end