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