diff --git a/frontend/src/metabase/lib/query_time.js b/frontend/src/metabase/lib/query_time.js index 5cbee218f7ed6bf3a6e510a055df40a99963b279..b17e2f621edcc8c40d3634c7ec96df04878c0774 100644 --- a/frontend/src/metabase/lib/query_time.js +++ b/frontend/src/metabase/lib/query_time.js @@ -30,14 +30,16 @@ export const DATETIME_UNITS = [ export function computeFilterTimeRange(filter) { let expandedFilter; + let defaultUnit; if (filter[0] === "time-interval") { + defaultUnit = filter[3]; expandedFilter = expandTimeIntervalFilter(filter); } else { expandedFilter = filter; } const [operator, field, ...values] = expandedFilter; - const bucketing = parseFieldBucketing(field, "day"); + const bucketing = parseFieldBucketing(field, defaultUnit ?? "day"); let start, end; if (isStartingFrom(filter)) { diff --git a/frontend/test/metabase/scenarios/dashboard-filters/reproductions/22482-round-relative-ranges.cy.spec.js b/frontend/test/metabase/scenarios/dashboard-filters/reproductions/22482-round-relative-ranges.cy.spec.js new file mode 100644 index 0000000000000000000000000000000000000000..6d333cf5dea40490218703fce286635169a4d800 --- /dev/null +++ b/frontend/test/metabase/scenarios/dashboard-filters/reproductions/22482-round-relative-ranges.cy.spec.js @@ -0,0 +1,56 @@ +import moment from "moment"; +import { + restore, + popover, + filterWidget, + editDashboard, + saveDashboard, + setFilter, + visitDashboard, +} from "__support__/e2e/cypress"; + +describe("issue 22482", () => { + beforeEach(() => { + restore(); + cy.signInAsAdmin(); + + visitDashboard(1); + + editDashboard(); + setFilter("Time", "All Options"); + + cy.findByText("Select…").click(); + popover() + .contains("Created At") + .eq(0) + .click(); + + saveDashboard(); + + filterWidget().click(); + cy.findByText("Relative dates...").click(); + }); + + it("should round relative date range (metabase#22482)", () => { + cy.findByTestId("relative-datetime-value") + .clear() + .type(15); + cy.findByTestId("relative-datetime-unit").click(); + cy.findByText("months").click(); + + const expectedRange = getFormattedRange( + moment() + .startOf("month") + .add(-16, "month"), + moment() + .add(-1, "month") + .endOf("month"), + ); + + cy.findByText(expectedRange); + }); +}); + +function getFormattedRange(start, end) { + return `${start.format("MMM D, YYYY")} - ${end.format("MMM D, YYYY")}`; +}