@taocompany/magic-grid 0.6.6 → 0.7.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 +561 -14
- package/dist/components/ColumnSettings/ColumnSettingsMenu.vue.d.ts.map +1 -1
- package/dist/components/ColumnSettings/ColumnSettingsMenuIcon.vue.d.ts +1 -4
- package/dist/components/ColumnSettings/ColumnSettingsMenuIcon.vue.d.ts.map +1 -1
- package/dist/components/MagicGrid/MagicGrid.vue.d.ts +9 -0
- package/dist/components/MagicGrid/MagicGrid.vue.d.ts.map +1 -1
- package/dist/core/cell/cellCtrl.d.ts.map +1 -1
- package/dist/core/column/applyHeaderCells.d.ts +16 -0
- package/dist/core/column/applyHeaderCells.d.ts.map +1 -1
- package/dist/core/column/calcColumnWindow.d.ts +6 -0
- package/dist/core/column/calcColumnWindow.d.ts.map +1 -1
- package/dist/core/column/columnMoveService.d.ts +21 -1
- package/dist/core/column/columnMoveService.d.ts.map +1 -1
- package/dist/core/column/headerIcons.d.ts +6 -0
- package/dist/core/column/headerIcons.d.ts.map +1 -1
- package/dist/core/column/index.d.ts +1 -1
- package/dist/core/column/index.d.ts.map +1 -1
- package/dist/core/column/renderGroupCell.d.ts +24 -6
- package/dist/core/column/renderGroupCell.d.ts.map +1 -1
- package/dist/core/column/renderTreeHeaderCell.d.ts +16 -0
- package/dist/core/column/renderTreeHeaderCell.d.ts.map +1 -0
- package/dist/core/grid/columnHeaderDragDropPolicy.d.ts +32 -0
- package/dist/core/grid/columnHeaderDragDropPolicy.d.ts.map +1 -0
- package/dist/core/grid/columnHeaderDragEdgeScroll.d.ts +2 -1
- package/dist/core/grid/columnHeaderDragEdgeScroll.d.ts.map +1 -1
- package/dist/core/grid/grid.d.ts +7 -0
- package/dist/core/grid/grid.d.ts.map +1 -1
- package/dist/core/grid/gridInteraction/columnHeaderDragSession.d.ts +11 -1
- package/dist/core/grid/gridInteraction/columnHeaderDragSession.d.ts.map +1 -1
- package/dist/core/grid/gridInteraction/domTargets.d.ts +2 -0
- package/dist/core/grid/gridInteraction/domTargets.d.ts.map +1 -1
- package/dist/core/grid/gridInteraction/gridInteraction.d.ts +9 -0
- package/dist/core/grid/gridInteraction/gridInteraction.d.ts.map +1 -1
- package/dist/core/grid/gridInteraction/rowDragSession.d.ts.map +1 -1
- package/dist/core/grid/gridInteraction/types.d.ts +7 -0
- package/dist/core/grid/gridInteraction/types.d.ts.map +1 -1
- package/dist/core/grid/gridRowMutation.d.ts.map +1 -1
- package/dist/core/grid/gridViewport.d.ts +6 -2
- package/dist/core/grid/gridViewport.d.ts.map +1 -1
- package/dist/core/row/buildRowMoveItem.d.ts +18 -0
- package/dist/core/row/buildRowMoveItem.d.ts.map +1 -0
- package/dist/core/row/cellComp.d.ts +1 -0
- package/dist/core/row/cellComp.d.ts.map +1 -1
- package/dist/core/row/getRowDragCommitHierarchy.d.ts +24 -0
- package/dist/core/row/getRowDragCommitHierarchy.d.ts.map +1 -0
- package/dist/core/row/index.d.ts +1 -0
- package/dist/core/row/index.d.ts.map +1 -1
- package/dist/core/row/planRowDragMove.d.ts +3 -1
- package/dist/core/row/planRowDragMove.d.ts.map +1 -1
- package/dist/core/row/rowDragResultChanged.d.ts +3 -1
- package/dist/core/row/rowDragResultChanged.d.ts.map +1 -1
- package/dist/core/row/rowMoveService.d.ts.map +1 -1
- package/dist/core/treeTable/index.d.ts +3 -1
- package/dist/core/treeTable/index.d.ts.map +1 -1
- package/dist/core/treeTable/treeHierarchyMenu.d.ts +31 -0
- package/dist/core/treeTable/treeHierarchyMenu.d.ts.map +1 -0
- package/dist/core/treeTable/treeHierarchyMenuController.d.ts +18 -0
- package/dist/core/treeTable/treeHierarchyMenuController.d.ts.map +1 -0
- package/dist/core/treeTable/treeHierarchyMove.d.ts +19 -1
- package/dist/core/treeTable/treeHierarchyMove.d.ts.map +1 -1
- package/dist/core/treeTable/treeHierarchyShortcut.d.ts +101 -0
- package/dist/core/treeTable/treeHierarchyShortcut.d.ts.map +1 -0
- package/dist/core/treeTable/treeTableService.d.ts +2 -0
- package/dist/core/treeTable/treeTableService.d.ts.map +1 -1
- package/dist/core/treeTable/validateTreeRowMove.d.ts.map +1 -1
- package/dist/core/types/columnMove.d.ts +4 -0
- package/dist/core/types/columnMove.d.ts.map +1 -1
- package/dist/core/types/columnSettingsPanel.d.ts +2 -0
- package/dist/core/types/columnSettingsPanel.d.ts.map +1 -1
- package/dist/core/types/index.d.ts +1 -1
- package/dist/core/types/index.d.ts.map +1 -1
- package/dist/core/types/rowDrag.d.ts +117 -40
- package/dist/core/types/rowDrag.d.ts.map +1 -1
- package/dist/core/types/treeTable.d.ts +22 -2
- package/dist/core/types/treeTable.d.ts.map +1 -1
- package/dist/{cellEditorCache-ymzG_TG0.cjs → getRowDragCommitHierarchy-0oVURi17.cjs} +2 -2
- package/dist/getRowDragCommitHierarchy-0oVURi17.cjs.map +1 -0
- package/dist/{cellEditorCache-DmICiO9q.js → getRowDragCommitHierarchy-qD8vAlIy.js} +11 -2
- package/dist/getRowDragCommitHierarchy-qD8vAlIy.js.map +1 -0
- package/dist/index.cjs.js +5 -5
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.es.js +4757 -4090
- package/dist/index.es.js.map +1 -1
- package/dist/style.css +1 -1
- package/dist/types/core.cjs.js +1 -1
- package/dist/types/core.d.ts +96 -13
- package/dist/types/core.d.ts.map +1 -1
- package/dist/types/core.es.js +2 -2
- package/dist/types/magic-grid.d.ts +6 -0
- package/dist/types/magic-grid.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/cellEditorCache-DmICiO9q.js.map +0 -1
- package/dist/cellEditorCache-ymzG_TG0.cjs.map +0 -1
package/README.md
CHANGED
|
@@ -9,6 +9,20 @@
|
|
|
9
9
|
- [快速开始](#快速开始)
|
|
10
10
|
- [数据与性能最佳实践](#数据与性能最佳实践)
|
|
11
11
|
- [Cell Renderer 滚动渲染](#cell-renderer-滚动渲染)
|
|
12
|
+
- [树形表格](#树形表格)
|
|
13
|
+
- [概述与核心概念](#概述与核心概念)
|
|
14
|
+
- [快速上手](#树形表格快速上手)
|
|
15
|
+
- [配置项详解](#树形表格配置项详解)
|
|
16
|
+
- [数据模型与 getDataPath](#数据模型与-getdatapath)
|
|
17
|
+
- [树列 UI 与系统列](#树列-ui-与系统列)
|
|
18
|
+
- [展开与折叠](#展开与折叠)
|
|
19
|
+
- [树形懒加载](#树形懒加载)
|
|
20
|
+
- [排序、筛选与汇总](#排序筛选与汇总)
|
|
21
|
+
- [行选择与 groupSelectsChildren](#行选择与-groupselectschildren)
|
|
22
|
+
- [行拖拽与层级变更](#行拖拽与层级变更)
|
|
23
|
+
- [与其它能力叠加](#树形与其它能力叠加)
|
|
24
|
+
- [常见错误与排查](#常见错误与排查)
|
|
25
|
+
- [Playground 与延伸阅读](#playground-与延伸阅读)
|
|
12
26
|
- [默认配置](#默认配置)
|
|
13
27
|
- [Props](#props)
|
|
14
28
|
- [MagicGrid Props](#magicgrid-props)
|
|
@@ -107,6 +121,8 @@ Magic Grid 采用 **命令式渲染内核 + Vue 薄封装** 的分层架构,
|
|
|
107
121
|
| 行分组 | `group` → `filter` → `sort` → `aggregate` → `map` |
|
|
108
122
|
| 树形表格 | `tree` → `filter` → `sort` → `map` |
|
|
109
123
|
|
|
124
|
+
详见 **[树形表格](#树形表格)** 专章。
|
|
125
|
+
|
|
110
126
|
`summaryScope: 'displayed'`、状态栏行数、框选聚合均基于 `rowsToDisplay`;`summaryScope: 'all'` 对 `sourceRows` 全量汇总(忽略 filter)。
|
|
111
127
|
|
|
112
128
|
---
|
|
@@ -231,6 +247,514 @@ const columns: ColumnDef[] = [
|
|
|
231
247
|
|
|
232
248
|
---
|
|
233
249
|
|
|
250
|
+
## 树形表格
|
|
251
|
+
|
|
252
|
+
树形表格(Tree Table)在 **扁平 `data` 数组** 上,通过 **`getDataPath`** 为每行提供 **从根到当前节点的路径**(`string[]`),内核据此构建层级并 **DFS 投影** 为可见的 `rowsToDisplay`。对标 [AG Grid Tree Data](https://www.ag-grid.com/javascript-data-grid/tree-data/) 社区版语义;设计细节见 [`docs/30-phase19-tree-table.md`](docs/30-phase19-tree-table.md)。
|
|
253
|
+
|
|
254
|
+
> **与行分组互斥**:`tree: true` 与 `rowGrouping: true` **不得同时生效**。双开时控制台 dev 警告,**`tree` 优先**,`rowGrouping` 及 `ColumnDef.rowGroup` 被忽略。flat / group / tree 三选一,见 [概述与核心概念](#概述与核心概念)。
|
|
255
|
+
|
|
256
|
+
### 概述与核心概念
|
|
257
|
+
|
|
258
|
+
#### 为什么用扁平数组 + getDataPath?
|
|
259
|
+
|
|
260
|
+
Magic Grid **不支持**嵌套 `children` 字段作为树数据源(与 AG Grid CSRM 一致)。所有行仍存放在 **同一个 `data` 数组** 中;层级关系完全由 **`getDataPath({ data }) => string[]`** 表达:
|
|
261
|
+
|
|
262
|
+
| 概念 | 说明 |
|
|
263
|
+
|------|------|
|
|
264
|
+
| **`dataPath`** | 从根到当前节点的路径段,如 `['总部', '研发部', '前端组']` |
|
|
265
|
+
| **`treeLevel`** | 深度,根节点 = `0`,等于 `dataPath.length - 1` |
|
|
266
|
+
| **`parentRowId`** | 父节点 `rowKey`;根节点为 `undefined` |
|
|
267
|
+
| **`rowsToDisplay`** | 折叠感知的 DFS 扁平投影;渲染层 **只消费此数组** |
|
|
268
|
+
| **`sourceRows`** | 业务 flat 数组;`getData()` / `applyTransaction` 仍操作此层 |
|
|
269
|
+
|
|
270
|
+
**示例路径**(组织树):
|
|
271
|
+
|
|
272
|
+
| 行 id | dataPath | treeLevel | 含义 |
|
|
273
|
+
|-------|----------|-----------|------|
|
|
274
|
+
| `hq` | `['HQ']` | 0 | 根 |
|
|
275
|
+
| `eng` | `['HQ', '研发']` | 1 | HQ 下研发部 |
|
|
276
|
+
| `fe` | `['HQ', '研发', '前端']` | 2 | 研发部下前端组 |
|
|
277
|
+
|
|
278
|
+
#### 路径规则(必须遵守)
|
|
279
|
+
|
|
280
|
+
1. **前缀唯一确定父子**:`['A','B']` 的父路径必须是 `['A']`;缺父路径 → 建树 **throw**。
|
|
281
|
+
2. **同一路径不得对应多行**:重复路径 → 建树 **throw**。
|
|
282
|
+
3. **路径段为任意字符串**:可含中文、空格、特殊字符;内核用 `\0` 拼接做内部 key。
|
|
283
|
+
4. **`rowKey` 必须稳定唯一**:与 flat 表格相同;临时行可用 `__mg_tmp_*`,落库后 `promoteRowId`。
|
|
284
|
+
|
|
285
|
+
#### 数据管线(tree 模式)
|
|
286
|
+
|
|
287
|
+
启用 `tree: true` 后,阶段顺序为:
|
|
288
|
+
|
|
289
|
+
```
|
|
290
|
+
sourceRows(flat)
|
|
291
|
+
→ [tree] TreeBuildStage(getDataPath 建树)
|
|
292
|
+
→ [filter] 递归过滤 · 空枝剪枝
|
|
293
|
+
→ [sort] 同级兄弟排序(不跨层)
|
|
294
|
+
→ [map] DFS 扁平化(折叠跳过子树)
|
|
295
|
+
→ [afterMap] detail 行注入(若 masterDetail)
|
|
296
|
+
→ positionRows → displayRows
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
- **expand/collapse** 走 **map-only 快路径**(`refreshModel({ stages: ['map'] })`),不重跑 tree/filter/sort。
|
|
300
|
+
- **`summaryScope: 'displayed'`**、状态栏行数、框选聚合均基于投影后的可见行。
|
|
301
|
+
|
|
302
|
+
#### 与 rowGrouping 的区别
|
|
303
|
+
|
|
304
|
+
| 维度 | 行分组 (`rowGrouping`) | 树形表格 (`tree`) |
|
|
305
|
+
|------|------------------------|-------------------|
|
|
306
|
+
| 层级来源 | 列值 `rowGroup` 聚合 | `getDataPath` 路径 |
|
|
307
|
+
| 数据行 | leaf + synthetic group 行 | **全部为 user data 行** |
|
|
308
|
+
| 系统列 | auto group 列(`__group__`) | tree 列(`__tree__`) |
|
|
309
|
+
| 管线 | `group → filter → sort → aggregate → map` | `tree → filter → sort → map` |
|
|
310
|
+
| 互斥 | 与 `tree` 不得双开 | 与 `rowGrouping` 不得双开 |
|
|
311
|
+
|
|
312
|
+
### 树形表格快速上手
|
|
313
|
+
|
|
314
|
+
```vue
|
|
315
|
+
<script setup lang="ts">
|
|
316
|
+
import { ref } from 'vue'
|
|
317
|
+
import { MagicGrid } from '@taocompany/magic-grid'
|
|
318
|
+
import type { ColumnDef, GetDataPathFn, RowData } from '@taocompany/magic-grid/types/core'
|
|
319
|
+
import '@taocompany/magic-grid/style.css'
|
|
320
|
+
|
|
321
|
+
interface OrgRow extends RowData {
|
|
322
|
+
id: string
|
|
323
|
+
org: string
|
|
324
|
+
dept?: string
|
|
325
|
+
team?: string
|
|
326
|
+
name: string
|
|
327
|
+
headcount: number
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
/** flat 源数据——无 children 嵌套 */
|
|
331
|
+
const data = ref<OrgRow[]>([
|
|
332
|
+
{ id: 'hq', org: 'HQ', name: '总部', headcount: 120 },
|
|
333
|
+
{ id: 'eng', org: 'HQ', dept: '研发', name: '研发部', headcount: 80 },
|
|
334
|
+
{ id: 'fe', org: 'HQ', dept: '研发', team: '前端', name: '前端组', headcount: 20 },
|
|
335
|
+
{ id: 'be', org: 'HQ', dept: '研发', team: '后端', name: '后端组', headcount: 25 },
|
|
336
|
+
{ id: 'sales', org: 'HQ', dept: '销售', name: '销售部', headcount: 30 },
|
|
337
|
+
])
|
|
338
|
+
|
|
339
|
+
const columns: ColumnDef[] = [
|
|
340
|
+
{ prop: 'name', label: '名称', width: 140, filterable: true },
|
|
341
|
+
{ prop: 'headcount', label: '人数', width: 88, sortable: true },
|
|
342
|
+
]
|
|
343
|
+
|
|
344
|
+
/** 由 org → dept → team 拼路径;也可直接读 row.pathSegments */
|
|
345
|
+
const getDataPath: GetDataPathFn = ({ data }) =>
|
|
346
|
+
[data.org, data.dept, data.team].filter(Boolean).map(String)
|
|
347
|
+
</script>
|
|
348
|
+
|
|
349
|
+
<template>
|
|
350
|
+
<MagicGrid
|
|
351
|
+
:data="data"
|
|
352
|
+
:columns="columns"
|
|
353
|
+
row-key="id"
|
|
354
|
+
height="480"
|
|
355
|
+
tree
|
|
356
|
+
:get-data-path="getDataPath"
|
|
357
|
+
:group-default-expanded="-1"
|
|
358
|
+
:row-selection="{ mode: 'multiple', groupSelectsChildren: true }"
|
|
359
|
+
@tree-node-opened="(e) => console.log('treeNodeOpened', e)"
|
|
360
|
+
/>
|
|
361
|
+
</template>
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
效果:左侧自动注入 **tree 系统列**(缩进 + chevron + 路径末段或 `name`),支持折叠/展开、同级排序筛选、父子联动行选。完整交互验收见 Playground **`/phase19`**。
|
|
365
|
+
|
|
366
|
+
### 树形表格配置项详解
|
|
367
|
+
|
|
368
|
+
以下为树形相关 **Grid 级 prop** 完整说明。类型定义见 `@taocompany/magic-grid/types/core` 中的 `TreeTableGridOptions`。
|
|
369
|
+
|
|
370
|
+
| Prop | 类型 | 默认值 | 说明 |
|
|
371
|
+
|------|------|--------|------|
|
|
372
|
+
| `tree` | `boolean` | `false` | **总闸**。`true` 时启用树形模式;**必填** `getDataPath` |
|
|
373
|
+
| `getDataPath` | `GetDataPathFn` | — | `( { data } ) => string[]`,每行返回路径。**`tree: true` 时必填**,缺失则 throw |
|
|
374
|
+
| `groupDefaultExpanded` | `number` | `-1` | 默认展开层级(tree / group **共用**此 prop)。`0` = 全折叠;`1` = 仅展开第一层;`-1` = 全部展开 |
|
|
375
|
+
| `showTreeColumn` | `boolean` | `true` | 是否注入 tree 系统列(colId `__tree__`) |
|
|
376
|
+
| `autoTreeColumnDef` | `Partial<ColumnDef>` | — | 覆盖 tree 列宽、pinned、headerName 等;对标 AG Grid `autoGroupColumnDef` |
|
|
377
|
+
| `treeValueGetter` | `TreeValueGetterFn` | — | 自定义 tree 列展示文案;缺省为 **`dataPath` 末段** |
|
|
378
|
+
| `treeDisplayType` | `'singleColumn'` | `'singleColumn'` | v1 仅单列树展示 |
|
|
379
|
+
| `treeLazyLoad` | `boolean` | `false` | 启用 CSRM 懒加载;`true` 时需 `loadTreeChildren` |
|
|
380
|
+
| `hasTreeChildren` | `HasTreeChildrenFn` | — | lazy:`true` 时即使 source 尚无子孙也展示 expand chevron |
|
|
381
|
+
| `loadTreeChildren` | `LoadTreeChildrenFn` | — | lazy:首次展开且无已加载子行时异步拉取子数据 |
|
|
382
|
+
| `treeDragScope` | `'siblings' \| 'hierarchy'` | `'siblings'` | 行拖拽范围,见 [行拖拽与层级变更](#行拖拽与层级变更) |
|
|
383
|
+
| `setDataPath` | `SetDataPathFn` | — | `hierarchy` 模式下 drag/shortcut 写回路径到 `row.data` |
|
|
384
|
+
| `treeHierarchyActions` | `boolean` | `true` | `hierarchy` + `setDataPath` 时,tree 列 hover 展示 **上移一级 / 下移一级** 菜单 |
|
|
385
|
+
|
|
386
|
+
**回调类型签名**:
|
|
387
|
+
|
|
388
|
+
```ts
|
|
389
|
+
type GetDataPathFn = (params: { data: RowData }) => string[]
|
|
390
|
+
|
|
391
|
+
interface TreeValueGetterParams {
|
|
392
|
+
data: RowData
|
|
393
|
+
dataPath: string[]
|
|
394
|
+
treeLevel: number
|
|
395
|
+
}
|
|
396
|
+
type TreeValueGetterFn = (params: TreeValueGetterParams) => string
|
|
397
|
+
|
|
398
|
+
interface HasTreeChildrenParams {
|
|
399
|
+
data: RowData
|
|
400
|
+
dataPath: string[]
|
|
401
|
+
treeLevel: number
|
|
402
|
+
}
|
|
403
|
+
type HasTreeChildrenFn = (params: HasTreeChildrenParams) => boolean
|
|
404
|
+
|
|
405
|
+
interface LoadTreeChildrenParams {
|
|
406
|
+
parentRowId: BusinessRowId
|
|
407
|
+
parentData: RowData
|
|
408
|
+
dataPath: string[]
|
|
409
|
+
treeLevel: number
|
|
410
|
+
signal: AbortSignal // 折叠 / destroy 时可 abort
|
|
411
|
+
}
|
|
412
|
+
type LoadTreeChildrenFn = (
|
|
413
|
+
params: LoadTreeChildrenParams,
|
|
414
|
+
) => Promise<RowData[] | void> | RowData[] | void
|
|
415
|
+
|
|
416
|
+
interface SetDataPathParams {
|
|
417
|
+
data: RowData
|
|
418
|
+
dataPath: string[]
|
|
419
|
+
treeLevel: number
|
|
420
|
+
previousPath: readonly string[]
|
|
421
|
+
}
|
|
422
|
+
type SetDataPathFn = (params: SetDataPathParams) => void
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
> **`setDataPath` 默认行为**:未传入时,若 `data.pathSegments` 为数组,内核会自动 `data.pathSegments = [...dataPath]`。业务字段(如 `org` / `dept`)需自行在 `setDataPath` 中同步。
|
|
426
|
+
|
|
427
|
+
### 数据模型与 getDataPath
|
|
428
|
+
|
|
429
|
+
#### 推荐建模方式
|
|
430
|
+
|
|
431
|
+
**方式 A — 路径存于业务字段**(推荐,便于持久化):
|
|
432
|
+
|
|
433
|
+
```ts
|
|
434
|
+
interface MenuRow {
|
|
435
|
+
id: number
|
|
436
|
+
pathSegments: string[] // ['系统管理', '用户管理', '角色列表']
|
|
437
|
+
title: string
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
const getDataPath: GetDataPathFn = ({ data }) => data.pathSegments
|
|
441
|
+
```
|
|
442
|
+
|
|
443
|
+
**方式 B — 路径由字段拼接**(适合固定层级列):
|
|
444
|
+
|
|
445
|
+
```ts
|
|
446
|
+
const getDataPath: GetDataPathFn = ({ data }) =>
|
|
447
|
+
[data.org, data.dept, data.team].filter(Boolean).map(String)
|
|
448
|
+
```
|
|
449
|
+
|
|
450
|
+
**方式 C — hierarchy 拖拽后写回**(需 `setDataPath`):
|
|
451
|
+
|
|
452
|
+
```ts
|
|
453
|
+
const setDataPath: SetDataPathFn = ({ data, dataPath }) => {
|
|
454
|
+
data.pathSegments = [...dataPath]
|
|
455
|
+
data.org = dataPath[0]
|
|
456
|
+
data.dept = dataPath[1]
|
|
457
|
+
data.team = dataPath[2]
|
|
458
|
+
}
|
|
459
|
+
```
|
|
460
|
+
|
|
461
|
+
#### Transaction 与增量更新
|
|
462
|
+
|
|
463
|
+
树形模式下 **`applyTransaction` 仍操作 flat `sourceRows`**:
|
|
464
|
+
|
|
465
|
+
```ts
|
|
466
|
+
// 新增子节点(路径必须含正确父前缀)
|
|
467
|
+
api.applyTransaction({
|
|
468
|
+
add: [{ id: 'new-fe', org: 'HQ', dept: '研发', team: '前端', name: '新小组', headcount: 5 }],
|
|
469
|
+
})
|
|
470
|
+
|
|
471
|
+
// 删除节点不会自动删子孙——需自行收集子树 id 后 remove
|
|
472
|
+
api.applyTransaction({ remove: ['fe', 'be'] })
|
|
473
|
+
```
|
|
474
|
+
|
|
475
|
+
懒加载成功时,内核 **内部等价于** `applyTransaction({ add: children })` 并 refresh tree 阶段。
|
|
476
|
+
|
|
477
|
+
#### getDataPath 与 getData() 的关系
|
|
478
|
+
|
|
479
|
+
- `api.getData()` 返回 **flat sourceRows**(与 AG Grid 一致),**不是** DFS 投影顺序。
|
|
480
|
+
- `api.getDataPath(rowId)` 查询某行的当前路径。
|
|
481
|
+
- 展示顺序以 **`rowsToDisplay`** 为准;行索引列对 display 行 **连续编号**(1…N)。
|
|
482
|
+
|
|
483
|
+
### 树列 UI 与系统列
|
|
484
|
+
|
|
485
|
+
#### 系统列顺序
|
|
486
|
+
|
|
487
|
+
启用 tree 后,列注入顺序为:
|
|
488
|
+
|
|
489
|
+
```
|
|
490
|
+
index(可选) → selection(可选) → expand(masterDetail 可选) → tree(__tree__) → 用户列
|
|
491
|
+
```
|
|
492
|
+
|
|
493
|
+
- tree 列默认 **左固定**(`pinned: 'left'`),默认宽 **200px**,最小 **120px**。
|
|
494
|
+
- 用户 `columns` 中 **不得**占用保留 colId:`__tree__`、`__index__`、`__selection__`、`__expand__`、`__group__`(冲突时 dev 警告并忽略)。
|
|
495
|
+
|
|
496
|
+
#### 展示内容
|
|
497
|
+
|
|
498
|
+
| 元素 | 说明 |
|
|
499
|
+
|------|------|
|
|
500
|
+
| **缩进** | 每级 `16px`(`padding-left = treeLevel × 16`) |
|
|
501
|
+
| **Chevron** | 可展开节点显示;叶节点隐藏或占位对齐 |
|
|
502
|
+
| **文案** | 默认 `dataPath` **末段**;可用 `treeValueGetter` 覆盖 |
|
|
503
|
+
| **Loading** | lazy 加载中 chevron 区 spinner + `aria-busy` |
|
|
504
|
+
| **Settings 菜单** | `treeDragScope: 'hierarchy'` 且 `setDataPath` 可用时,hover 显示 settings 按钮 |
|
|
505
|
+
|
|
506
|
+
#### 自定义 tree 列
|
|
507
|
+
|
|
508
|
+
```vue
|
|
509
|
+
<MagicGrid
|
|
510
|
+
tree
|
|
511
|
+
:get-data-path="getDataPath"
|
|
512
|
+
:auto-tree-column-def="{
|
|
513
|
+
headerName: '组织结构',
|
|
514
|
+
width: 240,
|
|
515
|
+
pinned: 'left',
|
|
516
|
+
}"
|
|
517
|
+
:tree-value-getter="({ data, dataPath }) => `${dataPath.join(' / ')} · ${data.name}`"
|
|
518
|
+
/>
|
|
519
|
+
```
|
|
520
|
+
|
|
521
|
+
隐藏 tree 列(仅保留层级逻辑、自行在业务列渲染缩进):
|
|
522
|
+
|
|
523
|
+
```vue
|
|
524
|
+
<MagicGrid tree :get-data-path="getDataPath" :show-tree-column="false" />
|
|
525
|
+
```
|
|
526
|
+
|
|
527
|
+
#### 键盘与无障碍
|
|
528
|
+
|
|
529
|
+
- 焦点在 tree cell 时:**Enter / Space** 切换展开/折叠。
|
|
530
|
+
- Chevron 带 `aria-expanded`;lazy loading 时 `aria-busy="true"`。
|
|
531
|
+
|
|
532
|
+
### 展开与折叠
|
|
533
|
+
|
|
534
|
+
#### 用户交互
|
|
535
|
+
|
|
536
|
+
- 点击 tree 列 **chevron** 切换**当前节点**展开/折叠。
|
|
537
|
+
- 点击 tree **列头** chevron(与行内同款图标):**全部展开** / **全部收起**;当所有可展开节点均已展开时 chevron 旋转为展开态,再次点击则 `collapseAll()`。
|
|
538
|
+
- 折叠父节点时,**子孙不出现在 `rowsToDisplay`**(非 `display: none`,而是从投影中移除,不参与虚拟化行计数)。
|
|
539
|
+
|
|
540
|
+
#### Grid API
|
|
541
|
+
|
|
542
|
+
| 方法 | 说明 |
|
|
543
|
+
|------|------|
|
|
544
|
+
| `expandNode(rowId)` | 展开节点;lazy 模式下若子行未加载会先 await `loadTreeChildren` |
|
|
545
|
+
| `collapseNode(rowId)` | 折叠节点;会 abort 该节点在途 lazy 请求 |
|
|
546
|
+
| `isNodeExpanded(rowId)` | 查询展开态 |
|
|
547
|
+
| `expandAll()` | 展开 **已加载** 子树;**不会**递归触发 lazy load(避免请求风暴) |
|
|
548
|
+
| `collapseAll()` | 折叠全部 |
|
|
549
|
+
| `getDataPath(rowId)` | 返回 `string[]` 或 `undefined` |
|
|
550
|
+
|
|
551
|
+
```ts
|
|
552
|
+
const api = gridRef.value?.api
|
|
553
|
+
api?.expandNode('eng')
|
|
554
|
+
api?.collapseNode('hq')
|
|
555
|
+
console.log(api?.isNodeExpanded('eng')) // false
|
|
556
|
+
console.log(api?.getDataPath('fe')) // ['HQ', '研发', '前端']
|
|
557
|
+
```
|
|
558
|
+
|
|
559
|
+
#### 事件 `tree-node-opened`
|
|
560
|
+
|
|
561
|
+
| 字段 | 类型 | 说明 |
|
|
562
|
+
|------|------|------|
|
|
563
|
+
| `rowId` | `BusinessRowId` | 节点 id |
|
|
564
|
+
| `expanded` | `boolean` | `true` 展开 / `false` 折叠 |
|
|
565
|
+
| `level` | `number` | `treeLevel` |
|
|
566
|
+
| `dataPath` | `string[]` | 节点路径 |
|
|
567
|
+
| `source` | `'api' \| 'ui'` | API 调用或用户点击 chevron |
|
|
568
|
+
|
|
569
|
+
### 树形懒加载
|
|
570
|
+
|
|
571
|
+
适用于 **初始仅加载根节点**、按需展开拉取子级的场景。仍为 **CSRM**(客户端行模型),**不是** SSRM 服务端分页树。
|
|
572
|
+
|
|
573
|
+
#### 启用条件
|
|
574
|
+
|
|
575
|
+
```vue
|
|
576
|
+
<MagicGrid
|
|
577
|
+
tree
|
|
578
|
+
tree-lazy-load
|
|
579
|
+
:get-data-path="getDataPath"
|
|
580
|
+
:has-tree-children="({ data }) => Boolean(data.hasChildren)"
|
|
581
|
+
:load-tree-children="loadChildren"
|
|
582
|
+
@tree-children-loading="onLoading"
|
|
583
|
+
@tree-children-loaded="onLoaded"
|
|
584
|
+
@tree-children-load-failed="onFailed"
|
|
585
|
+
/>
|
|
586
|
+
```
|
|
587
|
+
|
|
588
|
+
| 配置 | 必填 | 说明 |
|
|
589
|
+
|------|------|------|
|
|
590
|
+
| `treeLazyLoad: true` | 是 | 总闸 |
|
|
591
|
+
| `loadTreeChildren` | **是** | 未提供时 dev 警告,行为退化为 M24 全量 tree |
|
|
592
|
+
| `hasTreeChildren` | 强烈建议 | 控制 **尚未加载** 时是否显示 chevron |
|
|
593
|
+
| `getDataPath` | 是 | 与全量 tree 相同 |
|
|
594
|
+
|
|
595
|
+
#### 首次展开时序
|
|
596
|
+
|
|
597
|
+
```
|
|
598
|
+
用户点击 chevron / expandNode API
|
|
599
|
+
→ 若 loadedParentIds 已有 → 直接 map 展开
|
|
600
|
+
→ 若 inflight 已有 → 复用同一 Promise
|
|
601
|
+
→ emit treeChildrenLoading
|
|
602
|
+
→ await loadTreeChildren({ parentRowId, parentData, dataPath, treeLevel, signal })
|
|
603
|
+
→ 成功:校验路径 / rowKey 唯一 → applyTransaction({ add }) → refresh tree 阶段
|
|
604
|
+
→ emit treeChildrenLoaded → 子孙可见
|
|
605
|
+
→ 失败:emit treeChildrenLoadFailed · source 不变 · 保持折叠
|
|
606
|
+
→ Abort(折叠/destroy):丢弃 late resolve · 不污染 source
|
|
607
|
+
```
|
|
608
|
+
|
|
609
|
+
#### loadTreeChildren 实现要点
|
|
610
|
+
|
|
611
|
+
```ts
|
|
612
|
+
async function loadChildren({
|
|
613
|
+
parentRowId,
|
|
614
|
+
parentData,
|
|
615
|
+
dataPath,
|
|
616
|
+
signal,
|
|
617
|
+
}: LoadTreeChildrenParams): Promise<RowData[]> {
|
|
618
|
+
const res = await fetch(`/api/org/${parentRowId}/children`, { signal })
|
|
619
|
+
if (!res.ok) throw new Error('load failed')
|
|
620
|
+
const rows = await res.json()
|
|
621
|
+
// 每行必须能被 getDataPath 解析,且路径前缀包含 parent 的 dataPath
|
|
622
|
+
return rows
|
|
623
|
+
}
|
|
624
|
+
```
|
|
625
|
+
|
|
626
|
+
| 规则 | 说明 |
|
|
627
|
+
|------|------|
|
|
628
|
+
| **幂等** | 同一 `parentRowId` 成功加载后 **不重复请求** |
|
|
629
|
+
| **空子树** | 返回 `[]` → 标记为已加载叶节点 · chevron 消失 |
|
|
630
|
+
| **路径校验** | 子行 `getDataPath` 必须以父路径为前缀;否则 loadFailed |
|
|
631
|
+
| **AbortSignal** | 须在 `signal.aborted` 时停止;折叠父节点会 abort |
|
|
632
|
+
| **expandAll** | **不**批量触发 lazy load |
|
|
633
|
+
|
|
634
|
+
#### 懒加载事件
|
|
635
|
+
|
|
636
|
+
| 事件 | 关键字段 |
|
|
637
|
+
|------|----------|
|
|
638
|
+
| `tree-children-loading` | `parentRowId`, `dataPath`, `treeLevel`, `source` |
|
|
639
|
+
| `tree-children-loaded` | `parentRowId`, `children`, `childCount`, `source` |
|
|
640
|
+
| `tree-children-load-failed` | `parentRowId`, `reason?`, `aborted?` |
|
|
641
|
+
|
|
642
|
+
### 排序、筛选与汇总
|
|
643
|
+
|
|
644
|
+
| 操作 | 树形语义 |
|
|
645
|
+
|------|----------|
|
|
646
|
+
| **列排序** | 仅在 **同一 `parentRowId` 下兄弟** 间重排;**不改变** `dataPath` |
|
|
647
|
+
| **列筛选 / Quick Filter** | 递归匹配 data 行;某父下子孙全被滤掉 → **父节点隐藏**(空枝剪枝) |
|
|
648
|
+
| **表尾汇总** | `summaryScope: 'displayed'` 时仅聚合 **可见** data 行(含各层父节点) |
|
|
649
|
+
| **lazy 未加载分支** | 不参与 filter/sort/drag(RowNode 尚不存在) |
|
|
650
|
+
|
|
651
|
+
### 行选择与 groupSelectsChildren
|
|
652
|
+
|
|
653
|
+
树形模式下行选择配置与 flat 相同,通过 `row-selection` prop:
|
|
654
|
+
|
|
655
|
+
```vue
|
|
656
|
+
<MagicGrid
|
|
657
|
+
:row-selection="{ mode: 'multiple', groupSelectsChildren: true }"
|
|
658
|
+
/>
|
|
659
|
+
```
|
|
660
|
+
|
|
661
|
+
| `groupSelectsChildren` | 行为 |
|
|
662
|
+
|------------------------|------|
|
|
663
|
+
| **`true`(默认)** | 选中父 → 递归选中 **display 中可见** 子孙;取消父 → 递归取消 |
|
|
664
|
+
| **`false`** | 父子 checkbox **独立**;子全选时父 **indeterminate**;父选中 **不**自动选子 |
|
|
665
|
+
|
|
666
|
+
注意:
|
|
667
|
+
|
|
668
|
+
- **折叠的子孙不参与级联**(未投影到 display 的行不在选区内)。
|
|
669
|
+
- lazy 加载完成前,父选中 **不会** 预选尚未加载的子孙。
|
|
670
|
+
- 所有 **data 行**(含非叶节点)均可被选中、编辑。
|
|
671
|
+
|
|
672
|
+
### 行拖拽与层级变更
|
|
673
|
+
|
|
674
|
+
树形行拖拽需开启 **`indexColumn.showRowDragHandle: true`**(或列级 drag handle)。与 `rowDragManaged` / `rowDragCommitMode` 配合使用。
|
|
675
|
+
|
|
676
|
+
#### treeDragScope: `'siblings'`(默认)
|
|
677
|
+
|
|
678
|
+
- drop **仅限同一 `parentRowId` 下兄弟** 间换序。
|
|
679
|
+
- 跨父 drag → 禁止光标 · **不 emit** `rowMoved`。
|
|
680
|
+
- **不改变** `dataPath`;仅调整 source 平铺顺序中的兄弟区间。
|
|
681
|
+
|
|
682
|
+
#### treeDragScope: `'hierarchy'`
|
|
683
|
+
|
|
684
|
+
允许 **跨层级改挂**(改父节点),**必须**提供 `setDataPath` 写回路径:
|
|
685
|
+
|
|
686
|
+
| 操作 | 如何触发 |
|
|
687
|
+
|------|----------|
|
|
688
|
+
| **挂到目标行下(nest)** | 拖到 tree 列 **子级缩进热区**(目标行右侧),或 **按住 Alt** 再 drop |
|
|
689
|
+
| **同级换序 / 改父到根或旁支** | 拖到目标行 **同级区域**(默认 drop 区) |
|
|
690
|
+
| **上移一级 / 下移一级** | tree 列 hover **settings-2** 菜单(需 `treeHierarchyActions !== false`) |
|
|
691
|
+
|
|
692
|
+
**层级快捷菜单语义**:
|
|
693
|
+
|
|
694
|
+
| 菜单项 | 行为 |
|
|
695
|
+
|--------|------|
|
|
696
|
+
| **上移一级** | 有父节点 → outdent 到父的同级;已是根 → 将 **上一个同级节点及其子树** 挂到当前节点下 |
|
|
697
|
+
| **下移一级** | 挂到 display 中 **上一个同级节点** 的子树末尾 |
|
|
698
|
+
|
|
699
|
+
菜单项 **按节点动态过滤**——不可用时隐藏;至少一项可用时才显示 settings 按钮。
|
|
700
|
+
|
|
701
|
+
#### deferred commit 与 hierarchyChanges
|
|
702
|
+
|
|
703
|
+
`rowDragCommitMode: 'deferred'` 时,mouseup 后先 `await onRowDragCommit`,成功才写 source。
|
|
704
|
+
|
|
705
|
+
树形改挂、快捷菜单等操作常使 **`moves` 为空** 而 **`hierarchyChanges` 非空**:
|
|
706
|
+
|
|
707
|
+
```ts
|
|
708
|
+
import { getRowDragCommitHierarchy } from '@taocompany/magic-grid'
|
|
709
|
+
|
|
710
|
+
async function onRowDragCommit(context: RowDragCommitContext): Promise<boolean> {
|
|
711
|
+
// 推荐:过滤掉仅 treeLevel 变化的项,持久化 parentId + order
|
|
712
|
+
const changes = getRowDragCommitHierarchy(context, 'noLevel')
|
|
713
|
+
await api.saveHierarchy({ changes })
|
|
714
|
+
return true // false 则回滚,source 不变
|
|
715
|
+
}
|
|
716
|
+
```
|
|
717
|
+
|
|
718
|
+
`RowHierarchyChange` 含 `rowId`、`parentRowId`、`siblingIndex`、`treeLevel`、`dataPath` 等;详见 [`src/core/types/rowDrag.ts`](src/core/types/rowDrag.ts) 与 Playground T11/T12。
|
|
719
|
+
|
|
720
|
+
### 树形与其它能力叠加
|
|
721
|
+
|
|
722
|
+
| 场景 | 预期行为 |
|
|
723
|
+
|------|----------|
|
|
724
|
+
| **固定列 / 列虚拟化** | tree 列默认左固定;tree cell 仍受列窗口约束 |
|
|
725
|
+
| **行虚拟化** | 全部 display 行参与 `rowTop` 累计;百万行靠虚拟化 |
|
|
726
|
+
| **Master Detail** | detail 行紧跟 master leaf;**不参与** tree 路径与子树计数 |
|
|
727
|
+
| **合并单元格** | tree 行 **不参与** colSpan/rowSpan |
|
|
728
|
+
| **单元格编辑** | 所有 data 行可编辑(含父节点);group 模式下的 leaf 限制 **不适用** |
|
|
729
|
+
| **索引列** | 对 **全部 display 行**连续编号 |
|
|
730
|
+
| **cellComments / 框选 / 剪贴板** | 与 flat 相同,基于 display 索引 |
|
|
731
|
+
| **rowGrouping** | **互斥** · 勿双开 |
|
|
732
|
+
|
|
733
|
+
### 常见错误与排查
|
|
734
|
+
|
|
735
|
+
| 现象 | 可能原因 | 处理 |
|
|
736
|
+
|------|----------|------|
|
|
737
|
+
| 初始化 throw `tree: true requires getDataPath` | 未传 `getDataPath` | 添加回调 |
|
|
738
|
+
| refresh throw `missing parent path` | 子行路径缺父节点行 | 补全中间层或修正 path |
|
|
739
|
+
| refresh throw 重复路径 | 两行 `getDataPath` 相同 | 保证路径唯一 |
|
|
740
|
+
| 双开 tree + rowGrouping 但无分组 | 设计如此,tree 优先 | 二选一 |
|
|
741
|
+
| lazy 展开无 chevron | 未传 `hasTreeChildren` 且 source 无子行 | 提供 `hasTreeChildren` |
|
|
742
|
+
| lazy 展开无反应 | 未传 `loadTreeChildren` | 检查 dev 警告 |
|
|
743
|
+
| hierarchy drag 无效 | 未传 `setDataPath` | 实现写回或使用默认 `pathSegments` |
|
|
744
|
+
| 跨父 drag 被拒绝 | `treeDragScope: 'siblings'` | 改为 `hierarchy` |
|
|
745
|
+
| 选中父但子孙未选中 | 子孙折叠不可见,或 `groupSelectsChildren: false` | 展开 / 检查配置 |
|
|
746
|
+
| `expandAll` 未加载 lazy 子级 | 设计限制 | 逐节点 expand 或预加载 |
|
|
747
|
+
|
|
748
|
+
### Playground 与延伸阅读
|
|
749
|
+
|
|
750
|
+
- **交互验收**:本地运行 Playground,访问 **`/phase19`**(`Phase19Demo.vue`)。
|
|
751
|
+
- **数据集**:组织树全量 · 组织树 lazy · 菜单 mock(多根、深层路径)。
|
|
752
|
+
- **验收步骤 T1–T15**:见 [`playground/shared/phase19-grid.ts`](playground/shared/phase19-grid.ts) 中 `PHASE19_ACCEPTANCE_STEPS`。
|
|
753
|
+
- **设计文档**:[`docs/30-phase19-tree-table.md`](docs/30-phase19-tree-table.md)(架构、拍板记录、测试矩阵)。
|
|
754
|
+
- **Props / Events / GridApi 索引**:[Props · 树形表格](#树形表格-1) · [Events · 树形表格](#树形表格-2) · [Expose · expandNode](#展开--分组--树)。
|
|
755
|
+
|
|
756
|
+
---
|
|
757
|
+
|
|
234
758
|
## 默认配置
|
|
235
759
|
|
|
236
760
|
以下为 `<MagicGrid>` **未显式传入 prop** 时的生效值。部分 prop 在组件层与内核层默认不同(标注 **MG** = MagicGrid 组件层覆盖),使用时以组件行为为准。
|
|
@@ -372,6 +896,7 @@ const columns: ColumnDef[] = [
|
|
|
372
896
|
| `tree` | `false` | 不启用树形表格 |
|
|
373
897
|
| `showTreeColumn` | `true` | 展示 tree 系统列(启用 tree 后) |
|
|
374
898
|
| `treeDragScope` | `'siblings'` | 树拖拽仅同层兄弟 |
|
|
899
|
+
| `treeHierarchyActions` | `true` | hierarchy 模式下展示层级快捷菜单 |
|
|
375
900
|
| `treeDisplayType` | `'singleColumn'` | 单列树展示 |
|
|
376
901
|
| `treeLazyLoad` | `false` | 不启用懒加载 |
|
|
377
902
|
|
|
@@ -610,7 +1135,7 @@ interface RowSelectionConfig {
|
|
|
610
1135
|
|------|------|--------|------|
|
|
611
1136
|
| `rowDragManaged` | `boolean` | `true` | managed 行拖拽:拖拽过程中实时改 source 顺序 |
|
|
612
1137
|
| `rowDragCommitMode` | `'sync' \| 'deferred'` | `'sync'` | commit 策略:`sync` live move;`deferred` mouseup 后 await `onRowDragCommit` |
|
|
613
|
-
| `onRowDragCommit` | `RowDragCommitHandler` | — | deferred 模式:mouseup 后、apply 前调用;返回 `false` 则不写 source |
|
|
1138
|
+
| `onRowDragCommit` | `RowDragCommitHandler` | — | deferred 模式:mouseup 后、apply 前调用;返回 `false` 则不写 source。树形持久化见 context.`hierarchyChanges`(parentId + order 语义);`moves` 仅为 source 平铺下标位移 |
|
|
614
1139
|
| `getRowHeight` | `GetRowHeightFn` | — | 行级动态高度(无 DOM) |
|
|
615
1140
|
| `rowHeightMin` | `number` | — | 行高下限 px |
|
|
616
1141
|
| `rowHeightMax` | `number` | — | 行高上限 px |
|
|
@@ -655,19 +1180,23 @@ interface RowSelectionConfig {
|
|
|
655
1180
|
|
|
656
1181
|
#### 树形表格
|
|
657
1182
|
|
|
1183
|
+
> 完整消费端指南见 **[树形表格](#树形表格)** 专章(概念、懒加载、拖拽、排查)。下表为 Props 速查。
|
|
1184
|
+
|
|
658
1185
|
| Prop | 类型 | 默认值 | 说明 |
|
|
659
1186
|
|------|------|--------|------|
|
|
660
1187
|
| `tree` | `boolean` | `false` | 启用树形表格(与 `rowGrouping` 互斥) |
|
|
661
|
-
| `getDataPath` | `GetDataPathFn` | — | 树形路径回调(`tree: true`
|
|
662
|
-
| `
|
|
663
|
-
| `
|
|
664
|
-
| `
|
|
1188
|
+
| `getDataPath` | `GetDataPathFn` | — | 树形路径回调(`tree: true` 时 **必填**) |
|
|
1189
|
+
| `groupDefaultExpanded` | `number` | `-1` | 默认展开层级:`0` 全折叠 · `1` 第一层 · `-1` 全部(tree / group 共用) |
|
|
1190
|
+
| `treeDragScope` | `'siblings' \| 'hierarchy'` | `'siblings'` | 树形拖拽范围;`hierarchy` 允许跨父改挂(需 `setDataPath`) |
|
|
1191
|
+
| `setDataPath` | `SetDataPathFn` | — | `hierarchy` 模式下写回 `dataPath` 到行数据 |
|
|
1192
|
+
| `treeHierarchyActions` | `boolean` | `true` | `hierarchy` 时在 tree 列展示 **上移一级 / 下移一级** 菜单 |
|
|
1193
|
+
| `showTreeColumn` | `boolean` | `true` | 展示 tree 系统列(colId `__tree__`) |
|
|
665
1194
|
| `autoTreeColumnDef` | `Partial<ColumnDef>` | — | 覆盖 tree 系统列 colDef |
|
|
666
|
-
| `treeValueGetter` | `TreeValueGetterFn` | — | 自定义 tree
|
|
667
|
-
| `treeDisplayType` | `'singleColumn'` |
|
|
668
|
-
| `treeLazyLoad` | `boolean` | `false` |
|
|
669
|
-
| `hasTreeChildren` | `HasTreeChildrenFn` | — | lazy
|
|
670
|
-
| `loadTreeChildren` | `LoadTreeChildrenFn` | — | lazy
|
|
1195
|
+
| `treeValueGetter` | `TreeValueGetterFn` | — | 自定义 tree 列展示值(缺省为 dataPath 末段) |
|
|
1196
|
+
| `treeDisplayType` | `'singleColumn'` | `'singleColumn'` | 树节点展示列模式 |
|
|
1197
|
+
| `treeLazyLoad` | `boolean` | `false` | 启用树形懒加载(CSRM · 需 `loadTreeChildren`) |
|
|
1198
|
+
| `hasTreeChildren` | `HasTreeChildrenFn` | — | lazy:节点是否可能有未加载子行(控制 chevron) |
|
|
1199
|
+
| `loadTreeChildren` | `LoadTreeChildrenFn` | — | lazy:首次展开时拉取子数据 |
|
|
671
1200
|
|
|
672
1201
|
#### 单元格批注
|
|
673
1202
|
|
|
@@ -1837,6 +2366,8 @@ payload 为 `RowExpansionChangedEvent`:
|
|
|
1837
2366
|
|
|
1838
2367
|
### 树形表格
|
|
1839
2368
|
|
|
2369
|
+
> 事件语义、懒加载时序与排查见 **[树形表格 · 展开与折叠](#展开与折叠)**、**[树形懒加载](#树形懒加载)** 专章。
|
|
2370
|
+
|
|
1840
2371
|
#### `tree-node-opened`
|
|
1841
2372
|
|
|
1842
2373
|
| 字段 | 类型 | 说明 |
|
|
@@ -2163,17 +2694,19 @@ api.setIndexFocus(2, { mode: 'manual', syncToSelectionColumn: false }) // 仅
|
|
|
2163
2694
|
|
|
2164
2695
|
#### 展开 / 分组 / 树
|
|
2165
2696
|
|
|
2697
|
+
> tree API 详解见 **[树形表格 · 展开与折叠](#展开与折叠)**。
|
|
2698
|
+
|
|
2166
2699
|
| 方法 | 说明 |
|
|
2167
2700
|
|------|------|
|
|
2168
|
-
| `expandRow(rowId)` / `collapseRow(rowId)` |
|
|
2701
|
+
| `expandRow(rowId)` / `collapseRow(rowId)` | 展开/折叠主行(masterDetail) |
|
|
2169
2702
|
| `isRowExpanded(rowId)` | 主行是否已展开 |
|
|
2170
|
-
| `expandAll()` / `collapseAll()` |
|
|
2703
|
+
| `expandAll()` / `collapseAll()` | 全部展开/折叠(tree:expandAll 不触发 lazy load) |
|
|
2171
2704
|
| `setRowGroupColumns(colIds)` / `getRowGroupColumns()` | 分组列读写 |
|
|
2172
2705
|
| `expandGroup(groupId)` / `collapseGroup(groupId)` | 展开/折叠分组节点 |
|
|
2173
2706
|
| `isGroupExpanded(groupId)` | 分组是否已展开 |
|
|
2174
2707
|
| `expandNode(rowId)` / `collapseNode(rowId)` | 展开/折叠 tree 节点 |
|
|
2175
2708
|
| `isNodeExpanded(rowId)` | tree 节点是否已展开 |
|
|
2176
|
-
| `getDataPath(rowId)` | 查询行的 dataPath |
|
|
2709
|
+
| `getDataPath(rowId)` | 查询行的 dataPath(`string[]`) |
|
|
2177
2710
|
|
|
2178
2711
|
#### 批注 / 框选 / 空态
|
|
2179
2712
|
|
|
@@ -3373,7 +3906,7 @@ const onRowChanged = (e: RowValueChangedEvent<OrderRow, number>) => {
|
|
|
3373
3906
|
const cells: EditingCellPosition<OrderRow, unknown>[] = api.getEditingCells()
|
|
3374
3907
|
```
|
|
3375
3908
|
|
|
3376
|
-
常用导出:`GridReadyEvent`、`CellValueChangedEvent`、`RowClickedEvent`、`FilterModel`、`GridEventMap`、`GridEventHandler`、`SetIndexFocusOptions`、`ClearRowSelectionOptions`、`BusinessRowId
|
|
3909
|
+
常用导出:`GridReadyEvent`、`CellValueChangedEvent`、`RowClickedEvent`、`FilterModel`、`GridEventMap`、`GridEventHandler`、`SetIndexFocusOptions`、`ClearRowSelectionOptions`、`BusinessRowId`、树形相关 `GetDataPathFn` / `TreeNodeOpenedEvent` 等(见 [类型与校验子路径](#taocompanymagic-gridtypescore))。
|
|
3377
3910
|
|
|
3378
3911
|
### 严格模式建议
|
|
3379
3912
|
|
|
@@ -3444,6 +3977,20 @@ import type {
|
|
|
3444
3977
|
// 列设置
|
|
3445
3978
|
ColumnSettingsResetScope,
|
|
3446
3979
|
ColumnSettingsMenuIconName,
|
|
3980
|
+
// 树形表格
|
|
3981
|
+
GetDataPathFn,
|
|
3982
|
+
SetDataPathFn,
|
|
3983
|
+
TreeValueGetterFn,
|
|
3984
|
+
HasTreeChildrenFn,
|
|
3985
|
+
LoadTreeChildrenFn,
|
|
3986
|
+
TreeDragScope,
|
|
3987
|
+
TreeTableGridOptions,
|
|
3988
|
+
TreeNodeOpenedEvent,
|
|
3989
|
+
TreeChildrenLoadingEvent,
|
|
3990
|
+
TreeChildrenLoadedEvent,
|
|
3991
|
+
TreeChildrenLoadFailedEvent,
|
|
3992
|
+
TreeTableSource,
|
|
3993
|
+
TREE_COLUMN_ID,
|
|
3447
3994
|
// 插槽
|
|
3448
3995
|
StatusBarContext,
|
|
3449
3996
|
DetailRowSlotParams,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ColumnSettingsMenu.vue.d.ts","sourceRoot":"","sources":["../../../src/components/ColumnSettings/ColumnSettingsMenu.vue"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"ColumnSettingsMenu.vue.d.ts","sourceRoot":"","sources":["../../../src/components/ColumnSettings/ColumnSettingsMenu.vue"],"names":[],"mappings":";AA0LA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAA;AAUhF,KAAK,WAAW,GAAG;IACjB,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB,CAAC;AAoRF,QAAA,IAAI,QAAQ,IAAY,CAAE;AAC1B,KAAK,WAAW,GAAG,EAAE,GACnB;IAAE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,QAAQ,KAAK,GAAG,CAAA;CAAE,CAAC;AAQhD,QAAA,MAAM,UAAU;;;;;;;;kFAGd,CAAC;AACH,QAAA,MAAM,YAAY,EAAS,eAAe,CAAC,OAAO,UAAU,EAAE,WAAW,CAAC,CAAC;wBACtD,OAAO,YAAY;AAAxC,wBAAyC;AACzC,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KACV,CAAA;CACD,CAAC"}
|
|
@@ -2,11 +2,8 @@ import { ColumnSettingsMenuIconName } from './columnSettingsMenuIcons';
|
|
|
2
2
|
import { DefineComponent, ComponentOptionsMixin, PublicProps, ComponentProvideOptions } from 'vue';
|
|
3
3
|
type __VLS_Props = {
|
|
4
4
|
name: ColumnSettingsMenuIconName;
|
|
5
|
-
size?: number;
|
|
6
5
|
};
|
|
7
|
-
declare const __VLS_export: DefineComponent<__VLS_Props, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
|
|
8
|
-
size: number;
|
|
9
|
-
}, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
|
|
6
|
+
declare const __VLS_export: DefineComponent<__VLS_Props, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
|
|
10
7
|
declare const _default: typeof __VLS_export;
|
|
11
8
|
export default _default;
|
|
12
9
|
//# sourceMappingURL=ColumnSettingsMenuIcon.vue.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ColumnSettingsMenuIcon.vue.d.ts","sourceRoot":"","sources":["../../../src/components/ColumnSettings/ColumnSettingsMenuIcon.vue"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"ColumnSettingsMenuIcon.vue.d.ts","sourceRoot":"","sources":["../../../src/components/ColumnSettings/ColumnSettingsMenuIcon.vue"],"names":[],"mappings":";AAwCA,OAAO,EAEL,KAAK,0BAA0B,EAChC,MAAM,2BAA2B,CAAA;AAElC,KAAK,WAAW,GAAG;IACjB,IAAI,EAAE,0BAA0B,CAAA;CACjC,CAAC;AAoDF,QAAA,MAAM,YAAY,kSAEhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
|