@taocompany/magic-grid 0.1.6 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (185) hide show
  1. package/README.md +1321 -226
  2. package/dist/components/ColumnSettings/ColumnFilterPanelEmbed.vue.d.ts +4 -3
  3. package/dist/components/ColumnSettings/ColumnFilterPanelEmbed.vue.d.ts.map +1 -1
  4. package/dist/components/ColumnSettings/ColumnSettingsButton.vue.d.ts +6 -5
  5. package/dist/components/ColumnSettings/ColumnSettingsButton.vue.d.ts.map +1 -1
  6. package/dist/components/ColumnSettings/ColumnSettingsClearFiltersBar.vue.d.ts +4 -3
  7. package/dist/components/ColumnSettings/ColumnSettingsClearFiltersBar.vue.d.ts.map +1 -1
  8. package/dist/components/ColumnSettings/ColumnSettingsGroupedLists.vue.d.ts +4 -3
  9. package/dist/components/ColumnSettings/ColumnSettingsGroupedLists.vue.d.ts.map +1 -1
  10. package/dist/components/ColumnSettings/ColumnSettingsList.vue.d.ts +4 -3
  11. package/dist/components/ColumnSettings/ColumnSettingsList.vue.d.ts.map +1 -1
  12. package/dist/components/ColumnSettings/ColumnSettingsMenu.vue.d.ts +4 -3
  13. package/dist/components/ColumnSettings/ColumnSettingsMenu.vue.d.ts.map +1 -1
  14. package/dist/components/ColumnSettings/ColumnSettingsMenuIcon.vue.d.ts +3 -2
  15. package/dist/components/ColumnSettings/ColumnSettingsMenuIcon.vue.d.ts.map +1 -1
  16. package/dist/components/ColumnSettings/ColumnSettingsMenuItem.vue.d.ts +2 -1
  17. package/dist/components/ColumnSettings/ColumnSettingsMenuItem.vue.d.ts.map +1 -1
  18. package/dist/components/ColumnSettings/ColumnSettingsPanel.vue.d.ts +4 -3
  19. package/dist/components/ColumnSettings/ColumnSettingsPanel.vue.d.ts.map +1 -1
  20. package/dist/components/ColumnSettings/ColumnSettingsRow.vue.d.ts +4 -3
  21. package/dist/components/ColumnSettings/ColumnSettingsRow.vue.d.ts.map +1 -1
  22. package/dist/components/MagicGrid/MagicGrid.vue.d.ts +191 -167
  23. package/dist/components/MagicGrid/MagicGrid.vue.d.ts.map +1 -1
  24. package/dist/components/MagicGrid/resolveMagicGridDefaults.d.ts +1 -1
  25. package/dist/components/MagicGrid/resolveMagicGridDefaults.d.ts.map +1 -1
  26. package/dist/components/MagicGrid/useStatusBarContext.d.ts +3 -3
  27. package/dist/components/StatusBar/StatusBarDefaultPanels.vue.d.ts +3 -2
  28. package/dist/components/StatusBar/StatusBarDefaultPanels.vue.d.ts.map +1 -1
  29. package/dist/components/StatusBar/StatusBarRangeAggregationPanels.vue.d.ts +3 -2
  30. package/dist/components/StatusBar/StatusBarRangeAggregationPanels.vue.d.ts.map +1 -1
  31. package/dist/components/StatusBar/hasStatusBarAggregationContent.d.ts +4 -0
  32. package/dist/components/StatusBar/hasStatusBarAggregationContent.d.ts.map +1 -0
  33. package/dist/components/StatusBar/resolveStatusBarRangeAggregationPrecision.d.ts +1 -1
  34. package/dist/components/StatusBar/resolveStatusBarRangeAggregationPrecision.d.ts.map +1 -1
  35. package/dist/components/cellEditor/index.d.ts +1 -1
  36. package/dist/components/cellEditor/index.d.ts.map +1 -1
  37. package/dist/components/cellEditor/{useMagicGridCellEditor.d.ts → useCellEditor.d.ts} +4 -4
  38. package/dist/components/cellEditor/useCellEditor.d.ts.map +1 -0
  39. package/dist/core/api/gridApi.d.ts +35 -23
  40. package/dist/core/api/gridApi.d.ts.map +1 -1
  41. package/dist/core/cellComment/cellCommentService.d.ts +2 -2
  42. package/dist/core/column/columnModel.d.ts +1 -1
  43. package/dist/core/column/columnModel.d.ts.map +1 -1
  44. package/dist/core/column/createExpandColumnDef.d.ts +1 -1
  45. package/dist/core/column/createGroupColumnDef.d.ts +1 -1
  46. package/dist/core/column/createIndexColumnDef.d.ts +1 -1
  47. package/dist/core/column/createSelectionColumnDef.d.ts +1 -1
  48. package/dist/core/column/prepareGridColumnDefs.d.ts +1 -1
  49. package/dist/core/column/resolveColumnAlign.d.ts +3 -3
  50. package/dist/core/column/resolveColumnAlign.d.ts.map +1 -1
  51. package/dist/core/editing/cellDisablePipeline.d.ts +1 -1
  52. package/dist/core/editing/cellEditPipeline.d.ts +5 -5
  53. package/dist/core/editing/cellEditPipeline.d.ts.map +1 -1
  54. package/dist/core/editing/gridValidation.d.ts +2 -2
  55. package/dist/core/grid/cellEditing/types.d.ts +4 -3
  56. package/dist/core/grid/cellEditing/types.d.ts.map +1 -1
  57. package/dist/core/grid/cellRangeDragSelect.d.ts +1 -1
  58. package/dist/core/grid/cellRangeDragSelect.d.ts.map +1 -1
  59. package/dist/core/grid/grid.d.ts +15 -13
  60. package/dist/core/grid/grid.d.ts.map +1 -1
  61. package/dist/core/grid/gridColumnLayout.d.ts +10 -5
  62. package/dist/core/grid/gridColumnLayout.d.ts.map +1 -1
  63. package/dist/core/grid/gridInteraction/focusController.d.ts +2 -2
  64. package/dist/core/grid/gridInteraction/focusController.d.ts.map +1 -1
  65. package/dist/core/grid/gridInteraction/indexSelectionDragSession.d.ts +2 -1
  66. package/dist/core/grid/gridInteraction/indexSelectionDragSession.d.ts.map +1 -1
  67. package/dist/core/grid/gridInteraction/rowDragSession.d.ts +3 -2
  68. package/dist/core/grid/gridInteraction/rowDragSession.d.ts.map +1 -1
  69. package/dist/core/grid/gridInteraction/types.d.ts +18 -13
  70. package/dist/core/grid/gridInteraction/types.d.ts.map +1 -1
  71. package/dist/core/grid/gridOptions.d.ts +6 -5
  72. package/dist/core/grid/gridOptions.d.ts.map +1 -1
  73. package/dist/core/grid/gridRowMutation.d.ts +5 -4
  74. package/dist/core/renderer/cellRangeVisualController.d.ts +2 -1
  75. package/dist/core/renderer/cellRangeVisualController.d.ts.map +1 -1
  76. package/dist/core/renderer/rowRenderer.d.ts +19 -12
  77. package/dist/core/renderer/rowRenderer.d.ts.map +1 -1
  78. package/dist/core/row/cellComp.d.ts +2 -1
  79. package/dist/core/row/cellComp.d.ts.map +1 -1
  80. package/dist/core/row/rowComp.d.ts +10 -5
  81. package/dist/core/row/rowComp.d.ts.map +1 -1
  82. package/dist/core/rowModel/clientSideRowModel.d.ts +1 -1
  83. package/dist/core/rowModel/createRowNodes.d.ts +1 -1
  84. package/dist/core/rowModel/rowDataExport.d.ts +1 -1
  85. package/dist/core/selection/cellClipboardService.d.ts +2 -1
  86. package/dist/core/selection/cellClipboardService.d.ts.map +1 -1
  87. package/dist/core/selection/selectable.d.ts +1 -1
  88. package/dist/core/styling/cellStylePipeline.d.ts +1 -1
  89. package/dist/core/theme/gridSize.d.ts +14 -10
  90. package/dist/core/theme/gridSize.d.ts.map +1 -1
  91. package/dist/core/theme/gridTheme.d.ts +7 -7
  92. package/dist/core/theme/gridTheme.d.ts.map +1 -1
  93. package/dist/core/theme/index.d.ts +3 -3
  94. package/dist/core/theme/index.d.ts.map +1 -1
  95. package/dist/core/transaction/applyTransaction.d.ts +1 -1
  96. package/dist/core/treeTable/treeLazyLoadService.d.ts +1 -1
  97. package/dist/core/types/align.d.ts +16 -20
  98. package/dist/core/types/align.d.ts.map +1 -1
  99. package/dist/core/types/businessRowId.d.ts +3 -2
  100. package/dist/core/types/businessRowId.d.ts.map +1 -1
  101. package/dist/core/types/cellClipboard.d.ts +3 -2
  102. package/dist/core/types/cellClipboard.d.ts.map +1 -1
  103. package/dist/core/types/cellColor.d.ts +1 -1
  104. package/dist/core/types/cellComment.d.ts +3 -2
  105. package/dist/core/types/cellComment.d.ts.map +1 -1
  106. package/dist/core/types/cellDisable.d.ts +1 -1
  107. package/dist/core/types/cellEditor.d.ts +4 -3
  108. package/dist/core/types/cellEditor.d.ts.map +1 -1
  109. package/dist/core/types/cellRangeSelection.d.ts +15 -23
  110. package/dist/core/types/cellRangeSelection.d.ts.map +1 -1
  111. package/dist/core/types/cellRenderer.d.ts +1 -1
  112. package/dist/core/types/cellSpan.d.ts +1 -1
  113. package/dist/core/types/column.d.ts +47 -32
  114. package/dist/core/types/column.d.ts.map +1 -1
  115. package/dist/core/types/columnAvailability.d.ts +6 -0
  116. package/dist/core/types/columnAvailability.d.ts.map +1 -0
  117. package/dist/core/types/columnFilter.d.ts +1 -1
  118. package/dist/core/types/columnMove.d.ts +1 -1
  119. package/dist/core/types/columnResize.d.ts +1 -1
  120. package/dist/core/types/columnSettingsPanel.d.ts +2 -2
  121. package/dist/core/types/columnSettingsPanel.d.ts.map +1 -1
  122. package/dist/core/types/columnSort.d.ts +1 -1
  123. package/dist/core/types/columnVisibility.d.ts +1 -1
  124. package/dist/core/types/events.d.ts +8 -6
  125. package/dist/core/types/events.d.ts.map +1 -1
  126. package/dist/core/types/gridOptions.d.ts +9 -6
  127. package/dist/core/types/gridOptions.d.ts.map +1 -1
  128. package/dist/core/types/index.d.ts +5 -4
  129. package/dist/core/types/index.d.ts.map +1 -1
  130. package/dist/core/types/indexColumn.d.ts +14 -14
  131. package/dist/core/types/indexColumn.d.ts.map +1 -1
  132. package/dist/core/types/overflowTooltip.d.ts +1 -1
  133. package/dist/core/types/pipeline.d.ts +1 -1
  134. package/dist/core/types/rowComp.d.ts +10 -5
  135. package/dist/core/types/rowComp.d.ts.map +1 -1
  136. package/dist/core/types/rowDrag.d.ts +1 -1
  137. package/dist/core/types/rowExpansion.d.ts +1 -1
  138. package/dist/core/types/rowGrouping.d.ts +2 -2
  139. package/dist/core/types/rowGrouping.d.ts.map +1 -1
  140. package/dist/core/types/rowHeight.d.ts +1 -1
  141. package/dist/core/types/rowMutation.d.ts +1 -1
  142. package/dist/core/types/rowMutationAsync.d.ts +1 -1
  143. package/dist/core/types/rowNode.d.ts +1 -1
  144. package/dist/core/types/selectionColumn.d.ts +14 -14
  145. package/dist/core/types/selectionColumn.d.ts.map +1 -1
  146. package/dist/core/types/summary.d.ts +1 -1
  147. package/dist/core/types/transaction.d.ts +1 -1
  148. package/dist/core/types/treeTable.d.ts +1 -1
  149. package/dist/core/types/validation.d.ts +1 -1
  150. package/dist/index.cjs.js +5 -5
  151. package/dist/index.cjs.js.map +1 -1
  152. package/dist/index.d.ts +2 -19
  153. package/dist/index.d.ts.map +1 -1
  154. package/dist/index.es.js +3746 -3652
  155. package/dist/index.es.js.map +1 -1
  156. package/dist/style.css +1 -1
  157. package/dist/types/core.cjs.js +0 -0
  158. package/dist/types/core.d.ts +3038 -0
  159. package/dist/types/core.d.ts.map +1 -0
  160. package/dist/types/core.es.js +0 -0
  161. package/dist/types/magic-grid-expose.d.ts +13 -2
  162. package/dist/types/magic-grid-expose.d.ts.map +1 -1
  163. package/dist/types/magic-grid.d.ts +331 -244
  164. package/dist/types/magic-grid.d.ts.map +1 -1
  165. package/dist/types/{statusBar.d.ts → status-bar.d.ts} +7 -1
  166. package/dist/types/status-bar.d.ts.map +1 -0
  167. package/dist/types/validation.cjs.js +0 -0
  168. package/dist/types/validation.d.ts +9 -0
  169. package/dist/types/validation.d.ts.map +1 -0
  170. package/dist/types/validation.es.js +0 -0
  171. package/dist/validation/asyncValidatorAdapter.d.ts +5 -6
  172. package/dist/validation/asyncValidatorAdapter.d.ts.map +1 -1
  173. package/dist/validation/index.d.ts +0 -1
  174. package/dist/validation/index.d.ts.map +1 -1
  175. package/dist/{validation-DWDC_zL7.js → validation-BHqm5Flb.js} +33 -33
  176. package/dist/validation-BHqm5Flb.js.map +1 -0
  177. package/dist/validation-CD6lt5wS.cjs.map +1 -1
  178. package/dist/validation.cjs.js +1 -1
  179. package/dist/validation.es.js +1 -1
  180. package/package.json +13 -2
  181. package/dist/components/cellEditor/useMagicGridCellEditor.d.ts.map +0 -1
  182. package/dist/types/index.d.ts +0 -5
  183. package/dist/types/index.d.ts.map +0 -1
  184. package/dist/types/statusBar.d.ts.map +0 -1
  185. package/dist/validation-DWDC_zL7.js.map +0 -1
package/README.md CHANGED
@@ -5,21 +5,32 @@
5
5
  ## 目录
6
6
 
7
7
  - [概述](#概述)
8
+ - [架构与设计](#架构与设计)
8
9
  - [快速开始](#快速开始)
10
+ - [数据与性能最佳实践](#数据与性能最佳实践)
11
+ - [默认配置](#默认配置)
9
12
  - [Props](#props)
10
13
  - [MagicGrid Props](#magicgrid-props)
11
14
  - [Grid 级默认与列级覆盖](#grid-级默认与列级覆盖)
12
15
  - [ColumnDef 列定义](#columndef-列定义)
16
+ - [列有效性与显隐](#列有效性与显隐)
13
17
  - [Options 类型参考](#options-类型参考)
18
+ - [筛选模型参考](#筛选模型参考)
14
19
  - [Events](#events)
15
20
  - [Expose](#expose)
16
21
  - [Slots](#slots)
22
+ - [单元格编辑](#单元格编辑)
23
+ - [数据校验](#数据校验)
24
+ - [键盘导航与快捷键](#键盘导航与快捷键)
17
25
  - [辅助组件](#辅助组件)
18
26
  - [ColumnSettingsButton](#columnsettingsbutton)
19
27
  - [ColumnSettingsPanel](#columnsettingspanel)
20
28
  - [ColumnSettingsMenuItem](#columnsettingsmenuitem)
21
29
  - [ColumnSettingsMenuIcon](#columnsettingsmenuicon)
22
- - [相关文档](#相关文档)
30
+ - [包入口与导出](#包入口与导出)
31
+ - [TypeScript 集成](#typescript-集成)
32
+ - [类型与校验子路径](#类型与校验子路径)
33
+ - [本地开发与 Playground](#本地开发与-playground)
23
34
 
24
35
  ---
25
36
 
@@ -32,9 +43,12 @@
32
43
  | **性能** | 行/列双轴虚拟化、DOM 池复用、RAF 帧预算分片、增量数据管线 |
33
44
  | **数据** | 排序、列筛选、Quick Filter、事务增量更新(`applyTransaction`)、行 CRUD |
34
45
  | **交互** | 单元格/行编辑、校验、行选择、索引列定位、框选与剪贴板 |
35
- | **布局** | 固定列、列拖拽/调整宽度、合并单元格、动态行高、主从展开行 |
46
+ | **布局** | 固定列、列拖拽/调整宽度、列有效性与显隐(`available` / `hidden`)、合并单元格、动态行高、主从展开行 |
36
47
  | **结构** | 行分组、树形表格(含懒加载)、表尾汇总 |
37
48
  | **体验** | 溢出 Tooltip、单元格批注、空态 Overlay、暗色主题、底部状态栏 |
49
+ | **扩展** | 列设置面板、Vue 第三方编辑器 Composable、inline 常驻编辑器、async-validator 校验 |
50
+
51
+ 当前版本:**0.3.0**(`@taocompany/magic-grid`)。
38
52
 
39
53
  ### 环境要求
40
54
 
@@ -58,6 +72,40 @@ import '@taocompany/magic-grid/style.css'
58
72
 
59
73
  > **ColumnSettingsButton / ColumnSettingsPanel** 与 MagicGrid 共用同一份 `style.css`。按钮或下拉菜单若放在页头工具栏等 **MagicGrid 容器外**,同样必须引入该文件;样式 token 已在 `.mg-column-settings-button` / `.mg-column-settings-portal` 上自带 fallback,脱离 `.magic-grid` 也可正常显示。
60
74
 
75
+
76
+ ---
77
+
78
+ ## 架构与设计
79
+
80
+ Magic Grid 采用 **命令式渲染内核 + Vue 薄封装** 的分层架构,对标 AG Grid 社区版 API 语义,渲染路径针对百万级行数据做了专门优化。
81
+
82
+ ### 分层结构
83
+
84
+ | 层级 | 职责 | 关键模块 |
85
+ |------|------|----------|
86
+ | **Vue 层** | Props / Events / Slots 绑定、主题 CSS 变量、辅助 UI | `MagicGrid.vue`、ColumnSettings、StatusBar |
87
+ | **Grid API** | 命令式数据、列、编辑、选择、框选 | `GridApi` |
88
+ | **渲染引擎** | 双轴虚拟化、行 DOM 池、增量 cell 刷新 | `rowRenderer`、`rowPool` |
89
+ | **数据管线** | 排序 / 筛选 / 分组 / 树形 / 映射 | pipeline stages |
90
+ | **交互层** | 焦点、框选、编辑、拖拽、剪贴板、批注 | `gridInteraction` |
91
+
92
+ ### 渲染模型
93
+
94
+ - **行虚拟化**:仅渲染视口 + `rowBuffer` 缓冲行;行 DOM 在行池内按 `rowKey` 复用,滚动时更新内容与位置。
95
+ - **列布局**:左固定 / 中心 / 右固定三 lane;中心 lane 随横滚分配列宽。
96
+ - **增量更新**:`applyTransaction`、`setData` 走 RowNode 增量管线;`beginUpdate` / `endUpdate` 可合并多次刷新。
97
+ - **帧预算**:大批量 DOM 写入分片到 `requestAnimationFrame`;测试场景可调用 `flushFrames()` 同步 flush。
98
+
99
+ ### 数据管线顺序
100
+
101
+ | 模式 | Stage 顺序 |
102
+ |------|------------|
103
+ | 扁平表格 | `sort` → `filter` → `map` |
104
+ | 行分组 | `group` → `filter` → `sort` → `aggregate` → `map` |
105
+ | 树形表格 | `tree` → `filter` → `sort` → `map` |
106
+
107
+ `summaryScope: 'displayed'`、状态栏行数、框选聚合均基于 `rowsToDisplay`;`summaryScope: 'all'` 对 `sourceRows` 全量汇总(忽略 filter)。
108
+
61
109
  ---
62
110
 
63
111
  ## 快速开始
@@ -66,7 +114,7 @@ import '@taocompany/magic-grid/style.css'
66
114
  <script setup lang="ts">
67
115
  import { ref } from 'vue'
68
116
  import { MagicGrid } from '@taocompany/magic-grid'
69
- import type { ColumnDef, MagicGridExpose, RowData } from '@taocompany/magic-grid'
117
+ import type { ColumnDef, MagicGridExpose, RowData } from '@taocompany/magic-grid/types/core'
70
118
  import '@taocompany/magic-grid/style.css'
71
119
 
72
120
  const gridRef = ref<MagicGridExpose>()
@@ -121,17 +169,250 @@ const columns: ColumnDef[] = [
121
169
  <MagicGrid :columns="columns" :data="data" row-key="id" height="400" />
122
170
  ```
123
171
 
172
+
173
+ ---
174
+
175
+ ## 数据与性能最佳实践
176
+
177
+ ### 行数据
178
+
179
+ - **`data` 使用普通对象数组**,不要对行数据做 `reactive()` 深代理;Grid 内部维护 RowNode,深代理会显著拖慢增量更新。
180
+ - **`rowKey` 必须稳定唯一**(业务主键);临时新增行可省略主键,内核分配 `__mg_tmp_*`,落库后调用 `promoteRowId`。
181
+ - **大批量写入**优先 `applyTransaction` 或 `beginUpdate` / `endUpdate` 包裹多次 API 调用,避免连续 `setData` 全量替换。
182
+
183
+ ### 列定义
184
+
185
+ - 动态列用 `columns` prop 热更新即可;`available: false` 从模型裁剪,`hidden: true` 保留模型仅不渲染。
186
+ - flex 列与固定 `width` 列混用时,剩余空间由 flex 权重分配;`sizeColumnsToFit` / `autoSizeStrategy` 可首屏自适应。
187
+ - 需要权限裁剪时用 `available`,需要用户临时隐藏列时用 `hidden` + 列设置面板。
188
+
189
+ ### 性能提示
190
+
191
+ - 避免在 `cellRenderer` / `formatter` / `valueGetter` 中创建重量级对象或触发外部副作用;这些函数在滚动时会高频调用。
192
+ - 合并单元格(`enableCellSpan`)会启用 `style.top` 行定位并增加 span cache 开销,仅在确有需求时开启。
193
+ - Playground 内置 `getMetrics()` 可观察 `activeDomRowCount`、`lastSetDataMs` 等指标;生产环境可通过 `scroll` / `data-rendered` 事件订阅。
194
+
195
+ ---
196
+
197
+ ## 默认配置
198
+
199
+ 以下为 `<MagicGrid>` **未显式传入 prop** 时的生效值。部分 prop 在组件层与内核层默认不同(标注 **MG** = MagicGrid 组件层覆盖),使用时以组件行为为准。
200
+
201
+ ### 尺寸 preset(`size`)
202
+
203
+ `rowHeight` / `headerHeight` / `statusBarHeight`(`statusBarHeight: 'auto'` 时)未显式传入时,由 `size` 推导:
204
+
205
+ | `size` | 行高 | 表头高 | 状态栏高 | 字号 | 间距 | 圆角(`rounded: true` 时) |
206
+ |--------|------|--------|----------|------|------|---------------------------|
207
+ | `mini` | 20 | 20 | 20 | 12 | 4 | 4 |
208
+ | `small` | 24 | 24 | 24 | 12 | 8 | 8 |
209
+ | `default` | 32 | 32 | 32 | 12 | 8 | 8 |
210
+ | `large` | 40 | 40 | 40 | 14 | 12 | 8 |
211
+
212
+ ### 基础与外观
213
+
214
+ | 配置项 | 默认值 | 说明 |
215
+ |--------|--------|------|
216
+ | `rowKey` | `'id'` | 行主键字段 |
217
+ | `height` / `width` | `'100%'` | 容器尺寸 |
218
+ | `stripe` | `false` | 斑马纹 |
219
+ | `border` | `'border'` | 全网格线 |
220
+ | `theme` | `'light'` | 亮色主题 |
221
+ | `size` | `'default'` | 尺寸 preset |
222
+ | `rounded` | `false` | 无圆角(`0`) |
223
+ | `rowHeight` / `headerHeight` | — | 跟随 `size` preset |
224
+ | `summaryRowHeight` | — | 跟随 `rowHeight` |
225
+
226
+ ### 对齐
227
+
228
+ | 配置项 | 默认值 |
229
+ |--------|--------|
230
+ | `headerAlign` / `headerValign` | `'center'` |
231
+ | `align` / `valign` | `'center'` |
232
+ | `footerAlign` / `footerValign` | `'center'` |
233
+
234
+ ### 虚拟化与导航
235
+
236
+ | 配置项 | 默认值 | 说明 |
237
+ |--------|--------|------|
238
+ | `rowBuffer` | `10` | 行虚拟化缓冲行数 |
239
+ | `navigateHeader` | `false` | 不允许焦点进入表头 |
240
+ | `navigateFooter` | `false` | 不允许焦点进入表尾 |
241
+ | `enableHeaderHighlight` | `true` | 框选时表头列高亮 |
242
+ | `enableIndexColumnHighlight` | `true` | 框选时索引列高亮 |
243
+
244
+ ### 索引列
245
+
246
+ | 配置项 | 默认值 | 说明 |
247
+ |--------|--------|------|
248
+ | `showIndexColumn` | `false` | 不显示索引列 |
249
+ | `indexColumn.label` | `''` | 表头文案 |
250
+ | `indexColumn.width` | `40` | 列宽 px(最小 40) |
251
+ | `indexColumn.start` | `1` | 起始序号 |
252
+ | `indexColumn.focusMode` | `'multiple'` | 辅助定位模式 |
253
+ | `indexColumn.syncToSelectionColumn` | `true` **(MG)** | 索引定位单向同步行选择 |
254
+ | `indexColumn.showRowDragHandle` | `false` | 不显示行拖拽把柄 |
255
+ | `indexColumn.enableRowResizer` | `false` | 不可拖拽调整行高 |
256
+
257
+ ### 行选择
258
+
259
+ | 配置项 | 默认值 | 说明 |
260
+ |--------|--------|------|
261
+ | `rowSelection` | `'single'` | 单选模式 |
262
+ | `selectionColumn.width` | `40` | 列宽 px |
263
+ | `selectionColumn.selectAllLabel` | `'全选'` | 全选 checkbox aria-label |
264
+ | `reserveSelection` | `false` | 数据刷新后不保留选中 |
265
+
266
+ `rowSelection` 对象形式时,`groupSelectsChildren` 默认 `true`(tree 模式父节点级联子孙)。
267
+
268
+ ### 表尾汇总
269
+
270
+ | 配置项 | 默认值 | 说明 |
271
+ |--------|--------|------|
272
+ | `showSummary` | `false` | 不展示汇总行 |
273
+ | `summaryScope` | `'displayed'` | 按当前可见行汇总 |
274
+
275
+ ### 排序 / 筛选 / 列操作
276
+
277
+ | 配置项 | 默认值 | 说明 |
278
+ |--------|--------|------|
279
+ | `sortable` | `false` | 全列默认不可排序 |
280
+ | `filterable` | `false` | 全列默认不可筛选 |
281
+ | `resizable` | `true` | 全列默认可调整列宽 |
282
+ | `columnMovable` | `true` | 全列默认可拖拽重排 |
283
+ | `quickFilterText` | `''` | 无 quick filter |
284
+ | `floatingFilter` | `false` | 无 floating filter 行 |
285
+ | `filterSetValueMode` | `'current'` | 值选择勾选投影模式 |
286
+ | `filterSetDateLayoutMode` | `'tree'` | 日期列值选择树形展示 |
287
+ | `colResizeDefault` | — | 未启用 Shift 邻列补偿 |
288
+ | `skipHeaderOnAutoSize` | `false` | auto-size 含表头宽度 |
289
+ | `autoSizePadding` | `16` | auto-size 额外 padding(px) |
290
+ | `suppressMoveWhenColumnDragging` | `false` | drag 过程中 live move |
291
+ | `suppressColumnMoveAnimation` | `false` | 列移动有过渡动画 |
292
+ | `allowCrossLaneColumnMove` | `false` | 不可跨 fixed lane 移动 |
293
+ | `showUnsortedSortHintOnHover` | `false` | 未排序列 hover 无双三角提示 |
294
+
295
+ ### 编辑
296
+
297
+ | 配置项 | 默认值 | 说明 |
298
+ |--------|--------|------|
299
+ | `editBehavior` | `'cell'` | 单格编辑 |
300
+ | `editType` | `'singleClick'` | 单击进入编辑 |
301
+ | `invalidEditValueMode` | `'block'` | 校验失败保持编辑态 |
302
+
303
+ ### 行拖拽与行高
304
+
305
+ | 配置项 | 默认值 | 说明 |
306
+ |--------|--------|------|
307
+ | `rowDragManaged` | `true` | managed 拖拽实时改序 |
308
+ | `rowDragCommitMode` | `'sync'` | 同步提交 |
309
+ | `rowHeightMin` | — | 跟随 size / rowHeight |
310
+ | `rowHeightMax` | — | 无上限 |
311
+
312
+ ### 合并 / 展开 / 分组 / 树
313
+
314
+ | 配置项 | 默认值 | 说明 |
315
+ |--------|--------|------|
316
+ | `enableCellSpan` | `false` | 不启用单元格合并 |
317
+ | `masterDetail` | `false` | 不启用主从展开 |
318
+ | `masterDefaultExpanded` | `0` | 默认不展开(启用 masterDetail 后) |
319
+ | `detailRowHeight` | `200` | 详情行高度 px |
320
+ | `detailRowAutoHeight` | `false` | 详情行固定高度 |
321
+ | `embedFullWidthRows` | `false` | 详情 overlay 不随横滚 |
322
+ | `showExpandColumn` | `false` | 不展示专用展开列 |
323
+ | `rowGrouping` | `false` | 不启用行分组 |
324
+ | `groupDefaultExpanded` | `-1` | 全部分组默认展开 |
325
+ | `showGroupHeader` / `showGroupFooter` | `false` | 不展示分组头/尾行 |
326
+ | `groupDisplayType` | `'singleColumn'` | 单列分组展示 |
327
+ | `showGroupColumn` | `false` | 不展示 auto group 列 |
328
+ | `tree` | `false` | 不启用树形表格 |
329
+ | `showTreeColumn` | `true` | 展示 tree 系统列(启用 tree 后) |
330
+ | `treeDragScope` | `'siblings'` | 树拖拽仅同层兄弟 |
331
+ | `treeDisplayType` | `'singleColumn'` | 单列树展示 |
332
+ | `treeLazyLoad` | `false` | 不启用懒加载 |
333
+
334
+ ### 批注
335
+
336
+ | 配置项 | 默认值 | 说明 |
337
+ |--------|--------|------|
338
+ | `suppressCellComments` | `false` | 不抑制批注 |
339
+ | `cellCommentTrigger` | `'click'` | 点击角标查看 |
340
+ | `cellCommentShowDelay` | `180` | hover 展示延迟 ms |
341
+ | `cellCommentHideDelay` | `220` | 离开隐藏延迟 ms |
342
+
343
+ ### 框选与剪贴板
344
+
345
+ | 配置项 | 默认值 | 说明 |
346
+ |--------|--------|------|
347
+ | `cellSelection` | `true` **(MG)** | 启用框选(Grid API 直连默认 `false`) |
348
+ | `cellSelection.enableColumnSelection` | `true` **(MG)** | 点击表头选中整列(Grid API 默认 `false`) |
349
+ | `cellSelection.suppressMultiRanges` | `true` | 仅允许单个 range |
350
+ | `cellSelection.handleMode` | `'off'` | 无 Fill/Range 拖拽柄 |
351
+ | `cellSelection.direction` | `'xy'` | fill 方向(handleMode 为 fill 时) |
352
+ | `cellSelection.fillStrategy` | `'copy'` | 填充策略 |
353
+ | `cellSelection.fillReverseStrategy` | `'default'` | 反拖缩小行为 |
354
+ | `enableCellCopy` | `true` | Ctrl+C / 复制 API |
355
+ | `enableCellPaste` | `false` | Ctrl+V / 粘贴 API |
356
+
357
+ ### Tooltip
358
+
359
+ | 配置项 | 默认值 | 说明 |
360
+ |--------|--------|------|
361
+ | `enableTooltips` | `true` | 启用溢出 tooltip |
362
+ | `tooltipShowMode` | `'whenTruncated'` | 仅溢出时展示 |
363
+ | `tooltipShowDelay` | `500` | 首次 hover 延迟 ms |
364
+ | `tooltipSwitchShowDelay` | `200` | 格间切换延迟 ms |
365
+ | `tooltipHideDelay` | `3000` | 离开后隐藏延迟 ms |
366
+ | `tooltipInteraction` | `false` | tooltip 不可交互 |
367
+ | `tooltipMouseTrack` | `false` | tooltip 不跟随鼠标 |
368
+
369
+ ### 空态 Overlay
370
+
371
+ | 配置项 | 默认值 | 说明 |
372
+ |--------|--------|------|
373
+ | `loading` | `undefined` | 挂载后首次 `setData` 前自动 loading |
374
+ | `overlayInteraction` | `false` | overlay 内容不可交互 |
375
+
376
+ ### 状态栏
377
+
378
+ | 配置项 | 默认值 | 说明 |
379
+ |--------|--------|------|
380
+ | `showStatusBar` | `true` | 显示底部状态栏 |
381
+ | `showDefaultStatusBarPanels` | `true` | 显示默认左侧面板 |
382
+ | `statusBarHeight` | `'auto'` | 跟随 size preset |
383
+ | `showStatusBarRangeAggregation` | `true` | 框选时展示聚合 |
384
+ | `statusBarRangeAggregationPosition` | `'right'` | 聚合 panel 在右栏 |
385
+ | `statusBarRangeAggregationPrecision` | `2` | 平均值/求和各 2 位小数 |
386
+
387
+ ### ColumnDef 列级默认
388
+
389
+ | 字段 | 默认值 | 说明 |
390
+ |------|--------|------|
391
+ | `available` | `true` | 列有效;`false` 时不进入列模型(表格中无此列) |
392
+ | `hidden` | `false` | 列可见;`true` 时仍在列模型中但不渲染(可 API/菜单恢复) |
393
+ | `sortable` / `filterable` | 继承 Grid 级(默认 `false`) | 列级显式配置优先 |
394
+ | `resizable` / `movable` | 继承 Grid 级(默认 `true`) | 列级显式配置优先 |
395
+ | `filterType` | `'text'` | 文本筛选 |
396
+ | `cellEditorMode` | `'overlay'` | 编辑 overlay 呈现 |
397
+ | `editType` | 继承 Grid 级 | — |
398
+ | `useParserForClipboard` | `true` | 粘贴走 valueParser |
399
+ | `useFormatterForClipboard` | `true` | 复制走 formatter |
400
+ | `summary` | 有 `summaryAgg` 时为 `true` | 否则 `false` |
401
+ | 对齐字段 | `'center'` | header / body / footer |
402
+
124
403
  ---
125
404
 
126
405
  ## Props
127
406
 
407
+ > 各 prop 的默认值汇总见上一节 [默认配置](#默认配置)。下列按功能分组逐项说明类型、默认值与行为。
408
+
128
409
  ### MagicGrid Props
129
410
 
130
411
  #### 基础
131
412
 
132
413
  | Prop | 类型 | 默认值 | 说明 |
133
414
  |------|------|--------|------|
134
- | `columns` | `ColumnDef[]` | — | **必填**。列定义数组 |
415
+ | `columns` | `ColumnDef[]` | — | **必填**。列定义数组;`available: false` 的项仍可在 prop 中保留,但不会进入 Grid 列模型 |
135
416
  | `data` | `RowData[]` | — | **必填**。行数据(普通对象,禁止 reactive 深代理) |
136
417
  | `rowKey` | `string` | `'id'` | 行主键字段名,用于行池复用与增量更新 |
137
418
  | `height` | `string \| number` | `'100%'` | 容器高度 |
@@ -190,7 +471,7 @@ const columns: ColumnDef[] = [
190
471
  | `index` | `(rowIndex) => number \| string` | — | 自定义序号展示 |
191
472
  | `showRowDragHandle` | `boolean` | `false` | 在索引列显示行拖拽把柄 |
192
473
  | `enableRowResizer` | `boolean` | `false` | 索引列底边可拖拽调整行高 |
193
- | `headerAlign` / `headerValign` / `align` / `valign` / `footerAlign` / `footerValign` | 对齐枚举 | `'center'` | 对齐配置 |
474
+ | `headerAlign` / `headerValign` / `align` / `valign` / `footerAlign` / `footerValign` | `GridHorizontalAlign` / `GridVerticalAlign` | `'center'` | 对齐配置 |
194
475
 
195
476
  #### 行选择
196
477
 
@@ -218,7 +499,7 @@ interface RowSelectionConfig {
218
499
  | `width` | `number` | `40` | 列宽 px(最小 40) |
219
500
  | `selectAllLabel` | `string` | `'全选'` | 表头全选 checkbox 的 aria-label |
220
501
  | `rowLabel` | `(rowIndex) => string` | — | 行 checkbox 的 aria-label 工厂 |
221
- | `headerAlign` / `headerValign` / `align` / `valign` / `footerAlign` / `footerValign` | 对齐枚举 | `'center'` | 对齐配置 |
502
+ | `headerAlign` / `headerValign` / `align` / `valign` / `footerAlign` / `footerValign` | `GridHorizontalAlign` / `GridVerticalAlign` | `'center'` | 对齐配置 |
222
503
 
223
504
  #### 表尾汇总
224
505
 
@@ -265,7 +546,7 @@ interface RowSelectionConfig {
265
546
 
266
547
  | Prop | 类型 | 默认值 | 说明 |
267
548
  |------|------|--------|------|
268
- | `editMode` | `'cell' \| 'row'` | `'cell'` | 编辑范围:单格 / 整行 |
549
+ | `editBehavior` | `CellEditBehavior` | `'cell'` | 编辑范围:单格 / 整行 |
269
550
  | `editType` | `CellEditType` | `'singleClick'` | 进入编辑态的触发方式 |
270
551
  | `invalidEditValueMode` | `'block' \| 'revert' \| 'keep'` | `'block'` | 校验失败后:`block` 保持编辑;`revert` 退出并恢复旧值;`keep` 退出编辑但保留无效值 |
271
552
  | `rowValidator` | `RowValidator` | — | 行编辑跨字段校验 |
@@ -349,10 +630,9 @@ interface RowSelectionConfig {
349
630
 
350
631
  | Prop | 类型 | 默认值 | 说明 |
351
632
  |------|------|--------|------|
352
- | `cellSelection` | `boolean \| CellSelectionOptions` | `true` | 单元格框选;MagicGrid 默认开启、`enableColumnSelection` 为 `true`、`handle` 为 off;Grid API 未传时默认关闭 |
633
+ | `cellSelection` | `boolean \| CellSelectionOptions` | `true` | 单元格框选;MagicGrid 默认开启、`enableColumnSelection` 为 `true`、`handleMode` 为 off;Grid API 未传时默认关闭 |
353
634
  | `enableCellCopy` | `boolean` | `true` | Ctrl+C / `copySelectedRangeToClipboard` |
354
635
  | `enableCellPaste` | `boolean` | `false` | Ctrl+V / `pasteFromClipboard` |
355
- | `enableCellClipboard` | `boolean` | — | **已废弃**;未单独指定 copy/paste 时二者均继承本值 |
356
636
  | `processCellForClipboard` | `ProcessCellForClipboardFn` | — | 复制单格时自定义导出值 |
357
637
  | `processCellFromClipboard` | `ProcessCellFromClipboardFn` | — | 粘贴单格时预处理 clipboard 字符串 |
358
638
  | `processDataFromClipboard` | `ProcessDataFromClipboardFn` | — | 整表粘贴前处理 TSV 矩阵;return null 取消粘贴 |
@@ -363,21 +643,21 @@ interface RowSelectionConfig {
363
643
  |------|------|--------|------|
364
644
  | `suppressMultiRanges` | `boolean` | `true` | `true` 时仅允许单个 range |
365
645
  | `enableColumnSelection` | `boolean` | MagicGrid `true` / Grid API `false` | 点击表头选中整列 |
366
- | `handle` | `FillHandleOptions \| RangeHandleOptions` | | Fill Range 拖拽柄;MagicGrid / Grid API 缺省均为 off |
367
-
368
- `FillHandleOptions`(`handle: { mode: 'fill', ... }`):
369
-
370
- | 字段 | 类型 | 默认值 | 说明 |
371
- |------|------|--------|------|
372
- | `mode` | `'fill'` | — | **必填** |
373
- | `direction` | `'x' \| 'y' \| 'xy'` | `'xy'` | 填充方向 |
646
+ | `handleMode` | `'off' \| 'fill' \| 'range'` | `'off'` | Fill / Range 拖拽柄 |
647
+ | `direction` | `'x' \| 'y' \| 'xy'` | `'xy'` | `handleMode: 'fill'` 时填充方向 |
374
648
  | `fillStrategy` | `'auto' \| 'copy'` | `'copy'` | `'auto'`:数字递增、非数字复制;`'copy'`:始终复制源边值 |
375
649
  | `fillReverseStrategy` | `'default' \| 'clear'` | `'default'` | 反拖缩小时:`'default'` 不处理;`'clear'` 置空缩出初始选区的格 |
376
650
  | `setFillValue` | `(params: FillOperationParams) => unknown` | — | 自定义填充值;缺省按 `fillStrategy` |
377
651
 
378
- `RangeHandleOptions`(`handle: { mode: 'range' }`):仅含 `mode: 'range'`,用于右下角拖拽扩展选区。
652
+ `FillOperationParams`:`{ rowNode, column, baseValue, step, direction }`。
653
+
654
+ 框选行为要点:
379
655
 
380
- > 框选详细行为见 [`docs/35-phase24-cell-range-selection.md`](docs/35-phase24-cell-range-selection.md)
656
+ - 鼠标拖拽或 Shift+方向键扩展选区;`suppressMultiRanges: true` 时仅保留单个 range。
657
+ - `enableColumnSelection: true` 时点击表头选中整列;MagicGrid 默认开启。
658
+ - `handleMode: 'fill'` 启用填充柄;`'range'` 启用范围扩展柄;`'off'` 无柄(MagicGrid 默认)。
659
+ - Delete 键清空选区内可编辑格,触发 `cell-selection-delete-start` / `cell-selection-delete-end`。
660
+ - Ctrl+C / `copySelectedRangeToClipboard` 复制 TSV;Ctrl+V / `pasteFromClipboard` 粘贴(需 `enableCellPaste: true`)。
381
661
 
382
662
  #### Tooltip
383
663
 
@@ -420,8 +700,10 @@ interface RowSelectionConfig {
420
700
  | Prop | 类型 | 默认值 | 说明 |
421
701
  |------|------|--------|------|
422
702
  | `showStatusBar` | `boolean` | `true` | 是否显示底部状态栏 |
703
+ | `statusBarHeight` | `'auto' \| number` | `'auto'` | 状态栏高度;`auto` 跟随 size preset |
423
704
  | `showDefaultStatusBarPanels` | `boolean` | `true` | 显示默认状态栏左侧面板(行数/筛选态/选中数);`false` 时仍可自定义 `#status-bar-left` |
424
705
  | `showStatusBarRangeAggregation` | `boolean` | `true` | 框选时在状态栏展示平均值/计数/求和 |
706
+ | `statusBarRangeAggregationPosition` | `'left' \| 'right'` | `'right'` | 框选聚合 panel 位置(左栏/右栏内侧) |
425
707
  | `statusBarRangeAggregationPrecision` | `number \| { average?: number; sum?: number }` | `2` | 平均值/求和展示小数位数 |
426
708
 
427
709
  #### Grid 级默认与列级覆盖
@@ -465,7 +747,48 @@ interface RowSelectionConfig {
465
747
  | `key` | `string` | 列唯一标识(colId),缺省等于 `prop` |
466
748
  | `prop` | `string` | 数据字段 |
467
749
  | `label` | `string` | 表头文案 |
468
- | `hidden` | `boolean` | 是否隐藏该列(不渲染、不参与布局);默认 `false` |
750
+
751
+ #### 列有效性与显隐
752
+
753
+ 通过 `available` 与 `hidden` 控制列是否参与表格。二者均可在 `columns` prop 中动态修改;Grid 会重解析列模型并刷新布局。
754
+
755
+ | 字段 | 类型 | 默认 | 说明 |
756
+ |------|------|------|------|
757
+ | `available` | `boolean` | `true` | `false` 时该列**不存在于表格**(解析前从列模型裁剪 · 不参与布局/DOM · 无 `setColumnsHidden`) |
758
+ | `hidden` | `boolean` | `false` | `true` 时列**仍在列模型**中,仅不渲染(可通过 `setColumnsHidden` / 列菜单 / 列设置面板恢复) |
759
+
760
+ **语义对照**:
761
+
762
+ | | `available: false` | `hidden: true` |
763
+ |---|-------------------|----------------|
764
+ | `getColumns()` | **不含**该列 | **含**该列 |
765
+ | `getDisplayedColumns()` | **不含** | **不含** |
766
+ | DOM / 布局 | 不参与 | 不参与 |
767
+ | `setColumnsHidden` | 不适用(列不在模型中) | 可恢复显示 |
768
+ | sort / filter 模型 | 不应再引用该 colId | 仍可保留 · 表头无 UI |
769
+ | 列设置面板 | 不出现(未注册进模型) | 出现在「隐藏」分组 |
770
+ | 典型用途 | 按权限/场景裁剪列定义 | 用户临时隐藏列 |
771
+
772
+ ```ts
773
+ const columns: ColumnDef[] = [
774
+ { prop: 'name', label: '名称' },
775
+ // 表格中完全没有这一列(行数据字段可保留)
776
+ { prop: 'internalCode', label: '内部编码', available: false },
777
+ // 列仍在模型中,默认隐藏,API/菜单可恢复
778
+ { prop: 'note', label: '备注', hidden: true },
779
+ ]
780
+
781
+ // hidden 列:全量 vs 展示
782
+ api.getColumns().map((c) => c.colId) // 含 note
783
+ api.getDisplayedColumnIds() // 不含 note(除非已显示)
784
+
785
+ // available: false 的列不在 getColumns() 中
786
+ api.getColumns().some((c) => c.colId === 'internalCode') // false
787
+ ```
788
+
789
+ 修改 `columns` 中某列的 `available` 或 `hidden` 后,Grid 会走 `setColumns` 重解析。`hidden` 在 `columnDefs` 未改 `hidden` 声明时,会保留运行时 API/菜单设置的值(与 Phase 22 列显隐语义一致)。
790
+
791
+ Playground 验收:开发环境 `/phase22` · **T14–T15**(`legacyToken` 列可切换 `available`)。
469
792
 
470
793
  #### 尺寸
471
794
 
@@ -556,9 +879,9 @@ interface RowSelectionConfig {
556
879
 
557
880
  | 字段 | 类型 | 说明 |
558
881
  |------|------|------|
559
- | `headerAlign` / `headerValign` | 对齐枚举 | 表头对齐;默认 `center` |
560
- | `align` / `valign` | 对齐枚举 | 表体对齐;默认 `center` |
561
- | `footerAlign` / `footerValign` | 对齐枚举 | 表尾对齐;默认 `center` |
882
+ | `headerAlign` / `headerValign` | `GridHorizontalAlign` / `GridVerticalAlign` | 表头对齐;默认 `center` |
883
+ | `align` / `valign` | `GridHorizontalAlign` / `GridVerticalAlign` | 表体对齐;默认 `center` |
884
+ | `footerAlign` / `footerValign` | `GridHorizontalAlign` / `GridVerticalAlign` | 表尾对齐;默认 `center` |
562
885
 
563
886
  #### 禁用与样式
564
887
 
@@ -601,7 +924,7 @@ interface RowSelectionConfig {
601
924
  | `index` | `(rowIndex) => number \| string` | — | 自定义序号展示 |
602
925
  | `showRowDragHandle` | `boolean` | `false` | 在索引列显示行拖拽把柄 |
603
926
  | `enableRowResizer` | `boolean` | `false` | 索引列底边可拖拽调整行高 |
604
- | `headerAlign` / `headerValign` / `align` / `valign` / `footerAlign` / `footerValign` | 对齐枚举 | `'center'` | 对齐配置 |
927
+ | `headerAlign` / `headerValign` / `align` / `valign` / `footerAlign` / `footerValign` | `GridHorizontalAlign` / `GridVerticalAlign` | `'center'` | 对齐配置 |
605
928
 
606
929
  ### SelectionColumnOptions
607
930
 
@@ -612,7 +935,7 @@ interface RowSelectionConfig {
612
935
  | `width` | `number` | `40` | 列宽 px(最小 40) |
613
936
  | `selectAllLabel` | `string` | `'全选'` | 表头全选 checkbox 的 aria-label |
614
937
  | `rowLabel` | `(rowIndex) => string` | — | 行 checkbox 的 aria-label 工厂 |
615
- | `headerAlign` / `headerValign` / `align` / `valign` / `footerAlign` / `footerValign` | 对齐枚举 | `'center'` | 对齐配置 |
938
+ | `headerAlign` / `headerValign` / `align` / `valign` / `footerAlign` / `footerValign` | `GridHorizontalAlign` / `GridVerticalAlign` | `'center'` | 对齐配置 |
616
939
 
617
940
  ### RowSelectionConfig
618
941
 
@@ -634,21 +957,14 @@ interface RowSelectionConfig {
634
957
  |------|------|--------|------|
635
958
  | `suppressMultiRanges` | `boolean` | `true` | 仅允许单个 range |
636
959
  | `enableColumnSelection` | `boolean` | MagicGrid `true` / Grid API `false` | 点击表头选中整列 |
637
- | `handle` | `FillHandleOptions \| RangeHandleOptions` | | Fill / Range 拖拽柄;缺省 off |
638
-
639
- **FillHandleOptions**(`mode: 'fill'`):
640
-
641
- | 字段 | 类型 | 默认值 | 说明 |
642
- |------|------|--------|------|
643
- | `direction` | `'x' \| 'y' \| 'xy'` | `'xy'` | 填充方向 |
960
+ | `handleMode` | `'off' \| 'fill' \| 'range'` | `'off'` | Fill / Range 拖拽柄 |
961
+ | `direction` | `'x' \| 'y' \| 'xy'` | `'xy'` | `handleMode: 'fill'` 时填充方向 |
644
962
  | `fillStrategy` | `'auto' \| 'copy'` | `'copy'` | 数字递增策略 |
645
963
  | `fillReverseStrategy` | `'default' \| 'clear'` | `'default'` | 反拖缩小行为 |
646
964
  | `setFillValue` | `(params: FillOperationParams) => unknown` | — | 自定义填充值 |
647
965
 
648
966
  `FillOperationParams`:`{ rowNode, column, baseValue, step, direction }`。
649
967
 
650
- **RangeHandleOptions**:`{ mode: 'range' }`,右下角拖拽扩展选区。
651
-
652
968
  **CellRange**(`addCellRange` / `getCellRanges` 返回值):
653
969
 
654
970
  ```ts
@@ -896,124 +1212,458 @@ type StatusBarRangeAggregationPrecisionInput =
896
1212
 
897
1213
  **ProcessDataFromClipboardParams**:`{ data: string[][], anchor: CellPosition }`,其中 `anchor` 为 `{ rowIndex, colId }`。
898
1214
 
1215
+
1216
+ ---
1217
+
1218
+ ## 筛选模型参考
1219
+
1220
+ 筛选状态由 `FilterModel` 表示:`Record<colId, FilterCondition>`。通过 `setFilterModel` / `getFilterModel` / `filter-changed` 事件读写。
1221
+
1222
+ ### ColumnFilter(内置 UI / API 通用)
1223
+
1224
+ 单列条件结构(`filterType` 决定可用算子):
1225
+
1226
+ ```ts
1227
+ interface ColumnFilter {
1228
+ type: FilterType // 算子,见下表
1229
+ filter?: string // 主比较值(文本 / 数字 / ISO 日期字符串)
1230
+ filterTo?: string // date inRange 第二端点
1231
+ operator?: 'AND' | 'OR' // 多条件组合,默认 AND
1232
+ conditions?: ColumnFilterOperatorCondition[] // 多条件列表,存在时优先于顶层 type/filter
1233
+ setValues?: string[] // 值选择:选中 key;缺省 = 全选(不约束)
1234
+ }
1235
+ ```
1236
+
1237
+ **文本列**(`filterType: 'text'`,默认)算子:
1238
+
1239
+ | type | 说明 |
1240
+ |------|------|
1241
+ | `contains` / `notContains` | 包含 / 不包含 |
1242
+ | `equals` / `notEqual` | 等于 / 不等于 |
1243
+ | `startsWith` / `endsWith` | 前缀 / 后缀 |
1244
+ | `blank` / `notBlank` | 空 / 非空 |
1245
+
1246
+ **数字列**(`filterType: 'number'`)额外支持:`lessThan`、`lessThanOrEqual`、`greaterThan`、`greaterThanOrEqual`。
1247
+
1248
+ **日期列**(`filterType: 'date'`)v1 使用 ISO 文本(如 `2026-08-07`);支持 `inRange`(需 `filter` + `filterTo`)。
1249
+
1250
+ **值选择(set filter)**:表头 filter 面板勾选 distinct 值时写入 `setValues`;`filterSetValueMode: 'current'`(默认)在搜索时投影当前可见勾选,`'reserve'` 保留历史勾选。
1251
+
1252
+ **Quick Filter**:Grid 级 `quickFilterText` 对全部 `filterable` 用户列做 OR 式 `contains`(不走 ColumnFilter 结构)。
1253
+
1254
+ ### CustomColumnFilter(编程式)
1255
+
1256
+ ```ts
1257
+ interface CustomColumnFilter {
1258
+ predicate: (value: unknown, row: RowData) => boolean
1259
+ }
1260
+ ```
1261
+
1262
+ 通过 `setColumnFilter(colId, { predicate: ... })` 设置;`getColumnFilter` 可读回。与内置 UI 筛选可并存(同一 colId 以后写入者为准)。
1263
+
1264
+ ### 示例
1265
+
1266
+ ```ts
1267
+ // 单列文本 contains
1268
+ api.setColumnFilter('name', { type: 'contains', filter: '张' })
1269
+
1270
+ // 数字 greaterThanOrEqual
1271
+ api.setColumnFilter('amount', { type: 'greaterThanOrEqual', filter: '1000' })
1272
+
1273
+ // 多条件 AND
1274
+ api.setColumnFilter('status', {
1275
+ operator: 'AND',
1276
+ conditions: [
1277
+ { type: 'notEqual', filter: 'draft' },
1278
+ { type: 'notEqual', filter: 'archived' },
1279
+ ],
1280
+ })
1281
+
1282
+ // 清除单列
1283
+ api.setColumnFilter('name', null)
1284
+
1285
+ // 清除全部(含 quick filter)
1286
+ api.clearAllFilters()
1287
+ ```
1288
+
1289
+ ---
1290
+
899
1291
  ---
900
1292
 
901
1293
  ## Events
902
1294
 
903
- MagicGrid 通过 Vue 事件向外暴露 Grid 内核事件。事件名采用 kebab-case
1295
+ MagicGrid 通过 Vue 事件向外暴露 Grid 内核事件。事件名采用 **kebab-case**。除 Vue 事件外,也可通过 `gridRef.api.on(...)` 订阅 camelCase 内核事件(见 [Expose](#expose))。
904
1296
 
905
1297
  ### 渲染与滚动
906
1298
 
907
- | 事件 | payload | 说明 |
908
- |------|----------|------|
909
- | `scroll` | `GridMetrics` | 滚动后触发(含 scrollTop、可见行范围等) |
910
- | `data-rendered` | `GridMetrics` | 数据渲染完成后触发 |
1299
+ #### `scroll`
1300
+
1301
+ 滚动后触发,payload `GridMetrics`:
1302
+
1303
+ | 字段 | 类型 | 说明 |
1304
+ |------|------|------|
1305
+ | `rowCount` | `number` | 过滤后显示行数 |
1306
+ | `sourceRowCount` | `number` | 源数据总行数 |
1307
+ | `columnCount` | `number` | 列数 |
1308
+ | `activeDomRowCount` | `number` | 行池活跃 DOM 行数 |
1309
+ | `domCellCount` | `number` | 表体单元格 DOM 数 |
1310
+ | `scrollTop` / `scrollLeft` | `number` | 当前滚动位置(px) |
1311
+ | `totalHeight` / `totalWidth` | `number` | 内容区总尺寸(px) |
1312
+ | `renderedFirstRow` / `renderedLastRow` | `number` | 渲染窗口行下标范围 |
1313
+ | `renderedFirstCol` / `renderedLastCol` | `number` | 渲染窗口列下标范围 |
1314
+ | `lastSetDataMs` | `number` | 最近一次 setData 耗时(ms) |
1315
+
1316
+ #### `data-rendered`
1317
+
1318
+ 数据渲染完成后触发,payload 同 `GridMetrics`。
911
1319
 
912
1320
  ### 交互
913
1321
 
914
- | 事件 | payload | 说明 |
915
- |------|---------|------|
916
- | `cell-clicked` | `CellClickedEvent` | 单元格点击 |
917
- | `row-click` | `RowClickedEvent` | 行点击 |
918
- | `row-dblclick` | `RowDoubleClickedEvent` | 行双击 |
919
- | `selection-changed` | `SelectionChangedEvent` | 行选择变更;含 `selectedRowIds` |
920
- | `index-focus-changed` | `IndexFocusChangedEvent` | 索引列辅助定位变更 |
1322
+ #### `cell-clicked`
1323
+
1324
+ payload `CellClickedEvent`:
1325
+
1326
+ | 字段 | 类型 | 说明 |
1327
+ |------|------|------|
1328
+ | `rowId` | `BusinessRowId` | id |
1329
+ | `colId` | `string` | 列 id |
1330
+ | `rowIndex` | `number` | `rowsToDisplay` 中的行下标 |
1331
+ | `rowNode` | `RowNode` | 行节点快照 |
1332
+
1333
+ #### `row-click` / `row-dblclick`
1334
+
1335
+ payload 为 `RowClickedEvent` / `RowDoubleClickedEvent`:
1336
+
1337
+ | 字段 | 类型 | 说明 |
1338
+ |------|------|------|
1339
+ | `rowId` | `BusinessRowId` | 行 id |
1340
+ | `rowIndex` | `number` | 行下标 |
1341
+ | `rowNode` | `RowNode` | 行节点快照 |
1342
+ | `colId` | `string` | 触发点击/双击的列 id |
1343
+
1344
+ > 不含分组头行、详情行、表尾汇总行。
1345
+
1346
+ #### `selection-changed`
1347
+
1348
+ payload 为 `SelectionChangedEvent`:
1349
+
1350
+ | 字段 | 类型 | 说明 |
1351
+ |------|------|------|
1352
+ | `selectedRowIds` | `BusinessRowId[]` | 当前 checkbox 选中的行 id 列表 |
1353
+
1354
+ #### `index-focus-changed`
1355
+
1356
+ payload 为 `IndexFocusChangedEvent`:
1357
+
1358
+ | 字段 | 类型 | 说明 |
1359
+ |------|------|------|
1360
+ | `focusedRowIds` | `BusinessRowId[]` | 索引列辅助定位的行 id 列表 |
921
1361
 
922
1362
  ### 编辑
923
1363
 
924
- | 事件 | payload | 说明 |
925
- |------|---------|------|
926
- | `cell-editing-started` | `CellEditingStartedEvent` | 单元格进入编辑态 |
927
- | `cell-editing-stopped` | `CellEditingStoppedEvent` | 单元格退出编辑态 |
928
- | `cell-value-changed` | `CellValueChangedEvent` | 单元格值已提交变更 |
929
- | `cell-commit-started` | `CellCommitStartedEvent` | 单元格异步提交开始 |
930
- | `cell-commit-finished` | `CellCommitFinishedEvent` | 单元格异步提交完成 |
931
- | `edit-commit-aborted` | `EditCommitAbortedEvent` | 异步提交被中断 |
932
- | `row-editing-started` | `RowEditingStartedEvent` | 行进入编辑态 |
933
- | `row-editing-stopped` | `RowEditingStoppedEvent` | 行退出编辑态 |
934
- | `row-value-changed` | `RowValueChangedEvent` | 行编辑整行提交 |
935
- | `row-commit-started` | `RowCommitStartedEvent` | 行异步提交开始 |
936
- | `row-commit-finished` | `RowCommitFinishedEvent` | 行异步提交完成 |
1364
+ #### `cell-editing-started`
1365
+
1366
+ | 字段 | 类型 | 说明 |
1367
+ |------|------|------|
1368
+ | `rowId` | `BusinessRowId` | id |
1369
+ | `colId` | `string` | id |
1370
+ | `rowIndex` | `number` | 行下标 |
1371
+ | `value` | `unknown` | 进入编辑时的值 |
1372
+
1373
+ #### `cell-editing-stopped`
1374
+
1375
+ | 字段 | 类型 | 说明 |
1376
+ |------|------|------|
1377
+ | `rowId` / `colId` / `rowIndex` | — | 格位置 |
1378
+ | `committed` | `boolean` | 是否成功提交 |
1379
+ | `oldValue` / `newValue` | `unknown` | 编辑前后值 |
1380
+
1381
+ #### `cell-value-changed`
1382
+
1383
+ | 字段 | 类型 | 说明 |
1384
+ |------|------|------|
1385
+ | `rowId` / `colId` | — | 格位置 |
1386
+ | `oldValue` / `newValue` | `unknown` | 变更前后值 |
1387
+ | `rowNode` | `RowNode` | 行节点快照 |
1388
+
1389
+ #### `cell-commit-started` / `cell-commit-finished`
1390
+
1391
+ 异步提交生命周期:
1392
+
1393
+ | 字段 | 类型 | 说明 |
1394
+ |------|------|------|
1395
+ | `rowId` / `colId` / `rowIndex` | — | 格位置 |
1396
+ | `committed` | `boolean` | (finished)是否成功提交 |
1397
+ | `aborted` | `boolean` | (finished)是否被中断 |
1398
+
1399
+ #### `edit-commit-aborted`
1400
+
1401
+ | 字段 | 类型 | 说明 |
1402
+ |------|------|------|
1403
+ | `rowId` / `colId` / `rowIndex` | 可选 | 被中断的编辑格 |
1404
+
1405
+ #### `row-editing-started`
1406
+
1407
+ | 字段 | 类型 | 说明 |
1408
+ |------|------|------|
1409
+ | `rowId` / `rowIndex` | — | 行位置 |
1410
+ | `editableColIds` | `string[]` | 该行可编辑列 id 列表 |
1411
+
1412
+ #### `row-editing-stopped`
1413
+
1414
+ | 字段 | 类型 | 说明 |
1415
+ |------|------|------|
1416
+ | `rowId` / `rowIndex` | — | 行位置 |
1417
+ | `committed` | `boolean` | 是否成功提交 |
1418
+ | `changes` | `RowEditChange[]` | 变更列列表(`colId` / `oldValue` / `newValue`) |
1419
+
1420
+ #### `row-value-changed`
1421
+
1422
+ | 字段 | 类型 | 说明 |
1423
+ |------|------|------|
1424
+ | `rowId` / `rowIndex` | — | 行位置 |
1425
+ | `rowNode` | `RowNode` | 行节点快照 |
1426
+ | `data` | `RowData` | 提交后的行数据 |
1427
+ | `changes` | `RowEditChange[]` | 变更列列表 |
1428
+
1429
+ #### `row-commit-started` / `row-commit-finished`
1430
+
1431
+ 行级异步提交,字段语义同单元格 commit 事件。
937
1432
 
938
1433
  ### 校验
939
1434
 
940
- | 事件 | payload | 说明 |
941
- |------|---------|------|
942
- | `cell-validation-failed` | `CellValidationFailedEvent` | 单元格校验失败 |
943
- | `row-validation-failed` | `RowValidationFailedEvent` | 行校验失败 |
1435
+ #### `cell-validation-failed`
1436
+
1437
+ | 字段 | 类型 | 说明 |
1438
+ |------|------|------|
1439
+ | `rowId` / `colId` / `rowIndex` | — | 格位置 |
1440
+ | `errors` | `string[]` | 错误消息列表 |
1441
+ | `mode` | `'block' \| 'revert' \| 'keep'` | 当前 `invalidEditValueMode` |
1442
+
1443
+ #### `row-validation-failed`
1444
+
1445
+ | 字段 | 类型 | 说明 |
1446
+ |------|------|------|
1447
+ | `rowId` / `rowIndex` | — | 行位置 |
1448
+ | `failedColId` | `string` | 首个失败列 id |
1449
+ | `cellErrors` | `{ colId, errors }[]` | 各列错误(可选) |
1450
+ | `rowErrors` | `string[]` | 行级校验错误(可选) |
1451
+ | `mode` | `'block' \| 'revert' \| 'keep'` | 当前 invalid 模式 |
944
1452
 
945
1453
  ### 排序与筛选
946
1454
 
947
- | 事件 | payload | 说明 |
948
- |------|---------|------|
949
- | `sort-changed` | `SortModelItem[]` | 排序模型变更 |
950
- | `filter-changed` | `FilterModel` | 筛选模型变更 |
1455
+ #### `sort-changed`
1456
+
1457
+ payload `SortModelItem[]`(v1 至多 1 项):
1458
+
1459
+ | 字段 | 类型 | 说明 |
1460
+ |------|------|------|
1461
+ | `colId` | `string` | 排序列 id |
1462
+ | `sort` | `'asc' \| 'desc'` | 排序方向 |
1463
+
1464
+ #### `filter-changed`
1465
+
1466
+ payload 为 `FilterModel`(`Record<colId, FilterCondition>`)。各列条件结构因 `filterType` 而异(text / number / date / set / custom)。
951
1467
 
952
1468
  ### 列
953
1469
 
954
- | 事件 | payload | 说明 |
955
- |------|---------|------|
956
- | `column-moved` | `ColumnMovedEvent` | 列拖拽重排完成 |
957
- | `column-resized` | `ColumnResizedEvent` | 列宽调整 |
958
- | `column-pinned` | `ColumnPinnedEvent` | 列固定状态变更 |
959
- | `column-hidden-changed` | `ColumnHiddenChangedEvent` | 列显隐变更 |
1470
+ #### `column-moved`
1471
+
1472
+ | 字段 | 类型 | 说明 |
1473
+ |------|------|------|
1474
+ | `columnOrder` | `string[]` | 移动后的完整 colId 顺序(含系统列) |
1475
+ | `fromColId` | `string` | 被移动列 id |
1476
+ | `toIndex` | `number` | 目标全局下标 |
1477
+ | `finished` | `boolean` | `false` = drag 中 live move;`true` = mouseup 最终提交 |
1478
+ | `toFixed` | `'left' \| 'right' \| null` | 跨 lane 时移动列的新 fixed(lane 内省略) |
1479
+
1480
+ #### `column-resized`
1481
+
1482
+ | 字段 | 类型 | 说明 |
1483
+ |------|------|------|
1484
+ | `columns` | `{ colId, width }[]` | 本次宽度变化的列 |
1485
+ | `column` | `{ colId, width } \| null` | 仅单列变化时的便捷引用 |
1486
+ | `finished` | `boolean` | 拖拽过程 / 最终提交 |
1487
+ | `flexColumns` | `{ colId, width }[] \| null` | flex 被动调整的列 |
1488
+ | `source` | `ColumnResizeSource` | 触发来源(ui / api / autosize 等) |
1489
+
1490
+ #### `column-pinned`
1491
+
1492
+ | 字段 | 类型 | 说明 |
1493
+ |------|------|------|
1494
+ | `colId` | `string` | 列 id |
1495
+ | `pinned` | `'left' \| 'right' \| null` | 新的 fixed 状态 |
1496
+ | `source` | `string` | 变更来源 |
1497
+
1498
+ #### `column-hidden-changed`
1499
+
1500
+ 批量列显隐变更(**仅 `hidden` 列** · 不对 `available: false` 列触发)。
1501
+
1502
+ | 字段 | 类型 | 说明 |
1503
+ |------|------|------|
1504
+ | `colIds` | `string[]` | 受影响的列 id |
1505
+ | `hidden` | `boolean` | 新的 hidden 状态 |
1506
+ | `source` | `'api' \| 'columnDefs' \| 'menu'` | 变更来源 |
960
1507
 
961
1508
  ### 行 CRUD 与拖拽
962
1509
 
963
- | 事件 | payload | 说明 |
964
- |------|---------|------|
965
- | `rows-added` | `RowsAddedEvent` | 行新增 |
966
- | `rows-removed` | `RowsRemovedEvent` | 行删除 |
967
- | `row-id-promoted` | `RowIdPromotedEvent` | 临时行 ID 提升为正式主键 |
968
- | `row-moved` | `RowMovedEvent` | 编程式或 UI 行移动 |
969
- | `row-drag-end` | `RowDragEndEvent` | 行拖拽结束(`rowDragManaged: false` 时由业务改序) |
970
- | `row-drag-commit-started` | `RowDragCommitStartedEvent` | deferred 模式 commit 开始 |
971
- | `row-drag-commit-finished` | `RowDragCommitFinishedEvent` | deferred 模式 commit 完成 |
972
- | `row-height-changed` | `RowHeightChangedEvent` | 行高变更 |
1510
+ #### `rows-added`
1511
+
1512
+ | 字段 | 类型 | 说明 |
1513
+ |------|------|------|
1514
+ | `rows` | `RowMutationRowSnapshot[]` | 新增行快照(含 `rowId` / `data`) |
1515
+
1516
+ #### `rows-removed`
1517
+
1518
+ | 字段 | 类型 | 说明 |
1519
+ |------|------|------|
1520
+ | `rows` | `RowMutationRemovedSnapshot[]` | 删除行快照 |
1521
+
1522
+ #### `row-id-promoted`
1523
+
1524
+ | 字段 | 类型 | 说明 |
1525
+ |------|------|------|
1526
+ | `oldRowId` | `BusinessRowId` | 临时 id(`__mg_tmp_*`) |
1527
+ | `newRowId` | `BusinessRowId` | 正式业务主键 |
1528
+ | `data` | `RowData` | 更新后的行数据 |
1529
+
1530
+ #### `row-moved`
1531
+
1532
+ | 字段 | 类型 | 说明 |
1533
+ |------|------|------|
1534
+ | `rowId` | `BusinessRowId` | 被移动行 id |
1535
+ | `fromIndex` / `toIndex` | `number` | source 顺序下的起止下标 |
1536
+ | `source` | `RowMoveSource` | `'uiRowDrag'` / `'api'` 等 |
1537
+ | `finished` | `boolean` | live drag 中间态为 `false` |
1538
+
1539
+ #### `row-drag-end`
1540
+
1541
+ `rowDragManaged: false` 时由业务自行改序。payload 为 `RowDragEndEvent`:
1542
+
1543
+ | 字段 | 类型 | 说明 |
1544
+ |------|------|------|
1545
+ | `rowId` | `BusinessRowId` | 被拖拽行 id |
1546
+ | `rowIds` | `BusinessRowId[]` | 多行 drag 时的全部 id |
1547
+ | `displayIndex` | `number` | drop 时 display 插入位;`-1` = 无效 |
1548
+ | `finished` | `boolean` | 是否 mouseup 最终提交 |
1549
+ | `parentRowId` / `siblingIndex` / `treeLevel` | 可选 | 树形 drop 上下文 |
1550
+
1551
+ #### `row-drag-commit-started` / `row-drag-commit-finished`
1552
+
1553
+ deferred 模式(`rowDragCommitMode: 'deferred'`)commit 生命周期事件。
1554
+
1555
+ #### `row-height-changed`
1556
+
1557
+ | 字段 | 类型 | 说明 |
1558
+ |------|------|------|
1559
+ | `rowId` | `BusinessRowId` | 行 id |
1560
+ | `height` | `number` | 新的行高 px |
1561
+ | `finished` | `boolean` | resize 过程 / 最终提交 |
1562
+ | `source` | `string` | 触发来源 |
973
1563
 
974
1564
  ### 展开行
975
1565
 
976
- | 事件 | payload | 说明 |
977
- |------|---------|------|
978
- | `row-expanded` | `RowExpansionChangedEvent` | 主行展开 |
979
- | `row-collapsed` | `RowExpansionChangedEvent` | 主行折叠 |
1566
+ #### `row-expanded` / `row-collapsed`
1567
+
1568
+ payload `RowExpansionChangedEvent`:
1569
+
1570
+ | 字段 | 类型 | 说明 |
1571
+ |------|------|------|
1572
+ | `rowId` | `BusinessRowId` | 主行 id |
1573
+ | `expanded` | `boolean` | 展开 / 折叠 |
980
1574
 
981
1575
  ### 行分组
982
1576
 
983
- | 事件 | payload | 说明 |
984
- |------|---------|------|
985
- | `row-group-opened` | `RowGroupOpenedEvent` | 分组节点展开/折叠 |
986
- | `row-group-changed` | `RowGroupChangedEvent` | 分组列配置变更 |
1577
+ #### `row-group-opened`
1578
+
1579
+ | 字段 | 类型 | 说明 |
1580
+ |------|------|------|
1581
+ | `groupId` | `string` | 分组节点 id |
1582
+ | `expanded` | `boolean` | 展开 / 折叠 |
1583
+ | `field` | `string` | 分组字段 |
1584
+ | `key` | `string` | 分组键值 |
1585
+ | `level` | `number` | 分组层级 |
1586
+ | `source` | `RowGroupingSource` | 触发来源 |
1587
+
1588
+ #### `row-group-changed`
1589
+
1590
+ | 字段 | 类型 | 说明 |
1591
+ |------|------|------|
1592
+ | `columns` | `string[]` | 当前分组列 id 列表 |
1593
+ | `source` | `RowGroupingSource` | 触发来源 |
987
1594
 
988
1595
  ### 树形表格
989
1596
 
990
- | 事件 | payload | 说明 |
991
- |------|---------|------|
992
- | `tree-node-opened` | `TreeNodeOpenedEvent` | 树节点展开/折叠 |
993
- | `tree-children-loading` | `TreeChildrenLoadingEvent` | 懒加载子节点开始 |
994
- | `tree-children-loaded` | `TreeChildrenLoadedEvent` | 懒加载子节点成功 |
995
- | `tree-children-load-failed` | `TreeChildrenLoadFailedEvent` | 懒加载子节点失败 |
1597
+ #### `tree-node-opened`
1598
+
1599
+ | 字段 | 类型 | 说明 |
1600
+ |------|------|------|
1601
+ | `rowId` | `BusinessRowId` | 节点 id |
1602
+ | `expanded` | `boolean` | 展开 / 折叠 |
1603
+ | `level` | `number` | 树层级 |
1604
+ | `dataPath` | `string[]` | 节点路径 |
1605
+ | `source` | `TreeTableSource` | 触发来源 |
1606
+
1607
+ #### `tree-children-loading`
1608
+
1609
+ | 字段 | 类型 | 说明 |
1610
+ |------|------|------|
1611
+ | `parentRowId` | `BusinessRowId` | 父节点 id |
1612
+ | `dataPath` | `string[]` | 父节点路径 |
1613
+ | `treeLevel` | `number` | 树层级 |
1614
+ | `source` | `TreeTableSource` | 触发来源 |
1615
+
1616
+ #### `tree-children-loaded`
1617
+
1618
+ | 字段 | 类型 | 说明 |
1619
+ |------|------|------|
1620
+ | `parentRowId` | `BusinessRowId` | 父节点 id |
1621
+ | `children` | `RowData[]` | 加载的子行数据 |
1622
+ | `childCount` | `number` | 子行数量 |
1623
+ | `source` | `TreeTableSource` | 触发来源 |
1624
+
1625
+ #### `tree-children-load-failed`
1626
+
1627
+ | 字段 | 类型 | 说明 |
1628
+ |------|------|------|
1629
+ | `parentRowId` | `BusinessRowId` | 父节点 id |
1630
+ | `reason` | `string` | 失败原因(可选) |
1631
+ | `aborted` | `boolean` | 是否被中断 |
996
1632
 
997
1633
  ### 批注
998
1634
 
999
- | 事件 | payload | 说明 |
1000
- |------|---------|------|
1001
- | `cell-comment-changed` | `CellCommentChangedEvent` | 单元格批注变更 |
1635
+ #### `cell-comment-changed`
1636
+
1637
+ | 字段 | 类型 | 说明 |
1638
+ |------|------|------|
1639
+ | `rowId` / `colId` | — | 格位置 |
1640
+ | `comment` | `CellComment \| undefined` | 新批注;`undefined` 表示删除 |
1002
1641
 
1003
1642
  ### 框选
1004
1643
 
1005
- | 事件 | payload | 说明 |
1006
- |------|---------|------|
1007
- | `cell-selection-changed` | `CellSelectionChangedEvent` | 框选范围变更 |
1008
- | `cell-selection-delete-start` | `CellSelectionDeleteStartEvent` | Delete 清空选区开始 |
1009
- | `cell-selection-delete-end` | `CellSelectionDeleteEndEvent` | Delete 清空选区结束 |
1644
+ #### `cell-selection-changed`
1645
+
1646
+ | 字段 | 类型 | 说明 |
1647
+ |------|------|------|
1648
+ | `ranges` | `CellRange[]` | 当前选区列表 |
1649
+ | `source` | `CellSelectionSource` | 变更来源(ui / api 等) |
1650
+
1651
+ `CellRange`:`{ startRowIndex, endRowIndex, startColId, endColId }`。
1652
+
1653
+ #### `cell-selection-delete-start` / `cell-selection-delete-end`
1654
+
1655
+ | 字段 | 类型 | 说明 |
1656
+ |------|------|------|
1657
+ | `ranges` | `CellRange[]` | 被清空的选区 |
1658
+ | `changedCellCount` | `number` | (end)实际变更的格数 |
1010
1659
 
1011
1660
  ### 空态
1012
1661
 
1013
- | 事件 | payload | 说明 |
1014
- |------|---------|------|
1015
- | `overlay-shown` | `OverlayShownEvent` | overlay 显示 |
1016
- | `overlay-hidden` | `OverlayHiddenEvent` | overlay 隐藏 |
1662
+ #### `overlay-shown` / `overlay-hidden`
1663
+
1664
+ | 字段 | 类型 | 说明 |
1665
+ |------|------|------|
1666
+ | `overlayType` | `'loading' \| 'noRows' \| 'noMatchingRows'` | overlay 类型 |
1017
1667
 
1018
1668
  ### 事件监听示例
1019
1669
 
@@ -1025,41 +1675,44 @@ MagicGrid 通过 Vue 事件向外暴露 Grid 内核事件。事件名采用 keba
1025
1675
  />
1026
1676
  ```
1027
1677
 
1028
- 除 Vue 事件外,也可通过 `gridRef.api` 订阅内核事件(见 [Expose](#expose))。
1029
-
1030
1678
  ---
1031
1679
 
1032
1680
  ## Expose
1033
1681
 
1034
1682
  通过组件 `ref` 获取 `MagicGridExpose` 实例,进行命令式操作。
1035
1683
 
1684
+ ### MagicGridExpose 方法
1685
+
1686
+ | 成员 | 类型 | 说明 |
1687
+ |------|------|------|
1688
+ | `api` | `Ref<GridApi \| undefined>` | GridApi 实例;挂载完成后可用 |
1689
+ | `getMetrics()` | `() => GridMetrics \| undefined` | 读取渲染与滚动指标(同 `scroll` / `data-rendered` 事件 payload) |
1690
+ | `scrollTo(scrollTop, scrollLeft?)` | `(number, number?) => void` | 编程式滚动;scrollLeft 省略时保持当前值 |
1691
+ | `setSortModel(model)` | `(SortModelItem[]) => void` | 设置排序模型并重算 display 行 |
1692
+ | `getSortModel()` | `() => SortModelItem[]` | 读取当前排序模型 |
1693
+ | `setFilterModel(model)` | `(FilterModel) => void` | 设置筛选模型并重算 display 行 |
1694
+ | `getData(options?)` | `(GetDataOptions?) => RowData[]` | 导出业务数据;等价于 `api.getData()` |
1695
+ | `applyTransaction(tx)` | `(RowTransaction) => Promise<RowNodeTransaction \| undefined>` | 增量事务 add/update/remove |
1696
+ | `beginUpdate()` | `() => void` | 开启批量更新;与 `endUpdate` 配对 |
1697
+ | `endUpdate()` | `() => void` | 结束批量更新并 flush 累积变更 |
1698
+ | `ensureIndexVisible(index, position?)` | `(number, 'top'\|'bottom'\|'middle'?) => void` | 滚动使行下标进入视口;position 默认 `'middle'` |
1699
+ | `flushFrames()` | `() => void` | 强制 flush 待渲染帧(测试/同步场景) |
1700
+
1036
1701
  ### 类型定义
1037
1702
 
1038
1703
  ```ts
1039
1704
  interface MagicGridExpose {
1040
- /** GridApi 实例(Ref) */
1041
1705
  api: Ref<GridApi | undefined>
1042
- /** 读取渲染与滚动指标 */
1043
1706
  getMetrics: () => GridMetrics | undefined
1044
- /** 编程式滚动 */
1045
1707
  scrollTo: (scrollTop: number, scrollLeft?: number) => void
1046
- /** 设置排序模型 */
1047
1708
  setSortModel: (model: SortModelItem[]) => void
1048
- /** 读取排序模型 */
1049
1709
  getSortModel: () => SortModelItem[]
1050
- /** 设置筛选模型 */
1051
1710
  setFilterModel: (model: FilterModel) => void
1052
- /** 导出当前表格业务数据 */
1053
1711
  getData: (options?: GetDataOptions) => RowData[]
1054
- /** 增量事务:add / update / remove */
1055
1712
  applyTransaction: (transaction: RowTransaction) => Promise<RowNodeTransaction | undefined>
1056
- /** 开启批量更新(与 endUpdate 配对) */
1057
1713
  beginUpdate: () => void
1058
- /** 结束批量更新并 flush */
1059
1714
  endUpdate: () => void
1060
- /** 滚动使指定行下标进入视口 */
1061
1715
  ensureIndexVisible: (index: number, position?: 'top' | 'bottom' | 'middle') => void
1062
- /** 强制 flush 待渲染帧 */
1063
1716
  flushFrames: () => void
1064
1717
  }
1065
1718
  ```
@@ -1069,7 +1722,7 @@ interface MagicGridExpose {
1069
1722
  ```vue
1070
1723
  <script setup lang="ts">
1071
1724
  import { ref } from 'vue'
1072
- import type { MagicGridExpose } from '@taocompany/magic-grid'
1725
+ import type { MagicGridExpose } from '@taocompany/magic-grid/types/core'
1073
1726
 
1074
1727
  const gridRef = ref<MagicGridExpose>()
1075
1728
 
@@ -1095,109 +1748,109 @@ function scrollToRow(index: number) {
1095
1748
 
1096
1749
  ### GridApi(`gridRef.api`)
1097
1750
 
1098
- `api` 是完整的命令式 API 面,按职责分组如下。完整参考见 [`docs/16-grid-api-reference.md`](docs/16-grid-api-reference.md)。
1751
+ `api` 是完整的命令式 API 面。以下按职责分组列出全部公开方法;入参 rowId 均接受 `string | number`,出参 rowId 恒为 `string`。
1099
1752
 
1100
1753
  #### 数据
1101
1754
 
1102
- | 方法 | 说明 |
1103
- |------|------|
1104
- | `setData(rows)` | 全量替换表格数据 |
1105
- | `applyTransaction(tx)` | 增量事务 add/update/remove |
1106
- | `addRows(options)` | 在指定位置插入行 |
1107
- | `removeRows(options)` | 按 rowId 或下标删除行 |
1108
- | `getData(options?)` | 导出业务层 RowData[] |
1109
- | `promoteRowId(options)` | 临时行 ID 提升为正式主键 |
1110
- | `moveRow(rowId, toIndex, indexMode?)` | 编程式移动行 |
1755
+ | 方法 | 参数 | 返回值 | 说明 |
1756
+ |------|------|--------|------|
1757
+ | `setData(rows)` | `RowData[]` | `void` | 全量替换数据;触发完整重绘 |
1758
+ | `applyTransaction(tx)` | `{ add?, update?, remove? }` | `Promise<RowNodeTransaction>` | 增量事务 add/update/remove |
1759
+ | `addRows(options)` | `AddRowsOptions` | `Promise<RowNodeTransaction>` | 指定位置插入行;省略 rowKey 生成临时行 |
1760
+ | `removeRows(options)` | `{ rowIds?, indexes?, indexMode? }` | `Promise<RowNodeTransaction>` | 按 rowId 或下标删除 |
1761
+ | `getData(options?)` | `{ sourceOrder?: boolean }` | `RowData[]` | 导出业务数据;默认 source 顺序 |
1762
+ | `promoteRowId(options)` | `{ rowId, businessId }` | `PromoteRowIdResult` | 临时 id 提升为正式主键 |
1763
+ | `moveRow(rowId, toIndex, indexMode?)` | rowId / 目标下标 / `'source'\|'display'` | `RowMoveResult` | 编程式移动行 |
1111
1764
 
1112
1765
  #### 排序 / 筛选
1113
1766
 
1114
- | 方法 | 说明 |
1115
- |------|------|
1116
- | `setSortModel(model)` / `getSortModel()` | 排序模型读写 |
1117
- | `setFilterModel(model)` / `getFilterModel()` | 筛选模型读写 |
1118
- | `setColumnFilter(colId, condition)` | 设置单列筛选 |
1119
- | `getColumnFilter(colId)` | 读取单列筛选条件 |
1120
- | `isColumnFilterActive(colId)` | 单列是否有有效筛选 |
1121
- | `isAnyFilterActive()` | 任一列 filter 或 quick filter 是否 active |
1122
- | `setQuickFilterText(text)` / `getQuickFilterText()` | Quick filter 读写 |
1123
- | `clearAllFilters()` | 清除全部筛选 |
1124
- | `getColumnDistinctFilterValues(colId)` | 列 distinct 值(set filter 勾选列表) |
1767
+ | 方法 | 参数 | 说明 |
1768
+ |------|------|------|
1769
+ | `setSortModel(model)` / `getSortModel()` | `SortModelItem[]` | 排序模型读写;触发 `sortChanged` |
1770
+ | `setFilterModel(model)` / `getFilterModel()` | `FilterModel` | 筛选模型读写;触发 `filterChanged` |
1771
+ | `setColumnFilter(colId, condition)` | condition 或 `null` 清除 | 设置单列筛选 |
1772
+ | `getColumnFilter(colId)` | | 读取单列条件;未设置返回 `null` |
1773
+ | `isColumnFilterActive(colId)` | — | 单列是否有有效筛选 |
1774
+ | `isAnyFilterActive()` | — | 任一列 filter 或 quick filter 是否 active |
1775
+ | `setQuickFilterText(text)` / `getQuickFilterText()` | `string` | Quick filter 读写 |
1776
+ | `clearAllFilters()` | | 清除全部列筛选 + quick filter |
1777
+ | `getColumnDistinctFilterValues(colId)` | — | 列 distinct 值(set filter 勾选列表) |
1125
1778
 
1126
1779
  #### 列
1127
1780
 
1128
- | 方法 | 说明 |
1129
- |------|------|
1130
- | `moveColumn(colId, toIndex)` | 编程式移动列 |
1131
- | `resetColumnOrder()` | 各 lane 内用户列恢复 defOrder |
1132
- | `resetColumnWidths()` | 用户列恢复 defWidth/defFlex |
1133
- | `setColumnFixed(colId, fixed)` | 运行时改列 fixed |
1134
- | `setColumnsHidden(colIds, hidden)` | 批量设置列 hidden |
1135
- | `isColumnHidden(colId)` | 列是否 hidden |
1136
- | `getDisplayedColumnIds()` | 当前 UI 展示的列 id |
1137
- | `getColumns()` / `getDisplayedColumns()` | 全量列 / 展示列 |
1138
- | `setColumnWidth(colId, width, finished?, source?)` | 设置单列宽度 |
1139
- | `setColumnWidths(payloads, finished?, source?)` | 批量设置列宽 |
1140
- | `getColumnWidth(colId)` | 读取列当前像素宽度 |
1141
- | `autoSizeColumn(colId, skipHeader?)` | 按内容自动调整列宽 |
1142
- | `autoSizeColumns(colIds, skipHeader?)` | 批量 auto-size |
1143
- | `sizeColumnsToFit(params?)` | 列宽按比例分配至视口 |
1781
+ | 方法 | 参数 | 说明 |
1782
+ |------|------|------|
1783
+ | `moveColumn(colId, toIndex)` | 全局 columns 下标 | 编程式移动列 |
1784
+ | `resetColumnOrder()` | — | 各 lane 内用户列恢复 defOrder |
1785
+ | `resetColumnWidths()` | — | 用户列恢复 defWidth/defFlex |
1786
+ | `setColumnFixed(colId, fixed)` | `'left' \| 'right' \| null` | 运行时改列 fixed |
1787
+ | `setColumnsHidden(colIds, hidden)` | — | 批量设置列 hidden(仅对列模型中存在的列生效) |
1788
+ | `isColumnHidden(colId)` | — | 列是否 hidden |
1789
+ | `getDisplayedColumnIds()` | — | 当前 UI 展示列 id(左→右 · 跳过 hidden) |
1790
+ | `getColumns()` / `getDisplayedColumns()` | | 全量列(含 hidden · 不含 `available: false`)/ 展示列(不含 hidden) |
1791
+ | `setColumnWidth(colId, width, finished?, source?)` | finished 默认 `true` | 设置单列宽度 |
1792
+ | `setColumnWidths(payloads, finished?, source?)` | `{ colId, width }[]` | 批量设置列宽 |
1793
+ | `getColumnWidth(colId)` | — | 读取列当前像素宽度 |
1794
+ | `autoSizeColumn(colId, skipHeader?)` | skipHeader 默认 `false` | 按内容 auto-size |
1795
+ | `autoSizeColumns(colIds, skipHeader?)` | — | 批量 auto-size |
1796
+ | `sizeColumnsToFit(params?)` | `SizeColumnsToFitParams` | 列宽按比例分配至视口 |
1144
1797
 
1145
1798
  #### 行高
1146
1799
 
1147
- | 方法 | 说明 |
1148
- |------|------|
1149
- | `setRowHeight(rowId, height, finished?)` | 设置单行高度 |
1150
- | `setRowHeights(changes, finished?)` | 批量设置行高 |
1151
- | `getRowHeight(rowId)` | 读取行当前有效高度 |
1152
- | `resetRowHeights(rowIds?)` | 清除 pinned 并重算行高 |
1153
- | `updateDimensions(params)` | 热更新默认行高与 clamp 边界 |
1800
+ | 方法 | 参数 | 说明 |
1801
+ |------|------|------|
1802
+ | `setRowHeight(rowId, height, finished?)` | finished 默认 `true` | 设置单行高度并 pinned |
1803
+ | `setRowHeights(changes, finished?)` | `{ rowId, height }[]` | 批量设置行高 |
1804
+ | `getRowHeight(rowId)` | | 读取行当前有效高度;不存在返回 `null` |
1805
+ | `resetRowHeights(rowIds?)` | 省略则全部 | 清除 pinned 并重算行高 |
1806
+ | `updateDimensions(params)` | `{ rowHeight?, rowHeightMin?, rowHeightMax? }` | 热更新默认行高与 clamp |
1154
1807
 
1155
1808
  #### 渲染 / 视口
1156
1809
 
1157
- | 方法 | 说明 |
1158
- |------|------|
1159
- | `refreshCells(params?)` | 刷新指定行或列的单元格 DOM |
1160
- | `refreshCellSpans()` | 强制重建单元格合并 cache |
1161
- | `getCellSpan(rowId, colId)` | 查询 span 信息 |
1162
- | `ensureIndexVisible(index, position?)` | 滚动使行下标进入视口 |
1163
- | `getRowNode(id)` | 按 rowId 获取行节点快照 |
1164
- | `getMetrics()` | 读取渲染与滚动指标 |
1165
- | `beginUpdate()` / `endUpdate()` | 批量更新 |
1166
- | `scrollTo(scrollTop, scrollLeft?)` | 编程式滚动 |
1810
+ | 方法 | 参数 | 返回值 | 说明 |
1811
+ |------|------|--------|------|
1812
+ | `refreshCells(params?)` | `{ rowIds?, colIds?, force? }` | `number` | 刷新指定格 DOM |
1813
+ | `refreshCellSpans()` | | `void` | 强制重建合并 cache |
1814
+ | `getCellSpan(rowId, colId)` | — | `CellSpanInfo \| null` | 查询 span 信息 |
1815
+ | `ensureIndexVisible(index, position?)` | position 默认 `'middle'` | `void` | 滚动使行下标进入视口 |
1816
+ | `getRowNode(id)` | rowId | `RowNode \| undefined` | id 获取行节点 |
1817
+ | `getMetrics()` | — | `GridMetrics` | 读取渲染与滚动指标 |
1818
+ | `beginUpdate()` / `endUpdate()` | | `void` | 批量更新(与 applyTransaction 配对) |
1819
+ | `scrollTo(scrollTop, scrollLeft?)` | px | `void` | 编程式滚动 |
1167
1820
 
1168
1821
  #### 编辑
1169
1822
 
1170
- | 方法 | 说明 |
1171
- |------|------|
1172
- | `startEditingCell({ rowIndex, colKey })` | 编程式进入单元格编辑 |
1173
- | `stopEditing(cancel?)` | 结束当前编辑会话 |
1174
- | `isEditing()` | 是否存在编辑态 |
1175
- | `isCommitting()` | 是否正在异步提交 |
1176
- | `cancelCommit()` | 中断进行中的异步提交 |
1177
- | `getEditSessionPhase()` | 当前编辑会话阶段 |
1178
- | `getEditingCell()` | 当前主编辑单元格 |
1179
- | `getEditingCells()` | 行编辑模式下所有编辑单元格 |
1180
- | `registerCellEditor(name, editor)` | 注册命名单元格编辑器 |
1181
- | `unregisterCellEditor(name)` | 注销实例级编辑器 |
1823
+ | 方法 | 参数 | 返回值 | 说明 |
1824
+ |------|------|--------|------|
1825
+ | `startEditingCell({ rowIndex, colKey })` | colKey = colId 或 prop | `void` | 编程式进入编辑 |
1826
+ | `stopEditing(cancel?)` | cancel 默认 `false` | `Promise<void>` | 结束编辑;`true` 丢弃修改 |
1827
+ | `isEditing()` | — | `boolean` | 是否存在编辑态 |
1828
+ | `isCommitting()` | — | `boolean` | 是否正在异步提交 |
1829
+ | `cancelCommit()` | | `void` | 中断异步提交 |
1830
+ | `getEditSessionPhase()` | | `'idle' \| 'editing' \| 'committing' \| 'cancelling'` | 编辑会话阶段 |
1831
+ | `getEditingCell()` | | `{ rowId, colId } \| null` | 当前主编辑格 |
1832
+ | `getEditingCells()` | | `EditingCellPosition[]` | 行编辑模式下全部编辑格 |
1833
+ | `registerCellEditor(name, editor)` | | `void` | 注册实例级命名编辑器 |
1834
+ | `unregisterCellEditor(name)` | — | `boolean` | 注销实例级编辑器 |
1182
1835
 
1183
1836
  #### 校验
1184
1837
 
1185
- | 方法 | 说明 |
1186
- |------|------|
1187
- | `validate(options?)` | 校验全表或指定行 |
1188
- | `validateRows(options)` | 校验指定行列表 |
1189
- | `validateCells(options)` | 校验指定单元格列表 |
1190
- | `clearValidation(options?)` | 清除校验视觉反馈 |
1191
- | `clearRowValidation(options)` | 清除指定行校验反馈 |
1192
- | `clearCellValidation(options)` | 清除指定单元格校验反馈 |
1838
+ | 方法 | 参数 | 返回值 | 说明 |
1839
+ |------|------|--------|------|
1840
+ | `validate(options?)` | `ValidateGridOptions` | `Promise<GridValidationResult>` | 校验全表或指定行 |
1841
+ | `validateRows(options)` | rowIds 必填 | `Promise<GridValidationResult>` | 校验指定行 |
1842
+ | `validateCells(options)` | cells 必填 | `Promise<GridValidationResult>` | 校验指定格 |
1843
+ | `clearValidation(options?)` | — | `void` | 清除校验视觉反馈 |
1844
+ | `clearRowValidation(options)` | rowIds 必填 | `void` | 清除指定行反馈 |
1845
+ | `clearCellValidation(options)` | cells 必填 | `void` | 清除指定格反馈 |
1193
1846
 
1194
1847
  #### 行选择 / 索引定位
1195
1848
 
1196
- | 方法 | 说明 |
1197
- |------|------|
1198
- | `toggleRowSelection(rowIds, selected?, force?)` | 切换或设置行 checkbox 选中 |
1199
- | `toggleAllSelection(selected?)` | 表头全选 checkbox 操作 |
1200
- | `setIndexFocus(rowIds)` | 设置索引列辅助定位 |
1849
+ | 方法 | 参数 | 说明 |
1850
+ |------|------|------|
1851
+ | `toggleRowSelection(rowIds, selected?, force?)` | selected 省略时 toggle | 切换/设置 checkbox 选中 |
1852
+ | `toggleAllSelection(selected?)` | multiple 模式 | 表头全选操作 |
1853
+ | `setIndexFocus(rowIds)` | — | 设置索引列辅助定位 |
1201
1854
 
1202
1855
  #### 展开 / 分组 / 树
1203
1856
 
@@ -1219,9 +1872,12 @@ function scrollToRow(index: number) {
1219
1872
  |------|------|
1220
1873
  | `getCellComment(rowId, colId)` / `setCellComment(...)` | 批注读写 |
1221
1874
  | `refreshCellComments(params?)` | 刷新批注角标 |
1222
- | `getCellRanges()` / `clearCellSelection()` / `addCellRange(params)` | 框选操作 |
1223
- | `getCellSelectionAggregation()` | 当前框选聚合统计 |
1224
- | `copySelectedRangeToClipboard()` / `pasteFromClipboard()` | 剪贴板操作 |
1875
+ | `getCellRanges()` | 读取当前框选 range 列表 |
1876
+ | `clearCellSelection()` | 清除框选 |
1877
+ | `addCellRange(params)` | 编程式添加 range |
1878
+ | `getCellSelectionAggregation()` | 选区聚合统计(count / sum / average) |
1879
+ | `copySelectedRangeToClipboard()` | 复制选区至剪贴板 |
1880
+ | `pasteFromClipboard()` | 从剪贴板粘贴至选区 |
1225
1881
  | `showLoadingOverlay()` / `showNoRowsOverlay()` / `hideOverlay()` | overlay 控制 |
1226
1882
  | `isOverlayShowing()` / `getOverlayType()` | overlay 状态查询 |
1227
1883
  | `refreshDisabledState(params?)` | 重算 disabled 投影 |
@@ -1229,13 +1885,24 @@ function scrollToRow(index: number) {
1229
1885
 
1230
1886
  #### 事件订阅
1231
1887
 
1888
+ GridApi 支持 `on(eventType, handler)` 订阅内核事件(camelCase),返回取消函数:
1889
+
1890
+ | 内核事件名 | 对应 Vue 事件 |
1891
+ |------------|---------------|
1892
+ | `selectionChanged` | `selection-changed` |
1893
+ | `cellValueChanged` | `cell-value-changed` |
1894
+ | `sortChanged` | `sort-changed` |
1895
+ | `filterChanged` | `filter-changed` |
1896
+ | `columnMoved` | `column-moved` |
1897
+ | `cellSelectionChanged` | `cell-selection-changed` |
1898
+ | … | 其余见 [Events](#events) |
1899
+
1232
1900
  ```ts
1233
1901
  const api = gridRef.value?.api
1234
1902
  const off = api?.on('selectionChanged', (event) => {
1235
1903
  console.log(event.selectedRowIds)
1236
1904
  })
1237
- // 取消订阅
1238
- off?.()
1905
+ off?.() // 取消订阅
1239
1906
  ```
1240
1907
 
1241
1908
  ### rowId 约定
@@ -1248,7 +1915,23 @@ off?.()
1248
1915
 
1249
1916
  ## Slots
1250
1917
 
1251
- MagicGrid 提供静态插槽与动态列插槽两类。
1918
+ MagicGrid 提供**静态插槽**(固定名称)与**动态列插槽**(`#cell-{colId}` / `#cell-editor-{colId}`)两类。插槽与同名 prop / 列配置的优先级见文末 [插槽优先级说明](#插槽优先级说明)。
1919
+
1920
+ ### 插槽一览
1921
+
1922
+ | 插槽名 | 类型 | 说明 |
1923
+ |--------|------|------|
1924
+ | `#toolbar` | 静态 | 表格顶部工具栏 |
1925
+ | `#status-bar` | 静态 | 完全自定义底部状态栏(提供时替换默认布局) |
1926
+ | `#status-bar-left` | 静态 | 默认状态栏左侧区域 |
1927
+ | `#status-bar-right` | 静态 | 默认状态栏右侧区域 |
1928
+ | `#cell-{colId}` | 动态 | 自定义单元格渲染 |
1929
+ | `#cell-editor-{colId}` | 动态 | 自定义单元格编辑器 |
1930
+ | `#detail-row` | 静态 | 主从展开行详情区 |
1931
+ | `#tooltip` | 静态 | 全局自定义 tooltip |
1932
+ | `#loading` | 静态 | loading overlay 内容 |
1933
+ | `#no-rows` | 静态 | 无数据 overlay 内容 |
1934
+ | `#no-matching-rows` | 静态 | 筛选无匹配 overlay 内容 |
1252
1935
 
1253
1936
  ### 布局插槽
1254
1937
 
@@ -1259,7 +1942,7 @@ MagicGrid 提供静态插槽与动态列插槽两类。
1259
1942
  | 插槽 prop | 类型 | 说明 |
1260
1943
  |-----------|------|------|
1261
1944
  | `api` | `GridApi \| undefined` | GridApi 实例 |
1262
- | `size` | `MagicGridSize` | 当前尺寸 preset |
1945
+ | `size` | `GridSize` | 当前尺寸 preset |
1263
1946
  | `portalEl` | `HTMLElement \| undefined` | 浮层挂载 portal 元素 |
1264
1947
 
1265
1948
  ```vue
@@ -1418,6 +2101,228 @@ MagicGrid 提供静态插槽与动态列插槽两类。
1418
2101
 
1419
2102
  ---
1420
2103
 
2104
+
2105
+ ## 单元格编辑
2106
+
2107
+ Magic Grid 支持 **overlay**(点击/Enter 进入编辑浮层)与 **inline**(控件常驻单元格内)两种呈现模式,以及内置编辑器、函数编辑器、Vue 组件编辑器与命名注册表。
2108
+
2109
+ ### 呈现模式:overlay 与 inline
2110
+
2111
+ | 模式 | 配置 | 行为 |
2112
+ |------|------|------|
2113
+ | **overlay**(默认) | `cellEditorMode: 'overlay'` 或省略 | 非编辑态展示 formatter / cellRenderer;进入编辑态后在单元格上方挂载编辑器 |
2114
+ | **inline** | `cellEditorMode: 'inline'` + 必须配置 `cellEditor` | 编辑器始终渲染在格内;空格切换 checkbox;适合布尔列、简单输入 |
2115
+
2116
+ **inline 限制**(开发模式会 console.warn):
2117
+
2118
+ - 系统列(索引 / 行选择)不支持 inline。
2119
+ - 推荐搭配内置 `'text'` / `'number'` / `'checkbox'`;依赖 teleport/下拉的第三方组件(如 Select)应使用 overlay + `useCellEditor({ strategy: 'overlay' })`。
2120
+ - inline 列通过 `params.commit()` / 空格(checkbox)提交;不走 overlay 的 Enter 捕获逻辑。
2121
+
2122
+ ```ts
2123
+ const columns: ColumnDef[] = [
2124
+ { prop: 'done', label: '完成', width: 80, cellEditorMode: 'inline', cellEditor: 'checkbox' },
2125
+ { prop: 'qty', label: '数量', cellEditorMode: 'inline', cellEditor: 'number', editable: true },
2126
+ ]
2127
+ ```
2128
+
2129
+ Grid 级 `editBehavior: 'row'` 时整行同时进入编辑;Tab 在同行可编辑列间循环。`editType: 'doubleClick'` 改为双击进入编辑。
2130
+
2131
+ ### 内置编辑器
2132
+
2133
+ | 名称 | 说明 |
2134
+ |------|------|
2135
+ | `'text'` | 单行文本 input |
2136
+ | `'number'` | `type="number"` input |
2137
+ | `'checkbox'` | 布尔 checkbox;inline 模式下空格切换 |
2138
+
2139
+ 列定义引用:`cellEditor: 'text'`。内置名不可用于 `registerCellEditor` 覆盖。
2140
+
2141
+ ### Vue 自定义编辑器
2142
+
2143
+ 包导出以下工具,用于集成 Element Plus 等 Vue 组件:
2144
+
2145
+ | 导出 | 用途 |
2146
+ |------|------|
2147
+ | `useCellEditor` | Composable:注册 `setGetValue`、键盘 Enter/Esc、change 提交策略 |
2148
+ | `createVueCellEditor` | 将 Vue 组件包装为 `CellEditorFn` |
2149
+ | `createSlotCellEditor` | 将 `#cell-editor-{colId}` 插槽包装为 `CellEditorFn`(MagicGrid 内部使用) |
2150
+ | `VueCellEditorHost` | Vue 编辑器挂载宿主 |
2151
+
2152
+ **`useCellEditor` 策略**:
2153
+
2154
+ | strategy | Enter | change 时提交 | 典型场景 |
2155
+ |----------|-------|---------------|----------|
2156
+ | `'input'`(默认) | 立即提交 | 否 | ElInput、原生 input |
2157
+ | `'overlay'` | 延迟(由组件确认) | 是 | ElSelect、DatePicker |
2158
+
2159
+ ```vue
2160
+ <!-- MyInputEditor.vue -->
2161
+ <script setup lang="ts">
2162
+ import { ref } from 'vue'
2163
+ import type { CellEditorParams } from '@taocompany/magic-grid/types/core'
2164
+ import { useCellEditor } from '@taocompany/magic-grid'
2165
+
2166
+ const props = defineProps<{ params: CellEditorParams }>()
2167
+ const draft = ref(props.params.formattedValue)
2168
+
2169
+ useCellEditor(props.params, {
2170
+ strategy: 'input',
2171
+ getValue: () => draft.value,
2172
+ })
2173
+ </script>
2174
+
2175
+ <template>
2176
+ <input v-model="draft" class="my-cell-editor" />
2177
+ </template>
2178
+ ```
2179
+
2180
+ ```ts
2181
+ import { createVueCellEditor } from '@taocompany/magic-grid'
2182
+ import MyInputEditor from './MyInputEditor.vue'
2183
+
2184
+ const columns: ColumnDef[] = [
2185
+ {
2186
+ prop: 'note',
2187
+ label: '备注',
2188
+ editable: true,
2189
+ cellEditor: createVueCellEditor(MyInputEditor),
2190
+ },
2191
+ ]
2192
+ ```
2193
+
2194
+ `CellEditorParams` 主要字段:`value`、`data`、`stopEditing(commit?)`、`validate()`、`cancelCommit()`、`setGetValue`、`setKeyboardPolicy`、`inline`、`commit`(inline 模式)。
2195
+
2196
+ ### 命名编辑器注册表
2197
+
2198
+ 除列级函数 / 内置名外,可通过 **命名引用** 复用编辑器:
2199
+
2200
+ ```ts
2201
+ import { registerCellEditor } from '@taocompany/magic-grid'
2202
+
2203
+ registerCellEditor('statusSelect', createVueCellEditor(StatusSelectEditor))
2204
+
2205
+ // 列定义
2206
+ { prop: 'status', cellEditor: 'statusSelect', editable: true }
2207
+
2208
+ // 或实例级(仅当前 Grid)
2209
+ <MagicGrid :cell-editor-registry="{ statusSelect: myEditorFn }" ... />
2210
+ ```
2211
+
2212
+ 优先级:**列级函数** > **实例 `cellEditorRegistry`** > **全局 `registerCellEditor`** > **内置名**。
2213
+
2214
+ 异步提交:`valueSetter` 返回 Promise 时进入 `committing` 阶段;Esc 可 `cancelCommit()`。配合 `asyncRowMutation` 做服务端持久化。
2215
+
2216
+ ---
2217
+
2218
+
2219
+ ## 数据校验
2220
+
2221
+ 校验可在 **编辑提交时**(inline / overlay 共用)与 **编程式 API**(`validate` / `validateRows` / `validateCells`)两个入口触发。
2222
+
2223
+ ### 列级规则
2224
+
2225
+ | 方式 | 字段 | 优先级 |
2226
+ |------|------|--------|
2227
+ | 手写 | `cellValidator` | 最高 |
2228
+ | async-validator | `validationRules` | 次之 |
2229
+ | 必填标记 | `validationRequired` | 与 rules.required 联动 |
2230
+
2231
+ `validationRules` 使用 [async-validator](https://github.com/yiminghe/async-validator) 语法;magic-grid 会将异步 `validator` 自动映射为 `asyncValidator`。
2232
+
2233
+ ### enrichColumnsWithValidation
2234
+
2235
+ 在传入 Grid 前编译 rules 为运行时 `cellValidator`(可选,也可直接写 `cellValidator`):
2236
+
2237
+ ```ts
2238
+ import { enrichColumnsWithValidation } from '@taocompany/magic-grid/validation'
2239
+
2240
+ const rawColumns: ColumnDef[] = [
2241
+ {
2242
+ prop: 'email',
2243
+ label: '邮箱',
2244
+ validationRules: [
2245
+ { required: true, message: '必填' },
2246
+ { type: 'email', message: '格式不正确' },
2247
+ ],
2248
+ },
2249
+ ]
2250
+
2251
+ const columns = enrichColumnsWithValidation(rawColumns)
2252
+ ```
2253
+
2254
+ ### 行级校验
2255
+
2256
+ `rowValidator` 在 **行编辑模式** 提交时运行,返回 `string[]` 错误或 `{ errors, failedColIds }` 结构。失败触发 `row-validation-failed`。
2257
+
2258
+ ### 失败后行为
2259
+
2260
+ 由 `invalidEditValueMode` 控制:
2261
+
2262
+ | 值 | 行为 |
2263
+ |----|------|
2264
+ | `'block'`(默认) | 保持编辑态,展示错误 |
2265
+ | `'revert'` | 退出编辑并恢复旧值 |
2266
+ | `'keep'` | 退出编辑但保留无效值 |
2267
+
2268
+ ### 编程式校验 API
2269
+
2270
+ ```ts
2271
+ const result = await api.validate({ rowIds: [1, 2], showFeedback: true })
2272
+ // result.valid · result.cellErrors · result.rowErrors
2273
+
2274
+ await api.validateCells({ cells: [{ rowId: 1, colId: 'email' }] })
2275
+ api.clearValidation()
2276
+ ```
2277
+
2278
+ ---
2279
+
2280
+
2281
+ ## 键盘导航与快捷键
2282
+
2283
+ 焦点在表格视口内时(非编辑态),内核处理以下按键。编辑态下 Enter / Esc 等由编辑器或 `useCellEditor` 优先处理。
2284
+
2285
+ ### 导航
2286
+
2287
+ | 按键 | 行为 |
2288
+ |------|------|
2289
+ | `↑` `↓` `←` `→` | 移动单元格焦点 |
2290
+ | `Shift` + 方向键 | 扩展框选 range(`cellSelection` 开启时) |
2291
+ | `Ctrl/Cmd` + 方向键 | 跳转到首/末行或导航序首/末列 |
2292
+ | `Tab` / `Shift+Tab` | 下一 / 上一可聚焦格(表头 ↔ 表体可衔接,`navigateHeader` / `navigateFooter` 控制) |
2293
+ | `Enter` | 表头:排序 / 全选;索引列:定位;树/分组:展开折叠;数据格:进入编辑 |
2294
+ | `Space` | 行选择 checkbox;inline checkbox 切换;表头/索引/树/分组同 Enter 的切换逻辑 |
2295
+ | `F2` | 进入编辑(若列可编辑) |
2296
+ | `Shift+F2` | 新建/打开单元格批注(批注功能启用时) |
2297
+
2298
+ ### 框选与剪贴板
2299
+
2300
+ | 按键 | 行为 |
2301
+ |------|------|
2302
+ | `Delete` / `Backspace` | 清空选区内可编辑格(触发 `cell-selection-delete-*` 事件) |
2303
+ | `Ctrl/Cmd+C` | 复制选区为 TSV(需 `enableCellCopy`) |
2304
+ | `Ctrl/Cmd+V` | 从剪贴板粘贴至选区锚点(需 `enableCellPaste: true`) |
2305
+
2306
+ ### 列宽(表头焦点)
2307
+
2308
+ | 按键 | 行为 |
2309
+ |------|------|
2310
+ | `Alt+←/→` | 键盘调整列宽 |
2311
+ | `Shift+Alt+←/→` | 邻列补偿(需 `colResizeDefault: 'shift'`) |
2312
+ | `Shift+←/→` | 移动表头焦点列(列拖拽排序辅助) |
2313
+
2314
+ ### 编辑态
2315
+
2316
+ | 按键 | 行为 |
2317
+ |------|------|
2318
+ | `Esc` | 取消编辑;若正在 async commit 则 `cancelCommit()` |
2319
+ | `Enter` | overlay input 策略:提交;overlay 策略由组件处理 |
2320
+ | `Tab` | 行编辑模式:同行下一可编辑列 |
2321
+
2322
+ ---
2323
+
2324
+ ---
2325
+
1421
2326
  ## 辅助组件
1422
2327
 
1423
2328
  表格列设置(Phase 27)提供一组**独立组件**,对标 AG Grid 的 Side Bar + Columns Tool Panel。只要持有 `GridApi` 即可使用,不强依赖 MagicGrid 内部 DOM。
@@ -1446,7 +2351,7 @@ import {
1446
2351
  ColumnSettingsMenuItem,
1447
2352
  ColumnSettingsMenuIcon,
1448
2353
  } from '@taocompany/magic-grid'
1449
- import type { GridApi, ColumnDef, RowData } from '@taocompany/magic-grid'
2354
+ import type { GridApi, ColumnDef, RowData } from '@taocompany/magic-grid/types/core'
1450
2355
  import '@taocompany/magic-grid/style.css'
1451
2356
 
1452
2357
  const columns: ColumnDef[] = [/* ... */]
@@ -1489,7 +2394,7 @@ function onResetColumnOrder(api: GridApi) {
1489
2394
  <script setup lang="ts">
1490
2395
  import { ref } from 'vue'
1491
2396
  import { MagicGrid, ColumnSettingsButton } from '@taocompany/magic-grid'
1492
- import type { GridApi, MagicGridExpose } from '@taocompany/magic-grid'
2397
+ import type { GridApi, MagicGridExpose } from '@taocompany/magic-grid/types/core'
1493
2398
 
1494
2399
  const gridRef = ref<MagicGridExpose>()
1495
2400
  </script>
@@ -1588,7 +2493,7 @@ const gridRef = ref<MagicGridExpose>()
1588
2493
 
1589
2494
  ### ColumnSettingsPanel
1590
2495
 
1591
- 列设置面板本体。按 **左固定 / 中心 / 右固定 / 隐藏** 四组展示用户列,每行支持拖拽排序、排序切换、筛选面板、固定列、显隐控制;面板头部提供「清除全部筛选」。
2496
+ 列设置面板本体。按 **左固定 / 中心 / 右固定 / 隐藏** 四组展示**已注册进列模型**的用户列(`available: false` 的列不会出现);每行支持拖拽排序、排序切换、筛选面板、固定列、显隐控制;面板头部提供「清除全部筛选」。
1592
2497
 
1593
2498
  > 通常由 `ColumnSettingsButton` 内嵌使用;也可单独 import 嵌入任意容器。
1594
2499
 
@@ -1600,7 +2505,7 @@ const gridRef = ref<MagicGridExpose>()
1600
2505
  | 列排序 | 点击循环 none → asc → desc | `setSortModel` |
1601
2506
  | 列筛选 | 行内展开筛选面板(与表头 filter 同源) | `setColumnFilter` / `clearAllFilters` |
1602
2507
  | 列固定 | 切换 null / left / right | `setColumnFixed` |
1603
- | 列显隐 | checkbox 切换 hidden | `setColumnsHidden` |
2508
+ | 列显隐 | checkbox 切换 `hidden`(不含 `available: false` 列) | `setColumnsHidden` |
1604
2509
  | 清除全部筛选 | 面板头部按钮 | `clearAllFilters` |
1605
2510
  | 显示全部隐藏列 | hidden 分组底部操作 | `setColumnsHidden(colIds, false)` |
1606
2511
 
@@ -1722,7 +2627,7 @@ const gridRef = ref<MagicGridExpose>()
1722
2627
  类型 `ColumnSettingsMenuIconName` 已从包导出:
1723
2628
 
1724
2629
  ```ts
1725
- import type { ColumnSettingsMenuIconName } from '@taocompany/magic-grid'
2630
+ import type { ColumnSettingsMenuIconName } from '@taocompany/magic-grid/types/core'
1726
2631
  ```
1727
2632
 
1728
2633
  #### Slots / Events / Expose
@@ -1731,23 +2636,213 @@ import type { ColumnSettingsMenuIconName } from '@taocompany/magic-grid'
1731
2636
 
1732
2637
  ---
1733
2638
 
1734
- ## 相关文档
1735
2639
 
1736
- | 文档 | 说明 |
1737
- |------|------|
1738
- | [`docs/README.md`](docs/README.md) | 内部设计文档索引(架构、里程碑、AG Grid 对照) |
1739
- | [`docs/16-grid-api-reference.md`](docs/16-grid-api-reference.md) | GridApi 完整参考 |
1740
- | [`docs/07-third-party-cell-editor-guide.md`](docs/07-third-party-cell-editor-guide.md) | 第三方编辑器接入(Element Plus 等) |
1741
- | [`docs/35-phase24-cell-range-selection.md`](docs/35-phase24-cell-range-selection.md) | 单元格框选与剪贴板(Phase 24) |
1742
- | [`docs/39-phase27-table-settings-button.md`](docs/39-phase27-table-settings-button.md) | 列设置按钮设计文档(Phase 27) |
2640
+ ## 包入口与导出
2641
+
2642
+ `package.json` `exports` 字段:
2643
+
2644
+ | 子路径 | 说明 |
2645
+ |--------|------|
2646
+ | `@taocompany/magic-grid` | 主入口:组件、编辑器工具、常量、部分 core 工具 |
2647
+ | `@taocompany/magic-grid/types/core` | Grid / 列 / 事件 / API 类型(`ColumnDef`、`GridApi`、`MagicGridExpose` 等) |
2648
+ | `@taocompany/magic-grid/types/validation` | async-validator 类型别名(`Rule`、`Rules`) |
2649
+ | `@taocompany/magic-grid/validation` | 校验运行时(`enrichColumnsWithValidation`、`Schema` 等) |
2650
+ | `@taocompany/magic-grid/style.css` | 全局样式(**必须**手动引入) |
2651
+
2652
+ ### 主入口运行时导出
2653
+
2654
+ **组件**
2655
+
2656
+ - `MagicGrid`
2657
+ - `ColumnSettingsButton` / `ColumnSettingsPanel` / `ColumnSettingsMenuItem` / `ColumnSettingsMenuIcon`
2658
+
2659
+ **单元格编辑器**
2660
+
2661
+ - `useCellEditor`、`VueCellEditorHost`、`createVueCellEditor`、`createSlotCellEditor`
2662
+ - `textCellEditor`、`numberCellEditor`、`checkboxCellEditor`(内置实现,高级场景)
2663
+ - `registerCellEditor` / `unregisterCellEditor` / `getCellEditor` / `hasCellEditor` / `getRegisteredCellEditorNames`
2664
+ - `BUILTIN_CELL_EDITOR_NAMES`、`isBuiltInCellEditor`
2665
+ - `DEFAULT_CELL_EDITOR_MODE`、`resolveCellEditorMode`、`isInlineEditorColumn`
2666
+
2667
+ **常量**
2668
+
2669
+ - `INDEX_COLUMN_ID`、`DEFAULT_INDEX_COLUMN_START`、`INDEX_COLUMN_MIN_WIDTH`
2670
+ - `SELECTION_COLUMN_ID`、`SELECTION_COLUMN_DEFAULT_WIDTH`、`SELECTION_COLUMN_MIN_WIDTH`
2671
+ - `DEFAULT_STATUS_BAR_RANGE_AGGREGATION_PRECISION`
2672
+ - `COLUMN_DRAG_THRESHOLD_PX`、`SORT_AFTER_MOVE_GUARD_MS`
2673
+
2674
+ **工具**
2675
+
2676
+ - `toggleHeaderSort`
2677
+ - `toBusinessRowId`、`toBusinessRowIdFromInternal`、`toBusinessRowIdsFromInternal`、`isSyntheticRow`
2678
+ - `evaluateGridAcceptance`、`getGridAcceptanceThresholds`、`getGridSetDataLimit`(性能验收)
2679
+ - `RowMutationPersistError`
1743
2680
 
1744
- ### 校验子路径
2681
+ ---
2682
+
2683
+
2684
+ ## TypeScript 集成
2685
+
2686
+ ### 行数据泛型
2687
+
2688
+ `ColumnDef` 与 `MagicGridProps` 支持泛型推导列 `prop` 与行数据字段:
1745
2689
 
1746
2690
  ```ts
1747
- import { enrichColumnsWithValidation } from '@taocompany/magic-grid/validation'
2691
+ interface UserRow {
2692
+ id: number
2693
+ name: string
2694
+ age: number
2695
+ }
2696
+
2697
+ const columns: ColumnDef<UserRow>[] = [
2698
+ { prop: 'name', label: '姓名' }, // prop 自动收窄为 'name' | 'age' | 'id'
2699
+ ]
2700
+
2701
+ // MagicGridProps<UserRow> 可用于包装组件 props 类型
2702
+ import type { MagicGridProps } from '@taocompany/magic-grid/types/core'
2703
+ ```
2704
+
2705
+ ### 组件 ref 类型
2706
+
2707
+ ```ts
2708
+ import type { MagicGridExpose, GridApi } from '@taocompany/magic-grid/types/core'
2709
+
2710
+ const gridRef = ref<MagicGridExpose>()
2711
+ const api = computed(() => gridRef.value?.api) // Ref<GridApi | undefined>
2712
+ ```
2713
+
2714
+ ### 事件 payload
2715
+
2716
+ 事件回调参数类型均从 `@taocompany/magic-grid/types/core` 导出,例如 `CellValueChangedEvent`、`SelectionChangedEvent`、`FilterModel`、`SortModelItem`。
2717
+
2718
+ ### 严格模式建议
2719
+
2720
+ - 项目启用 `strict: true`;避免对 `RowData` 使用 `any`。
2721
+ - 自定义 `cellRenderer` / `valueGetter` 返回值使用 `unknown`,formatter 负责展示字符串。
2722
+
2723
+ ---
2724
+
2725
+
2726
+ ## 类型与校验子路径
2727
+
2728
+ 类型按职责拆分为多个子路径,避免主包体积膨胀。
2729
+
2730
+ ### `@taocompany/magic-grid/types/core`
2731
+
2732
+ Grid / 列 / 事件 / API 的完整类型面。常用导出:
2733
+
2734
+ ```ts
2735
+ import type {
2736
+ // 数据与列
2737
+ RowData,
2738
+ ColumnDef,
2739
+ MagicGridProps,
2740
+ MagicGridExpose,
2741
+ GridApi,
2742
+ RowNode,
2743
+ BusinessRowId,
2744
+ RowIdInput,
2745
+ // 排序 / 筛选
2746
+ SortModelItem,
2747
+ FilterModel,
2748
+ FilterCondition,
2749
+ ColumnFilter,
2750
+ // 编辑
2751
+ CellEditorParams,
2752
+ CellEditorFn,
2753
+ CellEditorDef,
2754
+ CellEditBehavior,
2755
+ CellEditType,
2756
+ CellEditorMode,
2757
+ EditSessionPhase,
2758
+ // 框选
2759
+ CellRange,
2760
+ CellSelectionOptions,
2761
+ CellSelectionAggregation,
2762
+ // 事件(示例)
2763
+ CellValueChangedEvent,
2764
+ SelectionChangedEvent,
2765
+ ColumnMovedEvent,
2766
+ // 校验
2767
+ CellValidator,
2768
+ RowValidator,
2769
+ ValidationRules,
2770
+ GridValidationResult,
2771
+ // 列设置
2772
+ ColumnSettingsResetScope,
2773
+ ColumnSettingsMenuIconName,
2774
+ // 插槽
2775
+ StatusBarContext,
2776
+ DetailRowSlotParams,
2777
+ OverlaySlotParams,
2778
+ } from '@taocompany/magic-grid/types/core'
1748
2779
  ```
1749
2780
 
1750
- 配合 `ColumnDef.validationRules` 使用 async-validator 规则。
2781
+ 完整列表见源码 `src/types/core.ts`(re-export 聚合)。
2782
+
2783
+ ### `@taocompany/magic-grid/types/validation`
2784
+
2785
+ async-validator 类型透传:
2786
+
2787
+ ```ts
2788
+ import type { Rule, Rules, ValidateError, ValidateFieldsError } from '@taocompany/magic-grid/types/validation'
2789
+ ```
2790
+
2791
+ ### `@taocompany/magic-grid/validation`
2792
+
2793
+ 校验运行时(需安装 `async-validator` peer dependency):
2794
+
2795
+ ```ts
2796
+ import {
2797
+ Schema,
2798
+ enrichColumnsWithValidation,
2799
+ createCellValidator,
2800
+ createRowValidator,
2801
+ validateWithSchema,
2802
+ isValidationRequired,
2803
+ } from '@taocompany/magic-grid/validation'
2804
+ ```
2805
+
2806
+ ---
2807
+
2808
+
2809
+ ## 本地开发与 Playground
2810
+
2811
+ ### 环境
2812
+
2813
+ ```bash
2814
+ pnpm install
2815
+ pnpm dev # 启动 Playground(默认 Vite dev server)
2816
+ pnpm build # 构建 npm 包至 dist/
2817
+ pnpm test:run # 单元测试
2818
+ pnpm typecheck # Vue + TS 类型检查
2819
+ ```
2820
+
2821
+ 要求 Node.js >= 20.19,包管理器推荐 pnpm 11.x。
2822
+
2823
+ ### Playground 路由
2824
+
2825
+ 开发服务器按 Phase 组织演示页,便于逐项验收能力:
2826
+
2827
+ | 路由 | 主题 |
2828
+ |------|------|
2829
+ | `/phase2` – `/phase27` | 各 Phase 功能演示与验收用例 |
2830
+ | `/glossary` | 术语表 |
2831
+
2832
+ 典型入口:`pnpm dev` 后访问控制台输出的本地 URL,从侧边栏切换 Phase。例如列显隐验收 **`/phase22`**(T14–T15 · `available` 列切换)。
2833
+
2834
+ Playground 源码位于仓库 `playground/` 目录;自定义 Vue 编辑器示例见 `playground/components/editors/`(Element Plus 集成参考)。
2835
+
2836
+ ### 构建产物
2837
+
2838
+ `pnpm build` 输出:
2839
+
2840
+ - `dist/index.es.js` / `dist/index.cjs.js` — 主包
2841
+ - `dist/types/*.js` — 类型子路径运行时垫片
2842
+ - `dist/style.css` — 样式
2843
+ - `dist/*.d.ts` — 类型声明(api-extractor rollup)
2844
+
2845
+ 发布前会自动执行 `prepublishOnly` → `pnpm run build`。
1751
2846
 
1752
2847
  ---
1753
2848