-
Denis Berezin authoredDenis Berezin authored
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
InteractiveDashboard.tsx 3.76 KiB
import _ from "underscore";
import type { SdkPluginsConfig } from "embedding-sdk";
import { InteractiveAdHocQuestion } from "embedding-sdk/components/private/InteractiveAdHocQuestion";
import { withPublicComponentWrapper } from "embedding-sdk/components/private/PublicComponentWrapper";
import { useCommonDashboardParams } from "embedding-sdk/components/public/InteractiveDashboard/use-common-dashboard-params";
import {
type SdkDashboardDisplayProps,
useSdkDashboardParams,
} from "embedding-sdk/hooks/private/use-sdk-dashboard-params";
import { DASHBOARD_DISPLAY_ACTIONS } from "metabase/dashboard/components/DashboardHeader/DashboardHeaderButtonRow/constants";
import { useEmbedTheme } from "metabase/dashboard/hooks";
import { useEmbedFont } from "metabase/dashboard/hooks/use-embed-font";
import { PublicOrEmbeddedDashboard } from "metabase/public/containers/PublicOrEmbeddedDashboard/PublicOrEmbeddedDashboard";
import type { PublicOrEmbeddedDashboardEventHandlersProps } from "metabase/public/containers/PublicOrEmbeddedDashboard/types";
import { Box } from "metabase/ui";
import { InteractiveDashboardProvider } from "./context";
export type InteractiveDashboardProps = {
questionHeight?: number;
plugins?: SdkPluginsConfig;
className?: string;
} & SdkDashboardDisplayProps &
PublicOrEmbeddedDashboardEventHandlersProps;
const InteractiveDashboardInner = ({
dashboardId,
initialParameterValues = {},
withTitle = true,
withCardTitle = true,
withDownloads = true,
hiddenParameters = [],
questionHeight,
plugins,
onLoad,
onLoadWithoutCards,
className,
}: InteractiveDashboardProps) => {
const {
displayOptions,
ref,
isFullscreen,
onFullscreenChange,
refreshPeriod,
onRefreshPeriodChange,
setRefreshElapsedHook,
} = useSdkDashboardParams({
dashboardId,
withDownloads,
withTitle,
hiddenParameters,
initialParameterValues,
});
const {
adhocQuestionUrl,
onNavigateBackToDashboard,
onEditQuestion,
onNavigateToNewCardFromDashboard,
} = useCommonDashboardParams({
dashboardId,
});
const { theme } = useEmbedTheme();
const { font } = useEmbedFont();
return (
<Box w="100%" h="100%" ref={ref} className={className}>
{adhocQuestionUrl ? (
<InteractiveAdHocQuestion
questionPath={adhocQuestionUrl}
withTitle={withTitle}
height={questionHeight}
plugins={plugins}
onNavigateBack={onNavigateBackToDashboard}
/>
) : (
<InteractiveDashboardProvider
plugins={plugins}
onEditQuestion={onEditQuestion}
dashboardActions={DASHBOARD_DISPLAY_ACTIONS}
>
<PublicOrEmbeddedDashboard
dashboardId={dashboardId}
parameterQueryParams={initialParameterValues}
hideParameters={displayOptions.hideParameters}
background={displayOptions.background}
titled={displayOptions.titled}
cardTitled={withCardTitle}
theme={theme}
isFullscreen={isFullscreen}
onFullscreenChange={onFullscreenChange}
refreshPeriod={refreshPeriod}
onRefreshPeriodChange={onRefreshPeriodChange}
setRefreshElapsedHook={setRefreshElapsedHook}
font={font}
bordered={displayOptions.bordered}
navigateToNewCardFromDashboard={onNavigateToNewCardFromDashboard}
onLoad={onLoad}
onLoadWithoutCards={onLoadWithoutCards}
downloadsEnabled={withDownloads}
isNightMode={false}
onNightModeChange={_.noop}
hasNightModeToggle={false}
/>
</InteractiveDashboardProvider>
)}
</Box>
);
};
export const InteractiveDashboard = withPublicComponentWrapper(
InteractiveDashboardInner,
);