@done-coding/admin-core 0.22.2 → 0.22.3-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/es/components/data-view/DataGridView.vue.mjs +7 -0
- package/es/components/data-view/DataGridView.vue2.mjs +448 -0
- package/es/components/data-view/DataListView.vue.mjs +1 -1
- package/es/components/data-view/DataListView.vue2.mjs +6 -62
- package/es/components/data-view/InfiniteListView.vue.mjs +7 -0
- package/es/components/data-view/InfiniteListView.vue2.mjs +205 -0
- package/es/components/data-view/use-data-view-field-map.mjs +70 -0
- package/es/components/data-view/use-pull-refresh.mjs +38 -0
- package/es/components/data-view/utils.mjs +21 -1
- package/es/components/list-layout/ListLayout.vue.mjs +1 -1
- package/es/components/list-layout/ListLayout.vue2.mjs +48 -8
- package/es/index.mjs +92 -82
- package/es/style.css +199 -97
- package/package.json +5 -2
- package/src/components/data-view/README.md +34 -8
- package/src/components/data-view/docs/README-DataGridView.md +139 -0
- package/src/components/data-view/docs/README-InfiniteListView.md +105 -0
- package/types/components/data-view/DataGridView.vue.d.ts +40 -0
- package/types/components/data-view/DataListView.vue.d.ts +1 -2
- package/types/components/data-view/InfiniteListView.vue.d.ts +30 -0
- package/types/components/data-view/index.d.ts +9 -3
- package/types/components/data-view/types.d.ts +125 -1
- package/types/components/data-view/use-data-view-field-map.d.ts +24 -0
- package/types/components/data-view/use-pull-refresh.d.ts +20 -0
- package/types/components/data-view/utils.d.ts +13 -1
- package/types/components/list-layout/ListLayout.vue.d.ts +4 -0
- package/types/components/list-layout/types.d.ts +16 -0
- package/types/components/table/index.d.ts +11 -1
- package/types/index.d.ts +2 -0
- package/types/injectInfo.json.d.ts +1 -1
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# DataGridView(网格数据容器)
|
|
2
|
+
|
|
3
|
+
> 对齐 TableMain 主 props 的**网格数据容器**:自持**存量累加**状态机(api + query + fetchNextPage + hasMore),内部复用 InfiniteListView(按 `gridColumns` chunk 行虚拟化)+ TableToolbar(存量上下文)+ 列配置驱动卡片渲染。
|
|
4
|
+
> 走「数据存量 + 虚拟列表」路径,**非分页**——无分页器,到底提示"我是有底线的"。
|
|
5
|
+
> 范式页:`apps/reference/src/pages/data-view/grid/`
|
|
6
|
+
> 类型:data-view 族公共组件(进 core 顶层 export);**推荐经 `ListLayout` 门面使用**(`viewMode="grid"`),独立使用需自配上下文(与 TableMain 独立使用成本相同)
|
|
7
|
+
|
|
8
|
+
## 定位
|
|
9
|
+
|
|
10
|
+
- **何时用**:数据量大、需要滚动到底加载更多 + 卡片网格形态的列表页;经 `ListLayout` `viewMode="grid"` 接入
|
|
11
|
+
- **何时不用**:标准表格/分页用 `TableMain`(`viewMode="table"`);仅当前页卡片渲染用 `TableMain` + `customView`(`DataListView`)
|
|
12
|
+
- **数据路径与 TableMain 不同构**:TableMain = 分页替换当前页;DataGridView = **存量累加**(滚动到底 append 下一页,直到 hasMore=false)。两者是两套数据状态机,故**不共存于同一组件内**——切换在 `ListLayout` 的 `viewMode` 层
|
|
13
|
+
- 泛型三参:`T` 行 / `SQ` 静态查询参数 / `F` 注入对象类型;`query` 变化时清空存量从第 1 页重新累加
|
|
14
|
+
- 内部结构:数据容器(本组件)→ InfiniteListView(IO 哨兵触发 + 虚拟化 + 底部三态)→ gridColumns 卡片网格
|
|
15
|
+
|
|
16
|
+
## 快速上手(最小可用)
|
|
17
|
+
|
|
18
|
+
经 `ListLayout` 门面(`apps/reference/src/pages/data-view/grid/`):
|
|
19
|
+
|
|
20
|
+
```vue
|
|
21
|
+
<ListLayout
|
|
22
|
+
v-model:view-mode="viewMode"
|
|
23
|
+
:list="searchItems"
|
|
24
|
+
:api="api"
|
|
25
|
+
:columns="columns"
|
|
26
|
+
row-key="id"
|
|
27
|
+
:grid-columns="4"
|
|
28
|
+
>
|
|
29
|
+
<template #custom-view-item="{ row, index }">
|
|
30
|
+
<div class="card">{{ index + 1 }}. {{ row.name }}</div>
|
|
31
|
+
</template>
|
|
32
|
+
</ListLayout>
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
直接使用(对齐 TableMain 三必传):
|
|
36
|
+
|
|
37
|
+
```vue
|
|
38
|
+
<DataGridView
|
|
39
|
+
ref="gridRef"
|
|
40
|
+
:api="api"
|
|
41
|
+
:columns="columns"
|
|
42
|
+
row-key="id"
|
|
43
|
+
:page-size-init="20"
|
|
44
|
+
:grid-columns="4"
|
|
45
|
+
>
|
|
46
|
+
<template #custom-view-item="{ row, index }"> ... </template>
|
|
47
|
+
</DataGridView>
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
**要点**:
|
|
51
|
+
|
|
52
|
+
- 三必传 `api` / `columns` / `rowKey`;`api` 收到 `query` 深合并 `page.page/page.pageSize`(键名 `APP_API_LIST_MODEL_KEY_CONFIG` 单源),返回 `TableApiResult<T>` 的 `items` + `page.totalRecord`;`hasMore` 由 `total` 与已累加量比较
|
|
53
|
+
- **每批** `pageSizeInit`(默认 20)条,滚动到底自动 append 下一页;`finished`(hasMore=false)底部显示"我是有底线的"
|
|
54
|
+
- 出错 → 底部错误原因 + 「点击重试」手动重发
|
|
55
|
+
- `#custom-view-item` 缺省时基于 `columns` 渲染朴素卡片(每列一行 `label: value`,render 走 `render`、非 render 走 `row[prop]`)——**只传 columns 即开箱出卡片**,插槽可覆盖
|
|
56
|
+
- keepAlive 返回刷新由 core 内置承担(onActivated 清空重拉)——[MUST NOT] app 侧再手写刷新信号
|
|
57
|
+
|
|
58
|
+
## 能力边界 / 按需使用
|
|
59
|
+
|
|
60
|
+
- **默认即够用:存量累加 + 滚动加载 + 错误重试 + 到底提示 + 虚拟化 + 工具栏 + refine 布局全开**——只传 `api`/`columns`/`rowKey` 即得标准网格页。
|
|
61
|
+
- **高度链三选一(同 TableMain 判据)**:`refine` 默认开;`maxHeight` 显式定高仅嵌定高容器时;`viewportHeight` 仅嵌套弹层消费外层 scope 时。
|
|
62
|
+
- **`maxHeight` 默认 `"100vh"`(满视口高)**:非 refine 且外部未显式传时兜底限高,容器内部滚动、杜绝无限顶开;数字 = px,字符串 = CSS 长度("50vh" 等),外部认为有更合适的值直接显式传入覆盖。
|
|
63
|
+
- `fillHeight`:默认关;数据稀疏/为空时撑满、底部状态贴底时开。
|
|
64
|
+
- `gridColumns`:**定列数**等宽网格(默认 4),卡片自动填满格子(`repeat(gridColumns, 1fr)`);消费方在 `#custom-view-item` 里只管卡片**内容**,宽度不用设。传**对象**则走 el-col span 制断点配置(24 栅格,对齐 FormSearch layout 心智):`{ xs: 24, sm: 12, md: 8, lg: 6, xl: 4 }` = 1/2/3/4/6 列(列数 = 24 / span),未配断点回落 ≤ 当前断点最近一档。
|
|
65
|
+
- `pageSizeInit`:每批加载条数(对齐 TableMain 的 pageSizeInit"初始一次设置"机制,默认 20);**批次固定,运行期不改**。
|
|
66
|
+
- `infiniteListProps`:InfiniteListView 配置透传(`distance` / `endText` / `errorText` / `pullRefresh` / `estimateSize` / `overscan` 等)。
|
|
67
|
+
- `skeleton`:默认开(冷启网格卡片骨架)。
|
|
68
|
+
- **空态双态**:非加载态空数据按 `api` 是否至少被调用过一次区分——从未调用(`initialSearch=false` 首屏)→「欢迎触发查询」;已调用无数据 → ElEmpty「暂无数据」。
|
|
69
|
+
- **激活刷新条件化**:`onActivated` 自动刷新仅「已发生过查询」后生效(`hasRequested` 自判),与 TableMain 同语义。
|
|
70
|
+
- **完整能力演示**:`apps/reference/src/pages/data-view/grid/`。
|
|
71
|
+
|
|
72
|
+
## API
|
|
73
|
+
> ⚠️ API 以 types.ts 与组件源码为真相源;与文档冲突时以源码为准。
|
|
74
|
+
|
|
75
|
+
### Props(泛型 `T` 行 / `SQ` 静态 / `F` 注入)
|
|
76
|
+
|
|
77
|
+
| name | type | 默认 | 语义 |
|
|
78
|
+
| --- | --- | --- | --- |
|
|
79
|
+
| `api` | `(params: TableApiParams<SQ>) => Promise<TableApiResult<T>>`(必传) | — | 列表请求;params = query 深合并 page.page/page.pageSize(键名 APP_API_LIST_MODEL_KEY_CONFIG 定) |
|
|
80
|
+
| `columns` | `ElTableColumnProps<T,F>[]`(必传) | — | 列配置数组(驱动默认卡片渲染) |
|
|
81
|
+
| `rowKey` | `Extract<keyof T,string> \| ((row:T)=>string)`(必传) | — | 行/卡唯一键 |
|
|
82
|
+
| `query` | `SQ` | — | 静态查询参数;变化时清空存量从第 1 页重新累加 |
|
|
83
|
+
| `pageSizeInit` | `number` | `20` | 每批加载条数(批次固定,运行期不改) |
|
|
84
|
+
| `gridColumns` | `number \| Partial<Record<Breakpoint, number>>` | `4` | 定列数(`repeat(N, 1fr)`);对象 = el-col span 制断点配置(24 栅格,列数 = 24 / span,未配档回落更小档) |
|
|
85
|
+
| `maxHeight` | `number \| string` | `"100vh"` | 数据区最大高度;数字 px / 字符串 CSS 长度;默认满视口高(非 refine 兜底限高) |
|
|
86
|
+
| `refine` | `boolean` | `true` | 精细化布局:无 maxHeight 时按 viewport 高减工具栏/底部得出数据区高 |
|
|
87
|
+
| `refineReduceHeight` | `number` | `0` | refine 模式预留高度减量 |
|
|
88
|
+
| `viewportHeight` | `number` | — | 显式指定视口可用高(优先级最高);缺省走 SCOPE_VIEWPORT_MAX_HEIGHT scope 链 + fallback 0(500 floor 兜底) |
|
|
89
|
+
| `parentChannel` | `string` | — | 定向消费的祖先 scope 标识;setup 期快照 |
|
|
90
|
+
| `fillHeight` | `boolean` | `false` | 数据滚动区 min-height 撑满可用高、底部状态贴底 |
|
|
91
|
+
| `dataViewMaxHeightMinValue` | `number` | `500` | 数据视口最大高最小值 floor 兜底 |
|
|
92
|
+
| `injectInfo` | `F` | — | 注入列作用域/卡片作用域的额外对象 |
|
|
93
|
+
| `skeleton` | `boolean` | `true` | 冷启(首次无数据)网格卡片骨架 |
|
|
94
|
+
| `skeletonRows` | `number` | 自适应 | 骨架卡片数 |
|
|
95
|
+
| `initialSearch` | `boolean` | `true` | 挂载后是否立即触发初始化查询;false 时挂载不自动拉数(欢迎空态) |
|
|
96
|
+
| `showToolbar` | `boolean` | `true` | toolbar 顶层开关 |
|
|
97
|
+
| `toolbar` | `TableToolbarConfig<T,SQ,F>` | — | toolbar 配置(按钮 / 刷新 / 自动刷新 / 导出) |
|
|
98
|
+
| `infiniteListProps` | `InfiniteListViewConfig` | — | InfiniteListView 配置透传(distance/endText/errorText/pullRefresh/estimateSize/overscan) |
|
|
99
|
+
|
|
100
|
+
**v-model**:`isAutoRefresh`(boolean)、`refreshInterval`(number,秒)。
|
|
101
|
+
|
|
102
|
+
### Emits
|
|
103
|
+
|
|
104
|
+
| 事件 | 载荷 | 语义 |
|
|
105
|
+
| --- | --- | --- |
|
|
106
|
+
| `pageChange` | `number` | **拉取下一页时触发**(载荷 = 新页码) |
|
|
107
|
+
| `dataChange` | `T[]` | 存量数组变更 |
|
|
108
|
+
| `loadingChange` | `boolean` | 加载态变化 |
|
|
109
|
+
| `pageInfoChange` | `TablePageInfo` | 存量信息:`{pageSize, currentPage, total}`——**`currentPage` = 当前已最大拉取到第几页**(非"第几页数据");复用 TableMain 形状,ListLayout 转发零改动 |
|
|
110
|
+
| `pageSizeChange` | — | **不触发**(批次大小固定,运行期不改) |
|
|
111
|
+
|
|
112
|
+
### Slots
|
|
113
|
+
|
|
114
|
+
| 槽 | scope | 语义 |
|
|
115
|
+
| --- | --- | --- |
|
|
116
|
+
| `#custom-view-item` | `DataListViewItemScope<T>`:`{fieldComponentMap, row, index, selected, toggleSelect}` | 网格卡片渲染;**缺省基于 columns 渲染朴素卡片**(每列 `label: value`,render 走 render / 非 render 走 `row[prop]`,`$type_selection` 勾选 / `$type_index` 序号) |
|
|
117
|
+
| `empty`(内部默认) | 无 | 空数据——默认按 `hasRequested` 双态(未调用过 api → 欢迎触发查询;已调用无数据 → ElEmpty「暂无数据」) |
|
|
118
|
+
|
|
119
|
+
### Expose(`DataGridViewInstance`)
|
|
120
|
+
|
|
121
|
+
`refresh(silent?: boolean): Promise<unknown>`(清空存量重拉第 1 页)、`reload(silent?: boolean): Promise<unknown>`(回第 1 页重拉,同 refresh)、`getTableInstance(): TableInstance | undefined`(虚拟网格实例——选中/滚动能力对齐 TableInstance 子集,未实现方法为「not supported」抛错桩)。
|
|
122
|
+
|
|
123
|
+
## 反模式 / 注意
|
|
124
|
+
|
|
125
|
+
- **非分页形态**:[MUST NOT] 期待分页器 / 页码跳转;数据到底即停,无"下一页"按钮
|
|
126
|
+
- **批次固定**:`pageSizeInit` 运行期不改;`pageSizeChange` 不触发
|
|
127
|
+
- **`currentPage` 语义**:`pageInfoChange` 的 `currentPage` = 已拉最大页,消费方勿当"当前展示第几页"
|
|
128
|
+
- **动态切换**:`viewMode` 换载(v-if)天然回到第 1 页重新累加;「翻到底再切网格续拉断点」不在支持范围
|
|
129
|
+
- **独立使用成本**:不传 `toolbar`/搜索区时只有网格本体;完整列表页 [MUST] 走 `ListLayout`(搜索/头部/操作/粘性共享)
|
|
130
|
+
- **列插槽无 `#<column.prop>`**:网格卡片是"一卡多列"形态,非表格"一列一格";卡片渲染走 `#custom-view-item` 或默认 column 配置
|
|
131
|
+
|
|
132
|
+
## 关联
|
|
133
|
+
|
|
134
|
+
- 门面:`ListLayout`(`viewMode="grid"`;`viewMode="table"` 渲染 TableMain,内部 customView 切 ElTable/DataListView)
|
|
135
|
+
- 底座:`InfiniteListView`(内部复用:IO 哨兵 + 虚拟化 + 底部三态)
|
|
136
|
+
- 共享 hook:`useDataViewFieldMap`(列 → 稳定字段组件,与 DataListView 同源)
|
|
137
|
+
- 工具栏:`TableToolbar`(table 族内部件,经 `toolbar` prop 配置)
|
|
138
|
+
- 列表接口模型:`APP_API_LIST_MODEL_KEY_CONFIG`(core config 单源)
|
|
139
|
+
- 范式页:`apps/reference/src/pages/data-view/grid/`
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# InfiniteListView(通用无限滚动容器)
|
|
2
|
+
|
|
3
|
+
> 受控无限滚动 + 虚拟列表容器:**不自持数据获取**——接收存量数据 + 加载状态,滚动到底触发 `load-more`,底部按状态渲染(加载中 / 错误+手动重试 / 到底提示)。
|
|
4
|
+
> 通用原语:不依赖 table / list-layout 语境,任何「存量 + 无限滚动 + 虚拟列表」场景独立使用(纯列表流、聊天流、网格底座等)。
|
|
5
|
+
> 范式页:`apps/reference/src/pages/data-view/grid/`(经 DataGridView 组装的网格形态)
|
|
6
|
+
> 类型:data-view 族公共组件(进 core 顶层 export)
|
|
7
|
+
|
|
8
|
+
## 定位
|
|
9
|
+
|
|
10
|
+
- **何时用**:需要「数据存量 + 滚动到底加载 + 虚拟列表渲染」的列表/流式场景;作为 `DataGridView` 的网格渲染底座
|
|
11
|
+
- **何时不用**:分页形态用 `TableMain`;仅当前页数据渲染用 `DataListView`
|
|
12
|
+
- **受控组件**:`data`(存量)与 `loading / loadingMore / error / finished`(状态)均由外部传入;滚动到底发 `load-more`,错误点击发 `retry`,下拉刷新发 `refresh`——**数据状态机由外部(通常是数据容器)持有,本组件只管滚动触发 + 状态展示 + 虚拟化**
|
|
13
|
+
- 泛型 `<T>`:行/项数据类型
|
|
14
|
+
- 虚拟化:`@tanstack/vue-virtual` 单轴虚拟化(动态高经 measureElement 自动测量),只渲染可见项
|
|
15
|
+
|
|
16
|
+
## 快速上手(最小可用)
|
|
17
|
+
|
|
18
|
+
```vue
|
|
19
|
+
<InfiniteListView
|
|
20
|
+
:data="store"
|
|
21
|
+
item-key="id"
|
|
22
|
+
:loading="loading"
|
|
23
|
+
:loading-more="loadingMore"
|
|
24
|
+
:error="error"
|
|
25
|
+
:finished="finished"
|
|
26
|
+
@load-more="fetchNextPage"
|
|
27
|
+
@retry="fetchNextPage"
|
|
28
|
+
>
|
|
29
|
+
<template #item="{ item, index }">
|
|
30
|
+
<div>{{ index }}: {{ item.name }}</div>
|
|
31
|
+
</template>
|
|
32
|
+
</InfiniteListView>
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
**要点**:
|
|
36
|
+
|
|
37
|
+
- `data` / `itemKey` 必传;滚动到底(哨兵进入视口)且非 loading/loadingMore/error/finished 时发 `load-more`
|
|
38
|
+
- 错误态底部显示 `error` 内容 + 「点击重试」→ 发 `retry`;`finished` 时底部显示 `endText`(默认"我是有底线的")
|
|
39
|
+
- `#item` 缺省时兜底渲染 `JSON.stringify(item, null, 2)`——**仅调试兜底,生产必传 `#item`**
|
|
40
|
+
|
|
41
|
+
## 能力边界 / 按需使用
|
|
42
|
+
|
|
43
|
+
- **默认即够用:滚动触发 + 底部三态(加载/错误重试/到底)+ 虚拟化全内置**——只传 `data` / `itemKey` / 状态 + 监听 `load-more` 即得无限滚动列表。
|
|
44
|
+
- `estimateSize`:默认 200px 预估行高,虚拟化按实际测量自动校准;项高差异大时可调小/调大优化滚动条精度。
|
|
45
|
+
- `maxHeight`:默认 `undefined`(自然高度,撑开父容器);限高滚动时传容器最大高(内部 `overflowY: auto`)。
|
|
46
|
+
- `pullRefresh`:默认关;开启后支持触摸下拉刷新(touch 三事件 + 顶部刷入指示器)→ 发 `refresh`。桌面 Web 常规用外部刷新按钮/自动刷新,[MUST NOT] 依赖手势。
|
|
47
|
+
- `#error` / `#end` / `#loading-more` 插槽可覆写底部各态默认渲染。
|
|
48
|
+
- `#empty`:`data` 为空时显示(默认 `<el-empty />`)。
|
|
49
|
+
|
|
50
|
+
## API
|
|
51
|
+
> ⚠️ API 以 types.ts 与组件源码为真相源;与文档冲突时以源码为准。
|
|
52
|
+
|
|
53
|
+
### Props(泛型 `T` 行/项)
|
|
54
|
+
|
|
55
|
+
| name | type | 默认 | 语义 |
|
|
56
|
+
| --- | --- | --- | --- |
|
|
57
|
+
| `data` | `T[]`(必传) | — | 存量数据(累加结果,外部持有) |
|
|
58
|
+
| `itemKey` | `Extract<keyof T,string> \| ((item:T)=>string)`(必传) | — | 虚拟项唯一键 |
|
|
59
|
+
| `loading` | `boolean` | `false` | 首次加载中(底部显示加载占位) |
|
|
60
|
+
| `loadingMore` | `boolean` | `false` | 加载更多中(底部显示加载占位,禁止重复触发) |
|
|
61
|
+
| `error` | `Error \| string \| null` | `null` | 错误信息;非空时底部显示错误 + 重试(发 `retry`,手动点击才重新加载) |
|
|
62
|
+
| `finished` | `boolean` | `false` | 是否到底(hasMore=false);true 时底部显示 `endText` |
|
|
63
|
+
| `loadMoreDistance` | `number` | `100` | 哨兵提前量(px):距容器底部此距离内即触发 `load-more` |
|
|
64
|
+
| `endText` | `string` | `"我是有底线的"` | 到底提示文案 |
|
|
65
|
+
| `errorText` | `string` | `"加载失败,点击重试"` | 错误重试文案 |
|
|
66
|
+
| `estimateSize` | `number` | `200` | 虚拟项预估高(px),按实际测量自动校准 |
|
|
67
|
+
| `overscan` | `number` | `5` | 视口外预渲染项数(防快速滚动白屏) |
|
|
68
|
+
| `maxHeight` | `number` | `undefined` | 传入时容器限高滚动(内部 `overflowY: auto`) |
|
|
69
|
+
| `pullRefresh` | `boolean` | `false` | opt-in 触摸下拉刷新(默认关;开启后 touch 手势触发 `refresh`) |
|
|
70
|
+
|
|
71
|
+
### Emits
|
|
72
|
+
|
|
73
|
+
| 事件 | 载荷 | 语义 |
|
|
74
|
+
| --- | --- | --- |
|
|
75
|
+
| `load-more` | 无 | 滚动到底(哨兵进入视口)且非 loading/loadingMore/error/finished 时触发 |
|
|
76
|
+
| `retry` | 无 | 底部错误「点击重试」触发 |
|
|
77
|
+
| `refresh` | 无 | 下拉刷新触发(仅 `pullRefresh` 开启时) |
|
|
78
|
+
|
|
79
|
+
### Slots
|
|
80
|
+
|
|
81
|
+
| 槽 | scope | 语义 |
|
|
82
|
+
| --- | --- | --- |
|
|
83
|
+
| `#item` | `{ item: T, index: number }` | 单项渲染;缺省兜底 `JSON.stringify(item, null, 2)`(**仅调试用,生产必传**) |
|
|
84
|
+
| `#error` | `{ error: Error \| string \| null, retry: () => void }` | 底部错误态(默认:errorText + 重试按钮) |
|
|
85
|
+
| `#end` | 无 | 底部到底提示(默认:`endText`) |
|
|
86
|
+
| `#loading-more` | 无 | 加载中占位(默认:loading 文案 + 图标) |
|
|
87
|
+
| `#empty` | 无 | 空数据(默认 `<el-empty />`) |
|
|
88
|
+
|
|
89
|
+
### Expose
|
|
90
|
+
|
|
91
|
+
`scrollTo(index: number)`(滚动到第 index 项)、`reset()`(重置:清虚拟缓存 + 回顶)。
|
|
92
|
+
|
|
93
|
+
## 反模式 / 注意
|
|
94
|
+
|
|
95
|
+
- **受控组件不自持数据**:`data` / 状态均由外部传入,[MUST NOT] 期待组件内部取数;数据累加 / hasMore 判断是**数据容器**(如 DataGridView)的职责
|
|
96
|
+
- **`#item` 缺省 JSON 是调试兜底**:生产 [MUST] 传 `#item`;JSON 兜底 [MUST NOT] 当正经渲染
|
|
97
|
+
- **`pullRefresh` 默认关**:桌面 Web 无手势语境,[MUST NOT] 依赖下拉刷新手势;用刷新按钮/自动刷新
|
|
98
|
+
- **触发防抖**:`load-more` 在 loading/loadingMore/error/finished 任一态下不触发——外部 [MUST] 及时置 loading/loadingMore 防重复请求
|
|
99
|
+
|
|
100
|
+
## 关联
|
|
101
|
+
|
|
102
|
+
- 数据容器:`DataGridView`(内部按 gridColumns chunk 行后喂本组件)
|
|
103
|
+
- 宿主容器:`TableMain`(分页容器,内部衍生品 `DataListView` 渲染当前页)
|
|
104
|
+
- 共享 hook:`useDataViewFieldMap`(列 → 稳定字段组件)
|
|
105
|
+
- 范式页:`apps/reference/src/pages/data-view/grid/`
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { TableMainInstance, TablePageInfo } from '../table';
|
|
2
|
+
import { DataGridViewProps } from './types';
|
|
3
|
+
declare const _default: <T extends Record<string, any>, SQ extends Record<string, any>, F extends Record<string, any>>(__VLS_props: NonNullable<Awaited<typeof __VLS_setup>>["props"], __VLS_ctx?: __VLS_PrettifyLocal<Pick<NonNullable<Awaited<typeof __VLS_setup>>, "attrs" | "emit" | "slots">>, __VLS_expose?: NonNullable<Awaited<typeof __VLS_setup>>["expose"], __VLS_setup?: Promise<{
|
|
4
|
+
props: __VLS_PrettifyLocal<Pick<Partial<{}> & Omit<{
|
|
5
|
+
readonly "onUpdate:isAutoRefresh"?: ((value: boolean) => any) | undefined;
|
|
6
|
+
readonly onLoadingChange?: ((value: boolean) => any) | undefined;
|
|
7
|
+
readonly "onUpdate:refreshInterval"?: ((value: number) => any) | undefined;
|
|
8
|
+
readonly onPageChange?: ((page: number) => any) | undefined;
|
|
9
|
+
readonly onPageSizeChange?: ((page: number) => any) | undefined;
|
|
10
|
+
readonly onDataChange?: ((payload: T[]) => any) | undefined;
|
|
11
|
+
readonly onPageInfoChange?: ((info: TablePageInfo) => any) | undefined;
|
|
12
|
+
readonly onSelectionChange?: ((payload: T[]) => any) | undefined;
|
|
13
|
+
} & import('vue').VNodeProps & import('vue').AllowedComponentProps & import('vue').ComponentCustomProps, never>, "onUpdate:isAutoRefresh" | "onLoadingChange" | "onUpdate:refreshInterval" | "onPageChange" | "onPageSizeChange" | "onDataChange" | "onPageInfoChange" | "onSelectionChange"> & ({
|
|
14
|
+
isAutoRefresh?: boolean;
|
|
15
|
+
refreshInterval?: number;
|
|
16
|
+
} & DataGridViewProps<T, SQ, F>) & Partial<{}>> & import('vue').PublicProps;
|
|
17
|
+
expose(exposed: import('vue').ShallowUnwrapRef<TableMainInstance>): void;
|
|
18
|
+
attrs: any;
|
|
19
|
+
slots: {
|
|
20
|
+
'custom-view-item'?(_: {
|
|
21
|
+
fieldComponentMap: Record<string, import('vue').Component>;
|
|
22
|
+
row: T;
|
|
23
|
+
index: number;
|
|
24
|
+
selected: boolean;
|
|
25
|
+
toggleSelect: () => void;
|
|
26
|
+
}): any;
|
|
27
|
+
};
|
|
28
|
+
emit: {
|
|
29
|
+
(e: "pageChange" | "pageSizeChange", page: number): void;
|
|
30
|
+
(e: "dataChange" | "selectionChange", payload: T[]): void;
|
|
31
|
+
(e: "loadingChange", value: boolean): void;
|
|
32
|
+
(e: "pageInfoChange", info: TablePageInfo): void;
|
|
33
|
+
} & (((evt: "update:isAutoRefresh", value: boolean) => void) & ((evt: "update:refreshInterval", value: number) => void));
|
|
34
|
+
}>) => import('vue').VNode & {
|
|
35
|
+
__ctx?: Awaited<typeof __VLS_setup>;
|
|
36
|
+
};
|
|
37
|
+
export default _default;
|
|
38
|
+
type __VLS_PrettifyLocal<T> = {
|
|
39
|
+
[K in keyof T]: T[K];
|
|
40
|
+
} & {};
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { Component } from 'vue';
|
|
2
1
|
import { DataListViewProps } from './types';
|
|
3
2
|
declare const _default: <T extends Record<string, any>, F extends Record<string, any>>(__VLS_props: NonNullable<Awaited<typeof __VLS_setup>>["props"], __VLS_ctx?: __VLS_PrettifyLocal<Pick<NonNullable<Awaited<typeof __VLS_setup>>, "attrs" | "emit" | "slots">>, __VLS_expose?: NonNullable<Awaited<typeof __VLS_setup>>["expose"], __VLS_setup?: Promise<{
|
|
4
3
|
props: __VLS_PrettifyLocal<Pick<Partial<{}> & Omit<{
|
|
@@ -8,7 +7,7 @@ declare const _default: <T extends Record<string, any>, F extends Record<string,
|
|
|
8
7
|
attrs: any;
|
|
9
8
|
slots: {
|
|
10
9
|
item?(_: {
|
|
11
|
-
fieldComponentMap: Record<string, Component>;
|
|
10
|
+
fieldComponentMap: Record<string, import('vue').Component>;
|
|
12
11
|
row: T;
|
|
13
12
|
index: number;
|
|
14
13
|
selected: boolean;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { InfiniteListViewInstance, InfiniteListViewProps } from './types';
|
|
2
|
+
declare const _default: <T extends Record<string, any>>(__VLS_props: NonNullable<Awaited<typeof __VLS_setup>>["props"], __VLS_ctx?: __VLS_PrettifyLocal<Pick<NonNullable<Awaited<typeof __VLS_setup>>, "attrs" | "emit" | "slots">>, __VLS_expose?: NonNullable<Awaited<typeof __VLS_setup>>["expose"], __VLS_setup?: Promise<{
|
|
3
|
+
props: __VLS_PrettifyLocal<Pick<Partial<{}> & Omit<{
|
|
4
|
+
readonly onRefresh?: (() => any) | undefined;
|
|
5
|
+
readonly onLoadMore?: (() => any) | undefined;
|
|
6
|
+
readonly onRetry?: (() => any) | undefined;
|
|
7
|
+
} & import('vue').VNodeProps & import('vue').AllowedComponentProps & import('vue').ComponentCustomProps, never>, "onRefresh" | "onLoadMore" | "onRetry"> & InfiniteListViewProps<T> & Partial<{}>> & import('vue').PublicProps;
|
|
8
|
+
expose(exposed: import('vue').ShallowUnwrapRef<InfiniteListViewInstance>): void;
|
|
9
|
+
attrs: any;
|
|
10
|
+
slots: {
|
|
11
|
+
item?(_: {
|
|
12
|
+
item: T;
|
|
13
|
+
index: number;
|
|
14
|
+
}): any;
|
|
15
|
+
'loading-more'?(_: {}): any;
|
|
16
|
+
error?(_: {
|
|
17
|
+
error: string | Error;
|
|
18
|
+
retry: () => void;
|
|
19
|
+
}): any;
|
|
20
|
+
end?(_: {}): any;
|
|
21
|
+
empty?(_: {}): any;
|
|
22
|
+
};
|
|
23
|
+
emit: (e: "loadMore" | "retry" | "refresh") => void;
|
|
24
|
+
}>) => import('vue').VNode & {
|
|
25
|
+
__ctx?: Awaited<typeof __VLS_setup>;
|
|
26
|
+
};
|
|
27
|
+
export default _default;
|
|
28
|
+
type __VLS_PrettifyLocal<T> = {
|
|
29
|
+
[K in keyof T]: T[K];
|
|
30
|
+
} & {};
|
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
import { default as DataListView } from './DataListView.vue';
|
|
2
2
|
import { default as DataListViewItem } from './DataListViewItem.vue';
|
|
3
|
+
import { default as InfiniteListView } from './InfiniteListView.vue';
|
|
4
|
+
import { default as DataGridView } from './DataGridView.vue';
|
|
3
5
|
export * from './types';
|
|
6
|
+
export { resolveGridColumnsByBreakpoint } from './utils';
|
|
4
7
|
/**
|
|
5
|
-
* data-view
|
|
6
|
-
*
|
|
8
|
+
* data-view 数据视图族 index
|
|
9
|
+
* ---
|
|
10
|
+
* 公共组件(进 core 顶层 export):InfiniteListView / DataGridView(由 core 顶层
|
|
11
|
+
* index.ts 具名 re-export,[MUST NOT] `export *` 整个族——会漏出内部衍生品)。
|
|
12
|
+
* 内部衍生品(仅本族/table 内部 import,[MUST NOT] 对外导出):DataListView / DataListViewItem。
|
|
7
13
|
*/
|
|
8
|
-
export { DataListView, DataListViewItem };
|
|
14
|
+
export { DataListView, DataListViewItem, InfiniteListView, DataGridView };
|
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
import { Component } from 'vue';
|
|
2
|
-
import {
|
|
2
|
+
import { Breakpoint } from '../../hooks';
|
|
3
|
+
import { ElTableColumnProps, TableApiParams, TableApiResult, TableColumnDefaultScope, TableInstance, TablePageInfo, TableToolbarConfig } from '../table';
|
|
4
|
+
/**
|
|
5
|
+
* 网格断点列数配置(el-col span 制 24 栅格,对齐 FormSearch layout 心智)
|
|
6
|
+
* ---
|
|
7
|
+
* 值 = 当前断点下的 span(24 栅格,值大 = 列少):
|
|
8
|
+
* `{ xs: 24, sm: 12, md: 12, lg: 8, xl: 6 }` → 1 / 2 / 2 / 3 / 4 列。
|
|
9
|
+
* 未配置的断点回落 ≤ 当前断点最近一档(el-col 心智),全无则用全局 span。
|
|
10
|
+
*/
|
|
11
|
+
export type GridColumnsConfig = Partial<Record<Breakpoint, number>>;
|
|
3
12
|
/**
|
|
4
13
|
* DataListView 字段渲染作用域
|
|
5
14
|
* ---
|
|
@@ -64,3 +73,118 @@ export interface DataListViewItemScope<T extends Record<string, any> = Record<st
|
|
|
64
73
|
/** 翻转当前行选中态 */
|
|
65
74
|
toggleSelect: () => void;
|
|
66
75
|
}
|
|
76
|
+
/** InfiniteListView 配置(经 DataGridView.infiniteListProps 透传) */
|
|
77
|
+
export interface InfiniteListViewConfig {
|
|
78
|
+
/** 哨兵提前量(px):距容器底部此距离内即触发 load-more */
|
|
79
|
+
loadMoreDistance?: number;
|
|
80
|
+
/** 到底提示文案 */
|
|
81
|
+
endText?: string;
|
|
82
|
+
/** 错误重试文案 */
|
|
83
|
+
errorText?: string;
|
|
84
|
+
/** 虚拟项预估高(px),按实际测量自动校准 */
|
|
85
|
+
estimateSize?: number;
|
|
86
|
+
/** 视口外预渲染项数 */
|
|
87
|
+
overscan?: number;
|
|
88
|
+
/** opt-in 触摸下拉刷新(默认关) */
|
|
89
|
+
pullRefresh?: boolean;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* InfiniteListView props(受控无限滚动容器)
|
|
93
|
+
* ---
|
|
94
|
+
* 不自持数据获取:data 存量 + 加载状态均由外部传入;滚动到底发 load-more,
|
|
95
|
+
* 错误点击发 retry,下拉刷新发 refresh——数据状态机由外部(数据容器)持有。
|
|
96
|
+
*/
|
|
97
|
+
export interface InfiniteListViewProps<T extends Record<string, any> = Record<string, any>> {
|
|
98
|
+
/** 存量数据(累加结果,外部持有) */
|
|
99
|
+
data: T[];
|
|
100
|
+
/** 虚拟项唯一键:键名或函数 */
|
|
101
|
+
itemKey: Extract<keyof T, string> | ((item: T) => string);
|
|
102
|
+
/** 首次加载中(底部显示加载占位) */
|
|
103
|
+
loading?: boolean;
|
|
104
|
+
/** 加载更多中(底部显示加载占位,禁止重复触发) */
|
|
105
|
+
loadingMore?: boolean;
|
|
106
|
+
/** 错误信息;非空时底部显示错误 + 重试(发 retry,手动点击才重新加载) */
|
|
107
|
+
error?: Error | string | null;
|
|
108
|
+
/** 是否到底(hasMore=false);true 时底部显示 endText */
|
|
109
|
+
finished?: boolean;
|
|
110
|
+
/** 哨兵提前量(px) */
|
|
111
|
+
loadMoreDistance?: number;
|
|
112
|
+
/** 到底提示文案 */
|
|
113
|
+
endText?: string;
|
|
114
|
+
/** 错误重试文案 */
|
|
115
|
+
errorText?: string;
|
|
116
|
+
/** 虚拟项预估高(px) */
|
|
117
|
+
estimateSize?: number;
|
|
118
|
+
/** 视口外预渲染项数 */
|
|
119
|
+
overscan?: number;
|
|
120
|
+
/** 传入时容器限高滚动(内部 overflowY: auto);数字 = px,字符串 = CSS 长度(如 "100vh") */
|
|
121
|
+
maxHeight?: number | string;
|
|
122
|
+
/** opt-in 触摸下拉刷新(默认关) */
|
|
123
|
+
pullRefresh?: boolean;
|
|
124
|
+
}
|
|
125
|
+
/** InfiniteListView 实例 */
|
|
126
|
+
export interface InfiniteListViewInstance {
|
|
127
|
+
/** 滚动到第 index 项 */
|
|
128
|
+
scrollTo: (index: number) => void;
|
|
129
|
+
/** 重置:清虚拟缓存 + 回顶 */
|
|
130
|
+
reset: () => void;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* DataGridView props(对齐 TableMain 主 props − 分页面 + 存量/滚动面)
|
|
134
|
+
* ---
|
|
135
|
+
* 自持存量累加状态机:api + query + fetchNextPage + hasMore;
|
|
136
|
+
* 内部按 gridColumns 把存量 chunk 成行喂 InfiniteListView 虚拟化。
|
|
137
|
+
*/
|
|
138
|
+
export interface DataGridViewProps<T extends Record<string, any>, SQ extends Record<string, any>, F extends Record<string, any>> {
|
|
139
|
+
/** 列表请求;params = query 深合并 page.page/page.pageSize(键名 APP_API_LIST_MODEL_KEY_CONFIG 定) */
|
|
140
|
+
api: (params: TableApiParams<SQ>) => Promise<TableApiResult<T>>;
|
|
141
|
+
/** 列配置数组(驱动默认卡片渲染) */
|
|
142
|
+
columns: ElTableColumnProps<T, F>[];
|
|
143
|
+
/** 行/卡唯一键 */
|
|
144
|
+
rowKey: Extract<keyof T, string> | ((row: T) => string);
|
|
145
|
+
/** 静态查询参数;变化时清空存量从第 1 页重新累加 */
|
|
146
|
+
query?: SQ;
|
|
147
|
+
/** 每批加载条数(批次固定,运行期不改) */
|
|
148
|
+
pageSizeInit?: number;
|
|
149
|
+
/**
|
|
150
|
+
* 网格列数:number = 定列数等宽网格(默认 4);对象 = el-col span 制断点配置
|
|
151
|
+
* (24 栅格,如 `{ xs: 24, sm: 12, md: 8, lg: 6, xl: 4 }`,列数 = 24 / span)。
|
|
152
|
+
*/
|
|
153
|
+
gridColumns?: number | GridColumnsConfig;
|
|
154
|
+
/**
|
|
155
|
+
* 数据区最大高度;与 refine 二选一作为高度基准。
|
|
156
|
+
* 数字 = px;字符串 = CSS 长度(默认 "100vh" = 满视口高,等价视口高度限高,
|
|
157
|
+
* 非 refine 缺省兜底杜绝无限顶开;显式传入数字/字符串则覆盖)。
|
|
158
|
+
*/
|
|
159
|
+
maxHeight?: number | string;
|
|
160
|
+
/** 精细化布局:无显式 maxHeight 时按 viewport 高减工具栏/底部得出数据区高 */
|
|
161
|
+
refine?: boolean;
|
|
162
|
+
/** refine 模式预留高度减量 */
|
|
163
|
+
refineReduceHeight?: number;
|
|
164
|
+
/** 显式指定视口可用高(优先级最高) */
|
|
165
|
+
viewportHeight?: number;
|
|
166
|
+
/** 定向消费的祖先 scope 标识 */
|
|
167
|
+
parentChannel?: string;
|
|
168
|
+
/** 数据滚动区 min-height 撑满可用高、底部状态贴底 */
|
|
169
|
+
fillHeight?: boolean;
|
|
170
|
+
/** 数据视口最大高最小值 floor 兜底 */
|
|
171
|
+
dataViewMaxHeightMinValue?: number;
|
|
172
|
+
/** 注入列作用域/卡片作用域的额外对象 */
|
|
173
|
+
injectInfo?: F;
|
|
174
|
+
/** 冷启(首次无数据)网格卡片骨架 */
|
|
175
|
+
skeleton?: boolean;
|
|
176
|
+
/** 骨架卡片数 */
|
|
177
|
+
skeletonRows?: number;
|
|
178
|
+
/** 挂载后是否立即触发初始化查询;false 时挂载不自动拉数 */
|
|
179
|
+
initialSearch?: boolean;
|
|
180
|
+
/** toolbar 顶层开关 */
|
|
181
|
+
showToolbar?: boolean;
|
|
182
|
+
/** toolbar 配置(按钮 / 刷新 / 自动刷新 / 导出) */
|
|
183
|
+
toolbar?: TableToolbarConfig<T, SQ, F>;
|
|
184
|
+
/** InfiniteListView 配置透传 */
|
|
185
|
+
infiniteListProps?: InfiniteListViewConfig;
|
|
186
|
+
}
|
|
187
|
+
/** DataGridView 实例(选中/滚动能力对齐 TableInstance 子集,未实现抛错桩) */
|
|
188
|
+
export type DataGridViewInstance = TableInstance;
|
|
189
|
+
/** DataGridView 对外分页信息(复用 TablePageInfo:currentPage = 已拉最大页) */
|
|
190
|
+
export type DataGridViewPageInfo = TablePageInfo;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Component, ComputedRef } from 'vue';
|
|
2
|
+
import { TableColumnDefaultScope } from '../table';
|
|
3
|
+
import { DataViewColumn } from './types';
|
|
4
|
+
/**
|
|
5
|
+
* useDataViewFieldMap —— 列配置 → 稳定字段组件(data-view 族共享 hook)
|
|
6
|
+
* ---
|
|
7
|
+
* DataListView 与 DataGridView 同源构建 `fieldComponentMap`(列 key → 稳定字段组件),
|
|
8
|
+
* 防渲染层双线漂移。组件标识跨渲染稳定(markRaw + 闭包 column),
|
|
9
|
+
* data/选中变更只 patch props 不 remount。
|
|
10
|
+
*/
|
|
11
|
+
export interface UseDataViewFieldMapOptions<T extends Record<string, any> = Record<string, any>, F extends Record<string, any> = {}> {
|
|
12
|
+
/** 列配置 getter(响应式:随 columns 变化重建 map) */
|
|
13
|
+
columns: () => DataViewColumn<T>[];
|
|
14
|
+
/** 列 render 上下文(injectInfo + exposeInfo) */
|
|
15
|
+
getRenderCtxParams: () => Pick<TableColumnDefaultScope<T, F>, "injectInfo" | "exposeInfo">;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* 列配置 → fieldComponentMap(computed)。
|
|
19
|
+
* 普通列 key=prop;type:index/selection → 保留键 $type_index/$type_selection;
|
|
20
|
+
* type:expand 不支持(跳过)。
|
|
21
|
+
*/
|
|
22
|
+
export declare function useDataViewFieldMap<T extends Record<string, any> = Record<string, any>, F extends Record<string, any> = {}>(options: UseDataViewFieldMapOptions<T, F>): {
|
|
23
|
+
fieldComponentMap: ComputedRef<Record<string, Component>>;
|
|
24
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* usePullRefresh —— InfiniteListView 的 opt-in 触摸下拉刷新(私有,不出桶)
|
|
3
|
+
* ---
|
|
4
|
+
* 桌面 Web 无手势语境默认关(规则:刷新走按钮/自动刷新);H5/移动适配时开启。
|
|
5
|
+
* 仅当滚动容器在顶部(scrollTop === 0)才响应下拉;下拉超阈值释放 → onRefresh。
|
|
6
|
+
*/
|
|
7
|
+
export declare function usePullRefresh(options: {
|
|
8
|
+
/** 是否启用(pullRefresh prop) */
|
|
9
|
+
enabled: () => boolean;
|
|
10
|
+
/** 滚动容器 */
|
|
11
|
+
getScrollContainer: () => HTMLElement | null;
|
|
12
|
+
/** 释放刷新回调 */
|
|
13
|
+
onRefresh: () => void;
|
|
14
|
+
}): {
|
|
15
|
+
pullDistance: import('vue').Ref<number, number>;
|
|
16
|
+
pullThreshold: number;
|
|
17
|
+
onTouchStart: (e: TouchEvent) => void;
|
|
18
|
+
onTouchMove: (e: TouchEvent) => void;
|
|
19
|
+
onTouchEnd: () => void;
|
|
20
|
+
};
|
|
@@ -1,4 +1,16 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Breakpoint } from '../../hooks';
|
|
2
|
+
import { DataListViewInstance, GridColumnsConfig } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* 网格断点列数配置 → 当前断点列数(el-col span 制 24 栅格换算)
|
|
5
|
+
* ---
|
|
6
|
+
* - number(定列数)→ 原样(clamp ≥ 1)
|
|
7
|
+
* - 对象 → 取 ≤ 当前断点最近一档的 span(未配回落更小档,全无回落 24 = 1 列),列数 = 24 / span
|
|
8
|
+
* - span 非法(≤ 0 / NaN)→ 兜底 24(1 列)
|
|
9
|
+
*/
|
|
10
|
+
export declare const resolveGridColumnsByBreakpoint: (gridColumns: number | GridColumnsConfig | undefined, breakpoint: Breakpoint) => number;
|
|
11
|
+
/**
|
|
12
|
+
* 创建 DataListView 实例
|
|
13
|
+
*/
|
|
2
14
|
/**
|
|
3
15
|
* 创建 DataListView 实例
|
|
4
16
|
*/
|
|
@@ -35,6 +35,10 @@ declare const _default: <T extends Record<string, any>, PO extends Record<string
|
|
|
35
35
|
pagerSticky?: boolean;
|
|
36
36
|
headerObserveResize?: boolean;
|
|
37
37
|
operationObserveResize?: boolean;
|
|
38
|
+
viewMode?: "table" | "grid";
|
|
39
|
+
gridColumns?: number | import('../data-view').GridColumnsConfig;
|
|
40
|
+
infiniteListProps?: import('../data-view').InfiniteListViewConfig;
|
|
41
|
+
gridProps?: Partial<Omit<import('../data-view').DataGridViewProps<T, import('../form').ExcludeNeverProperties<import('../form').ExtractFormStringifyRawFromObject<PO, SO>> & SQ, ListLayoutInnerInjectInfo<PO, F>>, "toolbar" | "refine" | "gridColumns" | "infiniteListProps" | import('./types').TableMainRequiredKey | import('./types').TableMainRewriteKey>> | undefined;
|
|
38
42
|
}) & Partial<{}>> & import('vue').PublicProps;
|
|
39
43
|
expose(exposed: import('vue').ShallowUnwrapRef<ListLayoutInstance<PO, Record<string, any>>>): void;
|
|
40
44
|
attrs: any;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ExtractFormStringifyFromObject, ExtractFormStringifyFromList, FormItemConfigList, FormSearchInstance, FormSearchProps, FormSearchSearchType } from '../form';
|
|
2
2
|
import { TableApiParams, TableApiResult, TableMainInstance, TableMainProps } from '../table';
|
|
3
3
|
import { SlotLayoutFlowAsideProps } from '../slot-layout';
|
|
4
|
+
import { DataGridViewProps, GridColumnsConfig, InfiniteListViewConfig } from '../data-view';
|
|
4
5
|
export type FormSearchOptionsKey = "staticQuery";
|
|
5
6
|
export type FormSearchRewriteKey = "list";
|
|
6
7
|
export type TableMainOptionsKey = "refine" | "refineReduceHeight" | "viewportHeight" | "parentChannel" | "toolbar" | "showSwitchView";
|
|
@@ -88,6 +89,21 @@ F extends Record<string, any>> = Partial<Pick<FormSearchProps<PO, SO, {}>, FormS
|
|
|
88
89
|
headerObserveResize?: boolean;
|
|
89
90
|
/** operation 插槽量高是否启用 ResizeObserver(语义同 headerObserveResize,默认 false)。 */
|
|
90
91
|
operationObserveResize?: boolean;
|
|
92
|
+
/**
|
|
93
|
+
* 数据展示载体:table(默认,TableMain 分页容器,内部可再经 customView 切 DataListView)/
|
|
94
|
+
* grid(DataGridView 存量累加网格,无限滚动)。初始化定好、运行期不改。
|
|
95
|
+
*/
|
|
96
|
+
viewMode?: "table" | "grid";
|
|
97
|
+
/**
|
|
98
|
+
* 网格列数(仅 viewMode="grid" 生效,默认 4):number = 定列数等宽网格;
|
|
99
|
+
* 对象 = el-col span 制断点配置(24 栅格,如 `{ xs: 24, sm: 12, md: 8, lg: 6, xl: 4 }`,
|
|
100
|
+
* 列数 = 24 / span,对齐 FormSearch layout 心智)。
|
|
101
|
+
*/
|
|
102
|
+
gridColumns?: number | GridColumnsConfig;
|
|
103
|
+
/** InfiniteListView 配置透传(仅 viewMode="grid" 生效)。 */
|
|
104
|
+
infiniteListProps?: InfiniteListViewConfig;
|
|
105
|
+
/** DataGridView 其余配置透传(仅 viewMode="grid" 生效,对齐 tableMainProps 模式)。 */
|
|
106
|
+
gridProps?: Partial<Omit<DataGridViewProps<T, ExtractFormStringifyFromObject<PO, SO> & SQ, ListLayoutInnerInjectInfo<PO, F>>, TableMainRequiredKey | TableMainRewriteKey | "refine" | "toolbar" | "gridColumns" | "infiniteListProps">>;
|
|
91
107
|
};
|
|
92
108
|
export interface ListLayoutInstance<PO extends Record<string, any> = Record<string, any>, SO extends Record<string, any> = Record<string, any>> extends FormSearchInstance<PO, SO>, TableMainInstance {
|
|
93
109
|
/** 更新表单数据 */
|
|
@@ -1,4 +1,14 @@
|
|
|
1
1
|
import { default as TableMain } from './TableMain.vue';
|
|
2
|
+
import { default as TableToolbar } from './TableToolbar.vue';
|
|
3
|
+
import { default as TableEmpty } from './TableEmpty.vue';
|
|
4
|
+
import { default as TableSkeleton } from './TableSkeleton.vue';
|
|
2
5
|
export * from './types';
|
|
3
6
|
export * from './constants';
|
|
4
|
-
|
|
7
|
+
/**
|
|
8
|
+
* table 族 index
|
|
9
|
+
* ---
|
|
10
|
+
* 公开组件:TableMain(数据表格容器);TableToolbar / TableEmpty / TableSkeleton
|
|
11
|
+
* 为跨容器复用件(TableMain 与 data-view 族 DataGridView 共用,空态/骨架/工具栏
|
|
12
|
+
* 视觉两容器一致防漂移)。ToolbarButtons 保持内部件([MUST NOT] 外部消费)。
|
|
13
|
+
*/
|
|
14
|
+
export { TableMain, TableToolbar, TableEmpty, TableSkeleton };
|
package/types/index.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
export * from './components/form';
|
|
2
|
+
export { InfiniteListView, DataGridView } from './components/data-view';
|
|
3
|
+
export type { DataGridViewInstance, DataGridViewPageInfo, DataGridViewProps, InfiniteListViewConfig, InfiniteListViewInstance, InfiniteListViewProps, } from './components/data-view';
|
|
2
4
|
export * from './components/menu';
|
|
3
5
|
export * from './components/display';
|
|
4
6
|
export * from './components/misc';
|