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.
@@ -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:38px;overflow:hidden;text-align:left}.zt-sortable .zt-sortable--item{align-items:center;display:flex;justify-content:space-between;padding:0 16px}.zt-sortable .zt-sortable--children{display:flex}.zt-sortable .zt-sortable--children .zt-sortable{border-bottom:none;padding:0 26px}.zt-sortable.no-move{cursor:no-drop}.zt-sortable .zt-checkbox{font-size:13px}.zt-sortable: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}
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
  */
@@ -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 = { __is_summary__: true };
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
  */
@@ -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
- return Array.from(new Set(columns
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
- return columns.filter(function (item) { return item.isSummary; }).map(function (item) { return item.key; });
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
- return columns
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,