diff --git a/frontend/src/metabase/dashboard/components/ClickMappings.jsx b/frontend/src/metabase/dashboard/components/ClickMappings.jsx index 766d2051f1b03650c9c5df548efc4f6dc864b308..12e07ec97a7cc7d0d14f4dc539a60f709e3e139b 100644 --- a/frontend/src/metabase/dashboard/components/ClickMappings.jsx +++ b/frontend/src/metabase/dashboard/components/ClickMappings.jsx @@ -33,11 +33,13 @@ import { getParameters } from "metabase/dashboard/selectors"; ) .filter(mapping => getIn(mapping, ["source", "type"]) === "parameter") .map(mapping => mapping.source.id); - parameters = parameters.filter(p => parametersUsedAsSources.includes(p.id)); + parameters = parameters.filter(p => { + return parametersUsedAsSources.includes(p.id); + }); } const [setTargets, unsetTargets] = _.partition( - getTargetsWithSourceFilters({ isDash, object, metadata }), + getTargetsWithSourceFilters({ isDash, dashcard, object, metadata }), ({ id }) => getIn(clickBehavior, ["parameterMapping", id, "source"]) != null, ); diff --git a/frontend/src/metabase/lib/click-behavior.js b/frontend/src/metabase/lib/click-behavior.js index 5bfc10d11752c3db561a9faf4e6e3306ab74d99b..01c5abc9a9481aed7f52305bf7820931c92089b6 100644 --- a/frontend/src/metabase/lib/click-behavior.js +++ b/frontend/src/metabase/lib/click-behavior.js @@ -72,9 +72,14 @@ function notRelativeDateOrRange({ type }) { return type !== "date/range" && type !== "date/relative"; } -export function getTargetsWithSourceFilters({ isDash, object, metadata }) { +export function getTargetsWithSourceFilters({ + isDash, + dashcard, + object, + metadata, +}) { return isDash - ? getTargetsForDashboard(object) + ? getTargetsForDashboard(object, dashcard) : getTargetsForQuestion(object, metadata); } @@ -128,7 +133,7 @@ function getTargetsForQuestion(question, metadata) { }); } -function getTargetsForDashboard(dashboard) { +function getTargetsForDashboard(dashboard, dashcard) { return dashboard.parameters.map(parameter => { const { type, id, name } = parameter; const filter = baseTypeFilterForParameterType(type); @@ -138,9 +143,14 @@ function getTargetsForDashboard(dashboard) { target: { type: "parameter", id }, sourceFilters: { column: c => notRelativeDateOrRange(parameter) && filter(c.base_type), - parameter: sourceParam => - parameter.type === sourceParam.type && - parameter.id !== sourceParam.id, + parameter: sourceParam => { + // parameter IDs are generated client-side, so they might not be unique + // if dashboard is a clone, it will have identical parameter IDs to the original + const isSameParameter = + dashboard.id === dashcard.dashboard_id && + parameter.id === sourceParam.id; + return parameter.type === sourceParam.type && !isSameParameter; + }, userAttribute: () => !parameter.type.startsWith("date"), }, }; diff --git a/frontend/test/metabase/lib/click-behavior.unit.spec.js b/frontend/test/metabase/lib/click-behavior.unit.spec.js index 663c2eb172ec9b36a48052cac76eba73376174a4..1031fe865cad3cca13b72e5871068f69a119361c 100644 --- a/frontend/test/metabase/lib/click-behavior.unit.spec.js +++ b/frontend/test/metabase/lib/click-behavior.unit.spec.js @@ -66,6 +66,9 @@ describe("metabase/lib/click-behavior", () => { const [{ id, name, target }] = getTargetsWithSourceFilters({ isDash: true, object: { parameters: [parameter] }, + dashcard: { + dashboard_id: 111, + }, }); expect(id).toEqual("foo123"); expect(name).toEqual("My Param"); @@ -219,6 +222,9 @@ describe("metabase/lib/click-behavior", () => { const [{ sourceFilters }] = getTargetsWithSourceFilters({ isDash: true, object: { parameters: [parameter] }, + dashcard: { + dashboard_id: 111, + }, }); const filteredSources = _.mapObject(sources, (sources, sourceType) =>