@taocompany/magic-grid 0.1.1 → 0.1.3

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 (53) hide show
  1. package/README.md +477 -26
  2. package/dist/components/ColumnSettings/ColumnSettingsRow.vue.d.ts.map +1 -1
  3. package/dist/components/MagicGrid/MagicGrid.vue.d.ts +38 -0
  4. package/dist/components/MagicGrid/MagicGrid.vue.d.ts.map +1 -1
  5. package/dist/components/MagicGrid/resolveMagicGridDefaults.d.ts +7 -0
  6. package/dist/components/MagicGrid/resolveMagicGridDefaults.d.ts.map +1 -0
  7. package/dist/core/column/columnModel.d.ts +8 -2
  8. package/dist/core/column/columnModel.d.ts.map +1 -1
  9. package/dist/core/grid/cellRangeDragSelect.d.ts.map +1 -1
  10. package/dist/core/grid/grid.d.ts +7 -2
  11. package/dist/core/grid/grid.d.ts.map +1 -1
  12. package/dist/core/grid/gridColumnLayout.d.ts.map +1 -1
  13. package/dist/core/grid/gridInteraction/cellRangeInteraction.d.ts +7 -0
  14. package/dist/core/grid/gridInteraction/cellRangeInteraction.d.ts.map +1 -1
  15. package/dist/core/grid/gridInteraction/gridInteraction.d.ts +2 -0
  16. package/dist/core/grid/gridInteraction/gridInteraction.d.ts.map +1 -1
  17. package/dist/core/grid/gridInteraction/indexSelectionDragSession.d.ts +1 -1
  18. package/dist/core/grid/gridInteraction/indexSelectionDragSession.d.ts.map +1 -1
  19. package/dist/core/grid/gridInteraction/types.d.ts +2 -1
  20. package/dist/core/grid/gridInteraction/types.d.ts.map +1 -1
  21. package/dist/core/grid/gridSelection.d.ts +10 -1
  22. package/dist/core/grid/gridSelection.d.ts.map +1 -1
  23. package/dist/core/renderer/cellRangeVisualController.d.ts +3 -0
  24. package/dist/core/renderer/cellRangeVisualController.d.ts.map +1 -1
  25. package/dist/core/renderer/rowRenderer.d.ts +3 -0
  26. package/dist/core/renderer/rowRenderer.d.ts.map +1 -1
  27. package/dist/core/renderer/spannedRowRenderer.d.ts.map +1 -1
  28. package/dist/core/row/cellComp.d.ts +1 -0
  29. package/dist/core/row/cellComp.d.ts.map +1 -1
  30. package/dist/core/row/rowComp.d.ts +5 -2
  31. package/dist/core/row/rowComp.d.ts.map +1 -1
  32. package/dist/core/selection/cellClipboardService.d.ts +2 -1
  33. package/dist/core/selection/cellClipboardService.d.ts.map +1 -1
  34. package/dist/core/types/cellRangeSelection.d.ts +43 -7
  35. package/dist/core/types/cellRangeSelection.d.ts.map +1 -1
  36. package/dist/core/types/columnSort.d.ts +15 -3
  37. package/dist/core/types/columnSort.d.ts.map +1 -1
  38. package/dist/core/types/filterGridOptions.d.ts +11 -1
  39. package/dist/core/types/filterGridOptions.d.ts.map +1 -1
  40. package/dist/core/types/index.d.ts +5 -5
  41. package/dist/core/types/index.d.ts.map +1 -1
  42. package/dist/core/types/indexColumn.d.ts +2 -1
  43. package/dist/core/types/indexColumn.d.ts.map +1 -1
  44. package/dist/core/types/rowComp.d.ts +7 -1
  45. package/dist/core/types/rowComp.d.ts.map +1 -1
  46. package/dist/index.cjs.js +4 -4
  47. package/dist/index.cjs.js.map +1 -1
  48. package/dist/index.es.js +2990 -2716
  49. package/dist/index.es.js.map +1 -1
  50. package/dist/style.css +1 -1
  51. package/dist/types/magic-grid.d.ts +30 -1
  52. package/dist/types/magic-grid.d.ts.map +1 -1
  53. package/package.json +1 -1
package/README.md CHANGED
@@ -8,7 +8,9 @@
8
8
  - [快速开始](#快速开始)
9
9
  - [Props](#props)
10
10
  - [MagicGrid Props](#magicgrid-props)
11
+ - [Grid 级默认与列级覆盖](#grid-级默认与列级覆盖)
11
12
  - [ColumnDef 列定义](#columndef-列定义)
13
+ - [Options 类型参考](#options-类型参考)
12
14
  - [Events](#events)
13
15
  - [Expose](#expose)
14
16
  - [Slots](#slots)
@@ -48,10 +50,14 @@ pnpm add @taocompany/magic-grid async-validator
48
50
 
49
51
  ### 引入样式
50
52
 
53
+ 组件样式**不会**随 JS 自动注入,需在应用入口或根组件中**全局引入一次**:
54
+
51
55
  ```ts
52
56
  import '@taocompany/magic-grid/style.css'
53
57
  ```
54
58
 
59
+ > **ColumnSettingsButton / ColumnSettingsPanel** 与 MagicGrid 共用同一份 `style.css`。按钮或下拉菜单若放在页头工具栏等 **MagicGrid 容器外**,同样必须引入该文件;样式 token 已在 `.mg-column-settings-button` / `.mg-column-settings-portal` 上自带 fallback,脱离 `.magic-grid` 也可正常显示。
60
+
55
61
  ---
56
62
 
57
63
  ## 快速开始
@@ -66,9 +72,9 @@ import '@taocompany/magic-grid/style.css'
66
72
  const gridRef = ref<MagicGridExpose>()
67
73
 
68
74
  const columns: ColumnDef[] = [
69
- { prop: 'name', label: '姓名', width: 120, sortable: true },
70
- { prop: 'age', label: '年龄', width: 80, sortable: true },
71
- { prop: 'city', label: '城市', flex: 1, filterable: true },
75
+ { prop: 'name', label: '姓名', width: 120 },
76
+ { prop: 'age', label: '年龄', width: 80 },
77
+ { prop: 'city', label: '城市', flex: 1 },
72
78
  ]
73
79
 
74
80
  const data: RowData[] = [
@@ -89,6 +95,8 @@ function onSelectionChanged(event: { selectedRowIds: readonly (string | number)[
89
95
  row-key="id"
90
96
  height="400"
91
97
  row-selection="multiple"
98
+ sortable
99
+ filterable
92
100
  stripe
93
101
  @selection-changed="onSelectionChanged"
94
102
  />
@@ -97,6 +105,22 @@ function onSelectionChanged(event: { selectedRowIds: readonly (string | number)[
97
105
 
98
106
  > **提示**:`data` 应为普通对象数组,避免对行数据使用 `reactive()` 深代理。
99
107
 
108
+ 上例通过 Grid 级 `sortable` / `filterable` 开启全列默认可排序、可筛选;个别列可用 `sortable: false` / `filterable: false` 关闭。详见 [Grid 级默认与列级覆盖](#grid-级默认与列级覆盖)。
109
+
110
+ 替代写法(逐列显式配置):
111
+
112
+ ```ts
113
+ const columns: ColumnDef[] = [
114
+ { prop: 'name', label: '姓名', width: 120, sortable: true },
115
+ { prop: 'age', label: '年龄', width: 80, sortable: true },
116
+ { prop: 'city', label: '城市', flex: 1, filterable: true },
117
+ ]
118
+ ```
119
+
120
+ ```vue
121
+ <MagicGrid :columns="columns" :data="data" row-key="id" height="400" />
122
+ ```
123
+
100
124
  ---
101
125
 
102
126
  ## Props
@@ -162,7 +186,7 @@ function onSelectionChanged(event: { selectedRowIds: readonly (string | number)[
162
186
  | `width` | `number` | `40` | 列宽 px(最小 40) |
163
187
  | `start` | `number` | `1` | 起始序号(1-based 展示 = rowIndex + start) |
164
188
  | `focusMode` | `'single' \| 'multiple'` | `'multiple'` | 辅助定位模式 |
165
- | `syncToSelectionColumn` | `boolean` | `false` | 索引列定位是否单向同步到行选择列 |
189
+ | `syncToSelectionColumn` | `boolean` | `false`(MagicGrid 组件层默认 `true`) | 索引列定位是否单向同步到行选择列;仅当 `focusMode` 与 `rowSelection` 同为 single 或同为 multiple 时生效 |
166
190
  | `index` | `(rowIndex) => number \| string` | — | 自定义序号展示 |
167
191
  | `showRowDragHandle` | `boolean` | `false` | 在索引列显示行拖拽把柄 |
168
192
  | `enableRowResizer` | `boolean` | `false` | 索引列底边可拖拽调整行高 |
@@ -194,6 +218,7 @@ interface RowSelectionConfig {
194
218
  | `width` | `number` | `40` | 列宽 px(最小 40) |
195
219
  | `selectAllLabel` | `string` | `'全选'` | 表头全选 checkbox 的 aria-label |
196
220
  | `rowLabel` | `(rowIndex) => string` | — | 行 checkbox 的 aria-label 工厂 |
221
+ | `headerAlign` / `headerValign` / `align` / `valign` / `footerAlign` / `footerValign` | 对齐枚举 | `'center'` | 对齐配置 |
197
222
 
198
223
  #### 表尾汇总
199
224
 
@@ -209,6 +234,7 @@ interface RowSelectionConfig {
209
234
  | Prop | 类型 | 默认值 | 说明 |
210
235
  |------|------|--------|------|
211
236
  | `defaultSort` | `SortModelItem[]` | — | 初始排序(挂载时应用一次;v1 仅使用首项) |
237
+ | `sortable` | `boolean` | `false` | 是否允许表头排序;列级 `columns[].sortable` **优先于**本配置;系统列恒为 false |
212
238
  | `showUnsortedSortHintOnHover` | `boolean` | `false` | 未排序 sortable 列 hover 显示 faint 双三角 |
213
239
 
214
240
  #### 列操作
@@ -219,8 +245,8 @@ interface RowSelectionConfig {
219
245
  | `resizable` | `boolean` | `true` | 是否允许拖拽调整列宽(列级 `resizable` 优先) |
220
246
  | `colResizeDefault` | `'shift'` | — | Shift 模式:拖拽列宽时相邻列反向补偿,总宽不变 |
221
247
  | `skipHeaderOnAutoSize` | `boolean` | `false` | 双击 resize 把柄 auto-size 时跳过表头宽度 |
222
- | `autoSizePadding` | `number` | | auto-size 内容测量额外 padding(px) |
223
- | `autoSizeStrategy` | `AutoSizeStrategy` | — | 挂载/首屏 auto-size 策略 |
248
+ | `autoSizePadding` | `number` | `16` | auto-size 内容测量额外 padding(px) |
249
+ | `autoSizeStrategy` | `AutoSizeStrategy` | — | 挂载/首屏 auto-size 策略(见 [AutoSizeStrategy](#autosizestrategy)) |
224
250
  | `suppressMoveWhenColumnDragging` | `boolean` | `false` | `true` → 仅 mouseup 提交列序 |
225
251
  | `suppressColumnMoveAnimation` | `boolean` | `false` | 关闭列移动 transition |
226
252
  | `allowCrossLaneColumnMove` | `boolean` | `false` | 允许 drag/API 跨 fixed lane 并更新列 `fixed` |
@@ -229,8 +255,9 @@ interface RowSelectionConfig {
229
255
 
230
256
  | Prop | 类型 | 默认值 | 说明 |
231
257
  |------|------|--------|------|
232
- | `quickFilterText` | `string` | `''` | Grid quick filter 文本 |
233
- | `floatingFilter` | `boolean` | `false` | 是否显示 floating filter |
258
+ | `filterable` | `boolean` | `false` | 是否允许列筛选;列级 `columns[].filterable` **优先于**本配置;系统列恒为 false |
259
+ | `quickFilterText` | `string` | `''` | Grid quick filter 文本(对 filterable 用户列 OR 式 contains) |
260
+ | `floatingFilter` | `boolean` | `false` | 表头下方 floating filter 行(仅对 filterable 列渲染输入框) |
234
261
  | `filterSetValueMode` | `'reserve' \| 'current'` | `'current'` | 值选择搜索时的勾选投影模式 |
235
262
  | `filterSetDateLayoutMode` | `'list' \| 'tree'` | `'tree'` | 日期列值选择展示方式 |
236
263
 
@@ -240,10 +267,10 @@ interface RowSelectionConfig {
240
267
  |------|------|--------|------|
241
268
  | `editMode` | `'cell' \| 'row'` | `'cell'` | 编辑范围:单格 / 整行 |
242
269
  | `editType` | `CellEditType` | `'singleClick'` | 进入编辑态的触发方式 |
243
- | `invalidEditValueMode` | `'block' \| 'revert'` | `'block'` | 校验失败后:`block` 保持编辑;`revert` 退出并恢复旧值 |
270
+ | `invalidEditValueMode` | `'block' \| 'revert' \| 'keep'` | `'block'` | 校验失败后:`block` 保持编辑;`revert` 退出并恢复旧值;`keep` 退出编辑但保留无效值 |
244
271
  | `rowValidator` | `RowValidator` | — | 行编辑跨字段校验 |
245
272
  | `cellEditorRegistry` | `Record<string, CellEditorFn>` | — | 实例级命名编辑器注册表 |
246
- | `asyncRowMutation` | `AsyncRowMutationHandlers` | — | 异步行 CRUD 持久化钩子 |
273
+ | `asyncRowMutation` | `AsyncRowMutationHandlers` | — | 异步行 CRUD 持久化钩子(见 [AsyncRowMutationHandlers](#asyncrowmutationhandlers)) |
247
274
 
248
275
  #### 行拖拽与行高
249
276
 
@@ -312,7 +339,7 @@ interface RowSelectionConfig {
312
339
 
313
340
  | Prop | 类型 | 默认值 | 说明 |
314
341
  |------|------|--------|------|
315
- | `cellCommentsDataSource` | `CellCommentsDataSource` | — | 批注数据源;提供即启用 |
342
+ | `cellCommentsDataSource` | `CellCommentsDataSource` | — | 批注数据源;提供即启用(见 [CellCommentsDataSource](#cellcommentsdatasource)) |
316
343
  | `suppressCellComments` | `boolean` | `false` | 全局抑制批注交互 |
317
344
  | `cellCommentTrigger` | `'click' \| 'hover'` | `'click'` | 查看已有批注的触发方式 |
318
345
  | `cellCommentShowDelay` | `number` | `180` | hover 模式展示延迟 ms |
@@ -322,12 +349,36 @@ interface RowSelectionConfig {
322
349
 
323
350
  | Prop | 类型 | 默认值 | 说明 |
324
351
  |------|------|--------|------|
325
- | `cellSelection` | `boolean \| CellSelectionOptions` | `false` | 单元格框选 |
326
- | `enableCellClipboard` | `boolean` | | 启用剪贴板(通常随 cellSelection 开启) |
352
+ | `cellSelection` | `boolean \| CellSelectionOptions` | `true` | 单元格框选;MagicGrid 默认开启、`enableColumnSelection` 为 `true`、`handle` 为 off;Grid API 未传时默认关闭 |
353
+ | `enableCellCopy` | `boolean` | `true` | Ctrl+C / `copySelectedRangeToClipboard` |
354
+ | `enableCellPaste` | `boolean` | `false` | Ctrl+V / `pasteFromClipboard` |
355
+ | `enableCellClipboard` | `boolean` | — | **已废弃**;未单独指定 copy/paste 时二者均继承本值 |
327
356
  | `processCellForClipboard` | `ProcessCellForClipboardFn` | — | 复制单格时自定义导出值 |
328
357
  | `processCellFromClipboard` | `ProcessCellFromClipboardFn` | — | 粘贴单格时预处理 clipboard 字符串 |
329
358
  | `processDataFromClipboard` | `ProcessDataFromClipboardFn` | — | 整表粘贴前处理 TSV 矩阵;return null 取消粘贴 |
330
359
 
360
+ `CellSelectionOptions` 字段(`cellSelection` 为对象时):
361
+
362
+ | 字段 | 类型 | 默认值 | 说明 |
363
+ |------|------|--------|------|
364
+ | `suppressMultiRanges` | `boolean` | `true` | `true` 时仅允许单个 range |
365
+ | `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'` | 填充方向 |
374
+ | `fillStrategy` | `'auto' \| 'copy'` | `'copy'` | `'auto'`:数字递增、非数字复制;`'copy'`:始终复制源边值 |
375
+ | `fillReverseStrategy` | `'default' \| 'clear'` | `'default'` | 反拖缩小时:`'default'` 不处理;`'clear'` 置空缩出初始选区的格 |
376
+ | `setFillValue` | `(params: FillOperationParams) => unknown` | — | 自定义填充值;缺省按 `fillStrategy` |
377
+
378
+ `RangeHandleOptions`(`handle: { mode: 'range' }`):仅含 `mode: 'range'`,用于右下角拖拽扩展选区。
379
+
380
+ > 框选详细行为见 [`docs/35-phase24-cell-range-selection.md`](docs/35-phase24-cell-range-selection.md)。
381
+
331
382
  #### Tooltip
332
383
 
333
384
  | Prop | 类型 | 默认值 | 说明 |
@@ -355,9 +406,13 @@ interface RowSelectionConfig {
355
406
  | `overlayNoRowsTemplate` | `string` | — | 无数据模板 HTML |
356
407
  | `overlayNoMatchingRowsTemplate` | `string` | — | 筛选无匹配模板 HTML |
357
408
  | `loadingOverlayComponent` | `OverlayComponentType` | — | 自定义 loading 组件 |
409
+ | `loadingOverlayComponentParams` | `Record<string, unknown>` | — | loading 组件额外参数 |
358
410
  | `noRowsOverlayComponent` | `OverlayComponentType` | — | 自定义无数据组件 |
411
+ | `noRowsOverlayComponentParams` | `Record<string, unknown>` | — | 无数据组件额外参数 |
359
412
  | `noMatchingRowsOverlayComponent` | `OverlayComponentType` | — | 自定义筛选无匹配组件 |
413
+ | `noMatchingRowsOverlayComponentParams` | `Record<string, unknown>` | — | 筛选无匹配组件额外参数 |
360
414
  | `overlayComponent` | `OverlayComponentType` | — | 通用 overlay 组件 |
415
+ | `overlayComponentParams` | `Record<string, unknown>` | — | 通用 overlay 组件额外参数 |
361
416
  | `overlayInteraction` | `boolean` | — | overlay 内容是否可交互 |
362
417
 
363
418
  #### 状态栏
@@ -365,10 +420,38 @@ interface RowSelectionConfig {
365
420
  | Prop | 类型 | 默认值 | 说明 |
366
421
  |------|------|--------|------|
367
422
  | `showStatusBar` | `boolean` | `true` | 是否显示底部状态栏 |
368
- | `showDefaultStatusBarPanels` | `boolean` | `true` | 显示默认状态栏面板(行数/筛选态/选中数) |
423
+ | `showDefaultStatusBarPanels` | `boolean` | `true` | 显示默认状态栏左侧面板(行数/筛选态/选中数);`false` 时仍可自定义 `#status-bar-left` |
369
424
  | `showStatusBarRangeAggregation` | `boolean` | `true` | 框选时在状态栏展示平均值/计数/求和 |
370
425
  | `statusBarRangeAggregationPrecision` | `number \| { average?: number; sum?: number }` | `2` | 平均值/求和展示小数位数 |
371
426
 
427
+ #### Grid 级默认与列级覆盖
428
+
429
+ 以下 Grid Prop 可一次性为**所有用户列**设定默认行为;列级字段显式配置时**以列为准**(对齐 AG Grid `defaultColDef` 语义):
430
+
431
+ | Grid Prop | 列级字段 | 默认值 | 说明 |
432
+ |-----------|----------|--------|------|
433
+ | `sortable` | `columns[].sortable` | `false` | 表头点击排序 |
434
+ | `filterable` | `columns[].filterable` | `false` | 列筛选 / 表头 filter 把柄 / quick filter 参与列 |
435
+ | `resizable` | `columns[].resizable` | `true` | 拖拽调整列宽 |
436
+ | `columnMovable` | `columns[].movable` | `true` | 表头拖拽重排列 |
437
+
438
+ 系统列(索引 / 行选择 / 展开 / 分组等)不受 Grid 默认影响,相关能力恒为关闭。
439
+
440
+ 运行时修改 `:sortable` / `:filterable` / `:resizable` 会热更新列模型并刷新表头(无需重建 Grid)。
441
+
442
+ ```vue
443
+ <!-- 全列默认可排序、可筛选;金额列单独关闭 -->
444
+ <MagicGrid
445
+ :columns="[
446
+ { prop: 'name', label: '名称' },
447
+ { prop: 'amount', label: '金额', sortable: false, filterable: false },
448
+ ]"
449
+ sortable
450
+ filterable
451
+ floating-filter
452
+ />
453
+ ```
454
+
372
455
  ---
373
456
 
374
457
  ### ColumnDef 列定义
@@ -397,18 +480,18 @@ interface RowSelectionConfig {
397
480
 
398
481
  | 字段 | 类型 | 说明 |
399
482
  |------|------|------|
400
- | `sortable` | `boolean` | 是否可排序 |
483
+ | `sortable` | `boolean` | 是否可排序;缺省继承 Grid `sortable`(默认 false) |
401
484
  | `comparator` | `ColumnComparatorFn` | 自定义排序比较器(asc 语义;desc 由内核取反) |
402
- | `filterable` | `boolean` | 是否可筛选 |
485
+ | `filterable` | `boolean` | 是否可筛选;缺省继承 Grid `filterable`(默认 false) |
403
486
  | `filterType` | `ColumnDataFilterType` | 筛选数据类型;默认 `text` |
404
- | `filterParams` | `FilterParams` | 列级 filter 参数 |
487
+ | `filterParams` | `FilterParams` | 列级 filter 参数(见 [FilterParams](#filterparams)) |
405
488
  | `filterValueGetter` | `(row) => unknown` | 筛选用取值;缺省同 getter/prop |
406
489
  | `editable` | `boolean \| (row) => boolean` | 是否可编辑 |
407
- | `resizable` | `boolean` | 是否允许拖拽调整列宽;缺省继承 Grid `resizable` |
490
+ | `resizable` | `boolean` | 是否允许拖拽调整列宽;缺省继承 Grid `resizable`(默认 true) |
408
491
  | `suppressAutoSize` | `boolean` | 禁止 resize 把柄 dblclick / API auto-size |
409
492
  | `suppressSizeToFit` | `boolean` | 禁止参与 sizeColumnsToFit |
410
493
  | `fixed` | `'left' \| 'right' \| null` | 固定列 |
411
- | `movable` | `boolean` | 是否允许表头拖拽重排;默认继承 `columnMovable` |
494
+ | `movable` | `boolean` | 是否允许表头拖拽重排;缺省继承 `columnMovable` |
412
495
  | `rowDrag` | `boolean` | 该列单元格作为行拖拽起点 |
413
496
  | `rowExpand` | `boolean` | 在该列渲染 expand/collapse 控件 |
414
497
  | `autoHeight` | `boolean` | 该列内容撑开行高 |
@@ -500,6 +583,321 @@ interface RowSelectionConfig {
500
583
 
501
584
  ---
502
585
 
586
+ ## Options 类型参考
587
+
588
+ 下列类型均可从 `@taocompany/magic-grid` 导入,供 Props、GridApi 与事件 payload 使用。
589
+
590
+ ### IndexColumnOptions
591
+
592
+ 索引列配置,通过 `indexColumn` prop 传入(`showIndexColumn=true` 时生效)。
593
+
594
+ | 字段 | 类型 | 默认值 | 说明 |
595
+ |------|------|--------|------|
596
+ | `label` | `string` | `''` | 表头文案 |
597
+ | `width` | `number` | `40` | 列宽 px(最小 40) |
598
+ | `start` | `number` | `1` | 起始序号(1-based 展示 = rowIndex + start) |
599
+ | `focusMode` | `'single' \| 'multiple'` | `'multiple'` | 辅助定位模式 |
600
+ | `syncToSelectionColumn` | `boolean` | core `false` / MagicGrid `true` | 索引列定位单向同步到行选择列 |
601
+ | `index` | `(rowIndex) => number \| string` | — | 自定义序号展示 |
602
+ | `showRowDragHandle` | `boolean` | `false` | 在索引列显示行拖拽把柄 |
603
+ | `enableRowResizer` | `boolean` | `false` | 索引列底边可拖拽调整行高 |
604
+ | `headerAlign` / `headerValign` / `align` / `valign` / `footerAlign` / `footerValign` | 对齐枚举 | `'center'` | 对齐配置 |
605
+
606
+ ### SelectionColumnOptions
607
+
608
+ 行选择列配置,通过 `selectionColumn` prop 传入(`rowSelection !== false` 时生效)。
609
+
610
+ | 字段 | 类型 | 默认值 | 说明 |
611
+ |------|------|--------|------|
612
+ | `width` | `number` | `40` | 列宽 px(最小 40) |
613
+ | `selectAllLabel` | `string` | `'全选'` | 表头全选 checkbox 的 aria-label |
614
+ | `rowLabel` | `(rowIndex) => string` | — | 行 checkbox 的 aria-label 工厂 |
615
+ | `headerAlign` / `headerValign` / `align` / `valign` / `footerAlign` / `footerValign` | 对齐枚举 | `'center'` | 对齐配置 |
616
+
617
+ ### RowSelectionConfig
618
+
619
+ `rowSelection` 的对象形式:
620
+
621
+ ```ts
622
+ interface RowSelectionConfig {
623
+ mode: 'single' | 'multiple'
624
+ /** tree 模式下选中父节点是否级联子孙,默认 true */
625
+ groupSelectsChildren?: boolean
626
+ }
627
+ ```
628
+
629
+ ### CellSelectionOptions
630
+
631
+ `cellSelection` 的对象形式(`cellSelection: true` 等价 `{}` 并使用默认子项)。
632
+
633
+ | 字段 | 类型 | 默认值 | 说明 |
634
+ |------|------|--------|------|
635
+ | `suppressMultiRanges` | `boolean` | `true` | 仅允许单个 range |
636
+ | `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'` | 填充方向 |
644
+ | `fillStrategy` | `'auto' \| 'copy'` | `'copy'` | 数字递增策略 |
645
+ | `fillReverseStrategy` | `'default' \| 'clear'` | `'default'` | 反拖缩小行为 |
646
+ | `setFillValue` | `(params: FillOperationParams) => unknown` | — | 自定义填充值 |
647
+
648
+ `FillOperationParams`:`{ rowNode, column, baseValue, step, direction }`。
649
+
650
+ **RangeHandleOptions**:`{ mode: 'range' }`,右下角拖拽扩展选区。
651
+
652
+ **CellRange**(`addCellRange` / `getCellRanges` 返回值):
653
+
654
+ ```ts
655
+ interface CellRange {
656
+ startRowIndex: number
657
+ endRowIndex: number
658
+ startColId: string
659
+ endColId: string
660
+ }
661
+ ```
662
+
663
+ ### AutoSizeStrategy
664
+
665
+ 挂载 / 首屏列宽策略,通过 `autoSizeStrategy` prop 传入。三种 discriminated union:
666
+
667
+ **fitGridWidth** — 列宽分配至视口:
668
+
669
+ ```ts
670
+ interface SizeColumnsToFitGridStrategy {
671
+ type: 'fitGridWidth'
672
+ defaultMinWidth?: number
673
+ defaultMaxWidth?: number
674
+ columnLimits?: Array<{ colId: string; minWidth?: number; maxWidth?: number }>
675
+ }
676
+ ```
677
+
678
+ **fitProvidedWidth** — 分配至指定宽度:
679
+
680
+ ```ts
681
+ interface SizeColumnsToFitProvidedWidthStrategy {
682
+ type: 'fitProvidedWidth'
683
+ width: number
684
+ defaultMinWidth?: number
685
+ defaultMaxWidth?: number
686
+ columnLimits?: Array<{ colId: string; minWidth?: number; maxWidth?: number }>
687
+ }
688
+ ```
689
+
690
+ **fitCellContents** — 按单元格内容 auto-size:
691
+
692
+ ```ts
693
+ interface SizeColumnsToContentStrategy {
694
+ type: 'fitCellContents'
695
+ skipHeader?: boolean
696
+ colIds?: readonly string[]
697
+ defaultMinWidth?: number
698
+ defaultMaxWidth?: number
699
+ columnLimits?: Array<{ colId: string; minWidth?: number; maxWidth?: number }>
700
+ scaleUpToFitGridWidth?: boolean
701
+ }
702
+ ```
703
+
704
+ **SizeColumnsToFitParams**(`GridApi.sizeColumnsToFit(params?)`):
705
+
706
+ | 字段 | 类型 | 说明 |
707
+ |------|------|------|
708
+ | `gridWidth` | `number` | 目标宽度 px;缺省为视口宽度 |
709
+ | `defaultMinWidth` / `defaultMaxWidth` | `number` | 列宽 clamp 默认值 |
710
+ | `columnLimits` | `{ colId, minWidth?, maxWidth? }[]` | 单列限制 |
711
+ | `colIds` | `string[]` | 仅调整指定列 |
712
+ | `onlyScaleUp` | `boolean` | 仅放大以填满视口,不缩小 |
713
+
714
+ ### FilterParams
715
+
716
+ 列级筛选参数,通过 `ColumnDef.filterParams` 传入。
717
+
718
+ | 字段 | 类型 | 默认值 | 说明 |
719
+ |------|------|--------|------|
720
+ | `caseSensitive` | `boolean` | `true` | 文本比较是否区分大小写 |
721
+ | `locale` | `string` | — | 数字 / 日期解析 locale |
722
+
723
+ ### AsyncRowMutationHandlers
724
+
725
+ 异步行 CRUD 持久化钩子,通过 `asyncRowMutation` prop 传入。各 handler 在服务端成功后才 apply 本地;reject 则不写入。
726
+
727
+ ```ts
728
+ interface AsyncRowMutationHandlers {
729
+ add?: (params: AsyncRowMutationAddParams) => Promise<AsyncRowMutationAddResult | void>
730
+ update?: (params: AsyncRowMutationUpdateParams) => Promise<void>
731
+ remove?: (params: AsyncRowMutationRemoveParams) => Promise<void>
732
+ }
733
+ ```
734
+
735
+ | Params 类型 | 主要字段 |
736
+ |-------------|----------|
737
+ | `AsyncRowMutationAddParams` | `rows: { data }[]`、`index?`、`indexMode?`、`signal` |
738
+ | `AsyncRowMutationAddResult` | `rows?: { businessId?, data? }[]` — 写入正式主键或 enrich 字段 |
739
+ | `AsyncRowMutationUpdateParams` | `rows: { rowId, data }[]`、`signal` |
740
+ | `AsyncRowMutationRemoveParams` | `rowIds`、`rows: { rowId, data }[]`、`signal` |
741
+
742
+ ### CellCommentsDataSource
743
+
744
+ 批注持久化数据源,通过 `cellCommentsDataSource` prop 传入。
745
+
746
+ ```ts
747
+ interface CellCommentsDataSource {
748
+ getComment: (params: CellCommentParams) => CellComment | undefined | null
749
+ setComment: (params: SetCellCommentParams) => void | Promise<void>
750
+ init?: (ctx: { api: GridApi }) => void
751
+ destroy?: () => void
752
+ }
753
+ ```
754
+
755
+ **CellCommentParams**:`{ rowId, colId, data, column }`。
756
+
757
+ **SetCellCommentParams**:扩展 `CellCommentParams`,含 `comment: CellComment | undefined`(`undefined` 表示删除)。
758
+
759
+ **CellComment**:
760
+
761
+ | 字段 | 类型 | 说明 |
762
+ |------|------|------|
763
+ | `text` | `string` | 批注正文(纯文本) |
764
+ | `readOnly` | `boolean` | `true` 时内置 UI 只读;API 仍可覆盖 |
765
+ | `author` / `createdAt` / `updatedAt` | `string` | 元数据 |
766
+ | `metadata` | `unknown` | 自定义扩展 |
767
+
768
+ ### GetDataOptions
769
+
770
+ `GridApi.getData(options?)` / `MagicGridExpose.getData(options?)` 参数:
771
+
772
+ | 字段 | 类型 | 默认值 | 说明 |
773
+ |------|------|--------|------|
774
+ | `sourceOrder` | `boolean` | `true` | `true` = source 存储顺序;`false` = 当前 display 顺序 |
775
+
776
+ ### AddRowsOptions / RemoveRowsOptions / PromoteRowIdOptions
777
+
778
+ GridApi 行 CRUD 参数:
779
+
780
+ **AddRowsOptions**:
781
+
782
+ | 字段 | 类型 | 默认值 | 说明 |
783
+ |------|------|--------|------|
784
+ | `rows` | `{ data: RowData }[]` | — | **必填** |
785
+ | `index` | `number` | 末尾 | 插入起始下标 |
786
+ | `indexMode` | `'source' \| 'display'` | `'source'` | 下标基准 |
787
+
788
+ **RemoveRowsOptions**:
789
+
790
+ | 字段 | 类型 | 说明 |
791
+ |------|------|------|
792
+ | `rowIds` | `(string \| number)[]` | 按 rowId / 业务主键删除 |
793
+ | `indexes` | `number[]` | 按下标批量删除 |
794
+ | `indexMode` | `'source' \| 'display'` | 下标基准,默认 `'source'` |
795
+
796
+ **PromoteRowIdOptions**:
797
+
798
+ | 字段 | 类型 | 说明 |
799
+ |------|------|------|
800
+ | `rowId` | `string \| number` | 当前 RowNode.id(通常为 `__mg_tmp_*`) |
801
+ | `businessId` | `string \| number` | 正式业务主键,写入 `data[rowKey]` |
802
+
803
+ ### ValidateGridOptions / ValidateRowsOptions / ValidateCellsOptions
804
+
805
+ GridApi 校验参数:
806
+
807
+ **ValidateGridOptions**(`validate(options?)`):
808
+
809
+ | 字段 | 类型 | 默认值 | 说明 |
810
+ |------|------|--------|------|
811
+ | `rowIds` | `(string \| number)[]` | 全表 | 指定行 |
812
+ | `signal` | `AbortSignal` | — | 中断信号 |
813
+ | `showFeedback` | `boolean` | `true` | 是否更新 invalid 视觉反馈 |
814
+
815
+ **ValidateRowsOptions**(`validateRows(options)`):`rowIds` **必填**,其余同 `ValidateGridOptions`。
816
+
817
+ **ValidateCellsOptions**(`validateCells(options)`):
818
+
819
+ | 字段 | 类型 | 说明 |
820
+ |------|------|------|
821
+ | `cells` | `{ rowId, colId }[]` | **必填** |
822
+ | `signal` | `AbortSignal` | 中断信号 |
823
+ | `showFeedback` | `boolean` | 默认 `true` |
824
+
825
+ **ClearValidationOptions** / **ClearRowValidationOptions** / **ClearCellValidationOptions**:分别对应 `clearValidation` / `clearRowValidation` / `clearCellValidation`,字段与上述 `rowIds` / `cells` 对应。
826
+
827
+ ### MoveRowOptions / RefreshCellsParams
828
+
829
+ **MoveRowOptions**(`GridApi.moveRow(rowId, toIndex, indexMode?)` 的对象重载形式):
830
+
831
+ | 字段 | 类型 | 默认值 | 说明 |
832
+ |------|------|--------|------|
833
+ | `rowId` | `string` | — | **必填**。内部 rowId |
834
+ | `toIndex` | `number` | — | **必填**。目标下标 |
835
+ | `indexMode` | `'source' \| 'display'` | `'source'` | 下标基准 |
836
+ | `finished` | `boolean` | `true` | live drag 中间态为 `false` |
837
+
838
+ **RefreshCellsParams**(`GridApi.refreshCells(params?)`):
839
+
840
+ | 字段 | 类型 | 说明 |
841
+ |------|------|------|
842
+ | `rowIds` | `string[]` | 限定行 |
843
+ | `colIds` | `string[]` | 限定列 |
844
+ | `force` | `boolean` | 忽略值缓存,强制重绘 |
845
+
846
+ **RefreshDisabledStateParams** / **RefreshCellStylesParams**(`refreshDisabledState` / `refreshCellStyles`):可选 `rowIds`、`colIds` 限定重算范围。
847
+
848
+ ### StatusBarRangeAggregationPrecisionInput
849
+
850
+ `statusBarRangeAggregationPrecision` prop 类型:
851
+
852
+ ```ts
853
+ type StatusBarRangeAggregationPrecisionInput =
854
+ | number // 同时作用于 average / sum
855
+ | { average?: number; sum?: number } // 分别指定
856
+ ```
857
+
858
+ 默认 `2`(平均值与求和各保留 2 位小数)。
859
+
860
+ ### SummaryMethodParams
861
+
862
+ `summaryMethod` 回调入参:
863
+
864
+ | 字段 | 类型 | 说明 |
865
+ |------|------|------|
866
+ | `columns` | `Column[]` | 当前列模型 |
867
+ | `data` | `RowData[]` | 按 `summaryScope` 选取的行快照 |
868
+ | `rows` | `RowNode[]` | 对应 RowNode 列表 |
869
+
870
+ 返回值:`Record<colId, string | number | null | undefined>`。
871
+
872
+ ### CellSelectionAggregation
873
+
874
+ `getCellSelectionAggregation()` 与状态栏 `#status-bar` 插槽的 `cellSelectionAggregation` 字段:
875
+
876
+ | 字段 | 类型 | 说明 |
877
+ |------|------|------|
878
+ | `count` | `number` | 非空单元格个数(含非数值) |
879
+ | `numericCount` | `number` | 可解析为数值的单元格个数 |
880
+ | `sum` | `number \| null` | 数值之和;无有效数值时为 `null` |
881
+ | `average` | `number \| null` | 数值平均值;无有效数值时为 `null` |
882
+
883
+ ### 剪贴板回调参数
884
+
885
+ **ProcessCellForClipboardParams** / **ProcessCellFromClipboardParams**:
886
+
887
+ | 字段 | 类型 | 说明 |
888
+ |------|------|------|
889
+ | `rowIndex` / `colId` | `number` / `string` | 格位置 |
890
+ | `rowNode` / `column` | — | 行 / 列模型 |
891
+ | `value` | `unknown` | 复制:formatter/raw 候选;粘贴:clipboard 字符串 |
892
+ | `formatValue` | `(value) => string` | 套列 formatter |
893
+ | `parseValue` | `(text) => unknown` | 走 valueParser |
894
+
895
+ `ProcessCellFromClipboardParams` 额外含 `oldValue`。
896
+
897
+ **ProcessDataFromClipboardParams**:`{ data: string[][], anchor: CellPosition }`,其中 `anchor` 为 `{ rowIndex, colId }`。
898
+
899
+ ---
900
+
503
901
  ## Events
504
902
 
505
903
  MagicGrid 通过 Vue 事件向外暴露 Grid 内核事件。事件名采用 kebab-case。
@@ -1024,6 +1422,8 @@ MagicGrid 提供静态插槽与动态列插槽两类。
1024
1422
 
1025
1423
  表格列设置(Phase 27)提供一组**独立组件**,对标 AG Grid 的 Side Bar + Columns Tool Panel。只要持有 `GridApi` 即可使用,不强依赖 MagicGrid 内部 DOM。
1026
1424
 
1425
+ > **样式**:须全局引入 `@taocompany/magic-grid/style.css`(见 [引入样式](#引入样式))。组件类名以 `mg-column-settings-*` 为前缀。
1426
+
1027
1427
  | 组件 | 职责 |
1028
1428
  |------|------|
1029
1429
  | `ColumnSettingsButton` | 齿轮触发器 + 下拉菜单 + 列设置 Popover(推荐组合使用) |
@@ -1033,7 +1433,9 @@ MagicGrid 提供静态插槽与动态列插槽两类。
1033
1433
 
1034
1434
  ### 典型集成
1035
1435
 
1036
- 推荐放在 MagicGrid `#toolbar` 插槽内,并使用 `portalEl` 将 Popover Teleport 到 Grid 内部 portal,避免被表格容器 `overflow` 裁剪:
1436
+ #### 方式 A:MagicGrid `#toolbar`(推荐)
1437
+
1438
+ Popover Teleport 到 Grid 内部 `.magic-grid__portal`,避免被表格 `overflow` 裁剪;按钮尺寸与 Grid `size` 对齐:
1037
1439
 
1038
1440
  ```vue
1039
1441
  <script setup lang="ts">
@@ -1045,6 +1447,7 @@ import {
1045
1447
  ColumnSettingsMenuIcon,
1046
1448
  } from '@taocompany/magic-grid'
1047
1449
  import type { GridApi, ColumnDef, RowData } from '@taocompany/magic-grid'
1450
+ import '@taocompany/magic-grid/style.css'
1048
1451
 
1049
1452
  const columns: ColumnDef[] = [/* ... */]
1050
1453
  const data: RowData[] = [/* ... */]
@@ -1055,7 +1458,7 @@ function onResetColumnOrder(api: GridApi) {
1055
1458
  </script>
1056
1459
 
1057
1460
  <template>
1058
- <MagicGrid :columns="columns" :data="data" row-key="id" height="400">
1461
+ <MagicGrid :columns="columns" :data="data" row-key="id" height="400" sortable filterable>
1059
1462
  <template #toolbar="{ api, size, portalEl }">
1060
1463
  <ColumnSettingsButton
1061
1464
  v-if="api"
@@ -1078,7 +1481,38 @@ function onResetColumnOrder(api: GridApi) {
1078
1481
  </template>
1079
1482
  ```
1080
1483
 
1081
- 也可单独使用面板(例如侧边栏、Drawer 内):
1484
+ #### 方式 B:页头 / 外部工具栏(ERP 常见)
1485
+
1486
+ 按钮放在 MagicGrid **外部**(如页面「新增」「刷新」旁)时,省略 `portalEl` 即可 Teleport 到 `document.body`;须确保已引入 `style.css`:
1487
+
1488
+ ```vue
1489
+ <script setup lang="ts">
1490
+ import { ref } from 'vue'
1491
+ import { MagicGrid, ColumnSettingsButton } from '@taocompany/magic-grid'
1492
+ import type { GridApi, MagicGridExpose } from '@taocompany/magic-grid'
1493
+
1494
+ const gridRef = ref<MagicGridExpose>()
1495
+ </script>
1496
+
1497
+ <template>
1498
+ <div class="page-toolbar">
1499
+ <button>新增用户</button>
1500
+ <button>刷新</button>
1501
+ <ColumnSettingsButton
1502
+ v-if="gridRef?.api"
1503
+ :grid-api="gridRef.api"
1504
+ />
1505
+ </div>
1506
+
1507
+ <MagicGrid ref="gridRef" sortable filterable ... />
1508
+ </template>
1509
+ ```
1510
+
1511
+ > 列设置面板内长列名单行截断显示(`text-overflow: ellipsis`),悬停可看完整 `title`。
1512
+
1513
+ #### 方式 C:单独嵌入面板
1514
+
1515
+ 例如侧边栏、Drawer 内:
1082
1516
 
1083
1517
  ```vue
1084
1518
  <ColumnSettingsPanel
@@ -1199,11 +1633,27 @@ function onResetColumnOrder(api: GridApi) {
1199
1633
 
1200
1634
  #### 样式与主题
1201
1635
 
1202
- 面板使用 MagicGrid 语义 token(`--mg-color-bg` · `--mg-color-text` · `--mg-color-border` 等),在暗色主题下自动适配。Popover 容器类名:
1636
+ 样式定义于 `style.css`(源码 `src/styles/tokens/column-settings.less`),主要类名:
1203
1637
 
1204
- - `.mg-column-settings` 面板根
1205
- - `.mg-column-settings-popover` — Popover 外层
1206
- - `.mg-column-settings-portal` Teleport portal 容器
1638
+ | 类名 | 说明 |
1639
+ |------|------|
1640
+ | `.mg-column-settings-button` | 齿轮按钮根;**独立使用时在此定义主题 CSS 变量** |
1641
+ | `.mg-column-settings-button__trigger` | 可点击触发器(边框 / 背景 / 尺寸) |
1642
+ | `.mg-column-settings-menu` | 下拉菜单容器 |
1643
+ | `.mg-column-settings-popover` | Popover 定位层(`position: fixed`) |
1644
+ | `.mg-column-settings-portal` | Teleport portal;**独立使用时在此定义 z-index 等变量** |
1645
+ | `.mg-column-settings` | 列设置面板根 |
1646
+
1647
+ 主题 token 在 `.magic-grid` 与上述独立根节点上均可生效;在 MagicGrid 内使用时继承 `--mg-color-bg` · `--mg-color-primary` 等表格主题;在外部工具栏使用时自带 light 主题 fallback(`#fff` / `#d1d5db` 等)。暗色主题下若按钮在 Grid 外,可通过外层容器覆盖 CSS 变量:
1648
+
1649
+ ```css
1650
+ .page-toolbar .mg-column-settings-button,
1651
+ .page-toolbar .mg-column-settings-portal {
1652
+ --mg-color-column-settings-bg: #1f2937;
1653
+ --mg-color-column-settings-border: #374151;
1654
+ --mg-color-column-settings-text: #f9fafb;
1655
+ }
1656
+ ```
1207
1657
 
1208
1658
  ---
1209
1659
 
@@ -1288,6 +1738,7 @@ import type { ColumnSettingsMenuIconName } from '@taocompany/magic-grid'
1288
1738
  | [`docs/README.md`](docs/README.md) | 内部设计文档索引(架构、里程碑、AG Grid 对照) |
1289
1739
  | [`docs/16-grid-api-reference.md`](docs/16-grid-api-reference.md) | GridApi 完整参考 |
1290
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) |
1291
1742
  | [`docs/39-phase27-table-settings-button.md`](docs/39-phase27-table-settings-button.md) | 列设置按钮设计文档(Phase 27) |
1292
1743
 
1293
1744
  ### 校验子路径