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.
@@ -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
- return key !== "__index__" && key !== "__selection__";
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;
@@ -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;
@@ -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
- return records.sort(function (a, b) {
602
- // 如果有排序配置且有排序方向
603
- if (order && order.order && order.field) {
604
- var field = order.field, sortOrder = order.order;
605
- // 找到排序字段在维度字段中的位置
606
- var sortFieldIndex = dimensionKeys.indexOf(field);
607
- if (sortFieldIndex !== -1) {
608
- // 先按维度字段排序到排序字段之前的字段
609
- for (var i = 0; i < sortFieldIndex; i++) {
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
- for (var i = sortFieldIndex + 1; i < dimensionKeys.length; i++) {
633
- var key = dimensionKeys[i];
634
- var valueA_2 = a[key] || "";
635
- var valueB_2 = b[key] || "";
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
- for (var i = 0; i < dimensionKeys.length; i++) {
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
- for (var i = 0; i < dimensionKeys.length; i++) {
673
- var key = dimensionKeys[i];
674
- var valueA = a[key] || "";
675
- var valueB = b[key] || "";
676
- // 字符串比较
677
- if (valueA < valueB)
678
- return -1;
679
- if (valueA > valueB)
680
- return 1;
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
- return 0; // 所有字段都相等
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
  * 插入维度合计行
@@ -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';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zmdms-webui",
3
- "version": "2.3.6",
3
+ "version": "2.3.8",
4
4
  "private": false,
5
5
  "main": "dist/index.es.js",
6
6
  "module": "dist/index.es.js",