From cf3643786f0dfa594a84f38272c888471e677489 Mon Sep 17 00:00:00 2001
From: Anton Kulyk <kuliks.anton@gmail.com>
Date: Wed, 12 Oct 2022 13:18:16 +0100
Subject: [PATCH] Hide ID filters in data app pages (#25873)

* Hide ID filters in data app pages

* Extend existing `getVisibleParameters` utility

* Use existing `getVisibleParameters` in Dashboard
---
 .../dashboard/components/Dashboard/Dashboard.jsx    | 13 ++++++++-----
 frontend/src/metabase/parameters/types.ts           |  4 +++-
 frontend/src/metabase/parameters/utils/ui.ts        |  6 ++++--
 .../src/metabase/parameters/utils/ui.unit.spec.ts   |  4 ++++
 4 files changed, 19 insertions(+), 8 deletions(-)

diff --git a/frontend/src/metabase/dashboard/components/Dashboard/Dashboard.jsx b/frontend/src/metabase/dashboard/components/Dashboard/Dashboard.jsx
index 26c92ce32c2..e6e3c6f59e0 100644
--- a/frontend/src/metabase/dashboard/components/Dashboard/Dashboard.jsx
+++ b/frontend/src/metabase/dashboard/components/Dashboard/Dashboard.jsx
@@ -8,6 +8,7 @@ import { getMainElement } from "metabase/lib/dom";
 import DashboardHeader from "metabase/dashboard/containers/DashboardHeader";
 import SyncedParametersList from "metabase/parameters/components/SyncedParametersList/SyncedParametersList";
 import { getValuePopulatedParameters } from "metabase/parameters/utils/parameter-values";
+import { getVisibleParameters } from "metabase/parameters/utils/ui";
 import DashboardControls from "../../hoc/DashboardControls";
 import { DashboardSidebars } from "../DashboardSidebars";
 import DashboardGrid from "../DashboardGrid";
@@ -102,9 +103,10 @@ class Dashboard extends Component {
     this.parametersAndCardsContainerRef = React.createRef();
   }
 
-  static getDerivedStateFromProps(props, state) {
-    return props.parameters.length !== state.parametersListLength
-      ? { parametersListLength: props.parameters.length }
+  static getDerivedStateFromProps({ parameters }, { parametersListLength }) {
+    const visibleParameters = getVisibleParameters(parameters);
+    return visibleParameters.length !== parametersListLength
+      ? { parametersListLength: visibleParameters.length }
       : null;
   }
 
@@ -231,6 +233,7 @@ class Dashboard extends Component {
 
     const shouldRenderAsNightMode = isNightMode && isFullscreen;
     const dashboardHasCards = dashboard => dashboard.ordered_cards.length > 0;
+    const visibleParameters = getVisibleParameters(parameters);
 
     const parametersWidget = (
       <SyncedParametersList
@@ -247,10 +250,10 @@ class Dashboard extends Component {
     );
 
     const shouldRenderParametersWidgetInViewMode =
-      !isEditing && !isFullscreen && parameters.length > 0;
+      !isEditing && !isFullscreen && visibleParameters.length > 0;
 
     const shouldRenderParametersWidgetInEditMode =
-      isEditing && parameters.length > 0;
+      isEditing && visibleParameters.length > 0;
 
     const cardsContainerShouldHaveMarginTop =
       !shouldRenderParametersWidgetInViewMode &&
diff --git a/frontend/src/metabase/parameters/types.ts b/frontend/src/metabase/parameters/types.ts
index ea867b41325..e7789cac50e 100644
--- a/frontend/src/metabase/parameters/types.ts
+++ b/frontend/src/metabase/parameters/types.ts
@@ -10,7 +10,9 @@ export interface FieldFilterUiParameter extends ValuePopulatedParameter {
   hasVariableTemplateTagTarget?: boolean;
 }
 
-export type UiParameter = FieldFilterUiParameter | ValuePopulatedParameter;
+export type UiParameter = (FieldFilterUiParameter | ValuePopulatedParameter) & {
+  hidden?: boolean;
+};
 
 export type ParameterWithTarget = Parameter & {
   target: ParameterTarget;
diff --git a/frontend/src/metabase/parameters/utils/ui.ts b/frontend/src/metabase/parameters/utils/ui.ts
index 32154c7f8e2..20fb2cb9801 100644
--- a/frontend/src/metabase/parameters/utils/ui.ts
+++ b/frontend/src/metabase/parameters/utils/ui.ts
@@ -32,12 +32,14 @@ export function buildHiddenParametersSlugSet(
 
 export function getVisibleParameters(
   parameters: UiParameter[],
-  hiddenParameterSlugs: string | undefined,
+  hiddenParameterSlugs?: string,
 ) {
   const hiddenParametersSlugSet =
     buildHiddenParametersSlugSet(hiddenParameterSlugs);
 
-  return parameters.filter(p => !hiddenParametersSlugSet.has(p.slug));
+  return parameters.filter(
+    p => !hiddenParametersSlugSet.has(p.slug) && !p.hidden,
+  );
 }
 
 export function getParameterWidgetTitle(parameter: UiParameter) {
diff --git a/frontend/src/metabase/parameters/utils/ui.unit.spec.ts b/frontend/src/metabase/parameters/utils/ui.unit.spec.ts
index 0c7983f8934..9ade9c7ff81 100644
--- a/frontend/src/metabase/parameters/utils/ui.unit.spec.ts
+++ b/frontend/src/metabase/parameters/utils/ui.unit.spec.ts
@@ -54,6 +54,10 @@ describe("parameters/utils/ui", () => {
         id: "4",
         slug: "qux",
       }),
+      createMockUiParameter({
+        id: "5",
+        hidden: true,
+      }),
     ];
 
     const hiddenParameterSlugs = "bar,baz";
-- 
GitLab