diff --git a/frontend/src/metabase/lib/formatting.js b/frontend/src/metabase/lib/formatting.js index f1f2ccdfe9501b78cdf54479708adbf924faf77f..ea3c9df1786019e64ebed803d3dcc6bee7472970 100644 --- a/frontend/src/metabase/lib/formatting.js +++ b/frontend/src/metabase/lib/formatting.js @@ -37,6 +37,12 @@ import type { Column, Value } from "metabase/meta/types/Dataset"; import type { DatetimeUnit } from "metabase/meta/types/Query"; import type { Moment } from "metabase/meta/types"; +import type { + DateStyle, + TimeStyle, + TimeEnabled, +} from "metabase/lib/formatting/date"; + export type FormattingOptions = { // GENERIC column?: Column | Field, @@ -68,12 +74,12 @@ export type FormattingOptions = { link_text?: string, // DATE/TIME // date/timeout style string that is used to derive a date_format or time_format for different units, see metabase/lib/formatting/date - date_style?: string, - time_style?: string, - date_format?: string, + date_style?: DateStyle, date_abbreviate?: boolean, + date_format?: string, + time_style?: TimeStyle, + time_enabled?: TimeEnabled, time_format?: string, - time_enabled?: null | "minutes" | "seconds" | "milliseconds", }; type FormattedString = string | React$Element<any>; diff --git a/frontend/src/metabase/lib/formatting/date.js b/frontend/src/metabase/lib/formatting/date.js index ab982d776ac7a258088f3a9f7b6ca375de0684e8..f114b52bb501021eeb6728ad1cb75bc4f855949c 100644 --- a/frontend/src/metabase/lib/formatting/date.js +++ b/frontend/src/metabase/lib/formatting/date.js @@ -1,4 +1,25 @@ -const DEFAULT_DATE_FORMATS = { +/* @flow */ + +import type { DatetimeUnit } from "metabase/meta/types/Query"; + +export type DateStyle = + | "M/D/YY" + | "D/M/YY" + | "YYYY/M/D" + | "MMMM D, YYYY" + | "MMMM D, YYYY" + | "D MMMM, YYYY" + | "dddd, MMMM D, YYYY"; + +export type TimeStyle = "h:mm A" | "k:mm"; + +export type MomentFormat = string; // moment.js format strings +export type DateFormat = MomentFormat; +export type TimeFormat = MomentFormat; + +export type TimeEnabled = null | "minutes" | "seconds" | "milliseconds"; + +const DEFAULT_DATE_FORMATS: { [unit: DatetimeUnit]: MomentFormat } = { year: "YYYY", quarter: "[Q]Q - YYYY", "minute-of-hour": "m", @@ -12,7 +33,9 @@ const DEFAULT_DATE_FORMATS = { }; // a "date style" is essentially a "day" format with overrides for larger units -const DATE_STYLE_TO_FORMAT = { +const DATE_STYLE_TO_FORMAT: { + [style: DateStyle]: { [unit: DatetimeUnit]: MomentFormat }, +} = { "M/D/YY": { month: "M/YY", }, @@ -35,9 +58,12 @@ const DATE_STYLE_TO_FORMAT = { }, }; -export const DEFAULT_DATE_STYLE = "MMMM D, YYYY"; +export const DEFAULT_DATE_STYLE: DateStyle = "MMMM D, YYYY"; -export function getDateFormatFromStyle(style, unit) { +export function getDateFormatFromStyle( + style: DateStyle, + unit: DatetimeUnit, +): DateFormat { if (DATE_STYLE_TO_FORMAT[style]) { if (DATE_STYLE_TO_FORMAT[style][unit]) { return DATE_STYLE_TO_FORMAT[style][unit]; @@ -51,18 +77,28 @@ export function getDateFormatFromStyle(style, unit) { return style; } -const UNITS_WITH_HOUR = [null, "default", "second", "minute", "hour"]; -const UNITS_WITH_DAY = [...UNITS_WITH_HOUR, "day", "week"]; +const UNITS_WITH_HOUR: DatetimeUnit[] = ["default", "minute", "hour"]; +const UNITS_WITH_DAY: DatetimeUnit[] = [ + "default", + "minute", + "hour", + "day", + "week", +]; const UNITS_WITH_HOUR_SET = new Set(UNITS_WITH_HOUR); const UNITS_WITH_DAY_SET = new Set(UNITS_WITH_DAY); -export const hasHour = unit => UNITS_WITH_HOUR_SET.has(unit); -export const hasDay = unit => UNITS_WITH_DAY_SET.has(unit); +export const hasHour = (unit: DatetimeUnit) => UNITS_WITH_HOUR_SET.has(unit); +export const hasDay = (unit: DatetimeUnit) => UNITS_WITH_DAY_SET.has(unit); -export const DEFAULT_TIME_STYLE = "h:mm A"; +export const DEFAULT_TIME_STYLE: TimeStyle = "h:mm A"; -export function getTimeFormatFromStyle(style, unit, timeEnabled) { +export function getTimeFormatFromStyle( + style: TimeStyle, + unit: DatetimeUnit, + timeEnabled: ?TimeEnabled, +): TimeFormat { let format = style; if (!timeEnabled || timeEnabled === "milliseconds") { return format.replace(/mm/, "mm:ss.SSS");