vxe-table 4.16.20 → 4.17.0-beta.1
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.
- package/README.md +2 -0
- package/es/grid/src/grid.js +8 -0
- package/es/index.css +1 -1
- package/es/index.min.css +1 -1
- package/es/style.css +1 -1
- package/es/style.min.css +1 -1
- package/es/table/module/filter/hook.js +109 -59
- package/es/table/module/filter/panel.js +46 -26
- package/es/table/render/index.js +93 -9
- package/es/table/src/column.js +2 -0
- package/es/table/src/columnInfo.js +14 -6
- package/es/table/src/header.js +118 -3
- package/es/table/src/props.js +2 -0
- package/es/table/src/table.js +31 -28
- package/es/table/src/util.js +8 -5
- package/es/table/style.css +2 -1
- package/es/table/style.min.css +1 -1
- package/es/ui/index.js +4 -1
- package/es/ui/src/log.js +1 -1
- package/es/ui/src/vn.js +11 -0
- package/es/vxe-table/style.css +2 -1
- package/es/vxe-table/style.min.css +1 -1
- package/lib/grid/src/grid.js +12 -0
- package/lib/grid/src/grid.min.js +1 -1
- package/lib/index.css +1 -1
- package/lib/index.min.css +1 -1
- package/lib/index.umd.js +513 -136
- package/lib/index.umd.min.js +1 -1
- package/lib/style.css +1 -1
- package/lib/style.min.css +1 -1
- package/lib/table/module/filter/hook.js +124 -67
- package/lib/table/module/filter/hook.min.js +1 -1
- package/lib/table/module/filter/panel.js +60 -26
- package/lib/table/module/filter/panel.min.js +1 -1
- package/lib/table/render/index.js +109 -8
- package/lib/table/render/index.min.js +1 -1
- package/lib/table/src/column.js +2 -0
- package/lib/table/src/column.min.js +1 -1
- package/lib/table/src/columnInfo.js +18 -5
- package/lib/table/src/columnInfo.min.js +1 -1
- package/lib/table/src/header.js +133 -3
- package/lib/table/src/header.min.js +1 -1
- package/lib/table/src/props.js +2 -0
- package/lib/table/src/props.min.js +1 -1
- package/lib/table/src/table.js +11 -11
- package/lib/table/src/table.min.js +1 -1
- package/lib/table/src/util.js +18 -14
- package/lib/table/src/util.min.js +1 -1
- package/lib/table/style/style.css +2 -1
- package/lib/table/style/style.min.css +1 -1
- package/lib/ui/index.js +4 -1
- package/lib/ui/index.min.js +1 -1
- package/lib/ui/src/log.js +1 -1
- package/lib/ui/src/log.min.js +1 -1
- package/lib/ui/src/vn.js +12 -0
- package/lib/ui/src/vn.min.js +1 -1
- package/lib/vxe-table/style/style.css +2 -1
- package/lib/vxe-table/style/style.min.css +1 -1
- package/package.json +1 -1
- package/packages/grid/src/grid.ts +8 -0
- package/packages/table/module/filter/hook.ts +111 -65
- package/packages/table/module/filter/panel.ts +57 -29
- package/packages/table/render/index.ts +110 -15
- package/packages/table/src/column.ts +2 -0
- package/packages/table/src/columnInfo.ts +19 -7
- package/packages/table/src/header.ts +137 -8
- package/packages/table/src/props.ts +2 -0
- package/packages/table/src/table.ts +32 -28
- package/packages/table/src/util.ts +8 -5
- package/packages/ui/index.ts +3 -0
- package/packages/ui/src/vn.ts +12 -0
- package/styles/components/table-module/filter.scss +4 -1
- /package/es/{iconfont.1758850674944.ttf → iconfont.1759043328183.ttf} +0 -0
- /package/es/{iconfont.1758850674944.woff → iconfont.1759043328183.woff} +0 -0
- /package/es/{iconfont.1758850674944.woff2 → iconfont.1759043328183.woff2} +0 -0
- /package/lib/{iconfont.1758850674944.ttf → iconfont.1759043328183.ttf} +0 -0
- /package/lib/{iconfont.1758850674944.woff → iconfont.1759043328183.woff} +0 -0
- /package/lib/{iconfont.1758850674944.woff2 → iconfont.1759043328183.woff2} +0 -0
|
@@ -5,7 +5,7 @@ import { toFilters, handleFieldOrColumn, getRefElem } from '../../src/util';
|
|
|
5
5
|
import { toCssUnit, triggerEvent, getDomNode } from '../../../ui/src/dom';
|
|
6
6
|
import { isEnableConf } from '../../../ui/src/utils';
|
|
7
7
|
const { renderer, hooks } = VxeUI;
|
|
8
|
-
const tableFilterMethodKeys = ['openFilter', 'setFilter', 'clearFilter', 'saveFilterPanel', 'saveFilterPanelByEvent', 'resetFilterPanel', 'resetFilterPanelByEvent', 'getCheckedFilters', 'updateFilterOptionStatus'];
|
|
8
|
+
const tableFilterMethodKeys = ['openFilter', 'setFilter', 'clearFilter', 'saveFilter', 'saveFilterByEvent', 'saveFilterPanel', 'saveFilterPanelByEvent', 'resetFilter', 'resetFilterByEvent', 'resetFilterPanel', 'resetFilterPanelByEvent', 'getCheckedFilters', 'updateFilterOptionStatus'];
|
|
9
9
|
hooks.add('tableFilterModule', {
|
|
10
10
|
setupTable($xeTable) {
|
|
11
11
|
const $xeGrid = $xeTable.xeGrid;
|
|
@@ -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
|
-
|
|
57
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
231
|
-
|
|
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
|
-
|
|
234
|
-
|
|
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
|
-
|
|
238
|
-
|
|
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
|
-
|
|
362
|
+
const { filterStore } = reactData;
|
|
363
|
+
$xeTable.handleFilterConfirmFilter(null, filterStore.column || null);
|
|
318
364
|
return nextTick();
|
|
319
365
|
},
|
|
320
366
|
saveFilterPanelByEvent(evnt) {
|
|
321
|
-
|
|
367
|
+
const { filterStore } = reactData;
|
|
368
|
+
$xeTable.handleFilterConfirmFilter(evnt, filterStore.column || null);
|
|
322
369
|
return nextTick();
|
|
323
370
|
},
|
|
324
371
|
resetFilterPanel() {
|
|
325
|
-
|
|
372
|
+
const { filterStore } = reactData;
|
|
373
|
+
$xeTable.handleFilterResetFilter(null, filterStore.column || null);
|
|
326
374
|
return nextTick();
|
|
327
375
|
},
|
|
328
376
|
resetFilterPanelByEvent(evnt) {
|
|
329
|
-
|
|
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 (
|
|
340
|
-
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
38
|
-
|
|
39
|
-
option
|
|
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
|
-
|
|
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
|
-
|
|
85
|
+
const { column } = filterStore;
|
|
86
|
+
if (column && column.filterMultiple) {
|
|
77
87
|
filterCheckAllEvent(evnt, checked);
|
|
78
88
|
}
|
|
79
89
|
else {
|
|
@@ -94,10 +104,14 @@ export default defineVxeComponent({
|
|
|
94
104
|
Object.assign($xeFilterPanel, filterPanelMethods);
|
|
95
105
|
const renderOptions = (filterRender, compConf) => {
|
|
96
106
|
const { filterStore } = props;
|
|
97
|
-
const { column,
|
|
98
|
-
|
|
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
|
-
const params = Object.assign({}, tableInternalData._currFilterParams, { $panel: $xeFilterPanel, $table: $xeTable });
|
|
114
|
+
const params = Object.assign({}, tableInternalData._currFilterParams, { option: filterOptions[0], $panel: $xeFilterPanel, $table: $xeTable });
|
|
101
115
|
const rtFilter = compConf ? (compConf.renderTableFilter || compConf.renderFilter) : null;
|
|
102
116
|
if (filterSlot) {
|
|
103
117
|
return [
|
|
@@ -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 =
|
|
127
|
-
const isAllIndeterminate =
|
|
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(
|
|
151
|
+
title: getI18n(filterMultiple ? 'vxe.table.allTitle' : 'vxe.table.allFilter'),
|
|
138
152
|
onClick: (evnt) => {
|
|
139
153
|
changeAllOption(evnt, !filterStore.isAllSelected);
|
|
140
154
|
}
|
|
141
|
-
}, (
|
|
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
|
-
},
|
|
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
|
-
}, (
|
|
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
|
|
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
|
|
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,
|
|
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':
|
|
259
|
+
'is--multiple': column.filterMultiple,
|
|
240
260
|
'is--active': visible
|
|
241
261
|
}
|
|
242
262
|
],
|
package/es/table/render/index.js
CHANGED
|
@@ -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
|
|
42
|
-
const { $
|
|
43
|
-
$
|
|
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
|
-
|
|
243
|
+
updateFilterChangeOption(params, !isEmptyValue(option.data), option);
|
|
231
244
|
},
|
|
232
245
|
blur() {
|
|
233
|
-
|
|
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
|
-
|
|
341
|
+
updateFilterChangeOption(params, !XEUtils.eqNull(option.data), option);
|
|
283
342
|
},
|
|
284
343
|
blur() {
|
|
285
|
-
|
|
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
|
},
|