diff --git a/frontend/src/metabase/parameters/utils/date-formatting.ts b/frontend/src/metabase/parameters/utils/date-formatting.ts index de880bcf6a235431d38f5995afb10f9c6c0cfe6d..ed4db3d41879cb9e39a0f6f399dab4a1846c22d9 100644 --- a/frontend/src/metabase/parameters/utils/date-formatting.ts +++ b/frontend/src/metabase/parameters/utils/date-formatting.ts @@ -30,7 +30,10 @@ function getFilterValueSerializer(func: (...args: any[]) => string) { }; } -const serializersByOperatorName: Record<string, (...args: any[]) => string> = { +const serializersByOperatorName: Record< + string, + (...args: any[]) => string | null +> = { previous: getFilterValueSerializer((value, unit, options = {}) => { if (options.startingFrom) { const [fromValue, fromUnit] = options.startingFrom; @@ -53,8 +56,8 @@ const serializersByOperatorName: Record<string, (...args: any[]) => string> = { exclude: (filter: any[]) => { const [_op, _field, ...values] = filter; const operator = getExcludeOperator(filter); - if (!operator) { - return ""; + if (!operator || !values.length) { + return null; } const options = operator .getOptions() diff --git a/frontend/test/metabase/scenarios/dashboard-filters/reproductions/24235-exlude-all-date-options.cy.spec.js b/frontend/test/metabase/scenarios/dashboard-filters/reproductions/24235-exlude-all-date-options.cy.spec.js new file mode 100644 index 0000000000000000000000000000000000000000..6dd285626db03869482f8503575a882afac0e61f --- /dev/null +++ b/frontend/test/metabase/scenarios/dashboard-filters/reproductions/24235-exlude-all-date-options.cy.spec.js @@ -0,0 +1,74 @@ +import { popover, restore, visitDashboard } from "__support__/e2e/helpers"; +import { SAMPLE_DATABASE } from "__support__/e2e/cypress_sample_database"; + +const { PRODUCTS, PRODUCTS_ID } = SAMPLE_DATABASE; + +const questionDetails = { + query: { "source-table": PRODUCTS_ID }, +}; + +const parameter = { + id: "727b06c1", + name: "Date Filter", + sectionId: "date", + slug: "date_filter", + type: "date/all-options", +}; + +const parameterTarget = [ + "dimension", + ["field", PRODUCTS.CREATED_AT, { "temporal-unit": "month" }], +]; + +describe("issue 24235", () => { + beforeEach(() => { + restore(); + cy.signInAsAdmin(); + cy.intercept("POST", "/api/dashboard/**/query").as("getCardQuery"); + }); + + it("should remove filter when all exclude options are selected (metabase#24235)", () => { + cy.createQuestionAndDashboard({ questionDetails }).then( + ({ body: { id, card_id, dashboard_id } }) => { + cy.addFilterToDashboard({ filter: parameter, dashboard_id }); + mapParameterToDashboardCard({ id, card_id, dashboard_id }); + visitDashboard(dashboard_id); + }, + ); + + cy.findByText(parameter.name).click(); + + popover().within(() => { + cy.findByText("Exclude...").click(); + cy.findByText("Days of the week...").click(); + cy.findByText("Select none...").click(); + cy.findByText("Select all...").click(); + cy.findByText("Update filter").click(); + }); + + cy.wait("@getCardQuery"); + cy.findByText("Rows 1-13 of 200").should("be.visible"); + }); +}); + +const mapParameterToDashboardCard = ({ id, card_id, dashboard_id }) => { + cy.request("PUT", `/api/dashboard/${dashboard_id}/cards`, { + cards: [ + { + id, + card_id, + row: 0, + col: 0, + sizeX: 18, + sizeY: 10, + parameter_mappings: [ + { + card_id, + parameter_id: parameter.id, + target: parameterTarget, + }, + ], + }, + ], + }); +};