嵌入式分析 SDK - 问题

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

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

您可以通过不同的方式嵌入问题

嵌入静态问题

您可以使用 StaticQuestion 组件嵌入静态问题。

该组件具有默认高度,可以使用 height 属性进行自定义。要从父容器继承高度,您可以将 100% 传递给 height 属性。

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

const authConfig = {...}

export default function App() {
    const questionId = 1; // This is the question ID you want to embed

    return (
        <MetabaseProvider authConfig={authConfig}>
            <StaticQuestion questionId={questionId} withChartTypeSelector={false}/>
        </MetabaseProvider>
    );
}

嵌入交互式问题

您可以使用 InteractiveQuestion 组件嵌入交互式问题。

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

const authConfig = {...}

export default function App() {
    const questionId = 1; // This is the question ID you want to embed

    return (
        <MetabaseProvider authConfig={authConfig}>
            <InteractiveQuestion questionId={questionId}/>
        </MetabaseProvider>
    );
}

问题属性

属性 类型 描述
questionId 数字或字符串 (必需)问题的 ID。可以是以下两种形式:
- 访问问题链接时的数字 ID,例如 https://127.0.0.1:3000/question/1-my-question,其中 ID 为 1
- 问题对象的 entity_id 键。您可以在查看问题时在信息面板中找到问题的实体 ID。
plugins { mapQuestionClickActions: Function } 或 null 用于覆盖或添加向下钻取菜单的其他映射器函数。
height 数字或字符串 (可选)数字或字符串,指定 CSS 大小值,用于指定组件的高度
entityTypeFilter 字符串数组;选项包括“table”、“question”、“model”、“metric” (可选)一个数组,用于指定数据选择器中可用的实体类型
isSaveEnabled 布尔值 (可选)是否允许用户保存问题。
withResetButton 布尔值 (可选,默认值:true)确定是否显示重置按钮。仅在使用默认布局时相关
withChartTypeSelector 布尔值 (可选,默认值:true)确定是否显示图表类型选择器和相应的设置按钮。仅在使用默认布局时相关。
title 布尔值或字符串或 ReactNode() => ReactNode (可选)确定是否显示问题标题,并允许显示自定义标题以代替默认问题标题。默认情况下显示。仅适用于使用默认布局的交互式问题。
onBeforeSave () => void (可选)在保存之前触发的回调函数。仅在 isSaveEnabled = true 时相关。
onSave () => void (可选)用户保存问题时触发的回调函数。仅在 isSaveEnabled = true 时相关。
saveToCollectionId 数字 (可选)保存问题的目标集合。这将从保存模态框中隐藏集合选择器。仅适用于交互式问题。
initialSqlParameters Record<string, string \| string[]> (可选)SQL 参数名称到参数值的映射,例如 { product_id: "42" }

将 SQL 参数传递给问题

您可以通过 initialSqlParameters 属性以 {parameter_name: parameter_value} 的格式将参数值传递给使用 SQL 定义的问题。了解更多关于 SQL 参数的信息。


<StaticQuestion questionId={questionId} initialSqlParameters={{ product_id: 50 }} />

自定义交互式问题

默认情况下,嵌入式分析 SDK 为交互式问题提供默认布局,使您可以查看问题、应用筛选和聚合,以及访问查询构建器中的功能。

以下是使用带有默认布局的 InteractiveQuestion 组件的示例

<InteractiveQuestion questionId={95} />

要自定义布局,请在 InteractiveQuestion 组件中使用命名空间组件。例如


<InteractiveQuestion questionId={95}>
  <div
    style={{
      display: "flex",
      flexDirection: "column",
      alignItems: "center",
      justifyContent: "center",
    }}
  >
    <div style={{ display: "grid", placeItems: "center" }}>
      <InteractiveQuestion.Title />
      <InteractiveQuestion.ResetButton />
    </div>
    <div
      style={{
        display: "flex",
        alignItems: "center",
        justifyContent: "flex-start",
        overflow: "hidden",
      }}
    >
      <div style={{ width: "100%" }}>
        <InteractiveQuestion.QuestionVisualization />
      </div>
      <div style={{ display: "flex", flex: 1, overflow: "scroll" }}>
        <InteractiveQuestion.Summarize />
      </div>
    </div>
    <div style={{ display: "flex", flexDirection: "column" }}>
      <InteractiveQuestion.Filter />
    </div>
  </div>
</InteractiveQuestion>

交互式问题组件

这些组件通过 InteractiveQuestion 命名空间提供(例如,<InteractiveQuestion.Filter />)。

* 表示必需属性

InteractiveQuestion.BackButton

返回上一视图的导航按钮。仅当 InteractiveQuestion 提供 onNavigateBack 属性时才呈现。

在底层使用 Mantine ActionIcon 属性,以及:| 属性 | 类型 | 描述 | |——|——|————-| | className | string | 用于设置组件样式的自定义 CSS 类名 | | style | React.CSSProperties | 应用于组件的内联样式 |

InteractiveQuestion.Filter

一组交互式筛选器徽章,允许添加、编辑和删除筛选器。将当前筛选器显示为徽章,并提供“添加另一个筛选器”选项。

属性 类型 描述
withColumnItemIcon 布尔值 是否在筛选器界面中显示列图标

InteractiveQuestion.FilterDropdown

Filter 组件的下拉按钮。

属性 类型 描述
withColumnItemIcon 布尔值 是否在筛选器界面中显示列图标

InteractiveQuestion.ResetButton

用于重置问题修改的按钮。仅当问题存在未保存的更改时才会显示。

在底层使用 Mantine Button 属性,以及:| 属性 | 类型 | 描述 | |——|——|————-| | className | string | 用于设置组件样式的自定义 CSS 类名 | | style | React.CSSProperties | 应用于组件的内联样式 |

InteractiveQuestion.Title

根据问题的状态显示标题。显示:

  • 如果问题已保存,则显示问题的显示名称
  • 为即席问题(非原生查询)自动生成的描述
  • 对于新问题/原生查询,显示“新问题”作为后备或默认标题
属性 类型 描述
className 字符串 用于设置组件样式的自定义 CSS 类名
style CSSProperties 应用于组件的内联样式

InteractiveQuestion.SaveButton

用于保存问题更改的按钮。仅当问题存在未保存的修改时才启用。

注意:目前,在自定义布局中,SaveButton 必须具有 onClick 处理程序,否则单击按钮将不会执行任何操作。

在底层使用 Mantine Button 属性,以及:| 属性 | 类型 | 描述 | |——|——|————-| | className | string | 用于设置组件样式的自定义 CSS 类名 | | style | React.CSSProperties | 应用于组件的内联样式 |

InteractiveQuestion.Breakout

一组用于管理数据分组(细分)的徽章。

无属性。使用问题上下文进行细分功能。

InteractiveQuestion.BreakoutDropdown

Breakout 组件的下拉按钮。

在底层使用 Popover 属性,除了 onClosechildrenopened 之外,以及:| 属性 | 类型 | 描述 | |——|——|————-| | className | string | 用于设置组件样式的自定义 CSS 类名 | | style | React.CSSProperties | 应用于组件的内联样式 |

InteractiveQuestion.Summarize

用于添加和管理数据摘要(如计数、总和、平均值)的界面。显示为一组徽章。

无属性。使用问题上下文进行汇总功能。

InteractiveQuestion.SummarizeDropdown

Summarize 组件的下拉按钮。

在底层使用 Popover 属性,除了 onClosechildrenopened 之外,以及:| 属性 | 类型 | 描述 | |——|——|————-| | className | string | 用于设置组件样式的自定义 CSS 类名 | | style | React.CSSProperties | 应用于组件的内联样式 |

InteractiveQuestion.Editor

高级查询编辑器,提供对问题配置的完全访问权限。包括筛选、聚合、自定义表达式和连接。

替换已弃用的 InteractiveQuestion.Notebook

属性 类型 描述
onApply () => void 应用更改时执行的回调函数

InteractiveQuestion.EditorButton

用于显示/隐藏 Editor 界面的切换按钮。

替换已弃用的 InteractiveQuestion.NotebookButton

注意:目前,在自定义布局中,EditorButton 必须具有 onClick 处理程序,否则单击按钮将不会执行任何操作。

在底层使用 Mantine ActionIcon 属性,以及:| 属性 | 类型 | 描述 | |——|——|————-| | isOpen | boolean | 编辑器当前是否打开 | | className | string | 用于设置组件样式的自定义 CSS 类名 | | style | React.CSSProperties | 应用于组件的内联样式 |

InteractiveQuestion.QuestionVisualization

主可视化组件,用于将问题结果呈现为图表、表格或其他可视化类型。

属性 类型 描述
height 数字 | 字符串 可视化的高度
width 数字 | 字符串 可视化的宽度
className 字符串 用于设置组件样式的自定义 CSS 类名
style React.CSSProperties 应用于组件的内联样式

InteractiveQuestion.QuestionSettings

用于配置可视化选项(如坐标轴、颜色和格式)的设置面板。

无属性 (props)。使用问题上下文进行设置。

InteractiveQuestion.QuestionSettingsDropdown

包含 QuestionSettings 组件的下拉按钮。

使用 Popover props,但底层除外 onCloseopened,以及: | Prop | Type | Description | |——|——|————-| | height | React.CSSProperties[“height”] | 下拉菜单的高度 | | className | string | 用于设置组件样式的自定义 CSS 类名 | | style | React.CSSProperties | 应用于组件的内联样式 |

InteractiveQuestion.ChartTypeSelector

详细的图表类型选择界面,包含推荐的可视化选项。

底层使用 Mantine Stack props,以及: | Prop | Type | Description | |——|——|————-| | className | string | 用于设置组件样式的自定义 CSS 类名 | | style | React.CSSProperties | 应用于组件的内联样式 |

InteractiveQuestion.ChartTypeDropdown

用于选择可视化类型的下拉菜单(条形图、折线图、表格等)。自动更新以显示当前数据的推荐可视化类型。

底层使用 Mantine Menu props,以及: | Prop | Type | Description | |——|——|————-| | className | string | 用于设置组件样式的自定义 CSS 类名 | | style | React.CSSProperties | 应用于组件的内联样式 |

InteractiveQuestion.SaveQuestionForm

用于保存问题的表单,包括标题和描述。保存时

  • 对于新问题:调用来自 InteractiveQuestion 的 onCreate 属性 (prop)
  • 对于现有问题:调用来自 InteractiveQuestion 的 onSave 属性 (prop)
  • 两个回调都接收更新后的问题对象
  • 可以通过 onCancel 属性 (prop) 取消表单
属性 类型 描述
onCancel () => void 保存取消时执行的回调函数

交互式问题插件

您可以使用插件为问题添加自定义功能。

mapQuestionClickActions

此插件允许您向交互式问题的点击菜单添加自定义操作。您可以添加和自定义自定义操作的外观和行为。

// You can provide a custom action with your own `onClick` logic.
const createCustomAction = clicked => ({
  buttonType: "horizontal",
  name: "client-custom-action",
  section: "custom",
  type: "custom",
  icon: "chevronright",
  title: "Hello from the click app!!!",
  onClick: ({ closePopover }) => {
    alert(`Clicked ${clicked.column?.name}: ${clicked.value}`);
    closePopover();
  },
});

// Or customize the appearance of the custom action to suit your need.
const createCustomActionWithView = clicked => ({
  name: "client-custom-action-2",
  section: "custom",
  type: "custom",
  view: ({ closePopover }) => (
    <button
      className="tw-text-base tw-text-yellow-900 tw-bg-slate-400 tw-rounded-lg"
      onClick={() => {
        alert(`Clicked ${clicked.column?.name}: ${clicked.value}`);
        closePopover();
      }}
    >
      Custom element
    </button>
  ),
});

const plugins = {
  /**
   * You will have access to default `clickActions` that Metabase renders by default.
   * So you could decide if you want to add custom actions, remove certain actions, etc.
   */
  mapQuestionClickActions: (clickActions, clicked) => {
    return [
      ...clickActions,
      createCustomAction(clicked),
      createCustomActionWithView(clicked),
    ];
  },
};

const questionId = 1; // This is the question ID you want to embed

return (
  <MetabaseProvider authConfig={authConfig} pluginsConfig={plugins}>
    <InteractiveQuestion questionId={questionId} />
  </MetabaseProvider>
);

嵌入可编辑的交互式问题

您可以通过在 InteractiveQuestion 组件上传递 isSaveEnabled 属性 (prop),使用查询构建器编辑现有问题。

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

const authConfig = {...}

export default function App() {
    return (
        <MetabaseProvider authConfig={authConfig}>
            <InteractiveQuestion questionId={1} isSaveEnabled />
        </MetabaseProvider>
    );
}

嵌入查询构建器

使用 CreateQuestion 组件,您可以嵌入查询构建器,而无需预定义问题。

此组件构建于具有命名空间组件InteractiveQuestion 组件之上。它与 InteractiveQuestion 共享相同的属性 (props),但缺少 questionId 属性 (prop) 和传递自定义子组件的能力。

要自定义问题编辑器的布局,请直接使用带有自定义 children 属性 (prop)InteractiveQuestion 组件。

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

const authConfig = {...}

export default function App() {
    return (
        <MetabaseProvider authConfig={authConfig}>
            <CreateQuestion />
        </MetabaseProvider>
    );
}

阅读其他Metabase 版本的文档。