嵌入式分析 SDK - 仪表盘

⚠️ 此功能为 Beta 版。欢迎试用,但请注意,功能可能会发生变化(并且可能无法按预期工作)。

嵌入式分析 SDK 仅在 ProEnterprise 计划(自托管和 Metabase 云)中提供。但是,您可以在本地机器上使用 SDK,无需许可证,只需使用 API 密钥来验证您的嵌入。

您可以嵌入交互式、可编辑或静态仪表盘。

请注意 - 尚不支持在同一页面上嵌入多个仪表盘实例。

嵌入仪表盘

您可以使用仪表盘组件之一来嵌入仪表盘

  • InteractiveDashboard
  • StaticDashboard
  • EditableDashboard

仪表盘组件属性

属性 类型 描述
dashboardId number \| string 仪表盘的 ID。可以是
- 访问仪表盘链接时的数字 ID,例如 https://127.0.0.1:3000/dashboard/1-my-dashboard,其中 ID 为 1
- 使用 API 直接访问或使用 SDK 集合浏览器返回数据时,在仪表盘对象的 entity_id 键中找到的字符串 ID
initialParameters** Record<string, string \| string[]> 仪表盘的查询参数。对于单个选项,请使用 string 值,对于多个选项,请使用字符串列表。
withTitle boolean 仪表盘是否应显示标题。
withCardTitle boolean 是否仪表盘卡片应显示标题。
withDownloads boolean \| null 是否隐藏下载按钮。
hiddenParameters** string[] \| null 要隐藏的参数列表。
drillThroughQuestionHeight* number \| null 从仪表盘下钻到问题级别时,问题组件的高度。
questionPlugins* { mapQuestionClickActions: Function } \| null 用于覆盖或添加下钻菜单的附加映射器函数。有关更多详细信息,请参阅实现自定义操作部分。
onLoad (dashboard: Dashboard \| null) => void 在仪表盘加载完所有可见卡片及其内容后触发的事件处理程序。
onLoadWithoutCards (dashboard: Dashboard \| null) => void 在仪表盘加载后触发的事件处理程序,但不包括其卡片 - 在此阶段,仪表盘标题、选项卡和卡片网格已呈现,但卡片内容尚未加载。
renderDrillThroughQuestion* () => ReactNode 一个 React 组件,用于呈现问题布局,该布局在下钻问题或单击仪表盘中的问题卡片后显示。

* 不适用于 StaticDashboard

** 组合使用 initialParametershiddenParameters 在前端过滤数据存在安全风险。组合使用 initialParametershiddenParaters 来简化用户界面是可以的。

默认情况下,仪表盘组件占用整页高度 (100vh)。您可以使用通过 styleclassName 属性传递的自定义样式来覆盖此设置。

<EditableDashboard
  style=
  dashboardId={dashboardId}
/>

带有 InteractiveDashboard 组件的嵌入式仪表盘示例

import React from "react";
import {MetabaseProvider, InteractiveDashboard} from "@metabase/embedding-sdk-react";

const authConfig = {...}

export default function App() {
    const dashboardId = 1; // This is the dashboard ID you want to embed
    const initialParameters = {}; // Define your query parameters here

    // choose parameter names that are in your dashboard
    const hiddenParameters = ["location", "city"]

    return (
        <MetabaseProvider authConfig={authConfig}>
            <InteractiveDashboard
                dashboardId={dashboardId}
                initialParameters={initialParameters}
                withTitle={false}
                withDownloads={false}
                hiddenParameters={hideParameters}
            />
        </MetabaseProvider>
    );
}

自定义下钻问题布局

在下钻或单击仪表盘中的问题卡片时,您将被带到问题视图。

默认情况下,问题以交互式问题的默认布局显示。

要自定义问题布局,请将 renderDrillThroughQuestion 属性传递给 InteractiveDashboard 组件,并将自定义视图作为子组件。

<InteractiveQuestion
  questionId={95}
  renderDrillThroughQuestion={QuestionView}
/>;

// You can use namespaced components to build the question's layout.
const QuestionView = () => <InteractiveQuestion.Title />;

questionView 属性接受一个 React 组件,该组件将在问题视图中呈现,您可以使用 InteractiveQuestion 组件中的命名空间组件来构建该组件。有关示例布局,请参阅自定义交互式问题

仪表盘插件

dashcardMenu

此插件允许您在仪表盘卡片的溢出菜单上添加、删除和修改自定义操作。该插件显示为卡片右上角的下拉菜单。

该插件的默认配置如下所示

const plugins = {
  dashboard: {
    dashcardMenu: {
      withDownloads: true,
      withEditLink: true,
      customItems: [],
    },
  },
};

dashcardMenu:可以在 InteractiveDashboard 中像这样使用


<InteractiveDashboard
  questionId={1}
  plugins={{
    dashboard: {
      dashcardMenu: null,
    },
  }}
/>

启用/禁用默认操作

要从仪表盘卡片菜单中删除下载按钮,请将 withDownloads 设置为 false。要从仪表盘卡片菜单中删除编辑链接,请将 withEditLink 设置为 false

const plugins = {
  dashboard: {
    dashcardMenu: {
      withDownloads: false,
      withEditLink: false,
      customItems: [],
    },
  },
};

向现有菜单添加自定义操作

您可以通过向 customItems 数组添加对象来向仪表盘卡片菜单添加自定义操作。每个元素可以是对象或函数,该函数接收仪表盘卡片的问题,并以以下形式输出自定义项列表

{
    iconName: string;
    label: string;
    onClick: () => void;
    disabled?: boolean;
}

这是一个示例

const plugins: MetabasePluginsConfig = {
  dashboard: {
    dashcardMenu: {
      customItems: [
        {
          iconName: "chevronright",
          label: "Custom action",
          onClick: () => {
            alert(`Custom action clicked`);
          },
        },
        ({ question }) => {
          return {
            iconName: "chevronright",
            label: "Custom action",
            onClick: () => {
              alert(`Custom action clicked ${question.name}`);
            },
          };
        },
      ],
    },
  },
};

使用您自己的组件替换现有菜单

如果您想用自己的组件替换现有菜单,可以通过提供一个返回 React 组件的函数来完成。此函数还可以接收问题作为参数。

const plugins: MetabasePluginsConfig = {
  dashboard: {
    dashcardMenu: ({ question }) => (
      <button onClick={() => console.log(question.name)}>Click me</button>
    ),
  },
};

创建仪表盘

可以使用 useCreateDashboardApi Hook 或 CreateDashboardModal 组件来创建仪表盘。

Hook

const { createDashboard } = useCreateDashboardApi();

const handleDashboardCreate = async () => {
  const dashboard = await createDashboard(props);

  // do something with created empty dashboard, e.g., use the dashboard in EditableDashboard component
};

return <Button onClick={handleDashboardCreate}>Create new dashboard</Button>;

属性

属性 类型 描述
name string (必填)仪表盘标题
description string \| null 可选的仪表盘描述
collectionId number \| 'root' \| 'personal' \| null 要在其中创建新仪表盘的集合。您可以使用预定义的系统值,如 rootpersonal

组件

const [dashboard, setDashboard] = useState<Dashboard | null>(null);

if (dashboard) {
  return <EditableDashboard dashboardId={dashboard.id} />;
}

return <CreateDashboardModal onClose={handleClose} onCreate={setDashboard} />;

支持的组件属性

属性 类型 描述
collectionId? number \| 'root' \| 'personal' \| null 初始集合字段值。您可以使用预定义的系统值,如 rootpersonal
onCreate (dashboard: Dashboard) => void 用于响应仪表盘创建的处理程序。
onClose () => void 用于关闭模态组件的处理程序

阅读关于 Metabase 其他版本的文档。