zmdms-webui 3.4.5 → 3.4.7
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/dist/es/applayout/index.css +1 -1
- package/dist/es/applayoutsider/appLayoutSider.d.ts +2 -0
- package/dist/es/applayoutsider/appLayoutSider.js +2 -2
- package/dist/es/applayoutsider/menu/MainMenu.js +17 -9
- package/dist/es/applayoutsider/menu/index.js +2 -2
- package/dist/es/canvastable/canvasTable.js +52 -19
- package/dist/es/canvastable/hooks/renderers/DataRowRenderer.js +28 -8
- package/dist/es/canvastable/hooks/renderers/FixedRowRenderer.js +18 -2
- package/dist/es/canvastable/hooks/useTableState.js +153 -159
- package/dist/es/table/hooks.js +98 -44
- package/dist/es/table/table.js +24 -4
- package/dist/es/table/useColumns.js +3 -2
- package/dist/index.dark.css +2 -2
- package/dist/index.default.css +2 -2
- package/package.json +2 -2
|
@@ -1,15 +1,164 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { useState, useEffect
|
|
1
|
+
import { __spreadArray, __assign } from '../../_virtual/_tslib.js';
|
|
2
|
+
import { useState, useEffect } from 'react';
|
|
3
3
|
import { useMemoizedFn } from 'ahooks';
|
|
4
4
|
import 'zmdms-utils';
|
|
5
5
|
import 'dayjs';
|
|
6
6
|
import { getAllLeafColumns, findColumnByKey } from '../utils/columnHelpers.js';
|
|
7
|
+
import { IS_SUMMARY } from '../../table/constant.js';
|
|
8
|
+
import 'lodash/isEqual';
|
|
9
|
+
import '../../node_modules/immutability-helper/index.js';
|
|
10
|
+
import 'react/jsx-runtime';
|
|
11
|
+
import '../../node_modules/exceljs/dist/exceljs.min.js';
|
|
7
12
|
|
|
8
13
|
/**
|
|
9
14
|
* 表格状态管理 Hook
|
|
10
15
|
*/
|
|
16
|
+
/**
|
|
17
|
+
* 根据数据源和列配置,自动生成筛选选项(基于数据的唯一值)
|
|
18
|
+
* 提取为独立函数,以便在含合计行的最终数据源上调用
|
|
19
|
+
*/
|
|
20
|
+
var generateAutoFilters = function (dataSource, columns) {
|
|
21
|
+
var filtersMap = {};
|
|
22
|
+
if (dataSource.length === 0) {
|
|
23
|
+
return filtersMap;
|
|
24
|
+
}
|
|
25
|
+
var leafColumns = getAllLeafColumns(columns);
|
|
26
|
+
leafColumns.forEach(function (column) {
|
|
27
|
+
if ((column.filters && column.filters.length > 0) ||
|
|
28
|
+
column.isFilter === false ||
|
|
29
|
+
column.key === "__selection__") {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
var dataIndex = column.dataIndex || column.key;
|
|
33
|
+
var uniqueValues = new Set();
|
|
34
|
+
dataSource.forEach(function (record) {
|
|
35
|
+
var value = record[dataIndex];
|
|
36
|
+
if (value !== null && value !== undefined && value !== "") {
|
|
37
|
+
uniqueValues.add(value);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
if (uniqueValues.size > 0) {
|
|
41
|
+
filtersMap[column.key] = Array.from(uniqueValues)
|
|
42
|
+
.map(function (value) { return ({
|
|
43
|
+
text: String(value),
|
|
44
|
+
value: value,
|
|
45
|
+
}); })
|
|
46
|
+
.slice(0, 50);
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
return filtersMap;
|
|
50
|
+
};
|
|
51
|
+
/** 判断是否为数值筛选 */
|
|
52
|
+
var isNumberFilter = function (value) {
|
|
53
|
+
return (value &&
|
|
54
|
+
typeof value === "object" &&
|
|
55
|
+
"operator" in value &&
|
|
56
|
+
"value" in value);
|
|
57
|
+
};
|
|
58
|
+
/** 判断是否为模糊查询 */
|
|
59
|
+
var isFuzzyFilter = function (value) {
|
|
60
|
+
return value && typeof value === "object" && "__fuzzy__" in value;
|
|
61
|
+
};
|
|
62
|
+
/** 应用数值筛选 */
|
|
63
|
+
var applyNumberFilter = function (recordValue, filterValue) {
|
|
64
|
+
var numValue = parseFloat(recordValue);
|
|
65
|
+
if (isNaN(numValue))
|
|
66
|
+
return false;
|
|
67
|
+
var operator = filterValue.operator, value = filterValue.value;
|
|
68
|
+
switch (operator) {
|
|
69
|
+
case "=":
|
|
70
|
+
return numValue === value;
|
|
71
|
+
case "!=":
|
|
72
|
+
return numValue !== value;
|
|
73
|
+
case ">":
|
|
74
|
+
return numValue > value;
|
|
75
|
+
case "<":
|
|
76
|
+
return numValue < value;
|
|
77
|
+
case ">=":
|
|
78
|
+
return numValue >= value;
|
|
79
|
+
case "<=":
|
|
80
|
+
return numValue <= value;
|
|
81
|
+
default:
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
/**
|
|
86
|
+
* 对数据应用筛选和排序
|
|
87
|
+
* 提取为独立函数,以便在含合计行的最终数据源上调用,
|
|
88
|
+
* 使合计行也能参与筛选
|
|
89
|
+
*/
|
|
90
|
+
var processData = function (dataSource, filters, columns, sortField, sortOrder, isAutoMerge) {
|
|
91
|
+
var data = __spreadArray([], dataSource, true);
|
|
92
|
+
// 应用过滤
|
|
93
|
+
Object.keys(filters).forEach(function (key) {
|
|
94
|
+
var filterValues = filters[key];
|
|
95
|
+
if (filterValues && filterValues.length > 0) {
|
|
96
|
+
var column_1 = findColumnByKey(columns, key);
|
|
97
|
+
var dataIndex_1 = (column_1 === null || column_1 === void 0 ? void 0 : column_1.dataIndex) || key;
|
|
98
|
+
if (column_1 === null || column_1 === void 0 ? void 0 : column_1.onFilter) {
|
|
99
|
+
data = data.filter(function (record) {
|
|
100
|
+
return filterValues.some(function (value) { return column_1.onFilter(value, record); });
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
var firstValue = filterValues[0];
|
|
105
|
+
if (isNumberFilter(firstValue)) {
|
|
106
|
+
data = data.filter(function (record) {
|
|
107
|
+
return filterValues.every(function (filterValue) {
|
|
108
|
+
return applyNumberFilter(record[dataIndex_1], filterValue);
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
else if (isFuzzyFilter(firstValue)) {
|
|
113
|
+
var searchText_1 = firstValue.text.toLowerCase();
|
|
114
|
+
data = data.filter(function (record) {
|
|
115
|
+
var recordValue = String(record[dataIndex_1] || "");
|
|
116
|
+
return recordValue.toLowerCase().includes(searchText_1);
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
data = data.filter(function (record) {
|
|
121
|
+
return filterValues.includes(record[dataIndex_1]);
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
// 应用排序(isAutoMerge 时排序由 useAutoMerge 内部处理)
|
|
128
|
+
if (sortField && sortOrder && !isAutoMerge) {
|
|
129
|
+
// 合计行始终保持在末尾,不参与排序
|
|
130
|
+
var summaryRows = data.filter(function (r) { return r[IS_SUMMARY]; });
|
|
131
|
+
var normalRows = data.filter(function (r) { return !r[IS_SUMMARY]; });
|
|
132
|
+
var column_2 = findColumnByKey(columns, sortField);
|
|
133
|
+
if (column_2 && column_2.isOrder !== false) {
|
|
134
|
+
var sortFn_1 = typeof column_2.sorter === "function"
|
|
135
|
+
? column_2.sorter
|
|
136
|
+
: function (a, b) {
|
|
137
|
+
var dataIndex = column_2.dataIndex || column_2.key;
|
|
138
|
+
var aVal = a[dataIndex];
|
|
139
|
+
var bVal = b[dataIndex];
|
|
140
|
+
if (aVal === bVal)
|
|
141
|
+
return 0;
|
|
142
|
+
if (aVal === null || aVal === undefined)
|
|
143
|
+
return 1;
|
|
144
|
+
if (bVal === null || bVal === undefined)
|
|
145
|
+
return -1;
|
|
146
|
+
if (typeof aVal === "number" && typeof bVal === "number") {
|
|
147
|
+
return aVal - bVal;
|
|
148
|
+
}
|
|
149
|
+
return String(aVal).localeCompare(String(bVal));
|
|
150
|
+
};
|
|
151
|
+
normalRows.sort(function (a, b) {
|
|
152
|
+
var result = sortFn_1(a, b);
|
|
153
|
+
return sortOrder === "ascend" ? result : -result;
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
data = __spreadArray(__spreadArray([], normalRows, true), summaryRows, true);
|
|
157
|
+
}
|
|
158
|
+
return data;
|
|
159
|
+
};
|
|
11
160
|
var useTableState = function (params) {
|
|
12
|
-
var
|
|
161
|
+
var rowSelection = params.rowSelection, onFilterChange = params.onFilterChange;
|
|
13
162
|
// 表格状态
|
|
14
163
|
var _a = useState({
|
|
15
164
|
sortField: null,
|
|
@@ -42,159 +191,6 @@ var useTableState = function (params) {
|
|
|
42
191
|
setState(function (prev) { return (__assign(__assign({}, prev), { selectedRowKeys: rowSelection.selectedRowKeys || [] })); });
|
|
43
192
|
}
|
|
44
193
|
}, [rowSelection === null || rowSelection === void 0 ? void 0 : rowSelection.selectedRowKeys]);
|
|
45
|
-
// 自动生成筛选选项(基于数据的唯一值)
|
|
46
|
-
var autoGeneratedFilters = useMemo(function () {
|
|
47
|
-
var filtersMap = {};
|
|
48
|
-
// 如果没有数据,直接返回空对象
|
|
49
|
-
if (dataSource.length === 0) {
|
|
50
|
-
return filtersMap;
|
|
51
|
-
}
|
|
52
|
-
// 获取所有叶子列(包括多级表头中的嵌套列)
|
|
53
|
-
var leafColumns = getAllLeafColumns(columns);
|
|
54
|
-
leafColumns.forEach(function (column) {
|
|
55
|
-
// 如果列已经有有效的filters或未开启filter,跳过
|
|
56
|
-
if ((column.filters && column.filters.length > 0) ||
|
|
57
|
-
column.isFilter === false ||
|
|
58
|
-
column.key === "__selection__") {
|
|
59
|
-
return;
|
|
60
|
-
}
|
|
61
|
-
var dataIndex = column.dataIndex || column.key;
|
|
62
|
-
var uniqueValues = new Set();
|
|
63
|
-
dataSource.forEach(function (record) {
|
|
64
|
-
var value = record[dataIndex];
|
|
65
|
-
if (value !== null && value !== undefined && value !== "") {
|
|
66
|
-
uniqueValues.add(value);
|
|
67
|
-
}
|
|
68
|
-
});
|
|
69
|
-
if (uniqueValues.size > 0) {
|
|
70
|
-
filtersMap[column.key] = Array.from(uniqueValues)
|
|
71
|
-
.map(function (value) { return ({
|
|
72
|
-
text: String(value),
|
|
73
|
-
value: value,
|
|
74
|
-
}); })
|
|
75
|
-
.slice(0, 50);
|
|
76
|
-
}
|
|
77
|
-
});
|
|
78
|
-
return filtersMap;
|
|
79
|
-
}, [dataSource, columns]);
|
|
80
|
-
// 判断是否为数值筛选
|
|
81
|
-
var isNumberFilter = function (value) {
|
|
82
|
-
return (value &&
|
|
83
|
-
typeof value === "object" &&
|
|
84
|
-
"operator" in value &&
|
|
85
|
-
"value" in value);
|
|
86
|
-
};
|
|
87
|
-
// 判断是否为模糊查询
|
|
88
|
-
var isFuzzyFilter = function (value) {
|
|
89
|
-
return value && typeof value === "object" && "__fuzzy__" in value;
|
|
90
|
-
};
|
|
91
|
-
// 应用数值筛选
|
|
92
|
-
var applyNumberFilter = function (recordValue, filterValue) {
|
|
93
|
-
var numValue = parseFloat(recordValue);
|
|
94
|
-
if (isNaN(numValue))
|
|
95
|
-
return false;
|
|
96
|
-
var operator = filterValue.operator, value = filterValue.value;
|
|
97
|
-
switch (operator) {
|
|
98
|
-
case "=":
|
|
99
|
-
return numValue === value;
|
|
100
|
-
case "!=":
|
|
101
|
-
return numValue !== value;
|
|
102
|
-
case ">":
|
|
103
|
-
return numValue > value;
|
|
104
|
-
case "<":
|
|
105
|
-
return numValue < value;
|
|
106
|
-
case ">=":
|
|
107
|
-
return numValue >= value;
|
|
108
|
-
case "<=":
|
|
109
|
-
return numValue <= value;
|
|
110
|
-
default:
|
|
111
|
-
return false;
|
|
112
|
-
}
|
|
113
|
-
};
|
|
114
|
-
// 过滤和排序后的数据
|
|
115
|
-
var processedDataSource = useMemo(function () {
|
|
116
|
-
var data = __spreadArray([], dataSource, true);
|
|
117
|
-
// 应用过滤
|
|
118
|
-
Object.keys(state.filters).forEach(function (key) {
|
|
119
|
-
var filterValues = state.filters[key];
|
|
120
|
-
if (filterValues && filterValues.length > 0) {
|
|
121
|
-
var column_1 = findColumnByKey(columns, key);
|
|
122
|
-
var dataIndex_1 = (column_1 === null || column_1 === void 0 ? void 0 : column_1.dataIndex) || key;
|
|
123
|
-
if (column_1 === null || column_1 === void 0 ? void 0 : column_1.onFilter) {
|
|
124
|
-
// 使用自定义过滤方法
|
|
125
|
-
data = data.filter(function (record) {
|
|
126
|
-
return filterValues.some(function (value) { return column_1.onFilter(value, record); });
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
else {
|
|
130
|
-
// 检查是否为数值筛选
|
|
131
|
-
var firstValue = filterValues[0];
|
|
132
|
-
if (isNumberFilter(firstValue)) {
|
|
133
|
-
// 数值筛选逻辑
|
|
134
|
-
// 如果有多个条件(区间筛选),需要同时满足所有条件(且关系)
|
|
135
|
-
// 如果只有一个条件(单值筛选),满足该条件即可
|
|
136
|
-
data = data.filter(function (record) {
|
|
137
|
-
return filterValues.every(function (filterValue) {
|
|
138
|
-
return applyNumberFilter(record[dataIndex_1], filterValue);
|
|
139
|
-
});
|
|
140
|
-
});
|
|
141
|
-
}
|
|
142
|
-
else if (isFuzzyFilter(firstValue)) {
|
|
143
|
-
// 模糊查询逻辑
|
|
144
|
-
var searchText_1 = firstValue.text.toLowerCase();
|
|
145
|
-
data = data.filter(function (record) {
|
|
146
|
-
var recordValue = String(record[dataIndex_1] || "");
|
|
147
|
-
return recordValue.toLowerCase().includes(searchText_1);
|
|
148
|
-
});
|
|
149
|
-
}
|
|
150
|
-
else {
|
|
151
|
-
// 使用默认过滤方法(精确匹配)
|
|
152
|
-
data = data.filter(function (record) {
|
|
153
|
-
return filterValues.includes(record[dataIndex_1]);
|
|
154
|
-
});
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
});
|
|
159
|
-
// 应用排序
|
|
160
|
-
if (state.sortField && state.sortOrder && !isAutoMerge) {
|
|
161
|
-
var column_2 = findColumnByKey(columns, state.sortField);
|
|
162
|
-
if (column_2 && column_2.isOrder !== false) {
|
|
163
|
-
var sortFn_1 = typeof column_2.sorter === "function"
|
|
164
|
-
? column_2.sorter
|
|
165
|
-
: function (a, b) {
|
|
166
|
-
var dataIndex = column_2.dataIndex || column_2.key;
|
|
167
|
-
var aVal = a[dataIndex];
|
|
168
|
-
var bVal = b[dataIndex];
|
|
169
|
-
// 默认排序逻辑
|
|
170
|
-
if (aVal === bVal)
|
|
171
|
-
return 0;
|
|
172
|
-
if (aVal === null || aVal === undefined)
|
|
173
|
-
return 1;
|
|
174
|
-
if (bVal === null || bVal === undefined)
|
|
175
|
-
return -1;
|
|
176
|
-
// 数字排序
|
|
177
|
-
if (typeof aVal === "number" && typeof bVal === "number") {
|
|
178
|
-
return aVal - bVal;
|
|
179
|
-
}
|
|
180
|
-
// 字符串排序
|
|
181
|
-
return String(aVal).localeCompare(String(bVal));
|
|
182
|
-
};
|
|
183
|
-
data.sort(function (a, b) {
|
|
184
|
-
var result = sortFn_1(a, b);
|
|
185
|
-
return state.sortOrder === "ascend" ? result : -result;
|
|
186
|
-
});
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
return data;
|
|
190
|
-
}, [
|
|
191
|
-
dataSource,
|
|
192
|
-
columns,
|
|
193
|
-
state.filters,
|
|
194
|
-
state.sortField,
|
|
195
|
-
state.sortOrder,
|
|
196
|
-
isAutoMerge,
|
|
197
|
-
]);
|
|
198
194
|
// 处理过滤变化
|
|
199
195
|
var handleFilterChange = useMemoizedFn(function (columnKey, values) {
|
|
200
196
|
var _a;
|
|
@@ -216,11 +212,9 @@ var useTableState = function (params) {
|
|
|
216
212
|
return {
|
|
217
213
|
state: state,
|
|
218
214
|
setState: setState,
|
|
219
|
-
processedDataSource: processedDataSource,
|
|
220
215
|
handleFilterChange: handleFilterChange,
|
|
221
216
|
closeFilterPopover: closeFilterPopover,
|
|
222
|
-
autoGeneratedFilters: autoGeneratedFilters,
|
|
223
217
|
};
|
|
224
218
|
};
|
|
225
219
|
|
|
226
|
-
export { useTableState };
|
|
220
|
+
export { generateAutoFilters, processData, useTableState };
|
package/dist/es/table/hooks.js
CHANGED
|
@@ -4,7 +4,7 @@ import { useMemoizedFn, useLatest } from 'ahooks';
|
|
|
4
4
|
import update from '../node_modules/immutability-helper/index.js';
|
|
5
5
|
import { getInnerIndex } from './useInnerPagination.js';
|
|
6
6
|
import { flattenRecordsOptimized } from './utils.js';
|
|
7
|
-
import { IS_SUMMARY,
|
|
7
|
+
import { IS_SUMMARY, MERGE_ROW_SPANS, MERGE_INDEX } from './constant.js';
|
|
8
8
|
import { filterHandle } from './components/FilterDropdown.js';
|
|
9
9
|
|
|
10
10
|
/**
|
|
@@ -596,61 +596,115 @@ function useMergeAddAndDel(_a) {
|
|
|
596
596
|
return [newRowSelection, newAddAndDelProps];
|
|
597
597
|
}
|
|
598
598
|
/**
|
|
599
|
-
*
|
|
599
|
+
* 对数据应用自定义筛选
|
|
600
|
+
* 提取为独立函数,以便在含合计行的数据上调用
|
|
600
601
|
*/
|
|
601
|
-
function
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
var
|
|
609
|
-
var
|
|
610
|
-
var
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
602
|
+
function applyCustomFilter(dataSource, filterConfig, columns) {
|
|
603
|
+
if (!filterConfig)
|
|
604
|
+
return dataSource;
|
|
605
|
+
return dataSource.filter(function (item, index) {
|
|
606
|
+
var _a;
|
|
607
|
+
var keys = Object.keys(filterConfig);
|
|
608
|
+
var _loop_1 = function (i) {
|
|
609
|
+
var key = keys[i];
|
|
610
|
+
var column = (_a = columns === null || columns === void 0 ? void 0 : columns.find) === null || _a === void 0 ? void 0 : _a.call(columns, function (col) { return (col === null || col === void 0 ? void 0 : col.key) === key || (col === null || col === void 0 ? void 0 : col.dataIndex) === key; });
|
|
611
|
+
var filter = filterConfig[key];
|
|
612
|
+
if (filter.input) {
|
|
613
|
+
if (!filterHandle(filter.input, item, key, {
|
|
614
|
+
column: column,
|
|
615
|
+
recordIndex: index,
|
|
616
|
+
})) {
|
|
617
|
+
return { value: false };
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
if (filter.checkbox && filter.checkbox.length > 0) {
|
|
621
|
+
var flag = false;
|
|
622
|
+
for (var _b = 0, _c = filter.checkbox; _b < _c.length; _b++) {
|
|
623
|
+
var value = _c[_b];
|
|
624
|
+
if (filterHandle(value, item, key, {
|
|
616
625
|
column: column,
|
|
617
626
|
recordIndex: index,
|
|
627
|
+
checkbox: filter.checkbox,
|
|
618
628
|
})) {
|
|
619
|
-
|
|
629
|
+
flag = true;
|
|
630
|
+
break;
|
|
620
631
|
}
|
|
621
632
|
}
|
|
622
|
-
if (
|
|
623
|
-
|
|
624
|
-
for (var _c = 0, _d = filter.checkbox; _c < _d.length; _c++) {
|
|
625
|
-
var value = _d[_c];
|
|
626
|
-
if (filterHandle(value, item, key, {
|
|
627
|
-
column: column,
|
|
628
|
-
recordIndex: index,
|
|
629
|
-
checkbox: filter.checkbox,
|
|
630
|
-
})) {
|
|
631
|
-
flag = true;
|
|
632
|
-
break;
|
|
633
|
-
}
|
|
634
|
-
}
|
|
635
|
-
if (!flag) {
|
|
636
|
-
return { value: false };
|
|
637
|
-
}
|
|
633
|
+
if (!flag) {
|
|
634
|
+
return { value: false };
|
|
638
635
|
}
|
|
639
|
-
};
|
|
640
|
-
for (var i = 0; i < keys.length; i++) {
|
|
641
|
-
var state_1 = _loop_1(i);
|
|
642
|
-
if (typeof state_1 === "object")
|
|
643
|
-
return state_1.value;
|
|
644
636
|
}
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
637
|
+
};
|
|
638
|
+
for (var i = 0; i < keys.length; i++) {
|
|
639
|
+
var state_1 = _loop_1(i);
|
|
640
|
+
if (typeof state_1 === "object")
|
|
641
|
+
return state_1.value;
|
|
642
|
+
}
|
|
643
|
+
return true;
|
|
644
|
+
});
|
|
645
|
+
}
|
|
646
|
+
/**
|
|
647
|
+
* 自定义处理过滤逻辑
|
|
648
|
+
*/
|
|
649
|
+
function useCustomFilter(dataSource, _newColumns) {
|
|
650
|
+
var _a = useState(), filterConfig = _a[0], setFilterConfig = _a[1];
|
|
651
|
+
var columnsRef = useLatest(_newColumns);
|
|
652
|
+
var newDataSource = useMemo(function () { return applyCustomFilter(dataSource, filterConfig, columnsRef.current); }, [dataSource, filterConfig, columnsRef]);
|
|
648
653
|
var handleFilterConfigChange = useMemoizedFn(function (value) {
|
|
649
654
|
setFilterConfig(function (oldValue) {
|
|
650
655
|
return __assign(__assign({}, oldValue), value);
|
|
651
656
|
});
|
|
652
657
|
});
|
|
653
|
-
return [newDataSource, handleFilterConfigChange];
|
|
658
|
+
return [newDataSource, handleFilterConfigChange, filterConfig];
|
|
659
|
+
}
|
|
660
|
+
/**
|
|
661
|
+
* 筛选/排序后重新计算合并行的 rowSpan
|
|
662
|
+
* 原始 MERGE_ROW_SPANS 基于全量数据计算,
|
|
663
|
+
* 筛选后行数和顺序变化,需要基于实际数据重新计算
|
|
664
|
+
*/
|
|
665
|
+
function recalcMergeRowSpans(data) {
|
|
666
|
+
var _a;
|
|
667
|
+
if (!data || data.length === 0)
|
|
668
|
+
return data;
|
|
669
|
+
// 浅拷贝,避免修改原数据
|
|
670
|
+
var result = data.map(function (item) {
|
|
671
|
+
var _a;
|
|
672
|
+
return (__assign(__assign({}, item), (_a = {}, _a[MERGE_ROW_SPANS] = __assign({}, ((item === null || item === void 0 ? void 0 : item[MERGE_ROW_SPANS]) || {})), _a)));
|
|
673
|
+
});
|
|
674
|
+
// 从第一行获取所有需要合并的 key
|
|
675
|
+
var firstSpans = (_a = result[0]) === null || _a === void 0 ? void 0 : _a[MERGE_ROW_SPANS];
|
|
676
|
+
if (!firstSpans || typeof firstSpans !== "object")
|
|
677
|
+
return result;
|
|
678
|
+
var mergeKeys = Object.keys(firstSpans);
|
|
679
|
+
for (var _b = 0, mergeKeys_1 = mergeKeys; _b < mergeKeys_1.length; _b++) {
|
|
680
|
+
var key = mergeKeys_1[_b];
|
|
681
|
+
var i = 0;
|
|
682
|
+
while (i < result.length) {
|
|
683
|
+
// 合计行独立,rowSpan=1,且打断合并连续性
|
|
684
|
+
if (result[i][IS_SUMMARY]) {
|
|
685
|
+
result[i][MERGE_ROW_SPANS][key] = 1;
|
|
686
|
+
i++;
|
|
687
|
+
continue;
|
|
688
|
+
}
|
|
689
|
+
// 找连续相同值(跳过合计行)
|
|
690
|
+
var span = 1;
|
|
691
|
+
while (i + span < result.length) {
|
|
692
|
+
var next = result[i + span];
|
|
693
|
+
if (next[IS_SUMMARY])
|
|
694
|
+
break;
|
|
695
|
+
if (next[key] !== result[i][key])
|
|
696
|
+
break;
|
|
697
|
+
span++;
|
|
698
|
+
}
|
|
699
|
+
// 设置 rowSpan
|
|
700
|
+
result[i][MERGE_ROW_SPANS][key] = span;
|
|
701
|
+
for (var j = 1; j < span; j++) {
|
|
702
|
+
result[i + j][MERGE_ROW_SPANS][key] = 0;
|
|
703
|
+
}
|
|
704
|
+
i += span;
|
|
705
|
+
}
|
|
706
|
+
}
|
|
707
|
+
return result;
|
|
654
708
|
}
|
|
655
709
|
|
|
656
|
-
export { useAddAndDelChange, useAutoMerge, useCalcScrollY, useCustomFilter, useCustomSort, useDateKeys, useEditChange, useMergeAddAndDel, useMergeKeys, useMoveRowChange, useNumKeys, useScuRfresh };
|
|
710
|
+
export { applyCustomFilter, recalcMergeRowSpans, useAddAndDelChange, useAutoMerge, useCalcScrollY, useCustomFilter, useCustomSort, useDateKeys, useEditChange, useMergeAddAndDel, useMergeKeys, useMoveRowChange, useNumKeys, useScuRfresh };
|
package/dist/es/table/table.js
CHANGED
|
@@ -18,7 +18,7 @@ import { useColumns } from './useColumns.js';
|
|
|
18
18
|
import { useDynamicListByColumns } from './useDynamicListByColumns.js';
|
|
19
19
|
import useSummary from './useSummary.js';
|
|
20
20
|
import useInnerPagination, { getInnerIndex } from './useInnerPagination.js';
|
|
21
|
-
import { useScuRfresh, useCustomSort, useCalcScrollY, useEditChange, useMoveRowChange, useAddAndDelChange, useCustomFilter, useAutoMerge } from './hooks.js';
|
|
21
|
+
import { useScuRfresh, useCustomSort, useCalcScrollY, useEditChange, useMoveRowChange, useAddAndDelChange, useCustomFilter, applyCustomFilter, useAutoMerge, recalcMergeRowSpans } from './hooks.js';
|
|
22
22
|
import { HTML5Backend } from '../node_modules/react-dnd-html5-backend/dist/index.js';
|
|
23
23
|
import { scrollTo, VList } from '../node_modules/virtuallist-antd/dist/index.es.js';
|
|
24
24
|
import useTableValidate, { tableValidate } from './useTableValidate.js';
|
|
@@ -103,6 +103,8 @@ var Table = function (props) {
|
|
|
103
103
|
var currentTableDataSource = sortDataSource ? sortDataSource : dataSource;
|
|
104
104
|
// 将表格数据 在 Ref中 存储一份
|
|
105
105
|
var dataSourceRef = useLatest(currentTableDataSource);
|
|
106
|
+
// 筛选候选值数据源 ref:跟踪含维度合计行的最终数据,供 FilterDropdown 使用
|
|
107
|
+
var mergedDataForFilterRef = useRef(currentTableDataSource);
|
|
106
108
|
var hiddenDelBtnHandleRef = useLatest(hiddenDelBtnHandle);
|
|
107
109
|
var hiddenAddBtnHandleRef = useLatest(hiddenAddBtnHandle);
|
|
108
110
|
var scrolly = useCalcScrollY(isAutoScrollY, autoScrollYMarginBottom, tableId);
|
|
@@ -156,7 +158,7 @@ var Table = function (props) {
|
|
|
156
158
|
filterConfigRef: filterConfigRef,
|
|
157
159
|
});
|
|
158
160
|
// 表格内部自定义处理过滤,不走antd内部
|
|
159
|
-
var _y = useCustomFilter(currentTableDataSource, columns),
|
|
161
|
+
var _y = useCustomFilter(currentTableDataSource, columns), handleFilterConfigChange = _y[1], filterConfig = _y[2];
|
|
160
162
|
// 处理列配置信息 得到新的列配置信息
|
|
161
163
|
var _z = useColumns(columns, {
|
|
162
164
|
// 动态列配置相关信息
|
|
@@ -168,6 +170,7 @@ var Table = function (props) {
|
|
|
168
170
|
onCurrentListChange: onCurrentListChange,
|
|
169
171
|
dataSource: currentTableDataSource,
|
|
170
172
|
dataSourceRef: dataSourceRef,
|
|
173
|
+
mergedDataForFilterRef: mergedDataForFilterRef,
|
|
171
174
|
onEditableSave: onEditableSave,
|
|
172
175
|
isEdit: isEdit,
|
|
173
176
|
isAdd: isAdd,
|
|
@@ -204,13 +207,30 @@ var Table = function (props) {
|
|
|
204
207
|
isDynamicColumnTextEnable: isDynamicColumnTextEnable,
|
|
205
208
|
}), _newColumns = _z.newColumns, newRowSelection = _z.rowSelection;
|
|
206
209
|
// 处理表格合并和维度
|
|
207
|
-
|
|
210
|
+
// isAutoMerge 时维度合计基于全量数据(合计值不随筛选变化),筛选在合计之后执行
|
|
211
|
+
var autoMergeInput = isAutoMerge
|
|
212
|
+
? currentTableDataSource
|
|
213
|
+
: applyCustomFilter(currentTableDataSource, filterConfig, _newColumns);
|
|
214
|
+
var _0 = useAutoMerge(autoMergeInput, _newColumns, {
|
|
208
215
|
isAutoMerge: isAutoMerge,
|
|
209
216
|
isDimensionDynamic: isDimensionDynamic,
|
|
210
217
|
isDimensionMergeChildren: isDimensionMergeChildren,
|
|
211
218
|
order: order,
|
|
212
219
|
dimensionCustomSumKeys: dimensionCustomSumKeys,
|
|
213
220
|
}), newDataSource = _0[0], newColumns = _0[1];
|
|
221
|
+
// isAutoMerge 时在含合计行的全量数据上应用筛选,使合计行也参与筛选
|
|
222
|
+
var finalDataSource = useMemo(function () {
|
|
223
|
+
var result = isAutoMerge
|
|
224
|
+
? applyCustomFilter(newDataSource, filterConfig, _newColumns)
|
|
225
|
+
: newDataSource;
|
|
226
|
+
// 仅在筛选后行数减少时重新计算合并 rowSpan(筛选前保持原始逻辑)
|
|
227
|
+
if (isAutoMerge && result.length < newDataSource.length) {
|
|
228
|
+
result = recalcMergeRowSpans(result);
|
|
229
|
+
}
|
|
230
|
+
return result;
|
|
231
|
+
}, [isAutoMerge, newDataSource, filterConfig, _newColumns]);
|
|
232
|
+
// 更新筛选候选值数据源为含合计行的全量数据(不随筛选变化)
|
|
233
|
+
mergedDataForFilterRef.current = newDataSource;
|
|
214
234
|
// 表格验证
|
|
215
235
|
var _1 = useTableValidate(), tableRef = _1.tableRef, getCurrentTable = _1.getCurrentTable, clearErrorClass = _1.clearErrorClass;
|
|
216
236
|
// 内部表格总结栏
|
|
@@ -464,7 +484,7 @@ var Table = function (props) {
|
|
|
464
484
|
scroll: proxyScroll,
|
|
465
485
|
}).tipRef;
|
|
466
486
|
// 表格
|
|
467
|
-
var SingleTable = (jsx(Table$1, __assign({ className: classes, bordered: bordered, dataSource:
|
|
487
|
+
var SingleTable = (jsx(Table$1, __assign({ className: classes, bordered: bordered, dataSource: finalDataSource, columns: newColumns, components: componentsMemo, onRow: onRow, summary: getSummaryHandle, rowSelection: newRowSelection, pagination: isInnerPagination
|
|
468
488
|
? pagination
|
|
469
489
|
? pagination
|
|
470
490
|
: paginationConfig
|
|
@@ -26,7 +26,7 @@ import ModalComponent from '../modal/modal.js';
|
|
|
26
26
|
function useColumns(columns, options) {
|
|
27
27
|
var _this = this;
|
|
28
28
|
var _a, _b;
|
|
29
|
-
var dynamicKey = options.dynamicKey, isRemeberFilter = options.isRemeberFilter, hiddenDynamicIcon = options.hiddenDynamicIcon, currentDynamicList = options.currentDynamicList, dataSource = options.dataSource, dataSourceRef = options.dataSourceRef, onEditableSave = options.onEditableSave, isEdit = options.isEdit, isAdd = options.isAdd, isTheadTitleAdd = options.isTheadTitleAdd, isDel = options.isDel, delPopTitle = options.delPopTitle, dynamicSettingRef = options.dynamicSettingRef, onCurrentListChange = options.onCurrentListChange, onAddAndDel = options.onAddAndDel, getRefreshScuCell = options.getRefreshScuCell, isDelAll = options.isDelAll, currentPage = options.currentPage, onTableChange = options.onTableChange, order = options.order, setOrder = options.setOrder, customSortHandle = options.customSortHandle, isResizableColumn = options.isResizableColumn, isResizableTitleEllipsis = options.isResizableTitleEllipsis, isRealTimeValidate = options.isRealTimeValidate, hiddenDelBtnHandleRef = options.hiddenDelBtnHandleRef, hiddenAddBtnHandleRef = options.hiddenAddBtnHandleRef, rowKey = options.rowKey, filterConfigRef = options.filterConfigRef, rowSelection = options.rowSelection, addAndDelProps = options.addAndDelProps, headerAlign = options.headerAlign, mode = options.mode, isAutoMerge = options.isAutoMerge, handleFilterConfigChange = options.handleFilterConfigChange, _c = options.isAutoMergeAddAndDel, isAutoMergeAddAndDel = _c === void 0 ? true : _c, isDynamicColumnTextEnable = options.isDynamicColumnTextEnable;
|
|
29
|
+
var dynamicKey = options.dynamicKey, isRemeberFilter = options.isRemeberFilter, hiddenDynamicIcon = options.hiddenDynamicIcon, currentDynamicList = options.currentDynamicList, dataSource = options.dataSource, dataSourceRef = options.dataSourceRef, mergedDataForFilterRef = options.mergedDataForFilterRef, onEditableSave = options.onEditableSave, isEdit = options.isEdit, isAdd = options.isAdd, isTheadTitleAdd = options.isTheadTitleAdd, isDel = options.isDel, delPopTitle = options.delPopTitle, dynamicSettingRef = options.dynamicSettingRef, onCurrentListChange = options.onCurrentListChange, onAddAndDel = options.onAddAndDel, getRefreshScuCell = options.getRefreshScuCell, isDelAll = options.isDelAll, currentPage = options.currentPage, onTableChange = options.onTableChange, order = options.order, setOrder = options.setOrder, customSortHandle = options.customSortHandle, isResizableColumn = options.isResizableColumn, isResizableTitleEllipsis = options.isResizableTitleEllipsis, isRealTimeValidate = options.isRealTimeValidate, hiddenDelBtnHandleRef = options.hiddenDelBtnHandleRef, hiddenAddBtnHandleRef = options.hiddenAddBtnHandleRef, rowKey = options.rowKey, filterConfigRef = options.filterConfigRef, rowSelection = options.rowSelection, addAndDelProps = options.addAndDelProps, headerAlign = options.headerAlign, mode = options.mode, isAutoMerge = options.isAutoMerge, handleFilterConfigChange = options.handleFilterConfigChange, _c = options.isAutoMergeAddAndDel, isAutoMergeAddAndDel = _c === void 0 ? true : _c, isDynamicColumnTextEnable = options.isDynamicColumnTextEnable;
|
|
30
30
|
var newColumns = getTableColumns(columns, currentDynamicList).columns;
|
|
31
31
|
// 处理自动合并的加减和选择框
|
|
32
32
|
var _d = useMergeAddAndDel({
|
|
@@ -108,8 +108,9 @@ function useColumns(columns, options) {
|
|
|
108
108
|
* @returns
|
|
109
109
|
*/
|
|
110
110
|
_column.filterDropdown = function (_a) {
|
|
111
|
+
var _b;
|
|
111
112
|
var selectedKeys = _a.selectedKeys, setSelectedKeys = _a.setSelectedKeys, confirm = _a.confirm, clearFilters = _a.clearFilters;
|
|
112
|
-
return (jsx(FilterDropdown, { dataSource: dataSource, dataSourceRef: dataSourceRef, filterKey: _key, selectedKeys: selectedKeys, setSelectedKeys: setSelectedKeys, confirm: confirm, clearFilters: clearFilters, searchValueInputRef: searchValueInputRef, defaultFilterSearchValue: isRemeberFilter ? input_1 : undefined, defaultFilterSearchCheckboxValue: isRemeberFilter ? checkbox_1 : undefined, onFilterChange: function (filter) {
|
|
113
|
+
return (jsx(FilterDropdown, { dataSource: (_b = mergedDataForFilterRef === null || mergedDataForFilterRef === void 0 ? void 0 : mergedDataForFilterRef.current) !== null && _b !== void 0 ? _b : dataSource, dataSourceRef: dataSourceRef, filterKey: _key, selectedKeys: selectedKeys, setSelectedKeys: setSelectedKeys, confirm: confirm, clearFilters: clearFilters, searchValueInputRef: searchValueInputRef, defaultFilterSearchValue: isRemeberFilter ? input_1 : undefined, defaultFilterSearchCheckboxValue: isRemeberFilter ? checkbox_1 : undefined, onFilterChange: function (filter) {
|
|
113
114
|
var _a, _b;
|
|
114
115
|
var _c;
|
|
115
116
|
// 实时记录下当前的值
|