Skip to content

ViewConfigPanel 对齐 @objectstack/spec ListViewSchema 完整修改清单 #724

@hotlong

Description

@hotlong

背景

ViewConfigPanel.tsx 是 Console 右侧面板,用于配置列表视图。当前面板覆盖了约 58% 的 ListViewSchema spec 属性。本 Issue 的目标是@objectstack/spec UI 协议为准,补齐所有缺失的面板配置项,确保每个 spec 属性在面板中都有对应的 UI 入口。

权威来源packages/types/src/objectql.ts L1101-L1511 ListViewSchema interface

当前面板结构apps/console/src/components/ViewConfigPanel.tsx):

  • Page Config 区:label, description, viewType, 11 个 toolbar 开关
  • Data 区:sort, filter, columns, groupBy, prefixField, viewType 子选项
  • Appearance 区:color, fieldTextColor, rowHeight, wrapHeaders, showDescription, collapseAllByDefault, striped, bordered
  • User Actions 区:editRecordsInline, addDeleteRecordsInline

修改清单

P0 — ���优先级(用户可感知,必须在本轮完成)

1. 新增 Navigation 配置(替代 clickIntoRecordDetails 简单 toggle)

Spec 属性navigation: ViewNavigationConfig

interface ViewNavigationConfig {
  mode: 'page' | 'drawer' | 'modal' | 'split' | 'popover' | 'new_window' | 'none';
  view?: string;
  preventNavigation?: boolean;
  openNewTab?: boolean;
  width?: string | number;
}

当前面板:只有 clickIntoRecordDetails boolean toggle(L546-L552)

修改内容

  • ViewConfigPanel.tsx Page Config 区:将 clickIntoRecordDetails toggle 替换为 navigation.mode Select 下拉
    • 选项:page(默认)、drawermodalsplitpopovernew_windownone
    • data-testid: select-navigation-mode
  • ViewConfigPanel.tsx:当 modedrawer/modal/split 时,展示 navigation.width Input
    • data-testid: input-navigation-width
  • ViewConfigPanel.tsx:当 modepage/new_window 时,展示 navigation.openNewTab Switch
    • data-testid: toggle-navigation-openNewTab
  • Console ObjectView.tsx renderListView fullSchema:透传 navigation
  • PluginObjectView.tsx renderContent schema:透传 navigation
  • ListView.tsx:消费 schema.navigation 控制行点击行为
  • i18n keysconsole.objectView.navigationMode, console.objectView.navigationWidth, console.objectView.openNewTab
  • 测试:navigation mode 切换 → 面板 UI 变化 + 值透传

2. 新增 Selection 配置

Spec 属性selection: { type: 'none' | 'single' | 'multiple' }

当前面板:完全缺失

修改内容

  • ViewConfigPanel.tsx Page Config 区:新增 selection.type Select 下拉
    • 选项:nonesinglemultiple
    • data-testid: select-selection-type
  • Console ObjectView.tsx fullSchema:透传 selection
  • PluginObjectView.tsx schema:透传 selection
  • i18n keysconsole.objectView.selectionMode, console.objectView.selectionNone, console.objectView.selectionSingle, console.objectView.selectionMultiple
  • 测试:selection type 切换 → 值透传

3. 新增 Pagination 配置

Spec 属性pagination: { pageSize: number; pageSizeOptions?: number[] }

当前面板:完全缺失

修改内容

  • ViewConfigPanel.tsx Data 区:新增 pagination.pageSize Number Input
    • data-testid: input-pagination-pageSize
    • 默认值提示:25
  • ViewConfigPanel.tsx:新增 pagination.pageSizeOptions multi-select 或逗号分隔 Input
    • data-testid: input-pagination-pageSizeOptions
    • 默认提示:10, 25, 50, 100
  • Console ObjectView.tsx fullSchema:透传 pagination
  • PluginObjectView.tsx schema:透传 pagination
  • i18n keysconsole.objectView.pageSize, console.objectView.pageSizeOptions
  • 测试:pageSize 输入 → 值透传

P1 — 中优先级(高级配置,提升完整度)

4. Export Options 展开配置

Spec 属性exportOptions: { formats?, maxRecords?, includeHeaders?, fileNamePrefix? }

当前面板:只有 allowExport boolean toggle(L562-L568),缺 exportOptions 细节

修改内容

  • ViewConfigPanel.tsx Page Config 区:当 allowExport = true 时展开子配置区
    • exportOptions.formats multi-select checkbox: csv, xlsx, json, pdf
      • data-testid: export-formats
    • exportOptions.maxRecords Number Input
      • data-testid: input-export-maxRecords
    • exportOptions.includeHeaders Switch
      • data-testid: toggle-export-includeHeaders
    • exportOptions.fileNamePrefix Input
      • data-testid: input-export-fileNamePrefix
  • i18n keysconsole.objectView.exportFormats, console.objectView.exportMaxRecords, console.objectView.exportIncludeHeaders, console.objectView.exportFileNamePrefix
  • 测试:allowExport ON → 展开子配置;formats 选择 → exportOptions 正确生成

5. Searchable Fields 配置

Spec 属性searchableFields: string[]

当前面板:完全缺失

修改内容

  • ViewConfigPanel.tsx Data 区:新增 searchableFields multi-select checkbox 列表(从 objectDef.fields 派生)
    • data-testid: searchable-fields-selector
    • 点击展开,类似现有 columns selector 的 UX
  • Console ObjectView.tsx fullSchema:透传 searchableFields
  • i18n keysconsole.objectView.searchableFields
  • 测试:选择字段 → searchableFields 数组更新

6. Filterable Fields 配置

Spec 属性filterableFields: string[]

当前面板:完全缺失

修改内容

  • ViewConfigPanel.tsx Data 区:新增 filterableFields multi-select checkbox 列表
    • data-testid: filterable-fields-selector
  • Console ObjectView.tsx fullSchema:透传 filterableFields
  • i18n keysconsole.objectView.filterableFields
  • 测试:选择字段 → filterableFields 数组更新

7. Resizable 列可拖拽调宽

Spec 属性resizable: boolean

当前面板:完全缺失

修改内容

  • ViewConfigPanel.tsx Appearance 区:新增 resizable Switch
    • data-testid: toggle-resizable
  • Console ObjectView.tsx fullSchema:透传 resizable
  • PluginObjectView.tsx schema:透传 resizable
  • i18n keysconsole.objectView.resizableColumns
  • 测试:toggle → 值透传

8. Density Mode 独立选择器

Spec 属性densityMode: 'compact' | 'comfortable' | 'spacious'

当前面板:只有 rowHeight 图标按钮(short/medium/tall/extraTall),缺少 densityMode 独立控制

修改内容

  • ViewConfigPanel.tsx Appearance 区:新增 densityMode Select 下拉
    • 选项:compact, comfortable, spacious
    • data-testid: select-densityMode
    • 或:将现有 rowHeight 按钮组值改为 spec 值 compact/medium/tall
  • Console ObjectView.tsx fullSchema:透传 densityMode
  • i18n keysconsole.objectView.densityCompact, console.objectView.densityComfortable, console.objectView.densitySpacious
  • 测试:densityMode 选择 → 值透传

9. Hidden Fields 默认隐藏字段

Spec 属性hiddenFields: string[]

当前面板:完全缺失(columns 只控制显示顺序,不等于 hiddenFields)

修改内容

  • ViewConfigPanel.tsx Data 区:新增 hiddenFields multi-select checkbox
    • data-testid: hidden-fields-selector
  • Console ObjectView.tsx fullSchema:透传 hiddenFields
  • i18n keysconsole.objectView.hiddenFields
  • 测试:选择字段 → hiddenFields 数组更新

10. Row Actions / Bulk Actions 配置

Spec 属性rowActions: string[]bulkActions: string[]

当前面板:完全缺失

修改内容

  • ViewConfigPanel.tsx User Actions 区:新增 rowActions multi-select(从 objectDef 或 ActionSchema 派生可用 action 列表)
    • data-testid: row-actions-selector
  • ViewConfigPanel.tsx User Actions 区:新增 bulkActions multi-select
    • data-testid: bulk-actions-selector
  • Console ObjectView.tsx fullSchema:透传 rowActions, bulkActions
  • i18n keysconsole.objectView.rowActions, console.objectView.bulkActions
  • 测试:选择 actions → 值透传

11. Sharing 配置

Spec 属性sharing: { visibility?: 'private' | 'team' | 'organization' | 'public'; enabled?: boolean }

当前面板:完全缺失

修改内容

  • ViewConfigPanel.tsx:新增 Sharing Section(collapsible)
    • sharing.enabled Switch — data-testid: toggle-sharing-enabled
    • sharing.visibility Select — data-testid: select-sharing-visibility
      • 选项:private, team, organization, public
  • Console ObjectView.tsx fullSchema:透传 sharing
  • i18n keysconsole.objectView.sharing, console.objectView.sharingEnabled, console.objectView.sharingVisibility
  • 测试:sharing toggle + visibility 选择 → 值透传

12. Add Record 完整配置

Spec 属性addRecord: { enabled?, position?, mode?, formView? }

当前面板:只有 addRecordViaForm boolean toggle

修改内容

  • ViewConfigPanel.tsx Page Config 区:将 addRecordViaForm toggle 升级为 addRecord 子编辑器
    • addRecord.enabled Switch — data-testid: toggle-addRecord-enabled
    • addRecord.position Select(top, bottom)— data-testid: select-addRecord-position
    • addRecord.mode Select(inline, form, modal)— data-testid: select-addRecord-mode
    • addRecord.formView Input — data-testid: input-addRecord-formView
  • i18n keysconsole.objectView.addRecordPosition, console.objectView.addRecordMode, console.objectView.addRecordFormView
  • 测试:addRecord 子配置 → 值透传

13. Conditional Formatting 规则编辑器

Spec 属性conditionalFormatting: Array<{ field, operator, value, backgroundColor?, textColor?, borderColor?, expression? }>

当前面板:完全缺失

修改内容

  • ViewConfigPanel.tsx Appearance 区:新增 "Conditional Formatting" 展开行
    • 点击展开规则列表编辑器
    • 每条规则:field Select + operator Select + value Input + color pickers(bg/text/border)
    • data-testid: conditional-formatting-editor
  • Console ObjectView.tsx fullSchema:透传 conditionalFormatting
  • i18n keysconsole.objectView.conditionalFormatting, console.objectView.addRule
  • 测试:增加规则 → conditionalFormatting 数组更新

14. Quick Filters 配置

Spec 属性quickFilters: Array<{ id, label, filters, icon?, defaultActive? }>

���前面板:完全缺失

修改内容

  • ViewConfigPanel.tsx Data 区:新增 "Quick Filters" 展开行
    • 规则列表编辑器:每条 quickFilter 有 label Input + filter 条件编辑 + defaultActive Switch
    • data-testid: quick-filters-editor
  • Console ObjectView.tsx fullSchema:透传 quickFilters
  • i18n keysconsole.objectView.quickFilters, console.objectView.addQuickFilter
  • 测试:增加 quickFilter → 值透传

P2 — 低优先级(边缘/开发者配置)

15. Show Record Count

SpecshowRecordCount: boolean修改:Page Config 区新增 Switch,data-testid: toggle-showRecordCount

16. Allow Printing

SpecallowPrinting: boolean修改:Page Config 区新增 Switch,data-testid: toggle-allowPrinting

17. Virtual Scroll

SpecvirtualScroll: boolean修改:Data 区新增 Switch,data-testid: toggle-virtualScroll

18. Empty State 配置

SpecemptyState: { title?, message?, icon? }修改:Appearance 区新增 3 个 Input

19. ARIA 配置

Specaria: { label?, describedBy?, live? }修改:新增 Accessibility Section(collapsible),3 个 Input

20. User Filters 完整编辑器

SpecuserFilters: { element, fields, tabs, allowAddTab, showAllRecords }修改:Data 区新增完整 userFilters 编辑器(复杂度高,可单独 Issue)

21. View Tabs 配置

Spectabs: Array<{ name, label, icon?, view?, filter?, ... }>修改:新增 Tabs 编辑器


语义对齐修复(不新增控件,修正现有映射)

A. editRecordsInlineinlineEdit 字段名统一

当前:面板写 editRecordsInline,Console 映射为 inlineEdit

  • ViewConfigPanel.tsx L989-993:将 updateDraft('editRecordsInline', ...) 改为 updateDraft('inlineEdit', ...)
  • ViewConfigPanel.tsx L992:draft.editRecordsInlinedraft.inlineEdit
  • Console ObjectView.tsx:移除 editRecordsInline → inlineEdit 映射层
  • data-testid:保持 toggle-editRecordsInline(兼容现有测试)或批量更新
  • 测试:更新所有引用

B. rowHeight 值域对齐 spec

当前面板值short, medium, tall, extraTall
Spec 值compact, medium, tall

  • ViewConfigPanel.tsx L185-190 ROW_HEIGHT_OPTIONS:改为 compact, medium, tall
  • 测试:更新 rowHeight 相关断言

C. showDescriptionappearance.showDescription 层级对齐

当前:面板写 flat showDescription,Console 做转换包入 appearance

  • 保持现有 flat 写法(简化),Console 继续做转换 — 不需修改,但在注释中说明

涉及文件

文件 修改类型
apps/console/src/components/ViewConfigPanel.tsx 主要修改:新增所有面板控件
apps/console/src/components/ObjectView.tsx fullSchema 透传补齐
packages/plugin-view/src/ObjectView.tsx renderContent schema 透传补齐
packages/plugin-list/src/ListView.tsx 消费新增 schema 属性
packages/types/src/objectql.ts NamedListView 补齐缺失属性(navigation, selection, pagination 等)
packages/types/src/zod/objectql.zod.ts Zod schema 同步
packages/i18n/src/locales/en.json 新增 i18n keys
packages/i18n/src/locales/zh.json 新增 i18n keys
apps/console/src/__tests__/ViewConfigPanel.test.tsx 新增测试
packages/plugin-list/src/__tests__/ListView.test.tsx 新增测试

验收标准

  • ListViewSchema 中所有 P0/P1 属性在 ViewConfigPanel 中有对应 UI 入口
  • 每个面板控件的值变更能完整透传到 ListView 消费端
  • 所有新增控件有 data-testid
  • 所有新增控件有对应的 i18n key(en + zh)
  • ViewConfigPanel 单元测试通过
  • ListView 单元测试通过
  • 全量 test suite 通过(pnpm test
  • ROADMAP.md 更新对应条目为已完成

Metadata

Metadata

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions