vxe-table 3.20.7 → 3.20.8

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.
Files changed (144) hide show
  1. package/LICENSE +20 -20
  2. package/README.md +106 -106
  3. package/es/index.esm.js +2 -1
  4. package/es/style.css +1 -1
  5. package/es/table/src/methods.js +75 -78
  6. package/es/table/src/table.js +10 -1
  7. package/es/table/src/util.js +6 -0
  8. package/es/table/style.css +18 -48
  9. package/es/ui/index.js +1 -1
  10. package/es/ui/src/dom.js +19 -20
  11. package/es/ui/src/log.js +1 -1
  12. package/es/vxe-table/style.css +18 -48
  13. package/lib/index.common.js +2 -1
  14. package/lib/index.umd.js +1912 -3228
  15. package/lib/index.umd.min.js +1 -1
  16. package/lib/style.css +1 -1
  17. package/lib/table/src/methods.js +12 -10
  18. package/lib/table/src/methods.min.js +1 -1
  19. package/lib/table/src/table.js +9 -1
  20. package/lib/table/src/table.min.js +1 -1
  21. package/lib/table/src/util.js +6 -0
  22. package/lib/table/src/util.min.js +1 -1
  23. package/lib/table/style/style.css +18 -48
  24. package/lib/ui/index.js +1 -1
  25. package/lib/ui/index.min.js +1 -1
  26. package/lib/ui/src/dom.js +21 -20
  27. package/lib/ui/src/dom.min.js +1 -1
  28. package/lib/ui/src/log.js +1 -1
  29. package/lib/ui/src/log.min.js +1 -1
  30. package/lib/v-x-e-table/index.js +2 -1
  31. package/lib/v-x-e-table/index.min.js +1 -1
  32. package/lib/vxe-colgroup/index.js +2 -1
  33. package/lib/vxe-colgroup/index.min.js +1 -1
  34. package/lib/vxe-column/index.js +2 -1
  35. package/lib/vxe-column/index.min.js +1 -1
  36. package/lib/vxe-grid/index.js +2 -1
  37. package/lib/vxe-grid/index.min.js +1 -1
  38. package/lib/vxe-table/index.js +2 -1
  39. package/lib/vxe-table/index.min.js +1 -1
  40. package/lib/vxe-table/style/style.css +18 -48
  41. package/lib/vxe-toolbar/index.js +2 -1
  42. package/lib/vxe-toolbar/index.min.js +1 -1
  43. package/lib/vxe-ui/index.js +2 -1
  44. package/lib/vxe-ui/index.min.js +1 -1
  45. package/lib/vxe-v-x-e-table/index.js +2 -1
  46. package/lib/vxe-v-x-e-table/index.min.js +1 -1
  47. package/package.json +93 -93
  48. package/packages/colgroup/index.ts +22 -22
  49. package/packages/column/index.ts +22 -22
  50. package/packages/components.ts +42 -42
  51. package/packages/grid/index.ts +22 -22
  52. package/packages/grid/src/grid.ts +1935 -1935
  53. package/packages/index.ts +4 -4
  54. package/packages/locale/lang/ar-EG.ts +832 -832
  55. package/packages/locale/lang/de-DE.ts +832 -832
  56. package/packages/locale/lang/en-US.ts +832 -832
  57. package/packages/locale/lang/es-ES.ts +832 -832
  58. package/packages/locale/lang/fr-FR.ts +832 -832
  59. package/packages/locale/lang/hu-HU.ts +832 -832
  60. package/packages/locale/lang/hy-AM.ts +832 -832
  61. package/packages/locale/lang/id-ID.ts +832 -832
  62. package/packages/locale/lang/it-IT.ts +832 -832
  63. package/packages/locale/lang/ja-JP.ts +832 -832
  64. package/packages/locale/lang/ko-KR.ts +832 -832
  65. package/packages/locale/lang/ms-MY.ts +832 -832
  66. package/packages/locale/lang/nb-NO.ts +832 -832
  67. package/packages/locale/lang/pt-BR.ts +832 -832
  68. package/packages/locale/lang/ru-RU.ts +832 -832
  69. package/packages/locale/lang/th-TH.ts +832 -832
  70. package/packages/locale/lang/ug-CN.ts +832 -832
  71. package/packages/locale/lang/uk-UA.ts +832 -832
  72. package/packages/locale/lang/uz-UZ.ts +832 -832
  73. package/packages/locale/lang/vi-VN.ts +832 -832
  74. package/packages/locale/lang/zh-CHT.ts +832 -832
  75. package/packages/locale/lang/zh-CN.ts +832 -832
  76. package/packages/locale/lang/zh-HK.ts +3 -3
  77. package/packages/locale/lang/zh-MO.ts +3 -3
  78. package/packages/locale/lang/zh-TC.ts +3 -3
  79. package/packages/locale/lang/zh-TW.ts +3 -3
  80. package/packages/table/index.ts +49 -49
  81. package/packages/table/module/custom/mixin.ts +369 -369
  82. package/packages/table/module/custom/panel.ts +1461 -1461
  83. package/packages/table/module/edit/mixin.ts +1123 -1123
  84. package/packages/table/module/export/export-panel.ts +658 -658
  85. package/packages/table/module/export/import-panel.ts +319 -319
  86. package/packages/table/module/export/mixin.ts +1693 -1693
  87. package/packages/table/module/export/util.ts +24 -24
  88. package/packages/table/module/filter/mixin.ts +507 -507
  89. package/packages/table/module/filter/panel.ts +329 -329
  90. package/packages/table/module/keyboard/mixin.ts +513 -513
  91. package/packages/table/module/menu/mixin.ts +329 -329
  92. package/packages/table/module/menu/panel.ts +212 -212
  93. package/packages/table/module/validator/mixin.ts +626 -626
  94. package/packages/table/render/index.ts +1456 -1456
  95. package/packages/table/src/body.ts +969 -969
  96. package/packages/table/src/cell.ts +1285 -1285
  97. package/packages/table/src/column.ts +205 -205
  98. package/packages/table/src/columnInfo.ts +228 -228
  99. package/packages/table/src/footer.ts +388 -388
  100. package/packages/table/src/group.ts +51 -51
  101. package/packages/table/src/header.ts +602 -602
  102. package/packages/table/src/methods.ts +12936 -12939
  103. package/packages/table/src/props.ts +311 -311
  104. package/packages/table/src/store.ts +15 -15
  105. package/packages/table/src/table.ts +2513 -2505
  106. package/packages/table/src/util.ts +1018 -1012
  107. package/packages/toolbar/index.ts +18 -18
  108. package/packages/toolbar/src/toolbar.ts +856 -856
  109. package/packages/ui/index.ts +530 -530
  110. package/packages/ui/src/anime.ts +52 -52
  111. package/packages/ui/src/comp.ts +3 -3
  112. package/packages/ui/src/dom.ts +237 -236
  113. package/packages/ui/src/log.ts +8 -8
  114. package/packages/ui/src/utils.ts +56 -56
  115. package/packages/ui/src/vn.ts +65 -65
  116. package/packages/v-x-e-table/index.ts +4 -4
  117. package/styles/all.scss +7 -7
  118. package/styles/base.scss +16 -16
  119. package/styles/components/grid.scss +89 -89
  120. package/styles/components/icon.scss +225 -225
  121. package/styles/components/old-icon.scss +715 -715
  122. package/styles/components/table-module/all.scss +6 -6
  123. package/styles/components/table-module/custom.scss +527 -527
  124. package/styles/components/table-module/export.scss +130 -130
  125. package/styles/components/table-module/filter.scss +130 -130
  126. package/styles/components/table-module/menu.scss +81 -81
  127. package/styles/components/table.scss +2679 -2679
  128. package/styles/components/toolbar.scss +119 -119
  129. package/styles/default.scss +2 -2
  130. package/styles/helpers/baseMixin.scss +95 -95
  131. package/styles/index.scss +3 -3
  132. package/styles/modules.scss +5 -5
  133. package/styles/theme/base.scss +93 -93
  134. package/styles/theme/dark.scss +49 -49
  135. package/styles/theme/light.scss +44 -44
  136. package/styles/variable.scss +43 -43
  137. package/types/all.d.ts +53 -53
  138. package/types/index.d.ts +4 -4
  139. /package/es/{iconfont.1773991883171.ttf → iconfont.1774240303597.ttf} +0 -0
  140. /package/es/{iconfont.1773991883171.woff → iconfont.1774240303597.woff} +0 -0
  141. /package/es/{iconfont.1773991883171.woff2 → iconfont.1774240303597.woff2} +0 -0
  142. /package/lib/{iconfont.1773991883171.ttf → iconfont.1774240303597.ttf} +0 -0
  143. /package/lib/{iconfont.1773991883171.woff → iconfont.1774240303597.woff} +0 -0
  144. /package/lib/{iconfont.1773991883171.woff2 → iconfont.1774240303597.woff2} +0 -0
@@ -1,1012 +1,1018 @@
1
- import XEUtils from 'xe-utils'
2
- import { ColumnInfo } from './columnInfo'
3
- import { isScale, isPx, queryElement } from '../../ui/src/dom'
4
- import { warnLog, errLog } from '../../ui/src/log'
5
- import { eqEmptyValue } from '../../ui/src/utils'
6
-
7
- import type { VxeTableDefines, VxeTableConstructor, TableReactData, TableInternalData, VxeTablePrivateMethods, VxeTablePropTypes } from '../../../types'
8
-
9
- export function createInternalData (): TableInternalData {
10
- return {
11
- tZindex: 0,
12
- currKeyField: '',
13
- isCurrDeepKey: false,
14
- elemStore: {},
15
- // 存放横向 X 虚拟滚动相关的信息
16
- scrollXStore: {
17
- preloadSize: 0,
18
- offsetSize: 0,
19
- visibleSize: 0,
20
- visibleStartIndex: 0,
21
- visibleEndIndex: 0,
22
- startIndex: 0,
23
- endIndex: 0
24
- },
25
- // 存放纵向 Y 虚拟滚动相关信息
26
- scrollYStore: {
27
- preloadSize: 0,
28
- offsetSize: 0,
29
- visibleSize: 0,
30
- visibleStartIndex: 0,
31
- visibleEndIndex: 0,
32
- startIndex: 0,
33
- endIndex: 0
34
- },
35
- // 表格宽度
36
- tableWidth: 0,
37
- // 表格高度
38
- tableHeight: 0,
39
- customHeight: 0,
40
- customMinHeight: 0,
41
- customMaxHeight: 0,
42
- // 当前 hover 行
43
- hoverRow: null,
44
- // 最后滚动位置
45
- lastScrollLeft: 0,
46
- lastScrollTop: 0,
47
- // 单选框属性,已选中保留的行
48
- radioReserveRow: null,
49
- // 复选框属性,已选中保留的行集合
50
- checkboxReserveRowMap: {},
51
- // 行数据,已展开保留的行集合
52
- rowExpandedReserveRowMap: {},
53
- // 树结构数据,已展开保留的行集合
54
- treeExpandedReserveRowMap: {},
55
- // 树结构数据,不确定状态的集合
56
- treeIndeterminateRowMaps: {},
57
- // 列表完整数据、条件处理后
58
- tableFullData: [],
59
- afterFullData: [],
60
- afterTreeFullData: [],
61
- afterGroupFullData: [],
62
- // 列表条件处理后数据集合
63
- afterFullRowMaps: {},
64
- // 树结构完整数据、条件处理后
65
- tableFullTreeData: [],
66
- // 行分组全量数据、条件处理后
67
- tableFullGroupData: [],
68
- tableSynchData: [],
69
- tableSourceData: [],
70
- // 收集的列配置(带分组)
71
- collectColumn: [],
72
- // 完整所有列(不带分组)
73
- tableFullColumn: [],
74
- // 渲染所有列
75
- visibleColumn: [],
76
-
77
- // 全量数据集(包括当前和已删除)
78
- fullAllDataRowIdData: {},
79
- // 数据集(仅当前)
80
- fullDataRowIdData: {},
81
- // 数据集(仅可视)
82
- visibleDataRowIdData: {},
83
-
84
- keepUpdateFieldMaps: {},
85
-
86
- footerFullDataRowData: {},
87
-
88
- // 渲染中缓存数据
89
- sourceDataRowIdData: {},
90
- fullColumnIdData: {},
91
- fullColumnFieldData: {},
92
-
93
- // 合并表头单元格的数据
94
- mergeHeaderList: [],
95
- mergeHeaderMaps: {},
96
- // 已合并单元格数据集合
97
- mergeHeaderCellMaps: {},
98
- // 合并单元格的数据
99
- mergeBodyList: [],
100
- mergeBodyMaps: {},
101
- // 已合并单元格数据集合
102
- mergeBodyCellMaps: {},
103
- // 合并表尾的数据
104
- mergeFooterList: [],
105
- mergeFooterMaps: {},
106
- // 已合并表尾数据集合
107
- mergeFooterCellMaps: {},
108
-
109
- // 已展开的行集合
110
- rowExpandedMaps: {},
111
- // 懒加载中的展开行的集合
112
- rowExpandLazyLoadedMaps: {},
113
- // 已展开的分组行
114
- rowGroupExpandedMaps: {},
115
- // 已展开树节点集合
116
- treeExpandedMaps: {},
117
- // 懒加载中的树节点的集合
118
- treeExpandLazyLoadedMaps: {},
119
- // 复选框属性,已选中的行集合
120
- selectCheckboxMaps: {},
121
- // 已标记的对象集
122
- pendingRowMaps: {},
123
- // 已新增的临时行
124
- insertRowMaps: {},
125
- // 已删除行
126
- removeRowMaps: {},
127
-
128
- cvCacheMaps: {},
129
-
130
- // 表头高度
131
- tHeaderHeight: 0,
132
- // 表体高度
133
- tBodyHeight: 0,
134
- // 表尾高度
135
- tFooterHeight: 0,
136
-
137
- teleportToWrapperElem: null,
138
- popupToWrapperElem: null,
139
-
140
- lastSTime: 0,
141
-
142
- inited: false,
143
- tooltipTimeout: null,
144
- initStatus: false,
145
- isActivated: false
146
-
147
- // _sToTime: null
148
- }
149
- }
150
-
151
- export function createReactData (): TableReactData {
152
- return {
153
- updateColFlag: 0,
154
- // 低性能的静态列
155
- staticColumns: [],
156
- // 渲染的列分组
157
- tableGroupColumn: [],
158
- // 可视区渲染的列
159
- tableColumn: [],
160
- // 渲染中的数据
161
- tableData: [],
162
- // 是否启用了横向 X 可视渲染方式加载
163
- scrollXLoad: false,
164
- // 是否启用了纵向 Y 可视渲染方式加载
165
- scrollYLoad: false,
166
- // 是否存在纵向滚动条
167
- overflowY: true,
168
- // 是否存在横向滚动条
169
- overflowX: false,
170
- // 纵向滚动条的宽度
171
- scrollbarWidth: 0,
172
- // 横向滚动条的高度
173
- scrollbarHeight: 0,
174
- // 行高
175
- rowHeight: 0,
176
- // 表格父容器的高度
177
- parentHeight: 0,
178
- // 是否使用分组表头
179
- isGroup: false,
180
- isAllOverflow: false,
181
- // 复选框属性,是否全选
182
- isAllSelected: false,
183
- // 复选框属性,有选中且非全选状态
184
- isIndeterminate: false,
185
- // 当前行
186
- currentRow: null,
187
- // 单选框属性,选中列
188
- currentColumn: null,
189
- // 单选框属性,选中行
190
- selectRadioRow: null,
191
- // 表尾合计数据
192
- footerTableData: [],
193
- // 行分组列信息
194
- rowGroupColumn: null,
195
- // 展开列信息
196
- expandColumn: null,
197
- checkboxColumn: null,
198
- radioColumn: null,
199
- // 树节点列信息
200
- treeNodeColumn: null,
201
- hasFixedColumn: false,
202
- // 刷新列标识,当列筛选被改变时,触发表格刷新数据
203
- upDataFlag: 0,
204
- // 刷新列标识,当列的特定属性被改变时,触发表格刷新列
205
- reColumnFlag: 0,
206
- // 初始化标识
207
- initStore: {
208
- filter: false,
209
- import: false,
210
- export: false,
211
- custom: false
212
- },
213
- // 自定义列相关的信息
214
- customStore: {
215
- btnEl: null,
216
- isAll: false,
217
- isIndeterminate: false,
218
- activeBtn: false,
219
- activeWrapper: false,
220
- visible: false,
221
- maxHeight: null,
222
- popupTop: 0,
223
- oldSortMaps: {},
224
- oldFixedMaps: {},
225
- oldVisibleMaps: {}
226
- },
227
- customColumnList: [],
228
- // 当前选中的筛选列
229
- filterStore: {
230
- isAllSelected: false,
231
- isIndeterminate: false,
232
- style: null,
233
- column: null,
234
- visible: false,
235
- maxHeight: null
236
- },
237
- // 存放列相关的信息
238
- columnStore: {
239
- leftList: [],
240
- centerList: [],
241
- rightList: [],
242
- resizeList: [],
243
- pxList: [],
244
- pxMinList: [],
245
- autoMinList: [],
246
- scaleList: [],
247
- scaleMinList: [],
248
- autoList: [],
249
- remainList: []
250
- },
251
- // 存放快捷菜单的信息
252
- ctxMenuStore: {
253
- selected: null,
254
- visible: false,
255
- showChild: false,
256
- selectChild: null,
257
- list: [],
258
- style: null
259
- },
260
- // 存放可编辑相关信息
261
- editStore: {
262
- indexs: {
263
- columns: []
264
- },
265
- titles: {
266
- columns: []
267
- },
268
- // 选中源
269
- selected: {
270
- row: null,
271
- column: null
272
- },
273
- // 已复制源
274
- copyed: {
275
- cut: false,
276
- rows: [],
277
- columns: []
278
- },
279
- // 激活
280
- actived: {
281
- row: null,
282
- column: null
283
- },
284
- // 当前被强制聚焦单元格,只会在鼠标点击后算聚焦
285
- focused: {
286
- row: null,
287
- column: null
288
- }
289
- },
290
- // 存放 tooltip 相关信息
291
- tooltipStore: {
292
- row: null,
293
- column: null,
294
- content: null,
295
- visible: false,
296
- type: null,
297
- currOpts: {}
298
- },
299
- // 存放数据校验相关信息
300
- validStore: {
301
- visible: false
302
- },
303
- validErrorMaps: {},
304
- // 导入相关信息
305
- importStore: {
306
- inited: false,
307
- file: null,
308
- type: '',
309
- modeList: [],
310
- typeList: [],
311
- filename: '',
312
- visible: false
313
- },
314
- importParams: {
315
- mode: '',
316
- types: null,
317
- message: true
318
- },
319
- // 导出相关信息
320
- exportStore: {
321
- inited: false,
322
- name: '',
323
- modeList: [],
324
- typeList: [],
325
- columns: [],
326
- isPrint: false,
327
- hasFooter: false,
328
- hasMerge: false,
329
- hasTree: false,
330
- hasColgroup: false,
331
- visible: false
332
- },
333
- exportParams: {
334
- filename: '',
335
- sheetName: '',
336
- mode: '',
337
- type: '',
338
- isColgroup: false,
339
- isMerge: false,
340
- isAllExpand: false,
341
- useStyle: false,
342
- original: false,
343
- message: true,
344
- isHeader: false,
345
- isTitle: false,
346
- isFooter: false
347
- },
348
-
349
- visiblwRowsFlag: 1,
350
-
351
- isRowGroupStatus: false,
352
- rowGroupList: [],
353
- aggHandleFields: [],
354
- aggHandleAggColumns: [],
355
-
356
- rowGroupExpandedFlag: 1,
357
- rowExpandedFlag: 1,
358
- treeExpandedFlag: 1,
359
- updateCheckboxFlag: 1,
360
- pendingRowFlag: 1,
361
- insertRowFlag: 1,
362
- removeRowFlag: 1,
363
-
364
- mergeHeadFlag: 1,
365
- mergeBodyFlag: 1,
366
- mergeFootFlag: 1,
367
-
368
- rowHeightStore: {
369
- large: 52,
370
- default: 48,
371
- medium: 44,
372
- small: 40,
373
- mini: 36
374
- },
375
-
376
- scrollVMLoading: false,
377
- scrollYHeight: 0,
378
- scrollYTop: 0,
379
- isScrollYBig: false,
380
- scrollXLeft: 0,
381
- scrollXWidth: 0,
382
- isScrollXBig: false,
383
-
384
- lazScrollLoading: false,
385
-
386
- rowExpandHeightFlag: 1,
387
- calcCellHeightFlag: 1,
388
- resizeHeightFlag: 1,
389
- resizeWidthFlag: 1,
390
-
391
- isCustomStatus: false,
392
-
393
- isCrossDragRow: false,
394
- dragRow: null,
395
- isCrossDragCol: false,
396
- dragCol: null,
397
- dragTipText: '',
398
-
399
- isDragResize: false,
400
- isRowLoading: false,
401
- isColLoading: false
402
- }
403
- }
404
-
405
- const getAllConvertColumns = (columns: any, parentColumn?: any) => {
406
- const result: any[] = []
407
- columns.forEach((column: any) => {
408
- column.parentId = parentColumn ? parentColumn.id : null
409
- if (column.visible) {
410
- if (column.children && column.children.length && column.children.some((column: any) => column.visible)) {
411
- result.push(column)
412
- result.push(...getAllConvertColumns(column.children, column))
413
- } else {
414
- result.push(column)
415
- }
416
- }
417
- })
418
- return result
419
- }
420
-
421
- export const convertHeaderColumnToRows = (originColumns: any) => {
422
- let maxLevel = 1
423
- const traverse = (column: any, parent?: any) => {
424
- if (parent) {
425
- column.level = parent.level + 1
426
- if (maxLevel < column.level) {
427
- maxLevel = column.level
428
- }
429
- }
430
- if (column.children && column.children.length && column.children.some((column: any) => column.visible)) {
431
- let colSpan = 0
432
- column.children.forEach((subColumn: any) => {
433
- if (subColumn.visible) {
434
- traverse(subColumn, column)
435
- colSpan += subColumn.colSpan
436
- }
437
- })
438
- column.colSpan = colSpan
439
- } else {
440
- column.colSpan = 1
441
- }
442
- }
443
-
444
- originColumns.forEach((column: any) => {
445
- column.level = 1
446
- traverse(column)
447
- })
448
-
449
- const rows: any[] = []
450
- for (let i = 0; i < maxLevel; i++) {
451
- rows.push([])
452
- }
453
-
454
- const allColumns = getAllConvertColumns(originColumns)
455
-
456
- allColumns.forEach((column) => {
457
- if (column.children && column.children.length && column.children.some((column: any) => column.visible)) {
458
- column.rowSpan = 1
459
- } else {
460
- column.rowSpan = maxLevel - column.level + 1
461
- }
462
- rows[column.level - 1].push(column)
463
- })
464
-
465
- return rows
466
- }
467
-
468
- export function convertHeaderToGridRows (spanColumns: VxeTableDefines.ColumnInfo[][]) {
469
- const rSize = spanColumns.length
470
- const cSize = spanColumns[0].reduce((sum, cell) => sum + cell.colSpan, 0)
471
-
472
- const occupiedRows: boolean[][] = []
473
- const fullRows: any[][] = []
474
- for (let rIndex = 0; rIndex < rSize; rIndex++) {
475
- const oCols: boolean[] = []
476
- const dCols: string[] = []
477
- for (let cIndex = 0; cIndex < cSize; cIndex++) {
478
- oCols.push(false)
479
- dCols.push('')
480
- }
481
- occupiedRows.push(oCols)
482
- fullRows.push(dCols)
483
- }
484
-
485
- for (let rIndex = 0; rIndex < rSize; rIndex++) {
486
- let currColIndex = 0
487
- for (const column of spanColumns[rIndex]) {
488
- const { colSpan, rowSpan } = column
489
- let startColIndex = -1
490
- for (let ccIndex = currColIndex; ccIndex <= cSize - colSpan; ccIndex++) {
491
- let oFlag = true
492
- for (let csIndex = 0; csIndex < colSpan; csIndex++) {
493
- if (occupiedRows[rIndex][ccIndex + csIndex]) {
494
- oFlag = false
495
- break
496
- }
497
- }
498
- if (oFlag) {
499
- startColIndex = ccIndex
500
- break
501
- }
502
- }
503
- if (startColIndex === -1) {
504
- for (let j = 0; j <= cSize - colSpan; j++) {
505
- let oFlag = true
506
- for (let k = 0; k < colSpan; k++) {
507
- if (occupiedRows[rIndex][j + k]) {
508
- oFlag = false
509
- break
510
- }
511
- }
512
- if (oFlag) {
513
- startColIndex = j
514
- break
515
- }
516
- }
517
- if (startColIndex === -1) {
518
- // error
519
- break
520
- }
521
- }
522
-
523
- for (let srIndex = rIndex; srIndex < rIndex + rowSpan; srIndex++) {
524
- for (let scIndex = startColIndex; scIndex < startColIndex + colSpan; scIndex++) {
525
- occupiedRows[srIndex][scIndex] = true
526
- fullRows[srIndex][scIndex] = column
527
- }
528
- }
529
- currColIndex = startColIndex + colSpan
530
- }
531
- }
532
- return fullRows
533
- }
534
-
535
- export function restoreScrollLocation ($xeTable: VxeTableConstructor, scrollLeft: number, scrollTop: number) {
536
- const internalData = $xeTable as unknown as TableInternalData
537
-
538
- if (scrollLeft || scrollTop) {
539
- internalData.intoRunScroll = false
540
- internalData.inVirtualScroll = false
541
- internalData.inWheelScroll = false
542
- internalData.inHeaderScroll = false
543
- internalData.inBodyScroll = false
544
- internalData.inFooterScroll = false
545
- internalData.scrollRenderType = ''
546
- // 还原滚动状态
547
- return $xeTable.scrollTo(scrollLeft, scrollTop)
548
- }
549
- return $xeTable.clearScroll()
550
- }
551
-
552
- export function toTreePathSeq (path: any) {
553
- return path.map((num: any, i: any) => i % 2 === 0 ? (Number(num) + 1) : '.').join('')
554
- }
555
-
556
- export function getRowUniqueId () {
557
- return XEUtils.uniqueId('row_')
558
- }
559
-
560
- /**
561
- * 生成行的唯一主键
562
- */
563
- export function createRowId (rowOpts: VxeTablePropTypes.RowConfig, row: any, keyField: string) {
564
- const { createKeyMethod } = rowOpts
565
- if (createKeyMethod) {
566
- return '' + createKeyMethod({ row, keyField })
567
- }
568
- return getRowUniqueId()
569
- }
570
-
571
- export function hasDeepKey (rowKey: string) {
572
- return rowKey.indexOf('.') > -1
573
- }
574
-
575
- // 行主键 key
576
- export function getRowkey ($xeTable: VxeTableConstructor) {
577
- const internalData = $xeTable as unknown as TableInternalData
578
- const { currKeyField } = internalData
579
- return currKeyField
580
- }
581
-
582
- // 行主键 value
583
- export function getRowid ($xeTable: VxeTableConstructor, row: any) {
584
- const internalData = $xeTable as unknown as TableInternalData
585
- const { isCurrDeepKey, currKeyField } = internalData
586
- return row ? encodeRowid((isCurrDeepKey ? getDeepRowIdByKey : getFastRowIdByKey)(row, currKeyField)) : ''
587
- }
588
-
589
- export function createHandleUpdateRowId ($xeTable: VxeTableConstructor) {
590
- const internalData = $xeTable as unknown as TableInternalData
591
- const { isCurrDeepKey, currKeyField } = internalData
592
- const rowOpts = $xeTable.computeRowOpts
593
- const updateRId = isCurrDeepKey ? updateDeepRowKey : updateFastRowKey
594
- return {
595
- rowKey: currKeyField,
596
- handleUpdateRowId (row: any) {
597
- return row ? updateRId(rowOpts, row, currKeyField) : ''
598
- }
599
- }
600
- }
601
-
602
- export function createHandleGetRowId ($xeTable: VxeTableConstructor) {
603
- const internalData = $xeTable as unknown as TableInternalData
604
- const { isCurrDeepKey, currKeyField } = internalData
605
- const getRId = isCurrDeepKey ? getDeepRowIdByKey : getFastRowIdByKey
606
- return {
607
- rowKey: currKeyField,
608
- handleGetRowId (row: any) {
609
- return row ? encodeRowid(getRId(row, currKeyField)) : ''
610
- }
611
- }
612
- }
613
-
614
- // 编码行主键
615
- export function encodeRowid (rowVal: string) {
616
- return XEUtils.eqNull(rowVal) ? '' : encodeURIComponent(rowVal)
617
- }
618
-
619
- function getDeepRowIdByKey (row: any, rowKey: string) {
620
- return XEUtils.get(row, rowKey)
621
- }
622
-
623
- function updateDeepRowKey (rowOpts: VxeTablePropTypes.RowConfig, row: any, rowKey: string) {
624
- let rowid = encodeRowid(getDeepRowIdByKey(row, rowKey))
625
- if (eqEmptyValue(rowid)) {
626
- const newRowid = createRowId(rowOpts, row, rowKey)
627
- rowid = '' + newRowid
628
- XEUtils.set(row, rowKey, rowid)
629
- }
630
- return rowid
631
- }
632
-
633
- function getFastRowIdByKey (row: any, rowKey: string) {
634
- return row[rowKey]
635
- }
636
-
637
- function updateFastRowKey (rowOpts: VxeTablePropTypes.RowConfig, row: any, rowKey: string) {
638
- let rowid = encodeRowid(getFastRowIdByKey(row, rowKey))
639
- if (eqEmptyValue(rowid)) {
640
- const newRowid = createRowId(rowOpts, row, rowKey)
641
- rowid = '' + newRowid
642
- row[rowKey] = newRowid
643
- }
644
- return rowid
645
- }
646
-
647
- function getPaddingLeftRightSize (elem: HTMLElement | null) {
648
- if (elem) {
649
- const computedStyle = getComputedStyle(elem)
650
- const paddingLeft = XEUtils.toNumber(computedStyle.paddingLeft)
651
- const paddingRight = XEUtils.toNumber(computedStyle.paddingRight)
652
- return paddingLeft + paddingRight
653
- }
654
- return 0
655
- }
656
-
657
- function getElementMarginAndWidth (elem: HTMLElement | null) {
658
- if (elem) {
659
- const computedStyle = getComputedStyle(elem)
660
- const marginLeft = XEUtils.toNumber(computedStyle.marginLeft)
661
- const marginRight = XEUtils.toNumber(computedStyle.marginRight)
662
- return elem.offsetWidth + marginLeft + marginRight
663
- }
664
- return 0
665
- }
666
-
667
- export function getCalcHeight (height: number | 'unset' | undefined | null) {
668
- if (height === 'unset') {
669
- return 0
670
- }
671
- return height || 0
672
- }
673
-
674
- export function handleFieldOrColumn ($xeTable: VxeTableConstructor, fieldOrColumn: any) {
675
- if (fieldOrColumn) {
676
- return XEUtils.isString(fieldOrColumn) || XEUtils.isNumber(fieldOrColumn) ? $xeTable.getColumnByField(`${fieldOrColumn}`) : fieldOrColumn
677
- }
678
- return null
679
- }
680
-
681
- export function handleRowidOrRow ($xeTable: VxeTableConstructor, rowidOrRow: any) {
682
- if (rowidOrRow) {
683
- const rowid = XEUtils.isString(rowidOrRow) || XEUtils.isNumber(rowidOrRow) ? rowidOrRow : getRowid($xeTable, rowidOrRow)
684
- return $xeTable.getRowById(rowid)
685
- }
686
- return null
687
- }
688
-
689
- export function getCellRestHeight (rowRest: VxeTableDefines.RowCacheItem, cellOpts: VxeTablePropTypes.CellConfig, rowOpts: VxeTablePropTypes.RowConfig, defaultRowHeight: number) {
690
- return rowRest.resizeHeight || cellOpts.height || rowOpts.height || rowRest.height || defaultRowHeight
691
- }
692
-
693
- // 组装列配置
694
- export function assembleColumn (_vm: any) {
695
- const $xeTable = _vm.$xeTable as VxeTableConstructor & VxeTablePrivateMethods
696
- const reactData = $xeTable as unknown as TableReactData
697
- const { staticColumns } = reactData
698
-
699
- const { $el, $xeColumn, columnConfig } = _vm
700
- const groupConfig = $xeColumn ? $xeColumn.columnConfig : null
701
- if (groupConfig) {
702
- if ($xeColumn.$options._componentTag === 'vxe-table-column') {
703
- errLog('vxe.error.groupTag', [`<vxe-table-colgroup title=${$xeColumn.title} ...>`, `<vxe-table-column title=${$xeColumn.title} ...>`])
704
- } else if ($xeColumn.$options._componentTag === 'vxe-column') {
705
- warnLog('vxe.error.groupTag', [`<vxe-colgroup title=${$xeColumn.title} ...>`, `<vxe-column title=${$xeColumn.title} ...>`])
706
- }
707
- if (!groupConfig.children) {
708
- groupConfig.children = []
709
- }
710
- columnConfig.defaultParentId = groupConfig.id
711
- groupConfig.children.splice(XEUtils.arrayIndexOf($xeColumn.$el.children, $el), 0, columnConfig)
712
- } else {
713
- staticColumns.splice(XEUtils.arrayIndexOf(($xeTable.$refs.hideColumn as any).children, $el), 0, columnConfig)
714
- }
715
- }
716
-
717
- // 销毁列
718
- export function destroyColumn (_vm: any) {
719
- const $xeTable = _vm.$xeTable as VxeTableConstructor & VxeTablePrivateMethods
720
- const reactData = $xeTable as unknown as TableReactData
721
- const { staticColumns } = reactData
722
-
723
- const { columnConfig } = _vm
724
- const matchObj = XEUtils.findTree(staticColumns, column => column === columnConfig)
725
- if (matchObj) {
726
- matchObj.items.splice(matchObj.index, 1)
727
- }
728
- }
729
-
730
- export function getRootColumn ($xeTable: VxeTableConstructor & VxeTablePrivateMethods, column: any) {
731
- const internalData = $xeTable as unknown as TableInternalData
732
-
733
- const { fullColumnIdData } = internalData
734
- if (!column) {
735
- return null
736
- }
737
- let parentColId = column.parentId
738
- while (fullColumnIdData[parentColId]) {
739
- const column = fullColumnIdData[parentColId].column
740
- parentColId = column.parentId
741
- if (!parentColId) {
742
- return column
743
- }
744
- }
745
- return column
746
- }
747
-
748
- export function toFilters (filters: any, colid?: string) {
749
- if (filters) {
750
- if (XEUtils.isArray(filters)) {
751
- return filters.map(({ label, value, data, resetValue, checked }) => {
752
- return { label, value, data, resetValue, checked: !!checked, _checked: !!checked, _colId: colid }
753
- })
754
- }
755
- return []
756
- }
757
- return filters
758
- }
759
-
760
- export function getColReMinWidth (params: any) {
761
- const { $table, column, cell } = params
762
- const internalData = $table
763
- const { showHeaderOverflow: allColumnHeaderOverflow, resizableOpts } = $table
764
- const { minWidth } = resizableOpts
765
- // 如果自定义调整宽度逻辑
766
- if (minWidth) {
767
- const customMinWidth = XEUtils.isFunction(minWidth) ? minWidth(params) : minWidth
768
- if (customMinWidth !== 'auto') {
769
- return Math.max(1, XEUtils.toNumber(customMinWidth))
770
- }
771
- }
772
- const { elemStore } = internalData
773
- const { showHeaderOverflow, minWidth: colMinWidth } = column
774
- const headOverflow = XEUtils.isUndefined(showHeaderOverflow) || XEUtils.isNull(showHeaderOverflow) ? allColumnHeaderOverflow : showHeaderOverflow
775
- const showEllipsis = headOverflow === 'ellipsis'
776
- const showTitle = headOverflow === 'title'
777
- const showTooltip = headOverflow === true || headOverflow === 'tooltip'
778
- const hasEllipsis = showTitle || showTooltip || showEllipsis
779
- const minTitleWidth = XEUtils.floor((XEUtils.toNumber(getComputedStyle(cell).fontSize) || 14) * 1.8)
780
- const paddingLeftRight = getPaddingLeftRightSize(cell) + getPaddingLeftRightSize(queryElement(cell, '.vxe-cell'))
781
- let mWidth = minTitleWidth + paddingLeftRight
782
- // 默认最小宽处理
783
- if (hasEllipsis) {
784
- const dragIconWidth = getElementMarginAndWidth(queryElement(cell, '.vxe-cell--drag-handle'))
785
- const checkboxIconWidth = getElementMarginAndWidth(queryElement(cell, '.vxe-cell--checkbox'))
786
- const requiredIconWidth = getElementMarginAndWidth(queryElement(cell, '.vxe-cell--required-icon'))
787
- const editIconWidth = getElementMarginAndWidth(queryElement(cell, '.vxe-cell--edit-icon'))
788
- const prefixIconWidth = getElementMarginAndWidth(queryElement(cell, '.vxe-cell-title-prefix-icon'))
789
- const suffixIconWidth = getElementMarginAndWidth(queryElement(cell, '.vxe-cell-title-suffix-icon'))
790
- const sortIconWidth = getElementMarginAndWidth(queryElement(cell, '.vxe-cell--sort'))
791
- const filterIconWidth = getElementMarginAndWidth(queryElement(cell, '.vxe-cell--filter'))
792
- mWidth += dragIconWidth + checkboxIconWidth + requiredIconWidth + editIconWidth + prefixIconWidth + suffixIconWidth + filterIconWidth + sortIconWidth
793
- }
794
- // 如果设置最小宽
795
- if (colMinWidth) {
796
- const bodyScrollElem = getRefElem(elemStore['main-body-scroll'])
797
- if (bodyScrollElem) {
798
- if (isScale(colMinWidth)) {
799
- const bodyWidth = bodyScrollElem.clientWidth - 1
800
- const meanWidth = bodyWidth / 100
801
- return Math.max(mWidth, Math.floor(XEUtils.toInteger(colMinWidth) * meanWidth))
802
- } else if (isPx(colMinWidth)) {
803
- return Math.max(mWidth, XEUtils.toInteger(colMinWidth))
804
- }
805
- }
806
- }
807
- return mWidth
808
- }
809
-
810
- export function getFirstChildColumn (column: VxeTableDefines.ColumnInfo): VxeTableDefines.ColumnInfo {
811
- const { children } = column
812
- if (children && children.length) {
813
- return getFirstChildColumn(XEUtils.first(children))
814
- }
815
- return column
816
- }
817
-
818
- export function getLastChildColumn (column: VxeTableDefines.ColumnInfo): VxeTableDefines.ColumnInfo {
819
- const { children } = column
820
- if (children && children.length) {
821
- return getFirstChildColumn(XEUtils.last(children))
822
- }
823
- return column
824
- }
825
-
826
- export function getCellValue (row: any, column: any) {
827
- return XEUtils.get(row, column.field)
828
- }
829
-
830
- export function setCellValue (row: any, column:any, value: any) {
831
- return XEUtils.set(row, column.field, value)
832
- }
833
-
834
- export function getRefElem (refEl: any) {
835
- if (refEl) {
836
- return (refEl.$el || refEl) as HTMLElement
837
- }
838
- return null
839
- }
840
-
841
- export function clearTableDefaultStatus ($xeTable: VxeTableConstructor & VxeTablePrivateMethods) {
842
- const props = $xeTable
843
- const internalData = $xeTable as unknown as TableInternalData
844
-
845
- internalData.initStatus = false
846
- const actionList = [
847
- $xeTable.clearSort(),
848
- $xeTable.clearCurrentRow(),
849
- $xeTable.clearCurrentColumn(),
850
- $xeTable.clearRadioRow(),
851
- $xeTable.clearRadioReserve(),
852
- $xeTable.clearCheckboxRow(),
853
- $xeTable.clearCheckboxReserve(),
854
- $xeTable.clearRowExpand(),
855
- $xeTable.clearTreeExpand(),
856
- $xeTable.clearTreeExpandReserve(),
857
- $xeTable.clearPendingRow()
858
- ]
859
- if ($xeTable.clearFilter) {
860
- actionList.push(
861
- $xeTable.clearFilter()
862
- )
863
- }
864
- if ($xeTable.clearSelected && (props.keyboardConfig || props.mouseConfig)) {
865
- actionList.push(
866
- $xeTable.clearSelected()
867
- )
868
- }
869
- if ($xeTable.clearCellAreas && props.mouseConfig) {
870
- actionList.push(
871
- $xeTable.clearCellAreas(),
872
- $xeTable.clearCopyCellArea()
873
- )
874
- }
875
- return Promise.all(actionList).then(() => {
876
- return $xeTable.clearScroll()
877
- })
878
- }
879
-
880
- export function clearTableAllStatus (_vm: any) {
881
- if (_vm.clearFilter) {
882
- _vm.clearFilter()
883
- }
884
- return clearTableDefaultStatus(_vm)
885
- }
886
-
887
- export function isColumnInfo (column: any) {
888
- return column instanceof ColumnInfo
889
- }
890
-
891
- // 获取所有的列,排除分组
892
- export function getColumnList (columns: VxeTableDefines.ColumnInfo[]) {
893
- const result: VxeTableDefines.ColumnInfo[] = []
894
- columns.forEach((column) => {
895
- result.push(...(column.children && column.children.length ? getColumnList(column.children) : [column]))
896
- })
897
- return result
898
- }
899
-
900
- export function createColumn ($xeTable: VxeTableConstructor & VxeTablePrivateMethods, options: any, renderOptions: any): any {
901
- return isColumnInfo(options) ? options : new ColumnInfo($xeTable, options, renderOptions)
902
- }
903
-
904
- export function rowToVisible ($xeTable: VxeTableConstructor & VxeTablePrivateMethods, row: any) {
905
- const reactData = $xeTable as unknown as TableReactData
906
- const internalData = $xeTable as unknown as TableInternalData
907
-
908
- const { scrollYLoad, scrollYTop, isAllOverflow } = reactData
909
- const { elemStore, afterFullData, fullAllDataRowIdData, isResizeCellHeight } = internalData
910
- const rowOpts = $xeTable.computeRowOpts
911
- const cellOpts = $xeTable.computeCellOpts
912
- const defaultRowHeight = $xeTable.computeDefaultRowHeight
913
- const leftFixedWidth = $xeTable.computeLeftFixedWidth
914
- const rightFixedWidth = $xeTable.computeRightFixedWidth
915
- const bodyScrollElem = getRefElem(elemStore['main-body-scroll'])
916
- const rowid = getRowid($xeTable, row)
917
- if (bodyScrollElem) {
918
- const bodyHeight = bodyScrollElem.clientHeight
919
- const bodyScrollTop = bodyScrollElem.scrollTop
920
- const trElem: HTMLTableRowElement | null = bodyScrollElem.querySelector(`[rowid="${rowid}"]`)
921
- if (trElem) {
922
- const trOffsetTop = trElem.offsetTop + (scrollYLoad ? scrollYTop : 0)
923
- const trHeight = trElem.clientHeight
924
- // 检测行是否在可视区中
925
- if (trOffsetTop < bodyScrollTop || trOffsetTop > bodyScrollTop + bodyHeight) {
926
- return $xeTable.scrollTo(null, trOffsetTop)
927
- } else if (trOffsetTop + trHeight >= bodyHeight + bodyScrollTop) {
928
- return $xeTable.scrollTo(null, bodyScrollTop + trHeight)
929
- }
930
- } else {
931
- // 如果是虚拟渲染滚动
932
- if (scrollYLoad) {
933
- const isCustomCellHeight = isResizeCellHeight || cellOpts.height || rowOpts.height
934
- if (!isCustomCellHeight && isAllOverflow) {
935
- return $xeTable.scrollTo(null, ($xeTable.findRowIndexOf(afterFullData, row) - 1) * defaultRowHeight)
936
- }
937
- const rowRest = fullAllDataRowIdData[rowid] || {}
938
- const rHeight = rowRest.resizeHeight || cellOpts.height || rowOpts.height || rowRest.height || defaultRowHeight
939
- const scrollTop = rowRest.oTop
940
- if (scrollTop < bodyScrollTop) {
941
- return $xeTable.scrollTo(null, scrollTop - leftFixedWidth - 1)
942
- }
943
- return $xeTable.scrollTo(null, (scrollTop + rHeight) - (bodyHeight - rightFixedWidth - 1))
944
- }
945
- }
946
- }
947
- return Promise.resolve()
948
- }
949
-
950
- export function colToVisible ($xeTable: VxeTableConstructor & VxeTablePrivateMethods, isForce: boolean, column: VxeTableDefines.ColumnInfo, row?: any) {
951
- const reactData = $xeTable as unknown as TableReactData
952
- const internalData = $xeTable as unknown as TableInternalData
953
-
954
- const { scrollXLoad, scrollXLeft } = reactData
955
- const { elemStore, visibleColumn } = internalData
956
- const leftFixedWidth = $xeTable.computeLeftFixedWidth
957
- const rightFixedWidth = $xeTable.computeRightFixedWidth
958
- const bodyScrollElem = getRefElem(elemStore['main-body-scroll'])
959
- if (column.fixed) {
960
- return Promise.resolve()
961
- }
962
- if (bodyScrollElem) {
963
- const bodyWidth = bodyScrollElem.clientWidth
964
- const bodyScrollLeft = bodyScrollElem.scrollLeft
965
- let tdElem: HTMLTableCellElement | null = null
966
- if (row) {
967
- const rowid = getRowid($xeTable, row)
968
- tdElem = bodyScrollElem.querySelector(`[rowid="${rowid}"] .${column.id}`)
969
- }
970
- if (!tdElem) {
971
- tdElem = bodyScrollElem.querySelector(`.${column.id}`)
972
- }
973
- if (tdElem) {
974
- const tdOffsetLeft = tdElem.offsetLeft + (scrollXLoad ? scrollXLeft : 0)
975
- const cellWidth = tdElem.clientWidth
976
- // 检测是否在可视区中
977
- if (isForce || (
978
- !(tdOffsetLeft <= (bodyScrollLeft + leftFixedWidth) && (tdOffsetLeft + cellWidth) > (bodyScrollLeft + leftFixedWidth)) &&
979
- !(tdOffsetLeft >= (bodyScrollLeft + leftFixedWidth) && tdOffsetLeft < (bodyScrollLeft + bodyWidth - rightFixedWidth))
980
- )) {
981
- if (tdOffsetLeft < (bodyScrollLeft + leftFixedWidth)) {
982
- return $xeTable.scrollTo(tdOffsetLeft - leftFixedWidth - 1)
983
- } else if ((tdOffsetLeft + cellWidth - bodyScrollLeft) > (bodyWidth - rightFixedWidth)) {
984
- return $xeTable.scrollTo((tdOffsetLeft + cellWidth) - (bodyWidth - rightFixedWidth - 1))
985
- }
986
- }
987
- } else {
988
- if (scrollXLoad) {
989
- let tdOffsetLeft = 0
990
- const cellWidth = column.renderWidth
991
- for (let i = 0; i < visibleColumn.length; i++) {
992
- const currCol = visibleColumn[i]
993
- if (currCol === column || currCol.id === column.id) {
994
- break
995
- }
996
- tdOffsetLeft += currCol.renderWidth
997
- }
998
- // 检测是否在可视区中
999
- if (isForce || (
1000
- !(tdOffsetLeft <= (bodyScrollLeft + leftFixedWidth) && (tdOffsetLeft + cellWidth) > (bodyScrollLeft + leftFixedWidth)) &&
1001
- !(tdOffsetLeft >= (bodyScrollLeft + leftFixedWidth) && tdOffsetLeft < (bodyScrollLeft + bodyWidth - rightFixedWidth))
1002
- )) {
1003
- if (tdOffsetLeft < bodyScrollLeft) {
1004
- return $xeTable.scrollTo(tdOffsetLeft - leftFixedWidth - 1)
1005
- }
1006
- return $xeTable.scrollTo((tdOffsetLeft + cellWidth) - (bodyWidth - rightFixedWidth - 1))
1007
- }
1008
- }
1009
- }
1010
- }
1011
- return Promise.resolve()
1012
- }
1
+ import XEUtils from 'xe-utils'
2
+ import { ColumnInfo } from './columnInfo'
3
+ import { isScale, isPx, queryElement } from '../../ui/src/dom'
4
+ import { warnLog, errLog } from '../../ui/src/log'
5
+ import { eqEmptyValue } from '../../ui/src/utils'
6
+
7
+ import type { VxeTableDefines, VxeTableConstructor, TableReactData, TableInternalData, VxeTablePrivateMethods, VxeTablePropTypes } from '../../../types'
8
+
9
+ export function createInternalData (): TableInternalData {
10
+ return {
11
+ tZindex: 0,
12
+ currKeyField: '',
13
+ isCurrDeepKey: false,
14
+ elemStore: {},
15
+ // 存放横向 X 虚拟滚动相关的信息
16
+ scrollXStore: {
17
+ preloadSize: 0,
18
+ offsetSize: 0,
19
+ visibleSize: 0,
20
+ visibleStartIndex: 0,
21
+ visibleEndIndex: 0,
22
+ startIndex: 0,
23
+ endIndex: 0
24
+ },
25
+ // 存放纵向 Y 虚拟滚动相关信息
26
+ scrollYStore: {
27
+ preloadSize: 0,
28
+ offsetSize: 0,
29
+ visibleSize: 0,
30
+ visibleStartIndex: 0,
31
+ visibleEndIndex: 0,
32
+ startIndex: 0,
33
+ endIndex: 0
34
+ },
35
+ // 表格宽度
36
+ tableWidth: 0,
37
+ // 表格高度
38
+ tableHeight: 0,
39
+ customHeight: 0,
40
+ customMinHeight: 0,
41
+ customMaxHeight: 0,
42
+ // 当前 hover 行
43
+ hoverRow: null,
44
+ // 最后滚动位置
45
+ lastScrollLeft: 0,
46
+ lastScrollTop: 0,
47
+ // 单选框属性,已选中保留的行
48
+ radioReserveRow: null,
49
+ // 复选框属性,已选中保留的行集合
50
+ checkboxReserveRowMap: {},
51
+ // 行数据,已展开保留的行集合
52
+ rowExpandedReserveRowMap: {},
53
+ // 树结构数据,已展开保留的行集合
54
+ treeExpandedReserveRowMap: {},
55
+ // 树结构数据,不确定状态的集合
56
+ treeIndeterminateRowMaps: {},
57
+ // 列表完整数据、条件处理后
58
+ tableFullData: [],
59
+ afterFullData: [],
60
+ afterTreeFullData: [],
61
+ afterGroupFullData: [],
62
+ // 列表条件处理后数据集合
63
+ afterFullRowMaps: {},
64
+ // 树结构完整数据、条件处理后
65
+ tableFullTreeData: [],
66
+ // 行分组全量数据、条件处理后
67
+ tableFullGroupData: [],
68
+ tableSynchData: [],
69
+ tableSourceData: [],
70
+ // 收集的列配置(带分组)
71
+ collectColumn: [],
72
+ // 完整所有列(不带分组)
73
+ tableFullColumn: [],
74
+ // 渲染所有列
75
+ visibleColumn: [],
76
+
77
+ // 全量数据集(包括当前和已删除)
78
+ fullAllDataRowIdData: {},
79
+ // 数据集(仅当前)
80
+ fullDataRowIdData: {},
81
+ // 数据集(仅可视)
82
+ visibleDataRowIdData: {},
83
+
84
+ keepUpdateFieldMaps: {},
85
+
86
+ footerFullDataRowData: {},
87
+
88
+ // 渲染中缓存数据
89
+ sourceDataRowIdData: {},
90
+ fullColumnIdData: {},
91
+ fullColumnFieldData: {},
92
+
93
+ // 合并表头单元格的数据
94
+ mergeHeaderList: [],
95
+ mergeHeaderMaps: {},
96
+ // 已合并单元格数据集合
97
+ mergeHeaderCellMaps: {},
98
+ mergeHeaderRowMaps: {},
99
+ mergeHeaderColMaps: {},
100
+ // 合并单元格的数据
101
+ mergeBodyList: [],
102
+ mergeBodyMaps: {},
103
+ // 已合并单元格数据集合
104
+ mergeBodyCellMaps: {},
105
+ mergeBodyRowMaps: {},
106
+ mergeBodyColMaps: {},
107
+ // 合并表尾的数据
108
+ mergeFooterList: [],
109
+ mergeFooterMaps: {},
110
+ // 已合并表尾数据集合
111
+ mergeFooterCellMaps: {},
112
+ mergeFooterRowMaps: {},
113
+ mergeFooterColMaps: {},
114
+
115
+ // 已展开的行集合
116
+ rowExpandedMaps: {},
117
+ // 懒加载中的展开行的集合
118
+ rowExpandLazyLoadedMaps: {},
119
+ // 已展开的分组行
120
+ rowGroupExpandedMaps: {},
121
+ // 已展开树节点集合
122
+ treeExpandedMaps: {},
123
+ // 懒加载中的树节点的集合
124
+ treeExpandLazyLoadedMaps: {},
125
+ // 复选框属性,已选中的行集合
126
+ selectCheckboxMaps: {},
127
+ // 已标记的对象集
128
+ pendingRowMaps: {},
129
+ // 已新增的临时行
130
+ insertRowMaps: {},
131
+ // 已删除行
132
+ removeRowMaps: {},
133
+
134
+ cvCacheMaps: {},
135
+
136
+ // 表头高度
137
+ tHeaderHeight: 0,
138
+ // 表体高度
139
+ tBodyHeight: 0,
140
+ // 表尾高度
141
+ tFooterHeight: 0,
142
+
143
+ teleportToWrapperElem: null,
144
+ popupToWrapperElem: null,
145
+
146
+ lastSTime: 0,
147
+
148
+ inited: false,
149
+ tooltipTimeout: null,
150
+ initStatus: false,
151
+ isActivated: false
152
+
153
+ // _sToTime: null
154
+ }
155
+ }
156
+
157
+ export function createReactData (): TableReactData {
158
+ return {
159
+ updateColFlag: 0,
160
+ // 低性能的静态列
161
+ staticColumns: [],
162
+ // 渲染的列分组
163
+ tableGroupColumn: [],
164
+ // 可视区渲染的列
165
+ tableColumn: [],
166
+ // 渲染中的数据
167
+ tableData: [],
168
+ // 是否启用了横向 X 可视渲染方式加载
169
+ scrollXLoad: false,
170
+ // 是否启用了纵向 Y 可视渲染方式加载
171
+ scrollYLoad: false,
172
+ // 是否存在纵向滚动条
173
+ overflowY: true,
174
+ // 是否存在横向滚动条
175
+ overflowX: false,
176
+ // 纵向滚动条的宽度
177
+ scrollbarWidth: 0,
178
+ // 横向滚动条的高度
179
+ scrollbarHeight: 0,
180
+ // 行高
181
+ rowHeight: 0,
182
+ // 表格父容器的高度
183
+ parentHeight: 0,
184
+ // 是否使用分组表头
185
+ isGroup: false,
186
+ isAllOverflow: false,
187
+ // 复选框属性,是否全选
188
+ isAllSelected: false,
189
+ // 复选框属性,有选中且非全选状态
190
+ isIndeterminate: false,
191
+ // 当前行
192
+ currentRow: null,
193
+ // 单选框属性,选中列
194
+ currentColumn: null,
195
+ // 单选框属性,选中行
196
+ selectRadioRow: null,
197
+ // 表尾合计数据
198
+ footerTableData: [],
199
+ // 行分组列信息
200
+ rowGroupColumn: null,
201
+ // 展开列信息
202
+ expandColumn: null,
203
+ checkboxColumn: null,
204
+ radioColumn: null,
205
+ // 树节点列信息
206
+ treeNodeColumn: null,
207
+ hasFixedColumn: false,
208
+ // 刷新列标识,当列筛选被改变时,触发表格刷新数据
209
+ upDataFlag: 0,
210
+ // 刷新列标识,当列的特定属性被改变时,触发表格刷新列
211
+ reColumnFlag: 0,
212
+ // 初始化标识
213
+ initStore: {
214
+ filter: false,
215
+ import: false,
216
+ export: false,
217
+ custom: false
218
+ },
219
+ // 自定义列相关的信息
220
+ customStore: {
221
+ btnEl: null,
222
+ isAll: false,
223
+ isIndeterminate: false,
224
+ activeBtn: false,
225
+ activeWrapper: false,
226
+ visible: false,
227
+ maxHeight: null,
228
+ popupTop: 0,
229
+ oldSortMaps: {},
230
+ oldFixedMaps: {},
231
+ oldVisibleMaps: {}
232
+ },
233
+ customColumnList: [],
234
+ // 当前选中的筛选列
235
+ filterStore: {
236
+ isAllSelected: false,
237
+ isIndeterminate: false,
238
+ style: null,
239
+ column: null,
240
+ visible: false,
241
+ maxHeight: null
242
+ },
243
+ // 存放列相关的信息
244
+ columnStore: {
245
+ leftList: [],
246
+ centerList: [],
247
+ rightList: [],
248
+ resizeList: [],
249
+ pxList: [],
250
+ pxMinList: [],
251
+ autoMinList: [],
252
+ scaleList: [],
253
+ scaleMinList: [],
254
+ autoList: [],
255
+ remainList: []
256
+ },
257
+ // 存放快捷菜单的信息
258
+ ctxMenuStore: {
259
+ selected: null,
260
+ visible: false,
261
+ showChild: false,
262
+ selectChild: null,
263
+ list: [],
264
+ style: null
265
+ },
266
+ // 存放可编辑相关信息
267
+ editStore: {
268
+ indexs: {
269
+ columns: []
270
+ },
271
+ titles: {
272
+ columns: []
273
+ },
274
+ // 选中源
275
+ selected: {
276
+ row: null,
277
+ column: null
278
+ },
279
+ // 已复制源
280
+ copyed: {
281
+ cut: false,
282
+ rows: [],
283
+ columns: []
284
+ },
285
+ // 激活
286
+ actived: {
287
+ row: null,
288
+ column: null
289
+ },
290
+ // 当前被强制聚焦单元格,只会在鼠标点击后算聚焦
291
+ focused: {
292
+ row: null,
293
+ column: null
294
+ }
295
+ },
296
+ // 存放 tooltip 相关信息
297
+ tooltipStore: {
298
+ row: null,
299
+ column: null,
300
+ content: null,
301
+ visible: false,
302
+ type: null,
303
+ currOpts: {}
304
+ },
305
+ // 存放数据校验相关信息
306
+ validStore: {
307
+ visible: false
308
+ },
309
+ validErrorMaps: {},
310
+ // 导入相关信息
311
+ importStore: {
312
+ inited: false,
313
+ file: null,
314
+ type: '',
315
+ modeList: [],
316
+ typeList: [],
317
+ filename: '',
318
+ visible: false
319
+ },
320
+ importParams: {
321
+ mode: '',
322
+ types: null,
323
+ message: true
324
+ },
325
+ // 导出相关信息
326
+ exportStore: {
327
+ inited: false,
328
+ name: '',
329
+ modeList: [],
330
+ typeList: [],
331
+ columns: [],
332
+ isPrint: false,
333
+ hasFooter: false,
334
+ hasMerge: false,
335
+ hasTree: false,
336
+ hasColgroup: false,
337
+ visible: false
338
+ },
339
+ exportParams: {
340
+ filename: '',
341
+ sheetName: '',
342
+ mode: '',
343
+ type: '',
344
+ isColgroup: false,
345
+ isMerge: false,
346
+ isAllExpand: false,
347
+ useStyle: false,
348
+ original: false,
349
+ message: true,
350
+ isHeader: false,
351
+ isTitle: false,
352
+ isFooter: false
353
+ },
354
+
355
+ visiblwRowsFlag: 1,
356
+
357
+ isRowGroupStatus: false,
358
+ rowGroupList: [],
359
+ aggHandleFields: [],
360
+ aggHandleAggColumns: [],
361
+
362
+ rowGroupExpandedFlag: 1,
363
+ rowExpandedFlag: 1,
364
+ treeExpandedFlag: 1,
365
+ updateCheckboxFlag: 1,
366
+ pendingRowFlag: 1,
367
+ insertRowFlag: 1,
368
+ removeRowFlag: 1,
369
+
370
+ mergeHeadFlag: 1,
371
+ mergeBodyFlag: 1,
372
+ mergeFootFlag: 1,
373
+
374
+ rowHeightStore: {
375
+ large: 52,
376
+ default: 48,
377
+ medium: 44,
378
+ small: 40,
379
+ mini: 36
380
+ },
381
+
382
+ scrollVMLoading: false,
383
+ scrollYHeight: 0,
384
+ scrollYTop: 0,
385
+ isScrollYBig: false,
386
+ scrollXLeft: 0,
387
+ scrollXWidth: 0,
388
+ isScrollXBig: false,
389
+
390
+ lazScrollLoading: false,
391
+
392
+ rowExpandHeightFlag: 1,
393
+ calcCellHeightFlag: 1,
394
+ resizeHeightFlag: 1,
395
+ resizeWidthFlag: 1,
396
+
397
+ isCustomStatus: false,
398
+
399
+ isCrossDragRow: false,
400
+ dragRow: null,
401
+ isCrossDragCol: false,
402
+ dragCol: null,
403
+ dragTipText: '',
404
+
405
+ isDragResize: false,
406
+ isRowLoading: false,
407
+ isColLoading: false
408
+ }
409
+ }
410
+
411
+ const getAllConvertColumns = (columns: any, parentColumn?: any) => {
412
+ const result: any[] = []
413
+ columns.forEach((column: any) => {
414
+ column.parentId = parentColumn ? parentColumn.id : null
415
+ if (column.visible) {
416
+ if (column.children && column.children.length && column.children.some((column: any) => column.visible)) {
417
+ result.push(column)
418
+ result.push(...getAllConvertColumns(column.children, column))
419
+ } else {
420
+ result.push(column)
421
+ }
422
+ }
423
+ })
424
+ return result
425
+ }
426
+
427
+ export const convertHeaderColumnToRows = (originColumns: any) => {
428
+ let maxLevel = 1
429
+ const traverse = (column: any, parent?: any) => {
430
+ if (parent) {
431
+ column.level = parent.level + 1
432
+ if (maxLevel < column.level) {
433
+ maxLevel = column.level
434
+ }
435
+ }
436
+ if (column.children && column.children.length && column.children.some((column: any) => column.visible)) {
437
+ let colSpan = 0
438
+ column.children.forEach((subColumn: any) => {
439
+ if (subColumn.visible) {
440
+ traverse(subColumn, column)
441
+ colSpan += subColumn.colSpan
442
+ }
443
+ })
444
+ column.colSpan = colSpan
445
+ } else {
446
+ column.colSpan = 1
447
+ }
448
+ }
449
+
450
+ originColumns.forEach((column: any) => {
451
+ column.level = 1
452
+ traverse(column)
453
+ })
454
+
455
+ const rows: any[] = []
456
+ for (let i = 0; i < maxLevel; i++) {
457
+ rows.push([])
458
+ }
459
+
460
+ const allColumns = getAllConvertColumns(originColumns)
461
+
462
+ allColumns.forEach((column) => {
463
+ if (column.children && column.children.length && column.children.some((column: any) => column.visible)) {
464
+ column.rowSpan = 1
465
+ } else {
466
+ column.rowSpan = maxLevel - column.level + 1
467
+ }
468
+ rows[column.level - 1].push(column)
469
+ })
470
+
471
+ return rows
472
+ }
473
+
474
+ export function convertHeaderToGridRows (spanColumns: VxeTableDefines.ColumnInfo[][]) {
475
+ const rSize = spanColumns.length
476
+ const cSize = spanColumns[0].reduce((sum, cell) => sum + cell.colSpan, 0)
477
+
478
+ const occupiedRows: boolean[][] = []
479
+ const fullRows: any[][] = []
480
+ for (let rIndex = 0; rIndex < rSize; rIndex++) {
481
+ const oCols: boolean[] = []
482
+ const dCols: string[] = []
483
+ for (let cIndex = 0; cIndex < cSize; cIndex++) {
484
+ oCols.push(false)
485
+ dCols.push('')
486
+ }
487
+ occupiedRows.push(oCols)
488
+ fullRows.push(dCols)
489
+ }
490
+
491
+ for (let rIndex = 0; rIndex < rSize; rIndex++) {
492
+ let currColIndex = 0
493
+ for (const column of spanColumns[rIndex]) {
494
+ const { colSpan, rowSpan } = column
495
+ let startColIndex = -1
496
+ for (let ccIndex = currColIndex; ccIndex <= cSize - colSpan; ccIndex++) {
497
+ let oFlag = true
498
+ for (let csIndex = 0; csIndex < colSpan; csIndex++) {
499
+ if (occupiedRows[rIndex][ccIndex + csIndex]) {
500
+ oFlag = false
501
+ break
502
+ }
503
+ }
504
+ if (oFlag) {
505
+ startColIndex = ccIndex
506
+ break
507
+ }
508
+ }
509
+ if (startColIndex === -1) {
510
+ for (let j = 0; j <= cSize - colSpan; j++) {
511
+ let oFlag = true
512
+ for (let k = 0; k < colSpan; k++) {
513
+ if (occupiedRows[rIndex][j + k]) {
514
+ oFlag = false
515
+ break
516
+ }
517
+ }
518
+ if (oFlag) {
519
+ startColIndex = j
520
+ break
521
+ }
522
+ }
523
+ if (startColIndex === -1) {
524
+ // error
525
+ break
526
+ }
527
+ }
528
+
529
+ for (let srIndex = rIndex; srIndex < rIndex + rowSpan; srIndex++) {
530
+ for (let scIndex = startColIndex; scIndex < startColIndex + colSpan; scIndex++) {
531
+ occupiedRows[srIndex][scIndex] = true
532
+ fullRows[srIndex][scIndex] = column
533
+ }
534
+ }
535
+ currColIndex = startColIndex + colSpan
536
+ }
537
+ }
538
+ return fullRows
539
+ }
540
+
541
+ export function restoreScrollLocation ($xeTable: VxeTableConstructor, scrollLeft: number, scrollTop: number) {
542
+ const internalData = $xeTable as unknown as TableInternalData
543
+
544
+ if (scrollLeft || scrollTop) {
545
+ internalData.intoRunScroll = false
546
+ internalData.inVirtualScroll = false
547
+ internalData.inWheelScroll = false
548
+ internalData.inHeaderScroll = false
549
+ internalData.inBodyScroll = false
550
+ internalData.inFooterScroll = false
551
+ internalData.scrollRenderType = ''
552
+ // 还原滚动状态
553
+ return $xeTable.scrollTo(scrollLeft, scrollTop)
554
+ }
555
+ return $xeTable.clearScroll()
556
+ }
557
+
558
+ export function toTreePathSeq (path: any) {
559
+ return path.map((num: any, i: any) => i % 2 === 0 ? (Number(num) + 1) : '.').join('')
560
+ }
561
+
562
+ export function getRowUniqueId () {
563
+ return XEUtils.uniqueId('row_')
564
+ }
565
+
566
+ /**
567
+ * 生成行的唯一主键
568
+ */
569
+ export function createRowId (rowOpts: VxeTablePropTypes.RowConfig, row: any, keyField: string) {
570
+ const { createKeyMethod } = rowOpts
571
+ if (createKeyMethod) {
572
+ return '' + createKeyMethod({ row, keyField })
573
+ }
574
+ return getRowUniqueId()
575
+ }
576
+
577
+ export function hasDeepKey (rowKey: string) {
578
+ return rowKey.indexOf('.') > -1
579
+ }
580
+
581
+ // 行主键 key
582
+ export function getRowkey ($xeTable: VxeTableConstructor) {
583
+ const internalData = $xeTable as unknown as TableInternalData
584
+ const { currKeyField } = internalData
585
+ return currKeyField
586
+ }
587
+
588
+ // 行主键 value
589
+ export function getRowid ($xeTable: VxeTableConstructor, row: any) {
590
+ const internalData = $xeTable as unknown as TableInternalData
591
+ const { isCurrDeepKey, currKeyField } = internalData
592
+ return row ? encodeRowid((isCurrDeepKey ? getDeepRowIdByKey : getFastRowIdByKey)(row, currKeyField)) : ''
593
+ }
594
+
595
+ export function createHandleUpdateRowId ($xeTable: VxeTableConstructor) {
596
+ const internalData = $xeTable as unknown as TableInternalData
597
+ const { isCurrDeepKey, currKeyField } = internalData
598
+ const rowOpts = $xeTable.computeRowOpts
599
+ const updateRId = isCurrDeepKey ? updateDeepRowKey : updateFastRowKey
600
+ return {
601
+ rowKey: currKeyField,
602
+ handleUpdateRowId (row: any) {
603
+ return row ? updateRId(rowOpts, row, currKeyField) : ''
604
+ }
605
+ }
606
+ }
607
+
608
+ export function createHandleGetRowId ($xeTable: VxeTableConstructor) {
609
+ const internalData = $xeTable as unknown as TableInternalData
610
+ const { isCurrDeepKey, currKeyField } = internalData
611
+ const getRId = isCurrDeepKey ? getDeepRowIdByKey : getFastRowIdByKey
612
+ return {
613
+ rowKey: currKeyField,
614
+ handleGetRowId (row: any) {
615
+ return row ? encodeRowid(getRId(row, currKeyField)) : ''
616
+ }
617
+ }
618
+ }
619
+
620
+ // 编码行主键
621
+ export function encodeRowid (rowVal: string) {
622
+ return XEUtils.eqNull(rowVal) ? '' : encodeURIComponent(rowVal)
623
+ }
624
+
625
+ function getDeepRowIdByKey (row: any, rowKey: string) {
626
+ return XEUtils.get(row, rowKey)
627
+ }
628
+
629
+ function updateDeepRowKey (rowOpts: VxeTablePropTypes.RowConfig, row: any, rowKey: string) {
630
+ let rowid = encodeRowid(getDeepRowIdByKey(row, rowKey))
631
+ if (eqEmptyValue(rowid)) {
632
+ const newRowid = createRowId(rowOpts, row, rowKey)
633
+ rowid = '' + newRowid
634
+ XEUtils.set(row, rowKey, rowid)
635
+ }
636
+ return rowid
637
+ }
638
+
639
+ function getFastRowIdByKey (row: any, rowKey: string) {
640
+ return row[rowKey]
641
+ }
642
+
643
+ function updateFastRowKey (rowOpts: VxeTablePropTypes.RowConfig, row: any, rowKey: string) {
644
+ let rowid = encodeRowid(getFastRowIdByKey(row, rowKey))
645
+ if (eqEmptyValue(rowid)) {
646
+ const newRowid = createRowId(rowOpts, row, rowKey)
647
+ rowid = '' + newRowid
648
+ row[rowKey] = newRowid
649
+ }
650
+ return rowid
651
+ }
652
+
653
+ function getPaddingLeftRightSize (elem: HTMLElement | null) {
654
+ if (elem) {
655
+ const computedStyle = getComputedStyle(elem)
656
+ const paddingLeft = XEUtils.toNumber(computedStyle.paddingLeft)
657
+ const paddingRight = XEUtils.toNumber(computedStyle.paddingRight)
658
+ return paddingLeft + paddingRight
659
+ }
660
+ return 0
661
+ }
662
+
663
+ function getElementMarginAndWidth (elem: HTMLElement | null) {
664
+ if (elem) {
665
+ const computedStyle = getComputedStyle(elem)
666
+ const marginLeft = XEUtils.toNumber(computedStyle.marginLeft)
667
+ const marginRight = XEUtils.toNumber(computedStyle.marginRight)
668
+ return elem.offsetWidth + marginLeft + marginRight
669
+ }
670
+ return 0
671
+ }
672
+
673
+ export function getCalcHeight (height: number | 'unset' | undefined | null) {
674
+ if (height === 'unset') {
675
+ return 0
676
+ }
677
+ return height || 0
678
+ }
679
+
680
+ export function handleFieldOrColumn ($xeTable: VxeTableConstructor, fieldOrColumn: any) {
681
+ if (fieldOrColumn) {
682
+ return XEUtils.isString(fieldOrColumn) || XEUtils.isNumber(fieldOrColumn) ? $xeTable.getColumnByField(`${fieldOrColumn}`) : fieldOrColumn
683
+ }
684
+ return null
685
+ }
686
+
687
+ export function handleRowidOrRow ($xeTable: VxeTableConstructor, rowidOrRow: any) {
688
+ if (rowidOrRow) {
689
+ const rowid = XEUtils.isString(rowidOrRow) || XEUtils.isNumber(rowidOrRow) ? rowidOrRow : getRowid($xeTable, rowidOrRow)
690
+ return $xeTable.getRowById(rowid)
691
+ }
692
+ return null
693
+ }
694
+
695
+ export function getCellRestHeight (rowRest: VxeTableDefines.RowCacheItem, cellOpts: VxeTablePropTypes.CellConfig, rowOpts: VxeTablePropTypes.RowConfig, defaultRowHeight: number) {
696
+ return rowRest.resizeHeight || cellOpts.height || rowOpts.height || rowRest.height || defaultRowHeight
697
+ }
698
+
699
+ // 组装列配置
700
+ export function assembleColumn (_vm: any) {
701
+ const $xeTable = _vm.$xeTable as VxeTableConstructor & VxeTablePrivateMethods
702
+ const reactData = $xeTable as unknown as TableReactData
703
+ const { staticColumns } = reactData
704
+
705
+ const { $el, $xeColumn, columnConfig } = _vm
706
+ const groupConfig = $xeColumn ? $xeColumn.columnConfig : null
707
+ if (groupConfig) {
708
+ if ($xeColumn.$options._componentTag === 'vxe-table-column') {
709
+ errLog('vxe.error.groupTag', [`<vxe-table-colgroup title=${$xeColumn.title} ...>`, `<vxe-table-column title=${$xeColumn.title} ...>`])
710
+ } else if ($xeColumn.$options._componentTag === 'vxe-column') {
711
+ warnLog('vxe.error.groupTag', [`<vxe-colgroup title=${$xeColumn.title} ...>`, `<vxe-column title=${$xeColumn.title} ...>`])
712
+ }
713
+ if (!groupConfig.children) {
714
+ groupConfig.children = []
715
+ }
716
+ columnConfig.defaultParentId = groupConfig.id
717
+ groupConfig.children.splice(XEUtils.arrayIndexOf($xeColumn.$el.children, $el), 0, columnConfig)
718
+ } else {
719
+ staticColumns.splice(XEUtils.arrayIndexOf(($xeTable.$refs.hideColumn as any).children, $el), 0, columnConfig)
720
+ }
721
+ }
722
+
723
+ // 销毁列
724
+ export function destroyColumn (_vm: any) {
725
+ const $xeTable = _vm.$xeTable as VxeTableConstructor & VxeTablePrivateMethods
726
+ const reactData = $xeTable as unknown as TableReactData
727
+ const { staticColumns } = reactData
728
+
729
+ const { columnConfig } = _vm
730
+ const matchObj = XEUtils.findTree(staticColumns, column => column === columnConfig)
731
+ if (matchObj) {
732
+ matchObj.items.splice(matchObj.index, 1)
733
+ }
734
+ }
735
+
736
+ export function getRootColumn ($xeTable: VxeTableConstructor & VxeTablePrivateMethods, column: any) {
737
+ const internalData = $xeTable as unknown as TableInternalData
738
+
739
+ const { fullColumnIdData } = internalData
740
+ if (!column) {
741
+ return null
742
+ }
743
+ let parentColId = column.parentId
744
+ while (fullColumnIdData[parentColId]) {
745
+ const column = fullColumnIdData[parentColId].column
746
+ parentColId = column.parentId
747
+ if (!parentColId) {
748
+ return column
749
+ }
750
+ }
751
+ return column
752
+ }
753
+
754
+ export function toFilters (filters: any, colid?: string) {
755
+ if (filters) {
756
+ if (XEUtils.isArray(filters)) {
757
+ return filters.map(({ label, value, data, resetValue, checked }) => {
758
+ return { label, value, data, resetValue, checked: !!checked, _checked: !!checked, _colId: colid }
759
+ })
760
+ }
761
+ return []
762
+ }
763
+ return filters
764
+ }
765
+
766
+ export function getColReMinWidth (params: any) {
767
+ const { $table, column, cell } = params
768
+ const internalData = $table
769
+ const { showHeaderOverflow: allColumnHeaderOverflow, resizableOpts } = $table
770
+ const { minWidth } = resizableOpts
771
+ // 如果自定义调整宽度逻辑
772
+ if (minWidth) {
773
+ const customMinWidth = XEUtils.isFunction(minWidth) ? minWidth(params) : minWidth
774
+ if (customMinWidth !== 'auto') {
775
+ return Math.max(1, XEUtils.toNumber(customMinWidth))
776
+ }
777
+ }
778
+ const { elemStore } = internalData
779
+ const { showHeaderOverflow, minWidth: colMinWidth } = column
780
+ const headOverflow = XEUtils.isUndefined(showHeaderOverflow) || XEUtils.isNull(showHeaderOverflow) ? allColumnHeaderOverflow : showHeaderOverflow
781
+ const showEllipsis = headOverflow === 'ellipsis'
782
+ const showTitle = headOverflow === 'title'
783
+ const showTooltip = headOverflow === true || headOverflow === 'tooltip'
784
+ const hasEllipsis = showTitle || showTooltip || showEllipsis
785
+ const minTitleWidth = XEUtils.floor((XEUtils.toNumber(getComputedStyle(cell).fontSize) || 14) * 1.8)
786
+ const paddingLeftRight = getPaddingLeftRightSize(cell) + getPaddingLeftRightSize(queryElement(cell, '.vxe-cell'))
787
+ let mWidth = minTitleWidth + paddingLeftRight
788
+ // 默认最小宽处理
789
+ if (hasEllipsis) {
790
+ const dragIconWidth = getElementMarginAndWidth(queryElement(cell, '.vxe-cell--drag-handle'))
791
+ const checkboxIconWidth = getElementMarginAndWidth(queryElement(cell, '.vxe-cell--checkbox'))
792
+ const requiredIconWidth = getElementMarginAndWidth(queryElement(cell, '.vxe-cell--required-icon'))
793
+ const editIconWidth = getElementMarginAndWidth(queryElement(cell, '.vxe-cell--edit-icon'))
794
+ const prefixIconWidth = getElementMarginAndWidth(queryElement(cell, '.vxe-cell-title-prefix-icon'))
795
+ const suffixIconWidth = getElementMarginAndWidth(queryElement(cell, '.vxe-cell-title-suffix-icon'))
796
+ const sortIconWidth = getElementMarginAndWidth(queryElement(cell, '.vxe-cell--sort'))
797
+ const filterIconWidth = getElementMarginAndWidth(queryElement(cell, '.vxe-cell--filter'))
798
+ mWidth += dragIconWidth + checkboxIconWidth + requiredIconWidth + editIconWidth + prefixIconWidth + suffixIconWidth + filterIconWidth + sortIconWidth
799
+ }
800
+ // 如果设置最小宽
801
+ if (colMinWidth) {
802
+ const bodyScrollElem = getRefElem(elemStore['main-body-scroll'])
803
+ if (bodyScrollElem) {
804
+ if (isScale(colMinWidth)) {
805
+ const bodyWidth = bodyScrollElem.clientWidth - 1
806
+ const meanWidth = bodyWidth / 100
807
+ return Math.max(mWidth, Math.floor(XEUtils.toInteger(colMinWidth) * meanWidth))
808
+ } else if (isPx(colMinWidth)) {
809
+ return Math.max(mWidth, XEUtils.toInteger(colMinWidth))
810
+ }
811
+ }
812
+ }
813
+ return mWidth
814
+ }
815
+
816
+ export function getFirstChildColumn (column: VxeTableDefines.ColumnInfo): VxeTableDefines.ColumnInfo {
817
+ const { children } = column
818
+ if (children && children.length) {
819
+ return getFirstChildColumn(XEUtils.first(children))
820
+ }
821
+ return column
822
+ }
823
+
824
+ export function getLastChildColumn (column: VxeTableDefines.ColumnInfo): VxeTableDefines.ColumnInfo {
825
+ const { children } = column
826
+ if (children && children.length) {
827
+ return getFirstChildColumn(XEUtils.last(children))
828
+ }
829
+ return column
830
+ }
831
+
832
+ export function getCellValue (row: any, column: any) {
833
+ return XEUtils.get(row, column.field)
834
+ }
835
+
836
+ export function setCellValue (row: any, column:any, value: any) {
837
+ return XEUtils.set(row, column.field, value)
838
+ }
839
+
840
+ export function getRefElem (refEl: any) {
841
+ if (refEl) {
842
+ return (refEl.$el || refEl) as HTMLElement
843
+ }
844
+ return null
845
+ }
846
+
847
+ export function clearTableDefaultStatus ($xeTable: VxeTableConstructor & VxeTablePrivateMethods) {
848
+ const props = $xeTable
849
+ const internalData = $xeTable as unknown as TableInternalData
850
+
851
+ internalData.initStatus = false
852
+ const actionList = [
853
+ $xeTable.clearSort(),
854
+ $xeTable.clearCurrentRow(),
855
+ $xeTable.clearCurrentColumn(),
856
+ $xeTable.clearRadioRow(),
857
+ $xeTable.clearRadioReserve(),
858
+ $xeTable.clearCheckboxRow(),
859
+ $xeTable.clearCheckboxReserve(),
860
+ $xeTable.clearRowExpand(),
861
+ $xeTable.clearTreeExpand(),
862
+ $xeTable.clearTreeExpandReserve(),
863
+ $xeTable.clearPendingRow()
864
+ ]
865
+ if ($xeTable.clearFilter) {
866
+ actionList.push(
867
+ $xeTable.clearFilter()
868
+ )
869
+ }
870
+ if ($xeTable.clearSelected && (props.keyboardConfig || props.mouseConfig)) {
871
+ actionList.push(
872
+ $xeTable.clearSelected()
873
+ )
874
+ }
875
+ if ($xeTable.clearCellAreas && props.mouseConfig) {
876
+ actionList.push(
877
+ $xeTable.clearCellAreas(),
878
+ $xeTable.clearCopyCellArea()
879
+ )
880
+ }
881
+ return Promise.all(actionList).then(() => {
882
+ return $xeTable.clearScroll()
883
+ })
884
+ }
885
+
886
+ export function clearTableAllStatus (_vm: any) {
887
+ if (_vm.clearFilter) {
888
+ _vm.clearFilter()
889
+ }
890
+ return clearTableDefaultStatus(_vm)
891
+ }
892
+
893
+ export function isColumnInfo (column: any) {
894
+ return column instanceof ColumnInfo
895
+ }
896
+
897
+ // 获取所有的列,排除分组
898
+ export function getColumnList (columns: VxeTableDefines.ColumnInfo[]) {
899
+ const result: VxeTableDefines.ColumnInfo[] = []
900
+ columns.forEach((column) => {
901
+ result.push(...(column.children && column.children.length ? getColumnList(column.children) : [column]))
902
+ })
903
+ return result
904
+ }
905
+
906
+ export function createColumn ($xeTable: VxeTableConstructor & VxeTablePrivateMethods, options: any, renderOptions: any): any {
907
+ return isColumnInfo(options) ? options : new ColumnInfo($xeTable, options, renderOptions)
908
+ }
909
+
910
+ export function rowToVisible ($xeTable: VxeTableConstructor & VxeTablePrivateMethods, row: any) {
911
+ const reactData = $xeTable as unknown as TableReactData
912
+ const internalData = $xeTable as unknown as TableInternalData
913
+
914
+ const { scrollYLoad, scrollYTop, isAllOverflow } = reactData
915
+ const { elemStore, afterFullData, fullAllDataRowIdData, isResizeCellHeight } = internalData
916
+ const rowOpts = $xeTable.computeRowOpts
917
+ const cellOpts = $xeTable.computeCellOpts
918
+ const defaultRowHeight = $xeTable.computeDefaultRowHeight
919
+ const leftFixedWidth = $xeTable.computeLeftFixedWidth
920
+ const rightFixedWidth = $xeTable.computeRightFixedWidth
921
+ const bodyScrollElem = getRefElem(elemStore['main-body-scroll'])
922
+ const rowid = getRowid($xeTable, row)
923
+ if (bodyScrollElem) {
924
+ const bodyHeight = bodyScrollElem.clientHeight
925
+ const bodyScrollTop = bodyScrollElem.scrollTop
926
+ const trElem: HTMLTableRowElement | null = bodyScrollElem.querySelector(`[rowid="${rowid}"]`)
927
+ if (trElem) {
928
+ const trOffsetTop = trElem.offsetTop + (scrollYLoad ? scrollYTop : 0)
929
+ const trHeight = trElem.clientHeight
930
+ // 检测行是否在可视区中
931
+ if (trOffsetTop < bodyScrollTop || trOffsetTop > bodyScrollTop + bodyHeight) {
932
+ return $xeTable.scrollTo(null, trOffsetTop)
933
+ } else if (trOffsetTop + trHeight >= bodyHeight + bodyScrollTop) {
934
+ return $xeTable.scrollTo(null, bodyScrollTop + trHeight)
935
+ }
936
+ } else {
937
+ // 如果是虚拟渲染滚动
938
+ if (scrollYLoad) {
939
+ const isCustomCellHeight = isResizeCellHeight || cellOpts.height || rowOpts.height
940
+ if (!isCustomCellHeight && isAllOverflow) {
941
+ return $xeTable.scrollTo(null, ($xeTable.findRowIndexOf(afterFullData, row) - 1) * defaultRowHeight)
942
+ }
943
+ const rowRest = fullAllDataRowIdData[rowid] || {}
944
+ const rHeight = rowRest.resizeHeight || cellOpts.height || rowOpts.height || rowRest.height || defaultRowHeight
945
+ const scrollTop = rowRest.oTop
946
+ if (scrollTop < bodyScrollTop) {
947
+ return $xeTable.scrollTo(null, scrollTop - leftFixedWidth - 1)
948
+ }
949
+ return $xeTable.scrollTo(null, (scrollTop + rHeight) - (bodyHeight - rightFixedWidth - 1))
950
+ }
951
+ }
952
+ }
953
+ return Promise.resolve()
954
+ }
955
+
956
+ export function colToVisible ($xeTable: VxeTableConstructor & VxeTablePrivateMethods, isForce: boolean, column: VxeTableDefines.ColumnInfo, row?: any) {
957
+ const reactData = $xeTable as unknown as TableReactData
958
+ const internalData = $xeTable as unknown as TableInternalData
959
+
960
+ const { scrollXLoad, scrollXLeft } = reactData
961
+ const { elemStore, visibleColumn } = internalData
962
+ const leftFixedWidth = $xeTable.computeLeftFixedWidth
963
+ const rightFixedWidth = $xeTable.computeRightFixedWidth
964
+ const bodyScrollElem = getRefElem(elemStore['main-body-scroll'])
965
+ if (column.fixed) {
966
+ return Promise.resolve()
967
+ }
968
+ if (bodyScrollElem) {
969
+ const bodyWidth = bodyScrollElem.clientWidth
970
+ const bodyScrollLeft = bodyScrollElem.scrollLeft
971
+ let tdElem: HTMLTableCellElement | null = null
972
+ if (row) {
973
+ const rowid = getRowid($xeTable, row)
974
+ tdElem = bodyScrollElem.querySelector(`[rowid="${rowid}"] .${column.id}`)
975
+ }
976
+ if (!tdElem) {
977
+ tdElem = bodyScrollElem.querySelector(`.${column.id}`)
978
+ }
979
+ if (tdElem) {
980
+ const tdOffsetLeft = tdElem.offsetLeft + (scrollXLoad ? scrollXLeft : 0)
981
+ const cellWidth = tdElem.clientWidth
982
+ // 检测是否在可视区中
983
+ if (isForce || (
984
+ !(tdOffsetLeft <= (bodyScrollLeft + leftFixedWidth) && (tdOffsetLeft + cellWidth) > (bodyScrollLeft + leftFixedWidth)) &&
985
+ !(tdOffsetLeft >= (bodyScrollLeft + leftFixedWidth) && tdOffsetLeft < (bodyScrollLeft + bodyWidth - rightFixedWidth))
986
+ )) {
987
+ if (tdOffsetLeft < (bodyScrollLeft + leftFixedWidth)) {
988
+ return $xeTable.scrollTo(tdOffsetLeft - leftFixedWidth - 1)
989
+ } else if ((tdOffsetLeft + cellWidth - bodyScrollLeft) > (bodyWidth - rightFixedWidth)) {
990
+ return $xeTable.scrollTo((tdOffsetLeft + cellWidth) - (bodyWidth - rightFixedWidth - 1))
991
+ }
992
+ }
993
+ } else {
994
+ if (scrollXLoad) {
995
+ let tdOffsetLeft = 0
996
+ const cellWidth = column.renderWidth
997
+ for (let i = 0; i < visibleColumn.length; i++) {
998
+ const currCol = visibleColumn[i]
999
+ if (currCol === column || currCol.id === column.id) {
1000
+ break
1001
+ }
1002
+ tdOffsetLeft += currCol.renderWidth
1003
+ }
1004
+ // 检测是否在可视区中
1005
+ if (isForce || (
1006
+ !(tdOffsetLeft <= (bodyScrollLeft + leftFixedWidth) && (tdOffsetLeft + cellWidth) > (bodyScrollLeft + leftFixedWidth)) &&
1007
+ !(tdOffsetLeft >= (bodyScrollLeft + leftFixedWidth) && tdOffsetLeft < (bodyScrollLeft + bodyWidth - rightFixedWidth))
1008
+ )) {
1009
+ if (tdOffsetLeft < bodyScrollLeft) {
1010
+ return $xeTable.scrollTo(tdOffsetLeft - leftFixedWidth - 1)
1011
+ }
1012
+ return $xeTable.scrollTo((tdOffsetLeft + cellWidth) - (bodyWidth - rightFixedWidth - 1))
1013
+ }
1014
+ }
1015
+ }
1016
+ }
1017
+ return Promise.resolve()
1018
+ }