vxe-table 4.23.7 → 4.23.9

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 (148) hide show
  1. package/dist/all.esm.js +5859 -4018
  2. package/es/colgroup/index.js +1 -1
  3. package/es/column/index.js +1 -1
  4. package/es/components.d.ts +3 -0
  5. package/es/components.js +4 -8
  6. package/es/grid/index.js +1 -1
  7. package/es/grid/src/emits.js +1 -15
  8. package/es/grid/src/grid.js +398 -121
  9. package/es/grid/src/props.js +1 -1
  10. package/es/index.esm.js +6 -0
  11. package/es/index.js +6 -0
  12. package/es/table/index.js +1 -1
  13. package/es/table/module/custom/hook.js +50 -43
  14. package/es/table/module/custom/panel.js +778 -528
  15. package/es/table/module/edit/hook.js +141 -63
  16. package/es/table/module/export/export-panel.js +400 -317
  17. package/es/table/module/export/hook.js +396 -338
  18. package/es/table/module/export/import-panel.js +153 -124
  19. package/es/table/module/filter/hook.js +17 -3
  20. package/es/table/module/filter/panel.js +147 -85
  21. package/es/table/module/keyboard/hook.js +9 -5
  22. package/es/table/module/menu/hook.js +1 -1
  23. package/es/table/module/menu/panel.js +198 -127
  24. package/es/table/module/validator/hook.js +1 -1
  25. package/es/table/render/index.js +152 -99
  26. package/es/table/src/body.js +356 -234
  27. package/es/table/src/cell.js +427 -270
  28. package/es/table/src/columnInfo.js +2 -1
  29. package/es/table/src/footer.js +145 -100
  30. package/es/table/src/group.js +7 -3
  31. package/es/table/src/header.js +230 -173
  32. package/es/table/src/props.js +1 -1
  33. package/es/table/src/table.js +1504 -1031
  34. package/es/table/src/util.js +15 -19
  35. package/es/toolbar/index.js +1 -1
  36. package/es/toolbar/src/toolbar.js +133 -76
  37. package/es/ui/index.d.ts +0 -1
  38. package/es/ui/index.js +1 -2
  39. package/es/ui/src/dom.js +9 -6
  40. package/es/ui/src/log.js +1 -1
  41. package/es/ui/src/utils.d.ts +1 -1
  42. package/es/v-x-e-table/index.d.ts +0 -1
  43. package/es/v-x-e-table/index.js +0 -1
  44. package/lib/colgroup/index.js +5 -5
  45. package/lib/column/index.js +5 -5
  46. package/lib/components.js +8 -12
  47. package/lib/grid/index.js +4 -4
  48. package/lib/grid/src/emits.js +1 -15
  49. package/lib/grid/src/grid.js +419 -142
  50. package/lib/grid/src/props.js +2 -2
  51. package/lib/index.common.js +6 -0
  52. package/lib/index.js +6 -0
  53. package/lib/index.umd.js +5825 -3945
  54. package/lib/index.umd.min.js +3 -3
  55. package/lib/table/index.js +5 -5
  56. package/lib/table/module/custom/hook.js +51 -44
  57. package/lib/table/module/custom/panel.js +790 -540
  58. package/lib/table/module/edit/hook.js +142 -64
  59. package/lib/table/module/export/export-panel.js +406 -323
  60. package/lib/table/module/export/hook.js +419 -361
  61. package/lib/table/module/export/import-panel.js +157 -128
  62. package/lib/table/module/filter/hook.js +18 -4
  63. package/lib/table/module/filter/panel.js +149 -87
  64. package/lib/table/module/keyboard/hook.js +10 -6
  65. package/lib/table/module/menu/hook.js +2 -2
  66. package/lib/table/module/menu/panel.js +199 -128
  67. package/lib/table/module/validator/hook.js +2 -2
  68. package/lib/table/render/index.js +153 -100
  69. package/lib/table/src/body.js +357 -235
  70. package/lib/table/src/cell.js +428 -271
  71. package/lib/table/src/columnInfo.js +3 -2
  72. package/lib/table/src/footer.js +146 -101
  73. package/lib/table/src/group.js +7 -3
  74. package/lib/table/src/header.js +231 -174
  75. package/lib/table/src/props.js +2 -2
  76. package/lib/table/src/table.js +1487 -1045
  77. package/lib/table/src/util.js +15 -19
  78. package/lib/toolbar/index.js +4 -4
  79. package/lib/toolbar/src/toolbar.js +135 -78
  80. package/lib/ui/index.js +1 -3
  81. package/lib/ui/src/dom.js +9 -6
  82. package/lib/ui/src/log.js +1 -1
  83. package/lib/v-x-e-table/index.js +0 -2
  84. package/package.json +8 -3
  85. package/packages/colgroup/index.ts +22 -22
  86. package/packages/column/index.ts +22 -22
  87. package/packages/components.ts +41 -43
  88. package/packages/grid/index.ts +18 -18
  89. package/packages/grid/src/emits.ts +5 -19
  90. package/packages/grid/src/grid.ts +2229 -1925
  91. package/packages/grid/src/props.ts +22 -23
  92. package/packages/index.ts +11 -4
  93. package/packages/locale/lang/fr-FR.ts +15 -15
  94. package/packages/locale/lang/it-IT.ts +4 -4
  95. package/packages/locale/lang/uk-UA.ts +1 -1
  96. package/packages/locale/lang/uz-UZ.ts +13 -13
  97. package/packages/locale/lang/zh-CN.ts +907 -907
  98. package/packages/table/index.ts +26 -26
  99. package/packages/table/module/custom/hook.ts +510 -503
  100. package/packages/table/module/custom/panel.ts +2002 -1743
  101. package/packages/table/module/edit/hook.ts +1224 -1131
  102. package/packages/table/module/export/export-panel.ts +697 -611
  103. package/packages/table/module/export/hook.ts +2160 -2059
  104. package/packages/table/module/export/import-panel.ts +319 -279
  105. package/packages/table/module/export/util.ts +25 -24
  106. package/packages/table/module/filter/hook.ts +519 -501
  107. package/packages/table/module/filter/panel.ts +368 -304
  108. package/packages/table/module/keyboard/hook.ts +498 -494
  109. package/packages/table/module/menu/hook.ts +330 -330
  110. package/packages/table/module/menu/panel.ts +272 -201
  111. package/packages/table/module/validator/hook.ts +653 -635
  112. package/packages/table/render/index.ts +1819 -1744
  113. package/packages/table/src/body.ts +1078 -955
  114. package/packages/table/src/cell.ts +1524 -1359
  115. package/packages/table/src/column.ts +192 -192
  116. package/packages/table/src/columnInfo.ts +232 -232
  117. package/packages/table/src/emits.ts +134 -134
  118. package/packages/table/src/footer.ts +425 -380
  119. package/packages/table/src/group.ts +67 -63
  120. package/packages/table/src/header.ts +642 -581
  121. package/packages/table/src/props.ts +336 -336
  122. package/packages/table/src/store.ts +14 -14
  123. package/packages/table/src/table.ts +16011 -15454
  124. package/packages/table/src/use/cell-view.ts +41 -44
  125. package/packages/table/src/use/index.ts +1 -1
  126. package/packages/table/src/util.ts +1206 -1216
  127. package/packages/toolbar/index.ts +18 -18
  128. package/packages/toolbar/src/toolbar.ts +768 -706
  129. package/packages/ui/index.ts +519 -521
  130. package/packages/ui/src/anime.ts +51 -52
  131. package/packages/ui/src/comp.ts +3 -3
  132. package/packages/ui/src/dom.ts +466 -463
  133. package/packages/ui/src/log.ts +19 -19
  134. package/packages/ui/src/utils.ts +66 -66
  135. package/packages/ui/src/vn.ts +55 -55
  136. package/packages/v-x-e-table/index.d.ts +3 -4
  137. package/packages/v-x-e-table/index.ts +3 -4
  138. package/types/all.d.ts +76 -76
  139. package/types/index.d.ts +4 -4
  140. /package/dist/{iconfont.1792979665397.ttf → iconfont.1793009263429.ttf} +0 -0
  141. /package/dist/{iconfont.1792979665397.woff → iconfont.1793009263429.woff} +0 -0
  142. /package/dist/{iconfont.1792979665397.woff2 → iconfont.1793009263429.woff2} +0 -0
  143. /package/es/{iconfont.1792979665397.ttf → iconfont.1793009263429.ttf} +0 -0
  144. /package/es/{iconfont.1792979665397.woff → iconfont.1793009263429.woff} +0 -0
  145. /package/es/{iconfont.1792979665397.woff2 → iconfont.1793009263429.woff2} +0 -0
  146. /package/lib/{iconfont.1792979665397.ttf → iconfont.1793009263429.ttf} +0 -0
  147. /package/lib/{iconfont.1792979665397.woff → iconfont.1793009263429.woff} +0 -0
  148. /package/lib/{iconfont.1792979665397.woff2 → iconfont.1793009263429.woff2} +0 -0
@@ -1,501 +1,519 @@
1
- import { nextTick } from 'vue'
2
- import XEUtils from 'xe-utils'
3
- import { VxeUI } from '../../../ui'
4
- import { toFilters, handleFieldOrColumn, getRefElem } from '../../src/util'
5
- import { toCssUnit, triggerEvent, updatePanelPlacement } from '../../../ui/src/dom'
6
- import { hasEnableConf, isEnableConf } from '../../../ui/src/utils'
7
-
8
- import type { TableFilterMethods, TableFilterPrivateMethods, VxeTableDefines } from '../../../../types'
9
-
10
- const { renderer, hooks } = VxeUI
11
-
12
- const tableFilterMethodKeys: (keyof TableFilterMethods)[] = ['openFilter', 'setFilter', 'clearFilter', 'saveFilter', 'saveFilterByEvent', 'saveFilterPanel', 'saveFilterPanelByEvent', 'resetFilter', 'resetFilterByEvent', 'resetFilterPanel', 'resetFilterPanelByEvent', 'getCheckedFilters', 'updateFilterOptionStatus']
13
-
14
- const sourceType = 'table'
15
-
16
- hooks.add('tableFilterModule', {
17
- setupTable ($xeTable) {
18
- const $xeGrid = $xeTable.xeGrid
19
- const $xeGantt = $xeTable.xeGantt
20
- const $xeGGWrapper = $xeGrid || $xeGantt
21
-
22
- const { props, reactData, internalData } = $xeTable
23
- const { refElem, refTableFilter } = $xeTable.getRefMaps()
24
- const { computeFilterOpts, computeMouseOpts, computeRendererOpts } = $xeTable.getComputeMaps()
25
-
26
- const updatePopupStyle = () => {
27
- const { filterStore, scrollbarHeight } = reactData
28
- const { elemStore } = internalData
29
- const { column, targetEl } = filterStore
30
- if (!column) {
31
- return nextTick()
32
- }
33
- const tableEl = refElem.value
34
- const filterOpts = computeFilterOpts.value
35
- const rendererOpts = computeRendererOpts.value
36
- const { maxHeight: customMaxHeight, transfer, zIndex } = filterOpts
37
- const filterRender = column ? column.filterRender : null
38
- const compConf = filterRender && isEnableConf(filterRender) && filterRender.name ? (rendererOpts[filterRender.name] || renderer.get(filterRender.name)) : null
39
-
40
- const headerScrollElem = getRefElem(elemStore['main-header-scroll'])
41
- if (!headerScrollElem) {
42
- return nextTick()
43
- }
44
- const tableFilter = refTableFilter.value
45
- const filterWrapperElem = tableFilter ? tableFilter.getRefMaps().refElem.value as HTMLDivElement : null
46
- if (!filterWrapperElem) {
47
- return nextTick()
48
- }
49
-
50
- /**
51
- * 是否显示筛选按钮图标
52
- * 如果不存在图标,则相对单元格居中显示
53
- */
54
- const handleStyle = () => {
55
- let currEl = targetEl
56
- if (!targetEl) {
57
- const headerWrapperElem = getRefElem(elemStore[`${column.fixed || 'main'}-header-wrapper`] || elemStore['main-header-wrapper'])
58
- const colEl = headerWrapperElem ? headerWrapperElem.querySelector<HTMLDivElement>(`.vxe-header--column.${column.id}`) : null
59
- if (colEl) {
60
- currEl = colEl
61
- }
62
- }
63
- if (!currEl) {
64
- return nextTick()
65
- }
66
-
67
- const btnRect = currEl.getBoundingClientRect()
68
- const tableRect = tableEl.getBoundingClientRect()
69
- let left = 0
70
- let top = 0
71
- let maxHeight = 0
72
- let panelStyle: Record<string, string | number> = {}
73
- if (transfer) {
74
- const ppObj = updatePanelPlacement(currEl, filterWrapperElem, {
75
- defaultPlacement: 'bottom',
76
- appendTo: '',
77
- isMinWidth: false,
78
- teleportTo: transfer
79
- })
80
- panelStyle = ppObj.style
81
- } else {
82
- const filterWidth = filterWrapperElem.offsetWidth
83
- const centerWidth = targetEl ? filterWidth / 2 : ((filterWidth - column.renderWidth) / 2)
84
- left = btnRect.left - tableRect.left - centerWidth
85
- top = btnRect.top - tableRect.top + currEl.clientHeight
86
- maxHeight = Math.max(40, tableEl.clientHeight - top - scrollbarHeight)
87
- if (left < 1) {
88
- left = 1
89
- } else if (left > (tableEl.clientWidth - filterWidth - 1)) {
90
- left = tableEl.clientWidth - filterWidth - 1
91
- }
92
- if ($xeGGWrapper) {
93
- const wrapperEl = $xeGGWrapper.getRefMaps().refElem.value
94
- if (wrapperEl) {
95
- const wrapperRect = wrapperEl.getBoundingClientRect()
96
- top += tableRect.top - wrapperRect.top
97
- }
98
- }
99
- panelStyle = {
100
- top: toCssUnit(top),
101
- left: toCssUnit(left)
102
- }
103
- }
104
- if (zIndex) {
105
- panelStyle.zIndex = zIndex
106
- }
107
- // 筛选面板是自适应表格高度
108
- if (compConf ? !compConf.tableFilterAutoHeight : false) {
109
- maxHeight = 0
110
- } else {
111
- if (customMaxHeight) {
112
- maxHeight = customMaxHeight > maxHeight ? maxHeight : customMaxHeight
113
- }
114
- }
115
- panelStyle['--vxe-ui-vxe-table-filter-default-max-height'] = maxHeight ? toCssUnit(maxHeight) : 'none'
116
- filterStore.style = panelStyle
117
- }
118
- handleStyle()
119
- return nextTick().then(() => {
120
- handleStyle()
121
- })
122
- }
123
- const filterPrivateMethods: TableFilterPrivateMethods = {
124
- checkFilterOptions () {
125
- const { filterStore } = reactData
126
- const { column } = filterStore
127
- if (column) {
128
- const filterOptions = (column.filters || []) as VxeTableDefines.FilterOption[]
129
- filterStore.isAllSelected = filterOptions.every((item) => item._checked)
130
- filterStore.isIndeterminate = !filterStore.isAllSelected && filterOptions.some((item) => item._checked)
131
- }
132
- },
133
- handleOpenFilterColumn (evnt: MouseEvent, btnEl: HTMLDivElement | null, colEl: HTMLDivElement, column: VxeTableDefines.ColumnInfo, params: any) {
134
- const { initStore, filterStore } = reactData
135
- if (filterStore.column === column && filterStore.visible) {
136
- filterStore.visible = false
137
- } else {
138
- $xeTable.handleFilterOptions(column)
139
- internalData._currFilterParams = params
140
- filterStore.targetEl = btnEl
141
- filterStore.style = null
142
- filterStore.visible = true
143
- initStore.filter = true
144
- }
145
- nextTick().then(() => {
146
- updatePopupStyle()
147
- })
148
- $xeTable.dispatchEvent('filter-visible', { column, field: column.field, property: column.field, filterList: $xeTable.getCheckedFilters(), visible: filterStore.visible }, evnt)
149
- },
150
- /**
151
- * 点击筛选事件
152
- * 当筛选图标被点击时触发
153
- * 更新选项是否全部状态
154
- * 打开筛选面板
155
- * @param {Event} evnt 事件
156
- * @param {ColumnInfo} column 列配置
157
- * @param {Object} params 参数
158
- */
159
- triggerFilterEvent (evnt: MouseEvent, column: VxeTableDefines.ColumnInfo, params) {
160
- const { elemStore } = internalData
161
- const { fixed } = column
162
- const headerWrapperElem = getRefElem(elemStore[`${fixed || 'main'}-header-wrapper`] || elemStore['main-header-wrapper'])
163
- const btnElem = evnt.currentTarget as HTMLDivElement
164
- const colEl = headerWrapperElem ? headerWrapperElem.querySelector<HTMLElement>(`.vxe-header--column.${column.id}`) : null
165
- $xeTable.handleOpenFilterColumn(evnt, btnElem, colEl || btnElem, column, params)
166
- },
167
- handleClearFilter (column) {
168
- if (column) {
169
- const { filters, filterRender } = column
170
- if (filters) {
171
- const rendererOpts = computeRendererOpts.value
172
- const compConf = isEnableConf(filterRender) && filterRender.name ? (rendererOpts[filterRender.name] || renderer.get(filterRender.name)) : null
173
- const frMethod = column.filterResetMethod || (compConf ? (compConf.tableFilterResetMethod || compConf.filterResetMethod) : null)
174
- filters.forEach((item: any) => {
175
- item._checked = false
176
- item.checked = false
177
- if (!frMethod) {
178
- item.data = XEUtils.clone(item.resetValue, true)
179
- }
180
- })
181
- if (frMethod) {
182
- frMethod({ options: filters as VxeTableDefines.FilterOption[], column, $table: $xeTable })
183
- }
184
- }
185
- }
186
- },
187
- handleColumnConfirmFilter (column, evnt) {
188
- const { mouseConfig } = props
189
- const { scrollXLoad: oldScrollXLoad, scrollYLoad: oldScrollYLoad } = reactData
190
- const filterOpts = computeFilterOpts.value
191
- const mouseOpts = computeMouseOpts.value
192
- const { field, filters } = column
193
- const filterOptions = filters || []
194
- const values: any[] = []
195
- const datas: any[] = []
196
- filterOptions.forEach((item) => {
197
- if (item.checked) {
198
- values.push(item.value)
199
- datas.push(item.data)
200
- }
201
- })
202
- const filterList = $xeTable.getCheckedFilters()
203
- const params = { $table: $xeTable, $event: evnt as Event, column, field, property: field, values, datas, filters: filterList, filterList }
204
- // 如果是服务端筛选,则跳过本地筛选处理
205
- if (!filterOpts.remote) {
206
- $xeTable.handleTableData(true)
207
- $xeTable.checkSelectionStatus()
208
- }
209
- if (hasEnableConf(mouseConfig, mouseOpts) && mouseOpts.area && $xeTable.handleFilterEvent) {
210
- $xeTable.handleFilterEvent(evnt as Event, params)
211
- }
212
- if (evnt) {
213
- $xeTable.dispatchEvent('filter-change', params, evnt)
214
- }
215
- $xeTable.closeFilter()
216
- return $xeTable.updateFooter().then(() => {
217
- const { scrollXLoad, scrollYLoad } = reactData
218
- if ((oldScrollXLoad || scrollXLoad) || (oldScrollYLoad || scrollYLoad)) {
219
- if (oldScrollXLoad || scrollXLoad) {
220
- $xeTable.updateScrollXSpace()
221
- }
222
- if (oldScrollYLoad || scrollYLoad) {
223
- $xeTable.updateScrollYSpace()
224
- }
225
- return $xeTable.refreshScroll()
226
- }
227
- }).then(() => {
228
- $xeTable.updateCellAreas()
229
- return $xeTable.recalculate(true)
230
- }).then(() => {
231
- // 存在滚动行为未结束情况
232
- setTimeout(() => $xeTable.recalculate(), 50)
233
- })
234
- },
235
- /**
236
- * 确认筛选
237
- * 当筛选面板中的确定按钮被按下时触发
238
- */
239
- confirmFilterEvent (evnt, column) {
240
- if (column) {
241
- $xeTable.handleColumnConfirmFilter(column, evnt)
242
- }
243
- },
244
- // (单选)筛选发生改变
245
- handleFilterChangeRadioOption (evnt, checked, item) {
246
- const { filterStore } = reactData
247
- const { column } = filterStore
248
- if (column) {
249
- const filterOptions = (column.filters || []) as VxeTableDefines.FilterOption[]
250
- filterOptions.forEach((option) => {
251
- option._checked = false
252
- })
253
- item._checked = checked
254
- $xeTable.checkFilterOptions()
255
- $xeTable.handleFilterConfirmFilter(evnt, column)
256
- }
257
- },
258
- // (多选)筛选发生改变
259
- handleFilterChangeMultipleOption (evnt, checked, item) {
260
- item._checked = checked
261
- $xeTable.checkFilterOptions()
262
- },
263
- // 筛选发生改变
264
- handleFilterChangeOption (evnt, checked, item) {
265
- const { filterStore } = reactData
266
- const { fullColumnIdData } = internalData
267
- let column = filterStore.column
268
- if (!column) {
269
- const colRest = fullColumnIdData[item._colId]
270
- if (colRest) {
271
- column = colRest.column
272
- filterStore.column = column
273
- }
274
- }
275
- if (column) {
276
- if (column.filterMultiple) {
277
- $xeTable.handleFilterChangeMultipleOption(evnt, checked, item)
278
- } else {
279
- $xeTable.handleFilterChangeRadioOption(evnt, checked, item)
280
- }
281
- }
282
- },
283
- // 确认筛选
284
- handleFilterConfirmFilter (evnt, column) {
285
- if (column) {
286
- const filterOptions = (column.filters || []) as VxeTableDefines.FilterOption[]
287
- filterOptions.forEach((option) => {
288
- option.checked = option._checked
289
- })
290
- $xeTable.confirmFilterEvent(evnt, column)
291
- }
292
- },
293
- /**
294
- * 重置筛选
295
- * 当筛选面板中的重置按钮被按下时触发
296
- */
297
- handleFilterResetFilter (evnt: Event, column) {
298
- if (column) {
299
- $xeTable.handleClearFilter(column)
300
- $xeTable.confirmFilterEvent(evnt, column)
301
- if (evnt) {
302
- $xeTable.dispatchEvent('clear-filter', { filterList: [] }, evnt)
303
- }
304
- }
305
- },
306
- handleFilterStyle () {
307
- const { filterStore } = reactData
308
- if (!filterStore.visible) {
309
- return nextTick()
310
- }
311
- return updatePopupStyle()
312
- }
313
- }
314
-
315
- const filterMethods: TableFilterMethods = {
316
- /**
317
- * 手动弹出筛选面板
318
- * @param column
319
- */
320
- openFilter (fieldOrColumn) {
321
- const column = handleFieldOrColumn($xeTable, fieldOrColumn)
322
- if (column && column.filters) {
323
- const { elemStore } = internalData
324
- const { fixed, filters } = column
325
- return $xeTable.scrollToColumn(column).then(() => {
326
- const headerWrapperElem = getRefElem(elemStore[`${fixed || 'main'}-header-wrapper`] || elemStore['main-header-wrapper'])
327
- if (headerWrapperElem) {
328
- const filterBtnElem = headerWrapperElem.querySelector<HTMLElement>(`.vxe-header--column.${column.id} .vxe-cell--filter`)
329
- if (filterBtnElem) {
330
- triggerEvent(filterBtnElem, 'click')
331
- } else {
332
- const colEl = headerWrapperElem.querySelector<HTMLElement>(`.vxe-header--column.${column.id}`)
333
- if (colEl) {
334
- let firstFilterOption: VxeTableDefines.FilterOption | null = null
335
- if (filters) {
336
- firstFilterOption = filters[0] as VxeTableDefines.FilterOption
337
- }
338
- const params = {
339
- $table: $xeTable,
340
- $grid: $xeGrid,
341
- $gantt: $xeGantt,
342
- $rowIndex: -1,
343
- column,
344
- columnIndex: $xeTable.getColumnIndex(column),
345
- $columnIndex: $xeTable.getVMColumnIndex(column),
346
- _columnIndex: $xeTable.getVTColumnIndex(column),
347
- firstFilterOption: firstFilterOption as VxeTableDefines.FilterOption,
348
- fixed,
349
- source: sourceType,
350
- type: 'header'
351
- // isHidden
352
- // hasFilter
353
- }
354
- $xeTable.handleOpenFilterColumn(new Event('click'), null, colEl, column, params)
355
- }
356
- }
357
- }
358
- })
359
- }
360
- return nextTick()
361
- },
362
- /**
363
- * 修改筛选条件列表
364
- * @param {ColumnInfo} fieldOrColumn 列或字段名
365
- * @param {Array} options 选项
366
- */
367
- setFilter (fieldOrColumn, options, isUpdate) {
368
- const { filterStore } = reactData
369
- const column = handleFieldOrColumn($xeTable, fieldOrColumn)
370
- if (column && column.filters) {
371
- column.filters = toFilters(options || [], column.id)
372
- if (isUpdate) {
373
- return $xeTable.handleColumnConfirmFilter(column, null)
374
- } else {
375
- if (filterStore.visible) {
376
- $xeTable.handleFilterOptions(column)
377
- }
378
- }
379
- }
380
- return nextTick()
381
- },
382
- /**
383
- * 清空指定列的筛选条件
384
- * 如果为空则清空所有列的筛选条件
385
- * @param {String} fieldOrColumn 列或字段名
386
- */
387
- clearFilter (fieldOrColumn) {
388
- const { filterStore } = reactData
389
- const { tableFullColumn } = internalData
390
- const filterOpts = computeFilterOpts.value
391
- let column
392
- if (fieldOrColumn) {
393
- column = handleFieldOrColumn($xeTable, fieldOrColumn)
394
- if (column) {
395
- $xeTable.handleClearFilter(column)
396
- }
397
- } else {
398
- tableFullColumn.forEach($xeTable.handleClearFilter)
399
- }
400
- if (!fieldOrColumn || column !== filterStore.column) {
401
- Object.assign(filterStore, {
402
- isAllSelected: false,
403
- isIndeterminate: false,
404
- style: null,
405
- options: [],
406
- column: null,
407
- multiple: false,
408
- visible: false
409
- })
410
- }
411
- if (!filterOpts.remote) {
412
- return $xeTable.updateData()
413
- }
414
- return nextTick()
415
- },
416
- saveFilter (fieldOrColumn) {
417
- if (fieldOrColumn) {
418
- const column = handleFieldOrColumn($xeTable, fieldOrColumn)
419
- $xeTable.handleFilterConfirmFilter(null, column)
420
- }
421
- return nextTick()
422
- },
423
- saveFilterByEvent (evnt, fieldOrColumn) {
424
- if (fieldOrColumn) {
425
- const column = handleFieldOrColumn($xeTable, fieldOrColumn)
426
- $xeTable.handleFilterConfirmFilter(evnt, column)
427
- }
428
- return nextTick()
429
- },
430
- resetFilter (fieldOrColumn) {
431
- if (fieldOrColumn) {
432
- const column = handleFieldOrColumn($xeTable, fieldOrColumn)
433
- $xeTable.handleFilterResetFilter(null, column)
434
- }
435
- return nextTick()
436
- },
437
- resetFilterByEvent (evnt, fieldOrColumn) {
438
- if (fieldOrColumn) {
439
- const column = handleFieldOrColumn($xeTable, fieldOrColumn)
440
- $xeTable.handleFilterResetFilter(evnt, column)
441
- }
442
- return nextTick()
443
- },
444
- saveFilterPanel () {
445
- const { filterStore } = reactData
446
- $xeTable.handleFilterConfirmFilter(null, filterStore.column || null)
447
- return nextTick()
448
- },
449
- saveFilterPanelByEvent (evnt) {
450
- const { filterStore } = reactData
451
- $xeTable.handleFilterConfirmFilter(evnt, filterStore.column || null)
452
- return nextTick()
453
- },
454
- resetFilterPanel () {
455
- const { filterStore } = reactData
456
- $xeTable.handleFilterResetFilter(null, filterStore.column || null)
457
- return nextTick()
458
- },
459
- resetFilterPanelByEvent (evnt) {
460
- const { filterStore } = reactData
461
- $xeTable.handleFilterResetFilter(evnt, filterStore.column || null)
462
- return nextTick()
463
- },
464
- getCheckedFilters () {
465
- const { tableFullColumn } = internalData
466
- const filterList: VxeTableDefines.FilterCheckedParams[] = []
467
- tableFullColumn.forEach((column) => {
468
- const { field, filters } = column
469
- const filterOptions = filters || []
470
- const valueList: any[] = []
471
- const dataList: any[] = []
472
- if (filterOptions) {
473
- filterOptions.forEach((item) => {
474
- if (item.checked) {
475
- valueList.push(item.value)
476
- dataList.push(item.data)
477
- }
478
- })
479
- if (valueList.length) {
480
- filterList.push({ column, field, property: field, values: valueList, datas: dataList })
481
- }
482
- }
483
- })
484
- return filterList
485
- },
486
- updateFilterOptionStatus (item: any, checked: boolean) {
487
- item._checked = checked
488
- item.checked = checked
489
- return nextTick()
490
- }
491
- }
492
-
493
- return { ...filterMethods, ...filterPrivateMethods }
494
- },
495
- setupGrid ($xeGrid) {
496
- return $xeGrid.extendTableMethods(tableFilterMethodKeys)
497
- },
498
- setupGantt ($xeGantt) {
499
- return $xeGantt.extendTableMethods(tableFilterMethodKeys)
500
- }
501
- })
1
+ import { nextTick } from 'vue'
2
+ import XEUtils from 'xe-utils'
3
+ import { VxeUI } from '@vxe-ui/core'
4
+ import { toFilters, handleFieldOrColumn, getRefElem } from '../../src/util'
5
+ import { toCssUnit, triggerEvent, updatePanelPlacement } from '../../../ui/src/dom'
6
+ import { hasEnableConf, isEnableConf } from '../../../ui/src/utils'
7
+
8
+ import type { TableFilterMethods, TableFilterPrivateMethods, VxeTableDefines } from '../../../../types'
9
+
10
+ const { renderer, hooks } = VxeUI
11
+
12
+ const tableFilterMethodKeys: (keyof TableFilterMethods)[] = [
13
+ 'openFilter',
14
+ 'setFilter',
15
+ 'clearFilter',
16
+ 'saveFilter',
17
+ 'saveFilterByEvent',
18
+ 'saveFilterPanel',
19
+ 'saveFilterPanelByEvent',
20
+ 'resetFilter',
21
+ 'resetFilterByEvent',
22
+ 'resetFilterPanel',
23
+ 'resetFilterPanelByEvent',
24
+ 'getCheckedFilters',
25
+ 'updateFilterOptionStatus'
26
+ ]
27
+
28
+ const sourceType = 'table'
29
+
30
+ hooks.add('tableFilterModule', {
31
+ setupTable($xeTable) {
32
+ const $xeGrid = $xeTable.xeGrid
33
+ const $xeGantt = $xeTable.xeGantt
34
+ const $xeGGWrapper = $xeGrid || $xeGantt
35
+
36
+ const { props, reactData, internalData } = $xeTable
37
+ const { refElem, refTableFilter } = $xeTable.getRefMaps()
38
+ const { computeFilterOpts, computeMouseOpts, computeRendererOpts } = $xeTable.getComputeMaps()
39
+
40
+ const updatePopupStyle = () => {
41
+ const { filterStore, scrollbarHeight } = reactData
42
+ const { elemStore } = internalData
43
+ const { column, targetEl } = filterStore
44
+ if (!column) {
45
+ return nextTick()
46
+ }
47
+ const tableEl = refElem.value
48
+ const filterOpts = computeFilterOpts.value
49
+ const rendererOpts = computeRendererOpts.value
50
+ const { maxHeight: customMaxHeight, transfer, zIndex } = filterOpts
51
+ const filterRender = column ? column.filterRender : null
52
+ const compConf = filterRender && isEnableConf(filterRender) && filterRender.name ? rendererOpts[filterRender.name] || renderer.get(filterRender.name) : null
53
+
54
+ const headerScrollElem = getRefElem(elemStore['main-header-scroll'])
55
+ if (!headerScrollElem) {
56
+ return nextTick()
57
+ }
58
+ const tableFilter = refTableFilter.value
59
+ const filterWrapperElem = tableFilter ? (tableFilter.getRefMaps().refElem.value as HTMLDivElement) : null
60
+ if (!filterWrapperElem) {
61
+ return nextTick()
62
+ }
63
+
64
+ /**
65
+ * 是否显示筛选按钮图标
66
+ * 如果不存在图标,则相对单元格居中显示
67
+ */
68
+ const handleStyle = () => {
69
+ let currEl = targetEl
70
+ if (!targetEl) {
71
+ const headerWrapperElem = getRefElem(elemStore[`${column.fixed || 'main'}-header-wrapper`] || elemStore['main-header-wrapper'])
72
+ const colEl = headerWrapperElem ? headerWrapperElem.querySelector<HTMLDivElement>(`.vxe-header--column.${column.id}`) : null
73
+ if (colEl) {
74
+ currEl = colEl
75
+ }
76
+ }
77
+ if (!currEl) {
78
+ return nextTick()
79
+ }
80
+
81
+ const btnRect = currEl.getBoundingClientRect()
82
+ const tableRect = tableEl.getBoundingClientRect()
83
+ let left = 0
84
+ let top = 0
85
+ let maxHeight = 0
86
+ let panelStyle: Record<string, string | number> = {}
87
+ if (transfer) {
88
+ const ppObj = updatePanelPlacement(currEl, filterWrapperElem, {
89
+ defaultPlacement: 'bottom',
90
+ appendTo: '',
91
+ isMinWidth: false,
92
+ teleportTo: transfer
93
+ })
94
+ panelStyle = ppObj.style
95
+ } else {
96
+ const filterWidth = filterWrapperElem.offsetWidth
97
+ const centerWidth = targetEl ? filterWidth / 2 : (filterWidth - column.renderWidth) / 2
98
+ left = btnRect.left - tableRect.left - centerWidth
99
+ top = btnRect.top - tableRect.top + currEl.clientHeight
100
+ maxHeight = Math.max(40, tableEl.clientHeight - top - scrollbarHeight)
101
+ if (left < 1) {
102
+ left = 1
103
+ } else if (left > tableEl.clientWidth - filterWidth - 1) {
104
+ left = tableEl.clientWidth - filterWidth - 1
105
+ }
106
+ if ($xeGGWrapper) {
107
+ const wrapperEl = $xeGGWrapper.getRefMaps().refElem.value
108
+ if (wrapperEl) {
109
+ const wrapperRect = wrapperEl.getBoundingClientRect()
110
+ top += tableRect.top - wrapperRect.top
111
+ }
112
+ }
113
+ panelStyle = {
114
+ top: toCssUnit(top),
115
+ left: toCssUnit(left)
116
+ }
117
+ }
118
+ if (zIndex) {
119
+ panelStyle.zIndex = zIndex
120
+ }
121
+ // 筛选面板是自适应表格高度
122
+ if (compConf ? !compConf.tableFilterAutoHeight : false) {
123
+ maxHeight = 0
124
+ } else {
125
+ if (customMaxHeight) {
126
+ maxHeight = customMaxHeight > maxHeight ? maxHeight : customMaxHeight
127
+ }
128
+ }
129
+ panelStyle['--vxe-ui-vxe-table-filter-default-max-height'] = maxHeight ? toCssUnit(maxHeight) : 'none'
130
+ filterStore.style = panelStyle
131
+ }
132
+ handleStyle()
133
+ return nextTick().then(() => {
134
+ handleStyle()
135
+ })
136
+ }
137
+ const filterPrivateMethods: TableFilterPrivateMethods = {
138
+ checkFilterOptions() {
139
+ const { filterStore } = reactData
140
+ const { column } = filterStore
141
+ if (column) {
142
+ const filterOptions = (column.filters || []) as VxeTableDefines.FilterOption[]
143
+ filterStore.isAllSelected = filterOptions.every((item) => item._checked)
144
+ filterStore.isIndeterminate = !filterStore.isAllSelected && filterOptions.some((item) => item._checked)
145
+ }
146
+ },
147
+ handleOpenFilterColumn(evnt: MouseEvent, btnEl: HTMLDivElement | null, colEl: HTMLDivElement, column: VxeTableDefines.ColumnInfo, params: any) {
148
+ const { initStore, filterStore } = reactData
149
+ if (filterStore.column === column && filterStore.visible) {
150
+ filterStore.visible = false
151
+ } else {
152
+ $xeTable.handleFilterOptions(column)
153
+ internalData._currFilterParams = params
154
+ filterStore.targetEl = btnEl
155
+ filterStore.style = null
156
+ filterStore.visible = true
157
+ initStore.filter = true
158
+ }
159
+ nextTick().then(() => {
160
+ updatePopupStyle()
161
+ })
162
+ $xeTable.dispatchEvent('filter-visible', { column, field: column.field, property: column.field, filterList: $xeTable.getCheckedFilters(), visible: filterStore.visible }, evnt)
163
+ },
164
+ /**
165
+ * 点击筛选事件
166
+ * 当筛选图标被点击时触发
167
+ * 更新选项是否全部状态
168
+ * 打开筛选面板
169
+ * @param {Event} evnt 事件
170
+ * @param {ColumnInfo} column 列配置
171
+ * @param {Object} params 参数
172
+ */
173
+ triggerFilterEvent(evnt: MouseEvent, column: VxeTableDefines.ColumnInfo, params) {
174
+ const { elemStore } = internalData
175
+ const { fixed } = column
176
+ const headerWrapperElem = getRefElem(elemStore[`${fixed || 'main'}-header-wrapper`] || elemStore['main-header-wrapper'])
177
+ const btnElem = evnt.currentTarget as HTMLDivElement
178
+ const colEl = headerWrapperElem ? headerWrapperElem.querySelector<HTMLElement>(`.vxe-header--column.${column.id}`) : null
179
+ $xeTable.handleOpenFilterColumn(evnt, btnElem, colEl || btnElem, column, params)
180
+ },
181
+ handleClearFilter(column) {
182
+ if (column) {
183
+ const { filters, filterRender } = column
184
+ if (filters) {
185
+ const rendererOpts = computeRendererOpts.value
186
+ const compConf = isEnableConf(filterRender) && filterRender.name ? rendererOpts[filterRender.name] || renderer.get(filterRender.name) : null
187
+ const frMethod = column.filterResetMethod || (compConf ? compConf.tableFilterResetMethod || compConf.filterResetMethod : null)
188
+ filters.forEach((item: any) => {
189
+ item._checked = false
190
+ item.checked = false
191
+ if (!frMethod) {
192
+ item.data = XEUtils.clone(item.resetValue, true)
193
+ }
194
+ })
195
+ if (frMethod) {
196
+ frMethod({ options: filters as VxeTableDefines.FilterOption[], column, $table: $xeTable })
197
+ }
198
+ }
199
+ }
200
+ },
201
+ handleColumnConfirmFilter(column, evnt) {
202
+ const { mouseConfig } = props
203
+ const { scrollXLoad: oldScrollXLoad, scrollYLoad: oldScrollYLoad } = reactData
204
+ const filterOpts = computeFilterOpts.value
205
+ const mouseOpts = computeMouseOpts.value
206
+ const { field, filters } = column
207
+ const filterOptions = filters || []
208
+ const values: any[] = []
209
+ const datas: any[] = []
210
+ filterOptions.forEach((item) => {
211
+ if (item.checked) {
212
+ values.push(item.value)
213
+ datas.push(item.data)
214
+ }
215
+ })
216
+ const filterList = $xeTable.getCheckedFilters()
217
+ const params = { $table: $xeTable, $event: evnt as Event, column, field, property: field, values, datas, filters: filterList, filterList }
218
+ // 如果是服务端筛选,则跳过本地筛选处理
219
+ if (!filterOpts.remote) {
220
+ $xeTable.handleTableData(true)
221
+ $xeTable.checkSelectionStatus()
222
+ }
223
+ if (hasEnableConf(mouseConfig, mouseOpts) && mouseOpts.area && $xeTable.handleFilterEvent) {
224
+ $xeTable.handleFilterEvent(evnt as Event, params)
225
+ }
226
+ if (evnt) {
227
+ $xeTable.dispatchEvent('filter-change', params, evnt)
228
+ }
229
+ $xeTable.closeFilter()
230
+ return $xeTable
231
+ .updateFooter()
232
+ .then(() => {
233
+ const { scrollXLoad, scrollYLoad } = reactData
234
+ if (oldScrollXLoad || scrollXLoad || oldScrollYLoad || scrollYLoad) {
235
+ if (oldScrollXLoad || scrollXLoad) {
236
+ $xeTable.updateScrollXSpace()
237
+ }
238
+ if (oldScrollYLoad || scrollYLoad) {
239
+ $xeTable.updateScrollYSpace()
240
+ }
241
+ return $xeTable.refreshScroll()
242
+ }
243
+ })
244
+ .then(() => {
245
+ $xeTable.updateCellAreas()
246
+ return $xeTable.recalculate(true)
247
+ })
248
+ .then(() => {
249
+ // 存在滚动行为未结束情况
250
+ setTimeout(() => $xeTable.recalculate(), 50)
251
+ })
252
+ },
253
+ /**
254
+ * 确认筛选
255
+ * 当筛选面板中的确定按钮被按下时触发
256
+ */
257
+ confirmFilterEvent(evnt, column) {
258
+ if (column) {
259
+ $xeTable.handleColumnConfirmFilter(column, evnt)
260
+ }
261
+ },
262
+ // (单选)筛选发生改变
263
+ handleFilterChangeRadioOption(evnt, checked, item) {
264
+ const { filterStore } = reactData
265
+ const { column } = filterStore
266
+ if (column) {
267
+ const filterOptions = (column.filters || []) as VxeTableDefines.FilterOption[]
268
+ filterOptions.forEach((option) => {
269
+ option._checked = false
270
+ })
271
+ item._checked = checked
272
+ $xeTable.checkFilterOptions()
273
+ $xeTable.handleFilterConfirmFilter(evnt, column)
274
+ }
275
+ },
276
+ // (多选)筛选发生改变
277
+ handleFilterChangeMultipleOption(evnt, checked, item) {
278
+ item._checked = checked
279
+ $xeTable.checkFilterOptions()
280
+ },
281
+ // 筛选发生改变
282
+ handleFilterChangeOption(evnt, checked, item) {
283
+ const { filterStore } = reactData
284
+ const { fullColumnIdData } = internalData
285
+ let column = filterStore.column
286
+ if (!column) {
287
+ const colRest = fullColumnIdData[item._colId]
288
+ if (colRest) {
289
+ column = colRest.column
290
+ filterStore.column = column
291
+ }
292
+ }
293
+ if (column) {
294
+ if (column.filterMultiple) {
295
+ $xeTable.handleFilterChangeMultipleOption(evnt, checked, item)
296
+ } else {
297
+ $xeTable.handleFilterChangeRadioOption(evnt, checked, item)
298
+ }
299
+ }
300
+ },
301
+ // 确认筛选
302
+ handleFilterConfirmFilter(evnt, column) {
303
+ if (column) {
304
+ const filterOptions = (column.filters || []) as VxeTableDefines.FilterOption[]
305
+ filterOptions.forEach((option) => {
306
+ option.checked = option._checked
307
+ })
308
+ $xeTable.confirmFilterEvent(evnt, column)
309
+ }
310
+ },
311
+ /**
312
+ * 重置筛选
313
+ * 当筛选面板中的重置按钮被按下时触发
314
+ */
315
+ handleFilterResetFilter(evnt: Event, column) {
316
+ if (column) {
317
+ $xeTable.handleClearFilter(column)
318
+ $xeTable.confirmFilterEvent(evnt, column)
319
+ if (evnt) {
320
+ $xeTable.dispatchEvent('clear-filter', { filterList: [] }, evnt)
321
+ }
322
+ }
323
+ },
324
+ handleFilterStyle() {
325
+ const { filterStore } = reactData
326
+ if (!filterStore.visible) {
327
+ return nextTick()
328
+ }
329
+ return updatePopupStyle()
330
+ }
331
+ }
332
+
333
+ const filterMethods: TableFilterMethods = {
334
+ /**
335
+ * 手动弹出筛选面板
336
+ * @param column
337
+ */
338
+ openFilter(fieldOrColumn) {
339
+ const column = handleFieldOrColumn($xeTable, fieldOrColumn)
340
+ if (column && column.filters) {
341
+ const { elemStore } = internalData
342
+ const { fixed, filters } = column
343
+ return $xeTable.scrollToColumn(column).then(() => {
344
+ const headerWrapperElem = getRefElem(elemStore[`${fixed || 'main'}-header-wrapper`] || elemStore['main-header-wrapper'])
345
+ if (headerWrapperElem) {
346
+ const filterBtnElem = headerWrapperElem.querySelector<HTMLElement>(`.vxe-header--column.${column.id} .vxe-cell--filter`)
347
+ if (filterBtnElem) {
348
+ triggerEvent(filterBtnElem, 'click')
349
+ } else {
350
+ const colEl = headerWrapperElem.querySelector<HTMLElement>(`.vxe-header--column.${column.id}`)
351
+ if (colEl) {
352
+ let firstFilterOption: VxeTableDefines.FilterOption | null = null
353
+ if (filters) {
354
+ firstFilterOption = filters[0] as VxeTableDefines.FilterOption
355
+ }
356
+ const params = {
357
+ $table: $xeTable,
358
+ $grid: $xeGrid,
359
+ $gantt: $xeGantt,
360
+ $rowIndex: -1,
361
+ column,
362
+ columnIndex: $xeTable.getColumnIndex(column),
363
+ $columnIndex: $xeTable.getVMColumnIndex(column),
364
+ _columnIndex: $xeTable.getVTColumnIndex(column),
365
+ firstFilterOption: firstFilterOption as VxeTableDefines.FilterOption,
366
+ fixed,
367
+ source: sourceType,
368
+ type: 'header'
369
+ // isHidden
370
+ // hasFilter
371
+ }
372
+ $xeTable.handleOpenFilterColumn(new Event('click'), null, colEl, column, params)
373
+ }
374
+ }
375
+ }
376
+ })
377
+ }
378
+ return nextTick()
379
+ },
380
+ /**
381
+ * 修改筛选条件列表
382
+ * @param {ColumnInfo} fieldOrColumn 列或字段名
383
+ * @param {Array} options 选项
384
+ */
385
+ setFilter(fieldOrColumn, options, isUpdate) {
386
+ const { filterStore } = reactData
387
+ const column = handleFieldOrColumn($xeTable, fieldOrColumn)
388
+ if (column && column.filters) {
389
+ column.filters = toFilters(options || [], column.id)
390
+ if (isUpdate) {
391
+ return $xeTable.handleColumnConfirmFilter(column, null)
392
+ } else {
393
+ if (filterStore.visible) {
394
+ $xeTable.handleFilterOptions(column)
395
+ }
396
+ }
397
+ }
398
+ return nextTick()
399
+ },
400
+ /**
401
+ * 清空指定列的筛选条件
402
+ * 如果为空则清空所有列的筛选条件
403
+ * @param {String} fieldOrColumn 列或字段名
404
+ */
405
+ clearFilter(fieldOrColumn) {
406
+ const { filterStore } = reactData
407
+ const { tableFullColumn } = internalData
408
+ const filterOpts = computeFilterOpts.value
409
+ let column
410
+ if (fieldOrColumn) {
411
+ column = handleFieldOrColumn($xeTable, fieldOrColumn)
412
+ if (column) {
413
+ $xeTable.handleClearFilter(column)
414
+ }
415
+ } else {
416
+ tableFullColumn.forEach($xeTable.handleClearFilter)
417
+ }
418
+ if (!fieldOrColumn || column !== filterStore.column) {
419
+ Object.assign(filterStore, {
420
+ isAllSelected: false,
421
+ isIndeterminate: false,
422
+ style: null,
423
+ options: [],
424
+ column: null,
425
+ multiple: false,
426
+ visible: false
427
+ })
428
+ }
429
+ if (!filterOpts.remote) {
430
+ return $xeTable.updateData()
431
+ }
432
+ return nextTick()
433
+ },
434
+ saveFilter(fieldOrColumn) {
435
+ if (fieldOrColumn) {
436
+ const column = handleFieldOrColumn($xeTable, fieldOrColumn)
437
+ $xeTable.handleFilterConfirmFilter(null, column)
438
+ }
439
+ return nextTick()
440
+ },
441
+ saveFilterByEvent(evnt, fieldOrColumn) {
442
+ if (fieldOrColumn) {
443
+ const column = handleFieldOrColumn($xeTable, fieldOrColumn)
444
+ $xeTable.handleFilterConfirmFilter(evnt, column)
445
+ }
446
+ return nextTick()
447
+ },
448
+ resetFilter(fieldOrColumn) {
449
+ if (fieldOrColumn) {
450
+ const column = handleFieldOrColumn($xeTable, fieldOrColumn)
451
+ $xeTable.handleFilterResetFilter(null, column)
452
+ }
453
+ return nextTick()
454
+ },
455
+ resetFilterByEvent(evnt, fieldOrColumn) {
456
+ if (fieldOrColumn) {
457
+ const column = handleFieldOrColumn($xeTable, fieldOrColumn)
458
+ $xeTable.handleFilterResetFilter(evnt, column)
459
+ }
460
+ return nextTick()
461
+ },
462
+ saveFilterPanel() {
463
+ const { filterStore } = reactData
464
+ $xeTable.handleFilterConfirmFilter(null, filterStore.column || null)
465
+ return nextTick()
466
+ },
467
+ saveFilterPanelByEvent(evnt) {
468
+ const { filterStore } = reactData
469
+ $xeTable.handleFilterConfirmFilter(evnt, filterStore.column || null)
470
+ return nextTick()
471
+ },
472
+ resetFilterPanel() {
473
+ const { filterStore } = reactData
474
+ $xeTable.handleFilterResetFilter(null, filterStore.column || null)
475
+ return nextTick()
476
+ },
477
+ resetFilterPanelByEvent(evnt) {
478
+ const { filterStore } = reactData
479
+ $xeTable.handleFilterResetFilter(evnt, filterStore.column || null)
480
+ return nextTick()
481
+ },
482
+ getCheckedFilters() {
483
+ const { tableFullColumn } = internalData
484
+ const filterList: VxeTableDefines.FilterCheckedParams[] = []
485
+ tableFullColumn.forEach((column) => {
486
+ const { field, filters } = column
487
+ const filterOptions = filters || []
488
+ const valueList: any[] = []
489
+ const dataList: any[] = []
490
+ if (filterOptions) {
491
+ filterOptions.forEach((item) => {
492
+ if (item.checked) {
493
+ valueList.push(item.value)
494
+ dataList.push(item.data)
495
+ }
496
+ })
497
+ if (valueList.length) {
498
+ filterList.push({ column, field, property: field, values: valueList, datas: dataList })
499
+ }
500
+ }
501
+ })
502
+ return filterList
503
+ },
504
+ updateFilterOptionStatus(item: any, checked: boolean) {
505
+ item._checked = checked
506
+ item.checked = checked
507
+ return nextTick()
508
+ }
509
+ }
510
+
511
+ return { ...filterMethods, ...filterPrivateMethods }
512
+ },
513
+ setupGrid($xeGrid) {
514
+ return $xeGrid.extendTableMethods(tableFilterMethodKeys)
515
+ },
516
+ setupGantt($xeGantt) {
517
+ return $xeGantt.extendTableMethods(tableFilterMethodKeys)
518
+ }
519
+ })