Skip to content

Add Airtable Dashboard gap analysis documentation - #715

Merged
hotlong merged 2 commits into
mainfrom
copilot/update-sales-dashboard-documentation
Feb 18, 2026
Merged

hotlong merged 2 commits into
mainfrom
copilot/update-sales-dashboard-documentation

Conversation

Copilot AI commented Feb 18, 2026 •

Copy link
Copy Markdown
Contributor

Documents protocol and component gaps between ObjectStack dashboards and Airtable's Sales Performance interface. Provides implementation roadmap with effort estimates and issue references.

Documentation Added

content/docs/guides/airtable-dashboard-analysis.mdx

  • UI Zone Analysis — 9 zones mapped to current coverage (global filters, KPI cards, pivot tables, widget actions)
  • Protocol Enhancements — colorVariant/actionUrl on widgets, optionsFrom on globalFilters, header config, pivotConfig with multi-measure
  • Component Specs — DashboardFilterBar, MetricCard variants, PivotTable, widget header actions, advanced charts (funnel/grouped-bar/gauge)
  • Complete Example — Full sales dashboard implementation (TypeScript + JSON)
  • 3-Phase Roadmap — 22 days effort across Foundation (P0), Advanced Widgets (P1), Polish (P2)

Roadmap Integration

ROADMAP.md Section 8.2 — Added dashboard enhancement phases with effort estimates, priority levels, and links to tracking issues (#712-714, objectui#585-588)

Example Enhancement

Current widget schema lacks visual variants and actions:

{
  title: 'Total Revenue',
  type: 'metric',
  object: 'opportunity',
  valueField: 'amount',
  layout: { x: 0, y: 0, w: 4, h: 2 }
}

Proposed enhancement adds color theming, descriptions, and navigation:

{
  title: 'Total Revenue',
  description: 'YTD revenue across all regions',
  type: 'metric',
  colorVariant: 'orange',              // NEW
  actionUrl: '/reports/revenue-detail', // NEW
  actionType: 'internal',               // NEW
  object: 'opportunity',
  valueField: 'amount',
  layout: { x: 0, y: 0, w: 4, h: 2 }
}
Original prompt

背景

参考 Airtable 的"销售业绩与团队绩效"仪表盘界面,对 ObjectStack spec 和 ObjectUI 的协议、组件、页面进行了全面的 Gap Analysis。现需将分析结果和优化建议写入项目文档,以便后续开发参考。

目标

在 objectstack-ai/spec 仓库中创建或更新文档,记录以下内容:

1. Airtable Dashboard 目标界面分解

目标界面包含以下关键 UI 区域:

Zone Airtable Feature Current Coverage
A. Global Filter Bar Time Period / Team / Product Line dropdowns ⚠️ Protocol defined (globalFilters), NO component
B. KPI Card Row 3 colored KPI cards with external-link icon ⚠️ MetricCard exists, lacks color variants & action link
C. Line Chart Monthly revenue trend ✅ Supported
D. Bar Chart Funnel distribution by stage ✅ Supported
E. Pie/Donut Chart Conversion rate by stage ✅ Supported
F. Grouped Bar Chart Team performance comparison ⚠️ In spec, NOT in objectui
G. Pivot Table Owner×Stage cross-tab with Sum row ❌ Missing entirely
H. Widget Action Button External-link icon on each widget ❌ Missing
I. Dashboard Title/Description Page header with title + subtitle ⚠️ Exists but not in Dashboard protocol

2. Protocol Enhancements (spec)

记录以下协议增强建议:

  • 1.1 DashboardWidgetSchema 新增 colorVariant, actionUrl, description, actionType 属性
  • 1.2 DashboardSchema 新增 header 结构化配置(showTitle, showDescription, actions)
  • 1.3 globalFilters 增强:支持 options, optionsFrom(动态数据绑定), defaultValue, scope, targetWidgets
  • 1.4 确保 pivot 作为 first-class widget type
  • 1.5 新增 measures 数组支持 multi-measure pivot/matrix widgets

3. Component Enhancements (objectui)

记录以下组件增强建议:

  • 2.1 新增 DashboardFilterBar 组件(渲染 globalFilters)
  • 2.2 MetricCard 彩色变体支持(colorVariant: orange/teal/blue 等)+ action button
  • 2.3 新增 PivotTable 组件(交叉矩阵/透视表)
  • 2.4 Widget header 支持 description + action button
  • 2.5 AdvancedChartImpl 补充 funnel, grouped-bar, stacked-bar, horizontal-bar, gauge
  • 2.6 新增 DashboardHeader 复合组件

4. 页面组合优化

提供完整的 JSON Schema 示例(sales_performance_dashboard.json),展示如何用协议描述完整的 Airtable 风格仪表盘。

5. 实施优先级 & Roadmap

Priority Task Package Effort
🔴 P0 DashboardFilterBar component plugin-dashboard 3d
🔴 P0 MetricCard color variants + action button plugin-dashboard 1d
🔴 P0 Widget header description + action icon plugin-dashboard 1d
🔴 P0 PivotTable component plugin-report 5d
🔴 P0 Spec: colorVariant, actionUrl, description on DashboardWidgetSchema spec 0.5d
🔴 P0 Spec: Enhanced globalFilters with optionsFrom spec 0.5d
🟡 P1 funnel, grouped-bar, stacked-bar chart types plugin-charts 3d
🟡 P1 DashboardHeader composite component plugin-dashboard 1d
🟡 P1 Spec: header property on DashboardSchema spec 0.5d
🟡 P1 Spec: measures array for multi-value pivot widgets spec 0.5d
🟢 P2 gauge chart type plugin-charts 2d
🟢 P2 Dashboard export (PDF/Image) action plugin-dashboard 3d

6. 关联 Issues

请在文档中引用以下已创建的 Issue:

objectstack-ai/spec:

objectstack-ai/objectui:

文档位置建议

建议放在 content/docs/guides/ 或 content/docs/protocol/ 目录下,如 content/docs/guides/airtable-dashboard-analysis.mdx。

注��事项

  • 开发完成后运行 test
  • 更新 roadmap 相关文件(如有)
  • 使用 MDX 格式
  • 包含代码示例(TypeScript/JSON)

This pull request was created from Copilot chat.


💡 You can make Copilot smarter by setting up custom instructions, customizing its development environment and configuring Model Context Protocol (MCP) servers. Learn more Copilot coding agent tips in the docs.

@vercel

vercel Bot commented Feb 18, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
objectstack-play Ready Ready Preview, Comment Feb 18, 2026 7:26am
spec Canceled Canceled Feb 18, 2026 7:26am

Request Review

Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com>
Copilot AI changed the title [WIP] Update project documentation with gap analysis results Add Airtable Dashboard gap analysis documentation Feb 18, 2026
Copilot AI requested a review from hotlong February 18, 2026 06:03
@hotlong
hotlong marked this pull request as ready for review February 18, 2026 06:04
Copilot AI review requested due to automatic review settings February 18, 2026 06:04
@hotlong
hotlong merged commit 2c0801b into main Feb 18, 2026
3 of 5 checks passed

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds an Airtable vs ObjectStack dashboard gap-analysis guide and integrates a phased implementation plan into the project roadmap so upcoming protocol/objectui work can be tracked against concrete parity targets.

Changes:

  • Added a new guide airtable-dashboard-analysis.mdx covering UI zone breakdown, protocol/component gaps, examples, and a phased roadmap.
  • Registered the new guide in content/docs/guides/meta.json navigation.
  • Added a new “Dashboard Enhancement — Airtable Dashboard Parity” section to ROADMAP.md with linked issues and effort estimates.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 5 comments.

File Description
content/docs/guides/meta.json Adds the new guide to the Guides sidebar order.
content/docs/guides/airtable-dashboard-analysis.mdx New MDX guide documenting dashboard parity gaps, proposed schema changes, component work, examples, and roadmap.
ROADMAP.md Introduces a dedicated dashboard parity roadmap section and updates section numbering/links accordingly.

Comment on lines +705 to +714
field: 'product_line',
label: 'Product Line',
type: 'select',
optionsFrom: {
object: 'product',
valueField: 'category',
labelField: 'category'
},
scope: 'dashboard'
}

Copilot AI Feb 18, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

optionsFrom is described here as being “for lookup type”, but the example uses type: 'select' together with optionsFrom. This is internally inconsistent in the doc and could confuse implementers; either change the example to type: 'lookup' or update the proposed GlobalFilterSchema docs to state that optionsFrom is supported for select as well.

Copilot uses AI. Check for mistakes.
Comment on lines +724 to +756
object: 'opportunity',
valueField: 'amount',
aggregate: 'sum',
filter: { field: 'stage', operator: 'eq', value: 'closed_won' },
colorVariant: 'orange',
actionUrl: '/reports/revenue-detail',
actionType: 'internal',
layout: { x: 0, y: 0, w: 4, h: 2 }
},
{
title: 'Win Rate',
description: 'Percentage of opportunities closed won',
type: 'kpi',
object: 'opportunity',
valueField: 'stage',
aggregate: 'count',
colorVariant: 'teal',
actionUrl: '/reports/win-rate',
actionType: 'internal',
layout: { x: 4, y: 0, w: 4, h: 2 }
},
{
title: 'Active Deals',
description: 'Opportunities in pipeline',
type: 'metric',
object: 'opportunity',
valueField: 'id',
aggregate: 'count',
filter: {
field: 'stage',
operator: 'nin',
value: ['closed_won', 'closed_lost']
},

Copilot AI Feb 18, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The examples use a { field, operator, value } shape for filter, but DashboardWidgetSchema.filter is typed as FilterConditionSchema (ObjectStack query DSL like { status: { $eq: 'paid' } } / { is_closed: false }). Even though the current Zod schema is permissive, keeping examples aligned with the canonical filter DSL will avoid confusion and match existing tests/usages.

Copilot uses AI. Check for mistakes.
Comment on lines +650 to +652
import { Dashboard } from '@objectstack/spec';

export const salesPerformanceDashboard = Dashboard.create({

Copilot AI Feb 18, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The TypeScript example imports Dashboard from @objectstack/spec, but the package root only exports protocol namespaces (e.g. UI) and a few DX helpers. As written, this import won't work; use import * as UI from '@objectstack/spec/ui' (or import { UI } from '@objectstack/spec') and reference UI.Dashboard.create(...) / the subpath export instead.

Suggested change
import { Dashboard } from '@objectstack/spec';
export const salesPerformanceDashboard = Dashboard.create({
import { UI } from '@objectstack/spec';
export const salesPerformanceDashboard = UI.Dashboard.create({

Copilot uses AI. Check for mistakes.
Comment on lines +154 to +160
chartConfig: {
series: [
{ name: 'closed_won', label: 'Won', color: '#10b981' },
{ name: 'closed_lost', label: 'Lost', color: '#ef4444' }
]
},
layout: { x: 0, y: 6, w: 6, h: 4 }

Copilot AI Feb 18, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Several examples use chartConfig without the required type field. ChartConfigSchema currently requires type: ChartTypeSchema, so these snippets won’t validate as-is. Either include type in the examples (matching the widget’s type) or clarify that the schema would need to be adjusted to infer it from the widget.

Copilot uses AI. Check for mistakes.
Comment on lines +773 to +776
chartConfig: {
xAxis: { field: 'close_date', format: 'MMM YYYY' },
yAxis: { field: 'amount', format: '$0,0' },
series: [

Copilot AI Feb 18, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In the full dashboard example, chartConfig.yAxis is shown as a single object, but ChartConfigSchema defines yAxis as an array of axes. This example won’t validate against the current schema unless yAxis is changed to an array (even for a single axis).

Copilot uses AI. Check for mistakes.

This branch was successfully deployed

2 active deployments
Preview – objectstack-play — 21f3c0bb Deployed Feb 18, 2026 by vercel[bot]
Preview – spec — 21f3c0bb Deployed Feb 18, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants