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 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}