vxe-table 3.20.4 → 3.20.6

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 (155) hide show
  1. package/LICENSE +20 -20
  2. package/README.md +106 -106
  3. package/es/grid/style.css +4 -0
  4. package/es/grid/style.min.css +1 -1
  5. package/es/index.css +1 -1
  6. package/es/index.esm.js +1 -2
  7. package/es/index.min.css +1 -1
  8. package/es/style.css +1 -1
  9. package/es/style.min.css +1 -1
  10. package/es/table/src/methods.js +51 -22
  11. package/es/table/src/table.js +36 -0
  12. package/es/table/src/util.js +3 -4
  13. package/es/table/style.css +48 -18
  14. package/es/ui/index.js +1 -1
  15. package/es/ui/src/log.js +1 -1
  16. package/es/vxe-grid/style.css +4 -0
  17. package/es/vxe-grid/style.min.css +1 -1
  18. package/es/vxe-table/style.css +48 -18
  19. package/lib/grid/style/style.css +4 -0
  20. package/lib/grid/style/style.min.css +1 -1
  21. package/lib/index.common.js +1 -2
  22. package/lib/index.css +1 -1
  23. package/lib/index.min.css +1 -1
  24. package/lib/index.umd.js +3252 -1877
  25. package/lib/index.umd.min.js +1 -1
  26. package/lib/style.css +1 -1
  27. package/lib/style.min.css +1 -1
  28. package/lib/table/src/methods.js +4 -3
  29. package/lib/table/src/methods.min.js +1 -1
  30. package/lib/table/src/table.js +44 -0
  31. package/lib/table/src/table.min.js +1 -1
  32. package/lib/table/src/util.js +4 -6
  33. package/lib/table/src/util.min.js +1 -1
  34. package/lib/table/style/style.css +48 -18
  35. package/lib/ui/index.js +1 -1
  36. package/lib/ui/index.min.js +1 -1
  37. package/lib/ui/src/log.js +1 -1
  38. package/lib/ui/src/log.min.js +1 -1
  39. package/lib/v-x-e-table/index.js +1 -2
  40. package/lib/v-x-e-table/index.min.js +1 -1
  41. package/lib/vxe-colgroup/index.js +1 -2
  42. package/lib/vxe-colgroup/index.min.js +1 -1
  43. package/lib/vxe-column/index.js +1 -2
  44. package/lib/vxe-column/index.min.js +1 -1
  45. package/lib/vxe-grid/index.js +1 -2
  46. package/lib/vxe-grid/index.min.js +1 -1
  47. package/lib/vxe-grid/style/style.css +4 -0
  48. package/lib/vxe-grid/style/style.min.css +1 -1
  49. package/lib/vxe-table/index.js +1 -2
  50. package/lib/vxe-table/index.min.js +1 -1
  51. package/lib/vxe-table/style/style.css +48 -18
  52. package/lib/vxe-toolbar/index.js +1 -2
  53. package/lib/vxe-toolbar/index.min.js +1 -1
  54. package/lib/vxe-ui/index.js +1 -2
  55. package/lib/vxe-ui/index.min.js +1 -1
  56. package/lib/vxe-v-x-e-table/index.js +1 -2
  57. package/lib/vxe-v-x-e-table/index.min.js +1 -1
  58. package/package.json +93 -93
  59. package/packages/colgroup/index.ts +22 -22
  60. package/packages/column/index.ts +22 -22
  61. package/packages/components.ts +42 -42
  62. package/packages/grid/index.ts +22 -22
  63. package/packages/grid/src/grid.ts +1935 -1935
  64. package/packages/index.ts +4 -4
  65. package/packages/locale/lang/ar-EG.ts +832 -832
  66. package/packages/locale/lang/de-DE.ts +832 -832
  67. package/packages/locale/lang/en-US.ts +832 -832
  68. package/packages/locale/lang/es-ES.ts +832 -832
  69. package/packages/locale/lang/fr-FR.ts +832 -832
  70. package/packages/locale/lang/hu-HU.ts +832 -832
  71. package/packages/locale/lang/hy-AM.ts +832 -832
  72. package/packages/locale/lang/id-ID.ts +832 -832
  73. package/packages/locale/lang/it-IT.ts +832 -832
  74. package/packages/locale/lang/ja-JP.ts +832 -832
  75. package/packages/locale/lang/ko-KR.ts +832 -832
  76. package/packages/locale/lang/ms-MY.ts +832 -832
  77. package/packages/locale/lang/nb-NO.ts +832 -832
  78. package/packages/locale/lang/pt-BR.ts +832 -832
  79. package/packages/locale/lang/ru-RU.ts +832 -832
  80. package/packages/locale/lang/th-TH.ts +832 -832
  81. package/packages/locale/lang/ug-CN.ts +832 -832
  82. package/packages/locale/lang/uk-UA.ts +832 -832
  83. package/packages/locale/lang/uz-UZ.ts +832 -832
  84. package/packages/locale/lang/vi-VN.ts +832 -832
  85. package/packages/locale/lang/zh-CHT.ts +832 -832
  86. package/packages/locale/lang/zh-CN.ts +832 -832
  87. package/packages/locale/lang/zh-HK.ts +3 -3
  88. package/packages/locale/lang/zh-MO.ts +3 -3
  89. package/packages/locale/lang/zh-TC.ts +3 -3
  90. package/packages/locale/lang/zh-TW.ts +3 -3
  91. package/packages/table/index.ts +49 -49
  92. package/packages/table/module/custom/mixin.ts +369 -369
  93. package/packages/table/module/custom/panel.ts +1461 -1461
  94. package/packages/table/module/edit/mixin.ts +1123 -1123
  95. package/packages/table/module/export/export-panel.ts +658 -658
  96. package/packages/table/module/export/import-panel.ts +319 -319
  97. package/packages/table/module/export/mixin.ts +1693 -1693
  98. package/packages/table/module/export/util.ts +24 -24
  99. package/packages/table/module/filter/mixin.ts +507 -507
  100. package/packages/table/module/filter/panel.ts +329 -329
  101. package/packages/table/module/keyboard/mixin.ts +513 -513
  102. package/packages/table/module/menu/mixin.ts +329 -329
  103. package/packages/table/module/menu/panel.ts +212 -212
  104. package/packages/table/module/validator/mixin.ts +626 -626
  105. package/packages/table/render/index.ts +1456 -1456
  106. package/packages/table/src/body.ts +969 -969
  107. package/packages/table/src/cell.ts +1285 -1285
  108. package/packages/table/src/column.ts +205 -205
  109. package/packages/table/src/columnInfo.ts +228 -228
  110. package/packages/table/src/footer.ts +388 -388
  111. package/packages/table/src/group.ts +51 -51
  112. package/packages/table/src/header.ts +602 -602
  113. package/packages/table/src/methods.ts +12939 -12912
  114. package/packages/table/src/props.ts +311 -311
  115. package/packages/table/src/store.ts +15 -15
  116. package/packages/table/src/table.ts +2502 -2460
  117. package/packages/table/src/util.ts +1012 -1012
  118. package/packages/toolbar/index.ts +18 -18
  119. package/packages/toolbar/src/toolbar.ts +856 -856
  120. package/packages/ui/index.ts +530 -530
  121. package/packages/ui/src/anime.ts +52 -52
  122. package/packages/ui/src/comp.ts +3 -3
  123. package/packages/ui/src/dom.ts +236 -236
  124. package/packages/ui/src/log.ts +8 -8
  125. package/packages/ui/src/utils.ts +56 -56
  126. package/packages/ui/src/vn.ts +65 -65
  127. package/packages/v-x-e-table/index.ts +4 -4
  128. package/styles/all.scss +7 -7
  129. package/styles/base.scss +16 -16
  130. package/styles/components/grid.scss +89 -85
  131. package/styles/components/icon.scss +225 -225
  132. package/styles/components/old-icon.scss +715 -715
  133. package/styles/components/table-module/all.scss +6 -6
  134. package/styles/components/table-module/custom.scss +527 -527
  135. package/styles/components/table-module/export.scss +130 -130
  136. package/styles/components/table-module/filter.scss +130 -130
  137. package/styles/components/table-module/menu.scss +81 -81
  138. package/styles/components/table.scss +2679 -2679
  139. package/styles/components/toolbar.scss +119 -119
  140. package/styles/default.scss +2 -2
  141. package/styles/helpers/baseMixin.scss +95 -95
  142. package/styles/index.scss +3 -3
  143. package/styles/modules.scss +5 -5
  144. package/styles/theme/base.scss +93 -93
  145. package/styles/theme/dark.scss +49 -49
  146. package/styles/theme/light.scss +44 -44
  147. package/styles/variable.scss +43 -43
  148. package/types/all.d.ts +53 -53
  149. package/types/index.d.ts +4 -4
  150. /package/es/{iconfont.1773644050430.ttf → iconfont.1773972972913.ttf} +0 -0
  151. /package/es/{iconfont.1773644050430.woff → iconfont.1773972972913.woff} +0 -0
  152. /package/es/{iconfont.1773644050430.woff2 → iconfont.1773972972913.woff2} +0 -0
  153. /package/lib/{iconfont.1773644050430.ttf → iconfont.1773972972913.ttf} +0 -0
  154. /package/lib/{iconfont.1773644050430.woff → iconfont.1773972972913.woff} +0 -0
  155. /package/lib/{iconfont.1773644050430.woff2 → iconfont.1773972972913.woff2} +0 -0
@@ -1,507 +1,507 @@
1
- import XEUtils from 'xe-utils'
2
- import { VxeUI } from '../../../ui'
3
- import { toFilters, handleFieldOrColumn, getRefElem } from '../../src/util'
4
- import { toCssUnit, triggerEvent, getDomNode } from '../../../ui/src/dom'
5
- import { isEnableConf } from '../../../ui/src/utils'
6
-
7
- import type { VxeTableConstructor, VxeTableDefines, TableReactData, TableInternalData, VxeColumnPropTypes, VxeTablePrivateMethods } from '../../../../types'
8
-
9
- const { renderer } = VxeUI
10
-
11
- const sourceType = 'table'
12
-
13
- export default {
14
- methods: {
15
- /**
16
- * 手动弹出筛选面板
17
- * @param column
18
- */
19
- _openFilter (fieldOrColumn: any) {
20
- const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
21
- const $xeGrid = $xeTable.$xeGrid
22
- const $xeGantt = $xeTable.$xeGantt
23
-
24
- const column = handleFieldOrColumn(this, fieldOrColumn)
25
- if (column && column.filters) {
26
- const { elemStore } = this
27
- const { fixed, filters } = column
28
- return $xeTable.scrollToColumn(column).then(() => {
29
- const headerWrapperElem = (elemStore[`${fixed || 'main'}-header-wrapper`] || elemStore['main-header-wrapper']) as HTMLElement
30
- if (headerWrapperElem) {
31
- const filterBtnElem = headerWrapperElem.querySelector<HTMLElement>(`.vxe-header--column.${column.id} .vxe-cell--filter`)
32
- if (filterBtnElem) {
33
- triggerEvent(filterBtnElem, 'click')
34
- } else {
35
- const colEl = headerWrapperElem.querySelector<HTMLElement>(`.vxe-header--column.${column.id}`)
36
- if (colEl) {
37
- let firstFilterOption: VxeTableDefines.FilterOption | null = null
38
- if (filters) {
39
- firstFilterOption = filters[0] as VxeTableDefines.FilterOption
40
- }
41
- const params = {
42
- $table: $xeTable,
43
- $grid: $xeGrid,
44
- $gantt: $xeGantt,
45
- $rowIndex: -1,
46
- column,
47
- columnIndex: $xeTable.getColumnIndex(column),
48
- $columnIndex: $xeTable.getVMColumnIndex(column),
49
- _columnIndex: $xeTable.getVTColumnIndex(column),
50
- firstFilterOption: firstFilterOption as VxeTableDefines.FilterOption,
51
- fixed,
52
- source: sourceType,
53
- type: 'header'
54
- // isHidden
55
- // hasFilter
56
- }
57
- $xeTable.handleOpenFilterColumn(new Event('click'), null, colEl, column, params)
58
- }
59
- }
60
- }
61
- })
62
- }
63
- return $xeTable.$nextTick()
64
- },
65
- /**
66
- * 修改筛选条件列表
67
- * @param {ColumnInfo} fieldOrColumn 列
68
- * @param {Array} options 选项
69
- */
70
- _setFilter (fieldOrColumn: any, options: any, isUpdate: any) {
71
- const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
72
- const reactData = $xeTable as unknown as TableReactData
73
-
74
- const { filterStore } = reactData
75
- const column = handleFieldOrColumn($xeTable, fieldOrColumn)
76
- if (column && column.filters) {
77
- column.filters = toFilters(options || [], column.id)
78
- if (isUpdate) {
79
- return $xeTable.handleColumnConfirmFilter(column, null)
80
- } else {
81
- if (filterStore.visible) {
82
- $xeTable.handleFilterOptions(column)
83
- }
84
- }
85
- }
86
- return $xeTable.$nextTick()
87
- },
88
- checkFilterOptions () {
89
- const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
90
- const reactData = $xeTable as unknown as TableReactData
91
-
92
- const { filterStore } = reactData
93
- const { column } = filterStore
94
- if (column) {
95
- const filterOptions = (column.filters || []) as VxeTableDefines.FilterOption[]
96
- filterStore.isAllSelected = filterOptions.every((item) => item._checked)
97
- filterStore.isIndeterminate = !filterStore.isAllSelected && filterOptions.some((item) => item._checked)
98
- }
99
- },
100
- handleOpenFilterColumn (evnt: MouseEvent, btnEl: HTMLDivElement | null, colEl: HTMLDivElement, column: VxeTableDefines.ColumnInfo, params: any) {
101
- const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
102
- const $xeGrid = $xeTable.$xeGrid
103
- const $xeGantt = $xeTable.$xeGantt
104
- const reactData = $xeTable as unknown as TableReactData
105
- const internalData = $xeTable as unknown as TableInternalData
106
- const $xeGGWrapper = $xeGrid || $xeGantt
107
-
108
- const { initStore, filterStore } = reactData
109
- const { elemStore } = internalData
110
- if (filterStore.column === column && filterStore.visible) {
111
- filterStore.visible = false
112
- } else {
113
- const tableEl = $xeTable.$refs.refElem as HTMLDivElement
114
- const { scrollTop, scrollLeft, visibleHeight, visibleWidth } = getDomNode()
115
- const filterOpts = $xeTable.computeFilterOpts
116
- const { maxHeight: customMaxHeight, transfer, zIndex } = filterOpts
117
- const currEl = btnEl || colEl
118
- const tableRect = tableEl.getBoundingClientRect()
119
- const filterRender = column ? column.filterRender : null
120
- const compConf = filterRender && isEnableConf(filterRender) ? renderer.get(filterRender.name) : null
121
- $xeTable.handleFilterOptions(column)
122
- internalData._currFilterParams = params
123
- filterStore.style = null
124
- filterStore.visible = true
125
- initStore.filter = true
126
- $xeTable.$nextTick(() => {
127
- const headerScrollElem = getRefElem(elemStore['main-header-scroll'])
128
- if (!headerScrollElem) {
129
- return
130
- }
131
- const tableFilter = $xeTable.$refs.refTableFilter
132
- const filterWrapperElem = tableFilter ? (tableFilter as any).$el as HTMLDivElement : null
133
- if (!filterWrapperElem) {
134
- return
135
- }
136
- const btnRect = currEl.getBoundingClientRect()
137
- const filterHeadElem = filterWrapperElem.querySelector<HTMLDivElement>('.vxe-table--filter-header')
138
- const filterFootElem = filterWrapperElem.querySelector<HTMLDivElement>('.vxe-table--filter-footer')
139
- const filterWidth = filterWrapperElem.offsetWidth
140
- const centerWidth = filterWidth / 2
141
- let left = 0
142
- let top = 0
143
- let maxHeight = 0
144
- if (transfer) {
145
- left = btnRect.left - centerWidth + scrollLeft
146
- top = btnRect.top + currEl.clientHeight + scrollTop
147
- maxHeight = Math.min(Math.max(tableRect.height, Math.floor(visibleHeight / 2)), Math.max(80, visibleHeight - top - (filterHeadElem ? filterHeadElem.clientHeight : 0) - (filterFootElem ? filterFootElem.clientHeight : 0) - 28))
148
- if (left < 16) {
149
- left = 16
150
- } else if (left > (visibleWidth - filterWidth - 16)) {
151
- left = visibleWidth - filterWidth - 16
152
- }
153
- } else {
154
- left = btnRect.left - tableRect.left - centerWidth
155
- top = btnRect.top - tableRect.top + currEl.clientHeight
156
- maxHeight = Math.max(40, tableEl.clientHeight - top - (filterHeadElem ? filterHeadElem.clientHeight : 0) - (filterFootElem ? filterFootElem.clientHeight : 0) - 14)
157
- if (left < 1) {
158
- left = 1
159
- } else if (left > (tableEl.clientWidth - filterWidth - 1)) {
160
- left = tableEl.clientWidth - filterWidth - 1
161
- }
162
- if ($xeGGWrapper) {
163
- const wrapperEl = $xeGGWrapper.$refs.refElem as HTMLDivElement
164
- if (wrapperEl) {
165
- const wrapperRect = wrapperEl.getBoundingClientRect()
166
- top += tableRect.top - wrapperRect.top
167
- }
168
- }
169
- }
170
- const fStys: Record<string, any> = {
171
- top: toCssUnit(top),
172
- left: toCssUnit(left)
173
- }
174
- if (zIndex) {
175
- fStys.zIndex = zIndex
176
- }
177
- filterStore.style = fStys
178
- // 筛选面板是自适应表格高度
179
- if (compConf ? !compConf.tableFilterAutoHeight : false) {
180
- maxHeight = 0
181
- } else {
182
- if (customMaxHeight) {
183
- maxHeight = customMaxHeight > maxHeight ? maxHeight : customMaxHeight
184
- }
185
- }
186
- // 判断面板不能大于表格高度
187
- filterStore.maxHeight = maxHeight
188
- })
189
- }
190
- $xeTable.dispatchEvent('filter-visible', { column, field: column.field, property: column.field, filterList: $xeTable.getCheckedFilters(), visible: filterStore.visible }, evnt)
191
- },
192
- /**
193
- * 点击筛选事件
194
- * 当筛选图标被点击时触发
195
- * 更新选项是否全部状态
196
- * 打开筛选面板
197
- * @param {Event} evnt 事件
198
- * @param {ColumnInfo} column 列配置
199
- * @param {Object} params 参数
200
- */
201
- triggerFilterEvent (evnt: MouseEvent, column: VxeTableDefines.ColumnInfo, params: any) {
202
- const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
203
- const internalData = $xeTable as unknown as TableInternalData
204
-
205
- const { elemStore } = internalData
206
- const { fixed } = column
207
- const headerWrapperElem = getRefElem(elemStore[`${fixed || 'main'}-header-wrapper`] || elemStore['main-header-wrapper'])
208
- const btnElem = evnt.currentTarget as HTMLDivElement
209
- const colEl = headerWrapperElem ? headerWrapperElem.querySelector<HTMLElement>(`.vxe-header--column.${column.id}`) : null
210
- $xeTable.handleOpenFilterColumn(evnt, btnElem, colEl || btnElem, column, params)
211
- },
212
- // (单选)筛选发生改变
213
- handleFilterChangeRadioOption (evnt: Event, checked: boolean, item: any) {
214
- const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
215
- const reactData = $xeTable as unknown as TableReactData
216
-
217
- const { filterStore } = reactData
218
- const { column } = filterStore
219
- if (column) {
220
- const filterOptions = (column.filters || []) as VxeTableDefines.FilterOption[]
221
- filterOptions.forEach((option) => {
222
- option._checked = false
223
- })
224
- item._checked = checked
225
- $xeTable.checkFilterOptions()
226
- $xeTable.handleFilterConfirmFilter(evnt, column)
227
- }
228
- },
229
- // (多选)筛选发生改变
230
- handleFilterChangeMultipleOption (evnt: Event, checked: boolean, item: any) {
231
- const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
232
-
233
- item._checked = checked
234
- $xeTable.checkFilterOptions()
235
- },
236
- // 筛选发生改变
237
- handleFilterChangeOption (evnt: Event, checked: boolean, item: any) {
238
- const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
239
- const reactData = $xeTable as unknown as TableReactData
240
- const internalData = $xeTable as unknown as TableInternalData
241
-
242
- const { filterStore } = reactData
243
- const { fullColumnIdData } = internalData
244
- let column = filterStore.column
245
- if (!column) {
246
- const colRest = fullColumnIdData[item._colId]
247
- if (colRest) {
248
- column = colRest.column
249
- filterStore.column = column
250
- }
251
- }
252
- if (column) {
253
- if (column.filterMultiple) {
254
- $xeTable.handleFilterChangeMultipleOption(evnt, checked, item)
255
- } else {
256
- $xeTable.handleFilterChangeRadioOption(evnt, checked, item)
257
- }
258
- }
259
- },
260
- // 确认筛选
261
- handleFilterConfirmFilter (evnt: Event | null, column: VxeTableDefines.ColumnInfo) {
262
- const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
263
-
264
- if (column) {
265
- const filterOptions = (column.filters || []) as VxeTableDefines.FilterOption[]
266
- filterOptions.forEach((option) => {
267
- option.checked = option._checked
268
- })
269
- $xeTable.confirmFilterEvent(evnt, column)
270
- }
271
- },
272
- _saveFilter (fieldOrColumn?: VxeColumnPropTypes.Field | VxeTableDefines.ColumnInfo | null) {
273
- const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
274
-
275
- if (fieldOrColumn) {
276
- const column = handleFieldOrColumn($xeTable, fieldOrColumn)
277
- $xeTable.handleFilterConfirmFilter(null, column)
278
- }
279
- return $xeTable.$nextTick()
280
- },
281
- _saveFilterByEvent (evnt: Event, fieldOrColumn: VxeColumnPropTypes.Field | VxeTableDefines.ColumnInfo | null) {
282
- const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
283
-
284
- if (fieldOrColumn) {
285
- const column = handleFieldOrColumn($xeTable, fieldOrColumn)
286
- $xeTable.handleFilterConfirmFilter(evnt, column)
287
- }
288
- return $xeTable.$nextTick()
289
- },
290
- _resetFilter (fieldOrColumn?: VxeColumnPropTypes.Field | VxeTableDefines.ColumnInfo | null) {
291
- const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
292
-
293
- if (fieldOrColumn) {
294
- const column = handleFieldOrColumn($xeTable, fieldOrColumn)
295
- $xeTable.handleFilterResetFilter(null, column)
296
- }
297
- return $xeTable.$nextTick()
298
- },
299
- _resetFilterByEvent (evnt: Event, fieldOrColumn: VxeColumnPropTypes.Field | VxeTableDefines.ColumnInfo | null) {
300
- const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
301
-
302
- if (fieldOrColumn) {
303
- const column = handleFieldOrColumn($xeTable, fieldOrColumn)
304
- $xeTable.handleFilterResetFilter(evnt, column)
305
- }
306
- return $xeTable.$nextTick()
307
- },
308
- _saveFilterPanel () {
309
- const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
310
- const reactData = $xeTable as unknown as TableReactData
311
-
312
- const { filterStore } = reactData
313
- $xeTable.handleFilterConfirmFilter(null, filterStore.column || null)
314
- return $xeTable.$nextTick()
315
- },
316
- _saveFilterPanelByEvent (evnt: Event) {
317
- const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
318
- const reactData = $xeTable as unknown as TableReactData
319
-
320
- const { filterStore } = reactData
321
- $xeTable.handleFilterConfirmFilter(evnt, filterStore.column || null)
322
- return $xeTable.$nextTick()
323
- },
324
- _resetFilterPanel () {
325
- const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
326
- const reactData = $xeTable as unknown as TableReactData
327
-
328
- const { filterStore } = reactData
329
- $xeTable.handleFilterResetFilter(null, filterStore.column || null)
330
- return $xeTable.$nextTick()
331
- },
332
- _resetFilterPanelByEvent (evnt: Event) {
333
- const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
334
- const reactData = $xeTable as unknown as TableReactData
335
-
336
- const { filterStore } = reactData
337
- $xeTable.handleFilterResetFilter(evnt, filterStore.column || null)
338
- return $xeTable.$nextTick()
339
- },
340
- _getCheckedFilters () {
341
- const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
342
- const internalData = $xeTable as unknown as TableInternalData
343
-
344
- const { tableFullColumn } = internalData
345
- const filterList: VxeTableDefines.FilterCheckedParams[] = []
346
- tableFullColumn.forEach((column) => {
347
- const { field, filters } = column
348
- const filterOptions = filters || []
349
- const valueList: any[] = []
350
- const dataList: any[] = []
351
- if (filterOptions) {
352
- filterOptions.forEach((item) => {
353
- if (item.checked) {
354
- valueList.push(item.value)
355
- dataList.push(item.data)
356
- }
357
- })
358
- if (valueList.length) {
359
- filterList.push({ column, field, property: field, values: valueList, datas: dataList })
360
- }
361
- }
362
- })
363
- return filterList
364
- },
365
- handleColumnConfirmFilter (column: VxeTableDefines.ColumnInfo, evnt: Event | null) {
366
- const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
367
- const props = $xeTable
368
- const reactData = $xeTable as unknown as TableReactData
369
-
370
- const { mouseConfig } = props
371
- const { scrollXLoad: oldScrollXLoad, scrollYLoad: oldScrollYLoad } = reactData
372
- const filterOpts = $xeTable.computeFilterOpts
373
- const mouseOpts = $xeTable.computeMouseOpts
374
- const { field, filters } = column
375
- const filterOptions = filters || []
376
- const values: any[] = []
377
- const datas: any[] = []
378
- filterOptions.forEach((item) => {
379
- if (item.checked) {
380
- values.push(item.value)
381
- datas.push(item.data)
382
- }
383
- })
384
- const filterList = $xeTable.getCheckedFilters()
385
- const params = { $table: $xeTable, $event: evnt as Event, column, field, property: field, values, datas, filters: filterList, filterList }
386
- // 如果是服务端筛选,则跳过本地筛选处理
387
- if (!filterOpts.remote) {
388
- $xeTable.handleTableData(true)
389
- $xeTable.checkSelectionStatus()
390
- }
391
- if (mouseConfig && mouseOpts.area && $xeTable.handleFilterEvent) {
392
- $xeTable.handleFilterEvent(evnt as Event, params)
393
- }
394
- if (evnt) {
395
- $xeTable.dispatchEvent('filter-change', params, evnt)
396
- }
397
- $xeTable.closeFilter()
398
- return $xeTable.updateFooter().then(() => {
399
- const { scrollXLoad, scrollYLoad } = reactData
400
- if ((oldScrollXLoad || scrollXLoad) || (oldScrollYLoad || scrollYLoad)) {
401
- if ((oldScrollXLoad || scrollXLoad)) {
402
- $xeTable.updateScrollXSpace()
403
- }
404
- if ((oldScrollYLoad || scrollYLoad)) {
405
- $xeTable.updateScrollYSpace()
406
- }
407
- return $xeTable.refreshScroll()
408
- }
409
- }).then(() => {
410
- $xeTable.updateCellAreas()
411
- return $xeTable.recalculate(true)
412
- }).then(() => {
413
- // 存在滚动行为未结束情况
414
- setTimeout(() => $xeTable.recalculate(), 50)
415
- })
416
- },
417
- /**
418
- * 确认筛选
419
- * 当筛选面板中的确定按钮被按下时触发
420
- */
421
- confirmFilterEvent (evnt: Event, column: VxeTableDefines.ColumnInfo) {
422
- const $xeTable = this
423
-
424
- if (column) {
425
- $xeTable.handleColumnConfirmFilter(column, evnt)
426
- }
427
- },
428
- handleClearFilter (column: any) {
429
- const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
430
-
431
- if (column) {
432
- const { filters, filterRender } = column
433
- if (filters) {
434
- const compConf = isEnableConf(filterRender) ? renderer.get(filterRender.name) : null
435
- const filterResetMethod = column.filterResetMethod || (compConf ? (compConf.tableFilterResetMethod || compConf.filterResetMethod) : null)
436
- filters.forEach((item: any) => {
437
- item._checked = false
438
- item.checked = false
439
- if (!filterResetMethod) {
440
- item.data = XEUtils.clone(item.resetValue, true)
441
- }
442
- })
443
- if (filterResetMethod) {
444
- filterResetMethod({ options: filters, column, $table: $xeTable })
445
- }
446
- }
447
- }
448
- },
449
- /**
450
- * 重置筛选
451
- * 当筛选面板中的重置按钮被按下时触发
452
- * @param {Event} evnt 事件
453
- */
454
- handleFilterResetFilter (evnt: Event, column: VxeTableDefines.ColumnInfo) {
455
- const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
456
-
457
- if (column) {
458
- $xeTable.handleClearFilter(column)
459
- $xeTable.confirmFilterEvent(evnt, column)
460
- if (evnt) {
461
- $xeTable.dispatchEvent('clear-filter', { filterList: [] }, evnt)
462
- }
463
- }
464
- },
465
- /**
466
- * 清空指定列的筛选条件
467
- * 如果为空则清空所有列的筛选条件
468
- * @param {String} fieldOrColumn 列
469
- */
470
- _clearFilter (fieldOrColumn: string | VxeTableDefines.ColumnInfo<any> | null | undefined) {
471
- const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
472
- const reactData = $xeTable as unknown as TableReactData
473
- const internalData = $xeTable as unknown as TableInternalData
474
-
475
- const { filterStore } = reactData
476
- const { tableFullColumn } = internalData
477
- let column
478
- if (fieldOrColumn) {
479
- column = handleFieldOrColumn($xeTable, fieldOrColumn)
480
- if (column) {
481
- $xeTable.handleClearFilter(column)
482
- }
483
- } else {
484
- tableFullColumn.forEach($xeTable.handleClearFilter)
485
- }
486
- if (!fieldOrColumn || column !== filterStore.column) {
487
- Object.assign(filterStore, {
488
- isAllSelected: false,
489
- isIndeterminate: false,
490
- style: null,
491
- options: [],
492
- column: null,
493
- multiple: false,
494
- visible: false
495
- })
496
- }
497
- return $xeTable.updateData()
498
- },
499
- _updateFilterOptionStatus (item: any, checked: boolean) {
500
- const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
501
-
502
- item._checked = checked
503
- item.checked = checked
504
- return $xeTable.$nextTick()
505
- }
506
- } as any
507
- }
1
+ import XEUtils from 'xe-utils'
2
+ import { VxeUI } from '../../../ui'
3
+ import { toFilters, handleFieldOrColumn, getRefElem } from '../../src/util'
4
+ import { toCssUnit, triggerEvent, getDomNode } from '../../../ui/src/dom'
5
+ import { isEnableConf } from '../../../ui/src/utils'
6
+
7
+ import type { VxeTableConstructor, VxeTableDefines, TableReactData, TableInternalData, VxeColumnPropTypes, VxeTablePrivateMethods } from '../../../../types'
8
+
9
+ const { renderer } = VxeUI
10
+
11
+ const sourceType = 'table'
12
+
13
+ export default {
14
+ methods: {
15
+ /**
16
+ * 手动弹出筛选面板
17
+ * @param column
18
+ */
19
+ _openFilter (fieldOrColumn: any) {
20
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
21
+ const $xeGrid = $xeTable.$xeGrid
22
+ const $xeGantt = $xeTable.$xeGantt
23
+
24
+ const column = handleFieldOrColumn(this, fieldOrColumn)
25
+ if (column && column.filters) {
26
+ const { elemStore } = this
27
+ const { fixed, filters } = column
28
+ return $xeTable.scrollToColumn(column).then(() => {
29
+ const headerWrapperElem = (elemStore[`${fixed || 'main'}-header-wrapper`] || elemStore['main-header-wrapper']) as HTMLElement
30
+ if (headerWrapperElem) {
31
+ const filterBtnElem = headerWrapperElem.querySelector<HTMLElement>(`.vxe-header--column.${column.id} .vxe-cell--filter`)
32
+ if (filterBtnElem) {
33
+ triggerEvent(filterBtnElem, 'click')
34
+ } else {
35
+ const colEl = headerWrapperElem.querySelector<HTMLElement>(`.vxe-header--column.${column.id}`)
36
+ if (colEl) {
37
+ let firstFilterOption: VxeTableDefines.FilterOption | null = null
38
+ if (filters) {
39
+ firstFilterOption = filters[0] as VxeTableDefines.FilterOption
40
+ }
41
+ const params = {
42
+ $table: $xeTable,
43
+ $grid: $xeGrid,
44
+ $gantt: $xeGantt,
45
+ $rowIndex: -1,
46
+ column,
47
+ columnIndex: $xeTable.getColumnIndex(column),
48
+ $columnIndex: $xeTable.getVMColumnIndex(column),
49
+ _columnIndex: $xeTable.getVTColumnIndex(column),
50
+ firstFilterOption: firstFilterOption as VxeTableDefines.FilterOption,
51
+ fixed,
52
+ source: sourceType,
53
+ type: 'header'
54
+ // isHidden
55
+ // hasFilter
56
+ }
57
+ $xeTable.handleOpenFilterColumn(new Event('click'), null, colEl, column, params)
58
+ }
59
+ }
60
+ }
61
+ })
62
+ }
63
+ return $xeTable.$nextTick()
64
+ },
65
+ /**
66
+ * 修改筛选条件列表
67
+ * @param {ColumnInfo} fieldOrColumn 列
68
+ * @param {Array} options 选项
69
+ */
70
+ _setFilter (fieldOrColumn: any, options: any, isUpdate: any) {
71
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
72
+ const reactData = $xeTable as unknown as TableReactData
73
+
74
+ const { filterStore } = reactData
75
+ const column = handleFieldOrColumn($xeTable, fieldOrColumn)
76
+ if (column && column.filters) {
77
+ column.filters = toFilters(options || [], column.id)
78
+ if (isUpdate) {
79
+ return $xeTable.handleColumnConfirmFilter(column, null)
80
+ } else {
81
+ if (filterStore.visible) {
82
+ $xeTable.handleFilterOptions(column)
83
+ }
84
+ }
85
+ }
86
+ return $xeTable.$nextTick()
87
+ },
88
+ checkFilterOptions () {
89
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
90
+ const reactData = $xeTable as unknown as TableReactData
91
+
92
+ const { filterStore } = reactData
93
+ const { column } = filterStore
94
+ if (column) {
95
+ const filterOptions = (column.filters || []) as VxeTableDefines.FilterOption[]
96
+ filterStore.isAllSelected = filterOptions.every((item) => item._checked)
97
+ filterStore.isIndeterminate = !filterStore.isAllSelected && filterOptions.some((item) => item._checked)
98
+ }
99
+ },
100
+ handleOpenFilterColumn (evnt: MouseEvent, btnEl: HTMLDivElement | null, colEl: HTMLDivElement, column: VxeTableDefines.ColumnInfo, params: any) {
101
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
102
+ const $xeGrid = $xeTable.$xeGrid
103
+ const $xeGantt = $xeTable.$xeGantt
104
+ const reactData = $xeTable as unknown as TableReactData
105
+ const internalData = $xeTable as unknown as TableInternalData
106
+ const $xeGGWrapper = $xeGrid || $xeGantt
107
+
108
+ const { initStore, filterStore } = reactData
109
+ const { elemStore } = internalData
110
+ if (filterStore.column === column && filterStore.visible) {
111
+ filterStore.visible = false
112
+ } else {
113
+ const tableEl = $xeTable.$refs.refElem as HTMLDivElement
114
+ const { scrollTop, scrollLeft, visibleHeight, visibleWidth } = getDomNode()
115
+ const filterOpts = $xeTable.computeFilterOpts
116
+ const { maxHeight: customMaxHeight, transfer, zIndex } = filterOpts
117
+ const currEl = btnEl || colEl
118
+ const tableRect = tableEl.getBoundingClientRect()
119
+ const filterRender = column ? column.filterRender : null
120
+ const compConf = filterRender && isEnableConf(filterRender) ? renderer.get(filterRender.name) : null
121
+ $xeTable.handleFilterOptions(column)
122
+ internalData._currFilterParams = params
123
+ filterStore.style = null
124
+ filterStore.visible = true
125
+ initStore.filter = true
126
+ $xeTable.$nextTick(() => {
127
+ const headerScrollElem = getRefElem(elemStore['main-header-scroll'])
128
+ if (!headerScrollElem) {
129
+ return
130
+ }
131
+ const tableFilter = $xeTable.$refs.refTableFilter
132
+ const filterWrapperElem = tableFilter ? (tableFilter as any).$el as HTMLDivElement : null
133
+ if (!filterWrapperElem) {
134
+ return
135
+ }
136
+ const btnRect = currEl.getBoundingClientRect()
137
+ const filterHeadElem = filterWrapperElem.querySelector<HTMLDivElement>('.vxe-table--filter-header')
138
+ const filterFootElem = filterWrapperElem.querySelector<HTMLDivElement>('.vxe-table--filter-footer')
139
+ const filterWidth = filterWrapperElem.offsetWidth
140
+ const centerWidth = filterWidth / 2
141
+ let left = 0
142
+ let top = 0
143
+ let maxHeight = 0
144
+ if (transfer) {
145
+ left = btnRect.left - centerWidth + scrollLeft
146
+ top = btnRect.top + currEl.clientHeight + scrollTop
147
+ maxHeight = Math.min(Math.max(tableRect.height, Math.floor(visibleHeight / 2)), Math.max(80, visibleHeight - top - (filterHeadElem ? filterHeadElem.clientHeight : 0) - (filterFootElem ? filterFootElem.clientHeight : 0) - 28))
148
+ if (left < 16) {
149
+ left = 16
150
+ } else if (left > (visibleWidth - filterWidth - 16)) {
151
+ left = visibleWidth - filterWidth - 16
152
+ }
153
+ } else {
154
+ left = btnRect.left - tableRect.left - centerWidth
155
+ top = btnRect.top - tableRect.top + currEl.clientHeight
156
+ maxHeight = Math.max(40, tableEl.clientHeight - top - (filterHeadElem ? filterHeadElem.clientHeight : 0) - (filterFootElem ? filterFootElem.clientHeight : 0) - 14)
157
+ if (left < 1) {
158
+ left = 1
159
+ } else if (left > (tableEl.clientWidth - filterWidth - 1)) {
160
+ left = tableEl.clientWidth - filterWidth - 1
161
+ }
162
+ if ($xeGGWrapper) {
163
+ const wrapperEl = $xeGGWrapper.$refs.refElem as HTMLDivElement
164
+ if (wrapperEl) {
165
+ const wrapperRect = wrapperEl.getBoundingClientRect()
166
+ top += tableRect.top - wrapperRect.top
167
+ }
168
+ }
169
+ }
170
+ const fStys: Record<string, any> = {
171
+ top: toCssUnit(top),
172
+ left: toCssUnit(left)
173
+ }
174
+ if (zIndex) {
175
+ fStys.zIndex = zIndex
176
+ }
177
+ filterStore.style = fStys
178
+ // 筛选面板是自适应表格高度
179
+ if (compConf ? !compConf.tableFilterAutoHeight : false) {
180
+ maxHeight = 0
181
+ } else {
182
+ if (customMaxHeight) {
183
+ maxHeight = customMaxHeight > maxHeight ? maxHeight : customMaxHeight
184
+ }
185
+ }
186
+ // 判断面板不能大于表格高度
187
+ filterStore.maxHeight = maxHeight
188
+ })
189
+ }
190
+ $xeTable.dispatchEvent('filter-visible', { column, field: column.field, property: column.field, filterList: $xeTable.getCheckedFilters(), visible: filterStore.visible }, evnt)
191
+ },
192
+ /**
193
+ * 点击筛选事件
194
+ * 当筛选图标被点击时触发
195
+ * 更新选项是否全部状态
196
+ * 打开筛选面板
197
+ * @param {Event} evnt 事件
198
+ * @param {ColumnInfo} column 列配置
199
+ * @param {Object} params 参数
200
+ */
201
+ triggerFilterEvent (evnt: MouseEvent, column: VxeTableDefines.ColumnInfo, params: any) {
202
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
203
+ const internalData = $xeTable as unknown as TableInternalData
204
+
205
+ const { elemStore } = internalData
206
+ const { fixed } = column
207
+ const headerWrapperElem = getRefElem(elemStore[`${fixed || 'main'}-header-wrapper`] || elemStore['main-header-wrapper'])
208
+ const btnElem = evnt.currentTarget as HTMLDivElement
209
+ const colEl = headerWrapperElem ? headerWrapperElem.querySelector<HTMLElement>(`.vxe-header--column.${column.id}`) : null
210
+ $xeTable.handleOpenFilterColumn(evnt, btnElem, colEl || btnElem, column, params)
211
+ },
212
+ // (单选)筛选发生改变
213
+ handleFilterChangeRadioOption (evnt: Event, checked: boolean, item: any) {
214
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
215
+ const reactData = $xeTable as unknown as TableReactData
216
+
217
+ const { filterStore } = reactData
218
+ const { column } = filterStore
219
+ if (column) {
220
+ const filterOptions = (column.filters || []) as VxeTableDefines.FilterOption[]
221
+ filterOptions.forEach((option) => {
222
+ option._checked = false
223
+ })
224
+ item._checked = checked
225
+ $xeTable.checkFilterOptions()
226
+ $xeTable.handleFilterConfirmFilter(evnt, column)
227
+ }
228
+ },
229
+ // (多选)筛选发生改变
230
+ handleFilterChangeMultipleOption (evnt: Event, checked: boolean, item: any) {
231
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
232
+
233
+ item._checked = checked
234
+ $xeTable.checkFilterOptions()
235
+ },
236
+ // 筛选发生改变
237
+ handleFilterChangeOption (evnt: Event, checked: boolean, item: any) {
238
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
239
+ const reactData = $xeTable as unknown as TableReactData
240
+ const internalData = $xeTable as unknown as TableInternalData
241
+
242
+ const { filterStore } = reactData
243
+ const { fullColumnIdData } = internalData
244
+ let column = filterStore.column
245
+ if (!column) {
246
+ const colRest = fullColumnIdData[item._colId]
247
+ if (colRest) {
248
+ column = colRest.column
249
+ filterStore.column = column
250
+ }
251
+ }
252
+ if (column) {
253
+ if (column.filterMultiple) {
254
+ $xeTable.handleFilterChangeMultipleOption(evnt, checked, item)
255
+ } else {
256
+ $xeTable.handleFilterChangeRadioOption(evnt, checked, item)
257
+ }
258
+ }
259
+ },
260
+ // 确认筛选
261
+ handleFilterConfirmFilter (evnt: Event | null, column: VxeTableDefines.ColumnInfo) {
262
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
263
+
264
+ if (column) {
265
+ const filterOptions = (column.filters || []) as VxeTableDefines.FilterOption[]
266
+ filterOptions.forEach((option) => {
267
+ option.checked = option._checked
268
+ })
269
+ $xeTable.confirmFilterEvent(evnt, column)
270
+ }
271
+ },
272
+ _saveFilter (fieldOrColumn?: VxeColumnPropTypes.Field | VxeTableDefines.ColumnInfo | null) {
273
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
274
+
275
+ if (fieldOrColumn) {
276
+ const column = handleFieldOrColumn($xeTable, fieldOrColumn)
277
+ $xeTable.handleFilterConfirmFilter(null, column)
278
+ }
279
+ return $xeTable.$nextTick()
280
+ },
281
+ _saveFilterByEvent (evnt: Event, fieldOrColumn: VxeColumnPropTypes.Field | VxeTableDefines.ColumnInfo | null) {
282
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
283
+
284
+ if (fieldOrColumn) {
285
+ const column = handleFieldOrColumn($xeTable, fieldOrColumn)
286
+ $xeTable.handleFilterConfirmFilter(evnt, column)
287
+ }
288
+ return $xeTable.$nextTick()
289
+ },
290
+ _resetFilter (fieldOrColumn?: VxeColumnPropTypes.Field | VxeTableDefines.ColumnInfo | null) {
291
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
292
+
293
+ if (fieldOrColumn) {
294
+ const column = handleFieldOrColumn($xeTable, fieldOrColumn)
295
+ $xeTable.handleFilterResetFilter(null, column)
296
+ }
297
+ return $xeTable.$nextTick()
298
+ },
299
+ _resetFilterByEvent (evnt: Event, fieldOrColumn: VxeColumnPropTypes.Field | VxeTableDefines.ColumnInfo | null) {
300
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
301
+
302
+ if (fieldOrColumn) {
303
+ const column = handleFieldOrColumn($xeTable, fieldOrColumn)
304
+ $xeTable.handleFilterResetFilter(evnt, column)
305
+ }
306
+ return $xeTable.$nextTick()
307
+ },
308
+ _saveFilterPanel () {
309
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
310
+ const reactData = $xeTable as unknown as TableReactData
311
+
312
+ const { filterStore } = reactData
313
+ $xeTable.handleFilterConfirmFilter(null, filterStore.column || null)
314
+ return $xeTable.$nextTick()
315
+ },
316
+ _saveFilterPanelByEvent (evnt: Event) {
317
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
318
+ const reactData = $xeTable as unknown as TableReactData
319
+
320
+ const { filterStore } = reactData
321
+ $xeTable.handleFilterConfirmFilter(evnt, filterStore.column || null)
322
+ return $xeTable.$nextTick()
323
+ },
324
+ _resetFilterPanel () {
325
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
326
+ const reactData = $xeTable as unknown as TableReactData
327
+
328
+ const { filterStore } = reactData
329
+ $xeTable.handleFilterResetFilter(null, filterStore.column || null)
330
+ return $xeTable.$nextTick()
331
+ },
332
+ _resetFilterPanelByEvent (evnt: Event) {
333
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
334
+ const reactData = $xeTable as unknown as TableReactData
335
+
336
+ const { filterStore } = reactData
337
+ $xeTable.handleFilterResetFilter(evnt, filterStore.column || null)
338
+ return $xeTable.$nextTick()
339
+ },
340
+ _getCheckedFilters () {
341
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
342
+ const internalData = $xeTable as unknown as TableInternalData
343
+
344
+ const { tableFullColumn } = internalData
345
+ const filterList: VxeTableDefines.FilterCheckedParams[] = []
346
+ tableFullColumn.forEach((column) => {
347
+ const { field, filters } = column
348
+ const filterOptions = filters || []
349
+ const valueList: any[] = []
350
+ const dataList: any[] = []
351
+ if (filterOptions) {
352
+ filterOptions.forEach((item) => {
353
+ if (item.checked) {
354
+ valueList.push(item.value)
355
+ dataList.push(item.data)
356
+ }
357
+ })
358
+ if (valueList.length) {
359
+ filterList.push({ column, field, property: field, values: valueList, datas: dataList })
360
+ }
361
+ }
362
+ })
363
+ return filterList
364
+ },
365
+ handleColumnConfirmFilter (column: VxeTableDefines.ColumnInfo, evnt: Event | null) {
366
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
367
+ const props = $xeTable
368
+ const reactData = $xeTable as unknown as TableReactData
369
+
370
+ const { mouseConfig } = props
371
+ const { scrollXLoad: oldScrollXLoad, scrollYLoad: oldScrollYLoad } = reactData
372
+ const filterOpts = $xeTable.computeFilterOpts
373
+ const mouseOpts = $xeTable.computeMouseOpts
374
+ const { field, filters } = column
375
+ const filterOptions = filters || []
376
+ const values: any[] = []
377
+ const datas: any[] = []
378
+ filterOptions.forEach((item) => {
379
+ if (item.checked) {
380
+ values.push(item.value)
381
+ datas.push(item.data)
382
+ }
383
+ })
384
+ const filterList = $xeTable.getCheckedFilters()
385
+ const params = { $table: $xeTable, $event: evnt as Event, column, field, property: field, values, datas, filters: filterList, filterList }
386
+ // 如果是服务端筛选,则跳过本地筛选处理
387
+ if (!filterOpts.remote) {
388
+ $xeTable.handleTableData(true)
389
+ $xeTable.checkSelectionStatus()
390
+ }
391
+ if (mouseConfig && mouseOpts.area && $xeTable.handleFilterEvent) {
392
+ $xeTable.handleFilterEvent(evnt as Event, params)
393
+ }
394
+ if (evnt) {
395
+ $xeTable.dispatchEvent('filter-change', params, evnt)
396
+ }
397
+ $xeTable.closeFilter()
398
+ return $xeTable.updateFooter().then(() => {
399
+ const { scrollXLoad, scrollYLoad } = reactData
400
+ if ((oldScrollXLoad || scrollXLoad) || (oldScrollYLoad || scrollYLoad)) {
401
+ if ((oldScrollXLoad || scrollXLoad)) {
402
+ $xeTable.updateScrollXSpace()
403
+ }
404
+ if ((oldScrollYLoad || scrollYLoad)) {
405
+ $xeTable.updateScrollYSpace()
406
+ }
407
+ return $xeTable.refreshScroll()
408
+ }
409
+ }).then(() => {
410
+ $xeTable.updateCellAreas()
411
+ return $xeTable.recalculate(true)
412
+ }).then(() => {
413
+ // 存在滚动行为未结束情况
414
+ setTimeout(() => $xeTable.recalculate(), 50)
415
+ })
416
+ },
417
+ /**
418
+ * 确认筛选
419
+ * 当筛选面板中的确定按钮被按下时触发
420
+ */
421
+ confirmFilterEvent (evnt: Event, column: VxeTableDefines.ColumnInfo) {
422
+ const $xeTable = this
423
+
424
+ if (column) {
425
+ $xeTable.handleColumnConfirmFilter(column, evnt)
426
+ }
427
+ },
428
+ handleClearFilter (column: any) {
429
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
430
+
431
+ if (column) {
432
+ const { filters, filterRender } = column
433
+ if (filters) {
434
+ const compConf = isEnableConf(filterRender) ? renderer.get(filterRender.name) : null
435
+ const filterResetMethod = column.filterResetMethod || (compConf ? (compConf.tableFilterResetMethod || compConf.filterResetMethod) : null)
436
+ filters.forEach((item: any) => {
437
+ item._checked = false
438
+ item.checked = false
439
+ if (!filterResetMethod) {
440
+ item.data = XEUtils.clone(item.resetValue, true)
441
+ }
442
+ })
443
+ if (filterResetMethod) {
444
+ filterResetMethod({ options: filters, column, $table: $xeTable })
445
+ }
446
+ }
447
+ }
448
+ },
449
+ /**
450
+ * 重置筛选
451
+ * 当筛选面板中的重置按钮被按下时触发
452
+ * @param {Event} evnt 事件
453
+ */
454
+ handleFilterResetFilter (evnt: Event, column: VxeTableDefines.ColumnInfo) {
455
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
456
+
457
+ if (column) {
458
+ $xeTable.handleClearFilter(column)
459
+ $xeTable.confirmFilterEvent(evnt, column)
460
+ if (evnt) {
461
+ $xeTable.dispatchEvent('clear-filter', { filterList: [] }, evnt)
462
+ }
463
+ }
464
+ },
465
+ /**
466
+ * 清空指定列的筛选条件
467
+ * 如果为空则清空所有列的筛选条件
468
+ * @param {String} fieldOrColumn 列
469
+ */
470
+ _clearFilter (fieldOrColumn: string | VxeTableDefines.ColumnInfo<any> | null | undefined) {
471
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
472
+ const reactData = $xeTable as unknown as TableReactData
473
+ const internalData = $xeTable as unknown as TableInternalData
474
+
475
+ const { filterStore } = reactData
476
+ const { tableFullColumn } = internalData
477
+ let column
478
+ if (fieldOrColumn) {
479
+ column = handleFieldOrColumn($xeTable, fieldOrColumn)
480
+ if (column) {
481
+ $xeTable.handleClearFilter(column)
482
+ }
483
+ } else {
484
+ tableFullColumn.forEach($xeTable.handleClearFilter)
485
+ }
486
+ if (!fieldOrColumn || column !== filterStore.column) {
487
+ Object.assign(filterStore, {
488
+ isAllSelected: false,
489
+ isIndeterminate: false,
490
+ style: null,
491
+ options: [],
492
+ column: null,
493
+ multiple: false,
494
+ visible: false
495
+ })
496
+ }
497
+ return $xeTable.updateData()
498
+ },
499
+ _updateFilterOptionStatus (item: any, checked: boolean) {
500
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
501
+
502
+ item._checked = checked
503
+ item.checked = checked
504
+ return $xeTable.$nextTick()
505
+ }
506
+ } as any
507
+ }