diff --git a/superset-frontend/packages/superset-ui-core/src/time-comparison/getTimeOffset.ts b/superset-frontend/packages/superset-ui-core/src/time-comparison/getTimeOffset.ts index b8f970dc10069..7bfdd5e4ee72d 100644 --- a/superset-frontend/packages/superset-ui-core/src/time-comparison/getTimeOffset.ts +++ b/superset-frontend/packages/superset-ui-core/src/time-comparison/getTimeOffset.ts @@ -78,6 +78,11 @@ export const parseDttmToDate = ( now.setMonth(now.getMonth() - 1); } return now; + case 'previous calendar quarter': { + const quarter = Math.floor(now.getMonth() / 3); + const newdate = new Date(now.getFullYear(), quarter * 3 - 3, 1); + return newdate; + } case 'previous calendar year': if (isEndDate) { now.setFullYear(now.getFullYear(), 0, 1); // end date is the last day of the previous year diff --git a/superset-frontend/packages/superset-ui-core/test/time-comparison/getTimeOffset.test.ts b/superset-frontend/packages/superset-ui-core/test/time-comparison/getTimeOffset.test.ts index 877fd9981e544..2e64ccb4b56a6 100644 --- a/superset-frontend/packages/superset-ui-core/test/time-comparison/getTimeOffset.test.ts +++ b/superset-frontend/packages/superset-ui-core/test/time-comparison/getTimeOffset.test.ts @@ -527,6 +527,39 @@ test('should handle custom range with previous calendar month', () => { ); }); +test('should handle custom range with previous calendar quarter', () => { + const timeRangeFilter = { + comparator: 'previous calendar quarter', + }; + const shifts = ['custom']; + const startDate = '2024-04-26'; + jest.useFakeTimers(); + runTimezoneTest( + '2024-06-05T02:06:00+02:00', + 'Etc/GMT-2', + timeRangeFilter, + shifts, + startDate, + ['5 days ago'], + ); + runTimezoneTest( + '2024-06-05T00:06:00Z', + 'UTC', + timeRangeFilter, + shifts, + startDate, + ['5 days ago'], + ); + runTimezoneTest( + '2024-06-04T16:06:00-08:00', + 'Etc/GMT+8', + timeRangeFilter, + shifts, + startDate, + ['5 days ago'], + ); +}); + test('should handle custom range with previous calendar year', () => { const timeRangeFilter = { comparator: 'previous calendar year', diff --git a/superset-frontend/src/explore/components/controls/DateFilterControl/types.ts b/superset-frontend/src/explore/components/controls/DateFilterControl/types.ts index 7062b4858065b..09a5966453807 100644 --- a/superset-frontend/src/explore/components/controls/DateFilterControl/types.ts +++ b/superset-frontend/src/explore/components/controls/DateFilterControl/types.ts @@ -80,10 +80,12 @@ export type CommonRangeType = export const PreviousCalendarWeek = 'previous calendar week'; export const PreviousCalendarMonth = 'previous calendar month'; +export const PreviousCalendarQuarter = 'previous calendar quarter'; export const PreviousCalendarYear = 'previous calendar year'; export type CalendarRangeType = | typeof PreviousCalendarWeek | typeof PreviousCalendarMonth + | typeof PreviousCalendarQuarter | typeof PreviousCalendarYear; export const CurrentDay = 'Current day'; diff --git a/superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts b/superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts index dee66da7d99d3..24948c7dc342a 100644 --- a/superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts +++ b/superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts @@ -22,6 +22,7 @@ import { SelectOptionType, PreviousCalendarWeek, PreviousCalendarMonth, + PreviousCalendarQuarter, PreviousCalendarYear, CommonRangeType, CalendarRangeType, @@ -56,6 +57,7 @@ export const COMMON_RANGE_VALUES_SET = new Set( export const CALENDAR_RANGE_OPTIONS: SelectOptionType[] = [ { value: PreviousCalendarWeek, label: t('previous calendar week') }, { value: PreviousCalendarMonth, label: t('previous calendar month') }, + { value: PreviousCalendarQuarter, label: t('previous calendar quarter') }, { value: PreviousCalendarYear, label: t('previous calendar year') }, ]; export const CALENDAR_RANGE_VALUES_SET = new Set( @@ -119,6 +121,7 @@ export const COMMON_RANGE_SET: Set = new Set([ export const CALENDAR_RANGE_SET: Set = new Set([ PreviousCalendarWeek, PreviousCalendarMonth, + PreviousCalendarQuarter, PreviousCalendarYear, ]); diff --git a/tests/unit_tests/utils/date_parser_tests.py b/tests/unit_tests/utils/date_parser_tests.py index a5a3f8b0ac926..18f43e44257cb 100644 --- a/tests/unit_tests/utils/date_parser_tests.py +++ b/tests/unit_tests/utils/date_parser_tests.py @@ -156,6 +156,10 @@ def test_get_since_until() -> None: expected = datetime(2016, 10, 1, 0, 0, 0), datetime(2016, 11, 1, 0, 0, 0) assert result == expected + result = get_since_until("previous calendar quarter") + expected = datetime(2016, 7, 1, 0, 0, 0), datetime(2016, 9, 30, 0, 0, 0) + assert result == expected + result = get_since_until("previous calendar year") expected = datetime(2015, 1, 1, 0, 0, 0), datetime(2016, 1, 1, 0, 0, 0) assert result == expected