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 833d5c8064b0d75e3cf4a1f37d7b115da92a8b90..aa069cceeeaab2785ae5b940a65b038219fd121a 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 a0740c324f75714cc145d35fd696e301f7a5b1a6..11529baf3ca6940331c591ea28317746e63f1e85 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 7c175e017b35156a99d53e2f4be6dd76ad94c591..a7f244bd32165fa924fbc732bc6fb540baef9d62 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",