From 82c4a949d06b79a4bc75138de7515878d27079b9 Mon Sep 17 00:00:00 2001
From: Alexander Polyankin <alexander.polyankin@metabase.com>
Date: Thu, 24 Oct 2024 13:11:05 -0400
Subject: [PATCH] Fix date formatting of parameter values with time (#49046)

* Fix date formatting of parameter values with time

* Update frontend/src/metabase/parameters/utils/date-formatting.ts

Co-authored-by: Kamil Mielnik <kamil@kamilmielnik.com>

* Adjust E2E test

* Fix tests

---------

Co-authored-by: Kamil Mielnik <kamil@kamilmielnik.com>
---
 .../v1/queries/utils/query-time.js            |  2 +-
 .../parameters/utils/date-formatting.ts       | 14 +++++++---
 .../parameters/utils/formatting.unit.spec.ts  | 26 ++++++++++++++++---
 3 files changed, 35 insertions(+), 7 deletions(-)

diff --git a/frontend/src/metabase-lib/v1/queries/utils/query-time.js b/frontend/src/metabase-lib/v1/queries/utils/query-time.js
index 833d5c8064b..aa069cceeea 100644
--- a/frontend/src/metabase-lib/v1/queries/utils/query-time.js
+++ b/frontend/src/metabase-lib/v1/queries/utils/query-time.js
@@ -146,7 +146,7 @@ function generateTimeValueDescription(value, bucketing, isExclude) {
     if (bucketing) {
       return formatDateTimeWithUnit(value, bucketing, { isExclude });
     } else if (m.hours() || m.minutes()) {
-      return m.format("MMMM D, YYYY hh:mm a");
+      return m.format("MMMM D, YYYY hh:mm A");
     } else {
       return m.format("MMMM D, YYYY");
     }
diff --git a/frontend/src/metabase/parameters/utils/date-formatting.ts b/frontend/src/metabase/parameters/utils/date-formatting.ts
index a0740c324f7..11529baf3ca 100644
--- a/frontend/src/metabase/parameters/utils/date-formatting.ts
+++ b/frontend/src/metabase/parameters/utils/date-formatting.ts
@@ -1,4 +1,4 @@
-import moment from "moment-timezone"; // eslint-disable-line no-restricted-imports -- deprecated usage
+import moment, { type Moment } from "moment-timezone"; // eslint-disable-line no-restricted-imports -- deprecated usage
 import { t } from "ttag";
 import _ from "underscore";
 
@@ -126,16 +126,24 @@ function parseDateRangeValue(value: string) {
   return { start: moment(start, true), end: moment(end, true) };
 }
 
+function formatSingleDate(date: Moment) {
+  if (date.hours() || date.minutes()) {
+    return date.format("MMMM D, YYYY hh:mm A");
+  } else {
+    return date.format("MMMM D, YYYY");
+  }
+}
+
 export function formatRangeWidget(value: string): string | null {
   const { start, end } = parseDateRangeValue(value);
   return start.isValid() && end.isValid()
-    ? start.format("MMMM D, YYYY") + " - " + end.format("MMMM D, YYYY")
+    ? formatSingleDate(start) + " - " + formatSingleDate(end)
     : null;
 }
 
 function formatSingleWidget(value: string): string | null {
   const m = moment(value, true);
-  return m.isValid() ? m.format("MMMM D, YYYY") : null;
+  return m.isValid() ? formatSingleDate(m) : null;
 }
 
 function formatMonthYearWidget(value: string): string | null {
diff --git a/frontend/src/metabase/parameters/utils/formatting.unit.spec.ts b/frontend/src/metabase/parameters/utils/formatting.unit.spec.ts
index 7c175e017b3..a7f244bd321 100644
--- a/frontend/src/metabase/parameters/utils/formatting.unit.spec.ts
+++ b/frontend/src/metabase/parameters/utils/formatting.unit.spec.ts
@@ -31,15 +31,35 @@ const remappedField = checkNotNull(metadata.field(REMAPPED_FIELD_ID));
 describe("metabase/parameters/utils/formatting", () => {
   describe("formatParameterValue", () => {
     const cases = [
+      {
+        type: "date/single",
+        value: "2018-01-01",
+        expected: "January 1, 2018",
+      },
+      {
+        type: "date/single",
+        value: "2018-01-01T12:30:00",
+        expected: "January 1, 2018 12:30 PM",
+      },
       {
         type: "date/range",
         value: "1995-01-01~1995-01-10",
         expected: "January 1, 1995 - January 10, 1995",
       },
       {
-        type: "date/single",
-        value: "2018-01-01",
-        expected: "January 1, 2018",
+        type: "date/range",
+        value: "2018-01-01T12:30:00~2018-01-10",
+        expected: "January 1, 2018 12:30 PM - January 10, 2018",
+      },
+      {
+        type: "date/range",
+        value: "2018-01-01~2018-01-10T08:15:00",
+        expected: "January 1, 2018 - January 10, 2018 08:15 AM",
+      },
+      {
+        type: "date/range",
+        value: "2018-01-01T12:30:00~2018-01-10T08:15:00",
+        expected: "January 1, 2018 12:30 PM - January 10, 2018 08:15 AM",
       },
       {
         type: "date/all-options",
-- 
GitLab