From ffa0362004a6703d58ea5eb8bdcd4df2fac51906 Mon Sep 17 00:00:00 2001 From: Alexander Polyankin <alexander.polyankin@metabase.com> Date: Tue, 7 Feb 2023 21:34:18 +0200 Subject: [PATCH] Allow only single value to be selected for variable template tags (#28118) --- .../ParameterFieldWidget/ParameterFieldWidget.jsx | 13 +++++++++---- .../helpers/e2e-field-filter-helpers.js | 7 +++++-- .../native-filters/sql-filters-source.cy.spec.js | 9 ++++----- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/frontend/src/metabase/parameters/components/widgets/ParameterFieldWidget/ParameterFieldWidget.jsx b/frontend/src/metabase/parameters/components/widgets/ParameterFieldWidget/ParameterFieldWidget.jsx index eb4cdc08c2b..86bf1bf2d69 100644 --- a/frontend/src/metabase/parameters/components/widgets/ParameterFieldWidget/ParameterFieldWidget.jsx +++ b/frontend/src/metabase/parameters/components/widgets/ParameterFieldWidget/ParameterFieldWidget.jsx @@ -49,9 +49,12 @@ export default function ParameterFieldWidget({ const disableSearch = operator && isFuzzyOperator(operator); const hasValue = Array.isArray(value) ? value.length > 0 : value != null; + const supportsMultipleValues = + multi && !parameter.hasVariableTemplateTagTarget; + const isValid = unsavedValue.every(value => value != null) && - (multi || unsavedValue.length === numFields); + (supportsMultipleValues || unsavedValue.length === numFields); return ( <WidgetRoot> @@ -61,8 +64,10 @@ export default function ParameterFieldWidget({ )} {_.times(numFields, index => { - const value = multi ? unsavedValue : [unsavedValue[index]]; - const onValueChange = multi + const value = supportsMultipleValues + ? unsavedValue + : [unsavedValue[index]]; + const onValueChange = supportsMultipleValues ? newValues => setUnsavedValue(newValues) : ([value]) => { const newValues = [...unsavedValue]; @@ -82,7 +87,7 @@ export default function ParameterFieldWidget({ placeholder={isEditing ? t`Enter a default value…` : undefined} fields={fields} autoFocus={index === 0} - multi={multi} + multi={supportsMultipleValues} disableSearch={disableSearch} formatOptions={ operator && getFilterArgumentFormatOptions(operator, index) diff --git a/frontend/test/metabase/scenarios/native-filters/helpers/e2e-field-filter-helpers.js b/frontend/test/metabase/scenarios/native-filters/helpers/e2e-field-filter-helpers.js index 2c08d3e920d..95f3df7305b 100644 --- a/frontend/test/metabase/scenarios/native-filters/helpers/e2e-field-filter-helpers.js +++ b/frontend/test/metabase/scenarios/native-filters/helpers/e2e-field-filter-helpers.js @@ -38,10 +38,13 @@ export function setWidgetStringFilter(value) { * @param {string} value */ -export function selectFilterValueFromList(value) { +export function selectFilterValueFromList(value, { addFilter = true } = {}) { popover().within(() => { cy.findByText(value).click(); - cy.button("Add filter").click(); + + if (addFilter) { + cy.button("Add filter").click(); + } }); } diff --git a/frontend/test/metabase/scenarios/native-filters/sql-filters-source.cy.spec.js b/frontend/test/metabase/scenarios/native-filters/sql-filters-source.cy.spec.js index c061bf7ddae..b7a4f1b5c93 100644 --- a/frontend/test/metabase/scenarios/native-filters/sql-filters-source.cy.spec.js +++ b/frontend/test/metabase/scenarios/native-filters/sql-filters-source.cy.spec.js @@ -15,7 +15,6 @@ import { SAMPLE_DB_ID, USER_GROUPS } from "__support__/e2e/cypress_data"; import { SAMPLE_DATABASE } from "__support__/e2e/cypress_sample_database"; import * as SQLFilter from "./helpers/e2e-sql-filter-helpers"; import * as FieldFilter from "./helpers/e2e-field-filter-helpers"; -import { toggleRequired } from "./helpers/e2e-sql-filter-helpers"; const { PRODUCTS_ID, PRODUCTS } = SAMPLE_DATABASE; const { COLLECTION_GROUP } = USER_GROUPS; @@ -69,7 +68,7 @@ describe("scenarios > filters > sql filters > values source", () => { FieldFilter.selectFilterValueFromList("Gizmo"); SQLFilter.runQuery("cardQuery"); - toggleRequired(); + SQLFilter.toggleRequired(); FieldFilter.openEntryForm(true); FieldFilter.selectFilterValueFromList("Gadget"); }); @@ -86,10 +85,12 @@ describe("scenarios > filters > sql filters > values source", () => { FieldFilter.openEntryForm(); checkFilterValueNotInList("Doohickey"); + FieldFilter.selectFilterValueFromList("Gadget", { addFilter: false }); FieldFilter.selectFilterValueFromList("Gizmo"); SQLFilter.runQuery("cardQuery"); + cy.findByText("Showing 51 rows").should("exist"); - toggleRequired(); + SQLFilter.toggleRequired(); FieldFilter.openEntryForm(true); FieldFilter.selectFilterValueFromList("Gadget"); }); @@ -105,8 +106,6 @@ describe("scenarios > filters > sql filters > values source", () => { FieldFilter.openEntryForm(); checkFilterValueNotInList("Doohickey"); - FieldFilter.setWidgetStringFilter("Gizmo"); - checkFilterValueNotInList("Widget"); FieldFilter.selectFilterValueFromList("Gizmo"); SQLFilter.runQuery("dataset"); }); -- GitLab