zmdms-webui 1.9.2 → 1.9.3
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 +0 -3
- package/dist/es/dynamicsetting/index.css +1 -1
- package/dist/es/dynamicsetting/sortable.js +1 -1
- package/dist/es/table/excel.js +45 -2
- package/dist/es/table/hooks.js +23 -3
- package/dist/es/table/useSummary.js +11 -8
- package/dist/index.dark.css +1 -1
- package/dist/index.default.css +1 -1
- package/package.json +1 -1
|
@@ -97,9 +97,6 @@ var DynamicDrawer = function (props, ref) {
|
|
|
97
97
|
// 子元素拖拽
|
|
98
98
|
var onChildMoveItem = useCallback(function (pIndex, pKey) {
|
|
99
99
|
return function (dragIndex, hoverIndex) {
|
|
100
|
-
if (!isDimensionPriority(dragIndex, hoverIndex)) {
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
103
100
|
// 由于对于固定列,不能进行拖拽排序,所以需要找出所有包含固定列的属性出来
|
|
104
101
|
setTempDynamicList(function (preDynamicList) {
|
|
105
102
|
var newDynamicList = preDynamicList.map(function (item) { return (__assign({}, item)); }) || [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.zt-sortable{cursor:move;font-size:13px;line-height:
|
|
1
|
+
.zt-sortable-new{cursor:move;font-size:13px;line-height:1.5;overflow:hidden;padding:8px 0;text-align:left}.zt-sortable-new .zt-sortable--item{align-items:center;display:flex;justify-content:space-between;padding:0 16px}.zt-sortable-new .zt-sortable--children{display:flex}.zt-sortable-new .zt-sortable--children .zt-sortable-new{border-bottom:none;padding:8px 26px}.zt-sortable-new.no-move{cursor:no-drop}.zt-sortable-new .zt-checkbox{font-size:13px}.zt-sortable-new:hover{background-color:#ebf3fe}.ztxk-dynamic--more{cursor:pointer;height:20px}.ant-dropdown-show-arrow.ztxk-dynamic--more--drop{padding-top:0}.ztxk-dynamic--more--drop.ant-dropdown-placement-bottomRight>.ant-dropdown-arrow{top:-5px}.dynamic-drawer .ant-drawer-header{padding:10px 12px}.dynamic-drawer .ant-drawer-header .ant-drawer-title>div{align-items:center;color:#768696;display:flex;font-size:16px}.dynamic-drawer .ant-drawer-header .ant-drawer-title>div .search-drawer--title-text{font-size:14px;margin-left:10px}.dynamic-drawer .ant-drawer-header .ant-drawer-title>div .search-drawer--title-text>span{font-size:13px}.dynamic-drawer .ant-drawer-body{padding:0}.dynamic-drawer .ant-drawer-body .ant-checkbox-group{width:100%}.dynamic-drawer .ant-drawer-footer{border-top:none;display:flex;justify-content:space-between;padding:0}.dynamic-drawer .ant-drawer-footer>button{border:none;border-radius:0;height:40px;width:33%}.dynamic-drawer-section-title{background:#f5f5f5;border-radius:6px;font-size:14px;font-weight:700;padding:4px}
|
|
@@ -8,7 +8,7 @@ import { useDrag } from '../node_modules/react-dnd/dist/hooks/useDrag/useDrag.js
|
|
|
8
8
|
var Sortable = function (_a) {
|
|
9
9
|
var type = _a.type, onMoveItem = _a.onMoveItem, index = _a.index, id = _a.id, children = _a.children, style = _a.style, className = _a.className;
|
|
10
10
|
var ref = useRef(null);
|
|
11
|
-
var classes = classNames("zt-sortable", className, {});
|
|
11
|
+
var classes = classNames("zt-sortable-new", className, {});
|
|
12
12
|
/**
|
|
13
13
|
* @description 定义可放置对象
|
|
14
14
|
*/
|
package/dist/es/table/excel.js
CHANGED
|
@@ -3,12 +3,13 @@ import { x as xlsx_minExports } from '../node_modules/xlsx-js-style/dist/xlsx.mi
|
|
|
3
3
|
import { useMergeKeys } from './hooks.js';
|
|
4
4
|
import { useMemo } from 'react';
|
|
5
5
|
import { useMemoizedFn } from 'ahooks';
|
|
6
|
-
import { MERGE_ROW_SPANS } from './constant.js';
|
|
6
|
+
import { IS_SUMMARY, MERGE_ROW_SPANS } from './constant.js';
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* 导出Excel,支持维度合并和小计
|
|
10
10
|
*/
|
|
11
11
|
function exportToExcelWithMerge(records, columns, mergeKeys, summaryKeys, fileName, sheetName, columnHeaders, summaryConfig) {
|
|
12
|
+
var _a;
|
|
12
13
|
if (fileName === void 0) { fileName = "export.xlsx"; }
|
|
13
14
|
if (sheetName === void 0) { sheetName = "Sheet1"; }
|
|
14
15
|
if (!records || records.length === 0) {
|
|
@@ -29,6 +30,8 @@ function exportToExcelWithMerge(records, columns, mergeKeys, summaryKeys, fileNa
|
|
|
29
30
|
if (col.isSummary) {
|
|
30
31
|
var total = 0;
|
|
31
32
|
for (var i = 0; i < processedData.length; i++) {
|
|
33
|
+
if (processedData[i][IS_SUMMARY])
|
|
34
|
+
continue;
|
|
32
35
|
var v = processedData[i][key];
|
|
33
36
|
var n = typeof v === "number" ? v : Number(v);
|
|
34
37
|
if (!isNaN(n))
|
|
@@ -48,7 +51,7 @@ function exportToExcelWithMerge(records, columns, mergeKeys, summaryKeys, fileNa
|
|
|
48
51
|
return "";
|
|
49
52
|
});
|
|
50
53
|
// 生成用于样式应用的数据(追加一条 __is_summary__ 行)
|
|
51
|
-
var summaryDataObj_1 = {
|
|
54
|
+
var summaryDataObj_1 = (_a = {}, _a[IS_SUMMARY] = true, _a);
|
|
52
55
|
Object.keys(sumsByKey_1).forEach(function (k) {
|
|
53
56
|
summaryDataObj_1[k] = sumsByKey_1[k];
|
|
54
57
|
});
|
|
@@ -56,6 +59,8 @@ function exportToExcelWithMerge(records, columns, mergeKeys, summaryKeys, fileNa
|
|
|
56
59
|
}
|
|
57
60
|
// 5. 创建工作表(带末尾合计行)
|
|
58
61
|
var worksheet = createWorksheetWithMerge(__assign(__assign({}, excelData), { summaryRow: summaryRow }), mergeKeys);
|
|
62
|
+
// 5.1 根据 columns 的 fixed 与表头行数设置冻结窗格(左列 + 表头行)
|
|
63
|
+
setWorksheetFreeze(worksheet, excelData.leafColumns, excelData.headerRowCount);
|
|
59
64
|
// 6. 添加样式(合计行高亮)
|
|
60
65
|
applyExcelStyles(worksheet, dataForStyles, mergeKeys, summaryKeys, excelData.leafColumns, excelData.headerRowCount);
|
|
61
66
|
// 7. 添加工作表到工作簿
|
|
@@ -68,6 +73,44 @@ function exportToExcelWithMerge(records, columns, mergeKeys, summaryKeys, fileNa
|
|
|
68
73
|
fileName: fileName,
|
|
69
74
|
};
|
|
70
75
|
}
|
|
76
|
+
function setWorksheetFreeze(worksheet, leafColumns, headerRowCount) {
|
|
77
|
+
try {
|
|
78
|
+
// 计算左侧固定列数量
|
|
79
|
+
var leftFrozenCount = leafColumns.filter(function (col) { return (col === null || col === void 0 ? void 0 : col.fixed) === "left"; }).length;
|
|
80
|
+
var ySplit = headerRowCount || 0;
|
|
81
|
+
var xSplit = leftFrozenCount || 0;
|
|
82
|
+
console.log("Freeze info:", {
|
|
83
|
+
ySplit: ySplit,
|
|
84
|
+
xSplit: xSplit,
|
|
85
|
+
headerRowCount: headerRowCount,
|
|
86
|
+
leftFrozenCount: leftFrozenCount,
|
|
87
|
+
});
|
|
88
|
+
if (ySplit > 0 || xSplit > 0) {
|
|
89
|
+
// 方法1:使用标准的 !freeze 属性(推荐)
|
|
90
|
+
// worksheet["!freeze"] = {
|
|
91
|
+
// xSplit,
|
|
92
|
+
// ySplit,
|
|
93
|
+
// };
|
|
94
|
+
// 方法2:如果方法1不生效,尝试使用 !panes 属性
|
|
95
|
+
worksheet["!panes"] = {
|
|
96
|
+
x: xSplit,
|
|
97
|
+
y: ySplit,
|
|
98
|
+
topLeftCell: xlsx_minExports.utils.encode_cell({ r: ySplit, c: xSplit }),
|
|
99
|
+
};
|
|
100
|
+
// 方法3:直接设置冻结信息到工作表
|
|
101
|
+
// if (!worksheet["!freeze"]) {
|
|
102
|
+
// worksheet["!freeze"] = {};
|
|
103
|
+
// }
|
|
104
|
+
// worksheet["!freeze"].xSplit = xSplit;
|
|
105
|
+
// worksheet["!freeze"].ySplit = ySplit;
|
|
106
|
+
console.log("Freeze set:", worksheet["!freeze"]);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
catch (e) {
|
|
110
|
+
console.error("设置冻结窗格失败:", e);
|
|
111
|
+
// 不影响导出,继续执行
|
|
112
|
+
}
|
|
113
|
+
}
|
|
71
114
|
/**
|
|
72
115
|
* 准备Excel数据(支持分组表头,构建多行表头与合并范围)
|
|
73
116
|
*/
|
package/dist/es/table/hooks.js
CHANGED
|
@@ -353,13 +353,31 @@ function useCalcScrollY(isAutoScrollY, subHeight, id) {
|
|
|
353
353
|
}, [isAutoScrollY, subHeight, id]);
|
|
354
354
|
return tableHeight;
|
|
355
355
|
}
|
|
356
|
+
// 扁平化多级表头,获取叶子列
|
|
357
|
+
function getLeafColumns(columns) {
|
|
358
|
+
var leafColumns = [];
|
|
359
|
+
var walk = function (nodes) {
|
|
360
|
+
var _a;
|
|
361
|
+
(_a = nodes === null || nodes === void 0 ? void 0 : nodes.forEach) === null || _a === void 0 ? void 0 : _a.call(nodes, function (n) {
|
|
362
|
+
if (Array.isArray(n === null || n === void 0 ? void 0 : n.children) && n.children.length > 0) {
|
|
363
|
+
walk(n.children);
|
|
364
|
+
}
|
|
365
|
+
else {
|
|
366
|
+
leafColumns.push(n);
|
|
367
|
+
}
|
|
368
|
+
});
|
|
369
|
+
};
|
|
370
|
+
walk(columns);
|
|
371
|
+
return leafColumns;
|
|
372
|
+
}
|
|
356
373
|
/**
|
|
357
374
|
* 获取合并key值
|
|
358
375
|
*/
|
|
359
376
|
var useMergeKeys = function (columns, isAutoMerge) {
|
|
360
377
|
var mergeKeys = useMemo(function () {
|
|
361
378
|
if (isAutoMerge) {
|
|
362
|
-
|
|
379
|
+
var leafColumns = getLeafColumns(columns);
|
|
380
|
+
return Array.from(new Set(leafColumns
|
|
363
381
|
.filter(function (item) { return item.isMerge && item.key !== MERGE_INDEX; })
|
|
364
382
|
.map(function (item) { return (item.mergeKey || item.key); })));
|
|
365
383
|
}
|
|
@@ -377,11 +395,13 @@ function useAutoMerge(dataSource, columns, _a) {
|
|
|
377
395
|
var firstMergeKey = mergeKeys === null || mergeKeys === void 0 ? void 0 : mergeKeys[0];
|
|
378
396
|
// 需要合计的字段
|
|
379
397
|
var summaryKeys = useMemo(function () {
|
|
380
|
-
|
|
398
|
+
var leafColumns = getLeafColumns(columns);
|
|
399
|
+
return leafColumns.filter(function (item) { return item.isSummary; }).map(function (item) { return item.key; });
|
|
381
400
|
}, [columns]);
|
|
382
401
|
// 开启维度合并的维度字段
|
|
383
402
|
var dimensionSummaryKeys = useMemo(function () {
|
|
384
|
-
|
|
403
|
+
var leafColumns = getLeafColumns(columns);
|
|
404
|
+
return leafColumns
|
|
385
405
|
.filter(function (item) { return item.isDimensionSum; })
|
|
386
406
|
.map(function (item) { return item.key; });
|
|
387
407
|
}, [columns]);
|
|
@@ -144,10 +144,6 @@ function getSubtotalObj(fields, dataSource) {
|
|
|
144
144
|
summaryTotalObj[field] = summaryItem
|
|
145
145
|
? plus(summaryItem, dataItem)
|
|
146
146
|
: dataItem;
|
|
147
|
-
// 合计添加千分符
|
|
148
|
-
if (summaryTotalObj[field]) {
|
|
149
|
-
summaryTotalObj[field] = addThousedSeparator(summaryTotalObj[field]);
|
|
150
|
-
}
|
|
151
147
|
}
|
|
152
148
|
else {
|
|
153
149
|
var key = field.key, showKey = field.showKey, toFixedNum_1 = field.toFixedNum, value = field.value, callback = field.callback;
|
|
@@ -240,13 +236,20 @@ function getSubtotalObj(fields, dataSource) {
|
|
|
240
236
|
summaryTotalConfigObj[key] = {
|
|
241
237
|
align: field === null || field === void 0 ? void 0 : field.align,
|
|
242
238
|
};
|
|
243
|
-
// 合计添加千分符
|
|
244
|
-
if (summaryTotalObj[key]) {
|
|
245
|
-
summaryTotalObj[key] = addThousedSeparator(summaryTotalObj[key]);
|
|
246
|
-
}
|
|
247
239
|
}
|
|
248
240
|
});
|
|
249
241
|
});
|
|
242
|
+
Object.keys(summaryTotalObj).forEach(function (key) {
|
|
243
|
+
if (summaryTotalObj[key] !== undefined) {
|
|
244
|
+
var value = summaryTotalObj[key];
|
|
245
|
+
var isNumericLike = function (v) {
|
|
246
|
+
return typeof v === "number" || (typeof v === "string" && !isNaN(Number(v)));
|
|
247
|
+
};
|
|
248
|
+
if (isNumericLike(value)) {
|
|
249
|
+
summaryTotalObj[key] = addThousedSeparator(value);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
});
|
|
250
253
|
return {
|
|
251
254
|
summaryTotalObj: summaryTotalObj,
|
|
252
255
|
summaryTotalConfigObj: summaryTotalConfigObj,
|