vxe-table 4.16.19 → 4.17.0-beta.0

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 (81) hide show
  1. package/es/grid/src/grid.js +8 -0
  2. package/es/index.css +1 -1
  3. package/es/index.min.css +1 -1
  4. package/es/style.css +1 -1
  5. package/es/style.min.css +1 -1
  6. package/es/table/module/filter/hook.js +108 -58
  7. package/es/table/module/filter/panel.js +45 -25
  8. package/es/table/render/index.js +93 -9
  9. package/es/table/src/cell.js +9 -3
  10. package/es/table/src/column.js +2 -0
  11. package/es/table/src/columnInfo.js +14 -6
  12. package/es/table/src/header.js +118 -3
  13. package/es/table/src/props.js +2 -0
  14. package/es/table/src/table.js +29 -26
  15. package/es/table/src/util.js +8 -5
  16. package/es/table/style.css +2 -1
  17. package/es/table/style.min.css +1 -1
  18. package/es/ui/index.js +4 -1
  19. package/es/ui/src/log.js +1 -1
  20. package/es/ui/src/vn.js +11 -0
  21. package/es/vxe-table/style.css +2 -1
  22. package/es/vxe-table/style.min.css +1 -1
  23. package/lib/grid/src/grid.js +12 -0
  24. package/lib/grid/src/grid.min.js +1 -1
  25. package/lib/index.css +1 -1
  26. package/lib/index.min.css +1 -1
  27. package/lib/index.umd.js +525 -137
  28. package/lib/index.umd.min.js +1 -1
  29. package/lib/style.css +1 -1
  30. package/lib/style.min.css +1 -1
  31. package/lib/table/module/filter/hook.js +123 -66
  32. package/lib/table/module/filter/hook.min.js +1 -1
  33. package/lib/table/module/filter/panel.js +59 -26
  34. package/lib/table/module/filter/panel.min.js +1 -1
  35. package/lib/table/render/index.js +109 -8
  36. package/lib/table/render/index.min.js +1 -1
  37. package/lib/table/src/cell.js +15 -3
  38. package/lib/table/src/cell.min.js +1 -1
  39. package/lib/table/src/column.js +2 -0
  40. package/lib/table/src/column.min.js +1 -1
  41. package/lib/table/src/columnInfo.js +18 -5
  42. package/lib/table/src/columnInfo.min.js +1 -1
  43. package/lib/table/src/header.js +133 -3
  44. package/lib/table/src/header.min.js +1 -1
  45. package/lib/table/src/props.js +2 -0
  46. package/lib/table/src/props.min.js +1 -1
  47. package/lib/table/src/table.js +10 -10
  48. package/lib/table/src/table.min.js +1 -1
  49. package/lib/table/src/util.js +18 -14
  50. package/lib/table/src/util.min.js +1 -1
  51. package/lib/table/style/style.css +2 -1
  52. package/lib/table/style/style.min.css +1 -1
  53. package/lib/ui/index.js +4 -1
  54. package/lib/ui/index.min.js +1 -1
  55. package/lib/ui/src/log.js +1 -1
  56. package/lib/ui/src/log.min.js +1 -1
  57. package/lib/ui/src/vn.js +12 -0
  58. package/lib/ui/src/vn.min.js +1 -1
  59. package/lib/vxe-table/style/style.css +2 -1
  60. package/lib/vxe-table/style/style.min.css +1 -1
  61. package/package.json +2 -2
  62. package/packages/grid/src/grid.ts +8 -0
  63. package/packages/table/module/filter/hook.ts +110 -64
  64. package/packages/table/module/filter/panel.ts +56 -28
  65. package/packages/table/render/index.ts +110 -15
  66. package/packages/table/src/cell.ts +9 -3
  67. package/packages/table/src/column.ts +2 -0
  68. package/packages/table/src/columnInfo.ts +19 -7
  69. package/packages/table/src/header.ts +137 -8
  70. package/packages/table/src/props.ts +2 -0
  71. package/packages/table/src/table.ts +30 -26
  72. package/packages/table/src/util.ts +8 -5
  73. package/packages/ui/index.ts +3 -0
  74. package/packages/ui/src/vn.ts +12 -0
  75. package/styles/components/table-module/filter.scss +4 -1
  76. /package/es/{iconfont.1758609514163.ttf → iconfont.1759031444881.ttf} +0 -0
  77. /package/es/{iconfont.1758609514163.woff → iconfont.1759031444881.woff} +0 -0
  78. /package/es/{iconfont.1758609514163.woff2 → iconfont.1759031444881.woff2} +0 -0
  79. /package/lib/{iconfont.1758609514163.ttf → iconfont.1759031444881.ttf} +0 -0
  80. /package/lib/{iconfont.1758609514163.woff → iconfont.1759031444881.woff} +0 -0
  81. /package/lib/{iconfont.1758609514163.woff2 → iconfont.1759031444881.woff2} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vxe-table",
3
- "version": "4.16.19",
3
+ "version": "4.17.0-beta.0",
4
4
  "description": "A PC-end table component based on Vxe UI, supporting copy-paste, data pivot table, and high-performance virtual list table solution.",
5
5
  "scripts": {
6
6
  "update": "npm install --legacy-peer-deps",
@@ -66,7 +66,7 @@
66
66
  "typescript": "~4.7.4",
67
67
  "vue": "3.4.27",
68
68
  "vue-router": "~4.5.1",
69
- "vxe-gantt": "~4.0.12"
69
+ "vxe-gantt": "~4.0.14"
70
70
  },
71
71
  "vetur": {
72
72
  "tags": "helper/vetur/tags.json",
@@ -1385,6 +1385,10 @@ export default defineVxeComponent({
1385
1385
  $pager.endPageByEvent(evnt)
1386
1386
  }
1387
1387
  },
1388
+ getCurrentPage () {
1389
+ const { tablePage } = reactData
1390
+ return tablePage.currentPage
1391
+ },
1388
1392
  setCurrentPage (currentPage) {
1389
1393
  const { tablePage } = reactData
1390
1394
  const pageCount = computePageCount.value
@@ -1397,6 +1401,10 @@ export default defineVxeComponent({
1397
1401
  $pager.setCurrentPageByEvent(evnt, currentPage)
1398
1402
  }
1399
1403
  },
1404
+ getPageSize () {
1405
+ const { tablePage } = reactData
1406
+ return tablePage.pageSize
1407
+ },
1400
1408
  setPageSize (pageSize) {
1401
1409
  const { tablePage } = reactData
1402
1410
  tablePage.pageSize = Math.max(1, XEUtils.toNumber(pageSize))
@@ -21,51 +21,15 @@ hooks.add('tableFilterModule', {
21
21
  const { refElem, refTableFilter } = $xeTable.getRefMaps()
22
22
  const { computeFilterOpts, computeMouseOpts } = $xeTable.getComputeMaps()
23
23
 
24
- // 确认筛选
25
- const handleFilterConfirmFilter = (evnt: Event | null) => {
26
- const { filterStore } = reactData
27
- filterStore.options.forEach((option: any) => {
28
- option.checked = option._checked
29
- })
30
- $xeTable.confirmFilterEvent(evnt)
31
- }
32
-
33
- // (单选)筛选发生改变
34
- const changeRadioOption = (evnt: Event, checked: boolean, item: any) => {
35
- const { filterStore } = reactData
36
- filterStore.options.forEach((option: any) => {
37
- option._checked = false
38
- })
39
- item._checked = checked
40
- $xeTable.checkFilterOptions()
41
- handleFilterConfirmFilter(evnt)
42
- }
43
-
44
- // (多选)筛选发生改变
45
- const changeMultipleOption = (evnt: Event, checked: boolean, item: any) => {
46
- item._checked = checked
47
- $xeTable.checkFilterOptions()
48
- }
49
-
50
- /**
51
- * 重置筛选
52
- * 当筛选面板中的重置按钮被按下时触发
53
- * @param {Event} evnt 事件
54
- */
55
- const handleFilterResetFilter = (evnt: Event | null) => {
56
- const { filterStore } = reactData
57
- $xeTable.handleClearFilter(filterStore.column)
58
- $xeTable.confirmFilterEvent(evnt)
59
- if (evnt) {
60
- $xeTable.dispatchEvent('clear-filter', { filterList: [] }, evnt)
61
- }
62
- }
63
-
64
24
  const filterPrivateMethods: TableFilterPrivateMethods = {
65
25
  checkFilterOptions () {
66
26
  const { filterStore } = reactData
67
- filterStore.isAllSelected = filterStore.options.every((item: any) => item._checked)
68
- filterStore.isIndeterminate = !filterStore.isAllSelected && filterStore.options.some((item: any) => item._checked)
27
+ const { column } = filterStore
28
+ if (column) {
29
+ const filterOptions = (column.filters || []) as VxeTableDefines.FilterOption[]
30
+ filterStore.isAllSelected = filterOptions.every((item) => item._checked)
31
+ filterStore.isIndeterminate = !filterStore.isAllSelected && filterOptions.some((item) => item._checked)
32
+ }
69
33
  },
70
34
  /**
71
35
  * 点击筛选事件
@@ -177,10 +141,11 @@ hooks.add('tableFilterModule', {
177
141
  const { scrollXLoad: oldScrollXLoad, scrollYLoad: oldScrollYLoad } = reactData
178
142
  const filterOpts = computeFilterOpts.value
179
143
  const mouseOpts = computeMouseOpts.value
180
- const { field } = column
144
+ const { field, filters } = column
145
+ const filterOptions = filters || []
181
146
  const values: any[] = []
182
147
  const datas: any[] = []
183
- column.filters.forEach((item: any) => {
148
+ filterOptions.forEach((item) => {
184
149
  if (item.checked) {
185
150
  values.push(item.value)
186
151
  datas.push(item.data)
@@ -222,26 +187,74 @@ hooks.add('tableFilterModule', {
222
187
  /**
223
188
  * 确认筛选
224
189
  * 当筛选面板中的确定按钮被按下时触发
225
- * @param {Event} evnt 事件
226
190
  */
227
- confirmFilterEvent (evnt: Event) {
191
+ confirmFilterEvent (evnt, column) {
192
+ if (column) {
193
+ $xeTable.handleColumnConfirmFilter(column, evnt)
194
+ }
195
+ },
196
+ // (单选)筛选发生改变
197
+ handleFilterChangeRadioOption (evnt, checked, item) {
228
198
  const { filterStore } = reactData
229
199
  const { column } = filterStore
230
- $xeTable.handleColumnConfirmFilter(column, evnt)
200
+ if (column) {
201
+ const filterOptions = (column.filters || []) as VxeTableDefines.FilterOption[]
202
+ filterOptions.forEach((option) => {
203
+ option._checked = false
204
+ })
205
+ item._checked = checked
206
+ $xeTable.checkFilterOptions()
207
+ $xeTable.handleFilterConfirmFilter(evnt, column)
208
+ }
209
+ },
210
+ // (多选)筛选发生改变
211
+ handleFilterChangeMultipleOption (evnt, checked, item) {
212
+ item._checked = checked
213
+ $xeTable.checkFilterOptions()
231
214
  },
232
- handleFilterChangeRadioOption: changeRadioOption,
233
- handleFilterChangeMultipleOption: changeMultipleOption,
234
215
  // 筛选发生改变
235
- handleFilterChangeOption (evnt: Event, checked: boolean, item: any) {
216
+ handleFilterChangeOption (evnt, checked, item) {
236
217
  const { filterStore } = reactData
237
- if (filterStore.multiple) {
238
- changeMultipleOption(evnt, checked, item)
239
- } else {
240
- changeRadioOption(evnt, checked, item)
218
+ const { fullColumnIdData } = internalData
219
+ let column = filterStore.column
220
+ if (!column) {
221
+ const colRest = fullColumnIdData[item._colId]
222
+ if (colRest) {
223
+ column = colRest.column
224
+ filterStore.column = column
225
+ }
226
+ }
227
+ if (column) {
228
+ if (column.filterMultiple) {
229
+ $xeTable.handleFilterChangeMultipleOption(evnt, checked, item)
230
+ } else {
231
+ $xeTable.handleFilterChangeRadioOption(evnt, checked, item)
232
+ }
241
233
  }
242
234
  },
243
- handleFilterConfirmFilter,
244
- handleFilterResetFilter
235
+ // 确认筛选
236
+ handleFilterConfirmFilter (evnt, column) {
237
+ if (column) {
238
+ const filterOptions = (column.filters || []) as VxeTableDefines.FilterOption[]
239
+ filterOptions.forEach((option) => {
240
+ option.checked = option._checked
241
+ })
242
+ $xeTable.confirmFilterEvent(evnt, column)
243
+ }
244
+ },
245
+ /**
246
+ * 重置筛选
247
+ * 当筛选面板中的重置按钮被按下时触发
248
+ */
249
+ handleFilterResetFilter (evnt: Event, column) {
250
+ if (column) {
251
+ $xeTable.handleClearFilter(column)
252
+ $xeTable.confirmFilterEvent(evnt, column)
253
+ if (evnt) {
254
+ $xeTable.dispatchEvent('clear-filter', { filterList: [] }, evnt)
255
+ }
256
+ }
257
+ }
245
258
  }
246
259
 
247
260
  const filterMethods: TableFilterMethods = {
@@ -273,7 +286,7 @@ hooks.add('tableFilterModule', {
273
286
  const { filterStore } = reactData
274
287
  const column = handleFieldOrColumn($xeTable, fieldOrColumn)
275
288
  if (column && column.filters) {
276
- column.filters = toFilters(options || [])
289
+ column.filters = toFilters(options || [], column.id)
277
290
  if (isUpdate) {
278
291
  return $xeTable.handleColumnConfirmFilter(column, null)
279
292
  } else {
@@ -318,31 +331,64 @@ hooks.add('tableFilterModule', {
318
331
  }
319
332
  return nextTick()
320
333
  },
334
+ saveFilter (fieldOrColumn) {
335
+ if (fieldOrColumn) {
336
+ const column = handleFieldOrColumn($xeTable, fieldOrColumn)
337
+ $xeTable.handleFilterConfirmFilter(null, column)
338
+ }
339
+ return nextTick()
340
+ },
341
+ saveFilterByEvent (evnt, fieldOrColumn) {
342
+ if (fieldOrColumn) {
343
+ const column = handleFieldOrColumn($xeTable, fieldOrColumn)
344
+ $xeTable.handleFilterConfirmFilter(evnt, column)
345
+ }
346
+ return nextTick()
347
+ },
348
+ resetFilter (fieldOrColumn) {
349
+ if (fieldOrColumn) {
350
+ const column = handleFieldOrColumn($xeTable, fieldOrColumn)
351
+ $xeTable.handleFilterResetFilter(null, column)
352
+ }
353
+ return nextTick()
354
+ },
355
+ resetFilterByEvent (evnt, fieldOrColumn) {
356
+ if (fieldOrColumn) {
357
+ const column = handleFieldOrColumn($xeTable, fieldOrColumn)
358
+ $xeTable.handleFilterResetFilter(evnt, column)
359
+ }
360
+ return nextTick()
361
+ },
321
362
  saveFilterPanel () {
322
- handleFilterConfirmFilter(null)
363
+ const { filterStore } = reactData
364
+ $xeTable.handleFilterConfirmFilter(null, filterStore.column || null)
323
365
  return nextTick()
324
366
  },
325
367
  saveFilterPanelByEvent (evnt) {
326
- handleFilterConfirmFilter(evnt)
368
+ const { filterStore } = reactData
369
+ $xeTable.handleFilterConfirmFilter(evnt, filterStore.column || null)
327
370
  return nextTick()
328
371
  },
329
372
  resetFilterPanel () {
330
- handleFilterResetFilter(null)
373
+ const { filterStore } = reactData
374
+ $xeTable.handleFilterResetFilter(null, filterStore.column || null)
331
375
  return nextTick()
332
376
  },
333
377
  resetFilterPanelByEvent (evnt) {
334
- handleFilterResetFilter(evnt)
378
+ const { filterStore } = reactData
379
+ $xeTable.handleFilterResetFilter(evnt, filterStore.column || null)
335
380
  return nextTick()
336
381
  },
337
382
  getCheckedFilters () {
338
383
  const { tableFullColumn } = internalData
339
- const filterList: any[] = []
384
+ const filterList: VxeTableDefines.FilterCheckedParams[] = []
340
385
  tableFullColumn.forEach((column) => {
341
386
  const { field, filters } = column
387
+ const filterOptions = filters || []
342
388
  const valueList: any[] = []
343
389
  const dataList: any[] = []
344
- if (filters && filters.length) {
345
- filters.forEach((item) => {
390
+ if (filterOptions) {
391
+ filterOptions.forEach((item) => {
346
392
  if (item.checked) {
347
393
  valueList.push(item.value)
348
394
  dataList.push(item.data)
@@ -1,4 +1,4 @@
1
- import { h, ref, computed, inject, Teleport } from 'vue'
1
+ import { h, ref, computed, inject, Teleport, PropType } from 'vue'
2
2
  import { defineVxeComponent } from '../../../ui/src/comp'
3
3
  import { VxeUI } from '../../../ui'
4
4
  import { formatText, isEnableConf } from '../../../ui/src/utils'
@@ -7,14 +7,25 @@ import { getSlotVNs } from '../../../ui/src/vn'
7
7
  import { warnLog } from '../../../ui/src/log'
8
8
  import XEUtils from 'xe-utils'
9
9
 
10
- import type { VxeTableConstructor, VxeTableMethods, VxeTablePrivateMethods } from '../../../../types'
10
+ import type { VxeGlobalRendererOptions } from 'vxe-pc-ui'
11
+ import type { VxeTableConstructor, VxeTableMethods, VxeTablePrivateMethods, VxeColumnPropTypes, VxeTableDefines } from '../../../../types'
11
12
 
12
- const { getI18n, getIcon, renderer } = VxeUI
13
+ const { getI18n, getIcon, renderer, renderEmptyElement } = VxeUI
13
14
 
14
15
  export default defineVxeComponent({
15
16
  name: 'VxeTableFilterPanel',
16
17
  props: {
17
- filterStore: Object as any
18
+ filterStore: {
19
+ type: Object as PropType<{
20
+ isAllSelected: boolean
21
+ isIndeterminate: boolean
22
+ style: any
23
+ column: VxeTableDefines.ColumnInfo | null | undefined
24
+ visible: boolean
25
+ maxHeight: number | string | null
26
+ }>,
27
+ default: () => ({})
28
+ }
18
29
  },
19
30
  setup (props, context) {
20
31
  const xID = XEUtils.uniqueId()
@@ -38,16 +49,20 @@ export default defineVxeComponent({
38
49
 
39
50
  const computeHasCheckOption = computed(() => {
40
51
  const { filterStore } = props
41
- return filterStore && filterStore.options.some((option: any) => option.checked)
52
+ const { column } = filterStore
53
+ return column && column.filters && column.filters.some((option) => option.checked)
42
54
  })
43
55
 
44
56
  // 全部筛选事件
45
57
  const filterCheckAllEvent = (evnt: Event, value: any) => {
46
58
  const { filterStore } = props
47
- filterStore.options.forEach((option: any) => {
48
- option._checked = value
49
- option.checked = value
50
- })
59
+ const { column } = filterStore
60
+ if (column && column.filters) {
61
+ column.filters.forEach((option: any) => {
62
+ option._checked = value
63
+ option.checked = value
64
+ })
65
+ }
51
66
  filterStore.isAllSelected = value
52
67
  filterStore.isIndeterminate = false
53
68
  }
@@ -57,10 +72,11 @@ export default defineVxeComponent({
57
72
  *************************/
58
73
  // 确认筛选
59
74
  const confirmFilter = (evnt: Event) => {
75
+ const { filterStore } = props
60
76
  if (!evnt) {
61
77
  warnLog('vxe.error.delFunc', ['confirmFilter', 'saveFilterPanelByEvent'])
62
78
  }
63
- $xeTable.handleFilterConfirmFilter(evnt || new Event('click'))
79
+ $xeTable.handleFilterConfirmFilter(evnt || new Event('click'), filterStore.column || null)
64
80
  }
65
81
 
66
82
  // (单选)筛选发生改变
@@ -74,7 +90,8 @@ export default defineVxeComponent({
74
90
  * @param {Event} evnt 事件
75
91
  */
76
92
  const resetFilter = (evnt: Event) => {
77
- $xeTable.handleFilterResetFilter(evnt)
93
+ const { filterStore } = props
94
+ $xeTable.handleFilterResetFilter(evnt, filterStore.column || null)
78
95
  }
79
96
 
80
97
  // (多选)筛选发生改变
@@ -89,7 +106,8 @@ export default defineVxeComponent({
89
106
 
90
107
  const changeAllOption = (evnt: Event, checked: boolean) => {
91
108
  const { filterStore } = props
92
- if (filterStore.multiple) {
109
+ const { column } = filterStore
110
+ if (column && column.filterMultiple) {
93
111
  filterCheckAllEvent(evnt, checked)
94
112
  } else {
95
113
  resetFilter(evnt)
@@ -109,10 +127,14 @@ export default defineVxeComponent({
109
127
  }
110
128
  Object.assign($xeFilterPanel, filterPanelMethods)
111
129
 
112
- const renderOptions = (filterRender: any, compConf: any) => {
130
+ const renderOptions = (filterRender: VxeColumnPropTypes.FilterRender | null, compConf: VxeGlobalRendererOptions | null) => {
113
131
  const { filterStore } = props
114
- const { column, multiple, maxHeight } = filterStore
115
- const slots = column ? column.slots : null
132
+ const { column, maxHeight } = filterStore
133
+ if (!column) {
134
+ return []
135
+ }
136
+ const { filterMultiple, filters, slots } = column
137
+ const filterOptions = (filters || []) as VxeTableDefines.FilterOption[]
116
138
  const filterSlot = slots ? slots.filter : null
117
139
  const params = Object.assign({}, tableInternalData._currFilterParams, { $panel: $xeFilterPanel, $table: $xeTable })
118
140
  const rtFilter = compConf ? (compConf.renderTableFilter || compConf.renderFilter) : null
@@ -127,7 +149,7 @@ export default defineVxeComponent({
127
149
  : {}
128
150
  }, $xeTable.callSlot(filterSlot, params))
129
151
  ]
130
- } else if (rtFilter) {
152
+ } else if (filterRender && rtFilter) {
131
153
  return [
132
154
  h('div', {
133
155
  class: 'vxe-table--filter-template',
@@ -139,8 +161,8 @@ export default defineVxeComponent({
139
161
  }, getSlotVNs(rtFilter(filterRender, params)))
140
162
  ]
141
163
  }
142
- const isAllChecked = multiple ? filterStore.isAllSelected : !filterStore.options.some((item: any) => item._checked)
143
- const isAllIndeterminate = multiple && filterStore.isIndeterminate
164
+ const isAllChecked = filterMultiple ? filterStore.isAllSelected : !filterOptions.some((item) => item._checked)
165
+ const isAllIndeterminate = filterMultiple && filterStore.isIndeterminate
144
166
  return [
145
167
  h('ul', {
146
168
  class: 'vxe-table--filter-header'
@@ -150,11 +172,11 @@ export default defineVxeComponent({
150
172
  'is--checked': isAllChecked,
151
173
  'is--indeterminate': isAllIndeterminate
152
174
  }],
153
- title: getI18n(multiple ? 'vxe.table.allTitle' : 'vxe.table.allFilter'),
175
+ title: getI18n(filterMultiple ? 'vxe.table.allTitle' : 'vxe.table.allFilter'),
154
176
  onClick: (evnt: MouseEvent) => {
155
177
  changeAllOption(evnt, !filterStore.isAllSelected)
156
178
  }
157
- }, (multiple
179
+ }, (filterMultiple
158
180
  ? [
159
181
  h('span', {
160
182
  class: ['vxe-checkbox--icon', isAllIndeterminate ? getIcon().TABLE_CHECKBOX_INDETERMINATE : (isAllChecked ? getIcon().TABLE_CHECKBOX_CHECKED : getIcon().TABLE_CHECKBOX_UNCHECKED)]
@@ -173,7 +195,7 @@ export default defineVxeComponent({
173
195
  maxHeight: toCssUnit(maxHeight)
174
196
  }
175
197
  : {}
176
- }, filterStore.options.map((item: any) => {
198
+ }, filterOptions.map((item: any) => {
177
199
  const isChecked = item._checked
178
200
  const isIndeterminate = false
179
201
  return h('li', {
@@ -184,7 +206,7 @@ export default defineVxeComponent({
184
206
  onClick: (evnt: MouseEvent) => {
185
207
  changeOption(evnt, !item._checked, item)
186
208
  }
187
- }, (multiple
209
+ }, (filterMultiple
188
210
  ? [
189
211
  h('span', {
190
212
  class: ['vxe-checkbox--icon', isIndeterminate ? getIcon().TABLE_CHECKBOX_INDETERMINATE : (isChecked ? getIcon().TABLE_CHECKBOX_CHECKED : getIcon().TABLE_CHECKBOX_UNCHECKED)]
@@ -201,13 +223,16 @@ export default defineVxeComponent({
201
223
 
202
224
  const renderFooters = () => {
203
225
  const { filterStore } = props
204
- const { column, multiple } = filterStore
226
+ const { column } = filterStore
227
+ if (!column) {
228
+ return []
229
+ }
205
230
  const filterOpts = computeFilterOpts.value
206
231
  const hasCheckOption = computeHasCheckOption.value
207
- const { filterRender } = column
232
+ const { filterRender, filterMultiple } = column
208
233
  const compConf = isEnableConf(filterRender) ? renderer.get(filterRender.name) : null
209
234
  const isDisabled = !hasCheckOption && !filterStore.isAllSelected && !filterStore.isIndeterminate
210
- return multiple && (compConf ? !(compConf.showTableFilterFooter === false || compConf.showFilterFooter === false || compConf.isFooter === false) : true)
235
+ return (compConf ? !(compConf.showTableFilterFooter === false || compConf.showFilterFooter === false || compConf.isFooter === false) : filterMultiple)
211
236
  ? [
212
237
  h('div', {
213
238
  class: 'vxe-table--filter-footer'
@@ -230,9 +255,12 @@ export default defineVxeComponent({
230
255
  const renderVN = () => {
231
256
  const { filterStore } = props
232
257
  const { initStore } = tableReactData
233
- const { visible, multiple, column } = filterStore
258
+ const { visible, column } = filterStore
259
+ if (!column) {
260
+ return renderEmptyElement($xeFilterPanel)
261
+ }
234
262
  const filterRender = column ? column.filterRender : null
235
- const compConf = isEnableConf(filterRender) ? renderer.get(filterRender.name) : null
263
+ const compConf = filterRender && isEnableConf(filterRender) ? renderer.get(filterRender.name) : null
236
264
  const filterClassName = compConf ? (compConf.tableFilterClassName || compConf.filterClassName) : ''
237
265
  const params = Object.assign({}, tableInternalData._currFilterParams, { $panel: $xeFilterPanel, $table: $xeTable })
238
266
  const tableProps = $xeTable.props
@@ -254,7 +282,7 @@ export default defineVxeComponent({
254
282
  {
255
283
  [`size--${vSize}`]: vSize,
256
284
  'is--animat': tableProps.animat,
257
- 'is--multiple': multiple,
285
+ 'is--multiple': column.filterMultiple,
258
286
  'is--active': visible
259
287
  }
260
288
  ],