Skip to content

feat(dashboard): enhance globalFilters with options, optionsFrom, defaultValue, scope, targetWidgets - #718

Merged
hotlong merged 2 commits into
mainfrom
copilot/enhance-global-filters-options
Feb 18, 2026
Merged

feat(dashboard): enhance globalFilters with options, optionsFrom, defaultValue, scope, targetWidgets#718
hotlong merged 2 commits into
mainfrom
copilot/enhance-global-filters-options

Conversation

CopilotAI commented Feb 18, 2026

Copy link
Copy Markdown
Contributor

DashboardSchema.globalFilters lacked dynamic option binding and scoping — needed for Airtable-style filter bars where dropdowns auto-populate from object data.

Schema changes (dashboard.zod.ts)

  • GlobalFilterOptionsFromSchema — new schema for dynamic option binding (object, valueField, labelField, optional filter)
  • GlobalFilterSchema — extracted from inline definition, extended with:
    • options — static option list { value, label }[]
    • optionsFrom — dynamic binding via GlobalFilterOptionsFromSchema
    • defaultValue — pre-selected value
    • scope'dashboard' (default) | 'widget'
    • targetWidgets — selective widget targeting
    • 'lookup' added to type enum
  • New type exports: GlobalFilter, GlobalFilterOptionsFrom

Backward compatibility

Old configs parse identically — all new fields are optional, scope defaults to 'dashboard'.

// Old style still works unchanged
globalFilters: [{field: 'status',label: 'Status',type: 'select'}]// New: dynamic options from object
globalFilters: [{field: 'owner_id',type: 'lookup',optionsFrom: {object: 'user',valueField: 'id',labelField: 'full_name',filter: {is_active: true},},scope: 'widget',targetWidgets: ['revenue_chart'],}]

Tests & roadmap

Original prompt

This section details on the original issue you should resolve

<issue_title>DashboardSchema.globalFilters 协议支持动态选项与数据绑定高级配置</issue_title>
<issue_description>Airtable style dashboard filter bar 需协议支持 optionsFrom,允许下拉选项自动从对象动态获取。

目标

  • DashboardSchema.globalFilters 协议项支持 options、optionsFrom(object/labelField/valueField)
  • 支持 scope、targetWidgets 等高级配置
  • 兼容旧协议写法

参考分析 1.3

  • 类型:enhancement
  • 开发完成后测试,并更新 roadmap</issue_description>

Comments on the Issue (you are @copilot in this section)


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

@vercel

vercelBot commented Feb 18, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
objectstack-playReadyReadyPreview, CommentFeb 18, 2026 7:34am
specReadyReadyPreview, CommentFeb 18, 2026 7:34am

Request Review

…aultValue, scope, targetWidgets (#712)
Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com>
CopilotAI changed the title [WIP] Enhance DashboardSchema.globalFilters to support dynamic optionsfeat(dashboard): enhance globalFilters with options, optionsFrom, defaultValue, scope, targetWidgetsFeb 18, 2026
CopilotAI requested a review from hotlongFebruary 18, 2026 06:30
@hotlong
hotlong marked this pull request as ready for review February 18, 2026 06:33
CopilotAI review requested due to automatic review settings February 18, 2026 06:33
@hotlong
hotlong merged commit b4853a8 into mainFeb 18, 2026
5 of 7 checks passed

CopilotAI 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

Enhances the DashboardSchema.globalFilters protocol in @objectstack/spec to support Airtable-style filter bars with static options, dynamic option binding, defaults, and widget-level scoping.

Changes:

  • Added GlobalFilterOptionsFromSchema and extracted/expanded GlobalFilterSchema (options/optionsFrom/defaultValue/scope/targetWidgets + lookup type).
  • Updated DashboardSchema.globalFilters to use the new GlobalFilterSchema.
  • Added/expanded tests covering new global filter capabilities and marked roadmap item #712 complete.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 1 comment.

FileDescription
packages/spec/src/ui/dashboard.zod.tsIntroduces new global filter schemas and wires them into DashboardSchema.
packages/spec/src/ui/dashboard.test.tsAdds parsing/compatibility tests for enhanced globalFilters configuration.
ROADMAP.mdMarks issue #712 as complete.

Comment on lines +148 to +149
/** Widget IDs to apply this filter to (when scope is widget) */
targetWidgets: z.array(z.string()).optional().describe('Widget IDs to apply this filter to'),

CopilotAIFeb 18, 2026

Copy link

Choose a reason for hiding this comment

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

targetWidgets is documented as “Widget IDs”, but DashboardWidgetSchema doesn’t define any stable widget identifier field (e.g. id/name). As a result, it’s unclear what strings in targetWidgets are expected to match, and consumers can’t reliably target widgets.

Consider adding an explicit widget identifier field to DashboardWidgetSchema (ideally snake_case via SnakeCaseIdentifierSchema) and clarifying that targetWidgets references that field (or rename targetWidgets to reflect the actual reference).

Suggested change
/** Widget IDs to apply this filter to (when scope is widget) */
targetWidgets: z.array(z.string()).optional().describe('Widget IDs to apply this filter to'),
/** Widget identifiers (DashboardWidgetSchema.widgetId) to apply this filter to (when scope is widget) */
targetWidgets: z.array(SnakeCaseIdentifierSchema).optional().describe('Widget identifiers (DashboardWidgetSchema.widgetId) to apply this filter to'),

Copilot uses AI. Check for mistakes.
Sign up for freeto 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.

DashboardSchema.globalFilters 协议支持动态选项与数据绑定高级配置

3 participants

@hotlong