创建现有仪表板的完整副本,包括所有图表、分段和权限
copyDashboard
变更创建现有仪表板的完整副本,包括所有图表、图表分段、值和用户权限。此操作执行深度复制,为所有复制的元素分配新的唯一标识符。
基本示例
创建一个具有自定义标题的仪表板副本:
mutation CopyDashboard {
copyDashboard(input: {
dashboardId: "dashboard_123"
title: "Q4 Sales Dashboard Copy"
}) {
id
title
createdAt
charts {
id
title
chartType
}
dashboardUsers {
id
role
user {
id
email
}
}
}
}
高级示例
复制一个不指定标题的仪表板(自动附加“(Copy)”):
mutation CopyDashboardAuto {
copyDashboard(input: {
dashboardId: "dashboard_456"
}) {
id
uid
title
createdBy {
id
email
}
company {
id
name
}
charts {
id
title
chartType
position
chartSegments {
id
title
formula
chartValues {
id
value
}
}
}
dashboardUsers {
id
role
user {
id
email
fullName
}
}
createdAt
updatedAt
}
}
输入参数
CopyDashboardInput
参数 | 类型 | 必需 | 描述 |
---|---|---|---|
dashboardId |
String! | ✅ 是 | 要复制的仪表板的 ID |
title |
String | 否 | 复制仪表板的自定义标题。如果未提供,则在原始标题后附加“(Copy)” |
响应字段
仪表板响应
该变更返回一个完整的 Dashboard
对象,包含所有复制的数据:
字段 | 类型 | 描述 |
---|---|---|
id |
String! | 新仪表板的唯一标识符 |
uid |
String! | 用于 URL 路由的唯一标识符 |
title |
String! | 复制仪表板的标题 |
createdBy |
User! | 执行复制操作的用户 |
company |
Company! | 仪表板所属的公司(与原始相同) |
project |
Project | 项目关联(与原始相同,如果有) |
charts |
[Chart!]! | 从原始仪表板复制的所有图表 |
dashboardUsers |
[DashboardUser!]! | 从原始复制的用户权限(不包括复制用户) |
createdAt |
DateTime! | 复制创建的时间 |
updatedAt |
DateTime! | 复制最后修改的时间 |
仪表板复制行为
深度复制过程
copyDashboard
操作执行完整的深度复制,包括:
-
仪表板元数据
- 创建新仪表板,分配新 ID 和 UID
- 复制标题(如果没有自定义标题,则附加“(Copy)”)
- 将创建者设置为执行复制的用户
- 保持公司和项目关联
-
图表和结构
- 复制所有图表,分配新 ID 和 UID
- 保留图表类型、标题和位置
- 保持图表配置和元数据
-
图表分段和数值
- 复制所有图表分段,分配新 ID 和 UID
- 保留分段标题、公式和配置
- 复制所有图表值及其数据
-
公式引用
- 更新公式引用以使用新 UID
- 保持公式逻辑和计算
- 确保复制的公式引用复制的数据
-
用户权限
- 从原始仪表板复制所有用户权限
- 排除复制用户(他们成为创建者)
- 保留 VIEWER 和 EDITOR 角色分配
复制后操作
创建副本后,系统会自动:
- 发布仪表板创建事件以进行实时更新
- 触发所有复制图表的结果重新计算
- 更新任何依赖的系统或集成
所需权限
仪表板复制需要特定权限:
角色 | 可以复制仪表板 |
---|---|
Dashboard Creator | ✅ 是 |
Dashboard EDITOR | ✅ 是 |
Dashboard VIEWER | ❌ 否 |
非仪表板用户 | ❌ 否 |
权限检查:用户必须对原始仪表板具有 EDITOR 访问权限,条件为:
- 是原始仪表板的创建者
- 在仪表板上具有明确的 EDITOR 角色分配
错误响应
找不到仪表板
{
"errors": [{
"message": "Dashboard was not found.",
"extensions": {
"code": "DASHBOARD_NOT_FOUND"
}
}]
}
权限不足
{
"errors": [{
"message": "You don't have permission to access this dashboard",
"extensions": {
"code": "FORBIDDEN"
}
}]
}
输入无效
{
"errors": [{
"message": "Dashboard ID is required",
"extensions": {
"code": "VALIDATION_ERROR"
}
}]
}
用例
1. 模板仪表板
创建可以为新项目或团队复制的模板仪表板:
mutation CreateProjectDashboard {
copyDashboard(input: {
dashboardId: "template_dashboard_id"
title: "Project Alpha - Sales Dashboard"
}) {
id
title
}
}
2. 备份和版本控制
在进行重大更改之前创建备份:
mutation BackupDashboard {
copyDashboard(input: {
dashboardId: "production_dashboard"
title: "Production Dashboard - Backup 2024-01-15"
}) {
id
title
createdAt
}
}
3. 跨团队共享
在团队之间复制仪表板,同时保持数据结构:
mutation ShareDashboardWithTeam {
copyDashboard(input: {
dashboardId: "marketing_dashboard"
title: "Marketing Dashboard - Sales Team Copy"
}) {
id
title
dashboardUsers {
role
user {
email
}
}
}
}
最佳实践
命名约定
- 使用描述性标题,指示副本的目的
- 包括团队名称、日期或版本号以提高清晰度
- 避免使用“Copy”或“New Dashboard”等通用名称
权限管理
- 创建后检查复制仪表板的权限
- 根据特定用例添加或删除用户
- 考虑查看者是否需要成为副本的编辑者
数据完整性
- 验证复制后公式和计算是否正确
- 检查图表数据源是否适合新上下文
- 测试任何自动报告或集成
性能考虑
- 复制具有多个图表的大型仪表板可能需要几秒钟
- 图表重新计算在复制后异步发生
- 考虑在非高峰时段复制非常大的仪表板
- 在同时复制多个仪表板时监控系统资源
限制
- 不能跨不同公司复制仪表板
- 公式引用仅限于同一公司的数据
- 某些外部集成可能需要重新配置
- 自定义权限或角色可能需要手动调整
- 历史数据和分析在复制中不会保留