@taocompany/magic-grid 0.1.5 → 0.2.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 (71) hide show
  1. package/README.md +741 -213
  2. package/dist/components/MagicGrid/MagicGrid.vue.d.ts +33 -20
  3. package/dist/components/MagicGrid/MagicGrid.vue.d.ts.map +1 -1
  4. package/dist/components/MagicGrid/resolveMagicGridDefaults.d.ts +1 -1
  5. package/dist/components/MagicGrid/resolveMagicGridDefaults.d.ts.map +1 -1
  6. package/dist/components/StatusBar/StatusBarRangeAggregationPanels.vue.d.ts.map +1 -1
  7. package/dist/components/StatusBar/hasStatusBarAggregationContent.d.ts +4 -0
  8. package/dist/components/StatusBar/hasStatusBarAggregationContent.d.ts.map +1 -0
  9. package/dist/core/column/columnModel.d.ts.map +1 -1
  10. package/dist/core/grid/cellRangeDragSelect.d.ts +1 -1
  11. package/dist/core/grid/cellRangeDragSelect.d.ts.map +1 -1
  12. package/dist/core/grid/grid.d.ts +1 -1
  13. package/dist/core/grid/grid.d.ts.map +1 -1
  14. package/dist/core/grid/gridColumnLayout.d.ts +2 -0
  15. package/dist/core/grid/gridColumnLayout.d.ts.map +1 -1
  16. package/dist/core/grid/gridInteraction/cellRangeDragSession.d.ts +1 -0
  17. package/dist/core/grid/gridInteraction/cellRangeDragSession.d.ts.map +1 -1
  18. package/dist/core/grid/gridInteraction/focusController.d.ts +2 -0
  19. package/dist/core/grid/gridInteraction/focusController.d.ts.map +1 -1
  20. package/dist/core/grid/gridInteraction/gridInteraction.d.ts.map +1 -1
  21. package/dist/core/renderer/cellRangeVisualController.d.ts +1 -0
  22. package/dist/core/renderer/cellRangeVisualController.d.ts.map +1 -1
  23. package/dist/core/renderer/cellRangeVisualGeometry.d.ts +2 -1
  24. package/dist/core/renderer/cellRangeVisualGeometry.d.ts.map +1 -1
  25. package/dist/core/renderer/rowRenderer.d.ts.map +1 -1
  26. package/dist/core/renderer/spannedRowRenderer.d.ts +9 -0
  27. package/dist/core/renderer/spannedRowRenderer.d.ts.map +1 -1
  28. package/dist/core/row/rowComp.d.ts +2 -2
  29. package/dist/core/row/rowComp.d.ts.map +1 -1
  30. package/dist/core/selection/cellClipboardCell.d.ts +8 -2
  31. package/dist/core/selection/cellClipboardCell.d.ts.map +1 -1
  32. package/dist/core/selection/cellClipboardService.d.ts +3 -0
  33. package/dist/core/selection/cellClipboardService.d.ts.map +1 -1
  34. package/dist/core/selection/cellRangeService.d.ts +2 -0
  35. package/dist/core/selection/cellRangeService.d.ts.map +1 -1
  36. package/dist/core/span/cellRangeSpanSupport.d.ts +39 -0
  37. package/dist/core/span/cellRangeSpanSupport.d.ts.map +1 -0
  38. package/dist/core/span/index.d.ts +3 -1
  39. package/dist/core/span/index.d.ts.map +1 -1
  40. package/dist/core/span/rowSpan.d.ts +10 -7
  41. package/dist/core/span/rowSpan.d.ts.map +1 -1
  42. package/dist/core/theme/gridSize.d.ts +4 -0
  43. package/dist/core/theme/gridSize.d.ts.map +1 -1
  44. package/dist/core/theme/index.d.ts +2 -2
  45. package/dist/core/theme/index.d.ts.map +1 -1
  46. package/dist/core/types/cellRangeSelection.d.ts +24 -26
  47. package/dist/core/types/cellRangeSelection.d.ts.map +1 -1
  48. package/dist/core/types/cellSpan.d.ts +11 -0
  49. package/dist/core/types/cellSpan.d.ts.map +1 -1
  50. package/dist/core/types/columnAvailability.d.ts +6 -0
  51. package/dist/core/types/columnAvailability.d.ts.map +1 -0
  52. package/dist/core/types/index.d.ts +3 -2
  53. package/dist/core/types/index.d.ts.map +1 -1
  54. package/dist/core/types/rowComp.d.ts +2 -2
  55. package/dist/core/types/rowComp.d.ts.map +1 -1
  56. package/dist/core/types/rowGrouping.d.ts +1 -1
  57. package/dist/core/types/rowGrouping.d.ts.map +1 -1
  58. package/dist/index.cjs.js +5 -5
  59. package/dist/index.cjs.js.map +1 -1
  60. package/dist/index.d.ts +2 -2
  61. package/dist/index.d.ts.map +1 -1
  62. package/dist/index.es.js +4077 -3739
  63. package/dist/index.es.js.map +1 -1
  64. package/dist/style.css +1 -1
  65. package/dist/types/index.d.ts +1 -1
  66. package/dist/types/index.d.ts.map +1 -1
  67. package/dist/types/magic-grid.d.ts +18 -11
  68. package/dist/types/magic-grid.d.ts.map +1 -1
  69. package/dist/types/statusBar.d.ts +2 -0
  70. package/dist/types/statusBar.d.ts.map +1 -1
  71. package/package.json +1 -1
package/README.md CHANGED
@@ -6,10 +6,12 @@
6
6
 
7
7
  - [概述](#概述)
8
8
  - [快速开始](#快速开始)
9
+ - [默认配置](#默认配置)
9
10
  - [Props](#props)
10
11
  - [MagicGrid Props](#magicgrid-props)
11
12
  - [Grid 级默认与列级覆盖](#grid-级默认与列级覆盖)
12
13
  - [ColumnDef 列定义](#columndef-列定义)
14
+ - [列有效性与显隐](#列有效性与显隐)
13
15
  - [Options 类型参考](#options-类型参考)
14
16
  - [Events](#events)
15
17
  - [Expose](#expose)
@@ -19,7 +21,7 @@
19
21
  - [ColumnSettingsPanel](#columnsettingspanel)
20
22
  - [ColumnSettingsMenuItem](#columnsettingsmenuitem)
21
23
  - [ColumnSettingsMenuIcon](#columnsettingsmenuicon)
22
- - [相关文档](#相关文档)
24
+ - [校验子路径](#校验子路径)
23
25
 
24
26
  ---
25
27
 
@@ -32,7 +34,7 @@
32
34
  | **性能** | 行/列双轴虚拟化、DOM 池复用、RAF 帧预算分片、增量数据管线 |
33
35
  | **数据** | 排序、列筛选、Quick Filter、事务增量更新(`applyTransaction`)、行 CRUD |
34
36
  | **交互** | 单元格/行编辑、校验、行选择、索引列定位、框选与剪贴板 |
35
- | **布局** | 固定列、列拖拽/调整宽度、合并单元格、动态行高、主从展开行 |
37
+ | **布局** | 固定列、列拖拽/调整宽度、列有效性与显隐(`available` / `hidden`)、合并单元格、动态行高、主从展开行 |
36
38
  | **结构** | 行分组、树形表格(含懒加载)、表尾汇总 |
37
39
  | **体验** | 溢出 Tooltip、单元格批注、空态 Overlay、暗色主题、底部状态栏 |
38
40
 
@@ -123,15 +125,225 @@ const columns: ColumnDef[] = [
123
125
 
124
126
  ---
125
127
 
128
+ ## 默认配置
129
+
130
+ 以下为 `<MagicGrid>` **未显式传入 prop** 时的生效值。部分 prop 在组件层与内核层默认不同(标注 **MG** = MagicGrid 组件层覆盖),使用时以组件行为为准。
131
+
132
+ ### 尺寸 preset(`size`)
133
+
134
+ `rowHeight` / `headerHeight` / `statusBarHeight`(`statusBarHeight: 'auto'` 时)未显式传入时,由 `size` 推导:
135
+
136
+ | `size` | 行高 | 表头高 | 状态栏高 | 字号 | 间距 | 圆角(`rounded: true` 时) |
137
+ |--------|------|--------|----------|------|------|---------------------------|
138
+ | `mini` | 20 | 20 | 20 | 12 | 4 | 4 |
139
+ | `small` | 24 | 24 | 24 | 12 | 8 | 8 |
140
+ | `default` | 32 | 32 | 32 | 12 | 8 | 8 |
141
+ | `large` | 40 | 40 | 40 | 14 | 12 | 8 |
142
+
143
+ ### 基础与外观
144
+
145
+ | 配置项 | 默认值 | 说明 |
146
+ |--------|--------|------|
147
+ | `rowKey` | `'id'` | 行主键字段 |
148
+ | `height` / `width` | `'100%'` | 容器尺寸 |
149
+ | `stripe` | `false` | 斑马纹 |
150
+ | `border` | `'border'` | 全网格线 |
151
+ | `theme` | `'light'` | 亮色主题 |
152
+ | `size` | `'default'` | 尺寸 preset |
153
+ | `rounded` | `false` | 无圆角(`0`) |
154
+ | `rowHeight` / `headerHeight` | — | 跟随 `size` preset |
155
+ | `summaryRowHeight` | — | 跟随 `rowHeight` |
156
+
157
+ ### 对齐
158
+
159
+ | 配置项 | 默认值 |
160
+ |--------|--------|
161
+ | `headerAlign` / `headerValign` | `'center'` |
162
+ | `align` / `valign` | `'center'` |
163
+ | `footerAlign` / `footerValign` | `'center'` |
164
+
165
+ ### 虚拟化与导航
166
+
167
+ | 配置项 | 默认值 | 说明 |
168
+ |--------|--------|------|
169
+ | `rowBuffer` | `10` | 行虚拟化缓冲行数 |
170
+ | `navigateHeader` | `false` | 不允许焦点进入表头 |
171
+ | `navigateFooter` | `false` | 不允许焦点进入表尾 |
172
+ | `enableHeaderHighlight` | `true` | 框选时表头列高亮 |
173
+ | `enableIndexColumnHighlight` | `true` | 框选时索引列高亮 |
174
+
175
+ ### 索引列
176
+
177
+ | 配置项 | 默认值 | 说明 |
178
+ |--------|--------|------|
179
+ | `showIndexColumn` | `false` | 不显示索引列 |
180
+ | `indexColumn.label` | `''` | 表头文案 |
181
+ | `indexColumn.width` | `40` | 列宽 px(最小 40) |
182
+ | `indexColumn.start` | `1` | 起始序号 |
183
+ | `indexColumn.focusMode` | `'multiple'` | 辅助定位模式 |
184
+ | `indexColumn.syncToSelectionColumn` | `true` **(MG)** | 索引定位单向同步行选择 |
185
+ | `indexColumn.showRowDragHandle` | `false` | 不显示行拖拽把柄 |
186
+ | `indexColumn.enableRowResizer` | `false` | 不可拖拽调整行高 |
187
+
188
+ ### 行选择
189
+
190
+ | 配置项 | 默认值 | 说明 |
191
+ |--------|--------|------|
192
+ | `rowSelection` | `'single'` | 单选模式 |
193
+ | `selectionColumn.width` | `40` | 列宽 px |
194
+ | `selectionColumn.selectAllLabel` | `'全选'` | 全选 checkbox aria-label |
195
+ | `reserveSelection` | `false` | 数据刷新后不保留选中 |
196
+
197
+ `rowSelection` 对象形式时,`groupSelectsChildren` 默认 `true`(tree 模式父节点级联子孙)。
198
+
199
+ ### 表尾汇总
200
+
201
+ | 配置项 | 默认值 | 说明 |
202
+ |--------|--------|------|
203
+ | `showSummary` | `false` | 不展示汇总行 |
204
+ | `summaryScope` | `'displayed'` | 按当前可见行汇总 |
205
+
206
+ ### 排序 / 筛选 / 列操作
207
+
208
+ | 配置项 | 默认值 | 说明 |
209
+ |--------|--------|------|
210
+ | `sortable` | `false` | 全列默认不可排序 |
211
+ | `filterable` | `false` | 全列默认不可筛选 |
212
+ | `resizable` | `true` | 全列默认可调整列宽 |
213
+ | `columnMovable` | `true` | 全列默认可拖拽重排 |
214
+ | `quickFilterText` | `''` | 无 quick filter |
215
+ | `floatingFilter` | `false` | 无 floating filter 行 |
216
+ | `filterSetValueMode` | `'current'` | 值选择勾选投影模式 |
217
+ | `filterSetDateLayoutMode` | `'tree'` | 日期列值选择树形展示 |
218
+ | `colResizeDefault` | — | 未启用 Shift 邻列补偿 |
219
+ | `skipHeaderOnAutoSize` | `false` | auto-size 含表头宽度 |
220
+ | `autoSizePadding` | `16` | auto-size 额外 padding(px) |
221
+ | `suppressMoveWhenColumnDragging` | `false` | drag 过程中 live move |
222
+ | `suppressColumnMoveAnimation` | `false` | 列移动有过渡动画 |
223
+ | `allowCrossLaneColumnMove` | `false` | 不可跨 fixed lane 移动 |
224
+ | `showUnsortedSortHintOnHover` | `false` | 未排序列 hover 无双三角提示 |
225
+
226
+ ### 编辑
227
+
228
+ | 配置项 | 默认值 | 说明 |
229
+ |--------|--------|------|
230
+ | `editMode` | `'cell'` | 单格编辑 |
231
+ | `editType` | `'singleClick'` | 单击进入编辑 |
232
+ | `invalidEditValueMode` | `'block'` | 校验失败保持编辑态 |
233
+
234
+ ### 行拖拽与行高
235
+
236
+ | 配置项 | 默认值 | 说明 |
237
+ |--------|--------|------|
238
+ | `rowDragManaged` | `true` | managed 拖拽实时改序 |
239
+ | `rowDragCommitMode` | `'sync'` | 同步提交 |
240
+ | `rowHeightMin` | — | 跟随 size / rowHeight |
241
+ | `rowHeightMax` | — | 无上限 |
242
+
243
+ ### 合并 / 展开 / 分组 / 树
244
+
245
+ | 配置项 | 默认值 | 说明 |
246
+ |--------|--------|------|
247
+ | `enableCellSpan` | `false` | 不启用单元格合并 |
248
+ | `masterDetail` | `false` | 不启用主从展开 |
249
+ | `masterDefaultExpanded` | `0` | 默认不展开(启用 masterDetail 后) |
250
+ | `detailRowHeight` | `200` | 详情行高度 px |
251
+ | `detailRowAutoHeight` | `false` | 详情行固定高度 |
252
+ | `embedFullWidthRows` | `false` | 详情 overlay 不随横滚 |
253
+ | `showExpandColumn` | `false` | 不展示专用展开列 |
254
+ | `rowGrouping` | `false` | 不启用行分组 |
255
+ | `groupDefaultExpanded` | `-1` | 全部分组默认展开 |
256
+ | `showGroupHeader` / `showGroupFooter` | `false` | 不展示分组头/尾行 |
257
+ | `groupDisplayType` | `'singleColumn'` | 单列分组展示 |
258
+ | `showGroupColumn` | `false` | 不展示 auto group 列 |
259
+ | `tree` | `false` | 不启用树形表格 |
260
+ | `showTreeColumn` | `true` | 展示 tree 系统列(启用 tree 后) |
261
+ | `treeDragScope` | `'siblings'` | 树拖拽仅同层兄弟 |
262
+ | `treeDisplayType` | `'singleColumn'` | 单列树展示 |
263
+ | `treeLazyLoad` | `false` | 不启用懒加载 |
264
+
265
+ ### 批注
266
+
267
+ | 配置项 | 默认值 | 说明 |
268
+ |--------|--------|------|
269
+ | `suppressCellComments` | `false` | 不抑制批注 |
270
+ | `cellCommentTrigger` | `'click'` | 点击角标查看 |
271
+ | `cellCommentShowDelay` | `180` | hover 展示延迟 ms |
272
+ | `cellCommentHideDelay` | `220` | 离开隐藏延迟 ms |
273
+
274
+ ### 框选与剪贴板
275
+
276
+ | 配置项 | 默认值 | 说明 |
277
+ |--------|--------|------|
278
+ | `cellSelection` | `true` **(MG)** | 启用框选(Grid API 直连默认 `false`) |
279
+ | `cellSelection.enableColumnSelection` | `true` **(MG)** | 点击表头选中整列(Grid API 默认 `false`) |
280
+ | `cellSelection.suppressMultiRanges` | `true` | 仅允许单个 range |
281
+ | `cellSelection.handleMode` | `'off'` | 无 Fill/Range 拖拽柄 |
282
+ | `cellSelection.direction` | `'xy'` | fill 方向(handleMode 为 fill 时) |
283
+ | `cellSelection.fillStrategy` | `'copy'` | 填充策略 |
284
+ | `cellSelection.fillReverseStrategy` | `'default'` | 反拖缩小行为 |
285
+ | `enableCellCopy` | `true` | Ctrl+C / 复制 API |
286
+ | `enableCellPaste` | `false` | Ctrl+V / 粘贴 API |
287
+
288
+ ### Tooltip
289
+
290
+ | 配置项 | 默认值 | 说明 |
291
+ |--------|--------|------|
292
+ | `enableTooltips` | `true` | 启用溢出 tooltip |
293
+ | `tooltipShowMode` | `'whenTruncated'` | 仅溢出时展示 |
294
+ | `tooltipShowDelay` | `500` | 首次 hover 延迟 ms |
295
+ | `tooltipSwitchShowDelay` | `200` | 格间切换延迟 ms |
296
+ | `tooltipHideDelay` | `3000` | 离开后隐藏延迟 ms |
297
+ | `tooltipInteraction` | `false` | tooltip 不可交互 |
298
+ | `tooltipMouseTrack` | `false` | tooltip 不跟随鼠标 |
299
+
300
+ ### 空态 Overlay
301
+
302
+ | 配置项 | 默认值 | 说明 |
303
+ |--------|--------|------|
304
+ | `loading` | `undefined` | 挂载后首次 `setData` 前自动 loading |
305
+ | `overlayInteraction` | `false` | overlay 内容不可交互 |
306
+
307
+ ### 状态栏
308
+
309
+ | 配置项 | 默认值 | 说明 |
310
+ |--------|--------|------|
311
+ | `showStatusBar` | `true` | 显示底部状态栏 |
312
+ | `showDefaultStatusBarPanels` | `true` | 显示默认左侧面板 |
313
+ | `statusBarHeight` | `'auto'` | 跟随 size preset |
314
+ | `showStatusBarRangeAggregation` | `true` | 框选时展示聚合 |
315
+ | `statusBarRangeAggregationPosition` | `'right'` | 聚合 panel 在右栏 |
316
+ | `statusBarRangeAggregationPrecision` | `2` | 平均值/求和各 2 位小数 |
317
+
318
+ ### ColumnDef 列级默认
319
+
320
+ | 字段 | 默认值 | 说明 |
321
+ |------|--------|------|
322
+ | `available` | `true` | 列有效;`false` 时不进入列模型(表格中无此列) |
323
+ | `hidden` | `false` | 列可见;`true` 时仍在列模型中但不渲染(可 API/菜单恢复) |
324
+ | `sortable` / `filterable` | 继承 Grid 级(默认 `false`) | 列级显式配置优先 |
325
+ | `resizable` / `movable` | 继承 Grid 级(默认 `true`) | 列级显式配置优先 |
326
+ | `filterType` | `'text'` | 文本筛选 |
327
+ | `cellEditorMode` | `'overlay'` | 编辑 overlay 呈现 |
328
+ | `editType` | 继承 Grid 级 | — |
329
+ | `useParserForClipboard` | `true` | 粘贴走 valueParser |
330
+ | `useFormatterForClipboard` | `true` | 复制走 formatter |
331
+ | `summary` | 有 `summaryAgg` 时为 `true` | 否则 `false` |
332
+ | 对齐字段 | `'center'` | header / body / footer |
333
+
334
+ ---
335
+
126
336
  ## Props
127
337
 
338
+ > 各 prop 的默认值汇总见上一节 [默认配置](#默认配置)。下列按功能分组逐项说明类型、默认值与行为。
339
+
128
340
  ### MagicGrid Props
129
341
 
130
342
  #### 基础
131
343
 
132
344
  | Prop | 类型 | 默认值 | 说明 |
133
345
  |------|------|--------|------|
134
- | `columns` | `ColumnDef[]` | — | **必填**。列定义数组 |
346
+ | `columns` | `ColumnDef[]` | — | **必填**。列定义数组;`available: false` 的项仍可在 prop 中保留,但不会进入 Grid 列模型 |
135
347
  | `data` | `RowData[]` | — | **必填**。行数据(普通对象,禁止 reactive 深代理) |
136
348
  | `rowKey` | `string` | `'id'` | 行主键字段名,用于行池复用与增量更新 |
137
349
  | `height` | `string \| number` | `'100%'` | 容器高度 |
@@ -349,10 +561,9 @@ interface RowSelectionConfig {
349
561
 
350
562
  | Prop | 类型 | 默认值 | 说明 |
351
563
  |------|------|--------|------|
352
- | `cellSelection` | `boolean \| CellSelectionOptions` | `true` | 单元格框选;MagicGrid 默认开启、`enableColumnSelection` 为 `true`、`handle` 为 off;Grid API 未传时默认关闭 |
564
+ | `cellSelection` | `boolean \| CellSelectionOptions` | `true` | 单元格框选;MagicGrid 默认开启、`enableColumnSelection` 为 `true`、`handleMode` 为 off;Grid API 未传时默认关闭 |
353
565
  | `enableCellCopy` | `boolean` | `true` | Ctrl+C / `copySelectedRangeToClipboard` |
354
566
  | `enableCellPaste` | `boolean` | `false` | Ctrl+V / `pasteFromClipboard` |
355
- | `enableCellClipboard` | `boolean` | — | **已废弃**;未单独指定 copy/paste 时二者均继承本值 |
356
567
  | `processCellForClipboard` | `ProcessCellForClipboardFn` | — | 复制单格时自定义导出值 |
357
568
  | `processCellFromClipboard` | `ProcessCellFromClipboardFn` | — | 粘贴单格时预处理 clipboard 字符串 |
358
569
  | `processDataFromClipboard` | `ProcessDataFromClipboardFn` | — | 整表粘贴前处理 TSV 矩阵;return null 取消粘贴 |
@@ -363,21 +574,21 @@ interface RowSelectionConfig {
363
574
  |------|------|--------|------|
364
575
  | `suppressMultiRanges` | `boolean` | `true` | `true` 时仅允许单个 range |
365
576
  | `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'` | 填充方向 |
577
+ | `handleMode` | `'off' \| 'fill' \| 'range'` | `'off'` | Fill / Range 拖拽柄 |
578
+ | `direction` | `'x' \| 'y' \| 'xy'` | `'xy'` | `handleMode: 'fill'` 时填充方向 |
374
579
  | `fillStrategy` | `'auto' \| 'copy'` | `'copy'` | `'auto'`:数字递增、非数字复制;`'copy'`:始终复制源边值 |
375
580
  | `fillReverseStrategy` | `'default' \| 'clear'` | `'default'` | 反拖缩小时:`'default'` 不处理;`'clear'` 置空缩出初始选区的格 |
376
581
  | `setFillValue` | `(params: FillOperationParams) => unknown` | — | 自定义填充值;缺省按 `fillStrategy` |
377
582
 
378
- `RangeHandleOptions`(`handle: { mode: 'range' }`):仅含 `mode: 'range'`,用于右下角拖拽扩展选区。
583
+ `FillOperationParams`:`{ rowNode, column, baseValue, step, direction }`。
584
+
585
+ 框选行为要点:
379
586
 
380
- > 框选详细行为见 [`docs/35-phase24-cell-range-selection.md`](docs/35-phase24-cell-range-selection.md)
587
+ - 鼠标拖拽或 Shift+方向键扩展选区;`suppressMultiRanges: true` 时仅保留单个 range。
588
+ - `enableColumnSelection: true` 时点击表头选中整列;MagicGrid 默认开启。
589
+ - `handleMode: 'fill'` 启用填充柄;`'range'` 启用范围扩展柄;`'off'` 无柄(MagicGrid 默认)。
590
+ - Delete 键清空选区内可编辑格,触发 `cell-selection-delete-start` / `cell-selection-delete-end`。
591
+ - Ctrl+C / `copySelectedRangeToClipboard` 复制 TSV;Ctrl+V / `pasteFromClipboard` 粘贴(需 `enableCellPaste: true`)。
381
592
 
382
593
  #### Tooltip
383
594
 
@@ -420,8 +631,10 @@ interface RowSelectionConfig {
420
631
  | Prop | 类型 | 默认值 | 说明 |
421
632
  |------|------|--------|------|
422
633
  | `showStatusBar` | `boolean` | `true` | 是否显示底部状态栏 |
634
+ | `statusBarHeight` | `'auto' \| number` | `'auto'` | 状态栏高度;`auto` 跟随 size preset |
423
635
  | `showDefaultStatusBarPanels` | `boolean` | `true` | 显示默认状态栏左侧面板(行数/筛选态/选中数);`false` 时仍可自定义 `#status-bar-left` |
424
636
  | `showStatusBarRangeAggregation` | `boolean` | `true` | 框选时在状态栏展示平均值/计数/求和 |
637
+ | `statusBarRangeAggregationPosition` | `'left' \| 'right'` | `'right'` | 框选聚合 panel 位置(左栏/右栏内侧) |
425
638
  | `statusBarRangeAggregationPrecision` | `number \| { average?: number; sum?: number }` | `2` | 平均值/求和展示小数位数 |
426
639
 
427
640
  #### Grid 级默认与列级覆盖
@@ -465,7 +678,48 @@ interface RowSelectionConfig {
465
678
  | `key` | `string` | 列唯一标识(colId),缺省等于 `prop` |
466
679
  | `prop` | `string` | 数据字段 |
467
680
  | `label` | `string` | 表头文案 |
468
- | `hidden` | `boolean` | 是否隐藏该列(不渲染、不参与布局);默认 `false` |
681
+
682
+ #### 列有效性与显隐
683
+
684
+ 通过 `available` 与 `hidden` 控制列是否参与表格。二者均可在 `columns` prop 中动态修改;Grid 会重解析列模型并刷新布局。
685
+
686
+ | 字段 | 类型 | 默认 | 说明 |
687
+ |------|------|------|------|
688
+ | `available` | `boolean` | `true` | `false` 时该列**不存在于表格**(解析前从列模型裁剪 · 不参与布局/DOM · 无 `setColumnsHidden`) |
689
+ | `hidden` | `boolean` | `false` | `true` 时列**仍在列模型**中,仅不渲染(可通过 `setColumnsHidden` / 列菜单 / 列设置面板恢复) |
690
+
691
+ **语义对照**:
692
+
693
+ | | `available: false` | `hidden: true` |
694
+ |---|-------------------|----------------|
695
+ | `getColumns()` | **不含**该列 | **含**该列 |
696
+ | `getDisplayedColumns()` | **不含** | **不含** |
697
+ | DOM / 布局 | 不参与 | 不参与 |
698
+ | `setColumnsHidden` | 不适用(列不在模型中) | 可恢复显示 |
699
+ | sort / filter 模型 | 不应再引用该 colId | 仍可保留 · 表头无 UI |
700
+ | 列设置面板 | 不出现(未注册进模型) | 出现在「隐藏」分组 |
701
+ | 典型用途 | 按权限/场景裁剪列定义 | 用户临时隐藏列 |
702
+
703
+ ```ts
704
+ const columns: ColumnDef[] = [
705
+ { prop: 'name', label: '名称' },
706
+ // 表格中完全没有这一列(行数据字段可保留)
707
+ { prop: 'internalCode', label: '内部编码', available: false },
708
+ // 列仍在模型中,默认隐藏,API/菜单可恢复
709
+ { prop: 'note', label: '备注', hidden: true },
710
+ ]
711
+
712
+ // hidden 列:全量 vs 展示
713
+ api.getColumns().map((c) => c.colId) // 含 note
714
+ api.getDisplayedColumnIds() // 不含 note(除非已显示)
715
+
716
+ // available: false 的列不在 getColumns() 中
717
+ api.getColumns().some((c) => c.colId === 'internalCode') // false
718
+ ```
719
+
720
+ 修改 `columns` 中某列的 `available` 或 `hidden` 后,Grid 会走 `setColumns` 重解析。`hidden` 在 `columnDefs` 未改 `hidden` 声明时,会保留运行时 API/菜单设置的值(与 Phase 22 列显隐语义一致)。
721
+
722
+ Playground 验收:开发环境 `/phase22` · **T14–T15**(`legacyToken` 列可切换 `available`)。
469
723
 
470
724
  #### 尺寸
471
725
 
@@ -634,21 +888,14 @@ interface RowSelectionConfig {
634
888
  |------|------|--------|------|
635
889
  | `suppressMultiRanges` | `boolean` | `true` | 仅允许单个 range |
636
890
  | `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'` | 填充方向 |
891
+ | `handleMode` | `'off' \| 'fill' \| 'range'` | `'off'` | Fill / Range 拖拽柄 |
892
+ | `direction` | `'x' \| 'y' \| 'xy'` | `'xy'` | `handleMode: 'fill'` 时填充方向 |
644
893
  | `fillStrategy` | `'auto' \| 'copy'` | `'copy'` | 数字递增策略 |
645
894
  | `fillReverseStrategy` | `'default' \| 'clear'` | `'default'` | 反拖缩小行为 |
646
895
  | `setFillValue` | `(params: FillOperationParams) => unknown` | — | 自定义填充值 |
647
896
 
648
897
  `FillOperationParams`:`{ rowNode, column, baseValue, step, direction }`。
649
898
 
650
- **RangeHandleOptions**:`{ mode: 'range' }`,右下角拖拽扩展选区。
651
-
652
899
  **CellRange**(`addCellRange` / `getCellRanges` 返回值):
653
900
 
654
901
  ```ts
@@ -900,120 +1147,378 @@ type StatusBarRangeAggregationPrecisionInput =
900
1147
 
901
1148
  ## Events
902
1149
 
903
- MagicGrid 通过 Vue 事件向外暴露 Grid 内核事件。事件名采用 kebab-case
1150
+ MagicGrid 通过 Vue 事件向外暴露 Grid 内核事件。事件名采用 **kebab-case**。除 Vue 事件外,也可通过 `gridRef.api.on(...)` 订阅 camelCase 内核事件(见 [Expose](#expose))。
904
1151
 
905
1152
  ### 渲染与滚动
906
1153
 
907
- | 事件 | payload | 说明 |
908
- |------|----------|------|
909
- | `scroll` | `GridMetrics` | 滚动后触发(含 scrollTop、可见行范围等) |
910
- | `data-rendered` | `GridMetrics` | 数据渲染完成后触发 |
1154
+ #### `scroll`
1155
+
1156
+ 滚动后触发,payload `GridMetrics`:
1157
+
1158
+ | 字段 | 类型 | 说明 |
1159
+ |------|------|------|
1160
+ | `rowCount` | `number` | 过滤后显示行数 |
1161
+ | `sourceRowCount` | `number` | 源数据总行数 |
1162
+ | `columnCount` | `number` | 列数 |
1163
+ | `activeDomRowCount` | `number` | 行池活跃 DOM 行数 |
1164
+ | `domCellCount` | `number` | 表体单元格 DOM 数 |
1165
+ | `scrollTop` / `scrollLeft` | `number` | 当前滚动位置(px) |
1166
+ | `totalHeight` / `totalWidth` | `number` | 内容区总尺寸(px) |
1167
+ | `renderedFirstRow` / `renderedLastRow` | `number` | 渲染窗口行下标范围 |
1168
+ | `renderedFirstCol` / `renderedLastCol` | `number` | 渲染窗口列下标范围 |
1169
+ | `lastSetDataMs` | `number` | 最近一次 setData 耗时(ms) |
1170
+
1171
+ #### `data-rendered`
1172
+
1173
+ 数据渲染完成后触发,payload 同 `GridMetrics`。
911
1174
 
912
1175
  ### 交互
913
1176
 
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` | 索引列辅助定位变更 |
1177
+ #### `cell-clicked`
1178
+
1179
+ payload `CellClickedEvent`:
1180
+
1181
+ | 字段 | 类型 | 说明 |
1182
+ |------|------|------|
1183
+ | `rowId` | `BusinessRowId` | id |
1184
+ | `colId` | `string` | 列 id |
1185
+ | `rowIndex` | `number` | `rowsToDisplay` 中的行下标 |
1186
+ | `rowNode` | `RowNode` | 行节点快照 |
1187
+
1188
+ #### `row-click` / `row-dblclick`
1189
+
1190
+ payload 为 `RowClickedEvent` / `RowDoubleClickedEvent`:
1191
+
1192
+ | 字段 | 类型 | 说明 |
1193
+ |------|------|------|
1194
+ | `rowId` | `BusinessRowId` | 行 id |
1195
+ | `rowIndex` | `number` | 行下标 |
1196
+ | `rowNode` | `RowNode` | 行节点快照 |
1197
+ | `colId` | `string` | 触发点击/双击的列 id |
1198
+
1199
+ > 不含分组头行、详情行、表尾汇总行。
1200
+
1201
+ #### `selection-changed`
1202
+
1203
+ payload 为 `SelectionChangedEvent`:
1204
+
1205
+ | 字段 | 类型 | 说明 |
1206
+ |------|------|------|
1207
+ | `selectedRowIds` | `BusinessRowId[]` | 当前 checkbox 选中的行 id 列表 |
1208
+
1209
+ #### `index-focus-changed`
1210
+
1211
+ payload 为 `IndexFocusChangedEvent`:
1212
+
1213
+ | 字段 | 类型 | 说明 |
1214
+ |------|------|------|
1215
+ | `focusedRowIds` | `BusinessRowId[]` | 索引列辅助定位的行 id 列表 |
921
1216
 
922
1217
  ### 编辑
923
1218
 
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` | 行异步提交完成 |
1219
+ #### `cell-editing-started`
1220
+
1221
+ | 字段 | 类型 | 说明 |
1222
+ |------|------|------|
1223
+ | `rowId` | `BusinessRowId` | id |
1224
+ | `colId` | `string` | id |
1225
+ | `rowIndex` | `number` | 行下标 |
1226
+ | `value` | `unknown` | 进入编辑时的值 |
1227
+
1228
+ #### `cell-editing-stopped`
1229
+
1230
+ | 字段 | 类型 | 说明 |
1231
+ |------|------|------|
1232
+ | `rowId` / `colId` / `rowIndex` | — | 格位置 |
1233
+ | `committed` | `boolean` | 是否成功提交 |
1234
+ | `oldValue` / `newValue` | `unknown` | 编辑前后值 |
1235
+
1236
+ #### `cell-value-changed`
1237
+
1238
+ | 字段 | 类型 | 说明 |
1239
+ |------|------|------|
1240
+ | `rowId` / `colId` | — | 格位置 |
1241
+ | `oldValue` / `newValue` | `unknown` | 变更前后值 |
1242
+ | `rowNode` | `RowNode` | 行节点快照 |
1243
+
1244
+ #### `cell-commit-started` / `cell-commit-finished`
1245
+
1246
+ 异步提交生命周期:
1247
+
1248
+ | 字段 | 类型 | 说明 |
1249
+ |------|------|------|
1250
+ | `rowId` / `colId` / `rowIndex` | — | 格位置 |
1251
+ | `committed` | `boolean` | (finished)是否成功提交 |
1252
+ | `aborted` | `boolean` | (finished)是否被中断 |
1253
+
1254
+ #### `edit-commit-aborted`
1255
+
1256
+ | 字段 | 类型 | 说明 |
1257
+ |------|------|------|
1258
+ | `rowId` / `colId` / `rowIndex` | 可选 | 被中断的编辑格 |
1259
+
1260
+ #### `row-editing-started`
1261
+
1262
+ | 字段 | 类型 | 说明 |
1263
+ |------|------|------|
1264
+ | `rowId` / `rowIndex` | — | 行位置 |
1265
+ | `editableColIds` | `string[]` | 该行可编辑列 id 列表 |
1266
+
1267
+ #### `row-editing-stopped`
1268
+
1269
+ | 字段 | 类型 | 说明 |
1270
+ |------|------|------|
1271
+ | `rowId` / `rowIndex` | — | 行位置 |
1272
+ | `committed` | `boolean` | 是否成功提交 |
1273
+ | `changes` | `RowEditChange[]` | 变更列列表(`colId` / `oldValue` / `newValue`) |
1274
+
1275
+ #### `row-value-changed`
1276
+
1277
+ | 字段 | 类型 | 说明 |
1278
+ |------|------|------|
1279
+ | `rowId` / `rowIndex` | — | 行位置 |
1280
+ | `rowNode` | `RowNode` | 行节点快照 |
1281
+ | `data` | `RowData` | 提交后的行数据 |
1282
+ | `changes` | `RowEditChange[]` | 变更列列表 |
1283
+
1284
+ #### `row-commit-started` / `row-commit-finished`
1285
+
1286
+ 行级异步提交,字段语义同单元格 commit 事件。
937
1287
 
938
1288
  ### 校验
939
1289
 
940
- | 事件 | payload | 说明 |
941
- |------|---------|------|
942
- | `cell-validation-failed` | `CellValidationFailedEvent` | 单元格校验失败 |
943
- | `row-validation-failed` | `RowValidationFailedEvent` | 行校验失败 |
1290
+ #### `cell-validation-failed`
1291
+
1292
+ | 字段 | 类型 | 说明 |
1293
+ |------|------|------|
1294
+ | `rowId` / `colId` / `rowIndex` | — | 格位置 |
1295
+ | `errors` | `string[]` | 错误消息列表 |
1296
+ | `mode` | `'block' \| 'revert' \| 'keep'` | 当前 `invalidEditValueMode` |
1297
+
1298
+ #### `row-validation-failed`
1299
+
1300
+ | 字段 | 类型 | 说明 |
1301
+ |------|------|------|
1302
+ | `rowId` / `rowIndex` | — | 行位置 |
1303
+ | `failedColId` | `string` | 首个失败列 id |
1304
+ | `cellErrors` | `{ colId, errors }[]` | 各列错误(可选) |
1305
+ | `rowErrors` | `string[]` | 行级校验错误(可选) |
1306
+ | `mode` | `'block' \| 'revert' \| 'keep'` | 当前 invalid 模式 |
944
1307
 
945
1308
  ### 排序与筛选
946
1309
 
947
- | 事件 | payload | 说明 |
948
- |------|---------|------|
949
- | `sort-changed` | `SortModelItem[]` | 排序模型变更 |
950
- | `filter-changed` | `FilterModel` | 筛选模型变更 |
1310
+ #### `sort-changed`
1311
+
1312
+ payload `SortModelItem[]`(v1 至多 1 项):
1313
+
1314
+ | 字段 | 类型 | 说明 |
1315
+ |------|------|------|
1316
+ | `colId` | `string` | 排序列 id |
1317
+ | `sort` | `'asc' \| 'desc'` | 排序方向 |
1318
+
1319
+ #### `filter-changed`
1320
+
1321
+ payload 为 `FilterModel`(`Record<colId, FilterCondition>`)。各列条件结构因 `filterType` 而异(text / number / date / set / custom)。
951
1322
 
952
1323
  ### 列
953
1324
 
954
- | 事件 | payload | 说明 |
955
- |------|---------|------|
956
- | `column-moved` | `ColumnMovedEvent` | 列拖拽重排完成 |
957
- | `column-resized` | `ColumnResizedEvent` | 列宽调整 |
958
- | `column-pinned` | `ColumnPinnedEvent` | 列固定状态变更 |
959
- | `column-hidden-changed` | `ColumnHiddenChangedEvent` | 列显隐变更 |
1325
+ #### `column-moved`
1326
+
1327
+ | 字段 | 类型 | 说明 |
1328
+ |------|------|------|
1329
+ | `columnOrder` | `string[]` | 移动后的完整 colId 顺序(含系统列) |
1330
+ | `fromColId` | `string` | 被移动列 id |
1331
+ | `toIndex` | `number` | 目标全局下标 |
1332
+ | `finished` | `boolean` | `false` = drag 中 live move;`true` = mouseup 最终提交 |
1333
+ | `toFixed` | `'left' \| 'right' \| null` | 跨 lane 时移动列的新 fixed(lane 内省略) |
1334
+
1335
+ #### `column-resized`
1336
+
1337
+ | 字段 | 类型 | 说明 |
1338
+ |------|------|------|
1339
+ | `columns` | `{ colId, width }[]` | 本次宽度变化的列 |
1340
+ | `column` | `{ colId, width } \| null` | 仅单列变化时的便捷引用 |
1341
+ | `finished` | `boolean` | 拖拽过程 / 最终提交 |
1342
+ | `flexColumns` | `{ colId, width }[] \| null` | flex 被动调整的列 |
1343
+ | `source` | `ColumnResizeSource` | 触发来源(ui / api / autosize 等) |
1344
+
1345
+ #### `column-pinned`
1346
+
1347
+ | 字段 | 类型 | 说明 |
1348
+ |------|------|------|
1349
+ | `colId` | `string` | 列 id |
1350
+ | `pinned` | `'left' \| 'right' \| null` | 新的 fixed 状态 |
1351
+ | `source` | `string` | 变更来源 |
1352
+
1353
+ #### `column-hidden-changed`
1354
+
1355
+ 批量列显隐变更(**仅 `hidden` 列** · 不对 `available: false` 列触发)。
1356
+
1357
+ | 字段 | 类型 | 说明 |
1358
+ |------|------|------|
1359
+ | `colIds` | `string[]` | 受影响的列 id |
1360
+ | `hidden` | `boolean` | 新的 hidden 状态 |
1361
+ | `source` | `'api' \| 'columnDefs' \| 'menu'` | 变更来源 |
960
1362
 
961
1363
  ### 行 CRUD 与拖拽
962
1364
 
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` | 行高变更 |
1365
+ #### `rows-added`
1366
+
1367
+ | 字段 | 类型 | 说明 |
1368
+ |------|------|------|
1369
+ | `rows` | `RowMutationRowSnapshot[]` | 新增行快照(含 `rowId` / `data`) |
1370
+
1371
+ #### `rows-removed`
1372
+
1373
+ | 字段 | 类型 | 说明 |
1374
+ |------|------|------|
1375
+ | `rows` | `RowMutationRemovedSnapshot[]` | 删除行快照 |
1376
+
1377
+ #### `row-id-promoted`
1378
+
1379
+ | 字段 | 类型 | 说明 |
1380
+ |------|------|------|
1381
+ | `oldRowId` | `BusinessRowId` | 临时 id(`__mg_tmp_*`) |
1382
+ | `newRowId` | `BusinessRowId` | 正式业务主键 |
1383
+ | `data` | `RowData` | 更新后的行数据 |
1384
+
1385
+ #### `row-moved`
1386
+
1387
+ | 字段 | 类型 | 说明 |
1388
+ |------|------|------|
1389
+ | `rowId` | `BusinessRowId` | 被移动行 id |
1390
+ | `fromIndex` / `toIndex` | `number` | source 顺序下的起止下标 |
1391
+ | `source` | `RowMoveSource` | `'uiRowDrag'` / `'api'` 等 |
1392
+ | `finished` | `boolean` | live drag 中间态为 `false` |
1393
+
1394
+ #### `row-drag-end`
1395
+
1396
+ `rowDragManaged: false` 时由业务自行改序。payload 为 `RowDragEndEvent`:
1397
+
1398
+ | 字段 | 类型 | 说明 |
1399
+ |------|------|------|
1400
+ | `rowId` | `BusinessRowId` | 被拖拽行 id |
1401
+ | `rowIds` | `BusinessRowId[]` | 多行 drag 时的全部 id |
1402
+ | `displayIndex` | `number` | drop 时 display 插入位;`-1` = 无效 |
1403
+ | `finished` | `boolean` | 是否 mouseup 最终提交 |
1404
+ | `parentRowId` / `siblingIndex` / `treeLevel` | 可选 | 树形 drop 上下文 |
1405
+
1406
+ #### `row-drag-commit-started` / `row-drag-commit-finished`
1407
+
1408
+ deferred 模式(`rowDragCommitMode: 'deferred'`)commit 生命周期事件。
1409
+
1410
+ #### `row-height-changed`
1411
+
1412
+ | 字段 | 类型 | 说明 |
1413
+ |------|------|------|
1414
+ | `rowId` | `BusinessRowId` | 行 id |
1415
+ | `height` | `number` | 新的行高 px |
1416
+ | `finished` | `boolean` | resize 过程 / 最终提交 |
1417
+ | `source` | `string` | 触发来源 |
973
1418
 
974
1419
  ### 展开行
975
1420
 
976
- | 事件 | payload | 说明 |
977
- |------|---------|------|
978
- | `row-expanded` | `RowExpansionChangedEvent` | 主行展开 |
979
- | `row-collapsed` | `RowExpansionChangedEvent` | 主行折叠 |
1421
+ #### `row-expanded` / `row-collapsed`
1422
+
1423
+ payload `RowExpansionChangedEvent`:
1424
+
1425
+ | 字段 | 类型 | 说明 |
1426
+ |------|------|------|
1427
+ | `rowId` | `BusinessRowId` | 主行 id |
1428
+ | `expanded` | `boolean` | 展开 / 折叠 |
980
1429
 
981
1430
  ### 行分组
982
1431
 
983
- | 事件 | payload | 说明 |
984
- |------|---------|------|
985
- | `row-group-opened` | `RowGroupOpenedEvent` | 分组节点展开/折叠 |
986
- | `row-group-changed` | `RowGroupChangedEvent` | 分组列配置变更 |
1432
+ #### `row-group-opened`
1433
+
1434
+ | 字段 | 类型 | 说明 |
1435
+ |------|------|------|
1436
+ | `groupId` | `string` | 分组节点 id |
1437
+ | `expanded` | `boolean` | 展开 / 折叠 |
1438
+ | `field` | `string` | 分组字段 |
1439
+ | `key` | `string` | 分组键值 |
1440
+ | `level` | `number` | 分组层级 |
1441
+ | `source` | `RowGroupingSource` | 触发来源 |
1442
+
1443
+ #### `row-group-changed`
1444
+
1445
+ | 字段 | 类型 | 说明 |
1446
+ |------|------|------|
1447
+ | `columns` | `string[]` | 当前分组列 id 列表 |
1448
+ | `source` | `RowGroupingSource` | 触发来源 |
987
1449
 
988
1450
  ### 树形表格
989
1451
 
990
- | 事件 | payload | 说明 |
991
- |------|---------|------|
992
- | `tree-node-opened` | `TreeNodeOpenedEvent` | 树节点展开/折叠 |
993
- | `tree-children-loading` | `TreeChildrenLoadingEvent` | 懒加载子节点开始 |
994
- | `tree-children-loaded` | `TreeChildrenLoadedEvent` | 懒加载子节点成功 |
995
- | `tree-children-load-failed` | `TreeChildrenLoadFailedEvent` | 懒加载子节点失败 |
1452
+ #### `tree-node-opened`
1453
+
1454
+ | 字段 | 类型 | 说明 |
1455
+ |------|------|------|
1456
+ | `rowId` | `BusinessRowId` | 节点 id |
1457
+ | `expanded` | `boolean` | 展开 / 折叠 |
1458
+ | `level` | `number` | 树层级 |
1459
+ | `dataPath` | `string[]` | 节点路径 |
1460
+ | `source` | `TreeTableSource` | 触发来源 |
1461
+
1462
+ #### `tree-children-loading`
1463
+
1464
+ | 字段 | 类型 | 说明 |
1465
+ |------|------|------|
1466
+ | `parentRowId` | `BusinessRowId` | 父节点 id |
1467
+ | `dataPath` | `string[]` | 父节点路径 |
1468
+ | `treeLevel` | `number` | 树层级 |
1469
+ | `source` | `TreeTableSource` | 触发来源 |
1470
+
1471
+ #### `tree-children-loaded`
1472
+
1473
+ | 字段 | 类型 | 说明 |
1474
+ |------|------|------|
1475
+ | `parentRowId` | `BusinessRowId` | 父节点 id |
1476
+ | `children` | `RowData[]` | 加载的子行数据 |
1477
+ | `childCount` | `number` | 子行数量 |
1478
+ | `source` | `TreeTableSource` | 触发来源 |
1479
+
1480
+ #### `tree-children-load-failed`
1481
+
1482
+ | 字段 | 类型 | 说明 |
1483
+ |------|------|------|
1484
+ | `parentRowId` | `BusinessRowId` | 父节点 id |
1485
+ | `reason` | `string` | 失败原因(可选) |
1486
+ | `aborted` | `boolean` | 是否被中断 |
996
1487
 
997
1488
  ### 批注
998
1489
 
999
- | 事件 | payload | 说明 |
1000
- |------|---------|------|
1001
- | `cell-comment-changed` | `CellCommentChangedEvent` | 单元格批注变更 |
1490
+ #### `cell-comment-changed`
1491
+
1492
+ | 字段 | 类型 | 说明 |
1493
+ |------|------|------|
1494
+ | `rowId` / `colId` | — | 格位置 |
1495
+ | `comment` | `CellComment \| undefined` | 新批注;`undefined` 表示删除 |
1002
1496
 
1003
1497
  ### 框选
1004
1498
 
1005
- | 事件 | payload | 说明 |
1006
- |------|---------|------|
1007
- | `cell-selection-changed` | `CellSelectionChangedEvent` | 框选范围变更 |
1008
- | `cell-selection-delete-start` | `CellSelectionDeleteStartEvent` | Delete 清空选区开始 |
1009
- | `cell-selection-delete-end` | `CellSelectionDeleteEndEvent` | Delete 清空选区结束 |
1499
+ #### `cell-selection-changed`
1500
+
1501
+ | 字段 | 类型 | 说明 |
1502
+ |------|------|------|
1503
+ | `ranges` | `CellRange[]` | 当前选区列表 |
1504
+ | `source` | `CellSelectionSource` | 变更来源(ui / api 等) |
1505
+
1506
+ `CellRange`:`{ startRowIndex, endRowIndex, startColId, endColId }`。
1507
+
1508
+ #### `cell-selection-delete-start` / `cell-selection-delete-end`
1509
+
1510
+ | 字段 | 类型 | 说明 |
1511
+ |------|------|------|
1512
+ | `ranges` | `CellRange[]` | 被清空的选区 |
1513
+ | `changedCellCount` | `number` | (end)实际变更的格数 |
1010
1514
 
1011
1515
  ### 空态
1012
1516
 
1013
- | 事件 | payload | 说明 |
1014
- |------|---------|------|
1015
- | `overlay-shown` | `OverlayShownEvent` | overlay 显示 |
1016
- | `overlay-hidden` | `OverlayHiddenEvent` | overlay 隐藏 |
1517
+ #### `overlay-shown` / `overlay-hidden`
1518
+
1519
+ | 字段 | 类型 | 说明 |
1520
+ |------|------|------|
1521
+ | `overlayType` | `'loading' \| 'noRows' \| 'noMatchingRows'` | overlay 类型 |
1017
1522
 
1018
1523
  ### 事件监听示例
1019
1524
 
@@ -1025,41 +1530,44 @@ MagicGrid 通过 Vue 事件向外暴露 Grid 内核事件。事件名采用 keba
1025
1530
  />
1026
1531
  ```
1027
1532
 
1028
- 除 Vue 事件外,也可通过 `gridRef.api` 订阅内核事件(见 [Expose](#expose))。
1029
-
1030
1533
  ---
1031
1534
 
1032
1535
  ## Expose
1033
1536
 
1034
1537
  通过组件 `ref` 获取 `MagicGridExpose` 实例,进行命令式操作。
1035
1538
 
1539
+ ### MagicGridExpose 方法
1540
+
1541
+ | 成员 | 类型 | 说明 |
1542
+ |------|------|------|
1543
+ | `api` | `Ref<GridApi \| undefined>` | GridApi 实例;挂载完成后可用 |
1544
+ | `getMetrics()` | `() => GridMetrics \| undefined` | 读取渲染与滚动指标(同 `scroll` / `data-rendered` 事件 payload) |
1545
+ | `scrollTo(scrollTop, scrollLeft?)` | `(number, number?) => void` | 编程式滚动;scrollLeft 省略时保持当前值 |
1546
+ | `setSortModel(model)` | `(SortModelItem[]) => void` | 设置排序模型并重算 display 行 |
1547
+ | `getSortModel()` | `() => SortModelItem[]` | 读取当前排序模型 |
1548
+ | `setFilterModel(model)` | `(FilterModel) => void` | 设置筛选模型并重算 display 行 |
1549
+ | `getData(options?)` | `(GetDataOptions?) => RowData[]` | 导出业务数据;等价于 `api.getData()` |
1550
+ | `applyTransaction(tx)` | `(RowTransaction) => Promise<RowNodeTransaction \| undefined>` | 增量事务 add/update/remove |
1551
+ | `beginUpdate()` | `() => void` | 开启批量更新;与 `endUpdate` 配对 |
1552
+ | `endUpdate()` | `() => void` | 结束批量更新并 flush 累积变更 |
1553
+ | `ensureIndexVisible(index, position?)` | `(number, 'top'\|'bottom'\|'middle'?) => void` | 滚动使行下标进入视口;position 默认 `'middle'` |
1554
+ | `flushFrames()` | `() => void` | 强制 flush 待渲染帧(测试/同步场景) |
1555
+
1036
1556
  ### 类型定义
1037
1557
 
1038
1558
  ```ts
1039
1559
  interface MagicGridExpose {
1040
- /** GridApi 实例(Ref) */
1041
1560
  api: Ref<GridApi | undefined>
1042
- /** 读取渲染与滚动指标 */
1043
1561
  getMetrics: () => GridMetrics | undefined
1044
- /** 编程式滚动 */
1045
1562
  scrollTo: (scrollTop: number, scrollLeft?: number) => void
1046
- /** 设置排序模型 */
1047
1563
  setSortModel: (model: SortModelItem[]) => void
1048
- /** 读取排序模型 */
1049
1564
  getSortModel: () => SortModelItem[]
1050
- /** 设置筛选模型 */
1051
1565
  setFilterModel: (model: FilterModel) => void
1052
- /** 导出当前表格业务数据 */
1053
1566
  getData: (options?: GetDataOptions) => RowData[]
1054
- /** 增量事务:add / update / remove */
1055
1567
  applyTransaction: (transaction: RowTransaction) => Promise<RowNodeTransaction | undefined>
1056
- /** 开启批量更新(与 endUpdate 配对) */
1057
1568
  beginUpdate: () => void
1058
- /** 结束批量更新并 flush */
1059
1569
  endUpdate: () => void
1060
- /** 滚动使指定行下标进入视口 */
1061
1570
  ensureIndexVisible: (index: number, position?: 'top' | 'bottom' | 'middle') => void
1062
- /** 强制 flush 待渲染帧 */
1063
1571
  flushFrames: () => void
1064
1572
  }
1065
1573
  ```
@@ -1095,109 +1603,109 @@ function scrollToRow(index: number) {
1095
1603
 
1096
1604
  ### GridApi(`gridRef.api`)
1097
1605
 
1098
- `api` 是完整的命令式 API 面,按职责分组如下。完整参考见 [`docs/16-grid-api-reference.md`](docs/16-grid-api-reference.md)。
1606
+ `api` 是完整的命令式 API 面。以下按职责分组列出全部公开方法;入参 rowId 均接受 `string | number`,出参 rowId 恒为 `string`。
1099
1607
 
1100
1608
  #### 数据
1101
1609
 
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?)` | 编程式移动行 |
1610
+ | 方法 | 参数 | 返回值 | 说明 |
1611
+ |------|------|--------|------|
1612
+ | `setData(rows)` | `RowData[]` | `void` | 全量替换数据;触发完整重绘 |
1613
+ | `applyTransaction(tx)` | `{ add?, update?, remove? }` | `Promise<RowNodeTransaction>` | 增量事务 add/update/remove |
1614
+ | `addRows(options)` | `AddRowsOptions` | `Promise<RowNodeTransaction>` | 指定位置插入行;省略 rowKey 生成临时行 |
1615
+ | `removeRows(options)` | `{ rowIds?, indexes?, indexMode? }` | `Promise<RowNodeTransaction>` | 按 rowId 或下标删除 |
1616
+ | `getData(options?)` | `{ sourceOrder?: boolean }` | `RowData[]` | 导出业务数据;默认 source 顺序 |
1617
+ | `promoteRowId(options)` | `{ rowId, businessId }` | `PromoteRowIdResult` | 临时 id 提升为正式主键 |
1618
+ | `moveRow(rowId, toIndex, indexMode?)` | rowId / 目标下标 / `'source'\|'display'` | `RowMoveResult` | 编程式移动行 |
1111
1619
 
1112
1620
  #### 排序 / 筛选
1113
1621
 
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 勾选列表) |
1622
+ | 方法 | 参数 | 说明 |
1623
+ |------|------|------|
1624
+ | `setSortModel(model)` / `getSortModel()` | `SortModelItem[]` | 排序模型读写;触发 `sortChanged` |
1625
+ | `setFilterModel(model)` / `getFilterModel()` | `FilterModel` | 筛选模型读写;触发 `filterChanged` |
1626
+ | `setColumnFilter(colId, condition)` | condition 或 `null` 清除 | 设置单列筛选 |
1627
+ | `getColumnFilter(colId)` | | 读取单列条件;未设置返回 `null` |
1628
+ | `isColumnFilterActive(colId)` | — | 单列是否有有效筛选 |
1629
+ | `isAnyFilterActive()` | — | 任一列 filter 或 quick filter 是否 active |
1630
+ | `setQuickFilterText(text)` / `getQuickFilterText()` | `string` | Quick filter 读写 |
1631
+ | `clearAllFilters()` | | 清除全部列筛选 + quick filter |
1632
+ | `getColumnDistinctFilterValues(colId)` | — | 列 distinct 值(set filter 勾选列表) |
1125
1633
 
1126
1634
  #### 列
1127
1635
 
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?)` | 列宽按比例分配至视口 |
1636
+ | 方法 | 参数 | 说明 |
1637
+ |------|------|------|
1638
+ | `moveColumn(colId, toIndex)` | 全局 columns 下标 | 编程式移动列 |
1639
+ | `resetColumnOrder()` | — | 各 lane 内用户列恢复 defOrder |
1640
+ | `resetColumnWidths()` | — | 用户列恢复 defWidth/defFlex |
1641
+ | `setColumnFixed(colId, fixed)` | `'left' \| 'right' \| null` | 运行时改列 fixed |
1642
+ | `setColumnsHidden(colIds, hidden)` | — | 批量设置列 hidden(仅对列模型中存在的列生效) |
1643
+ | `isColumnHidden(colId)` | — | 列是否 hidden |
1644
+ | `getDisplayedColumnIds()` | — | 当前 UI 展示列 id(左→右 · 跳过 hidden) |
1645
+ | `getColumns()` / `getDisplayedColumns()` | | 全量列(含 hidden · 不含 `available: false`)/ 展示列(不含 hidden) |
1646
+ | `setColumnWidth(colId, width, finished?, source?)` | finished 默认 `true` | 设置单列宽度 |
1647
+ | `setColumnWidths(payloads, finished?, source?)` | `{ colId, width }[]` | 批量设置列宽 |
1648
+ | `getColumnWidth(colId)` | — | 读取列当前像素宽度 |
1649
+ | `autoSizeColumn(colId, skipHeader?)` | skipHeader 默认 `false` | 按内容 auto-size |
1650
+ | `autoSizeColumns(colIds, skipHeader?)` | — | 批量 auto-size |
1651
+ | `sizeColumnsToFit(params?)` | `SizeColumnsToFitParams` | 列宽按比例分配至视口 |
1144
1652
 
1145
1653
  #### 行高
1146
1654
 
1147
- | 方法 | 说明 |
1148
- |------|------|
1149
- | `setRowHeight(rowId, height, finished?)` | 设置单行高度 |
1150
- | `setRowHeights(changes, finished?)` | 批量设置行高 |
1151
- | `getRowHeight(rowId)` | 读取行当前有效高度 |
1152
- | `resetRowHeights(rowIds?)` | 清除 pinned 并重算行高 |
1153
- | `updateDimensions(params)` | 热更新默认行高与 clamp 边界 |
1655
+ | 方法 | 参数 | 说明 |
1656
+ |------|------|------|
1657
+ | `setRowHeight(rowId, height, finished?)` | finished 默认 `true` | 设置单行高度并 pinned |
1658
+ | `setRowHeights(changes, finished?)` | `{ rowId, height }[]` | 批量设置行高 |
1659
+ | `getRowHeight(rowId)` | | 读取行当前有效高度;不存在返回 `null` |
1660
+ | `resetRowHeights(rowIds?)` | 省略则全部 | 清除 pinned 并重算行高 |
1661
+ | `updateDimensions(params)` | `{ rowHeight?, rowHeightMin?, rowHeightMax? }` | 热更新默认行高与 clamp |
1154
1662
 
1155
1663
  #### 渲染 / 视口
1156
1664
 
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?)` | 编程式滚动 |
1665
+ | 方法 | 参数 | 返回值 | 说明 |
1666
+ |------|------|--------|------|
1667
+ | `refreshCells(params?)` | `{ rowIds?, colIds?, force? }` | `number` | 刷新指定格 DOM |
1668
+ | `refreshCellSpans()` | | `void` | 强制重建合并 cache |
1669
+ | `getCellSpan(rowId, colId)` | — | `CellSpanInfo \| null` | 查询 span 信息 |
1670
+ | `ensureIndexVisible(index, position?)` | position 默认 `'middle'` | `void` | 滚动使行下标进入视口 |
1671
+ | `getRowNode(id)` | rowId | `RowNode \| undefined` | id 获取行节点 |
1672
+ | `getMetrics()` | — | `GridMetrics` | 读取渲染与滚动指标 |
1673
+ | `beginUpdate()` / `endUpdate()` | | `void` | 批量更新(与 applyTransaction 配对) |
1674
+ | `scrollTo(scrollTop, scrollLeft?)` | px | `void` | 编程式滚动 |
1167
1675
 
1168
1676
  #### 编辑
1169
1677
 
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)` | 注销实例级编辑器 |
1678
+ | 方法 | 参数 | 返回值 | 说明 |
1679
+ |------|------|--------|------|
1680
+ | `startEditingCell({ rowIndex, colKey })` | colKey = colId 或 prop | `void` | 编程式进入编辑 |
1681
+ | `stopEditing(cancel?)` | cancel 默认 `false` | `Promise<void>` | 结束编辑;`true` 丢弃修改 |
1682
+ | `isEditing()` | — | `boolean` | 是否存在编辑态 |
1683
+ | `isCommitting()` | — | `boolean` | 是否正在异步提交 |
1684
+ | `cancelCommit()` | | `void` | 中断异步提交 |
1685
+ | `getEditSessionPhase()` | | `'idle' \| 'editing' \| 'committing' \| 'cancelling'` | 编辑会话阶段 |
1686
+ | `getEditingCell()` | | `{ rowId, colId } \| null` | 当前主编辑格 |
1687
+ | `getEditingCells()` | | `EditingCellPosition[]` | 行编辑模式下全部编辑格 |
1688
+ | `registerCellEditor(name, editor)` | | `void` | 注册实例级命名编辑器 |
1689
+ | `unregisterCellEditor(name)` | — | `boolean` | 注销实例级编辑器 |
1182
1690
 
1183
1691
  #### 校验
1184
1692
 
1185
- | 方法 | 说明 |
1186
- |------|------|
1187
- | `validate(options?)` | 校验全表或指定行 |
1188
- | `validateRows(options)` | 校验指定行列表 |
1189
- | `validateCells(options)` | 校验指定单元格列表 |
1190
- | `clearValidation(options?)` | 清除校验视觉反馈 |
1191
- | `clearRowValidation(options)` | 清除指定行校验反馈 |
1192
- | `clearCellValidation(options)` | 清除指定单元格校验反馈 |
1693
+ | 方法 | 参数 | 返回值 | 说明 |
1694
+ |------|------|--------|------|
1695
+ | `validate(options?)` | `ValidateGridOptions` | `Promise<GridValidationResult>` | 校验全表或指定行 |
1696
+ | `validateRows(options)` | rowIds 必填 | `Promise<GridValidationResult>` | 校验指定行 |
1697
+ | `validateCells(options)` | cells 必填 | `Promise<GridValidationResult>` | 校验指定格 |
1698
+ | `clearValidation(options?)` | — | `void` | 清除校验视觉反馈 |
1699
+ | `clearRowValidation(options)` | rowIds 必填 | `void` | 清除指定行反馈 |
1700
+ | `clearCellValidation(options)` | cells 必填 | `void` | 清除指定格反馈 |
1193
1701
 
1194
1702
  #### 行选择 / 索引定位
1195
1703
 
1196
- | 方法 | 说明 |
1197
- |------|------|
1198
- | `toggleRowSelection(rowIds, selected?, force?)` | 切换或设置行 checkbox 选中 |
1199
- | `toggleAllSelection(selected?)` | 表头全选 checkbox 操作 |
1200
- | `setIndexFocus(rowIds)` | 设置索引列辅助定位 |
1704
+ | 方法 | 参数 | 说明 |
1705
+ |------|------|------|
1706
+ | `toggleRowSelection(rowIds, selected?, force?)` | selected 省略时 toggle | 切换/设置 checkbox 选中 |
1707
+ | `toggleAllSelection(selected?)` | multiple 模式 | 表头全选操作 |
1708
+ | `setIndexFocus(rowIds)` | — | 设置索引列辅助定位 |
1201
1709
 
1202
1710
  #### 展开 / 分组 / 树
1203
1711
 
@@ -1219,9 +1727,12 @@ function scrollToRow(index: number) {
1219
1727
  |------|------|
1220
1728
  | `getCellComment(rowId, colId)` / `setCellComment(...)` | 批注读写 |
1221
1729
  | `refreshCellComments(params?)` | 刷新批注角标 |
1222
- | `getCellRanges()` / `clearCellSelection()` / `addCellRange(params)` | 框选操作 |
1223
- | `getCellSelectionAggregation()` | 当前框选聚合统计 |
1224
- | `copySelectedRangeToClipboard()` / `pasteFromClipboard()` | 剪贴板操作 |
1730
+ | `getCellRanges()` | 读取当前框选 range 列表 |
1731
+ | `clearCellSelection()` | 清除框选 |
1732
+ | `addCellRange(params)` | 编程式添加 range |
1733
+ | `getCellSelectionAggregation()` | 选区聚合统计(count / sum / average) |
1734
+ | `copySelectedRangeToClipboard()` | 复制选区至剪贴板 |
1735
+ | `pasteFromClipboard()` | 从剪贴板粘贴至选区 |
1225
1736
  | `showLoadingOverlay()` / `showNoRowsOverlay()` / `hideOverlay()` | overlay 控制 |
1226
1737
  | `isOverlayShowing()` / `getOverlayType()` | overlay 状态查询 |
1227
1738
  | `refreshDisabledState(params?)` | 重算 disabled 投影 |
@@ -1229,13 +1740,24 @@ function scrollToRow(index: number) {
1229
1740
 
1230
1741
  #### 事件订阅
1231
1742
 
1743
+ GridApi 支持 `on(eventType, handler)` 订阅内核事件(camelCase),返回取消函数:
1744
+
1745
+ | 内核事件名 | 对应 Vue 事件 |
1746
+ |------------|---------------|
1747
+ | `selectionChanged` | `selection-changed` |
1748
+ | `cellValueChanged` | `cell-value-changed` |
1749
+ | `sortChanged` | `sort-changed` |
1750
+ | `filterChanged` | `filter-changed` |
1751
+ | `columnMoved` | `column-moved` |
1752
+ | `cellSelectionChanged` | `cell-selection-changed` |
1753
+ | … | 其余见 [Events](#events) |
1754
+
1232
1755
  ```ts
1233
1756
  const api = gridRef.value?.api
1234
1757
  const off = api?.on('selectionChanged', (event) => {
1235
1758
  console.log(event.selectedRowIds)
1236
1759
  })
1237
- // 取消订阅
1238
- off?.()
1760
+ off?.() // 取消订阅
1239
1761
  ```
1240
1762
 
1241
1763
  ### rowId 约定
@@ -1248,7 +1770,23 @@ off?.()
1248
1770
 
1249
1771
  ## Slots
1250
1772
 
1251
- MagicGrid 提供静态插槽与动态列插槽两类。
1773
+ MagicGrid 提供**静态插槽**(固定名称)与**动态列插槽**(`#cell-{colId}` / `#cell-editor-{colId}`)两类。插槽与同名 prop / 列配置的优先级见文末 [插槽优先级说明](#插槽优先级说明)。
1774
+
1775
+ ### 插槽一览
1776
+
1777
+ | 插槽名 | 类型 | 说明 |
1778
+ |--------|------|------|
1779
+ | `#toolbar` | 静态 | 表格顶部工具栏 |
1780
+ | `#status-bar` | 静态 | 完全自定义底部状态栏(提供时替换默认布局) |
1781
+ | `#status-bar-left` | 静态 | 默认状态栏左侧区域 |
1782
+ | `#status-bar-right` | 静态 | 默认状态栏右侧区域 |
1783
+ | `#cell-{colId}` | 动态 | 自定义单元格渲染 |
1784
+ | `#cell-editor-{colId}` | 动态 | 自定义单元格编辑器 |
1785
+ | `#detail-row` | 静态 | 主从展开行详情区 |
1786
+ | `#tooltip` | 静态 | 全局自定义 tooltip |
1787
+ | `#loading` | 静态 | loading overlay 内容 |
1788
+ | `#no-rows` | 静态 | 无数据 overlay 内容 |
1789
+ | `#no-matching-rows` | 静态 | 筛选无匹配 overlay 内容 |
1252
1790
 
1253
1791
  ### 布局插槽
1254
1792
 
@@ -1588,7 +2126,7 @@ const gridRef = ref<MagicGridExpose>()
1588
2126
 
1589
2127
  ### ColumnSettingsPanel
1590
2128
 
1591
- 列设置面板本体。按 **左固定 / 中心 / 右固定 / 隐藏** 四组展示用户列,每行支持拖拽排序、排序切换、筛选面板、固定列、显隐控制;面板头部提供「清除全部筛选」。
2129
+ 列设置面板本体。按 **左固定 / 中心 / 右固定 / 隐藏** 四组展示**已注册进列模型**的用户列(`available: false` 的列不会出现);每行支持拖拽排序、排序切换、筛选面板、固定列、显隐控制;面板头部提供「清除全部筛选」。
1592
2130
 
1593
2131
  > 通常由 `ColumnSettingsButton` 内嵌使用;也可单独 import 嵌入任意容器。
1594
2132
 
@@ -1600,7 +2138,7 @@ const gridRef = ref<MagicGridExpose>()
1600
2138
  | 列排序 | 点击循环 none → asc → desc | `setSortModel` |
1601
2139
  | 列筛选 | 行内展开筛选面板(与表头 filter 同源) | `setColumnFilter` / `clearAllFilters` |
1602
2140
  | 列固定 | 切换 null / left / right | `setColumnFixed` |
1603
- | 列显隐 | checkbox 切换 hidden | `setColumnsHidden` |
2141
+ | 列显隐 | checkbox 切换 `hidden`(不含 `available: false` 列) | `setColumnsHidden` |
1604
2142
  | 清除全部筛选 | 面板头部按钮 | `clearAllFilters` |
1605
2143
  | 显示全部隐藏列 | hidden 分组底部操作 | `setColumnsHidden(colIds, false)` |
1606
2144
 
@@ -1731,24 +2269,14 @@ import type { ColumnSettingsMenuIconName } from '@taocompany/magic-grid'
1731
2269
 
1732
2270
  ---
1733
2271
 
1734
- ## 相关文档
1735
-
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) |
2272
+ ## 校验子路径
1743
2273
 
1744
- ### 校验子路径
2274
+ 配合 `ColumnDef.validationRules` 使用 async-validator 规则时,可通过子路径导入列 enrich 工具:
1745
2275
 
1746
2276
  ```ts
1747
2277
  import { enrichColumnsWithValidation } from '@taocompany/magic-grid/validation'
1748
2278
  ```
1749
2279
 
1750
- 配合 `ColumnDef.validationRules` 使用 async-validator 规则。
1751
-
1752
2280
  ---
1753
2281
 
1754
2282
  ## License