zmdms-webui 2.3.6 → 2.3.8
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/canvastable/canvasTable.js +111 -25
- package/dist/es/canvastable/components/CanvasTableMenu.js +1 -2
- package/dist/es/canvastable/components/CellOverlay.js +3 -2
- package/dist/es/canvastable/hooks/useHeaderHeight.js +4 -9
- package/dist/es/canvastable/hooks/useProcessedColumns.js +17 -7
- package/dist/es/canvastable/hooks/useSummaryRow.js +4 -11
- package/dist/es/canvastable/hooks/useTableRender.js +159 -55
- package/dist/es/canvastable/hooks/useTableState.js +10 -3
- package/dist/es/canvastable/interface.d.ts +89 -1
- package/dist/es/canvastable/utils/columnHelpers.js +6 -2
- package/dist/es/canvastable/utils/constants.js +9 -2
- package/dist/es/canvastable/utils/interactionHelpers.js +27 -10
- package/dist/es/canvastable/utils/multiHeaderHelpers.js +5 -9
- package/dist/es/canvastable/utils/tableCalculations.js +13 -4
- package/dist/es/table/hooks.js +3 -1
- package/dist/es/table/utils.js +135 -81
- package/dist/index.build.d.ts +1 -1
- package/package.json +1 -1
|
@@ -9,8 +9,9 @@ import { getLeafColumns } from './multiHeaderHelpers.js';
|
|
|
9
9
|
* 注意:多级表头时,只处理叶子列(用于渲染数据)
|
|
10
10
|
* @param columns 列配置
|
|
11
11
|
* @param containerWidth 容器宽度(可选),如果提供且总宽度小于容器宽度,会自动填充
|
|
12
|
+
* @param manuallyResizedColumns 用户手动调整过宽度的列的key集合(可选),这些列不参与自动宽度分配
|
|
12
13
|
*/
|
|
13
|
-
var calculateColumnRenderInfos = function (columns, containerWidth) {
|
|
14
|
+
var calculateColumnRenderInfos = function (columns, containerWidth, manuallyResizedColumns) {
|
|
14
15
|
// 获取叶子列(多级表头时只有叶子列才渲染数据)
|
|
15
16
|
var leafColumns = getLeafColumns(columns);
|
|
16
17
|
// 第一次计算:使用原始宽度
|
|
@@ -27,13 +28,21 @@ var calculateColumnRenderInfos = function (columns, containerWidth) {
|
|
|
27
28
|
totalWidth += columnWidth;
|
|
28
29
|
});
|
|
29
30
|
// 如果提供了容器宽度且总宽度小于容器宽度,将剩余宽度平分到各列
|
|
30
|
-
//
|
|
31
|
+
// 注意:序号列、勾选框列、手动调整过的列除外,保持原宽度
|
|
31
32
|
if (containerWidth && totalWidth < containerWidth) {
|
|
32
33
|
var remainingWidth = containerWidth - totalWidth;
|
|
33
|
-
//
|
|
34
|
+
// 统计需要平分宽度的列(排除序号列、勾选框列和手动调整过的列)
|
|
34
35
|
var columnsToExpand = tempInfos.filter(function (info) {
|
|
35
36
|
var key = info.column.key;
|
|
36
|
-
|
|
37
|
+
// 排除序号列和勾选框列
|
|
38
|
+
if (key === "__index__" || key === "__selection__") {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
// 排除用户手动调整过宽度的列
|
|
42
|
+
if (manuallyResizedColumns && manuallyResizedColumns.has(key)) {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
return true;
|
|
37
46
|
});
|
|
38
47
|
if (columnsToExpand.length > 0) {
|
|
39
48
|
var additionalWidthPerColumn_1 = remainingWidth / columnsToExpand.length;
|
package/dist/es/table/hooks.js
CHANGED
|
@@ -423,7 +423,8 @@ function useAutoMerge(dataSource, columns, _a) {
|
|
|
423
423
|
if (!mergeKeys)
|
|
424
424
|
return dataSource;
|
|
425
425
|
else {
|
|
426
|
-
var newDataSource_2 = flattenRecordsOptimized(__spreadArray([], (dataSource || []), true), mergeKeys, dimensionSummaryKeys, summaryKeys, isDimensionDynamic, order, dimensionCustomSumKeys
|
|
426
|
+
var newDataSource_2 = flattenRecordsOptimized(__spreadArray([], (dataSource || []), true), mergeKeys, dimensionSummaryKeys, summaryKeys, isDimensionDynamic, order, dimensionCustomSumKeys, columns // 添加 columns 参数,支持自定义排序
|
|
427
|
+
);
|
|
427
428
|
return newDataSource_2;
|
|
428
429
|
}
|
|
429
430
|
}
|
|
@@ -436,6 +437,7 @@ function useAutoMerge(dataSource, columns, _a) {
|
|
|
436
437
|
isDimensionDynamic,
|
|
437
438
|
order,
|
|
438
439
|
dimensionCustomSumKeys,
|
|
440
|
+
columns, // 添加 columns 依赖
|
|
439
441
|
]);
|
|
440
442
|
var newColumns = useMemo(function () {
|
|
441
443
|
var _columns = columns;
|
package/dist/es/table/utils.js
CHANGED
|
@@ -449,7 +449,7 @@ function startColumnInsertTableData(options) {
|
|
|
449
449
|
* @param summaryKeys 合计字段
|
|
450
450
|
* @param isDimensionDynamic 维度合并
|
|
451
451
|
*/
|
|
452
|
-
function flattenRecordsOptimized(records, mergeKeys, dimensionSummaryKeys, summaryKeys, isDimensionDynamic, order, dimensionCustomSumKeys) {
|
|
452
|
+
function flattenRecordsOptimized(records, mergeKeys, dimensionSummaryKeys, summaryKeys, isDimensionDynamic, order, dimensionCustomSumKeys, columns) {
|
|
453
453
|
var _a;
|
|
454
454
|
if (!records ||
|
|
455
455
|
records.length === 0 ||
|
|
@@ -461,7 +461,7 @@ function flattenRecordsOptimized(records, mergeKeys, dimensionSummaryKeys, summa
|
|
|
461
461
|
var result = [];
|
|
462
462
|
// 如果order没有排序方向,但isDimensionDynamic为true,则按维度字段排序
|
|
463
463
|
if (isDimensionDynamic) {
|
|
464
|
-
result = sortByDimensions(__spreadArray([], records, true), mergeKeys);
|
|
464
|
+
result = sortByDimensions(__spreadArray([], records, true), mergeKeys, undefined, columns);
|
|
465
465
|
}
|
|
466
466
|
// 否则保持原样
|
|
467
467
|
else {
|
|
@@ -478,6 +478,7 @@ function flattenRecordsOptimized(records, mergeKeys, dimensionSummaryKeys, summa
|
|
|
478
478
|
// 开启自定义维度后因为最后一个维度字段会合并为一行,所以可以不排序最后一个维度字段
|
|
479
479
|
mergeKeys: isDimensionDynamic ? mergeKeys.slice(0, -1) : mergeKeys,
|
|
480
480
|
order: order,
|
|
481
|
+
columns: columns,
|
|
481
482
|
});
|
|
482
483
|
// 2. 首先插入维度合计行
|
|
483
484
|
if (dimensionSummaryKeys &&
|
|
@@ -579,10 +580,10 @@ function flattenRecordsOptimized(records, mergeKeys, dimensionSummaryKeys, summa
|
|
|
579
580
|
return result;
|
|
580
581
|
}
|
|
581
582
|
function sortRecords(_a) {
|
|
582
|
-
var records = _a.records, mergeKeys = _a.mergeKeys, order = _a.order;
|
|
583
|
+
var records = _a.records, mergeKeys = _a.mergeKeys, order = _a.order, columns = _a.columns;
|
|
583
584
|
var result = [];
|
|
584
585
|
if (order && order.order) {
|
|
585
|
-
result = sortByDimensions(__spreadArray([], records, true), mergeKeys, order);
|
|
586
|
+
result = sortByDimensions(__spreadArray([], records, true), mergeKeys, order, columns);
|
|
586
587
|
}
|
|
587
588
|
// 否则保持原样
|
|
588
589
|
else {
|
|
@@ -597,92 +598,145 @@ function sortRecords(_a) {
|
|
|
597
598
|
* @param dimensionKeys 维度字段
|
|
598
599
|
* @param order 排序配置
|
|
599
600
|
*/
|
|
600
|
-
function sortByDimensions(records, dimensionKeys, order) {
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
if (
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
var
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
var key = dimensionKeys[i];
|
|
611
|
-
var valueA_1 = a[key] || "";
|
|
612
|
-
var valueB_1 = b[key] || "";
|
|
613
|
-
// 字符串比较
|
|
614
|
-
if (valueA_1 < valueB_1)
|
|
615
|
-
return -1;
|
|
616
|
-
if (valueA_1 > valueB_1)
|
|
617
|
-
return 1;
|
|
618
|
-
// 如果当前字段相等,继续比较下一个字段
|
|
619
|
-
}
|
|
620
|
-
// 按排序字段进行排序
|
|
621
|
-
var valueA = a[field] || "";
|
|
622
|
-
var valueB = b[field] || "";
|
|
623
|
-
var compareResult = 0;
|
|
624
|
-
if (valueA < valueB)
|
|
625
|
-
compareResult = -1;
|
|
626
|
-
else if (valueA > valueB)
|
|
627
|
-
compareResult = 1;
|
|
628
|
-
if (compareResult !== 0) {
|
|
629
|
-
return sortOrder === "ascend" ? compareResult : -compareResult;
|
|
601
|
+
function sortByDimensions(records, dimensionKeys, order, columns) {
|
|
602
|
+
// 根据字段名查找对应的列配置
|
|
603
|
+
var findColumnByKey = function (field) {
|
|
604
|
+
if (!columns)
|
|
605
|
+
return null;
|
|
606
|
+
var findInColumns = function (cols) {
|
|
607
|
+
for (var _i = 0, cols_1 = cols; _i < cols_1.length; _i++) {
|
|
608
|
+
var col = cols_1[_i];
|
|
609
|
+
if (col.key === field || col.dataIndex === field) {
|
|
610
|
+
return col;
|
|
630
611
|
}
|
|
631
|
-
//
|
|
632
|
-
|
|
633
|
-
var
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
// 字符串比较
|
|
637
|
-
if (valueA_2 < valueB_2)
|
|
638
|
-
return -1;
|
|
639
|
-
if (valueA_2 > valueB_2)
|
|
640
|
-
return 1;
|
|
641
|
-
// 如果当前字段相等,继续比较下一个字段
|
|
612
|
+
// 如果有子列,递归查找
|
|
613
|
+
if (col.children && Array.isArray(col.children)) {
|
|
614
|
+
var found = findInColumns(col.children);
|
|
615
|
+
if (found)
|
|
616
|
+
return found;
|
|
642
617
|
}
|
|
643
618
|
}
|
|
619
|
+
return null;
|
|
620
|
+
};
|
|
621
|
+
return findInColumns(columns);
|
|
622
|
+
};
|
|
623
|
+
// 通用排序比较函数
|
|
624
|
+
var compareValues = function (valueA, valueB, order, recordA, recordB, field) {
|
|
625
|
+
// 处理 null/undefined
|
|
626
|
+
if (valueA === valueB)
|
|
627
|
+
return 0;
|
|
628
|
+
if (valueA === null || valueA === undefined)
|
|
629
|
+
return 1;
|
|
630
|
+
if (valueB === null || valueB === undefined)
|
|
631
|
+
return -1;
|
|
632
|
+
var compareResult = 0;
|
|
633
|
+
// 如果提供了字段名,尝试获取自定义排序函数
|
|
634
|
+
if (field && recordA && recordB) {
|
|
635
|
+
var column = findColumnByKey(field);
|
|
636
|
+
if (column && typeof column.sorter === "function") {
|
|
637
|
+
// 使用列配置中的自定义排序函数
|
|
638
|
+
compareResult = column.sorter(recordA, recordB);
|
|
639
|
+
}
|
|
644
640
|
else {
|
|
645
|
-
//
|
|
646
|
-
|
|
647
|
-
var key = dimensionKeys[i];
|
|
648
|
-
var valueA_3 = a[key] || "";
|
|
649
|
-
var valueB_3 = b[key] || "";
|
|
650
|
-
// 字符串比较
|
|
651
|
-
if (valueA_3 < valueB_3)
|
|
652
|
-
return -1;
|
|
653
|
-
if (valueA_3 > valueB_3)
|
|
654
|
-
return 1;
|
|
655
|
-
// 如果当前字段相等,继续比较下一个字段
|
|
656
|
-
}
|
|
657
|
-
// 最后按排序字段排序
|
|
658
|
-
var valueA = a[field] || "";
|
|
659
|
-
var valueB = b[field] || "";
|
|
660
|
-
var compareResult = 0;
|
|
661
|
-
if (valueA < valueB)
|
|
662
|
-
compareResult = -1;
|
|
663
|
-
else if (valueA > valueB)
|
|
664
|
-
compareResult = 1;
|
|
665
|
-
if (compareResult !== 0) {
|
|
666
|
-
return sortOrder === "ascend" ? compareResult : -compareResult;
|
|
667
|
-
}
|
|
641
|
+
// 使用默认排序逻辑
|
|
642
|
+
compareResult = getDefaultCompareResult(valueA, valueB);
|
|
668
643
|
}
|
|
669
644
|
}
|
|
670
645
|
else {
|
|
671
|
-
//
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
646
|
+
// 使用默认排序逻辑
|
|
647
|
+
compareResult = getDefaultCompareResult(valueA, valueB);
|
|
648
|
+
}
|
|
649
|
+
return compareResult !== 0
|
|
650
|
+
? order === "ascend"
|
|
651
|
+
? compareResult
|
|
652
|
+
: -compareResult
|
|
653
|
+
: 0;
|
|
654
|
+
};
|
|
655
|
+
// 默认排序比较逻辑
|
|
656
|
+
var getDefaultCompareResult = function (valueA, valueB) {
|
|
657
|
+
// 数字比较
|
|
658
|
+
if (typeof valueA === "number" && typeof valueB === "number") {
|
|
659
|
+
return valueA - valueB;
|
|
660
|
+
}
|
|
661
|
+
// 字符串比较(使用 localeCompare 支持中文等)
|
|
662
|
+
else {
|
|
663
|
+
return String(valueA).localeCompare(String(valueB), "zh-CN", {
|
|
664
|
+
numeric: true,
|
|
665
|
+
sensitivity: "base", // 忽略大小写和重音符号
|
|
666
|
+
});
|
|
667
|
+
}
|
|
668
|
+
};
|
|
669
|
+
// 通用的分层分组函数
|
|
670
|
+
var groupByDimensionsHierarchical = function (data, dimensions, currentDimensionIndex, sortConfig) {
|
|
671
|
+
if (currentDimensionIndex === void 0) { currentDimensionIndex = 0; }
|
|
672
|
+
if (currentDimensionIndex >= dimensions.length) {
|
|
673
|
+
// 到达叶子节点,如果排序字段不是维度字段,在这里排序
|
|
674
|
+
if (sortConfig && !dimensions.includes(sortConfig.field)) {
|
|
675
|
+
return data.sort(function (a, b) {
|
|
676
|
+
var valueA = a[sortConfig.field];
|
|
677
|
+
var valueB = b[sortConfig.field];
|
|
678
|
+
return compareValues(valueA, valueB, sortConfig.order, a, b, sortConfig.field);
|
|
679
|
+
});
|
|
680
|
+
}
|
|
681
|
+
else {
|
|
682
|
+
// 无排序配置或排序字段是维度字段,直接返回
|
|
683
|
+
return data;
|
|
682
684
|
}
|
|
683
685
|
}
|
|
684
|
-
|
|
685
|
-
|
|
686
|
+
var currentDimension = dimensions[currentDimensionIndex];
|
|
687
|
+
// 按当前维度分组,同时记录原始值用于排序
|
|
688
|
+
var groupData = new Map();
|
|
689
|
+
var groupOrder = []; // 记录分组出现的顺序
|
|
690
|
+
data.forEach(function (item) {
|
|
691
|
+
var value = item[currentDimension];
|
|
692
|
+
var key = String(value || "");
|
|
693
|
+
if (!groupData.has(key)) {
|
|
694
|
+
groupData.set(key, { items: [], originalValue: value });
|
|
695
|
+
groupOrder.push(key); // 记录第一次出现的顺序
|
|
696
|
+
}
|
|
697
|
+
groupData.get(key).items.push(item);
|
|
698
|
+
});
|
|
699
|
+
// 如果当前维度是排序字段,对分组的key进行排序
|
|
700
|
+
var finalGroupOrder = groupOrder;
|
|
701
|
+
if (sortConfig && sortConfig.field === currentDimension) {
|
|
702
|
+
finalGroupOrder = __spreadArray([], groupOrder, true).sort(function (keyA, keyB) {
|
|
703
|
+
// 使用保存的原始值进行比较
|
|
704
|
+
var valueA = groupData.get(keyA).originalValue;
|
|
705
|
+
var valueB = groupData.get(keyB).originalValue;
|
|
706
|
+
// 获取对应的记录用于自定义排序
|
|
707
|
+
var recordA = groupData.get(keyA).items[0];
|
|
708
|
+
var recordB = groupData.get(keyB).items[0];
|
|
709
|
+
return compareValues(valueA, valueB, sortConfig.order, recordA, recordB, sortConfig.field);
|
|
710
|
+
});
|
|
711
|
+
}
|
|
712
|
+
// 递归处理每个分组的子维度,并按排序后的顺序合并结果
|
|
713
|
+
var result = [];
|
|
714
|
+
for (var _i = 0, finalGroupOrder_1 = finalGroupOrder; _i < finalGroupOrder_1.length; _i++) {
|
|
715
|
+
var groupKey = finalGroupOrder_1[_i];
|
|
716
|
+
var group = groupData.get(groupKey);
|
|
717
|
+
var sortedGroupData = groupByDimensionsHierarchical(group.items, dimensions, currentDimensionIndex + 1, sortConfig);
|
|
718
|
+
result.push.apply(result, sortedGroupData);
|
|
719
|
+
}
|
|
720
|
+
return result;
|
|
721
|
+
};
|
|
722
|
+
// 根据是否有排序配置调用分组函数
|
|
723
|
+
var sortConfig;
|
|
724
|
+
if (order && order.order && order.field) {
|
|
725
|
+
// 如果有明确的排序配置,使用它
|
|
726
|
+
sortConfig = { field: order.field, order: order.order };
|
|
727
|
+
}
|
|
728
|
+
else {
|
|
729
|
+
// 如果没有明确排序,检查维度字段是否有自定义sorter,优先使用第一个有sorter的字段
|
|
730
|
+
for (var _i = 0, dimensionKeys_1 = dimensionKeys; _i < dimensionKeys_1.length; _i++) {
|
|
731
|
+
var dimensionKey = dimensionKeys_1[_i];
|
|
732
|
+
var column = findColumnByKey(dimensionKey);
|
|
733
|
+
if (column && typeof column.sorter === "function") {
|
|
734
|
+
sortConfig = { field: dimensionKey, order: "ascend" };
|
|
735
|
+
break; // 找到第一个有sorter的字段就使用,按维度顺序优先
|
|
736
|
+
}
|
|
737
|
+
}
|
|
738
|
+
}
|
|
739
|
+
return groupByDimensionsHierarchical(records, dimensionKeys, 0, sortConfig);
|
|
686
740
|
}
|
|
687
741
|
/**
|
|
688
742
|
* 插入维度合计行
|
package/dist/index.build.d.ts
CHANGED
|
@@ -49,7 +49,7 @@ export { default as Sortable } from './es/sortable/sortable.js';
|
|
|
49
49
|
export { default as ElectronSignatures } from './es/electronsignatures/index.js';
|
|
50
50
|
export { default as message } from './es/message/index.js';
|
|
51
51
|
export { default as CanvasTable } from './es/canvastable/canvasTable.js';
|
|
52
|
-
export { ICanvasColumnType, ICanvasColumnsType, ICanvasTableProps } from './es/canvastable/interface.js';
|
|
52
|
+
export { ICanvasColumnType, ICanvasColumnsType, ICanvasTableProps, ICanvasTableRefHandle } from './es/canvastable/interface.js';
|
|
53
53
|
export { Affix, Anchor, AutoComplete, Avatar, BackTop, Badge, Breadcrumb, Card, Carousel, Cascader, Checkbox, Col, Comment, ConfigProvider, Divider, Drawer, Dropdown, Empty, Grid, Image, Layout, List, Mentions, Menu, PageHeader, Popconfirm, Popover, Progress, Radio, Rate, Result, Row, Segmented, Skeleton, Slider, Space, Spin, Statistic, Steps, Switch, Timeline, Tooltip, Transfer, Typography, Upload, notification } from 'antd';
|
|
54
54
|
export { IButtonProps } from './es/button/interface.js';
|
|
55
55
|
export { IButtonDownloadProps } from './es/button/buttonDownload.js';
|