演示

仪表盘

如何创建仪表盘小部件并用 AppRegistry.dashboard.add 注册。DashboardItem 必须内联在 index.tsx,不要包在 widget 文件里。

概述

插件在 register(AppRegistry) 时向共享 ERP 仪表盘贡献小部件。Shell 负责布局、日期范围与持久化。

  • 在 frontend/src/index.tsx 中调用 AppRegistry.dashboard.add
  • 在注册处内联 DashboardItem — widget 文件只导出内容
  • 注册 id 与 DashboardItem id 必须一致
  • 在 DashboardItem 上传入 requiredApis 做 RBAC

1. 创建小部件(仅内容)

放在 frontend/src/page/dashboard/ 等路径。只导出内容组件,不要包 DashboardItem。日期范围用 useDashboardContext。

  • 不要在 widget 文件中使用 DashboardItem
  • 用 flex + h-full 填满单元格
  • 按日期筛选时读取 startDate / endDate
TSXfrontend/src/page/dashboard/analytics-widget.tsx
1import { useDashboardContext } from "@quan-erp/base-frontend"; 2 3export function AnalyticsWidget() { 4 const { startDate, endDate } = useDashboardContext(); 5 6 return ( 7 <div className="flex flex-col w-full h-full p-4 gap-2"> 8 <h3>Analytics</h3> 9 <span>Start {startDate.toLocaleDateString()}</span> 10 <span>End {endDate.toLocaleDateString()}</span> 11 </div> 12 ); 13}

2. 用 AppRegistry.dashboard.add 注册

在插件入口内联 DashboardItem,并调用 AppRegistry.dashboard.add。

  • id — 全插件唯一;建议 `${metadata.name}-…`
  • pluginName — 等于 module.metadata.json 的 name
  • DashboardItem id — 必须等于注册 id
  • requiredApis — 使用 withApiMetadataFetchFn 的 .api
TSXfrontend/src/index.tsx
1import type { AppRegistryState, PluginModule } from "@quan-erp/shared-types"; 2import { DashboardItem } from "@quan-erp/shared-ui"; 3import metadata from "../module.metadata.json" with { type: "json" }; 4import { getAnalyticsApi } from "./api/analytics.api"; 5import { AnalyticsWidget } from "./page/dashboard/analytics-widget"; 6 7const Plugin: PluginModule = { 8 register(AppRegistry: AppRegistryState) { 9 AppRegistry.dashboard.add({ 10 id: `${metadata.name}-analytics`, 11 pluginName: metadata.name, 12 element: ( 13 <DashboardItem 14 id={`${metadata.name}-analytics`} 15 colSpan={2} 16 rowSpan={1} 17 pluginName={metadata.name} 18 requiredApis={[getAnalyticsApi.api]} 19 > 20 <AnalyticsWidget /> 21 </DashboardItem> 22 ), 23 }); 24 }, 25}; 26 27export default Plugin;

3. 仪表盘上下文

useDashboardContext() 提供全局筛选(如 startDate、endDate)。范围变化时让查询保持同步。

TSXuseDashboardContext
import { useDashboardContext } from "@quan-erp/base-frontend"; const { startDate, endDate } = useDashboardContext(); // Pass into react-query keys / API params so the widget refetches on range change

关键规则

  • 在 index.tsx 内联 DashboardItem — 不要在 widget 内包装
  • 注册 id 与 DashboardItem id 必须一致
  • id 在所有已安装插件中唯一
  • 传入 requiredApis 做权限控制
  • Widget 文件只导出内容

检查清单

  • 在 page/dashboard/ 创建仅内容小部件
  • 按日期时使用 useDashboardContext
  • 在 register() 中用匹配 id 调用 add
  • DashboardItem 带上 pluginName、colSpan、rowSpan、requiredApis
  • quan-erp watch 并安装后确认出现

常见失败

  • 仪表盘上看不到 — 未注册 / pluginName 错误 / 未安装
  • 布局跳动 — 注册 id ≠ DashboardItem id
  • 无权限或空白 — requiredApis 缺失或错误
  • 日期范围无效 — 未读 useDashboardContext
  • 布局损坏 — 在 widget 文件中包装了 DashboardItem