@taocompany/magic-grid 0.2.0 → 0.3.1
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.
- package/README.md +586 -19
- package/dist/components/ColumnSettings/ColumnFilterPanelEmbed.vue.d.ts +4 -3
- package/dist/components/ColumnSettings/ColumnFilterPanelEmbed.vue.d.ts.map +1 -1
- package/dist/components/ColumnSettings/ColumnSettingsButton.vue.d.ts +6 -5
- package/dist/components/ColumnSettings/ColumnSettingsButton.vue.d.ts.map +1 -1
- package/dist/components/ColumnSettings/ColumnSettingsClearFiltersBar.vue.d.ts +4 -3
- package/dist/components/ColumnSettings/ColumnSettingsClearFiltersBar.vue.d.ts.map +1 -1
- package/dist/components/ColumnSettings/ColumnSettingsGroupedLists.vue.d.ts +4 -3
- package/dist/components/ColumnSettings/ColumnSettingsGroupedLists.vue.d.ts.map +1 -1
- package/dist/components/ColumnSettings/ColumnSettingsList.vue.d.ts +4 -3
- package/dist/components/ColumnSettings/ColumnSettingsList.vue.d.ts.map +1 -1
- package/dist/components/ColumnSettings/ColumnSettingsMenu.vue.d.ts +4 -3
- package/dist/components/ColumnSettings/ColumnSettingsMenu.vue.d.ts.map +1 -1
- package/dist/components/ColumnSettings/ColumnSettingsMenuIcon.vue.d.ts +3 -2
- package/dist/components/ColumnSettings/ColumnSettingsMenuIcon.vue.d.ts.map +1 -1
- package/dist/components/ColumnSettings/ColumnSettingsMenuItem.vue.d.ts +2 -1
- package/dist/components/ColumnSettings/ColumnSettingsMenuItem.vue.d.ts.map +1 -1
- package/dist/components/ColumnSettings/ColumnSettingsPanel.vue.d.ts +4 -3
- package/dist/components/ColumnSettings/ColumnSettingsPanel.vue.d.ts.map +1 -1
- package/dist/components/ColumnSettings/ColumnSettingsRow.vue.d.ts +4 -3
- package/dist/components/ColumnSettings/ColumnSettingsRow.vue.d.ts.map +1 -1
- package/dist/components/MagicGrid/MagicGrid.vue.d.ts +166 -155
- package/dist/components/MagicGrid/MagicGrid.vue.d.ts.map +1 -1
- package/dist/components/MagicGrid/useStatusBarContext.d.ts +3 -3
- package/dist/components/StatusBar/StatusBarDefaultPanels.vue.d.ts +3 -2
- package/dist/components/StatusBar/StatusBarDefaultPanels.vue.d.ts.map +1 -1
- package/dist/components/StatusBar/StatusBarRangeAggregationPanels.vue.d.ts +3 -2
- package/dist/components/StatusBar/StatusBarRangeAggregationPanels.vue.d.ts.map +1 -1
- package/dist/components/StatusBar/resolveStatusBarRangeAggregationPrecision.d.ts +1 -1
- package/dist/components/StatusBar/resolveStatusBarRangeAggregationPrecision.d.ts.map +1 -1
- package/dist/components/cellEditor/index.d.ts +1 -1
- package/dist/components/cellEditor/index.d.ts.map +1 -1
- package/dist/components/cellEditor/{useMagicGridCellEditor.d.ts → useCellEditor.d.ts} +4 -4
- package/dist/components/cellEditor/useCellEditor.d.ts.map +1 -0
- package/dist/core/api/gridApi.d.ts +35 -23
- package/dist/core/api/gridApi.d.ts.map +1 -1
- package/dist/core/cellComment/cellCommentService.d.ts +2 -2
- package/dist/core/column/columnModel.d.ts +1 -1
- package/dist/core/column/createExpandColumnDef.d.ts +1 -1
- package/dist/core/column/createGroupColumnDef.d.ts +1 -1
- package/dist/core/column/createIndexColumnDef.d.ts +1 -1
- package/dist/core/column/createSelectionColumnDef.d.ts +1 -1
- package/dist/core/column/prepareGridColumnDefs.d.ts +1 -1
- package/dist/core/column/resolveColumnAlign.d.ts +3 -3
- package/dist/core/column/resolveColumnAlign.d.ts.map +1 -1
- package/dist/core/editing/cellDisablePipeline.d.ts +1 -1
- package/dist/core/editing/cellEditPipeline.d.ts +5 -5
- package/dist/core/editing/cellEditPipeline.d.ts.map +1 -1
- package/dist/core/editing/gridValidation.d.ts +2 -2
- package/dist/core/grid/cellEditing/types.d.ts +4 -3
- package/dist/core/grid/cellEditing/types.d.ts.map +1 -1
- package/dist/core/grid/grid.d.ts +14 -12
- package/dist/core/grid/grid.d.ts.map +1 -1
- package/dist/core/grid/gridColumnLayout.d.ts +8 -5
- package/dist/core/grid/gridColumnLayout.d.ts.map +1 -1
- package/dist/core/grid/gridInteraction/focusController.d.ts +2 -2
- package/dist/core/grid/gridInteraction/focusController.d.ts.map +1 -1
- package/dist/core/grid/gridInteraction/indexSelectionDragSession.d.ts +2 -1
- package/dist/core/grid/gridInteraction/indexSelectionDragSession.d.ts.map +1 -1
- package/dist/core/grid/gridInteraction/rowDragSession.d.ts +3 -2
- package/dist/core/grid/gridInteraction/rowDragSession.d.ts.map +1 -1
- package/dist/core/grid/gridInteraction/types.d.ts +18 -13
- package/dist/core/grid/gridInteraction/types.d.ts.map +1 -1
- package/dist/core/grid/gridOptions.d.ts +6 -5
- package/dist/core/grid/gridOptions.d.ts.map +1 -1
- package/dist/core/grid/gridRowMutation.d.ts +5 -4
- package/dist/core/renderer/cellRangeVisualController.d.ts +2 -1
- package/dist/core/renderer/cellRangeVisualController.d.ts.map +1 -1
- package/dist/core/renderer/rowRenderer.d.ts +19 -12
- package/dist/core/renderer/rowRenderer.d.ts.map +1 -1
- package/dist/core/row/cellComp.d.ts +2 -1
- package/dist/core/row/cellComp.d.ts.map +1 -1
- package/dist/core/row/rowComp.d.ts +10 -5
- package/dist/core/row/rowComp.d.ts.map +1 -1
- package/dist/core/rowModel/clientSideRowModel.d.ts +1 -1
- package/dist/core/rowModel/createRowNodes.d.ts +1 -1
- package/dist/core/rowModel/rowDataExport.d.ts +1 -1
- package/dist/core/selection/cellClipboardService.d.ts +2 -1
- package/dist/core/selection/cellClipboardService.d.ts.map +1 -1
- package/dist/core/selection/selectable.d.ts +1 -1
- package/dist/core/styling/cellStylePipeline.d.ts +1 -1
- package/dist/core/theme/gridSize.d.ts +10 -10
- package/dist/core/theme/gridSize.d.ts.map +1 -1
- package/dist/core/theme/gridTheme.d.ts +8 -8
- package/dist/core/theme/gridTheme.d.ts.map +1 -1
- package/dist/core/theme/index.d.ts +2 -2
- package/dist/core/theme/index.d.ts.map +1 -1
- package/dist/core/transaction/applyTransaction.d.ts +1 -1
- package/dist/core/treeTable/treeLazyLoadService.d.ts +1 -1
- package/dist/core/types/align.d.ts +16 -20
- package/dist/core/types/align.d.ts.map +1 -1
- package/dist/core/types/businessRowId.d.ts +3 -2
- package/dist/core/types/businessRowId.d.ts.map +1 -1
- package/dist/core/types/cellClipboard.d.ts +3 -2
- package/dist/core/types/cellClipboard.d.ts.map +1 -1
- package/dist/core/types/cellColor.d.ts +1 -1
- package/dist/core/types/cellComment.d.ts +3 -2
- package/dist/core/types/cellComment.d.ts.map +1 -1
- package/dist/core/types/cellDisable.d.ts +1 -1
- package/dist/core/types/cellEditor.d.ts +4 -3
- package/dist/core/types/cellEditor.d.ts.map +1 -1
- package/dist/core/types/cellRenderer.d.ts +1 -1
- package/dist/core/types/cellSpan.d.ts +1 -1
- package/dist/core/types/column.d.ts +47 -32
- package/dist/core/types/column.d.ts.map +1 -1
- package/dist/core/types/columnAvailability.d.ts +1 -1
- package/dist/core/types/columnFilter.d.ts +1 -1
- package/dist/core/types/columnMove.d.ts +1 -1
- package/dist/core/types/columnResize.d.ts +1 -1
- package/dist/core/types/columnSettingsPanel.d.ts +2 -2
- package/dist/core/types/columnSettingsPanel.d.ts.map +1 -1
- package/dist/core/types/columnSort.d.ts +1 -1
- package/dist/core/types/columnVisibility.d.ts +1 -1
- package/dist/core/types/events.d.ts +8 -6
- package/dist/core/types/events.d.ts.map +1 -1
- package/dist/core/types/gridOptions.d.ts +9 -6
- package/dist/core/types/gridOptions.d.ts.map +1 -1
- package/dist/core/types/index.d.ts +2 -2
- package/dist/core/types/index.d.ts.map +1 -1
- package/dist/core/types/indexColumn.d.ts +14 -14
- package/dist/core/types/indexColumn.d.ts.map +1 -1
- package/dist/core/types/overflowTooltip.d.ts +1 -1
- package/dist/core/types/pipeline.d.ts +1 -1
- package/dist/core/types/rowComp.d.ts +10 -5
- package/dist/core/types/rowComp.d.ts.map +1 -1
- package/dist/core/types/rowDrag.d.ts +1 -1
- package/dist/core/types/rowExpansion.d.ts +1 -1
- package/dist/core/types/rowGrouping.d.ts +1 -1
- package/dist/core/types/rowHeight.d.ts +1 -1
- package/dist/core/types/rowMutation.d.ts +1 -1
- package/dist/core/types/rowMutationAsync.d.ts +1 -1
- package/dist/core/types/rowNode.d.ts +1 -1
- package/dist/core/types/selectionColumn.d.ts +14 -14
- package/dist/core/types/selectionColumn.d.ts.map +1 -1
- package/dist/core/types/summary.d.ts +1 -1
- package/dist/core/types/transaction.d.ts +1 -1
- package/dist/core/types/treeTable.d.ts +1 -1
- package/dist/core/types/validation.d.ts +1 -1
- package/dist/index.cjs.js +2 -2
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +2 -19
- package/dist/index.d.ts.map +1 -1
- package/dist/index.es.js +220 -224
- package/dist/index.es.js.map +1 -1
- package/dist/style.css +1 -1
- package/dist/types/core.cjs.js +0 -0
- package/dist/types/core.d.ts +3038 -0
- package/dist/types/core.d.ts.map +1 -0
- package/dist/types/core.es.js +0 -0
- package/dist/types/magic-grid-expose.d.ts +13 -2
- package/dist/types/magic-grid-expose.d.ts.map +1 -1
- package/dist/types/magic-grid.d.ts +318 -238
- package/dist/types/magic-grid.d.ts.map +1 -1
- package/dist/types/{statusBar.d.ts → status-bar.d.ts} +5 -1
- package/dist/types/status-bar.d.ts.map +1 -0
- package/dist/types/validation.cjs.js +0 -0
- package/dist/types/validation.d.ts +9 -0
- package/dist/types/validation.d.ts.map +1 -0
- package/dist/types/validation.es.js +0 -0
- package/dist/validation/asyncValidatorAdapter.d.ts +5 -6
- package/dist/validation/asyncValidatorAdapter.d.ts.map +1 -1
- package/dist/validation/index.d.ts +0 -1
- package/dist/validation/index.d.ts.map +1 -1
- package/dist/{validation-DWDC_zL7.js → validation-BHqm5Flb.js} +33 -33
- package/dist/validation-BHqm5Flb.js.map +1 -0
- package/dist/validation-CD6lt5wS.cjs.map +1 -1
- package/dist/validation.cjs.js +1 -1
- package/dist/validation.es.js +1 -1
- package/package.json +13 -2
- package/dist/components/cellEditor/useMagicGridCellEditor.d.ts.map +0 -1
- package/dist/types/index.d.ts +0 -5
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/statusBar.d.ts.map +0 -1
- package/dist/validation-DWDC_zL7.js.map +0 -1
package/README.md
CHANGED
|
@@ -5,7 +5,9 @@
|
|
|
5
5
|
## 目录
|
|
6
6
|
|
|
7
7
|
- [概述](#概述)
|
|
8
|
+
- [架构与设计](#架构与设计)
|
|
8
9
|
- [快速开始](#快速开始)
|
|
10
|
+
- [数据与性能最佳实践](#数据与性能最佳实践)
|
|
9
11
|
- [默认配置](#默认配置)
|
|
10
12
|
- [Props](#props)
|
|
11
13
|
- [MagicGrid Props](#magicgrid-props)
|
|
@@ -13,15 +15,22 @@
|
|
|
13
15
|
- [ColumnDef 列定义](#columndef-列定义)
|
|
14
16
|
- [列有效性与显隐](#列有效性与显隐)
|
|
15
17
|
- [Options 类型参考](#options-类型参考)
|
|
18
|
+
- [筛选模型参考](#筛选模型参考)
|
|
16
19
|
- [Events](#events)
|
|
17
20
|
- [Expose](#expose)
|
|
18
21
|
- [Slots](#slots)
|
|
22
|
+
- [单元格编辑](#单元格编辑)
|
|
23
|
+
- [数据校验](#数据校验)
|
|
24
|
+
- [键盘导航与快捷键](#键盘导航与快捷键)
|
|
19
25
|
- [辅助组件](#辅助组件)
|
|
20
26
|
- [ColumnSettingsButton](#columnsettingsbutton)
|
|
21
27
|
- [ColumnSettingsPanel](#columnsettingspanel)
|
|
22
28
|
- [ColumnSettingsMenuItem](#columnsettingsmenuitem)
|
|
23
29
|
- [ColumnSettingsMenuIcon](#columnsettingsmenuicon)
|
|
24
|
-
- [
|
|
30
|
+
- [包入口与导出](#包入口与导出)
|
|
31
|
+
- [TypeScript 集成](#typescript-集成)
|
|
32
|
+
- [类型与校验子路径](#类型与校验子路径)
|
|
33
|
+
- [本地开发与 Playground](#本地开发与-playground)
|
|
25
34
|
|
|
26
35
|
---
|
|
27
36
|
|
|
@@ -37,6 +46,9 @@
|
|
|
37
46
|
| **布局** | 固定列、列拖拽/调整宽度、列有效性与显隐(`available` / `hidden`)、合并单元格、动态行高、主从展开行 |
|
|
38
47
|
| **结构** | 行分组、树形表格(含懒加载)、表尾汇总 |
|
|
39
48
|
| **体验** | 溢出 Tooltip、单元格批注、空态 Overlay、暗色主题、底部状态栏 |
|
|
49
|
+
| **扩展** | 列设置面板、Vue 第三方编辑器 Composable、inline 常驻编辑器、async-validator 校验 |
|
|
50
|
+
|
|
51
|
+
当前版本:**0.3.0**(`@taocompany/magic-grid`)。
|
|
40
52
|
|
|
41
53
|
### 环境要求
|
|
42
54
|
|
|
@@ -60,6 +72,40 @@ import '@taocompany/magic-grid/style.css'
|
|
|
60
72
|
|
|
61
73
|
> **ColumnSettingsButton / ColumnSettingsPanel** 与 MagicGrid 共用同一份 `style.css`。按钮或下拉菜单若放在页头工具栏等 **MagicGrid 容器外**,同样必须引入该文件;样式 token 已在 `.mg-column-settings-button` / `.mg-column-settings-portal` 上自带 fallback,脱离 `.magic-grid` 也可正常显示。
|
|
62
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
|
+
|
|
63
109
|
---
|
|
64
110
|
|
|
65
111
|
## 快速开始
|
|
@@ -68,7 +114,7 @@ import '@taocompany/magic-grid/style.css'
|
|
|
68
114
|
<script setup lang="ts">
|
|
69
115
|
import { ref } from 'vue'
|
|
70
116
|
import { MagicGrid } from '@taocompany/magic-grid'
|
|
71
|
-
import type { ColumnDef, MagicGridExpose, RowData } from '@taocompany/magic-grid'
|
|
117
|
+
import type { ColumnDef, MagicGridExpose, RowData } from '@taocompany/magic-grid/types/core'
|
|
72
118
|
import '@taocompany/magic-grid/style.css'
|
|
73
119
|
|
|
74
120
|
const gridRef = ref<MagicGridExpose>()
|
|
@@ -123,6 +169,29 @@ const columns: ColumnDef[] = [
|
|
|
123
169
|
<MagicGrid :columns="columns" :data="data" row-key="id" height="400" />
|
|
124
170
|
```
|
|
125
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
|
+
|
|
126
195
|
---
|
|
127
196
|
|
|
128
197
|
## 默认配置
|
|
@@ -227,7 +296,7 @@ const columns: ColumnDef[] = [
|
|
|
227
296
|
|
|
228
297
|
| 配置项 | 默认值 | 说明 |
|
|
229
298
|
|--------|--------|------|
|
|
230
|
-
| `
|
|
299
|
+
| `editBehavior` | `'cell'` | 单格编辑 |
|
|
231
300
|
| `editType` | `'singleClick'` | 单击进入编辑 |
|
|
232
301
|
| `invalidEditValueMode` | `'block'` | 校验失败保持编辑态 |
|
|
233
302
|
|
|
@@ -402,7 +471,7 @@ const columns: ColumnDef[] = [
|
|
|
402
471
|
| `index` | `(rowIndex) => number \| string` | — | 自定义序号展示 |
|
|
403
472
|
| `showRowDragHandle` | `boolean` | `false` | 在索引列显示行拖拽把柄 |
|
|
404
473
|
| `enableRowResizer` | `boolean` | `false` | 索引列底边可拖拽调整行高 |
|
|
405
|
-
| `headerAlign` / `headerValign` / `align` / `valign` / `footerAlign` / `footerValign` |
|
|
474
|
+
| `headerAlign` / `headerValign` / `align` / `valign` / `footerAlign` / `footerValign` | `GridHorizontalAlign` / `GridVerticalAlign` | `'center'` | 对齐配置 |
|
|
406
475
|
|
|
407
476
|
#### 行选择
|
|
408
477
|
|
|
@@ -430,7 +499,7 @@ interface RowSelectionConfig {
|
|
|
430
499
|
| `width` | `number` | `40` | 列宽 px(最小 40) |
|
|
431
500
|
| `selectAllLabel` | `string` | `'全选'` | 表头全选 checkbox 的 aria-label |
|
|
432
501
|
| `rowLabel` | `(rowIndex) => string` | — | 行 checkbox 的 aria-label 工厂 |
|
|
433
|
-
| `headerAlign` / `headerValign` / `align` / `valign` / `footerAlign` / `footerValign` |
|
|
502
|
+
| `headerAlign` / `headerValign` / `align` / `valign` / `footerAlign` / `footerValign` | `GridHorizontalAlign` / `GridVerticalAlign` | `'center'` | 对齐配置 |
|
|
434
503
|
|
|
435
504
|
#### 表尾汇总
|
|
436
505
|
|
|
@@ -477,7 +546,7 @@ interface RowSelectionConfig {
|
|
|
477
546
|
|
|
478
547
|
| Prop | 类型 | 默认值 | 说明 |
|
|
479
548
|
|------|------|--------|------|
|
|
480
|
-
| `
|
|
549
|
+
| `editBehavior` | `CellEditBehavior` | `'cell'` | 编辑范围:单格 / 整行 |
|
|
481
550
|
| `editType` | `CellEditType` | `'singleClick'` | 进入编辑态的触发方式 |
|
|
482
551
|
| `invalidEditValueMode` | `'block' \| 'revert' \| 'keep'` | `'block'` | 校验失败后:`block` 保持编辑;`revert` 退出并恢复旧值;`keep` 退出编辑但保留无效值 |
|
|
483
552
|
| `rowValidator` | `RowValidator` | — | 行编辑跨字段校验 |
|
|
@@ -810,9 +879,9 @@ Playground 验收:开发环境 `/phase22` · **T14–T15**(`legacyToken` 列
|
|
|
810
879
|
|
|
811
880
|
| 字段 | 类型 | 说明 |
|
|
812
881
|
|------|------|------|
|
|
813
|
-
| `headerAlign` / `headerValign` |
|
|
814
|
-
| `align` / `valign` |
|
|
815
|
-
| `footerAlign` / `footerValign` |
|
|
882
|
+
| `headerAlign` / `headerValign` | `GridHorizontalAlign` / `GridVerticalAlign` | 表头对齐;默认 `center` |
|
|
883
|
+
| `align` / `valign` | `GridHorizontalAlign` / `GridVerticalAlign` | 表体对齐;默认 `center` |
|
|
884
|
+
| `footerAlign` / `footerValign` | `GridHorizontalAlign` / `GridVerticalAlign` | 表尾对齐;默认 `center` |
|
|
816
885
|
|
|
817
886
|
#### 禁用与样式
|
|
818
887
|
|
|
@@ -855,7 +924,7 @@ Playground 验收:开发环境 `/phase22` · **T14–T15**(`legacyToken` 列
|
|
|
855
924
|
| `index` | `(rowIndex) => number \| string` | — | 自定义序号展示 |
|
|
856
925
|
| `showRowDragHandle` | `boolean` | `false` | 在索引列显示行拖拽把柄 |
|
|
857
926
|
| `enableRowResizer` | `boolean` | `false` | 索引列底边可拖拽调整行高 |
|
|
858
|
-
| `headerAlign` / `headerValign` / `align` / `valign` / `footerAlign` / `footerValign` |
|
|
927
|
+
| `headerAlign` / `headerValign` / `align` / `valign` / `footerAlign` / `footerValign` | `GridHorizontalAlign` / `GridVerticalAlign` | `'center'` | 对齐配置 |
|
|
859
928
|
|
|
860
929
|
### SelectionColumnOptions
|
|
861
930
|
|
|
@@ -866,7 +935,7 @@ Playground 验收:开发环境 `/phase22` · **T14–T15**(`legacyToken` 列
|
|
|
866
935
|
| `width` | `number` | `40` | 列宽 px(最小 40) |
|
|
867
936
|
| `selectAllLabel` | `string` | `'全选'` | 表头全选 checkbox 的 aria-label |
|
|
868
937
|
| `rowLabel` | `(rowIndex) => string` | — | 行 checkbox 的 aria-label 工厂 |
|
|
869
|
-
| `headerAlign` / `headerValign` / `align` / `valign` / `footerAlign` / `footerValign` |
|
|
938
|
+
| `headerAlign` / `headerValign` / `align` / `valign` / `footerAlign` / `footerValign` | `GridHorizontalAlign` / `GridVerticalAlign` | `'center'` | 对齐配置 |
|
|
870
939
|
|
|
871
940
|
### RowSelectionConfig
|
|
872
941
|
|
|
@@ -1143,6 +1212,82 @@ type StatusBarRangeAggregationPrecisionInput =
|
|
|
1143
1212
|
|
|
1144
1213
|
**ProcessDataFromClipboardParams**:`{ data: string[][], anchor: CellPosition }`,其中 `anchor` 为 `{ rowIndex, colId }`。
|
|
1145
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
|
+
|
|
1146
1291
|
---
|
|
1147
1292
|
|
|
1148
1293
|
## Events
|
|
@@ -1577,7 +1722,7 @@ interface MagicGridExpose {
|
|
|
1577
1722
|
```vue
|
|
1578
1723
|
<script setup lang="ts">
|
|
1579
1724
|
import { ref } from 'vue'
|
|
1580
|
-
import type { MagicGridExpose } from '@taocompany/magic-grid'
|
|
1725
|
+
import type { MagicGridExpose } from '@taocompany/magic-grid/types/core'
|
|
1581
1726
|
|
|
1582
1727
|
const gridRef = ref<MagicGridExpose>()
|
|
1583
1728
|
|
|
@@ -1797,7 +1942,7 @@ MagicGrid 提供**静态插槽**(固定名称)与**动态列插槽**(`#cel
|
|
|
1797
1942
|
| 插槽 prop | 类型 | 说明 |
|
|
1798
1943
|
|-----------|------|------|
|
|
1799
1944
|
| `api` | `GridApi \| undefined` | GridApi 实例 |
|
|
1800
|
-
| `size` | `
|
|
1945
|
+
| `size` | `GridSize` | 当前尺寸 preset |
|
|
1801
1946
|
| `portalEl` | `HTMLElement \| undefined` | 浮层挂载 portal 元素 |
|
|
1802
1947
|
|
|
1803
1948
|
```vue
|
|
@@ -1956,6 +2101,228 @@ MagicGrid 提供**静态插槽**(固定名称)与**动态列插槽**(`#cel
|
|
|
1956
2101
|
|
|
1957
2102
|
---
|
|
1958
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
|
+
|
|
1959
2326
|
## 辅助组件
|
|
1960
2327
|
|
|
1961
2328
|
表格列设置(Phase 27)提供一组**独立组件**,对标 AG Grid 的 Side Bar + Columns Tool Panel。只要持有 `GridApi` 即可使用,不强依赖 MagicGrid 内部 DOM。
|
|
@@ -1984,7 +2351,7 @@ import {
|
|
|
1984
2351
|
ColumnSettingsMenuItem,
|
|
1985
2352
|
ColumnSettingsMenuIcon,
|
|
1986
2353
|
} from '@taocompany/magic-grid'
|
|
1987
|
-
import type { GridApi, ColumnDef, RowData } from '@taocompany/magic-grid'
|
|
2354
|
+
import type { GridApi, ColumnDef, RowData } from '@taocompany/magic-grid/types/core'
|
|
1988
2355
|
import '@taocompany/magic-grid/style.css'
|
|
1989
2356
|
|
|
1990
2357
|
const columns: ColumnDef[] = [/* ... */]
|
|
@@ -2027,7 +2394,7 @@ function onResetColumnOrder(api: GridApi) {
|
|
|
2027
2394
|
<script setup lang="ts">
|
|
2028
2395
|
import { ref } from 'vue'
|
|
2029
2396
|
import { MagicGrid, ColumnSettingsButton } from '@taocompany/magic-grid'
|
|
2030
|
-
import type { GridApi, MagicGridExpose } from '@taocompany/magic-grid'
|
|
2397
|
+
import type { GridApi, MagicGridExpose } from '@taocompany/magic-grid/types/core'
|
|
2031
2398
|
|
|
2032
2399
|
const gridRef = ref<MagicGridExpose>()
|
|
2033
2400
|
</script>
|
|
@@ -2260,7 +2627,7 @@ const gridRef = ref<MagicGridExpose>()
|
|
|
2260
2627
|
类型 `ColumnSettingsMenuIconName` 已从包导出:
|
|
2261
2628
|
|
|
2262
2629
|
```ts
|
|
2263
|
-
import type { ColumnSettingsMenuIconName } from '@taocompany/magic-grid'
|
|
2630
|
+
import type { ColumnSettingsMenuIconName } from '@taocompany/magic-grid/types/core'
|
|
2264
2631
|
```
|
|
2265
2632
|
|
|
2266
2633
|
#### Slots / Events / Expose
|
|
@@ -2269,14 +2636,214 @@ import type { ColumnSettingsMenuIconName } from '@taocompany/magic-grid'
|
|
|
2269
2636
|
|
|
2270
2637
|
---
|
|
2271
2638
|
|
|
2272
|
-
## 校验子路径
|
|
2273
2639
|
|
|
2274
|
-
|
|
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`
|
|
2680
|
+
|
|
2681
|
+
---
|
|
2682
|
+
|
|
2683
|
+
|
|
2684
|
+
## TypeScript 集成
|
|
2685
|
+
|
|
2686
|
+
### 行数据泛型
|
|
2687
|
+
|
|
2688
|
+
`ColumnDef` 与 `MagicGridProps` 支持泛型推导列 `prop` 与行数据字段:
|
|
2275
2689
|
|
|
2276
2690
|
```ts
|
|
2277
|
-
|
|
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'
|
|
2779
|
+
```
|
|
2780
|
+
|
|
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'
|
|
2278
2789
|
```
|
|
2279
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`。
|
|
2846
|
+
|
|
2280
2847
|
---
|
|
2281
2848
|
|
|
2282
2849
|
## License
|