tm-table 1.0.14 → 1.0.83
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 +628 -0
- package/dist/vue2/tm-table.css +1 -0
- package/dist/vue2/tm-table.es.js +2629 -0
- package/dist/vue2/tm-table.umd.js +1 -0
- package/dist/vue3/tm-table.css +1 -0
- package/dist/vue3/tm-table.es.js +3248 -0
- package/dist/vue3/tm-table.umd.js +1 -0
- package/package.json +41 -46
- package/types/index.ts +1 -6
- package/types/locale.ts +3 -0
- package/dist/tm-table.esm.js +0 -2
- package/dist/tm-table.esm.js.LICENSE.txt +0 -8
- package/dist/tm-table.umd.js +0 -2
- package/dist/tm-table.umd.js.LICENSE.txt +0 -8
- package/types/components/icon.ts +0 -28
package/README.md
ADDED
|
@@ -0,0 +1,628 @@
|
|
|
1
|
+
# TM Table
|
|
2
|
+
|
|
3
|
+
一个功能强大的 Vue 表格组件,支持 Vue2 和 Vue3,基于 Element UI 二次封装。
|
|
4
|
+
|
|
5
|
+
## ✨ 特性
|
|
6
|
+
|
|
7
|
+
- 🚀 **双版本支持** - 同一套代码,同时支持 Vue2 和 Vue3
|
|
8
|
+
- 🔍 **智能搜索** - 内置多种搜索组件,支持高级搜索功能
|
|
9
|
+
- 📊 **灵活数据源** - 支持静态数据和异步函数加载
|
|
10
|
+
- 🔧 **列管理** - 可自定义列显示/隐藏、排序、冻结
|
|
11
|
+
- 📄 **分页器** - 内置完整分页功能
|
|
12
|
+
- 🌈 **国际化** - 支持中英文切换
|
|
13
|
+
- 🎨 **高度定制** - 丰富的插槽和配置选项
|
|
14
|
+
|
|
15
|
+
## 📦 安装
|
|
16
|
+
|
|
17
|
+
### 依赖
|
|
18
|
+
|
|
19
|
+
Element UI/Element Plus、sortable.js
|
|
20
|
+
|
|
21
|
+
### 安装包
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
npm install tm-table
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## 🚀 快速开始
|
|
28
|
+
|
|
29
|
+
### 引入方式
|
|
30
|
+
|
|
31
|
+
#### 完整引入
|
|
32
|
+
|
|
33
|
+
```javascript
|
|
34
|
+
// Vue 2
|
|
35
|
+
import Vue from "vue";
|
|
36
|
+
import TmTable from "tm-table";
|
|
37
|
+
import "tm-table/style";
|
|
38
|
+
Vue.use(TmTable);
|
|
39
|
+
|
|
40
|
+
// Vue 3
|
|
41
|
+
import { createApp } from "vue";
|
|
42
|
+
import TmTable from "tm-table/v3";
|
|
43
|
+
import "tm-table/style";
|
|
44
|
+
const app = createApp();
|
|
45
|
+
app.use(TmTable);
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
#### 按需引入
|
|
49
|
+
|
|
50
|
+
```javascript
|
|
51
|
+
// Vue 2
|
|
52
|
+
import { Table, Column } from "tm-table";
|
|
53
|
+
|
|
54
|
+
// Vue 3
|
|
55
|
+
import { Table, Column } from "tm-table/v3";
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### 基础用法
|
|
59
|
+
|
|
60
|
+
#### 静态数据表格
|
|
61
|
+
|
|
62
|
+
```html
|
|
63
|
+
<template>
|
|
64
|
+
<tm-table :data="tableData">
|
|
65
|
+
<tm-table-column prop="id" label="ID" width="80"></tm-table-column>
|
|
66
|
+
<tm-table-column prop="name" label="姓名" width="120"></tm-table-column>
|
|
67
|
+
<tm-table-column prop="email" label="邮箱"></tm-table-column>
|
|
68
|
+
</tm-table>
|
|
69
|
+
</template>
|
|
70
|
+
|
|
71
|
+
<script>
|
|
72
|
+
export default {
|
|
73
|
+
data() {
|
|
74
|
+
return {
|
|
75
|
+
tableData: [
|
|
76
|
+
{ id: 1, name: "张三", email: "zhang@example.com" },
|
|
77
|
+
{ id: 2, name: "李四", email: "li@example.com" },
|
|
78
|
+
],
|
|
79
|
+
};
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
</script>
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
#### 异步数据表格
|
|
86
|
+
|
|
87
|
+
```html
|
|
88
|
+
<template>
|
|
89
|
+
<tm-table :data="loadData">
|
|
90
|
+
<tm-table-column prop="id" label="ID" width="80"></tm-table-column>
|
|
91
|
+
<tm-table-column prop="name" label="姓名" width="100"></tm-table-column>
|
|
92
|
+
<tm-table-column prop="email" label="邮箱"></tm-table-column>
|
|
93
|
+
</tm-table>
|
|
94
|
+
</template>
|
|
95
|
+
|
|
96
|
+
<script>
|
|
97
|
+
export default {
|
|
98
|
+
methods: {
|
|
99
|
+
async loadData({ paginationInfo, params }) {
|
|
100
|
+
// 模拟API调用
|
|
101
|
+
const response = await fetch(
|
|
102
|
+
`/api/users?page=${paginationInfo.current}&size=${paginationInfo.pageSize}`
|
|
103
|
+
);
|
|
104
|
+
const data = await response.json();
|
|
105
|
+
|
|
106
|
+
return {
|
|
107
|
+
list: data.list,
|
|
108
|
+
total: data.total,
|
|
109
|
+
current: data.current,
|
|
110
|
+
pageSize: data.pageSize,
|
|
111
|
+
};
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
</script>
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
#### 插槽使用示例
|
|
119
|
+
|
|
120
|
+
```html
|
|
121
|
+
<tm-table :data="tableData" :search-columns="['custom']">
|
|
122
|
+
<!-- 自定义搜索组件 -->
|
|
123
|
+
<template #search-custom="{ searchForm }">
|
|
124
|
+
<el-input v-model="searchForm.custom" placeholder="自定义搜索" />
|
|
125
|
+
</template>
|
|
126
|
+
|
|
127
|
+
<!-- 菜单栏左侧按钮 -->
|
|
128
|
+
<template #menu-left>
|
|
129
|
+
<el-button type="primary">新增</el-button>
|
|
130
|
+
<el-button>导入</el-button>
|
|
131
|
+
</template>
|
|
132
|
+
|
|
133
|
+
<!-- 菜单栏右侧按钮 -->
|
|
134
|
+
<template #menu-right>
|
|
135
|
+
<el-button>导出</el-button>
|
|
136
|
+
</template>
|
|
137
|
+
|
|
138
|
+
<!-- 表格列 -->
|
|
139
|
+
<tm-table-column prop="name" label="姓名"></tm-table-column>
|
|
140
|
+
</tm-table>
|
|
141
|
+
|
|
142
|
+
<script>
|
|
143
|
+
export default {
|
|
144
|
+
data() {
|
|
145
|
+
return {
|
|
146
|
+
searchForm: {},
|
|
147
|
+
searchColumns: ["custom"],
|
|
148
|
+
};
|
|
149
|
+
},
|
|
150
|
+
};
|
|
151
|
+
</script>
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## 🔥 完整功能示例
|
|
155
|
+
|
|
156
|
+
包含搜索、列配置、自适应高度等完整功能:
|
|
157
|
+
|
|
158
|
+
```html
|
|
159
|
+
<template>
|
|
160
|
+
<tm-table
|
|
161
|
+
:data="loadData"
|
|
162
|
+
:search-columns="searchColumns"
|
|
163
|
+
v-model:search-form="searchForm"
|
|
164
|
+
height="auto"
|
|
165
|
+
:calc-height="60"
|
|
166
|
+
table-key="user-list"
|
|
167
|
+
:column-setting-button="true"
|
|
168
|
+
:refresh-button="true"
|
|
169
|
+
@selection-change="handleSelectionChange"
|
|
170
|
+
>
|
|
171
|
+
<!-- 自定义搜索组件 -->
|
|
172
|
+
<template #search-custom="{ searchForm }">
|
|
173
|
+
<el-input v-model="searchForm.custom" placeholder="自定义搜索" />
|
|
174
|
+
</template>
|
|
175
|
+
<!-- 菜单栏按钮 -->
|
|
176
|
+
<template #menu-left>
|
|
177
|
+
<el-button type="primary" @click="handleAdd">新增</el-button>
|
|
178
|
+
</template>
|
|
179
|
+
|
|
180
|
+
<!-- 表格列定义 -->
|
|
181
|
+
<tm-table-column type="selection" width="55"></tm-table-column>
|
|
182
|
+
<tm-table-column prop="id" label="ID" width="80"></tm-table-column>
|
|
183
|
+
<tm-table-column prop="name" label="姓名" width="120"></tm-table-column>
|
|
184
|
+
<tm-table-column
|
|
185
|
+
prop="email"
|
|
186
|
+
label="邮箱"
|
|
187
|
+
min-width="150"
|
|
188
|
+
></tm-table-column>
|
|
189
|
+
<tm-table-column
|
|
190
|
+
prop="department"
|
|
191
|
+
label="部门"
|
|
192
|
+
width="100"
|
|
193
|
+
></tm-table-column>
|
|
194
|
+
<tm-table-column prop="status" label="状态" width="80">
|
|
195
|
+
<template #default="{ row }">
|
|
196
|
+
<el-tag :type="row.status === 'active' ? 'success' : 'info'">
|
|
197
|
+
{{ row.status === 'active' ? '启用' : '禁用' }}
|
|
198
|
+
</el-tag>
|
|
199
|
+
</template>
|
|
200
|
+
</tm-table-column>
|
|
201
|
+
<tm-table-column
|
|
202
|
+
prop="createTime"
|
|
203
|
+
label="创建时间"
|
|
204
|
+
width="160"
|
|
205
|
+
></tm-table-column>
|
|
206
|
+
<tm-table-column label="操作" width="150" fixed="right" :visible="false">
|
|
207
|
+
<template #default="{ row }">
|
|
208
|
+
<el-button size="mini">编辑</el-button>
|
|
209
|
+
<el-button size="mini">删除</el-button>
|
|
210
|
+
</template>
|
|
211
|
+
</tm-table-column>
|
|
212
|
+
</tm-table>
|
|
213
|
+
</template>
|
|
214
|
+
|
|
215
|
+
<script>
|
|
216
|
+
export default {
|
|
217
|
+
data() {
|
|
218
|
+
return {
|
|
219
|
+
searchForm: {},
|
|
220
|
+
selectedRows: [],
|
|
221
|
+
searchColumns: [
|
|
222
|
+
{
|
|
223
|
+
type: "input",
|
|
224
|
+
label: "用户搜索",
|
|
225
|
+
fields: { value: "keyword", label: "keywordType" },
|
|
226
|
+
fieldOptions: [
|
|
227
|
+
{ label: "姓名", value: "name" },
|
|
228
|
+
{ label: "邮箱", value: "email" },
|
|
229
|
+
],
|
|
230
|
+
placeholder: "请输入搜索关键词",
|
|
231
|
+
multiple: true,
|
|
232
|
+
},
|
|
233
|
+
"custom",
|
|
234
|
+
{
|
|
235
|
+
type: "select",
|
|
236
|
+
label: "部门",
|
|
237
|
+
fields: { value: "department" },
|
|
238
|
+
options: this.getDepartmentOptions,
|
|
239
|
+
placeholder: "请选择部门",
|
|
240
|
+
},
|
|
241
|
+
{
|
|
242
|
+
type: "select",
|
|
243
|
+
label: "状态",
|
|
244
|
+
fields: { value: "status" },
|
|
245
|
+
options: [
|
|
246
|
+
{ label: "启用", value: "active" },
|
|
247
|
+
{ label: "禁用", value: "inactive" },
|
|
248
|
+
],
|
|
249
|
+
},
|
|
250
|
+
{
|
|
251
|
+
type: "date",
|
|
252
|
+
label: "创建时间",
|
|
253
|
+
fields: { start: "startTime", end: "endTime" },
|
|
254
|
+
},
|
|
255
|
+
],
|
|
256
|
+
};
|
|
257
|
+
},
|
|
258
|
+
methods: {
|
|
259
|
+
// 异步加载数据
|
|
260
|
+
async loadData({ paginationInfo, params }) {
|
|
261
|
+
try {
|
|
262
|
+
const response = await this.$http.get("/api/users", {
|
|
263
|
+
params: {
|
|
264
|
+
page: paginationInfo.current,
|
|
265
|
+
size: paginationInfo.pageSize,
|
|
266
|
+
...params,
|
|
267
|
+
},
|
|
268
|
+
});
|
|
269
|
+
return {
|
|
270
|
+
list: response.data.list,
|
|
271
|
+
total: response.data.total,
|
|
272
|
+
current: response.data.current,
|
|
273
|
+
pageSize: response.data.pageSize,
|
|
274
|
+
};
|
|
275
|
+
} catch (error) {
|
|
276
|
+
this.$message.error("数据加载失败");
|
|
277
|
+
return { list: [], total: 0 };
|
|
278
|
+
}
|
|
279
|
+
},
|
|
280
|
+
|
|
281
|
+
// 获取部门选项(异步)
|
|
282
|
+
async getDepartmentOptions() {
|
|
283
|
+
const response = await this.$http.get("/api/departments");
|
|
284
|
+
return response.data.map((item) => ({
|
|
285
|
+
label: item.name,
|
|
286
|
+
value: item.id,
|
|
287
|
+
}));
|
|
288
|
+
},
|
|
289
|
+
|
|
290
|
+
// 选择变化回调
|
|
291
|
+
handleSelectionChange(selection) {
|
|
292
|
+
this.selectedRows = selection;
|
|
293
|
+
},
|
|
294
|
+
|
|
295
|
+
// 新增用户
|
|
296
|
+
handleAdd() {
|
|
297
|
+
// 处理新增逻辑
|
|
298
|
+
},
|
|
299
|
+
},
|
|
300
|
+
};
|
|
301
|
+
</script>
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
## 📋 API 文档
|
|
305
|
+
|
|
306
|
+
### Table 属性
|
|
307
|
+
|
|
308
|
+
| 参数 | 说明 | 类型 | 可选值 | 默认值 |
|
|
309
|
+
| --------------------- | ---------------------- | ---------------- | --- | ------ |
|
|
310
|
+
| data | 表格数据,可以是数组或异步函数 | Array / Function | — | [] |
|
|
311
|
+
| show-search | 是否显示搜索区域 | Boolean | — | true |
|
|
312
|
+
| show-menu | 是否显示菜单栏 | Boolean | — | true |
|
|
313
|
+
| show-pagination | 是否显示分页器 | Boolean | — | true |
|
|
314
|
+
| height | 表格高度,支持 'auto' 自适应 | String / Number | — | — |
|
|
315
|
+
| calc-height | 自适应高度时需要减去的高度 | Number | — | 0 |
|
|
316
|
+
| column-setting-button | 是否显示列配置按钮 | Boolean | — | true |
|
|
317
|
+
| refresh-button | 是否显示刷新按钮 | Boolean | — | true |
|
|
318
|
+
| table-key | 列配置的唯一标识 | String | — | 当前路由路径 |
|
|
319
|
+
| first-load | 初始化时是否请求数据 | Boolean | — | true |
|
|
320
|
+
| border | 是否显示边框 | Boolean | — | true |
|
|
321
|
+
| search-columns | 搜索列配置,详见 SearchColumns | Array | — | [] |
|
|
322
|
+
| search-form | 搜索表单数据(支持 v-model) | Object | — | {} |
|
|
323
|
+
|
|
324
|
+
### Table 事件
|
|
325
|
+
|
|
326
|
+
| 事件名 | 说明 | 参数 |
|
|
327
|
+
| ------------------ | ---------- | ---------- |
|
|
328
|
+
| selection-change | 选择项发生变化时触发 | selection |
|
|
329
|
+
| size-change | 每页条数改变时触发 | size |
|
|
330
|
+
| current-change | 当前页改变时触发 | current |
|
|
331
|
+
| update:search-form | 搜索表单更新时触发 | searchForm |
|
|
332
|
+
|
|
333
|
+
### Table 方法
|
|
334
|
+
|
|
335
|
+
| 方法名 | 说明 | 参数 |
|
|
336
|
+
| ------------ | --------------- | --- |
|
|
337
|
+
| loadData | 手动触发数据加载 | — |
|
|
338
|
+
| refreshTable | 刷新表格布局 | — |
|
|
339
|
+
| reloadTable | 重新加载表格(会触发重新渲染) | — |
|
|
340
|
+
|
|
341
|
+
### Table 插槽
|
|
342
|
+
|
|
343
|
+
| 插槽名 | 说明 | 参数 |
|
|
344
|
+
| ------------- | -------------------------------------- | ------------------- |
|
|
345
|
+
| search | 自定义整个搜索区域 | — |
|
|
346
|
+
| menu-left | 菜单栏左侧内容 | — |
|
|
347
|
+
| menu-right | 菜单栏右侧内容 | — |
|
|
348
|
+
| search-{prop} | 自定义列搜索框内容,prop 为 searchColumns 中配置的插槽名 | { searchForm, col } |
|
|
349
|
+
|
|
350
|
+
### Column 属性
|
|
351
|
+
|
|
352
|
+
TmColumn 基于 el-table-column 封装,支持所有 el-table-column 的属性,额外增加:
|
|
353
|
+
|
|
354
|
+
| 参数 | 说明 | 类型 | 默认值 |
|
|
355
|
+
| ----------- | ------------------------------- | ------- | ---- |
|
|
356
|
+
| prop | 必填,列配置基于该属性实现,同一table中,该值不可重复定义 | String | — |
|
|
357
|
+
| visible | 默认显示当前列 | Boolean | true |
|
|
358
|
+
| cancellable | 在列配置中,是否可取消 | Boolean | true |
|
|
359
|
+
|
|
360
|
+
其他属性参考 [Element UI Table Column](https://element.eleme.cn/#/zh-CN/component/table#table-column-attributes)
|
|
361
|
+
|
|
362
|
+
## 🔍 搜索功能详解
|
|
363
|
+
|
|
364
|
+
### SearchColumns 配置
|
|
365
|
+
|
|
366
|
+
| 参数 | 说明 | 类型 | 可选值 | 默认值 |
|
|
367
|
+
| ------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------ | ----- |
|
|
368
|
+
| type | 搜索项表单类型 | String | input\|select\|cascader\|date\|radio\|checkbox\|switch | input |
|
|
369
|
+
| label | 表单左侧文案 | String | — | — |
|
|
370
|
+
| placeholder | 输入框占位符 | String | — | — |
|
|
371
|
+
| fields | 字段映射配置,当表单值发生改变时同步修改 search-form 绑定字段的值<br/>**无默认值**:`{ value: "valueField" }`<br/>**有默认值1**:`{ value: ["valueField", "默认值"] }`<br/>**有默认值2**:`{ value: { name: "value1", default: "默认值" } }`<br/>**注:默认值在表单初始化和重置时生效** | Object | — | — |
|
|
372
|
+
| fieldOptions | 字段类型选项,格式:`[{label:"用户名", value:"userName"}]` | Array | — | [] |
|
|
373
|
+
| options | 选项配置,type 为 select\|cascader 时可用 | Array | — | [] |
|
|
374
|
+
| multiple | type 为 input 时表示精确搜索,为 select 或 cascader 时表示多选 | Boolean | — | false |
|
|
375
|
+
| checkAll | 全选功能,type 为 select 时有效 | Boolean | — | false |
|
|
376
|
+
|
|
377
|
+
### 各类型搜索组件配置
|
|
378
|
+
|
|
379
|
+
#### Input 输入框搜索
|
|
380
|
+
|
|
381
|
+
```javascript
|
|
382
|
+
{
|
|
383
|
+
type: 'input',
|
|
384
|
+
label: '名称搜索',
|
|
385
|
+
fields: {
|
|
386
|
+
value: 'name', // 必需:值字段
|
|
387
|
+
label: 'nameType' // 可选:字段类型
|
|
388
|
+
},
|
|
389
|
+
fieldOptions: [ // 可选:字段选择器选项
|
|
390
|
+
{ label: '姓名', value: 'name' },
|
|
391
|
+
{ label: '邮箱', value: 'email' }
|
|
392
|
+
],
|
|
393
|
+
placeholder: '请输入搜索内容',
|
|
394
|
+
multiple: true // 可选:是否支持批量精确搜索
|
|
395
|
+
}
|
|
396
|
+
```
|
|
397
|
+
|
|
398
|
+
#### Select 下拉选择
|
|
399
|
+
|
|
400
|
+
```javascript
|
|
401
|
+
{
|
|
402
|
+
type: 'select',
|
|
403
|
+
label: '状态',
|
|
404
|
+
fields: { value: 'status' },
|
|
405
|
+
options: [ // 静态选项
|
|
406
|
+
{ label: '启用', value: 'active' },
|
|
407
|
+
{ label: '禁用', value: 'inactive' }
|
|
408
|
+
],
|
|
409
|
+
// 或者异步选项
|
|
410
|
+
options: async () => {
|
|
411
|
+
const res = await fetch('/api/options');
|
|
412
|
+
return res.json();
|
|
413
|
+
},
|
|
414
|
+
multiple: true, // 可选:是否多选
|
|
415
|
+
checkAll: true, // 可选:是否显示全选
|
|
416
|
+
placeholder: '请选择状态'
|
|
417
|
+
}
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
#### Date 日期选择
|
|
421
|
+
|
|
422
|
+
```javascript
|
|
423
|
+
{
|
|
424
|
+
type: 'date',
|
|
425
|
+
label: '日期范围',
|
|
426
|
+
fields: {
|
|
427
|
+
start: 'startDate', // 开始日期字段
|
|
428
|
+
end: 'endDate' // 结束日期字段
|
|
429
|
+
},
|
|
430
|
+
fieldOptions: [ // 可选:日期类型选择
|
|
431
|
+
{ label: '创建时间', value: 'createTime' },
|
|
432
|
+
{ label: '更新时间', value: 'updateTime' }
|
|
433
|
+
],
|
|
434
|
+
startPlaceholder: '开始日期',
|
|
435
|
+
endPlaceholder: '结束日期'
|
|
436
|
+
}
|
|
437
|
+
```
|
|
438
|
+
|
|
439
|
+
#### Cascader 级联选择
|
|
440
|
+
|
|
441
|
+
```javascript
|
|
442
|
+
{
|
|
443
|
+
type: 'cascader',
|
|
444
|
+
label: '地区',
|
|
445
|
+
fields: { value: 'region' },
|
|
446
|
+
options: [
|
|
447
|
+
{
|
|
448
|
+
value: 'beijing',
|
|
449
|
+
label: '北京',
|
|
450
|
+
children: [
|
|
451
|
+
{ value: 'chaoyang', label: '朝阳区' },
|
|
452
|
+
{ value: 'haidian', label: '海淀区' }
|
|
453
|
+
]
|
|
454
|
+
}
|
|
455
|
+
],
|
|
456
|
+
props: { // Element UI cascader 属性
|
|
457
|
+
multiple: true,
|
|
458
|
+
checkStrictly: true
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
```
|
|
462
|
+
|
|
463
|
+
#### 其他类型
|
|
464
|
+
|
|
465
|
+
```javascript
|
|
466
|
+
// 单选框
|
|
467
|
+
{ type: 'radio', label: '性别', fields: { value: 'gender' }, options: [...] }
|
|
468
|
+
|
|
469
|
+
// 多选框
|
|
470
|
+
{ type: 'checkbox', label: '兴趣', fields: { value: 'interests' }, options: [...] }
|
|
471
|
+
|
|
472
|
+
// 开关
|
|
473
|
+
{
|
|
474
|
+
type: 'switch',
|
|
475
|
+
label: '是否启用',
|
|
476
|
+
fields: { value: 'enabled' },
|
|
477
|
+
activeText: '启用',
|
|
478
|
+
inactiveText: '禁用'
|
|
479
|
+
}
|
|
480
|
+
```
|
|
481
|
+
|
|
482
|
+
### 自定义搜索组件
|
|
483
|
+
|
|
484
|
+
使用字符串形式配置,然后通过插槽自定义:
|
|
485
|
+
|
|
486
|
+
```html
|
|
487
|
+
<tm-table :search-columns="['customSearch']">
|
|
488
|
+
<template #search-customSearch="{ searchForm }">
|
|
489
|
+
<el-input v-model="searchForm.custom" placeholder="自定义搜索" />
|
|
490
|
+
</template>
|
|
491
|
+
</tm-table>
|
|
492
|
+
```
|
|
493
|
+
|
|
494
|
+
### 带搜索的完整示例
|
|
495
|
+
|
|
496
|
+
```html
|
|
497
|
+
<template>
|
|
498
|
+
<tm-table
|
|
499
|
+
:data="loadData"
|
|
500
|
+
:search-columns="searchColumns"
|
|
501
|
+
v-model:search-form="searchForm"
|
|
502
|
+
>
|
|
503
|
+
<tm-table-column prop="name" label="姓名"></tm-table-column>
|
|
504
|
+
<tm-table-column prop="department" label="部门"></tm-table-column>
|
|
505
|
+
<tm-table-column prop="createTime" label="创建时间"></tm-table-column>
|
|
506
|
+
</tm-table>
|
|
507
|
+
</template>
|
|
508
|
+
|
|
509
|
+
<script>
|
|
510
|
+
export default {
|
|
511
|
+
data() {
|
|
512
|
+
return {
|
|
513
|
+
searchForm: {},
|
|
514
|
+
searchColumns: [
|
|
515
|
+
{
|
|
516
|
+
type: "input",
|
|
517
|
+
label: "姓名搜索",
|
|
518
|
+
fields: { value: "name" },
|
|
519
|
+
placeholder: "请输入姓名",
|
|
520
|
+
},
|
|
521
|
+
{
|
|
522
|
+
type: "select",
|
|
523
|
+
label: "部门",
|
|
524
|
+
fields: { value: "department" },
|
|
525
|
+
options: [
|
|
526
|
+
{ label: "技术部", value: "tech" },
|
|
527
|
+
{ label: "产品部", value: "product" },
|
|
528
|
+
],
|
|
529
|
+
},
|
|
530
|
+
],
|
|
531
|
+
};
|
|
532
|
+
},
|
|
533
|
+
};
|
|
534
|
+
</script>
|
|
535
|
+
```
|
|
536
|
+
|
|
537
|
+
## 🧩 其他组件
|
|
538
|
+
|
|
539
|
+
### EllipsisText 省略文本
|
|
540
|
+
|
|
541
|
+
用于显示可能过长的文本,支持省略和 tooltip。
|
|
542
|
+
|
|
543
|
+
#### 基础用法
|
|
544
|
+
|
|
545
|
+
```html
|
|
546
|
+
<template>
|
|
547
|
+
<ellipsis-text
|
|
548
|
+
text="这是一段很长的文本,超出指定宽度时会显示省略号"
|
|
549
|
+
:width="200"
|
|
550
|
+
:copyable="true"
|
|
551
|
+
/>
|
|
552
|
+
</template>
|
|
553
|
+
```
|
|
554
|
+
|
|
555
|
+
#### EllipsisText 属性
|
|
556
|
+
|
|
557
|
+
| 参数 | 说明 | 类型 | 默认值 |
|
|
558
|
+
| ------------ | ------------ | ------------- | ----- |
|
|
559
|
+
| text | 要显示的文本 | String | — |
|
|
560
|
+
| width | 文本容器宽度 | String/Number | auto |
|
|
561
|
+
| max-width | 文本最大宽度 | String/Number | 100% |
|
|
562
|
+
| lines | 显示的行数 | Number | 1 |
|
|
563
|
+
| show-tooltip | 是否显示 tooltip | Boolean | true |
|
|
564
|
+
| copyable | 是否显示复制按钮 | Boolean | false |
|
|
565
|
+
|
|
566
|
+
## 🌍 国际化
|
|
567
|
+
|
|
568
|
+
### 使用方法
|
|
569
|
+
|
|
570
|
+
```javascript
|
|
571
|
+
import { setLang } from "tm-table";
|
|
572
|
+
|
|
573
|
+
// 设置语言
|
|
574
|
+
setLang("en-US"); // 英文
|
|
575
|
+
setLang("zh-CN"); // 中文(默认)
|
|
576
|
+
```
|
|
577
|
+
|
|
578
|
+
### 支持的语言
|
|
579
|
+
|
|
580
|
+
- 中文(zh-CN)
|
|
581
|
+
- 英文(en-US)
|
|
582
|
+
|
|
583
|
+
## 📊 数据格式规范
|
|
584
|
+
|
|
585
|
+
### 异步数据函数
|
|
586
|
+
|
|
587
|
+
当 data 属性传入函数时,函数接收参数并返回指定格式:
|
|
588
|
+
|
|
589
|
+
```javascript
|
|
590
|
+
async function loadData({ paginationInfo, params }) {
|
|
591
|
+
// paginationInfo: { current: 1, pageSize: 20 }
|
|
592
|
+
// params: 搜索表单的数据
|
|
593
|
+
|
|
594
|
+
return {
|
|
595
|
+
list: [], // 数据列表(必需)
|
|
596
|
+
total: 0, // 总条数(必需)
|
|
597
|
+
current: 1, // 当前页(可选)
|
|
598
|
+
pageSize: 20, // 每页条数(可选)
|
|
599
|
+
};
|
|
600
|
+
}
|
|
601
|
+
```
|
|
602
|
+
|
|
603
|
+
### 选项数据格式
|
|
604
|
+
|
|
605
|
+
所有选择类组件的选项支持:
|
|
606
|
+
|
|
607
|
+
```javascript
|
|
608
|
+
// 静态数组
|
|
609
|
+
options: [{ label: "显示文本", value: "值", disabled: false }];
|
|
610
|
+
|
|
611
|
+
// 异步函数
|
|
612
|
+
options: async () => {
|
|
613
|
+
const response = await fetch("/api/options");
|
|
614
|
+
return response.json();
|
|
615
|
+
};
|
|
616
|
+
```
|
|
617
|
+
|
|
618
|
+
## 📝 更新日志
|
|
619
|
+
|
|
620
|
+
### 1.0.82
|
|
621
|
+
|
|
622
|
+
- 新增 Vue3 支持
|
|
623
|
+
- 优化搜索组件
|
|
624
|
+
- 修复已知问题
|
|
625
|
+
|
|
626
|
+
## 📄 许可证
|
|
627
|
+
|
|
628
|
+
MIT
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@charset "UTF-8";.advanced-select[data-v-062139ab]{display:flex;max-width:305px}.advanced-select.hasField .select[data-v-062139ab]{width:206px;position:relative}.advanced-select.hasField .select[data-v-062139ab]:hover{z-index:1!important}.advanced-select.hasField[data-v-062139ab] .select--v2 .el-input__inner,.advanced-select.hasField[data-v-062139ab] .select--v3 .el-select__wrapper{border-top-left-radius:0;border-bottom-left-radius:0}.advanced-select .field-select[data-v-062139ab]{margin-right:-1px;width:100px;position:relative}.advanced-select .field-select[data-v-062139ab]:hover{z-index:1!important}.advanced-select[data-v-062139ab] .field-select--v2 .el-input__inner,.advanced-select[data-v-062139ab] .field-select--v3 .el-select__wrapper{border-top-right-radius:0;border-bottom-right-radius:0}.advanced-select .select[data-v-062139ab]{width:200px;flex-shrink:0}.advanced-select .select[data-v-062139ab] .el-tag--info{max-width:52%}.check-all-option[data-v-062139ab]{margin-top:-6px;padding:6px 20px;border-bottom:1px solid #ebeef5;cursor:default;position:sticky;top:0;z-index:1;background-color:#fff}.tm-icon[data-v-1c30ca93]{font-size:inherit;display:inline-block;height:1em;justify-content:center;line-height:1;position:relative;width:1em;fill:currentColor;color:inherit}.el-button .tm-icon{vertical-align:top}.el-table__row:hover .ellipsis-text-container .toolbar{display:flex;align-items:center;gap:2px}.el-table__row:hover .ellipsis-text-container .toolbar.multiline{display:block}.el-table__row:hover .ellipsis-text-container .toolbar .icon-item{flex-shrink:0}.el-table__row:hover .ellipsis-text-container .toolbar .icon-item:hover{color:var(--color-primary)!important}.ellipsis-text-container[data-v-b0e14655]{display:inline-flex;vertical-align:top}.ellipsis-text-container .toolbar[data-v-b0e14655]{display:none;max-width:30px}.ellipsis-text-container .toolbar .icon-item[data-v-b0e14655]{cursor:pointer;margin-left:2px}.ellipsis-text-container .toolbar .icon-item[data-v-b0e14655]:hover{opacity:.8}.ellipsis-text-container:hover .toolbar[data-v-b0e14655]{display:flex;align-items:center;gap:2px}.ellipsis-text-container:hover .toolbar.multiline[data-v-b0e14655]{display:block}.ellipsis-text-container:hover .toolbar .icon-item[data-v-b0e14655]:hover{color:var(--color-primary)!important}.tm-advanced-input[data-v-96a2075d]{display:flex;align-items:center}.tm-advanced-input .left-select[data-v-96a2075d]{margin-right:-1px}.tm-advanced-input.tm-advanced-input--v2[data-v-96a2075d] .left-select.el-select{margin-right:-1px;position:relative;z-index:2}.tm-advanced-input.tm-advanced-input--v2[data-v-96a2075d] .left-select.el-select .el-input__inner{transition:0s;border-top-right-radius:0;border-bottom-right-radius:0}.tm-advanced-input.tm-advanced-input--v2[data-v-96a2075d] .right-input.el-input{position:relative;z-index:1}.tm-advanced-input.tm-advanced-input--v2[data-v-96a2075d] .right-input.el-input:focus-within,.tm-advanced-input.tm-advanced-input--v2[data-v-96a2075d] .right-input.el-input:hover,.tm-advanced-input.tm-advanced-input--v2[data-v-96a2075d] .right-input.el-input:focus{z-index:3}.tm-advanced-input.tm-advanced-input--v2[data-v-96a2075d] .right-input.el-input.has-label .el-input__inner{transition:0s;border-top-left-radius:0;border-bottom-left-radius:0}.tm-advanced-input.tm-advanced-input--v3[data-v-96a2075d] .left-select.el-select .el-select__wrapper{border-top-right-radius:0;border-bottom-right-radius:0;position:relative;z-index:2;transition:0s}.tm-advanced-input.tm-advanced-input--v3[data-v-96a2075d] .right-input.el-input .el-input__wrapper{position:relative;z-index:1;transition:0s}.tm-advanced-input.tm-advanced-input--v3[data-v-96a2075d] .right-input.el-input .el-input__wrapper:focus-within,.tm-advanced-input.tm-advanced-input--v3[data-v-96a2075d] .right-input.el-input .el-input__wrapper:hover,.tm-advanced-input.tm-advanced-input--v3[data-v-96a2075d] .right-input.el-input .el-input__wrapper:focus{z-index:3}.tm-advanced-input.tm-advanced-input--v3[data-v-96a2075d] .right-input.el-input.has-label .el-input__wrapper{border-top-left-radius:0;border-bottom-left-radius:0}.popover-content .popover-title[data-v-96a2075d]{font-weight:700;margin-bottom:5px}.popover-content .popover-subtitle[data-v-96a2075d]{font-size:12px;color:#909399;margin-top:0;margin-bottom:10px}.popover-content .popover-footer[data-v-96a2075d]{margin-top:10px;text-align:right}.tm-advanced-input--v3 .input-label[data-v-96a2075d]{border-right:none;color:var(--el-input-text-color, var(--el-text-color-regular))}.tm-advanced-input--v2 .input-label[data-v-96a2075d]{border-right:none;color:#606266}.input-label[data-v-96a2075d]{height:100%;flex-shrink:0;width:100px;font-size:12px;box-sizing:border-box;display:flex;align-items:center;line-height:12px;border-right:none;border-top-left-radius:4px;border-bottom-left-radius:4px;justify-content:flex-end;padding-right:4px}.tm-date-picker--v2[data-v-3cd3ede3]{display:flex;align-items:center}.tm-date-picker--v2[data-v-3cd3ede3] .el-select{margin-right:-1px;z-index:1}.tm-date-picker--v2[data-v-3cd3ede3] .el-select .el-input__inner{border-top-right-radius:0;border-bottom-right-radius:0;transition:0s}.tm-date-picker--v2[data-v-3cd3ede3] .el-date-editor.el-input__inner{border-top-left-radius:0!important;border-bottom-left-radius:0!important}.tm-date-picker--v2[data-v-3cd3ede3] .el-date-editor{transition:0s}.tm-date-picker--v2[data-v-3cd3ede3] .el-date-editor.is-active,.tm-date-picker--v2[data-v-3cd3ede3] .el-date-editor:hover{z-index:2}.tm-date-picker--v3[data-v-3cd3ede3] .el-select{margin-right:-1px}.tm-date-picker--v3[data-v-3cd3ede3] .el-select .el-select__wrapper{border-top-right-radius:0;border-bottom-right-radius:0;position:relative;z-index:2;transition:0s}.tm-date-picker--v3[data-v-3cd3ede3] .el-date-editor{position:relative;border-top-left-radius:0!important;border-bottom-left-radius:0!important;z-index:1;transition:0s}.tm-date-picker--v3[data-v-3cd3ede3] .el-date-editor.focus-within,.tm-date-picker--v3[data-v-3cd3ede3] .el-date-editor.focus,.tm-date-picker--v3[data-v-3cd3ede3] .el-date-editor.is-active,.tm-date-picker--v3[data-v-3cd3ede3] .el-date-editor:hover{z-index:2}.tm-cascader--v2 .el-input--mini input{height:28px!important}.tm-cascader--v2 .el-cascader__tags .el-tag{margin:4px 0 4px 6px}.tm-cascader--v2 .el-cascader__tags .el-tag:first-child{max-width:90px}.tm-cascader--v2 .el-cascader__tags .el-tag:nth-child(2){max-width:48px}.tm-cascader--v2 .el-cascader__tags input{font-size:12px!important}.tm-cascader--v2 .el-cascader__tags .el-cascader__search-input{min-width:16px}.tm-cascader--v3 .el-cascader__tags{font-size:12px;flex-wrap:nowrap;align-items:center}.tm-cascader--v3 .el-cascader__tags .el-tag{padding:0 4px}.tm-cascader--v3 .el-cascader__tags .el-tag:first-child{max-width:90px}.tm-cascader--v3 .el-cascader__tags .el-tag:nth-child(2){max-width:48px}.tm-cascader--v3 .el-cascader__tags .el-cascader__search-input{min-width:16px}.el-cascader__collapse-tags{max-height:400px;max-width:400px;margin:0 -11px;padding:0 11px;overflow-y:auto;display:flex;flex-wrap:wrap;gap:4px}[data-v-61fed13d] .el-radio-button__inner{font-weight:400}.tm-radio[data-v-61fed13d]{width:200px;display:flex;width:100%}.tm-radio.wide-mode[data-v-61fed13d]{width:305px}.tm-radio--v2[data-v-61fed13d] .el-radio-group .el-radio-button{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tm-radio--v2[data-v-61fed13d] .el-radio-group .el-radio-button .el-radio-button__inner{padding:7px 5px;width:100%;display:inline-block;text-overflow:ellipsis;overflow:hidden;box-sizing:border-box;text-align:center}.tm-radio--v3[data-v-61fed13d] .el-radio-group .el-radio-button .el-radio-button__inner{width:100%}.tm-checkbox[data-v-b44866b1]{width:200px;display:flex;flex-direction:column}.tm-checkbox.wide-mode[data-v-b44866b1]{width:305px}.tm-checkbox--v2[data-v-b44866b1] .el-checkbox-group{display:flex;width:100%}.tm-checkbox--v2[data-v-b44866b1] .el-checkbox-group .el-checkbox-button{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tm-checkbox--v2[data-v-b44866b1] .el-checkbox-group .el-checkbox-button .el-checkbox-button__inner{padding:7px 5px;width:100%;display:inline-block;text-overflow:ellipsis;overflow:hidden;box-sizing:border-box;text-align:center}.tm-checkbox--v3[data-v-b44866b1] .el-checkbox-group .el-checkbox-button .el-checkbox-button__inner{width:100%}.tm-switch[data-v-9e7a342f]{display:flex;align-items:center}.tm-switch.narrow-container[data-v-9e7a342f]{width:95px}.tm-switch.medium-container[data-v-9e7a342f]{width:200px}.tm-switch.wide-container[data-v-9e7a342f]{width:305px}.tm-switch[data-v-9e7a342f] .el-switch .el-switch__core{flex-shrink:0}.table-search[data-v-572f884b]{--el-font-size-base: 12px}.table-search[data-v-572f884b] .el-select__wrapper,.table-search[data-v-572f884b] .el-switch__label{font-size:var(--el-font-size-base);font-weight:400}.table-search[data-v-572f884b] .el-radio-button__inner,.table-search[data-v-572f884b] .el-checkbox-button__inner{padding:9px 10px}.table-search[data-v-572f884b]{margin-bottom:10px;display:flex;flex-wrap:wrap;align-items:center}.table-search .search-content[data-v-572f884b]{flex:1;display:flex;align-items:center;flex-wrap:wrap;gap:10px}.table-search .search-actions[data-v-572f884b]{display:flex}.table-search .search-error-message[data-v-572f884b]{color:#f56c6c;font-size:12px;margin:5px 0}.table-search--v2 .search-form-item[data-v-572f884b]{height:28px}.table-search--v3 .search-form-item[data-v-572f884b]{height:24px}.tm-pagination[data-v-4dbdf6e7]{padding:10px 0;text-align:right;display:flex;flex-direction:row-reverse}.tm-table-menu[data-v-579dd2c3]{display:flex;justify-content:space-between;margin-bottom:10px}.tm-table-menu .left[data-v-579dd2c3]{flex:1;margin-right:10px;display:flex;flex-wrap:wrap;gap:4px 0}.tm-table-menu .right[data-v-579dd2c3]{flex-shrink:0}.column-config-popover{padding:0!important}.title[data-v-f3445124]{display:flex;align-items:center;font-weight:700;color:#000;height:32px;padding-left:10px;padding-top:10px}.container[data-v-f3445124]{height:500px;width:100%;display:flex;flex-direction:column}.container .main-container[data-v-f3445124]{display:flex;flex:1;overflow:hidden;border-bottom:1px solid #dcdfe9}.container .main-container .left-content[data-v-f3445124]{flex:2;border-right:1px solid #dcdfe9;display:flex;flex-direction:column}.container .main-container .left-content .option-list[data-v-f3445124]{flex:1;overflow-y:auto}.container .main-container .right-content[data-v-f3445124]{flex:1;overflow-y:auto;display:flex;flex-direction:column;overflow:hidden}.container .main-container .right-content .search-box[data-v-f3445124]{display:flex;align-items:center;height:33px;border-bottom:1px solid #dcdfe9;box-sizing:border-box}.container .main-container .right-content .search-box[data-v-f3445124] .el-input__inner{box-shadow:none;border:none}.container .main-container .right-content .search-box[data-v-f3445124] .el-input__wrapper{box-shadow:none}.container .main-container .right-content .sort-list[data-v-f3445124]{flex:1;overflow-y:auto}.container .main-container .right-content .sort-list .sort-item-wrapper[data-v-f3445124]{position:relative;transition:background-color .2s}.container .main-container .right-content .sort-list .sort-item-wrapper[data-v-f3445124]:hover{background-color:#e0eeff}.container .main-container .right-content .sort-list .sort-item-wrapper:hover .delete-button[data-v-f3445124],.container .main-container .right-content .sort-list .sort-item-wrapper:hover .top-button[data-v-f3445124],.container .main-container .right-content .sort-list .sort-item-wrapper:hover .left-fixed-btn[data-v-f3445124]:not(.active-fixed),.container .main-container .right-content .sort-list .sort-item-wrapper:hover .right-fixed-btn[data-v-f3445124]:not(.active-fixed){display:inline-block!important}.container .main-container .right-content .sort-list .sort-item-wrapper.no-drop-zone[data-v-f3445124]{position:relative}.container .main-container .right-content .sort-list .sort-item-wrapper.no-drop-zone[data-v-f3445124]:after{content:"";position:absolute;top:0;left:0;right:0;bottom:0;background:#ff00001a;border:1px dashed #f56c6c;pointer-events:none}.container .main-container .right-content .sort-list .sort-item-wrapper.frozen[data-v-f3445124]:hover,.container .main-container .right-content .sort-list .sort-item-wrapper.frozenRight[data-v-f3445124]:hover{background-color:#e0eeff}.container .main-container .right-content .sort-list .sort-item[data-v-f3445124]{display:flex;align-items:center;width:100%;height:32px;box-sizing:border-box;padding:0 8px;transition:.2s;-webkit-user-select:none;user-select:none}.container .main-container .right-content .sort-list .sort-item .row-title[data-v-f3445124]{cursor:grab;flex:1;margin-right:8px;display:flex;align-items:center;gap:4px}.container .main-container .right-content .sort-list .sort-item .operation-btns[data-v-f3445124]{display:flex;align-items:center}.container .main-container .right-content .sort-list .sort-item .operation-btns .iconfont-button[data-v-f3445124]{margin-left:3px;padding:0}.container .main-container .right-content .sort-list .sort-item .operation-btns .delete-button[data-v-f3445124],.container .main-container .right-content .sort-list .sort-item .operation-btns .top-button[data-v-f3445124],.container .main-container .right-content .sort-list .sort-item .operation-btns .left-fixed-btn[data-v-f3445124]:not(.active-fixed),.container .main-container .right-content .sort-list .sort-item .operation-btns .right-fixed-btn[data-v-f3445124]:not(.active-fixed){display:none}.container .main-container .right-content .sort-list .sort-item .operation-btns .left-fixed-btn.active-fixed[data-v-f3445124],.container .main-container .right-content .sort-list .sort-item .operation-btns .right-fixed-btn.active-fixed[data-v-f3445124]{display:inline-block;color:var(--el-color-primary)}.container .main-container .right-content .sort-list .sort-item .operation-btns .iconfont[data-v-f3445124]{color:#aaa;font-size:14px}.container .main-container .right-content .sort-list .sort-item .operation-btns .iconfont[data-v-f3445124]:hover{color:var(--el-color-primary)}.container .main-container .right-content .sort-list .sort-item .operation-btns .left-fixed-btn .el-icon-position[data-v-f3445124]{transform:rotate(-90deg)}.container .main-container .right-content .sort-list .sort-item .operation-btns .left-fixed-btn:hover .el-icon-position[data-v-f3445124]{color:var(--el-color-primary)}.container .main-container .right-content .sort-list .sort-item .operation-btns .right-fixed-btn .el-icon-position[data-v-f3445124]{transform:rotate(90deg)}.container .main-container .right-content .sort-list .sort-item .operation-btns .right-fixed-btn:hover .el-icon-position[data-v-f3445124]{color:var(--el-color-primary)}.container .footer[data-v-f3445124]{padding:10px;box-sizing:border-box;display:flex;justify-content:space-between}.el-checkbox[data-v-f3445124]{white-space:wrap;min-height:14px;height:auto;margin-top:10px;margin-left:10px;font-weight:400}.el-checkbox[data-v-f3445124] .el-checkbox__label{width:70px;vertical-align:top}.blue-background-class[data-v-f3445124]{background-color:#e0eeff!important;box-shadow:0 2px 8px #0000001a;z-index:1000}.sortable-drag[data-v-f3445124]{opacity:.9;background-color:#e0eeff!important;box-shadow:0 2px 8px #0000001a}.tips[data-v-f3445124]{color:#999;line-height:16px;font-size:12px;padding:8px}.tips span[data-v-f3445124],.tips span span[data-v-f3445124]{color:#999}.icon-item[data-v-16643222]{cursor:pointer}.icon-item[data-v-16643222]:hover{opacity:.6}.tm-ellipsis-text[data-v-16643222]{position:relative;overflow:hidden}.tm-ellipsis-text .tm-ellipsis-text-wrapper[data-v-16643222]{width:100%}.tm-ellipsis-text .tm-ellipsis-text-wrapper .tm-ellipsis-line[data-v-16643222]{line-height:inherit;word-break:break-all;white-space:normal}.tm-ellipsis-text .tm-ellipsis-text-wrapper .tm-ellipsis-last-line[data-v-16643222]{display:flex;align-items:center;line-height:inherit}.tm-ellipsis-text .tm-ellipsis-text-wrapper .tm-ellipsis-last-line .tm-ellipsis-text-part[data-v-16643222]{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-break:break-all}.tm-ellipsis-text .tm-ellipsis-text-wrapper .tm-ellipsis-last-line .tm-ellipsis-toolbar-part[data-v-16643222]{flex-shrink:0;margin-left:4px;display:flex;align-items:center;line-height:inherit;font-size:inherit}.tm-ellipsis-measure[data-v-16643222]{position:absolute;left:-9999px;top:-9999px;visibility:hidden;pointer-events:none;z-index:-1}
|