zmdms-webui 2.2.9 → 2.3.1

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.
Files changed (73) hide show
  1. package/dist/es/canvastable/canvasTable.js +367 -0
  2. package/dist/es/canvastable/components/BadgePopover.js +27 -0
  3. package/dist/es/canvastable/components/CanvasTableMenu.js +74 -0
  4. package/dist/es/canvastable/components/CellOverlay.js +49 -0
  5. package/dist/es/canvastable/components/ColumnDynamic.js +12 -0
  6. package/dist/es/canvastable/components/EmptyPlaceholder.js +20 -0
  7. package/dist/es/canvastable/components/FilterPopover.js +274 -0
  8. package/dist/es/canvastable/components/HeaderOverlay.js +22 -0
  9. package/dist/es/canvastable/components/Tooltip.js +27 -0
  10. package/dist/es/canvastable/hooks/useClickOutside.js +30 -0
  11. package/dist/es/canvastable/hooks/useColumnResize.js +130 -0
  12. package/dist/es/canvastable/hooks/useContainerSize.js +40 -0
  13. package/dist/es/canvastable/hooks/useCopyToClipboard.js +150 -0
  14. package/dist/es/canvastable/hooks/useHeaderHeight.js +103 -0
  15. package/dist/es/canvastable/hooks/useMergeCells.js +111 -0
  16. package/dist/es/canvastable/hooks/useOverlays.js +364 -0
  17. package/dist/es/canvastable/hooks/usePopovers.js +93 -0
  18. package/dist/es/canvastable/hooks/useProcessedColumns.js +94 -0
  19. package/dist/es/canvastable/hooks/useScroll.js +251 -0
  20. package/dist/es/canvastable/hooks/useSummaryRow.js +81 -0
  21. package/dist/es/canvastable/hooks/useTableInteraction.js +804 -0
  22. package/dist/es/canvastable/hooks/useTableRender.js +1289 -0
  23. package/dist/es/canvastable/hooks/useTableSelection.js +57 -0
  24. package/dist/es/canvastable/hooks/useTableState.js +218 -0
  25. package/dist/es/canvastable/index.js +5 -0
  26. package/dist/es/canvastable/utils/canvasDrawHelpers.js +156 -0
  27. package/dist/es/canvastable/utils/cellHelpers.js +121 -0
  28. package/dist/es/canvastable/utils/columnHelpers.js +67 -0
  29. package/dist/es/canvastable/utils/constants.js +42 -0
  30. package/dist/es/canvastable/utils/formatHelpers.js +60 -0
  31. package/dist/es/canvastable/utils/interactionHelpers.js +176 -0
  32. package/dist/es/canvastable/utils/multiHeaderHelpers.js +82 -0
  33. package/dist/es/canvastable/utils/tableCalculations.js +100 -0
  34. package/dist/es/form/form.js +1 -0
  35. package/dist/index.dark.css +1 -1
  36. package/dist/index.default.css +1 -1
  37. package/dist/index.es.css +1 -1
  38. package/dist/less/components/CanvasTable/style/index.less +106 -0
  39. package/dist/less/components/Form/style/index.less +6 -1
  40. package/package.json +1 -1
  41. package/dist/es/cascader/index.css +0 -1
  42. package/dist/es/collapse/index.css +0 -1
  43. package/dist/es/container/index.css +0 -1
  44. package/dist/es/datepicker/index.css +0 -1
  45. package/dist/es/descriptions/index.css +0 -1
  46. package/dist/es/detaillist/index.css +0 -1
  47. package/dist/es/differences/index.css +0 -1
  48. package/dist/es/dynamicsetting/index.css +0 -1
  49. package/dist/es/electronsignatures/index.css +0 -1
  50. package/dist/es/footer/index.css +0 -1
  51. package/dist/es/form/index.css +0 -1
  52. package/dist/es/formitem/index.css +0 -1
  53. package/dist/es/input/index.css +0 -1
  54. package/dist/es/inputnumber/index.css +0 -1
  55. package/dist/es/leftcontent/index.css +0 -1
  56. package/dist/es/message/index.css +0 -1
  57. package/dist/es/microloading/index.css +0 -1
  58. package/dist/es/modal/index.css +0 -1
  59. package/dist/es/notauthpage/index.css +0 -0
  60. package/dist/es/notroutepage/index.css +0 -0
  61. package/dist/es/pagination/index.css +0 -1
  62. package/dist/es/placeholder/index.css +0 -1
  63. package/dist/es/print/index.css +0 -1
  64. package/dist/es/select/index.css +0 -1
  65. package/dist/es/table/index.css +0 -1
  66. package/dist/es/tabs/index.css +0 -1
  67. package/dist/es/tag/index.css +0 -1
  68. package/dist/es/title/index.css +0 -1
  69. package/dist/es/tree/index.css +0 -1
  70. package/dist/es/treeselect/index.css +0 -1
  71. package/dist/es/uploadlist/index.css +0 -1
  72. package/dist/es/watermark/index.css +0 -1
  73. package/dist/es/zttransfer/index.css +0 -1
@@ -0,0 +1,60 @@
1
+ import dayjs from 'dayjs';
2
+
3
+ /**
4
+ * 数据格式化工具函数
5
+ */
6
+ /**
7
+ * 格式化数值(千分符)
8
+ */
9
+ var formatThousand = function (value) {
10
+ if (value === null || value === undefined || value === "")
11
+ return "";
12
+ var num = typeof value === "string" ? parseFloat(value) : value;
13
+ if (isNaN(num))
14
+ return String(value);
15
+ return num.toLocaleString("en-US");
16
+ };
17
+ /**
18
+ * 格式化精度
19
+ */
20
+ var formatPrecision = function (value, precision) {
21
+ if (value === null || value === undefined || value === "")
22
+ return "";
23
+ var num = typeof value === "string" ? parseFloat(value) : value;
24
+ if (isNaN(num))
25
+ return String(value);
26
+ return num.toFixed(precision);
27
+ };
28
+ /**
29
+ * 格式化日期
30
+ */
31
+ var formatDate = function (value, format) {
32
+ if (format === void 0) { format = "YYYY-MM-DD"; }
33
+ if (!value)
34
+ return "";
35
+ var date = dayjs(value);
36
+ return date.isValid() ? date.format(format) : String(value);
37
+ };
38
+ /**
39
+ * 格式化单元格值
40
+ */
41
+ var formatCellValue = function (value, column) {
42
+ if (value === null || value === undefined)
43
+ return "";
44
+ var formattedValue = value;
45
+ // 日期格式化
46
+ if (column.dateFormat) {
47
+ formattedValue = formatDate(formattedValue, column.dateFormat);
48
+ }
49
+ // 数值精度
50
+ if (column.precision !== undefined && typeof formattedValue === "number") {
51
+ formattedValue = formatPrecision(formattedValue, column.precision);
52
+ }
53
+ // 千分符
54
+ if (column.thousand && !isNaN(Number(formattedValue))) {
55
+ formattedValue = formatThousand(formattedValue);
56
+ }
57
+ return String(formattedValue);
58
+ };
59
+
60
+ export { formatCellValue, formatDate, formatPrecision, formatThousand };
@@ -0,0 +1,176 @@
1
+ /**
2
+ * 交互相关的辅助函数
3
+ */
4
+ var calculateIconArea = function (column, cellWidth) {
5
+ var hasOrder = column.isOrder !== false;
6
+ var hasFilter = column.isFilter !== false;
7
+ var iconsWidth = 0;
8
+ if (hasFilter) {
9
+ iconsWidth += 15; // 筛选图标宽度(10px图标 + 5px右边距)
10
+ }
11
+ if (hasOrder) {
12
+ iconsWidth += 15; // 排序图标宽度(10px图标)
13
+ if (hasFilter) {
14
+ iconsWidth += 4; // 排序和筛选之间的间距
15
+ }
16
+ }
17
+ // 排序图标区域
18
+ var sortIconStart = hasFilter ? cellWidth - 38 : cellWidth - 18;
19
+ var sortIconEnd = hasFilter ? cellWidth - 20 : cellWidth;
20
+ // 筛选图标区域(最右侧20px)
21
+ var filterIconStart = cellWidth - 20;
22
+ var filterIconEnd = cellWidth;
23
+ return {
24
+ hasOrder: hasOrder,
25
+ hasFilter: hasFilter,
26
+ sortIconStart: sortIconStart,
27
+ sortIconEnd: sortIconEnd,
28
+ filterIconStart: filterIconStart,
29
+ filterIconEnd: filterIconEnd,
30
+ iconsWidth: iconsWidth,
31
+ };
32
+ };
33
+ /**
34
+ * 判断点击是否在图标区域内
35
+ */
36
+ var isClickInIconArea = function (relativeX, iconArea, type) {
37
+ if (type === "filter" && iconArea.hasFilter) {
38
+ return (relativeX >= iconArea.filterIconStart &&
39
+ relativeX < iconArea.filterIconEnd);
40
+ }
41
+ if (type === "sort" && iconArea.hasOrder) {
42
+ return (relativeX >= iconArea.sortIconStart && relativeX < iconArea.sortIconEnd);
43
+ }
44
+ return false;
45
+ };
46
+ /**
47
+ * 计算弹窗位置(确保不超出容器边界)
48
+ */
49
+ var calculatePopoverPosition = function (columnDrawX, columnWidth, containerWidth, headerHeight, popoverWidth, gap) {
50
+ if (popoverWidth === void 0) { popoverWidth = 180; }
51
+ if (gap === void 0) { gap = 2; }
52
+ // 默认位置:列的右边缘对齐弹窗右边缘
53
+ var popoverX = columnDrawX + columnWidth - popoverWidth;
54
+ // 如果超出左边界,调整位置
55
+ if (popoverX < 8) {
56
+ popoverX = 8; // 留一点边距
57
+ }
58
+ // 如果超出右边界,调整位置
59
+ var maxX = containerWidth - popoverWidth - 8;
60
+ if (popoverX > maxX) {
61
+ popoverX = maxX;
62
+ }
63
+ return {
64
+ x: popoverX,
65
+ y: headerHeight + gap,
66
+ };
67
+ };
68
+ var calculateSelectionState = function (dataSource, selectedRowKeys, getRowKey, getCheckboxProps) {
69
+ // 获取所有可选择的数据(排除 disabled 的)
70
+ var selectableData = dataSource.filter(function (record) {
71
+ var checkboxProps = (getCheckboxProps === null || getCheckboxProps === void 0 ? void 0 : getCheckboxProps(record)) || {};
72
+ return !checkboxProps.disabled;
73
+ });
74
+ // 计算选中状态
75
+ var selectedCount = selectableData.filter(function (record) {
76
+ var actualIndex = dataSource.indexOf(record);
77
+ return selectedRowKeys.includes(getRowKey(record, actualIndex));
78
+ }).length;
79
+ var isAllSelected = selectableData.length > 0 && selectedCount === selectableData.length;
80
+ var isIndeterminate = selectedCount > 0 && selectedCount < selectableData.length;
81
+ return {
82
+ isAllSelected: isAllSelected,
83
+ isIndeterminate: isIndeterminate,
84
+ selectedCount: selectedCount,
85
+ selectableCount: selectableData.length,
86
+ };
87
+ };
88
+ /**
89
+ * 切换全选状态
90
+ */
91
+ var toggleSelectAll = function (dataSource, isAllSelected, getRowKey, getCheckboxProps) {
92
+ if (isAllSelected) {
93
+ return [];
94
+ }
95
+ // 获取所有可选择的数据(排除 disabled 的)
96
+ var selectableData = dataSource.filter(function (record) {
97
+ var checkboxProps = (getCheckboxProps === null || getCheckboxProps === void 0 ? void 0 : getCheckboxProps(record)) || {};
98
+ return !checkboxProps.disabled;
99
+ });
100
+ return selectableData.map(function (record) {
101
+ var actualIndex = dataSource.indexOf(record);
102
+ return getRowKey(record, actualIndex);
103
+ });
104
+ };
105
+ /**
106
+ * 处理排序点击
107
+ */
108
+ var handleSortClick = function (clickedUpper, currentSortField, currentSortOrder, columnKey) {
109
+ var newOrder = null;
110
+ if (clickedUpper) {
111
+ // 点击上箭头:升序
112
+ if (currentSortField === columnKey && currentSortOrder === "ascend") {
113
+ newOrder = null; // 取消排序
114
+ }
115
+ else {
116
+ newOrder = "ascend";
117
+ }
118
+ }
119
+ else {
120
+ // 点击下箭头:降序
121
+ if (currentSortField === columnKey && currentSortOrder === "descend") {
122
+ newOrder = null; // 取消排序
123
+ }
124
+ else {
125
+ newOrder = "descend";
126
+ }
127
+ }
128
+ return {
129
+ sortField: newOrder ? columnKey : null,
130
+ sortOrder: newOrder,
131
+ };
132
+ };
133
+ /**
134
+ * 计算三角形badge的区域判断
135
+ */
136
+ var isPointInTriangle = function (x, y, cellX, cellY, cellWidth, cellHeight, position, triangleSize) {
137
+ if (triangleSize === void 0) { triangleSize = 12; }
138
+ switch (position) {
139
+ case "top-left":
140
+ return (x >= cellX &&
141
+ x <= cellX + triangleSize &&
142
+ y >= cellY &&
143
+ y <= cellY + triangleSize &&
144
+ x - cellX + (y - cellY) <= triangleSize);
145
+ case "top-right":
146
+ return (x >= cellX + cellWidth - triangleSize &&
147
+ x <= cellX + cellWidth &&
148
+ y >= cellY &&
149
+ y <= cellY + triangleSize &&
150
+ cellX + cellWidth - x + (y - cellY) <= triangleSize);
151
+ case "bottom-left":
152
+ return (x >= cellX &&
153
+ x <= cellX + triangleSize &&
154
+ y >= cellY + cellHeight - triangleSize &&
155
+ y <= cellY + cellHeight &&
156
+ x - cellX + (cellY + cellHeight - y) <= triangleSize);
157
+ case "bottom-right":
158
+ return (x >= cellX + cellWidth - triangleSize &&
159
+ x <= cellX + cellWidth &&
160
+ y >= cellY + cellHeight - triangleSize &&
161
+ y <= cellY + cellHeight &&
162
+ cellX + cellWidth - x + (cellY + cellHeight - y) <= triangleSize);
163
+ default:
164
+ return false;
165
+ }
166
+ };
167
+ /**
168
+ * 计算滚动位置(限制在最大值范围内)
169
+ */
170
+ var calculateScrollPosition = function (delta, currentScroll, maxScroll, totalSize, dragStart, scrollableSize) {
171
+ var scrollRatio = delta / scrollableSize;
172
+ var newScroll = currentScroll + scrollRatio * totalSize;
173
+ return Math.max(0, Math.min(maxScroll, newScroll));
174
+ };
175
+
176
+ export { calculateIconArea, calculatePopoverPosition, calculateScrollPosition, calculateSelectionState, handleSortClick, isClickInIconArea, isPointInTriangle, toggleSelectAll };
@@ -0,0 +1,82 @@
1
+ /**
2
+ * 多级表头工具函数
3
+ */
4
+ /**
5
+ * 获取叶子列(没有children的列)
6
+ */
7
+ function getLeafColumns(columns) {
8
+ var leafColumns = [];
9
+ var walk = function (nodes) {
10
+ var _a;
11
+ (_a = nodes === null || nodes === void 0 ? void 0 : nodes.forEach) === null || _a === void 0 ? void 0 : _a.call(nodes, function (node) {
12
+ if (Array.isArray(node === null || node === void 0 ? void 0 : node.children) && node.children.length > 0) {
13
+ walk(node.children);
14
+ }
15
+ else {
16
+ leafColumns.push(node);
17
+ }
18
+ });
19
+ };
20
+ walk(columns);
21
+ return leafColumns;
22
+ }
23
+ /**
24
+ * 获取表头的最大深度
25
+ */
26
+ function getMaxDepth(columns) {
27
+ var maxDepth = 1;
28
+ var walk = function (nodes, depth) {
29
+ var _a;
30
+ (_a = nodes === null || nodes === void 0 ? void 0 : nodes.forEach) === null || _a === void 0 ? void 0 : _a.call(nodes, function (node) {
31
+ if (depth > maxDepth) {
32
+ maxDepth = depth;
33
+ }
34
+ if (Array.isArray(node === null || node === void 0 ? void 0 : node.children) && node.children.length > 0) {
35
+ walk(node.children, depth + 1);
36
+ }
37
+ });
38
+ };
39
+ walk(columns, 1);
40
+ return maxDepth;
41
+ }
42
+ /**
43
+ * 计算列的跨度(colspan)
44
+ */
45
+ function computeColSpan(column) {
46
+ if (!column.children || column.children.length === 0) {
47
+ return 1;
48
+ }
49
+ return column.children.reduce(function (sum, child) { return sum + computeColSpan(child); }, 0);
50
+ }
51
+ function flattenHeaders(columns) {
52
+ var maxDepth = getMaxDepth(columns);
53
+ var headerRows = Array.from({ length: maxDepth }, function () { return []; });
54
+ var walk = function (nodes, depth, startColIndexRef) {
55
+ nodes.forEach(function (node) {
56
+ var hasChildren = Array.isArray(node.children) && node.children.length > 0;
57
+ var colSpan = computeColSpan(node);
58
+ var rowSpan = hasChildren ? 1 : maxDepth - depth + 1;
59
+ var currentCol = startColIndexRef.value;
60
+ // 添加表头单元格
61
+ headerRows[depth - 1].push({
62
+ column: node,
63
+ rowSpan: rowSpan,
64
+ colSpan: colSpan,
65
+ depth: depth - 1,
66
+ colIndex: currentCol,
67
+ });
68
+ if (hasChildren) {
69
+ var childStartRef = { value: currentCol };
70
+ walk(node.children, depth + 1, childStartRef);
71
+ startColIndexRef.value = currentCol + colSpan;
72
+ }
73
+ else {
74
+ startColIndexRef.value = currentCol + 1;
75
+ }
76
+ });
77
+ };
78
+ walk(columns, 1, { value: 0 });
79
+ return headerRows;
80
+ }
81
+
82
+ export { computeColSpan, flattenHeaders, getLeafColumns, getMaxDepth };
@@ -0,0 +1,100 @@
1
+ import { DEFAULT_COLUMN_WIDTH } from './constants.js';
2
+ import { getLeafColumns } from './multiHeaderHelpers.js';
3
+
4
+ /**
5
+ * 表格计算工具函数
6
+ */
7
+ /**
8
+ * 计算列的渲染信息
9
+ * 注意:多级表头时,只处理叶子列(用于渲染数据)
10
+ */
11
+ var calculateColumnRenderInfos = function (columns) {
12
+ // 获取叶子列(多级表头时只有叶子列才渲染数据)
13
+ var leafColumns = getLeafColumns(columns);
14
+ var infos = [];
15
+ var currentX = 0;
16
+ var fixedLeftX = 0;
17
+ leafColumns.forEach(function (column) {
18
+ var columnWidth = column.width || DEFAULT_COLUMN_WIDTH;
19
+ var isFixed = column.fixed === "left" || column.fixed === true;
20
+ infos.push({
21
+ column: column,
22
+ x: isFixed ? fixedLeftX : currentX,
23
+ width: columnWidth,
24
+ fixed: isFixed,
25
+ fixedLeft: isFixed ? fixedLeftX : undefined,
26
+ });
27
+ if (isFixed) {
28
+ fixedLeftX += columnWidth;
29
+ }
30
+ currentX += columnWidth;
31
+ });
32
+ return infos;
33
+ };
34
+ /**
35
+ * 计算总宽度
36
+ */
37
+ var calculateTotalWidth = function (columnRenderInfos) {
38
+ return columnRenderInfos.reduce(function (sum, info) { return sum + info.width; }, 0);
39
+ };
40
+ /**
41
+ * 计算总高度
42
+ */
43
+ var calculateTotalHeight = function (headerHeight, dataLength, rowHeight) {
44
+ return headerHeight + dataLength * rowHeight;
45
+ };
46
+ /**
47
+ * 计算滚动条位置和大小
48
+ */
49
+ var calculateScrollbarMetrics = function (params) {
50
+ var containerWidth = params.containerWidth, containerHeight = params.containerHeight, totalWidth = params.totalWidth, totalHeight = params.totalHeight, headerHeight = params.headerHeight, scrollbarSize = params.scrollbarSize, minScrollbarSize = params.minScrollbarSize, scrollTop = params.scrollTop, scrollLeft = params.scrollLeft;
51
+ // 是否需要显示滚动条
52
+ var needVerticalScrollbar = totalHeight > containerHeight;
53
+ var needHorizontalScrollbar = totalWidth > containerWidth;
54
+ // 计算可滚动的最大值
55
+ // maxScrollTop 需要考虑水平滚动条占用的空间
56
+ // 当有水平滚动条时,数据可视区域减少了 scrollbarSize 的高度
57
+ var maxScrollTop = Math.max(0, totalHeight -
58
+ containerHeight +
59
+ (needHorizontalScrollbar ? scrollbarSize : 0));
60
+ // maxScrollLeft 需要考虑垂直滚动条占用的空间
61
+ // 当有垂直滚动条时,数据可视区域减少了 scrollbarSize 的宽度
62
+ var maxScrollLeft = Math.max(0, totalWidth - containerWidth + (needVerticalScrollbar ? scrollbarSize : 0));
63
+ // 计算数据区域高度(不包括表头和水平滚动条)
64
+ var dataAreaHeight = containerHeight -
65
+ headerHeight -
66
+ (needHorizontalScrollbar ? scrollbarSize : 0);
67
+ // 计算垂直滚动条高度
68
+ var verticalScrollbarHeight = needVerticalScrollbar
69
+ ? Math.max(minScrollbarSize, (dataAreaHeight / totalHeight) * dataAreaHeight)
70
+ : 0;
71
+ // 计算水平滚动条宽度
72
+ var horizontalScrollbarWidth = needHorizontalScrollbar
73
+ ? Math.max(minScrollbarSize, ((containerWidth - (needVerticalScrollbar ? scrollbarSize : 0)) /
74
+ totalWidth) *
75
+ (containerWidth - (needVerticalScrollbar ? scrollbarSize : 0)))
76
+ : 0;
77
+ // 计算滚动条位置
78
+ var verticalScrollbarTop = needVerticalScrollbar && maxScrollTop > 0
79
+ ? (scrollTop / maxScrollTop) * (dataAreaHeight - verticalScrollbarHeight)
80
+ : 0;
81
+ var horizontalScrollbarLeft = needHorizontalScrollbar && maxScrollLeft > 0
82
+ ? (scrollLeft / maxScrollLeft) *
83
+ (containerWidth -
84
+ (needVerticalScrollbar ? scrollbarSize : 0) -
85
+ horizontalScrollbarWidth)
86
+ : 0;
87
+ return {
88
+ needVerticalScrollbar: needVerticalScrollbar,
89
+ needHorizontalScrollbar: needHorizontalScrollbar,
90
+ maxScrollTop: maxScrollTop,
91
+ maxScrollLeft: maxScrollLeft,
92
+ dataAreaHeight: dataAreaHeight,
93
+ verticalScrollbarHeight: verticalScrollbarHeight,
94
+ horizontalScrollbarWidth: horizontalScrollbarWidth,
95
+ verticalScrollbarTop: verticalScrollbarTop,
96
+ horizontalScrollbarLeft: horizontalScrollbarLeft,
97
+ };
98
+ };
99
+
100
+ export { calculateColumnRenderInfos, calculateScrollbarMetrics, calculateTotalHeight, calculateTotalWidth };
@@ -39,6 +39,7 @@ var Form = function (props, ref) {
39
39
  // 左容器类名
40
40
  var leftClasses = classNames("ztxk-form__left", leftClassName, {
41
41
  "ztxk-form__left--flex": isFlex,
42
+ "ztxk-form__left--toggle": isToggle,
42
43
  "ztxk-form__left--flex-direction": directionColumn,
43
44
  });
44
45
  // 右容器类名