zmdms-webui 1.8.5 → 1.8.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/dynamicsetting/dynamicDrawer.js +6 -0
- package/dist/es/dynamicsetting/interface.d.ts +2 -0
- package/dist/es/dynamicsetting/useDynamic.js +1 -0
- package/dist/es/table/components/Badge.d.ts +24 -0
- package/dist/es/table/components/Badge.js +51 -0
- package/dist/es/table/constant.d.ts +3 -0
- package/dist/es/table/constant.js +4 -2
- package/dist/es/table/excel.js +165 -63
- package/dist/es/table/hooks.js +23 -27
- package/dist/es/table/interface.d.ts +11 -0
- package/dist/es/table/table.js +5 -2
- package/dist/es/table/useColumns.js +19 -11
- package/dist/es/table/useDynamicListByColumns.js +2 -1
- package/dist/es/table/useSummary.js +5 -1
- package/dist/es/table/utils.js +5 -5
- package/package.json +1 -1
|
@@ -61,6 +61,12 @@ var DynamicDrawer = function (props, ref) {
|
|
|
61
61
|
var endIndex = isUp ? hoverIndex : dragIndex;
|
|
62
62
|
var oldItem = tempDynamicList[startIndex];
|
|
63
63
|
var dragItem = tempDynamicList[endIndex];
|
|
64
|
+
// 仅当同组且存在优先级时校验;不同组直接通过
|
|
65
|
+
var oldGroup = oldItem === null || oldItem === void 0 ? void 0 : oldItem.dimensionGroup;
|
|
66
|
+
var dragGroup = dragItem === null || dragItem === void 0 ? void 0 : dragItem.dimensionGroup;
|
|
67
|
+
if (oldGroup !== dragGroup) {
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
64
70
|
if ((oldItem === null || oldItem === void 0 ? void 0 : oldItem.dimensionPriority) !== undefined) {
|
|
65
71
|
if ((dragItem === null || dragItem === void 0 ? void 0 : dragItem.dimensionPriority) === undefined ||
|
|
66
72
|
(oldItem === null || oldItem === void 0 ? void 0 : oldItem.dimensionPriority) < (dragItem === null || dragItem === void 0 ? void 0 : dragItem.dimensionPriority)) {
|
|
@@ -10,6 +10,8 @@ interface IDynamicItem {
|
|
|
10
10
|
filter?: IFilter;
|
|
11
11
|
isDimension?: boolean;
|
|
12
12
|
dimensionPriority?: number;
|
|
13
|
+
/** 维度优先级分组,同组内遵循 dimensionPriority,跨组不比较 */
|
|
14
|
+
dimensionGroup?: string;
|
|
13
15
|
dimensionExclusive?: string;
|
|
14
16
|
isDimensionSum?: boolean;
|
|
15
17
|
[props: string]: any;
|
|
@@ -17,6 +17,7 @@ function recursionDynamicItems(list, currentDynamicList) {
|
|
|
17
17
|
currentData.disabled = result.disabled;
|
|
18
18
|
currentData.isDimension = result.isDimension;
|
|
19
19
|
currentData.dimensionPriority = result.dimensionPriority;
|
|
20
|
+
currentData.dimensionGroup = result.dimensionGroup;
|
|
20
21
|
currentData.dimensionExclusive = result.dimensionExclusive;
|
|
21
22
|
// 判断是否是多级表头,这里的逻辑处理是为了兼容
|
|
22
23
|
// 后面改造成多级表头的情况
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import React__default from 'react';
|
|
2
|
+
|
|
3
|
+
interface IBadgeProps {
|
|
4
|
+
/** 角标提示文本 */
|
|
5
|
+
title?: string;
|
|
6
|
+
/** 角标颜色 */
|
|
7
|
+
color?: string;
|
|
8
|
+
/** 角标大小 */
|
|
9
|
+
size?: "small" | "default" | "large";
|
|
10
|
+
/** 是否显示角标 */
|
|
11
|
+
show?: boolean;
|
|
12
|
+
/** 角标样式 */
|
|
13
|
+
style?: React__default.CSSProperties;
|
|
14
|
+
/** 角标类名 */
|
|
15
|
+
className?: string;
|
|
16
|
+
/** 子元素 */
|
|
17
|
+
children?: React__default.ReactNode;
|
|
18
|
+
/** 角标位置 */
|
|
19
|
+
position?: "top-right" | "top-left" | "bottom-right" | "bottom-left";
|
|
20
|
+
/** 触发方式 */
|
|
21
|
+
trigger?: "click" | "hover" | "focus";
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export { IBadgeProps };
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { __rest, __assign } from '../../_virtual/_tslib.js';
|
|
2
|
+
import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
|
|
3
|
+
import { Tooltip } from 'antd';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* 角标组件
|
|
7
|
+
* 右上角显示三角形角标,鼠标悬停显示提示文本
|
|
8
|
+
*/
|
|
9
|
+
var Badge = function (_a) {
|
|
10
|
+
var title = _a.title, _b = _a.color, color = _b === void 0 ? "#f50" : _b, _c = _a.size, size = _c === void 0 ? "default" : _c, _d = _a.show, show = _d === void 0 ? true : _d, style = _a.style, className = _a.className, children = _a.children, _e = _a.position, position = _e === void 0 ? "top-right" : _e, _f = _a.trigger, trigger = _f === void 0 ? "click" : _f, restProps = __rest(_a, ["title", "color", "size", "show", "style", "className", "children", "position", "trigger"]);
|
|
11
|
+
// 如果不显示角标,直接返回子元素
|
|
12
|
+
if (!show) {
|
|
13
|
+
return jsx(Fragment, { children: children });
|
|
14
|
+
}
|
|
15
|
+
// 根据位置计算样式
|
|
16
|
+
var getPositionStyle = function () {
|
|
17
|
+
var baseStyle = {
|
|
18
|
+
position: "absolute",
|
|
19
|
+
width: 0,
|
|
20
|
+
height: 0,
|
|
21
|
+
borderStyle: "solid",
|
|
22
|
+
};
|
|
23
|
+
var sizeMap = {
|
|
24
|
+
small: 6,
|
|
25
|
+
default: 8,
|
|
26
|
+
large: 10,
|
|
27
|
+
};
|
|
28
|
+
var triangleSize = sizeMap[size];
|
|
29
|
+
switch (position) {
|
|
30
|
+
case "top-right":
|
|
31
|
+
return __assign(__assign({}, baseStyle), { top: 0, right: 0, borderWidth: "0 ".concat(triangleSize, "px ").concat(triangleSize, "px 0"), borderColor: "transparent ".concat(color, " transparent transparent") });
|
|
32
|
+
case "top-left":
|
|
33
|
+
return __assign(__assign({}, baseStyle), { top: 0, left: 0, borderWidth: "".concat(triangleSize, "px ").concat(triangleSize, "px 0 0"), borderColor: "".concat(color, " transparent transparent transparent") });
|
|
34
|
+
case "bottom-right":
|
|
35
|
+
return __assign(__assign({}, baseStyle), { bottom: 0, right: 0, borderWidth: "0 0 ".concat(triangleSize, "px ").concat(triangleSize, "px"), borderColor: "transparent transparent ".concat(color, " transparent") });
|
|
36
|
+
case "bottom-left":
|
|
37
|
+
return __assign(__assign({}, baseStyle), { bottom: 0, left: 0, borderWidth: "".concat(triangleSize, "px 0 0 ").concat(triangleSize, "px"), borderColor: "transparent transparent transparent ".concat(color) });
|
|
38
|
+
default:
|
|
39
|
+
return __assign(__assign({}, baseStyle), { top: 0, right: 0, borderWidth: "0 ".concat(triangleSize, "px ").concat(triangleSize, "px 0"), borderColor: "transparent ".concat(color, " transparent transparent") });
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
var badge = jsx("div", { style: getPositionStyle() });
|
|
43
|
+
// 如果有 title,则包装在 Tooltip 中
|
|
44
|
+
if (title) {
|
|
45
|
+
badge = (jsx(Tooltip, __assign({ title: title, placement: "top", trigger: trigger }, { children: jsx("div", { style: getPositionStyle() }) })));
|
|
46
|
+
}
|
|
47
|
+
var badgeElement = (jsxs("div", __assign({ style: __assign({}, style), className: className }, restProps, { children: [children, badge] })));
|
|
48
|
+
return badgeElement;
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
export { Badge as default };
|
|
@@ -8,6 +8,8 @@ var DESCEND = "descend"; // 降序
|
|
|
8
8
|
// 合并后数据标识
|
|
9
9
|
var MERGE_KEY = "__row_id";
|
|
10
10
|
var MERGE_ROW_SPANS = "__row_spans";
|
|
11
|
-
var MERGE_INDEX = "__row_index";
|
|
11
|
+
var MERGE_INDEX = "__row_index";
|
|
12
|
+
// 合计行标识
|
|
13
|
+
var IS_SUMMARY = "__is_summary__";
|
|
12
14
|
|
|
13
|
-
export { ASCEND, DESCEND, ERROR_TD_CLASSNAME, INNER_TABLE_PAGINATION_PAGESIZEOPTIONS, INNER_TABLE_PAGINATION_POSITION, MERGE_INDEX, MERGE_KEY, MERGE_ROW_SPANS, TABLE_DRAG_ROW_TYPE, TABLE_DYNAMIC_KEY };
|
|
15
|
+
export { ASCEND, DESCEND, ERROR_TD_CLASSNAME, INNER_TABLE_PAGINATION_PAGESIZEOPTIONS, INNER_TABLE_PAGINATION_POSITION, IS_SUMMARY, MERGE_INDEX, MERGE_KEY, MERGE_ROW_SPANS, TABLE_DRAG_ROW_TYPE, TABLE_DYNAMIC_KEY };
|
package/dist/es/table/excel.js
CHANGED
|
@@ -8,24 +8,59 @@ import { MERGE_ROW_SPANS } from './constant.js';
|
|
|
8
8
|
/**
|
|
9
9
|
* 导出Excel,支持维度合并和小计
|
|
10
10
|
*/
|
|
11
|
-
function exportToExcelWithMerge(records, columns, mergeKeys, summaryKeys, fileName, sheetName, columnHeaders) {
|
|
11
|
+
function exportToExcelWithMerge(records, columns, mergeKeys, summaryKeys, fileName, sheetName, columnHeaders, summaryConfig) {
|
|
12
12
|
if (fileName === void 0) { fileName = "export.xlsx"; }
|
|
13
13
|
if (sheetName === void 0) { sheetName = "Sheet1"; }
|
|
14
14
|
if (!records || records.length === 0) {
|
|
15
15
|
throw new Error("没有数据可导出");
|
|
16
16
|
}
|
|
17
17
|
var processedData = records;
|
|
18
|
-
// 2. 准备Excel
|
|
18
|
+
// 2. 准备Excel数据(支持分组表头与合并)
|
|
19
19
|
var excelData = prepareExcelData(processedData, columns, columnHeaders);
|
|
20
20
|
// 3. 创建工作簿
|
|
21
21
|
var workbook = xlsx_minExports.utils.book_new();
|
|
22
|
-
// 4.
|
|
23
|
-
var
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
22
|
+
// 4. 计算末尾合计行(当提供了 summaryConfig 时)
|
|
23
|
+
var summaryRow;
|
|
24
|
+
var dataForStyles = processedData;
|
|
25
|
+
if (summaryConfig !== undefined) {
|
|
26
|
+
var sumsByKey_1 = {};
|
|
27
|
+
excelData.leafColumns.forEach(function (col, colIndex) {
|
|
28
|
+
var key = col.dataIndex;
|
|
29
|
+
if (col.isSummary) {
|
|
30
|
+
var total = 0;
|
|
31
|
+
for (var i = 0; i < processedData.length; i++) {
|
|
32
|
+
var v = processedData[i][key];
|
|
33
|
+
var n = typeof v === "number" ? v : Number(v);
|
|
34
|
+
if (!isNaN(n))
|
|
35
|
+
total += n;
|
|
36
|
+
}
|
|
37
|
+
sumsByKey_1[key] = total;
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
// 生成用于写入Excel的末尾合计行
|
|
41
|
+
summaryRow = excelData.leafColumns.map(function (col, index) {
|
|
42
|
+
if (index === 0)
|
|
43
|
+
return "合计";
|
|
44
|
+
var key = col.dataIndex;
|
|
45
|
+
if (col.isSummary && sumsByKey_1[key] !== undefined) {
|
|
46
|
+
return sumsByKey_1[key];
|
|
47
|
+
}
|
|
48
|
+
return "";
|
|
49
|
+
});
|
|
50
|
+
// 生成用于样式应用的数据(追加一条 __is_summary__ 行)
|
|
51
|
+
var summaryDataObj_1 = { __is_summary__: true };
|
|
52
|
+
Object.keys(sumsByKey_1).forEach(function (k) {
|
|
53
|
+
summaryDataObj_1[k] = sumsByKey_1[k];
|
|
54
|
+
});
|
|
55
|
+
dataForStyles = __spreadArray(__spreadArray([], processedData, true), [summaryDataObj_1], false);
|
|
56
|
+
}
|
|
57
|
+
// 5. 创建工作表(带末尾合计行)
|
|
58
|
+
var worksheet = createWorksheetWithMerge(__assign(__assign({}, excelData), { summaryRow: summaryRow }), mergeKeys);
|
|
59
|
+
// 6. 添加样式(合计行高亮)
|
|
60
|
+
applyExcelStyles(worksheet, dataForStyles, mergeKeys, summaryKeys, excelData.leafColumns, excelData.headerRowCount);
|
|
61
|
+
// 7. 添加工作表到工作簿
|
|
27
62
|
xlsx_minExports.utils.book_append_sheet(workbook, worksheet, sheetName);
|
|
28
|
-
//
|
|
63
|
+
// 8. 导出文件
|
|
29
64
|
xlsx_minExports.writeFile(workbook, fileName, { bookType: "xlsx" });
|
|
30
65
|
return {
|
|
31
66
|
totalRows: excelData.data.length,
|
|
@@ -34,27 +69,94 @@ function exportToExcelWithMerge(records, columns, mergeKeys, summaryKeys, fileNa
|
|
|
34
69
|
};
|
|
35
70
|
}
|
|
36
71
|
/**
|
|
37
|
-
* 准备Excel
|
|
72
|
+
* 准备Excel数据(支持分组表头,构建多行表头与合并范围)
|
|
38
73
|
*/
|
|
39
74
|
function prepareExcelData(processedData, columns, columnHeaders) {
|
|
40
|
-
//
|
|
41
|
-
var
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
75
|
+
// 计算最大深度
|
|
76
|
+
var getMaxDepth = function (cols) {
|
|
77
|
+
var max = 0;
|
|
78
|
+
var dfs = function (nodes, depth) {
|
|
79
|
+
nodes.forEach(function (n) {
|
|
80
|
+
var hasChildren = Array.isArray(n.children) && n.children.length > 0;
|
|
81
|
+
if (hasChildren) {
|
|
82
|
+
dfs(n.children, depth + 1);
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
if (depth > max)
|
|
86
|
+
max = depth;
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
};
|
|
90
|
+
dfs(cols, 1);
|
|
91
|
+
return max || 1;
|
|
92
|
+
};
|
|
93
|
+
// 计算每个节点的 colSpan
|
|
94
|
+
var computeColSpan = function (node) {
|
|
95
|
+
if (Array.isArray(node.children) && node.children.length > 0) {
|
|
96
|
+
return node.children.reduce(function (sum, c) { return sum + computeColSpan(c); }, 0);
|
|
51
97
|
}
|
|
52
|
-
return
|
|
53
|
-
}
|
|
98
|
+
return 1;
|
|
99
|
+
};
|
|
100
|
+
var maxDepth = getMaxDepth(columns);
|
|
101
|
+
// 生成表头矩阵与merge区域,同时收集叶子列
|
|
102
|
+
var headerRows = Array.from({ length: maxDepth }, function () { return []; });
|
|
103
|
+
var headerMerges = [];
|
|
104
|
+
var leafColumns = [];
|
|
105
|
+
var walkHeader = function (nodes, depth, startColIndexRef) {
|
|
106
|
+
nodes.forEach(function (node) {
|
|
107
|
+
var text = node.dynamicTitle || node.title;
|
|
108
|
+
if (typeof text === "string") {
|
|
109
|
+
var hasChildren = Array.isArray(node.children) && node.children.length > 0;
|
|
110
|
+
var colSpan = computeColSpan(node);
|
|
111
|
+
var rowSpan = hasChildren ? 1 : maxDepth - depth + 1;
|
|
112
|
+
// 确保本行已经有足够的列位(填充空字符串到当前列索引)
|
|
113
|
+
while (headerRows[depth - 1].length < startColIndexRef.value) {
|
|
114
|
+
headerRows[depth - 1].push("");
|
|
115
|
+
}
|
|
116
|
+
// 放置当前单元格文本
|
|
117
|
+
headerRows[depth - 1].push(text);
|
|
118
|
+
// 合并头:行合并或列合并
|
|
119
|
+
var currentCol = startColIndexRef.value;
|
|
120
|
+
var start = { r: depth - 1, c: currentCol };
|
|
121
|
+
var end = {
|
|
122
|
+
r: depth - 1 + (rowSpan - 1),
|
|
123
|
+
c: currentCol + (colSpan - 1),
|
|
124
|
+
};
|
|
125
|
+
if (rowSpan > 1 || colSpan > 1) {
|
|
126
|
+
headerMerges.push({ s: start, e: end });
|
|
127
|
+
}
|
|
128
|
+
// 占位填充剩余列(如果是列合并,需要占满 colSpan 列位;如果是行合并仅占1列)
|
|
129
|
+
var occupyCols = colSpan;
|
|
130
|
+
for (var i = 1; i < occupyCols; i++) {
|
|
131
|
+
headerRows[depth - 1].push("");
|
|
132
|
+
}
|
|
133
|
+
// 递归子节点或记录叶子列
|
|
134
|
+
if (hasChildren) {
|
|
135
|
+
var childStartRef = { value: currentCol };
|
|
136
|
+
walkHeader(node.children, depth + 1, childStartRef);
|
|
137
|
+
// 子节点会推进 childStartRef.value 到当前块的末尾
|
|
138
|
+
startColIndexRef.value = currentCol + colSpan;
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
// 叶子列用于数据映射;允许 columnHeaders 覆盖标题(仅叶子层)
|
|
142
|
+
if (typeof node.dataIndex === "string" &&
|
|
143
|
+
(columnHeaders === null || columnHeaders === void 0 ? void 0 : columnHeaders[node.dataIndex])) {
|
|
144
|
+
headerRows[depth - 1][headerRows[depth - 1].length - occupyCols] =
|
|
145
|
+
columnHeaders[node.dataIndex];
|
|
146
|
+
}
|
|
147
|
+
leafColumns.push(node);
|
|
148
|
+
startColIndexRef.value = currentCol + 1;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
};
|
|
153
|
+
walkHeader(columns, 1, { value: 0 });
|
|
54
154
|
return {
|
|
55
|
-
|
|
155
|
+
headerRows: headerRows,
|
|
156
|
+
headerMerges: headerMerges,
|
|
157
|
+
headerRowCount: headerRows.length,
|
|
56
158
|
data: processedData,
|
|
57
|
-
|
|
159
|
+
leafColumns: leafColumns,
|
|
58
160
|
};
|
|
59
161
|
}
|
|
60
162
|
/**
|
|
@@ -62,54 +164,49 @@ function prepareExcelData(processedData, columns, columnHeaders) {
|
|
|
62
164
|
*/
|
|
63
165
|
function createWorksheetWithMerge(excelData, mergeKeys) {
|
|
64
166
|
var _a;
|
|
65
|
-
var
|
|
66
|
-
//
|
|
67
|
-
var
|
|
68
|
-
|
|
69
|
-
], data.map(function (row) {
|
|
70
|
-
return columns.map(function (item) {
|
|
167
|
+
var headerRows = excelData.headerRows, headerMerges = excelData.headerMerges, headerRowCount = excelData.headerRowCount, data = excelData.data, leafColumns = excelData.leafColumns, summaryRow = excelData.summaryRow;
|
|
168
|
+
// 创建工作表数据(包含多行表头)
|
|
169
|
+
var dataRows = data.map(function (row) {
|
|
170
|
+
return leafColumns.map(function (item) {
|
|
71
171
|
var value = row[item.dataIndex];
|
|
72
|
-
|
|
73
|
-
if (typeof value === "number") {
|
|
172
|
+
if (typeof value === "number")
|
|
74
173
|
return value;
|
|
75
|
-
}
|
|
76
|
-
// 处理字符串类型,避免空值
|
|
77
174
|
return value != null ? String(value) : "";
|
|
78
175
|
});
|
|
79
|
-
})
|
|
176
|
+
});
|
|
177
|
+
var worksheetData = __spreadArray(__spreadArray(__spreadArray([], headerRows, true), dataRows, true), (summaryRow ? [summaryRow] : []), true);
|
|
80
178
|
// 创建工作表
|
|
81
179
|
var worksheet = xlsx_minExports.utils.aoa_to_sheet(worksheetData);
|
|
82
|
-
//
|
|
83
|
-
var columnWidths =
|
|
180
|
+
// 设置列宽(按叶子列)
|
|
181
|
+
var columnWidths = leafColumns.map(function (col) {
|
|
84
182
|
var _a;
|
|
85
183
|
return ({
|
|
86
184
|
wch: Math.max(15, ((_a = ((col.dynamicTitle || col.title))) === null || _a === void 0 ? void 0 : _a.length) * 2),
|
|
87
185
|
});
|
|
88
186
|
});
|
|
89
187
|
worksheet["!cols"] = columnWidths;
|
|
90
|
-
//
|
|
91
|
-
var merges = [];
|
|
188
|
+
// 添加合并单元格:表头合并 + 数据区合并(带偏移)
|
|
189
|
+
var merges = __spreadArray([], headerMerges, true);
|
|
92
190
|
if (mergeKeys && mergeKeys.length > 0) {
|
|
93
191
|
var _loop_1 = function (colIndex) {
|
|
94
192
|
var mergeKey = mergeKeys[colIndex];
|
|
95
|
-
var excelColIndex =
|
|
96
|
-
if (excelColIndex === -1)
|
|
193
|
+
var excelColIndex = leafColumns.findIndex(function (item) { return item.dataIndex === mergeKey; });
|
|
194
|
+
if (excelColIndex === -1)
|
|
97
195
|
return "continue";
|
|
98
|
-
}
|
|
99
196
|
for (var rowIndex = 0; rowIndex < data.length; rowIndex++) {
|
|
100
197
|
var rowData = data[rowIndex];
|
|
101
198
|
var spanCount = (_a = rowData[MERGE_ROW_SPANS]) === null || _a === void 0 ? void 0 : _a[mergeKey];
|
|
102
|
-
// 如果合并数量大于1,添加合并单元格
|
|
103
199
|
if (spanCount && spanCount > 1) {
|
|
104
|
-
|
|
105
|
-
s: { r:
|
|
106
|
-
e: {
|
|
107
|
-
|
|
108
|
-
|
|
200
|
+
merges.push({
|
|
201
|
+
s: { r: headerRowCount + rowIndex, c: excelColIndex },
|
|
202
|
+
e: {
|
|
203
|
+
r: headerRowCount + rowIndex + spanCount - 1,
|
|
204
|
+
c: excelColIndex,
|
|
205
|
+
},
|
|
206
|
+
});
|
|
109
207
|
}
|
|
110
208
|
}
|
|
111
209
|
};
|
|
112
|
-
// 处理每个合并字段
|
|
113
210
|
for (var colIndex = 0; colIndex < mergeKeys.length; colIndex++) {
|
|
114
211
|
_loop_1(colIndex);
|
|
115
212
|
}
|
|
@@ -120,8 +217,9 @@ function createWorksheetWithMerge(excelData, mergeKeys) {
|
|
|
120
217
|
/**
|
|
121
218
|
* 应用Excel样式 - 修复版本
|
|
122
219
|
*/
|
|
123
|
-
function applyExcelStyles(worksheet, data, mergeKeys, summaryKeys, columns) {
|
|
220
|
+
function applyExcelStyles(worksheet, data, mergeKeys, summaryKeys, columns, headerRowCount) {
|
|
124
221
|
var _a;
|
|
222
|
+
if (headerRowCount === void 0) { headerRowCount = 1; }
|
|
125
223
|
// 修复1:定义样式对象,确保格式正确
|
|
126
224
|
var headerStyle = {
|
|
127
225
|
font: { bold: true, color: { rgb: "FFFFFF" } },
|
|
@@ -165,22 +263,25 @@ function applyExcelStyles(worksheet, data, mergeKeys, summaryKeys, columns) {
|
|
|
165
263
|
var maxRow = data.length; // +1 for header, but 0-indexed
|
|
166
264
|
range = { s: { r: 0, c: 0 }, e: { r: maxRow, c: maxCol } };
|
|
167
265
|
}
|
|
168
|
-
// 修复3
|
|
169
|
-
for (var
|
|
170
|
-
var
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
266
|
+
// 修复3:应用表头样式(支持多行表头),确保单元格存在
|
|
267
|
+
for (var row = 0; row < headerRowCount; row++) {
|
|
268
|
+
for (var col = range.s.c; col <= range.e.c; col++) {
|
|
269
|
+
var cellAddress = xlsx_minExports.utils.encode_cell({ r: row, c: col });
|
|
270
|
+
if (!worksheet[cellAddress]) {
|
|
271
|
+
worksheet[cellAddress] = { v: "", t: "s" };
|
|
272
|
+
}
|
|
273
|
+
worksheet[cellAddress].s = headerStyle;
|
|
174
274
|
}
|
|
175
|
-
// 应用样式
|
|
176
|
-
worksheet[cellAddress].s = headerStyle;
|
|
177
275
|
}
|
|
178
276
|
// 修复4:应用数据行样式
|
|
179
277
|
for (var rowIndex = 0; rowIndex < data.length; rowIndex++) {
|
|
180
278
|
var rowData = data[rowIndex];
|
|
181
279
|
var isSubtotal = rowData.__is_summary__;
|
|
182
280
|
for (var col = range.s.c; col <= range.e.c; col++) {
|
|
183
|
-
var cellAddress = xlsx_minExports.utils.encode_cell({
|
|
281
|
+
var cellAddress = xlsx_minExports.utils.encode_cell({
|
|
282
|
+
r: headerRowCount + rowIndex,
|
|
283
|
+
c: col,
|
|
284
|
+
});
|
|
184
285
|
// 确保单元格存在
|
|
185
286
|
if (!worksheet[cellAddress]) {
|
|
186
287
|
worksheet[cellAddress] = { v: "", t: "s" };
|
|
@@ -209,7 +310,7 @@ function applyExcelStyles(worksheet, data, mergeKeys, summaryKeys, columns) {
|
|
|
209
310
|
if (colIndex === -1)
|
|
210
311
|
return "continue";
|
|
211
312
|
var cellAddress = xlsx_minExports.utils.encode_cell({
|
|
212
|
-
r:
|
|
313
|
+
r: headerRowCount + rowIndex,
|
|
213
314
|
c: colIndex,
|
|
214
315
|
});
|
|
215
316
|
var cellValue = rowData[summaryKey];
|
|
@@ -232,7 +333,7 @@ function applyExcelStyles(worksheet, data, mergeKeys, summaryKeys, columns) {
|
|
|
232
333
|
// 修复6:确保工作表引用正确
|
|
233
334
|
if (!worksheet["!ref"]) {
|
|
234
335
|
var lastCol = Math.max(0, ((columns === null || columns === void 0 ? void 0 : columns.length) || 1) - 1);
|
|
235
|
-
var lastRow = data.length; // header + data rows
|
|
336
|
+
var lastRow = headerRowCount + data.length - 1; // header + data rows (0-indexed end)
|
|
236
337
|
worksheet["!ref"] = xlsx_minExports.utils.encode_range({
|
|
237
338
|
s: { r: 0, c: 0 },
|
|
238
339
|
e: { r: lastRow, c: lastCol },
|
|
@@ -243,13 +344,13 @@ function applyExcelStyles(worksheet, data, mergeKeys, summaryKeys, columns) {
|
|
|
243
344
|
* 导出Excel的简化版本(只提供必要参数)
|
|
244
345
|
*/
|
|
245
346
|
function exportToExcelSimple(records, config) {
|
|
246
|
-
return exportToExcelWithMerge(records, config.columns || [], config.mergeKeys, config.summaryKeys || [], config.fileName || "export.xlsx", config.sheetName || "Sheet1", config.columnHeaders);
|
|
347
|
+
return exportToExcelWithMerge(records, config.columns || [], config.mergeKeys, config.summaryKeys || [], config.fileName || "export.xlsx", config.sheetName || "Sheet1", config.columnHeaders, config.summaryConfig);
|
|
247
348
|
}
|
|
248
349
|
/**
|
|
249
350
|
* excel导出
|
|
250
351
|
*/
|
|
251
352
|
function useExcelExport(records, config) {
|
|
252
|
-
var columns = config.columns, isAutoMerge = config.isAutoMerge, columnHeaders = config.columnHeaders;
|
|
353
|
+
var columns = config.columns, isAutoMerge = config.isAutoMerge, columnHeaders = config.columnHeaders, summaryConfig = config.summaryConfig;
|
|
253
354
|
// 计算需要合并的字段key集合
|
|
254
355
|
var mergeKeys = useMergeKeys(columns, isAutoMerge);
|
|
255
356
|
// 需要合计的字段
|
|
@@ -265,6 +366,7 @@ function useExcelExport(records, config) {
|
|
|
265
366
|
summaryKeys: summaryKeys,
|
|
266
367
|
fileName: fileName,
|
|
267
368
|
columnHeaders: columnHeaders,
|
|
369
|
+
summaryConfig: summaryConfig,
|
|
268
370
|
});
|
|
269
371
|
});
|
|
270
372
|
return exportFunction;
|
package/dist/es/table/hooks.js
CHANGED
|
@@ -3,7 +3,8 @@ import { useCallback, useRef, useState, useEffect, useMemo } from 'react';
|
|
|
3
3
|
import update from '../node_modules/immutability-helper/index.js';
|
|
4
4
|
import { getInnerIndex } from './useInnerPagination.js';
|
|
5
5
|
import { flattenRecordsOptimized } from './utils.js';
|
|
6
|
-
import { MERGE_INDEX, MERGE_ROW_SPANS } from './constant.js';
|
|
6
|
+
import { IS_SUMMARY, MERGE_INDEX, MERGE_ROW_SPANS } from './constant.js';
|
|
7
|
+
import { useMemoizedFn } from 'ahooks';
|
|
7
8
|
|
|
8
9
|
/**
|
|
9
10
|
* @param dataSourceRef 数据引用
|
|
@@ -57,7 +58,7 @@ function useMoveRowChange(dataSourceRef, onTableChange, options) {
|
|
|
57
58
|
hoverIndex: hoverIndex,
|
|
58
59
|
});
|
|
59
60
|
}, [dataSourceRef, onTableChange, refreshScuCell, currentPage]);
|
|
60
|
-
var onRow = useCallback(function (
|
|
61
|
+
var onRow = useCallback(function (record, index) {
|
|
61
62
|
var baseProps = {
|
|
62
63
|
index: index,
|
|
63
64
|
moveRow: moveRow,
|
|
@@ -80,8 +81,16 @@ function useMoveRowChange(dataSourceRef, onTableChange, options) {
|
|
|
80
81
|
}
|
|
81
82
|
return baseProps;
|
|
82
83
|
}, [moveRow, fixedRowsCount, fixedRowsConfig]);
|
|
84
|
+
var defaultOnRow = useMemoizedFn(function (record) {
|
|
85
|
+
var extra = extraOnRow === null || extraOnRow === void 0 ? void 0 : extraOnRow(record);
|
|
86
|
+
var summaryStyle = __assign({ background: "#ebf3fe", fontWeight: "bold" }, extra === null || extra === void 0 ? void 0 : extra.style);
|
|
87
|
+
if (record[IS_SUMMARY]) {
|
|
88
|
+
return __assign(__assign({}, extra), { style: summaryStyle });
|
|
89
|
+
}
|
|
90
|
+
return {};
|
|
91
|
+
});
|
|
83
92
|
return {
|
|
84
|
-
onRow: isMove || fixedRowsCount || fixedRowsConfig ? onRow :
|
|
93
|
+
onRow: isMove || fixedRowsCount || fixedRowsConfig ? onRow : defaultOnRow,
|
|
85
94
|
};
|
|
86
95
|
}
|
|
87
96
|
/**
|
|
@@ -347,7 +356,7 @@ var useMergeKeys = function (columns, isAutoMerge) {
|
|
|
347
356
|
* 自动合并的一些处理
|
|
348
357
|
*/
|
|
349
358
|
function useAutoMerge(dataSource, columns, _a) {
|
|
350
|
-
var
|
|
359
|
+
var isAutoMerge = _a.isAutoMerge, isDimensionDynamic = _a.isDimensionDynamic;
|
|
351
360
|
// 计算需要合并的字段key集合
|
|
352
361
|
var mergeKeys = useMergeKeys(columns, isAutoMerge);
|
|
353
362
|
var firstMergeKey = mergeKeys === null || mergeKeys === void 0 ? void 0 : mergeKeys[0];
|
|
@@ -369,33 +378,20 @@ function useAutoMerge(dataSource, columns, _a) {
|
|
|
369
378
|
if (!mergeKeys)
|
|
370
379
|
return dataSource;
|
|
371
380
|
else {
|
|
372
|
-
var newDataSource_2 = flattenRecordsOptimized(__spreadArray([], (dataSource || []), true), mergeKeys, dimensionSummaryKeys, summaryKeys);
|
|
381
|
+
var newDataSource_2 = flattenRecordsOptimized(__spreadArray([], (dataSource || []), true), mergeKeys, dimensionSummaryKeys, summaryKeys, isDimensionDynamic);
|
|
373
382
|
return newDataSource_2;
|
|
374
383
|
}
|
|
375
384
|
}
|
|
376
|
-
}, [
|
|
385
|
+
}, [
|
|
386
|
+
dataSource,
|
|
387
|
+
isAutoMerge,
|
|
388
|
+
mergeKeys,
|
|
389
|
+
dimensionSummaryKeys,
|
|
390
|
+
summaryKeys,
|
|
391
|
+
isDimensionDynamic,
|
|
392
|
+
]);
|
|
377
393
|
var newColumns = useMemo(function () {
|
|
378
394
|
var _columns = columns;
|
|
379
|
-
if (mode === "index") {
|
|
380
|
-
// 自动添加序号列,支持合并不参与自定义配置
|
|
381
|
-
_columns = __spreadArray([
|
|
382
|
-
{
|
|
383
|
-
title: "序号",
|
|
384
|
-
width: 60,
|
|
385
|
-
key: "index",
|
|
386
|
-
fixed: "left",
|
|
387
|
-
align: "center",
|
|
388
|
-
isMerge: isAutoMerge,
|
|
389
|
-
isFilter: false,
|
|
390
|
-
render: function (value, record, index) {
|
|
391
|
-
if (isAutoMerge) {
|
|
392
|
-
return record[MERGE_INDEX] + 1;
|
|
393
|
-
}
|
|
394
|
-
return "".concat(index + 1);
|
|
395
|
-
},
|
|
396
|
-
}
|
|
397
|
-
], _columns, true);
|
|
398
|
-
}
|
|
399
395
|
// 递归处理多级表头,自动补充render/合并/编辑等逻辑
|
|
400
396
|
var newColumns = _columns.map(function (item) {
|
|
401
397
|
return getColumnItem(item);
|
|
@@ -429,7 +425,7 @@ function useAutoMerge(dataSource, columns, _a) {
|
|
|
429
425
|
return getItem(item);
|
|
430
426
|
}
|
|
431
427
|
}
|
|
432
|
-
}, [columns,
|
|
428
|
+
}, [columns, isAutoMerge, firstMergeKey]);
|
|
433
429
|
return [newDataSource, newColumns];
|
|
434
430
|
}
|
|
435
431
|
/**
|
|
@@ -5,6 +5,8 @@ import { IInputProps } from '../input/input.js';
|
|
|
5
5
|
import { IInputNumberProps } from '../inputnumber/inputNumber.js';
|
|
6
6
|
import { IDynamicItem } from '../dynamicsetting/interface.js';
|
|
7
7
|
import _default from './components/TitleDirectionColumn.js';
|
|
8
|
+
import { IS_SUMMARY } from './constant.js';
|
|
9
|
+
import { IBadgeProps } from './components/Badge.js';
|
|
8
10
|
|
|
9
11
|
type IEditableConfigOtherProps = IInputProps & IInputNumberProps & TextAreaProps;
|
|
10
12
|
interface IEditableConfig extends Partial<IEditableConfigOtherProps> {
|
|
@@ -199,6 +201,10 @@ interface IColumnType<RecordType> extends Omit<ColumnType<RecordType>, "render">
|
|
|
199
201
|
* 自定义排序的优先级,数字越小,优先级越高,比如2的不能排序到1的前面
|
|
200
202
|
*/
|
|
201
203
|
dimensionPriority?: number;
|
|
204
|
+
/**
|
|
205
|
+
* 维度优先级分组,同组内遵循 dimensionPriority,跨组自由排序
|
|
206
|
+
*/
|
|
207
|
+
dimensionGroup?: string;
|
|
202
208
|
/**
|
|
203
209
|
* 自定义维度互斥的字段,多个需要逗号分隔,比如:name,age
|
|
204
210
|
*/
|
|
@@ -219,6 +225,10 @@ interface IColumnType<RecordType> extends Omit<ColumnType<RecordType>, "render">
|
|
|
219
225
|
* 开启合并的字段,按其他字段维度合并
|
|
220
226
|
*/
|
|
221
227
|
mergeKey?: string;
|
|
228
|
+
/**
|
|
229
|
+
* 添加角标
|
|
230
|
+
*/
|
|
231
|
+
badge?: IBadgeProps;
|
|
222
232
|
}
|
|
223
233
|
interface IRenderOptions {
|
|
224
234
|
insertTableFromClipboard: IFuncInsertTableFromClipboard;
|
|
@@ -536,6 +546,7 @@ interface TableComponent<T> extends React.FC<ITableProps<T>> {
|
|
|
536
546
|
Summary: typeof Table.Summary;
|
|
537
547
|
TitleDirectionColumn: typeof _default;
|
|
538
548
|
DifferencesClassName: string;
|
|
549
|
+
IS_SUMMARY: typeof IS_SUMMARY;
|
|
539
550
|
}
|
|
540
551
|
/**
|
|
541
552
|
* 排序相关类型
|
package/dist/es/table/table.js
CHANGED
|
@@ -9,7 +9,7 @@ import EnhanceHeaderCellMemo from './components/EnhanceHeaderCell.js';
|
|
|
9
9
|
import './components/ColumnDynamic.js';
|
|
10
10
|
import './components/ColumnAddDel.js';
|
|
11
11
|
import './components/TitleOperation.js';
|
|
12
|
-
import { TABLE_DYNAMIC_KEY, INNER_TABLE_PAGINATION_POSITION, INNER_TABLE_PAGINATION_PAGESIZEOPTIONS } from './constant.js';
|
|
12
|
+
import { IS_SUMMARY, TABLE_DYNAMIC_KEY, INNER_TABLE_PAGINATION_POSITION, INNER_TABLE_PAGINATION_PAGESIZEOPTIONS } from './constant.js';
|
|
13
13
|
import './components/PopoverIcon.js';
|
|
14
14
|
import { useLatest } from 'ahooks';
|
|
15
15
|
import { useParseColumns } from './useParseColumns.js';
|
|
@@ -161,6 +161,7 @@ var Table = function (props) {
|
|
|
161
161
|
// 处理表格合并和维度
|
|
162
162
|
var _v = useAutoMerge(currentTableDataSource, _newColumns, {
|
|
163
163
|
isAutoMerge: isAutoMerge,
|
|
164
|
+
isDimensionDynamic: isDimensionDynamic,
|
|
164
165
|
}), newDataSource = _v[0], newColumns = _v[1];
|
|
165
166
|
// 内部表格总结栏
|
|
166
167
|
var getSummaryHandle = useSummary(summaryConfig, newColumns, {
|
|
@@ -246,6 +247,7 @@ var Table = function (props) {
|
|
|
246
247
|
var exportExcel = useExcelExport(newDataSource, {
|
|
247
248
|
columns: newColumns,
|
|
248
249
|
isAutoMerge: isAutoMerge,
|
|
250
|
+
summaryConfig: summaryConfig,
|
|
249
251
|
});
|
|
250
252
|
// 暴露给外部一些方法
|
|
251
253
|
useImperativeHandle(tableRefHandle, function () {
|
|
@@ -336,6 +338,7 @@ MemoTable.Column = Table$1.Column;
|
|
|
336
338
|
MemoTable.ColumnGroup = Table$1.ColumnGroup;
|
|
337
339
|
MemoTable.Summary = Table$1.Summary;
|
|
338
340
|
MemoTable.TitleDirectionColumn = TitleDirectionColumn;
|
|
339
|
-
MemoTable.DifferencesClassName = "ztxk-table--differences";
|
|
341
|
+
MemoTable.DifferencesClassName = "ztxk-table--differences";
|
|
342
|
+
MemoTable.IS_SUMMARY = IS_SUMMARY;
|
|
340
343
|
|
|
341
344
|
export { MemoTable as default };
|
|
@@ -3,7 +3,7 @@ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
|
3
3
|
import { useRef } from 'react';
|
|
4
4
|
import { getTableColumns, parsePasteData, getFilterRecords, startColumnInsertTableData } from './utils.js';
|
|
5
5
|
import '../node_modules/classnames/index.js';
|
|
6
|
-
import { MERGE_INDEX } from './constant.js';
|
|
6
|
+
import { MERGE_INDEX, IS_SUMMARY } from './constant.js';
|
|
7
7
|
import 'ahooks';
|
|
8
8
|
import './components/EnhanceHeaderCell.js';
|
|
9
9
|
import ColumnDynamic from './components/ColumnDynamic.js';
|
|
@@ -12,6 +12,7 @@ import TitleOperation from './components/TitleOperation.js';
|
|
|
12
12
|
import SortTitle from './components/SortTitle.js';
|
|
13
13
|
import PopoverIcon from './components/PopoverIcon.js';
|
|
14
14
|
import FilterDropdown, { createFilterValue, filterHandle } from './components/FilterDropdown.js';
|
|
15
|
+
import Badge from './components/Badge.js';
|
|
15
16
|
import { PLACEHOLDER_NULL } from '../config/constant.js';
|
|
16
17
|
import { useMergeAddAndDel } from './hooks.js';
|
|
17
18
|
import SearchOutlined from '../node_modules/@ant-design/icons/es/icons/SearchOutlined.js';
|
|
@@ -40,11 +41,11 @@ function useColumns(columns, options) {
|
|
|
40
41
|
var myNewColumns = [];
|
|
41
42
|
var enhanceColumnHandle = function (_column, options) {
|
|
42
43
|
var _a;
|
|
43
|
-
var _b, _c, _d, _e, _f;
|
|
44
|
+
var _b, _c, _d, _e, _f, _g;
|
|
44
45
|
var isCopy = _column.isCopy, editable = _column.editable, editableConfig = _column.editableConfig, title = _column.title, key = _column.key, validate = _column.validate, isRequire = _column.isRequire, isFillDown = _column.isFillDown, isOrder = _column.isOrder, isStress = _column.isStress, popoverText = _column.popoverText, showType = _column.showType, isFilter = _column.isFilter, __dynamicItem__ = _column.__dynamicItem__;
|
|
45
46
|
// 表格列,唯一key
|
|
46
47
|
var _key = key ? key : _column === null || _column === void 0 ? void 0 : _column.dataIndex;
|
|
47
|
-
var
|
|
48
|
+
var _h = options || {}, _j = _h.keyIndex, keyIndex = _j === void 0 ? [] : _j, headerAlign = _h.headerAlign;
|
|
48
49
|
var align = headerAlign || _column.align;
|
|
49
50
|
var isRequireNode = isRequire ? (jsx("i", __assign({ className: "ztxk-column--required" }, { children: "*" }))) : null;
|
|
50
51
|
if (showType) {
|
|
@@ -293,6 +294,17 @@ function useColumns(columns, options) {
|
|
|
293
294
|
return fn_1(record, preRecord);
|
|
294
295
|
};
|
|
295
296
|
}
|
|
297
|
+
// 添加角标
|
|
298
|
+
if (_column.badge) {
|
|
299
|
+
var render_1 = _column.render;
|
|
300
|
+
_column.render = function (text, record, index, options) {
|
|
301
|
+
var v = render_1 ? render_1(text, record, index, options) : text;
|
|
302
|
+
if (record[IS_SUMMARY]) {
|
|
303
|
+
return v;
|
|
304
|
+
}
|
|
305
|
+
return jsx(Badge, __assign({}, _column.badge, { children: v }));
|
|
306
|
+
};
|
|
307
|
+
}
|
|
296
308
|
// 添加render字段,
|
|
297
309
|
if (!_column.render && !_column.editable) {
|
|
298
310
|
_column.render = function (text, record, index) {
|
|
@@ -315,10 +327,8 @@ function useColumns(columns, options) {
|
|
|
315
327
|
}
|
|
316
328
|
// 如果配置了伸缩列
|
|
317
329
|
if (isResizableColumn) {
|
|
318
|
-
_column.onHeaderCell
|
|
319
|
-
|
|
320
|
-
isResizableTitleEllipsis: isResizableTitleEllipsis,
|
|
321
|
-
onResize: (function (e, _a) {
|
|
330
|
+
var extraOnHeaderCell_1 = (_g = _column.onHeaderCell) === null || _g === void 0 ? void 0 : _g.call(_column, _column);
|
|
331
|
+
_column.onHeaderCell = function (column) { return (__assign({ width: column.width, isResizableTitleEllipsis: isResizableTitleEllipsis, onResize: (function (e, _a) {
|
|
322
332
|
var _b;
|
|
323
333
|
var size = _a.size;
|
|
324
334
|
// 获取当前列配置项
|
|
@@ -337,11 +347,9 @@ function useColumns(columns, options) {
|
|
|
337
347
|
else {
|
|
338
348
|
onCurrentListChange === null || onCurrentListChange === void 0 ? void 0 : onCurrentListChange(newList);
|
|
339
349
|
}
|
|
340
|
-
}),
|
|
341
|
-
style: {
|
|
350
|
+
}), style: {
|
|
342
351
|
textAlign: align,
|
|
343
|
-
},
|
|
344
|
-
}); };
|
|
352
|
+
} }, extraOnHeaderCell_1)); };
|
|
345
353
|
}
|
|
346
354
|
// 如果有子元素 递归执行逻辑
|
|
347
355
|
// 支持多级表头控制
|
|
@@ -5,7 +5,7 @@ import isEqual from 'lodash/isEqual';
|
|
|
5
5
|
|
|
6
6
|
// 处理列信息
|
|
7
7
|
function parseColumn(column, index, indexs) {
|
|
8
|
-
var _a = column, key = _a.key, dataIndex = _a.dataIndex, title = _a.title, dynamicTitle = _a.dynamicTitle, dynamicDisabled = _a.dynamicDisabled, defaultUnChecked = _a.defaultUnChecked, width = _a.width, fixed = _a.fixed, isDimension = _a.isDimension, dimensionPriority = _a.dimensionPriority, dimensionExclusive = _a.dimensionExclusive, isDimensionSum = _a.isDimensionSum;
|
|
8
|
+
var _a = column, key = _a.key, dataIndex = _a.dataIndex, title = _a.title, dynamicTitle = _a.dynamicTitle, dynamicDisabled = _a.dynamicDisabled, defaultUnChecked = _a.defaultUnChecked, width = _a.width, fixed = _a.fixed, isDimension = _a.isDimension, dimensionPriority = _a.dimensionPriority, dimensionGroup = _a.dimensionGroup, dimensionExclusive = _a.dimensionExclusive, isDimensionSum = _a.isDimensionSum;
|
|
9
9
|
// 动态列配置 title必须为一个字符串
|
|
10
10
|
if (title && !dynamicTitle && typeof title !== "string") {
|
|
11
11
|
console.error("\u4F60\u4F20\u5165\u7684title\u4E0D\u662F\u4E00\u4E2A\u5B57\u7B26\u4E32,\u5E76\u4E14\u4F60\u6CA1\u6709\u4F20\u5165dynamicTitle\u7684\u914D\u7F6E\u3002\n \u95EE\u9898\u53EF\u80FD\u51FA\u73B0\u518D:".concat(key || dataIndex, " \u5217\u3002\u8BF7\u4F20\u5165\u4E00\u4E2AdynamicTitle \u4F5C\u4E3A\u52A8\u6001\u5217\u914D\u7F6E\u7684title\u503C"));
|
|
@@ -30,6 +30,7 @@ function parseColumn(column, index, indexs) {
|
|
|
30
30
|
fixed: fixed,
|
|
31
31
|
isDimension: isDimension,
|
|
32
32
|
dimensionPriority: dimensionPriority,
|
|
33
|
+
dimensionGroup: dimensionGroup,
|
|
33
34
|
dimensionExclusive: dimensionExclusive,
|
|
34
35
|
isDimensionSum: isDimensionSum,
|
|
35
36
|
};
|
|
@@ -3,6 +3,7 @@ import { jsx } from 'react/jsx-runtime';
|
|
|
3
3
|
import { useCallback } from 'react';
|
|
4
4
|
import { Table } from 'antd';
|
|
5
5
|
import { plus } from 'zmdms-utils';
|
|
6
|
+
import { IS_SUMMARY } from './constant.js';
|
|
6
7
|
|
|
7
8
|
function useSummary(summaryConfig, columns, options) {
|
|
8
9
|
var summaryFixed = options.summaryFixed, rowSelection = options.rowSelection, expandable = options.expandable, isAdd = options.isAdd, isDel = options.isDel;
|
|
@@ -131,7 +132,10 @@ function getSubtotalObj(fields, dataSource) {
|
|
|
131
132
|
}
|
|
132
133
|
var summaryTotalObj = {};
|
|
133
134
|
var summaryTotalConfigObj = {};
|
|
134
|
-
|
|
135
|
+
// 过滤掉按维度合计行
|
|
136
|
+
dataSource
|
|
137
|
+
.filter(function (item) { return !item[IS_SUMMARY]; })
|
|
138
|
+
.forEach(function (item, index) {
|
|
135
139
|
fields.forEach(function (field) {
|
|
136
140
|
if (typeof field === "string") {
|
|
137
141
|
var dataItem = Number(item === null || item === void 0 ? void 0 : item[field]);
|
package/dist/es/table/utils.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { __spreadArray, __assign, __awaiter, __generator } from '../_virtual/_tslib.js';
|
|
2
2
|
import { filterHandle } from './components/FilterDropdown.js';
|
|
3
|
-
import { MERGE_ROW_SPANS, MERGE_KEY, MERGE_INDEX } from './constant.js';
|
|
3
|
+
import { MERGE_ROW_SPANS, MERGE_KEY, MERGE_INDEX, IS_SUMMARY } from './constant.js';
|
|
4
4
|
import { message } from 'antd';
|
|
5
5
|
|
|
6
6
|
// 递归处理columns
|
|
@@ -447,7 +447,7 @@ function startColumnInsertTableData(options) {
|
|
|
447
447
|
* @param dimensionSummaryKeys 维度合计字段
|
|
448
448
|
* @param summaryKeys 合计字段
|
|
449
449
|
*/
|
|
450
|
-
function flattenRecordsOptimized(records, mergeKeys, dimensionSummaryKeys, summaryKeys) {
|
|
450
|
+
function flattenRecordsOptimized(records, mergeKeys, dimensionSummaryKeys, summaryKeys, isDimensionDynamic) {
|
|
451
451
|
var _a;
|
|
452
452
|
if (!records ||
|
|
453
453
|
records.length === 0 ||
|
|
@@ -456,7 +456,7 @@ function flattenRecordsOptimized(records, mergeKeys, dimensionSummaryKeys, summa
|
|
|
456
456
|
return records;
|
|
457
457
|
}
|
|
458
458
|
// 0. 首先根据维度字段对数据进行排序
|
|
459
|
-
var result =
|
|
459
|
+
var result = isDimensionDynamic
|
|
460
460
|
? sortByDimensions(__spreadArray([], records, true), mergeKeys)
|
|
461
461
|
: __spreadArray([], records, true);
|
|
462
462
|
// 1. 首先插入维度合计行
|
|
@@ -677,14 +677,14 @@ summaryKeys, summaryLevelIndex // 在完整维度列表中的索引
|
|
|
677
677
|
_loop_5(summaryKey);
|
|
678
678
|
}
|
|
679
679
|
// 标记为合计行
|
|
680
|
-
summaryRow
|
|
680
|
+
summaryRow[IS_SUMMARY] = true;
|
|
681
681
|
return summaryRow;
|
|
682
682
|
}
|
|
683
683
|
/**
|
|
684
684
|
* 判断是否为合计行
|
|
685
685
|
*/
|
|
686
686
|
function isSummaryRow(row) {
|
|
687
|
-
return row
|
|
687
|
+
return row[IS_SUMMARY] === true;
|
|
688
688
|
}
|
|
689
689
|
/**
|
|
690
690
|
* 检查父级分组是否发生变化
|