zmdms-webui 2.3.5 → 2.3.7

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.
@@ -34,9 +34,17 @@ var COLORS = {
34
34
  };
35
35
  // 字体配置
36
36
  var FONT_FAMILY = '"Microsoft YaHei", 微软雅黑, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif';
37
- var FONT_SIZE = 13; // 增大1px,提升清晰度
37
+ var FONT_SIZE = 13;
38
+ var FONT_WEIGHT = "400"; // 正常字重,避免过细导致不清晰
38
39
  // 图标尺寸
39
40
  var CHECKBOX_SIZE = 16;
40
- var SORT_ICON_SIZE = 6;
41
+ var SORT_ICON_SIZE = 6;
42
+ var SORT_ICON_WIDTH = 15; // 排序图标宽度(用于表头宽度计算)
43
+ var FILTER_ICON_WIDTH = 15; // 筛选图标宽度(用于表头宽度计算)
44
+ // 间距和内边距
45
+ var ICON_SPACING = 4; // 图标之间的间距
46
+ var TEXT_PADDING = 5; // 文本内边距
47
+ // 行高计算
48
+ var LINE_HEIGHT = FONT_SIZE + 5; // 字体大小 + 行间距5px
41
49
 
42
- export { CHECKBOX_SIZE, COLORS, DEFAULT_COLUMN_WIDTH, DEFAULT_SELECTION_COLUMN_WIDTH, FONT_FAMILY, FONT_SIZE, MIN_SCROLLBAR_SIZE, SCROLLBAR_PADDING, SCROLLBAR_SIZE, SORT_ICON_SIZE };
50
+ export { CHECKBOX_SIZE, COLORS, DEFAULT_COLUMN_WIDTH, DEFAULT_SELECTION_COLUMN_WIDTH, FILTER_ICON_WIDTH, FONT_FAMILY, FONT_SIZE, FONT_WEIGHT, ICON_SPACING, LINE_HEIGHT, MIN_SCROLLBAR_SIZE, SCROLLBAR_PADDING, SCROLLBAR_SIZE, SORT_ICON_SIZE, SORT_ICON_WIDTH, TEXT_PADDING };
@@ -1,3 +1,5 @@
1
+ import { FONT_SIZE, FONT_FAMILY, TEXT_PADDING, LINE_HEIGHT, FILTER_ICON_WIDTH, SORT_ICON_WIDTH, ICON_SPACING } from './constants.js';
2
+
1
3
  /**
2
4
  * 多级表头工具函数
3
5
  */
@@ -77,6 +79,122 @@ function flattenHeaders(columns) {
77
79
  };
78
80
  walk(columns, 1, { value: 0 });
79
81
  return headerRows;
82
+ }
83
+ /**
84
+ * 计算每一层表头的高度(考虑文本换行)
85
+ * @param columns 表头列配置
86
+ * @param baseHeaderHeight 基础表头高度
87
+ * @param columnRenderInfos 列渲染信息(用于获取实际列宽)
88
+ * @returns 每一层的高度数组,以及每一层的起始Y坐标数组
89
+ */
90
+ function calculateLayerHeights(columns, baseHeaderHeight, columnRenderInfos) {
91
+ var maxDepth = getMaxDepth(columns);
92
+ // 如果是单层表头,直接返回基础高度
93
+ if (maxDepth === 1) {
94
+ return {
95
+ layerHeights: [baseHeaderHeight],
96
+ layerStartY: [0],
97
+ };
98
+ }
99
+ var flattenedHeaderRows = flattenHeaders(columns);
100
+ var leafColumns = getLeafColumns(columns);
101
+ // 创建临时canvas用于测量文本
102
+ var tempCanvas = document.createElement("canvas");
103
+ var ctx = tempCanvas.getContext("2d");
104
+ if (!ctx) {
105
+ // 如果无法获取context,返回平均分配的高度
106
+ return {
107
+ layerHeights: Array(maxDepth).fill(baseHeaderHeight),
108
+ layerStartY: Array.from({ length: maxDepth }, function (_, i) { return i * baseHeaderHeight; }),
109
+ };
110
+ }
111
+ ctx.font = "".concat(FONT_SIZE, "px ").concat(FONT_FAMILY);
112
+ var layerHeights = [];
113
+ // 遍历每一层
114
+ flattenedHeaderRows.forEach(function (headerRow, rowIndex) {
115
+ var maxLines = 1;
116
+ // 计算这一层中所有单元格需要的最大行数
117
+ headerRow.forEach(function (headerCell) {
118
+ var _a;
119
+ var column = headerCell.column, colSpan = headerCell.colSpan, colIndex = headerCell.colIndex, rowSpan = headerCell.rowSpan;
120
+ // 如果没有wrap属性或者没有title,不需要计算
121
+ if (!column.wrap || !column.title) {
122
+ return;
123
+ }
124
+ // 计算跨列单元格的总宽度
125
+ var totalWidth = 0;
126
+ for (var i = colIndex; i < colIndex + colSpan && i < leafColumns.length; i++) {
127
+ if (columnRenderInfos && columnRenderInfos[i]) {
128
+ totalWidth += columnRenderInfos[i].width;
129
+ }
130
+ else {
131
+ totalWidth += ((_a = leafColumns[i]) === null || _a === void 0 ? void 0 : _a.width) || 100;
132
+ }
133
+ }
134
+ var titleText = String(column.title);
135
+ // 判断是否是最末级表头(当前行+rowSpan 是否等于最大深度)
136
+ var isLastLevel = rowIndex + rowSpan === maxDepth;
137
+ // 判断是否是特殊列(选择框列、序号列等不需要排序和筛选的列)
138
+ var isSpecialColumn = column.key === "__selection__" || column.key === "__index__";
139
+ // 计算图标占用的宽度(仅在最末级表头且非特殊列时计算)
140
+ var iconsWidth = 0;
141
+ if (isLastLevel && !isSpecialColumn) {
142
+ var hasOrder = column.isOrder !== false;
143
+ var hasFilter = column.isFilter !== false;
144
+ if (hasFilter)
145
+ iconsWidth += FILTER_ICON_WIDTH;
146
+ if (hasOrder) {
147
+ iconsWidth += SORT_ICON_WIDTH;
148
+ if (hasFilter)
149
+ iconsWidth += ICON_SPACING;
150
+ }
151
+ }
152
+ // 计算文本可用宽度
153
+ var textMaxWidth = totalWidth - TEXT_PADDING - iconsWidth;
154
+ // 计算需要的行数
155
+ var lines = titleText.split("\n");
156
+ var totalLines = 0;
157
+ for (var _i = 0, lines_1 = lines; _i < lines_1.length; _i++) {
158
+ var line = lines_1[_i];
159
+ if (line === "") {
160
+ totalLines += 1;
161
+ continue;
162
+ }
163
+ var currentLine = "";
164
+ var lineCount = 0;
165
+ var chars = line.split("");
166
+ for (var _b = 0, chars_1 = chars; _b < chars_1.length; _b++) {
167
+ var char = chars_1[_b];
168
+ var testLine = currentLine + char;
169
+ var metrics = ctx.measureText(testLine);
170
+ if (metrics.width > textMaxWidth && currentLine.length > 0) {
171
+ lineCount += 1;
172
+ currentLine = char;
173
+ }
174
+ else {
175
+ currentLine = testLine;
176
+ }
177
+ }
178
+ if (currentLine.length > 0) {
179
+ lineCount += 1;
180
+ }
181
+ totalLines += lineCount;
182
+ }
183
+ maxLines = Math.max(maxLines, totalLines);
184
+ });
185
+ // 当有换行时:上边距(5px) + 行数 * 行高 + 下边距(5px)
186
+ // 当没有换行时:使用原始的 baseHeaderHeight
187
+ var layerHeight = maxLines > 1
188
+ ? 10 + maxLines * LINE_HEIGHT // 上下边距各5px,共10px
189
+ : baseHeaderHeight;
190
+ layerHeights.push(layerHeight);
191
+ });
192
+ // 计算每一层的起始Y坐标
193
+ var layerStartY = [0];
194
+ for (var i = 1; i < layerHeights.length; i++) {
195
+ layerStartY.push(layerStartY[i - 1] + layerHeights[i - 1]);
196
+ }
197
+ return { layerHeights: layerHeights, layerStartY: layerStartY };
80
198
  }
81
199
 
82
- export { computeColSpan, flattenHeaders, getLeafColumns, getMaxDepth };
200
+ export { calculateLayerHeights, computeColSpan, flattenHeaders, getLeafColumns, getMaxDepth };
@@ -7,27 +7,67 @@ import { getLeafColumns } from './multiHeaderHelpers.js';
7
7
  /**
8
8
  * 计算列的渲染信息
9
9
  * 注意:多级表头时,只处理叶子列(用于渲染数据)
10
+ * @param columns 列配置
11
+ * @param containerWidth 容器宽度(可选),如果提供且总宽度小于容器宽度,会自动填充
12
+ * @param manuallyResizedColumns 用户手动调整过宽度的列的key集合(可选),这些列不参与自动宽度分配
10
13
  */
11
- var calculateColumnRenderInfos = function (columns) {
14
+ var calculateColumnRenderInfos = function (columns, containerWidth, manuallyResizedColumns) {
12
15
  // 获取叶子列(多级表头时只有叶子列才渲染数据)
13
16
  var leafColumns = getLeafColumns(columns);
14
- var infos = [];
15
- var currentX = 0;
16
- var fixedLeftX = 0;
17
+ // 第一次计算:使用原始宽度
18
+ var tempInfos = [];
19
+ var totalWidth = 0;
17
20
  leafColumns.forEach(function (column) {
18
21
  var columnWidth = column.width || DEFAULT_COLUMN_WIDTH;
19
22
  var isFixed = column.fixed === "left" || column.fixed === true;
20
- infos.push({
23
+ tempInfos.push({
21
24
  column: column,
22
- x: isFixed ? fixedLeftX : currentX,
23
25
  width: columnWidth,
24
- fixed: isFixed,
25
- fixedLeft: isFixed ? fixedLeftX : undefined,
26
+ isFixed: isFixed,
27
+ });
28
+ totalWidth += columnWidth;
29
+ });
30
+ // 如果提供了容器宽度且总宽度小于容器宽度,将剩余宽度平分到各列
31
+ // 注意:序号列、勾选框列、手动调整过的列除外,保持原宽度
32
+ if (containerWidth && totalWidth < containerWidth) {
33
+ var remainingWidth = containerWidth - totalWidth;
34
+ // 统计需要平分宽度的列(排除序号列、勾选框列和手动调整过的列)
35
+ var columnsToExpand = tempInfos.filter(function (info) {
36
+ var key = info.column.key;
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;
46
+ });
47
+ if (columnsToExpand.length > 0) {
48
+ var additionalWidthPerColumn_1 = remainingWidth / columnsToExpand.length;
49
+ // 只更新需要扩展的列的宽度
50
+ columnsToExpand.forEach(function (info) {
51
+ info.width += additionalWidthPerColumn_1;
52
+ });
53
+ }
54
+ }
55
+ // 第二次计算:生成最终的渲染信息
56
+ var infos = [];
57
+ var currentX = 0;
58
+ var fixedLeftX = 0;
59
+ tempInfos.forEach(function (tempInfo) {
60
+ infos.push({
61
+ column: tempInfo.column,
62
+ x: tempInfo.isFixed ? fixedLeftX : currentX,
63
+ width: tempInfo.width,
64
+ fixed: tempInfo.isFixed,
65
+ fixedLeft: tempInfo.isFixed ? fixedLeftX : undefined,
26
66
  });
27
- if (isFixed) {
28
- fixedLeftX += columnWidth;
67
+ if (tempInfo.isFixed) {
68
+ fixedLeftX += tempInfo.width;
29
69
  }
30
- currentX += columnWidth;
70
+ currentX += tempInfo.width;
31
71
  });
32
72
  return infos;
33
73
  };
@@ -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.5",
3
+ "version": "2.3.7",
4
4
  "private": false,
5
5
  "main": "dist/index.es.js",
6
6
  "module": "dist/index.es.js",