vxe-table 4.16.20 → 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 (77) 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/column.js +2 -0
  10. package/es/table/src/columnInfo.js +14 -6
  11. package/es/table/src/header.js +118 -3
  12. package/es/table/src/props.js +2 -0
  13. package/es/table/src/table.js +29 -26
  14. package/es/table/src/util.js +8 -5
  15. package/es/table/style.css +2 -1
  16. package/es/table/style.min.css +1 -1
  17. package/es/ui/index.js +4 -1
  18. package/es/ui/src/log.js +1 -1
  19. package/es/ui/src/vn.js +11 -0
  20. package/es/vxe-table/style.css +2 -1
  21. package/es/vxe-table/style.min.css +1 -1
  22. package/lib/grid/src/grid.js +12 -0
  23. package/lib/grid/src/grid.min.js +1 -1
  24. package/lib/index.css +1 -1
  25. package/lib/index.min.css +1 -1
  26. package/lib/index.umd.js +510 -134
  27. package/lib/index.umd.min.js +1 -1
  28. package/lib/style.css +1 -1
  29. package/lib/style.min.css +1 -1
  30. package/lib/table/module/filter/hook.js +123 -66
  31. package/lib/table/module/filter/hook.min.js +1 -1
  32. package/lib/table/module/filter/panel.js +59 -26
  33. package/lib/table/module/filter/panel.min.js +1 -1
  34. package/lib/table/render/index.js +109 -8
  35. package/lib/table/render/index.min.js +1 -1
  36. package/lib/table/src/column.js +2 -0
  37. package/lib/table/src/column.min.js +1 -1
  38. package/lib/table/src/columnInfo.js +18 -5
  39. package/lib/table/src/columnInfo.min.js +1 -1
  40. package/lib/table/src/header.js +133 -3
  41. package/lib/table/src/header.min.js +1 -1
  42. package/lib/table/src/props.js +2 -0
  43. package/lib/table/src/props.min.js +1 -1
  44. package/lib/table/src/table.js +10 -10
  45. package/lib/table/src/table.min.js +1 -1
  46. package/lib/table/src/util.js +18 -14
  47. package/lib/table/src/util.min.js +1 -1
  48. package/lib/table/style/style.css +2 -1
  49. package/lib/table/style/style.min.css +1 -1
  50. package/lib/ui/index.js +4 -1
  51. package/lib/ui/index.min.js +1 -1
  52. package/lib/ui/src/log.js +1 -1
  53. package/lib/ui/src/log.min.js +1 -1
  54. package/lib/ui/src/vn.js +12 -0
  55. package/lib/ui/src/vn.min.js +1 -1
  56. package/lib/vxe-table/style/style.css +2 -1
  57. package/lib/vxe-table/style/style.min.css +1 -1
  58. package/package.json +1 -1
  59. package/packages/grid/src/grid.ts +8 -0
  60. package/packages/table/module/filter/hook.ts +110 -64
  61. package/packages/table/module/filter/panel.ts +56 -28
  62. package/packages/table/render/index.ts +110 -15
  63. package/packages/table/src/column.ts +2 -0
  64. package/packages/table/src/columnInfo.ts +19 -7
  65. package/packages/table/src/header.ts +137 -8
  66. package/packages/table/src/props.ts +2 -0
  67. package/packages/table/src/table.ts +30 -26
  68. package/packages/table/src/util.ts +8 -5
  69. package/packages/ui/index.ts +3 -0
  70. package/packages/ui/src/vn.ts +12 -0
  71. package/styles/components/table-module/filter.scss +4 -1
  72. /package/es/{iconfont.1758850674944.ttf → iconfont.1759031444881.ttf} +0 -0
  73. /package/es/{iconfont.1758850674944.woff → iconfont.1759031444881.woff} +0 -0
  74. /package/es/{iconfont.1758850674944.woff2 → iconfont.1759031444881.woff2} +0 -0
  75. /package/lib/{iconfont.1758850674944.ttf → iconfont.1759031444881.ttf} +0 -0
  76. /package/lib/{iconfont.1758850674944.woff → iconfont.1759031444881.woff} +0 -0
  77. /package/lib/{iconfont.1758850674944.woff2 → iconfont.1759031444881.woff2} +0 -0
@@ -14,47 +14,15 @@ hooks.add('tableFilterModule', {
14
14
  const { props, reactData, internalData } = $xeTable;
15
15
  const { refElem, refTableFilter } = $xeTable.getRefMaps();
16
16
  const { computeFilterOpts, computeMouseOpts } = $xeTable.getComputeMaps();
17
- // 确认筛选
18
- const handleFilterConfirmFilter = (evnt) => {
19
- const { filterStore } = reactData;
20
- filterStore.options.forEach((option) => {
21
- option.checked = option._checked;
22
- });
23
- $xeTable.confirmFilterEvent(evnt);
24
- };
25
- // (单选)筛选发生改变
26
- const changeRadioOption = (evnt, checked, item) => {
27
- const { filterStore } = reactData;
28
- filterStore.options.forEach((option) => {
29
- option._checked = false;
30
- });
31
- item._checked = checked;
32
- $xeTable.checkFilterOptions();
33
- handleFilterConfirmFilter(evnt);
34
- };
35
- // (多选)筛选发生改变
36
- const changeMultipleOption = (evnt, checked, item) => {
37
- item._checked = checked;
38
- $xeTable.checkFilterOptions();
39
- };
40
- /**
41
- * 重置筛选
42
- * 当筛选面板中的重置按钮被按下时触发
43
- * @param {Event} evnt 事件
44
- */
45
- const handleFilterResetFilter = (evnt) => {
46
- const { filterStore } = reactData;
47
- $xeTable.handleClearFilter(filterStore.column);
48
- $xeTable.confirmFilterEvent(evnt);
49
- if (evnt) {
50
- $xeTable.dispatchEvent('clear-filter', { filterList: [] }, evnt);
51
- }
52
- };
53
17
  const filterPrivateMethods = {
54
18
  checkFilterOptions() {
55
19
  const { filterStore } = reactData;
56
- filterStore.isAllSelected = filterStore.options.every((item) => item._checked);
57
- filterStore.isIndeterminate = !filterStore.isAllSelected && filterStore.options.some((item) => item._checked);
20
+ const { column } = filterStore;
21
+ if (column) {
22
+ const filterOptions = (column.filters || []);
23
+ filterStore.isAllSelected = filterOptions.every((item) => item._checked);
24
+ filterStore.isIndeterminate = !filterStore.isAllSelected && filterOptions.some((item) => item._checked);
25
+ }
58
26
  },
59
27
  /**
60
28
  * 点击筛选事件
@@ -170,10 +138,11 @@ hooks.add('tableFilterModule', {
170
138
  const { scrollXLoad: oldScrollXLoad, scrollYLoad: oldScrollYLoad } = reactData;
171
139
  const filterOpts = computeFilterOpts.value;
172
140
  const mouseOpts = computeMouseOpts.value;
173
- const { field } = column;
141
+ const { field, filters } = column;
142
+ const filterOptions = filters || [];
174
143
  const values = [];
175
144
  const datas = [];
176
- column.filters.forEach((item) => {
145
+ filterOptions.forEach((item) => {
177
146
  if (item.checked) {
178
147
  values.push(item.value);
179
148
  datas.push(item.data);
@@ -215,27 +184,75 @@ hooks.add('tableFilterModule', {
215
184
  /**
216
185
  * 确认筛选
217
186
  * 当筛选面板中的确定按钮被按下时触发
218
- * @param {Event} evnt 事件
219
187
  */
220
- confirmFilterEvent(evnt) {
188
+ confirmFilterEvent(evnt, column) {
189
+ if (column) {
190
+ $xeTable.handleColumnConfirmFilter(column, evnt);
191
+ }
192
+ },
193
+ // (单选)筛选发生改变
194
+ handleFilterChangeRadioOption(evnt, checked, item) {
221
195
  const { filterStore } = reactData;
222
196
  const { column } = filterStore;
223
- $xeTable.handleColumnConfirmFilter(column, evnt);
197
+ if (column) {
198
+ const filterOptions = (column.filters || []);
199
+ filterOptions.forEach((option) => {
200
+ option._checked = false;
201
+ });
202
+ item._checked = checked;
203
+ $xeTable.checkFilterOptions();
204
+ $xeTable.handleFilterConfirmFilter(evnt, column);
205
+ }
206
+ },
207
+ // (多选)筛选发生改变
208
+ handleFilterChangeMultipleOption(evnt, checked, item) {
209
+ item._checked = checked;
210
+ $xeTable.checkFilterOptions();
224
211
  },
225
- handleFilterChangeRadioOption: changeRadioOption,
226
- handleFilterChangeMultipleOption: changeMultipleOption,
227
212
  // 筛选发生改变
228
213
  handleFilterChangeOption(evnt, checked, item) {
229
214
  const { filterStore } = reactData;
230
- if (filterStore.multiple) {
231
- changeMultipleOption(evnt, checked, item);
215
+ const { fullColumnIdData } = internalData;
216
+ let column = filterStore.column;
217
+ if (!column) {
218
+ const colRest = fullColumnIdData[item._colId];
219
+ if (colRest) {
220
+ column = colRest.column;
221
+ filterStore.column = column;
222
+ }
232
223
  }
233
- else {
234
- changeRadioOption(evnt, checked, item);
224
+ if (column) {
225
+ if (column.filterMultiple) {
226
+ $xeTable.handleFilterChangeMultipleOption(evnt, checked, item);
227
+ }
228
+ else {
229
+ $xeTable.handleFilterChangeRadioOption(evnt, checked, item);
230
+ }
231
+ }
232
+ },
233
+ // 确认筛选
234
+ handleFilterConfirmFilter(evnt, column) {
235
+ if (column) {
236
+ const filterOptions = (column.filters || []);
237
+ filterOptions.forEach((option) => {
238
+ option.checked = option._checked;
239
+ });
240
+ $xeTable.confirmFilterEvent(evnt, column);
235
241
  }
236
242
  },
237
- handleFilterConfirmFilter,
238
- handleFilterResetFilter
243
+ /**
244
+ * 重置筛选
245
+ * 当筛选面板中的重置按钮被按下时触发
246
+ */
247
+ handleFilterResetFilter(evnt, column) {
248
+ if (column) {
249
+ $xeTable.handleClearFilter(column);
250
+ $xeTable.confirmFilterEvent(evnt, column);
251
+ if (evnt) {
252
+ $xeTable.dispatchEvent('clear-filter', { filterList: [] }, evnt);
253
+ }
254
+ }
255
+ }
239
256
  };
240
257
  const filterMethods = {
241
258
  /**
@@ -266,7 +283,7 @@ hooks.add('tableFilterModule', {
266
283
  const { filterStore } = reactData;
267
284
  const column = handleFieldOrColumn($xeTable, fieldOrColumn);
268
285
  if (column && column.filters) {
269
- column.filters = toFilters(options || []);
286
+ column.filters = toFilters(options || [], column.id);
270
287
  if (isUpdate) {
271
288
  return $xeTable.handleColumnConfirmFilter(column, null);
272
289
  }
@@ -313,20 +330,52 @@ hooks.add('tableFilterModule', {
313
330
  }
314
331
  return nextTick();
315
332
  },
333
+ saveFilter(fieldOrColumn) {
334
+ if (fieldOrColumn) {
335
+ const column = handleFieldOrColumn($xeTable, fieldOrColumn);
336
+ $xeTable.handleFilterConfirmFilter(null, column);
337
+ }
338
+ return nextTick();
339
+ },
340
+ saveFilterByEvent(evnt, fieldOrColumn) {
341
+ if (fieldOrColumn) {
342
+ const column = handleFieldOrColumn($xeTable, fieldOrColumn);
343
+ $xeTable.handleFilterConfirmFilter(evnt, column);
344
+ }
345
+ return nextTick();
346
+ },
347
+ resetFilter(fieldOrColumn) {
348
+ if (fieldOrColumn) {
349
+ const column = handleFieldOrColumn($xeTable, fieldOrColumn);
350
+ $xeTable.handleFilterResetFilter(null, column);
351
+ }
352
+ return nextTick();
353
+ },
354
+ resetFilterByEvent(evnt, fieldOrColumn) {
355
+ if (fieldOrColumn) {
356
+ const column = handleFieldOrColumn($xeTable, fieldOrColumn);
357
+ $xeTable.handleFilterResetFilter(evnt, column);
358
+ }
359
+ return nextTick();
360
+ },
316
361
  saveFilterPanel() {
317
- handleFilterConfirmFilter(null);
362
+ const { filterStore } = reactData;
363
+ $xeTable.handleFilterConfirmFilter(null, filterStore.column || null);
318
364
  return nextTick();
319
365
  },
320
366
  saveFilterPanelByEvent(evnt) {
321
- handleFilterConfirmFilter(evnt);
367
+ const { filterStore } = reactData;
368
+ $xeTable.handleFilterConfirmFilter(evnt, filterStore.column || null);
322
369
  return nextTick();
323
370
  },
324
371
  resetFilterPanel() {
325
- handleFilterResetFilter(null);
372
+ const { filterStore } = reactData;
373
+ $xeTable.handleFilterResetFilter(null, filterStore.column || null);
326
374
  return nextTick();
327
375
  },
328
376
  resetFilterPanelByEvent(evnt) {
329
- handleFilterResetFilter(evnt);
377
+ const { filterStore } = reactData;
378
+ $xeTable.handleFilterResetFilter(evnt, filterStore.column || null);
330
379
  return nextTick();
331
380
  },
332
381
  getCheckedFilters() {
@@ -334,10 +383,11 @@ hooks.add('tableFilterModule', {
334
383
  const filterList = [];
335
384
  tableFullColumn.forEach((column) => {
336
385
  const { field, filters } = column;
386
+ const filterOptions = filters || [];
337
387
  const valueList = [];
338
388
  const dataList = [];
339
- if (filters && filters.length) {
340
- filters.forEach((item) => {
389
+ if (filterOptions) {
390
+ filterOptions.forEach((item) => {
341
391
  if (item.checked) {
342
392
  valueList.push(item.value);
343
393
  dataList.push(item.data);
@@ -6,11 +6,14 @@ import { getPropClass, toCssUnit } from '../../../ui/src/dom';
6
6
  import { getSlotVNs } from '../../../ui/src/vn';
7
7
  import { warnLog } from '../../../ui/src/log';
8
8
  import XEUtils from 'xe-utils';
9
- const { getI18n, getIcon, renderer } = VxeUI;
9
+ const { getI18n, getIcon, renderer, renderEmptyElement } = VxeUI;
10
10
  export default defineVxeComponent({
11
11
  name: 'VxeTableFilterPanel',
12
12
  props: {
13
- filterStore: Object
13
+ filterStore: {
14
+ type: Object,
15
+ default: () => ({})
16
+ }
14
17
  },
15
18
  setup(props, context) {
16
19
  const xID = XEUtils.uniqueId();
@@ -29,15 +32,19 @@ export default defineVxeComponent({
29
32
  };
30
33
  const computeHasCheckOption = computed(() => {
31
34
  const { filterStore } = props;
32
- return filterStore && filterStore.options.some((option) => option.checked);
35
+ const { column } = filterStore;
36
+ return column && column.filters && column.filters.some((option) => option.checked);
33
37
  });
34
38
  // 全部筛选事件
35
39
  const filterCheckAllEvent = (evnt, value) => {
36
40
  const { filterStore } = props;
37
- filterStore.options.forEach((option) => {
38
- option._checked = value;
39
- option.checked = value;
40
- });
41
+ const { column } = filterStore;
42
+ if (column && column.filters) {
43
+ column.filters.forEach((option) => {
44
+ option._checked = value;
45
+ option.checked = value;
46
+ });
47
+ }
41
48
  filterStore.isAllSelected = value;
42
49
  filterStore.isIndeterminate = false;
43
50
  };
@@ -46,10 +53,11 @@ export default defineVxeComponent({
46
53
  *************************/
47
54
  // 确认筛选
48
55
  const confirmFilter = (evnt) => {
56
+ const { filterStore } = props;
49
57
  if (!evnt) {
50
58
  warnLog('vxe.error.delFunc', ['confirmFilter', 'saveFilterPanelByEvent']);
51
59
  }
52
- $xeTable.handleFilterConfirmFilter(evnt || new Event('click'));
60
+ $xeTable.handleFilterConfirmFilter(evnt || new Event('click'), filterStore.column || null);
53
61
  };
54
62
  // (单选)筛选发生改变
55
63
  const changeRadioOption = (evnt, checked, item) => {
@@ -61,7 +69,8 @@ export default defineVxeComponent({
61
69
  * @param {Event} evnt 事件
62
70
  */
63
71
  const resetFilter = (evnt) => {
64
- $xeTable.handleFilterResetFilter(evnt);
72
+ const { filterStore } = props;
73
+ $xeTable.handleFilterResetFilter(evnt, filterStore.column || null);
65
74
  };
66
75
  // (多选)筛选发生改变
67
76
  const changeMultipleOption = (evnt, checked, item) => {
@@ -73,7 +82,8 @@ export default defineVxeComponent({
73
82
  };
74
83
  const changeAllOption = (evnt, checked) => {
75
84
  const { filterStore } = props;
76
- if (filterStore.multiple) {
85
+ const { column } = filterStore;
86
+ if (column && column.filterMultiple) {
77
87
  filterCheckAllEvent(evnt, checked);
78
88
  }
79
89
  else {
@@ -94,8 +104,12 @@ export default defineVxeComponent({
94
104
  Object.assign($xeFilterPanel, filterPanelMethods);
95
105
  const renderOptions = (filterRender, compConf) => {
96
106
  const { filterStore } = props;
97
- const { column, multiple, maxHeight } = filterStore;
98
- const slots = column ? column.slots : null;
107
+ const { column, maxHeight } = filterStore;
108
+ if (!column) {
109
+ return [];
110
+ }
111
+ const { filterMultiple, filters, slots } = column;
112
+ const filterOptions = (filters || []);
99
113
  const filterSlot = slots ? slots.filter : null;
100
114
  const params = Object.assign({}, tableInternalData._currFilterParams, { $panel: $xeFilterPanel, $table: $xeTable });
101
115
  const rtFilter = compConf ? (compConf.renderTableFilter || compConf.renderFilter) : null;
@@ -111,7 +125,7 @@ export default defineVxeComponent({
111
125
  }, $xeTable.callSlot(filterSlot, params))
112
126
  ];
113
127
  }
114
- else if (rtFilter) {
128
+ else if (filterRender && rtFilter) {
115
129
  return [
116
130
  h('div', {
117
131
  class: 'vxe-table--filter-template',
@@ -123,8 +137,8 @@ export default defineVxeComponent({
123
137
  }, getSlotVNs(rtFilter(filterRender, params)))
124
138
  ];
125
139
  }
126
- const isAllChecked = multiple ? filterStore.isAllSelected : !filterStore.options.some((item) => item._checked);
127
- const isAllIndeterminate = multiple && filterStore.isIndeterminate;
140
+ const isAllChecked = filterMultiple ? filterStore.isAllSelected : !filterOptions.some((item) => item._checked);
141
+ const isAllIndeterminate = filterMultiple && filterStore.isIndeterminate;
128
142
  return [
129
143
  h('ul', {
130
144
  class: 'vxe-table--filter-header'
@@ -134,11 +148,11 @@ export default defineVxeComponent({
134
148
  'is--checked': isAllChecked,
135
149
  'is--indeterminate': isAllIndeterminate
136
150
  }],
137
- title: getI18n(multiple ? 'vxe.table.allTitle' : 'vxe.table.allFilter'),
151
+ title: getI18n(filterMultiple ? 'vxe.table.allTitle' : 'vxe.table.allFilter'),
138
152
  onClick: (evnt) => {
139
153
  changeAllOption(evnt, !filterStore.isAllSelected);
140
154
  }
141
- }, (multiple
155
+ }, (filterMultiple
142
156
  ? [
143
157
  h('span', {
144
158
  class: ['vxe-checkbox--icon', isAllIndeterminate ? getIcon().TABLE_CHECKBOX_INDETERMINATE : (isAllChecked ? getIcon().TABLE_CHECKBOX_CHECKED : getIcon().TABLE_CHECKBOX_UNCHECKED)]
@@ -157,7 +171,7 @@ export default defineVxeComponent({
157
171
  maxHeight: toCssUnit(maxHeight)
158
172
  }
159
173
  : {}
160
- }, filterStore.options.map((item) => {
174
+ }, filterOptions.map((item) => {
161
175
  const isChecked = item._checked;
162
176
  const isIndeterminate = false;
163
177
  return h('li', {
@@ -168,7 +182,7 @@ export default defineVxeComponent({
168
182
  onClick: (evnt) => {
169
183
  changeOption(evnt, !item._checked, item);
170
184
  }
171
- }, (multiple
185
+ }, (filterMultiple
172
186
  ? [
173
187
  h('span', {
174
188
  class: ['vxe-checkbox--icon', isIndeterminate ? getIcon().TABLE_CHECKBOX_INDETERMINATE : (isChecked ? getIcon().TABLE_CHECKBOX_CHECKED : getIcon().TABLE_CHECKBOX_UNCHECKED)]
@@ -184,13 +198,16 @@ export default defineVxeComponent({
184
198
  };
185
199
  const renderFooters = () => {
186
200
  const { filterStore } = props;
187
- const { column, multiple } = filterStore;
201
+ const { column } = filterStore;
202
+ if (!column) {
203
+ return [];
204
+ }
188
205
  const filterOpts = computeFilterOpts.value;
189
206
  const hasCheckOption = computeHasCheckOption.value;
190
- const { filterRender } = column;
207
+ const { filterRender, filterMultiple } = column;
191
208
  const compConf = isEnableConf(filterRender) ? renderer.get(filterRender.name) : null;
192
209
  const isDisabled = !hasCheckOption && !filterStore.isAllSelected && !filterStore.isIndeterminate;
193
- return multiple && (compConf ? !(compConf.showTableFilterFooter === false || compConf.showFilterFooter === false || compConf.isFooter === false) : true)
210
+ return (compConf ? !(compConf.showTableFilterFooter === false || compConf.showFilterFooter === false || compConf.isFooter === false) : filterMultiple)
194
211
  ? [
195
212
  h('div', {
196
213
  class: 'vxe-table--filter-footer'
@@ -212,9 +229,12 @@ export default defineVxeComponent({
212
229
  const renderVN = () => {
213
230
  const { filterStore } = props;
214
231
  const { initStore } = tableReactData;
215
- const { visible, multiple, column } = filterStore;
232
+ const { visible, column } = filterStore;
233
+ if (!column) {
234
+ return renderEmptyElement($xeFilterPanel);
235
+ }
216
236
  const filterRender = column ? column.filterRender : null;
217
- const compConf = isEnableConf(filterRender) ? renderer.get(filterRender.name) : null;
237
+ const compConf = filterRender && isEnableConf(filterRender) ? renderer.get(filterRender.name) : null;
218
238
  const filterClassName = compConf ? (compConf.tableFilterClassName || compConf.filterClassName) : '';
219
239
  const params = Object.assign({}, tableInternalData._currFilterParams, { $panel: $xeFilterPanel, $table: $xeTable });
220
240
  const tableProps = $xeTable.props;
@@ -236,7 +256,7 @@ export default defineVxeComponent({
236
256
  {
237
257
  [`size--${vSize}`]: vSize,
238
258
  'is--animat': tableProps.animat,
239
- 'is--multiple': multiple,
259
+ 'is--multiple': column.filterMultiple,
240
260
  'is--active': visible
241
261
  }
242
262
  ],
@@ -3,7 +3,7 @@ import XEUtils from 'xe-utils';
3
3
  import { VxeUI } from '../../ui';
4
4
  import { getCellValue, setCellValue } from '../../table/src/util';
5
5
  import { getFuncText, formatText, isEmptyValue } from '../../ui/src/utils';
6
- import { getOnName, getModelEvent, getChangeEvent } from '../../ui/src/vn';
6
+ import { getOnName, getModelEvent, getChangeEvent, hasInputType } from '../../ui/src/vn';
7
7
  import { errLog } from '../../ui/src/log';
8
8
  const { getConfig, renderer, getI18n, getComponent } = VxeUI;
9
9
  const componentDefaultModelProp = 'modelValue';
@@ -38,9 +38,13 @@ function getDefaultComponent({ name }) {
38
38
  function getOldComponent({ name }) {
39
39
  return resolveComponent(getOldComponentName(name));
40
40
  }
41
- function handleConfirmFilter(params, checked, option) {
42
- const { $panel } = params;
43
- $panel.changeOption({}, checked, option);
41
+ function updateFilterChangeOption(params, checked, option) {
42
+ const { $table } = params;
43
+ $table.updateFilterOptionStatus(option, checked);
44
+ }
45
+ function saveFilterEvent(params) {
46
+ const { $table, column } = params;
47
+ $table.saveFilterByEvent(new Event('change'), column);
44
48
  }
45
49
  function getNativeAttrs(renderOpts) {
46
50
  let { name, attrs } = renderOpts;
@@ -137,6 +141,7 @@ function getNativeElementOns(renderOpts, params, eFns) {
137
141
  return ons;
138
142
  }
139
143
  const blurEvent = 'blur';
144
+ const clearEvent = 'clear';
140
145
  /**
141
146
  * 组件事件处理
142
147
  * @param renderOpts
@@ -148,7 +153,7 @@ function getComponentOns(renderOpts, params, eFns, eventOns) {
148
153
  const { events } = renderOpts;
149
154
  const modelEvent = getModelEvent(renderOpts);
150
155
  const changeEvent = getChangeEvent(renderOpts);
151
- const { model: modelFunc, change: changeFunc, blur: blurFunc } = eFns || {};
156
+ const { model: modelFunc, change: changeFunc, blur: blurFunc, clear: clearFunc } = eFns || {};
152
157
  const ons = {};
153
158
  XEUtils.objectEach(events, (func, key) => {
154
159
  ons[getOnName(key)] = function (...args) {
@@ -182,6 +187,14 @@ function getComponentOns(renderOpts, params, eFns, eventOns) {
182
187
  }
183
188
  };
184
189
  }
190
+ if (clearFunc) {
191
+ ons[getOnName(clearEvent)] = function (...args) {
192
+ clearFunc(...args);
193
+ if (events && events[clearEvent]) {
194
+ events[clearEvent](params, ...args);
195
+ }
196
+ };
197
+ }
185
198
  return eventOns ? Object.assign(ons, eventOns) : ons;
186
199
  }
187
200
  function getEditOns(renderOpts, params) {
@@ -227,10 +240,56 @@ function getFilterOns(renderOpts, params, option) {
227
240
  option.data = value;
228
241
  },
229
242
  change() {
230
- handleConfirmFilter(params, !XEUtils.eqNull(option.data), option);
243
+ updateFilterChangeOption(params, !isEmptyValue(option.data), option);
231
244
  },
232
245
  blur() {
233
- handleConfirmFilter(params, !XEUtils.eqNull(option.data), option);
246
+ updateFilterChangeOption(params, !isEmptyValue(option.data), option);
247
+ }
248
+ });
249
+ }
250
+ function getFloatingFilterOns(renderOpts, params, option) {
251
+ const { $table, column } = params;
252
+ if (hasInputType(renderOpts)) {
253
+ return getComponentOns(renderOpts, params, {
254
+ model(value) {
255
+ // 处理 model 值双向绑定
256
+ option.data = value;
257
+ },
258
+ change() {
259
+ updateFilterChangeOption(params, !isEmptyValue(option.data), option);
260
+ },
261
+ clear() {
262
+ updateFilterChangeOption(params, !isEmptyValue(option.data), option);
263
+ saveFilterEvent(params);
264
+ },
265
+ blur() {
266
+ $table.saveFilterByEvent(new Event('change'), column);
267
+ }
268
+ }, renderOpts.name === 'VxeNumberInput'
269
+ ? {
270
+ [getOnName('plus-number')]() {
271
+ updateFilterChangeOption(params, !isEmptyValue(option.data), option);
272
+ saveFilterEvent(params);
273
+ },
274
+ [getOnName('minus-number')]() {
275
+ updateFilterChangeOption(params, !isEmptyValue(option.data), option);
276
+ saveFilterEvent(params);
277
+ }
278
+ }
279
+ : {});
280
+ }
281
+ return getComponentOns(renderOpts, params, {
282
+ model(value) {
283
+ // 处理 model 值双向绑定
284
+ option.data = value;
285
+ },
286
+ clear() {
287
+ updateFilterChangeOption(params, !isEmptyValue(option.data), option);
288
+ $table.saveFilterByEvent(new Event('change'), column);
289
+ },
290
+ change() {
291
+ updateFilterChangeOption(params, !isEmptyValue(option.data), option);
292
+ $table.saveFilterByEvent(new Event('change'), column);
234
293
  }
235
294
  });
236
295
  }
@@ -279,10 +338,10 @@ function getNativeFilterOns(renderOpts, params, option) {
279
338
  }
280
339
  },
281
340
  change() {
282
- handleConfirmFilter(params, !XEUtils.eqNull(option.data), option);
341
+ updateFilterChangeOption(params, !XEUtils.eqNull(option.data), option);
283
342
  },
284
343
  blur() {
285
- handleConfirmFilter(params, !XEUtils.eqNull(option.data), option);
344
+ updateFilterChangeOption(params, !XEUtils.eqNull(option.data), option);
286
345
  }
287
346
  });
288
347
  }
@@ -405,6 +464,18 @@ function defaultFilterRender(renderOpts, params) {
405
464
  return h(getDefaultComponent(renderOpts), Object.assign(Object.assign({ key: oIndex }, getCellEditFilterProps(renderOpts, renderOpts, optionValue)), getFilterOns(renderOpts, params, option)));
406
465
  });
407
466
  }
467
+ function defaultFloatingFilterRender(renderOpts, params) {
468
+ const { option } = params;
469
+ const optionValue = option.data;
470
+ return [
471
+ h(getDefaultComponent(renderOpts), Object.assign(Object.assign({}, getCellEditFilterProps(renderOpts, renderOpts, optionValue)), getFloatingFilterOns(renderOpts, params, option)))
472
+ ];
473
+ }
474
+ function defaultFilterOptions() {
475
+ return [
476
+ { data: null }
477
+ ];
478
+ }
408
479
  /**
409
480
  * 已废弃
410
481
  * @deprecated
@@ -627,7 +698,9 @@ renderer.mixin({
627
698
  return getCellLabelVNs(renderOpts, params, cellValue);
628
699
  },
629
700
  renderTableDefault: defaultEditRender,
701
+ createTableFilterOptions: defaultFilterOptions,
630
702
  renderTableFilter: defaultFilterRender,
703
+ renderTableFloatingFilter: defaultFloatingFilterRender,
631
704
  tableFilterDefaultMethod: handleInputFilterMethod
632
705
  },
633
706
  FormatNumberInput: {
@@ -681,7 +754,9 @@ renderer.mixin({
681
754
  return getFuncText(itemValue, 1);
682
755
  },
683
756
  renderTableDefault: defaultEditRender,
757
+ createTableFilterOptions: defaultFilterOptions,
684
758
  renderTableFilter: defaultFilterRender,
759
+ renderTableFloatingFilter: defaultFloatingFilterRender,
685
760
  tableFilterDefaultMethod: handleInputFilterMethod,
686
761
  tableExportMethod(params) {
687
762
  const { row, column } = params;
@@ -704,7 +779,9 @@ renderer.mixin({
704
779
  return getCellLabelVNs(renderOpts, params, cellValue);
705
780
  },
706
781
  renderTableDefault: defaultEditRender,
782
+ createTableFilterOptions: defaultFilterOptions,
707
783
  renderTableFilter: defaultFilterRender,
784
+ renderTableFloatingFilter: defaultFloatingFilterRender,
708
785
  tableFilterDefaultMethod: handleFilterMethod
709
786
  },
710
787
  VxeDateRangePicker: {
@@ -803,6 +880,7 @@ renderer.mixin({
803
880
  renderTableCell(renderOpts, params) {
804
881
  return getCellLabelVNs(renderOpts, params, getSelectCellValue(renderOpts, params));
805
882
  },
883
+ createTableFilterOptions: defaultFilterOptions,
806
884
  renderTableFilter(renderOpts, params) {
807
885
  const { column } = params;
808
886
  const { options, optionProps, optionGroups, optionGroupProps } = renderOpts;
@@ -811,6 +889,12 @@ renderer.mixin({
811
889
  return h(getDefaultComponent(renderOpts), Object.assign(Object.assign({ key: oIndex }, getCellEditFilterProps(renderOpts, params, optionValue, { options, optionProps, optionGroups, optionGroupProps })), getFilterOns(renderOpts, params, option)));
812
890
  });
813
891
  },
892
+ renderTableFloatingFilter(renderOpts, params) {
893
+ const { option } = params;
894
+ const { options, optionProps, optionGroups, optionGroupProps } = renderOpts;
895
+ const optionValue = option.data;
896
+ return h(getDefaultComponent(renderOpts), Object.assign(Object.assign({}, getCellEditFilterProps(renderOpts, params, optionValue, { options, optionProps, optionGroups, optionGroupProps })), getFloatingFilterOns(renderOpts, params, option)));
897
+ },
814
898
  tableFilterDefaultMethod: handleFilterMethod,
815
899
  tableExportMethod: handleExportSelectMethod
816
900
  },
@@ -91,6 +91,8 @@ export const columnProps = {
91
91
  filterRecoverMethod: Function,
92
92
  // 筛选模板配置项
93
93
  filterRender: Object,
94
+ // 是否显示浮动筛选
95
+ floatingFilters: Object,
94
96
  // 设置为分组节点
95
97
  rowGroupNode: Boolean,
96
98
  // 设置为树节点