From 1cb339e833b229e4ba530391cc1a2f1f568cb77f Mon Sep 17 00:00:00 2001 From: Uladzimir Havenchyk <125459446+uladzimirdev@users.noreply.github.com> Date: Fri, 24 May 2024 18:20:04 +0300 Subject: [PATCH] [Dashboard] Optimize rendering by reducing the number of props passing down to from the very top (#43114) * Avoid unnecessary re-renderings in dashboard - getEmbeddedParameterVisibility * Avoid unnecessary re-renderings in dashboard - favicon, page title * Exclude isLoadingComplete from passing down * Avoid unnecessary re-renderings in dashboard - metadata * Drop metadata from Public Dashboard * Avoid unnecessary re-renderings in dashboard - dashcardData --- .../ClickBehaviorSidebar.tsx | 5 --- .../ClickBehaviorSidebarContent.tsx | 10 +++--- .../components/DashCard/DashCard.tsx | 4 --- .../DashCard/DashCardVisualization.tsx | 6 ++-- .../DashCard/Dashcard.unit.spec.tsx | 4 --- .../components/Dashboard/Dashboard.tsx | 20 ------------ .../dashboard/components/DashboardGrid.tsx | 15 ++++----- .../DashboardHeader/DashboardHeader.tsx | 7 ++-- .../components/DashboardSidebars.jsx | 6 ---- .../containers/DashboardApp/DashboardApp.tsx | 32 ++++++------------- .../ParameterSidebar/ParameterSidebar.tsx | 15 ++++----- .../ParameterSidebar.unit.spec.tsx | 1 - .../PublicDashboard/PublicDashboard.tsx | 6 ---- 13 files changed, 37 insertions(+), 94 deletions(-) diff --git a/frontend/src/metabase/dashboard/components/ClickBehaviorSidebar/ClickBehaviorSidebar.tsx b/frontend/src/metabase/dashboard/components/ClickBehaviorSidebar/ClickBehaviorSidebar.tsx index a4f3d969087..284ecf9c90b 100644 --- a/frontend/src/metabase/dashboard/components/ClickBehaviorSidebar/ClickBehaviorSidebar.tsx +++ b/frontend/src/metabase/dashboard/components/ClickBehaviorSidebar/ClickBehaviorSidebar.tsx @@ -15,9 +15,7 @@ import type { Dashboard, QuestionDashboardCard, DashCardId, - CardId, ClickBehavior, - DatasetData, DatasetColumn, } from "metabase-types/api"; @@ -34,7 +32,6 @@ type VizSettings = Record<string, unknown>; interface Props { dashboard: Dashboard; dashcard: QuestionDashboardCard; - dashcardData: Record<DashCardId, Record<CardId, DatasetData>>; parameters: UiParameter[]; hideClickBehaviorSidebar: () => void; onUpdateDashCardColumnSettings: ( @@ -55,7 +52,6 @@ interface Props { export function ClickBehaviorSidebar({ dashboard, dashcard, - dashcardData, parameters, hideClickBehaviorSidebar, onUpdateDashCardColumnSettings, @@ -213,7 +209,6 @@ export function ClickBehaviorSidebar({ <ClickBehaviorSidebarContent dashboard={dashboard} dashcard={dashcard} - dashcardData={dashcardData} parameters={parameters} clickBehavior={clickBehavior} isTypeSelectorVisible={isTypeSelectorVisible} diff --git a/frontend/src/metabase/dashboard/components/ClickBehaviorSidebar/ClickBehaviorSidebarContent.tsx b/frontend/src/metabase/dashboard/components/ClickBehaviorSidebar/ClickBehaviorSidebarContent.tsx index 5de45679757..80ae052eccb 100644 --- a/frontend/src/metabase/dashboard/components/ClickBehaviorSidebar/ClickBehaviorSidebarContent.tsx +++ b/frontend/src/metabase/dashboard/components/ClickBehaviorSidebar/ClickBehaviorSidebarContent.tsx @@ -1,15 +1,14 @@ import { getIn } from "icepick"; import { useMemo } from "react"; +import { getDashcardData } from "metabase/dashboard/selectors"; import { isTableDisplay } from "metabase/lib/click-behavior"; +import { useSelector } from "metabase/lib/redux"; import type { UiParameter } from "metabase-lib/v1/parameters/types"; import type { Dashboard, QuestionDashboardCard, - DashCardId, - CardId, ClickBehavior, - DatasetData, DatasetColumn, } from "metabase-types/api"; @@ -22,7 +21,6 @@ import { getClickBehaviorForColumn } from "./utils"; interface Props { dashboard: Dashboard; dashcard: QuestionDashboardCard; - dashcardData: Record<DashCardId, Record<CardId, DatasetData>>; parameters: UiParameter[]; clickBehavior?: ClickBehavior; isTypeSelectorVisible: boolean | null; @@ -35,7 +33,6 @@ interface Props { export function ClickBehaviorSidebarContent({ dashboard, dashcard, - dashcardData, parameters, clickBehavior, isTypeSelectorVisible, @@ -51,6 +48,9 @@ export function ClickBehaviorSidebarContent({ // drill-through menu return { type: "actionMenu" }; }, [clickBehavior]); + const dashcardData = useSelector(state => + getDashcardData(state, dashcard.id), + ); if (isTableDisplay(dashcard) && !hasSelectedColumn && dashcard.card_id) { const columns = getIn(dashcardData, [dashcard.card_id, "data", "cols"]); diff --git a/frontend/src/metabase/dashboard/components/DashCard/DashCard.tsx b/frontend/src/metabase/dashboard/components/DashCard/DashCard.tsx index 7968728b7e4..fcbb948baf0 100644 --- a/frontend/src/metabase/dashboard/components/DashCard/DashCard.tsx +++ b/frontend/src/metabase/dashboard/components/DashCard/DashCard.tsx @@ -22,7 +22,6 @@ import { PLUGIN_COLLECTIONS } from "metabase/plugins"; import EmbedFrameS from "metabase/public/components/EmbedFrame/EmbedFrame.module.css"; import type { Mode } from "metabase/visualizations/click-actions/Mode"; import { mergeSettings } from "metabase/visualizations/lib/settings"; -import type Metadata from "metabase-lib/v1/metadata/Metadata"; import type { Card, CardId, @@ -53,7 +52,6 @@ export interface DashCardProps { gridItemWidth: number; totalNumGridCols: number; slowCards: Record<CardId, boolean>; - metadata: Metadata; mode?: Mode; clickBehaviorSidebarDashcard?: DashboardCard | null; @@ -89,7 +87,6 @@ function DashCardInner({ dashcard, dashboard, slowCards, - metadata, gridItemWidth, totalNumGridCols, mode, @@ -324,7 +321,6 @@ function DashCardInner({ dashboard={dashboard} dashcard={dashcard} series={series} - metadata={metadata} mode={mode} gridSize={gridSize} gridItemWidth={gridItemWidth} diff --git a/frontend/src/metabase/dashboard/components/DashCard/DashCardVisualization.tsx b/frontend/src/metabase/dashboard/components/DashCard/DashCardVisualization.tsx index 12e785a733e..8751312a67a 100644 --- a/frontend/src/metabase/dashboard/components/DashCard/DashCardVisualization.tsx +++ b/frontend/src/metabase/dashboard/components/DashCard/DashCardVisualization.tsx @@ -10,12 +10,13 @@ import { isQuestionCard, isVirtualDashCard, } from "metabase/dashboard/utils"; +import { useSelector } from "metabase/lib/redux"; +import { getMetadata } from "metabase/selectors/metadata"; import type { IconName, IconProps } from "metabase/ui"; import { getVisualizationRaw } from "metabase/visualizations"; import type { Mode } from "metabase/visualizations/click-actions/Mode"; import Visualization from "metabase/visualizations/components/Visualization"; import Question from "metabase-lib/v1/Question"; -import type Metadata from "metabase-lib/v1/metadata/Metadata"; import type { Dashboard, DashCardId, @@ -43,7 +44,6 @@ interface DashCardVisualizationProps { dashboard: Dashboard; dashcard: DashboardCard; series: Series; - metadata: Metadata; mode?: Mode; gridSize: { @@ -87,7 +87,6 @@ export function DashCardVisualization({ dashboard, series, mode, - metadata, gridSize, gridItemWidth, totalNumGridCols, @@ -113,6 +112,7 @@ export function DashCardVisualization({ onChangeLocation, onUpdateVisualizationSettings, }: DashCardVisualizationProps) { + const metadata = useSelector(getMetadata); const question = useMemo(() => { return isQuestionCard(dashcard.card) ? new Question(dashcard.card, metadata) diff --git a/frontend/src/metabase/dashboard/components/DashCard/Dashcard.unit.spec.tsx b/frontend/src/metabase/dashboard/components/DashCard/Dashcard.unit.spec.tsx index 560454135e2..f5d6eb38108 100644 --- a/frontend/src/metabase/dashboard/components/DashCard/Dashcard.unit.spec.tsx +++ b/frontend/src/metabase/dashboard/components/DashCard/Dashcard.unit.spec.tsx @@ -1,4 +1,3 @@ -import { createMockMetadata } from "__support__/metadata"; import { queryIcon, renderWithProviders, screen } from "__support__/ui"; import registerVisualizations from "metabase/visualizations/register"; import type { DashCardDataMap } from "metabase-types/api"; @@ -62,8 +61,6 @@ const erroringDashcardData = { }, }; -const metadata = createMockMetadata({}); - function setup({ dashboard = testDashboard, dashcard = tableDashcard, @@ -79,7 +76,6 @@ function setup({ gridItemWidth={4} totalNumGridCols={24} slowCards={{}} - metadata={metadata} isEditing={false} isEditingParameter={false} {...props} diff --git a/frontend/src/metabase/dashboard/components/Dashboard/Dashboard.tsx b/frontend/src/metabase/dashboard/components/Dashboard/Dashboard.tsx index f0a3f22ce3f..49788a62540 100644 --- a/frontend/src/metabase/dashboard/components/Dashboard/Dashboard.tsx +++ b/frontend/src/metabase/dashboard/components/Dashboard/Dashboard.tsx @@ -24,15 +24,11 @@ import type { import Dashboards from "metabase/entities/dashboards"; import { getMainElement } from "metabase/lib/dom"; import { useDispatch } from "metabase/lib/redux"; -import type { EmbeddingParameterVisibility } from "metabase/public/lib/types"; -import type Metadata from "metabase-lib/v1/metadata/Metadata"; import type { Dashboard as IDashboard, DashboardId, DashCardDataMap, DashCardId, - Database, - DatabaseId, ParameterId, ParameterValueOrArray, CardId, @@ -85,18 +81,12 @@ type DashboardProps = { dashboard: IDashboard; dashcardData: DashCardDataMap; slowCards: Record<DashCardId, boolean>; - databases: Record<DatabaseId, Database>; parameterValues: Record<ParameterId, ParameterValueOrArray>; draftParameterValues: Record<ParameterId, ParameterValueOrArray | null>; - metadata: Metadata; loadingStartTime: number | null; clickBehaviorSidebarDashcard: StoreDashcard | null; isAddParameterPopoverOpen: boolean; sidebar: State["dashboard"]["sidebar"]; - pageFavicon: string | null; - documentTitle: string | undefined; - isRunning: boolean; - isLoadingComplete: boolean; isHeaderVisible: boolean; isAdditionalInfoVisible: boolean; selectedTabId: SelectedTabId; @@ -160,9 +150,6 @@ type DashboardProps = { columnKey: string, settings?: Record<string, unknown> | null, ) => void; - getEmbeddedParameterVisibility: ( - slug: string, - ) => EmbeddingParameterVisibility | null; updateDashboardAndCards: () => void; setSidebar: (opts: { name: DashboardSidebarName }) => void; @@ -397,12 +384,10 @@ function DashboardInner(props: DashboardProps) { return ( <DashboardGridConnected clickBehaviorSidebarDashcard={props.clickBehaviorSidebarDashcard} - metadata={props.metadata} isNightMode={shouldRenderAsNightMode} isFullscreen={props.isFullscreen} isEditingParameter={props.isEditingParameter} isEditing={props.isEditing} - dashcardData={props.dashcardData} dashboard={props.dashboard} slowCards={props.slowCards} navigateToNewCardFromDashboard={props.navigateToNewCardFromDashboard} @@ -477,7 +462,6 @@ function DashboardInner(props: DashboardProps) { sidebar={props.sidebar} setSidebar={props.setSidebar} closeSidebar={props.closeSidebar} - databases={props.databases} isAddParameterPopoverOpen={props.isAddParameterPopoverOpen} showAddParameterPopover={props.showAddParameterPopover} hideAddParameterPopover={props.hideAddParameterPopover} @@ -535,15 +519,11 @@ function DashboardInner(props: DashboardProps) { props.setParameterFilteringParameters } setParameterRequired={props.setParameterRequired} - dashcardData={props.dashcardData} isFullscreen={props.isFullscreen} params={props.params} sidebar={props.sidebar} closeSidebar={props.closeSidebar} selectedTabId={props.selectedTabId} - getEmbeddedParameterVisibility={ - props.getEmbeddedParameterVisibility - } setDashboardAttribute={handleSetDashboardAttribute} onCancel={() => setSharing(false)} /> diff --git a/frontend/src/metabase/dashboard/components/DashboardGrid.tsx b/frontend/src/metabase/dashboard/components/DashboardGrid.tsx index 15b7ed6ee06..ebe91c05d1e 100644 --- a/frontend/src/metabase/dashboard/components/DashboardGrid.tsx +++ b/frontend/src/metabase/dashboard/components/DashboardGrid.tsx @@ -39,16 +39,15 @@ import { MOBILE_HEIGHT_BY_DISPLAY_TYPE, MOBILE_DEFAULT_CARD_HEIGHT, } from "metabase/visualizations/shared/utils/sizes"; -import type Metadata from "metabase-lib/v1/metadata/Metadata"; import type { BaseDashboardCard, Card, - DashCardDataMap, DashCardId, Dashboard, DashboardTabId, DashboardCard, } from "metabase-types/api"; +import type { State } from "metabase-types/store"; import type { SetDashCardAttributesOpts } from "../actions"; import { @@ -63,6 +62,7 @@ import { onUpdateDashCardVisualizationSettings, fetchCardData, } from "../actions"; +import { getDashcardDataMap } from "../selectors"; import { AddSeriesModal } from "./AddSeriesModal/AddSeriesModal"; import { DashCard } from "./DashCard/DashCard"; @@ -100,6 +100,10 @@ interface DashboardGridState { isAnimationPaused: boolean; } +const mapStateToProps = (state: State) => ({ + dashcardData: getDashcardDataMap(state), +}); + const mapDispatchToProps = { addUndo, removeCardFromDashboard, @@ -114,13 +118,12 @@ const mapDispatchToProps = { onUpdateDashCardVisualizationSettings, fetchCardData, }; -const connector = connect(null, mapDispatchToProps); +const connector = connect(mapStateToProps, mapDispatchToProps); type DashboardGridReduxProps = ConnectedProps<typeof connector>; type OwnProps = { dashboard: Dashboard; - dashcardData: DashCardDataMap; selectedTabId: DashboardTabId | null; slowCards: Record<DashCardId, boolean>; isEditing: boolean; @@ -131,8 +134,6 @@ type OwnProps = { isNightMode: boolean; clickBehaviorSidebarDashcard: DashboardCard | null; mode?: Mode; - // TODO: only passed down, remove it - metadata: Metadata; // public dashboard passes it explicitly width?: number; // public dashboard passes it as noop @@ -510,8 +511,6 @@ class DashboardGrid extends Component<DashboardGridProps, DashboardGridState> { this.props.navigateToNewCardFromDashboard } onChangeLocation={this.props.onChangeLocation} - // TODO: get metadata in dashcard - metadata={this.props.metadata} dashboard={this.props.dashboard} showClickBehaviorSidebar={this.props.showClickBehaviorSidebar} clickBehaviorSidebarDashcard={this.props.clickBehaviorSidebarDashcard} diff --git a/frontend/src/metabase/dashboard/components/DashboardHeader/DashboardHeader.tsx b/frontend/src/metabase/dashboard/components/DashboardHeader/DashboardHeader.tsx index 6eeef87810a..4c24d2069ce 100644 --- a/frontend/src/metabase/dashboard/components/DashboardHeader/DashboardHeader.tsx +++ b/frontend/src/metabase/dashboard/components/DashboardHeader/DashboardHeader.tsx @@ -45,6 +45,7 @@ import { fetchPulseFormInput } from "metabase/pulse/actions"; import { getPulseFormInput } from "metabase/pulse/selectors"; import { dismissAllUndo } from "metabase/redux/undo"; import { getIsNavbarOpen } from "metabase/selectors/app"; +import { getMetadata } from "metabase/selectors/metadata"; import { getSetting } from "metabase/selectors/settings"; import { Icon, Menu, Tooltip, Loader, Flex } from "metabase/ui"; import { saveDashboardPdf } from "metabase/visualizations/lib/save-dashboard-pdf"; @@ -80,7 +81,6 @@ interface DashboardHeaderProps { dashboardId: DashboardId; dashboard: Dashboard; dashboardBeforeEditing?: Dashboard | null; - databases: Record<DatabaseId, Database>; sidebar: DashboardSidebarState; location: Location; refreshPeriod: number | null; @@ -153,7 +153,6 @@ export const DashboardHeader = (props: DashboardHeaderProps) => { sidebar, setSidebar, closeSidebar, - databases, isAddParameterPopoverOpen, showAddParameterPopover, hideAddParameterPopover, @@ -172,6 +171,10 @@ export const DashboardHeader = (props: DashboardHeaderProps) => { const formInput = useSelector(getPulseFormInput); const isNavBarOpen = useSelector(getIsNavbarOpen); + const databases = useSelector(getMetadata).databases as Record< + DatabaseId, + Database + >; const isShowingDashboardInfoSidebar = useSelector( getIsShowDashboardInfoSidebar, ); diff --git a/frontend/src/metabase/dashboard/components/DashboardSidebars.jsx b/frontend/src/metabase/dashboard/components/DashboardSidebars.jsx index ffb2cf15da1..921528d6627 100644 --- a/frontend/src/metabase/dashboard/components/DashboardSidebars.jsx +++ b/frontend/src/metabase/dashboard/components/DashboardSidebars.jsx @@ -36,7 +36,6 @@ DashboardSidebars.propTypes = { setParameterSourceConfig: PropTypes.func.isRequired, setParameterFilteringParameters: PropTypes.func.isRequired, setParameterRequired: PropTypes.func.isRequired, - dashcardData: PropTypes.object, isFullscreen: PropTypes.bool.isRequired, onCancel: PropTypes.func.isRequired, params: PropTypes.object, @@ -47,7 +46,6 @@ DashboardSidebars.propTypes = { closeSidebar: PropTypes.func.isRequired, setDashboardAttribute: PropTypes.func, selectedTabId: PropTypes.number, - getEmbeddedParameterVisibility: PropTypes.func.isRequired, }; export function DashboardSidebars({ @@ -68,7 +66,6 @@ export function DashboardSidebars({ setParameterSourceConfig, setParameterFilteringParameters, setParameterRequired, - dashcardData, isFullscreen, onCancel, params, @@ -76,7 +73,6 @@ export function DashboardSidebars({ closeSidebar, setDashboardAttribute, selectedTabId, - getEmbeddedParameterVisibility, }) { const parameters = useSelector(getParameters); const editingParameter = useSelector(getEditingParameter); @@ -122,7 +118,6 @@ export function DashboardSidebars({ dashboard={dashboard} dashcard={clickBehaviorSidebarDashcard} parameters={parameters} - dashcardData={dashcardData[clickBehaviorSidebarDashcard.id]} onUpdateDashCardVisualizationSettings={ onUpdateDashCardVisualizationSettings } @@ -141,7 +136,6 @@ export function DashboardSidebars({ ); return ( <ParameterSidebar - getEmbeddedParameterVisibility={getEmbeddedParameterVisibility} parameter={parameter} otherParameters={otherParameters} onChangeName={setParameterName} diff --git a/frontend/src/metabase/dashboard/containers/DashboardApp/DashboardApp.tsx b/frontend/src/metabase/dashboard/containers/DashboardApp/DashboardApp.tsx index 6d0b03cc5ea..c565639e380 100644 --- a/frontend/src/metabase/dashboard/containers/DashboardApp/DashboardApp.tsx +++ b/frontend/src/metabase/dashboard/containers/DashboardApp/DashboardApp.tsx @@ -21,23 +21,17 @@ import { useWebNotification } from "metabase/hooks/use-web-notification"; import { parseHashOptions } from "metabase/lib/browser"; import { useDispatch } from "metabase/lib/redux"; import * as Urls from "metabase/lib/urls"; -import type { EmbeddingParameterVisibility } from "metabase/public/lib/types"; import { closeNavbar, setErrorPage } from "metabase/redux/app"; import { addUndo, dismissUndo } from "metabase/redux/undo"; import { getIsNavbarOpen } from "metabase/selectors/app"; -import { getMetadata } from "metabase/selectors/metadata"; import { canManageSubscriptions, getUserIsAdmin, } from "metabase/selectors/user"; -import type Database from "metabase-lib/v1/metadata/Database"; -import type Metadata from "metabase-lib/v1/metadata/Metadata"; import type { Dashboard as IDashboard, DashboardId, - DashCardDataMap, DashCardId, - DatabaseId, ParameterId, ParameterValueOrArray, } from "metabase-types/api"; @@ -46,7 +40,6 @@ import type { SelectedTabId, State, StoreDashcard } from "metabase-types/store"; import * as dashboardActions from "../../actions"; import { DASHBOARD_SLOW_TIMEOUT } from "../../constants"; import { - getDashcardDataMap, getClickBehaviorSidebarDashcard, getDashboardBeforeEditing, getDashboardComplete, @@ -67,7 +60,6 @@ import { getSelectedTabId, getSidebar, getSlowCards, - getEmbeddedParameterVisibility, } from "../../selectors"; type OwnProps = { @@ -87,11 +79,8 @@ type StateProps = { isEditingParameter: boolean; isDirty: boolean; dashboard: IDashboard | null; - dashcardData: DashCardDataMap; slowCards: Record<DashCardId, unknown>; - databases: Record<DatabaseId, Database>; parameterValues: Record<ParameterId, ParameterValueOrArray>; - metadata: Metadata; loadingStartTime: number | null; clickBehaviorSidebarDashcard: StoreDashcard | null; isAddParameterPopoverOpen: boolean; @@ -104,9 +93,6 @@ type StateProps = { isAdditionalInfoVisible: boolean; selectedTabId: SelectedTabId; isNavigatingBackToDashboard: boolean; - getEmbeddedParameterVisibility: ( - slug: string, - ) => EmbeddingParameterVisibility | null; }; type DispatchProps = { @@ -118,7 +104,6 @@ type DispatchProps = { type DashboardAppProps = OwnProps & StateProps & DispatchProps; const mapStateToProps = (state: State): StateProps => { - const metadata = getMetadata(state); return { canManageSubscriptions: canManageSubscriptions(state), isAdmin: getUserIsAdmin(state), @@ -129,12 +114,8 @@ const mapStateToProps = (state: State): StateProps => { isEditingParameter: getIsEditingParameter(state), isDirty: getIsDirty(state), dashboard: getDashboardComplete(state), - dashcardData: getDashcardDataMap(state), slowCards: getSlowCards(state), - databases: metadata.databases, parameterValues: getParameterValues(state), - - metadata, loadingStartTime: getLoadingStartTime(state), clickBehaviorSidebarDashcard: getClickBehaviorSidebarDashcard(state), isAddParameterPopoverOpen: getIsAddParameterPopoverOpen(state), @@ -147,8 +128,6 @@ const mapStateToProps = (state: State): StateProps => { isAdditionalInfoVisible: getIsAdditionalInfoVisible(state), selectedTabId: getSelectedTabId(state), isNavigatingBackToDashboard: getIsNavigatingBackToDashboard(state), - getEmbeddedParameterVisibility: (slug: string) => - getEmbeddedParameterVisibility(state, slug), }; }; @@ -227,6 +206,15 @@ const DashboardApp = (props: DashboardAppProps) => { onTimeout, }); + const { + documentTitle: _documentTitle, + pageFavicon: _pageFavicon, + isRunning: _isRunning, + isLoadingComplete: _isLoadingComplete, + children, + ...dashboardProps + } = props; + return ( <div className={cx(CS.shrinkBelowContentSize, CS.fullHeight)}> <LeaveConfirmationModal isEnabled={isEditing && isDirty} route={route} /> @@ -235,7 +223,7 @@ const DashboardApp = (props: DashboardAppProps) => { dashboardId={getDashboardId(props)} editingOnLoad={editingOnLoad} addCardOnLoad={addCardOnLoad} - {...props} + {...dashboardProps} /> {/* For rendering modal urls */} {props.children} diff --git a/frontend/src/metabase/parameters/components/ParameterSidebar/ParameterSidebar.tsx b/frontend/src/metabase/parameters/components/ParameterSidebar/ParameterSidebar.tsx index a045fa17b1a..942e16378f2 100644 --- a/frontend/src/metabase/parameters/components/ParameterSidebar/ParameterSidebar.tsx +++ b/frontend/src/metabase/parameters/components/ParameterSidebar/ParameterSidebar.tsx @@ -3,8 +3,9 @@ import { usePrevious } from "react-use"; import { t } from "ttag"; import { Sidebar } from "metabase/dashboard/components/Sidebar"; +import { getEmbeddedParameterVisibility } from "metabase/dashboard/selectors"; import { slugify } from "metabase/lib/formatting"; -import type { EmbeddingParameterVisibility } from "metabase/public/lib/types"; +import { useSelector } from "metabase/lib/redux"; import { Tabs, Text } from "metabase/ui"; import { parameterHasNoDisplayValue } from "metabase-lib/v1/parameters/utils/parameter-values"; import type { @@ -54,9 +55,6 @@ export interface ParameterSidebarProps { onRemoveParameter: (parameterId: ParameterId) => void; onShowAddParameterPopover: () => void; onClose: () => void; - getEmbeddedParameterVisibility: ( - slug: string, - ) => EmbeddingParameterVisibility | null; } export const ParameterSidebar = ({ @@ -74,7 +72,6 @@ export const ParameterSidebar = ({ onRemoveParameter, onShowAddParameterPopover, onClose, - getEmbeddedParameterVisibility, hasMapping, }: ParameterSidebarProps): JSX.Element => { const parameterId = parameter.id; @@ -82,6 +79,10 @@ export const ParameterSidebar = ({ const [tab, setTab] = useState<"filters" | "settings">(tabs[0].value); const prevParameterId = usePrevious(parameterId); + const embeddedParameterVisibility = useSelector(state => + getEmbeddedParameterVisibility(state, parameter.slug), + ); + useEffect(() => { if (prevParameterId !== parameterId) { setTab(tabs[0].value); @@ -216,9 +217,7 @@ export const ParameterSidebar = ({ <Tabs.Panel pr="md" pl="md" value="settings" key="settings"> <ParameterSettings parameter={parameter} - embeddedParameterVisibility={getEmbeddedParameterVisibility( - parameter.slug, - )} + embeddedParameterVisibility={embeddedParameterVisibility} isParameterSlugUsed={isParameterSlugUsed} onChangeName={handleNameChange} onChangeType={handleTypeChange} diff --git a/frontend/src/metabase/parameters/components/ParameterSidebar/ParameterSidebar.unit.spec.tsx b/frontend/src/metabase/parameters/components/ParameterSidebar/ParameterSidebar.unit.spec.tsx index b6c8939a52c..3359fb1ca29 100644 --- a/frontend/src/metabase/parameters/components/ParameterSidebar/ParameterSidebar.unit.spec.tsx +++ b/frontend/src/metabase/parameters/components/ParameterSidebar/ParameterSidebar.unit.spec.tsx @@ -59,7 +59,6 @@ const setup = ({ onShowAddParameterPopover={jest.fn()} onClose={jest.fn()} onChangeRequired={jest.fn()} - getEmbeddedParameterVisibility={() => null} hasMapping={hasMapping} /> </div> diff --git a/frontend/src/metabase/public/containers/PublicDashboard/PublicDashboard.tsx b/frontend/src/metabase/public/containers/PublicDashboard/PublicDashboard.tsx index b7f04210bf7..d25f30a0102 100644 --- a/frontend/src/metabase/public/containers/PublicDashboard/PublicDashboard.tsx +++ b/frontend/src/metabase/public/containers/PublicDashboard/PublicDashboard.tsx @@ -29,7 +29,6 @@ import type { } from "metabase/dashboard/hoc/types"; import { getDashboardComplete, - getDashcardDataMap, getSlowCards, getParameters, getParameterValues, @@ -45,7 +44,6 @@ import title from "metabase/hoc/Title"; import { isWithinIframe } from "metabase/lib/dom"; import ParametersS from "metabase/parameters/components/ParameterValueWidget.module.css"; import { setErrorPage } from "metabase/redux/app"; -import { getMetadata } from "metabase/selectors/metadata"; import { setPublicDashboardEndpoints, setEmbedDashboardEndpoints, @@ -65,9 +63,7 @@ const mapStateToProps = (state: State, props: OwnProps) => { dashboardId: String( props.params.dashboardId || props.params.uuid || props.params.token, ), - metadata: getMetadata(state), dashboard: getDashboardComplete(state), - dashcardData: getDashcardDataMap(state), slowCards: getSlowCards(state), parameters: getParameters(state), parameterValues: getParameterValues(state), @@ -271,9 +267,7 @@ class PublicDashboardInner extends Component<PublicDashboardProps> { dashboard={assoc(dashboard, "dashcards", visibleDashcards)} isPublic mode={PublicMode as unknown as Mode} - metadata={this.props.metadata} navigateToNewCardFromDashboard={() => {}} - dashcardData={this.props.dashcardData} selectedTabId={this.props.selectedTabId} slowCards={this.props.slowCards} isEditing={false} -- GitLab