zmdms-webui 2.5.4 → 2.5.5
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.
|
@@ -112,11 +112,14 @@ function CanvasTable(props) {
|
|
|
112
112
|
}), finalDataSource = _z.finalDataSource, hasSummaryRow = _z.hasSummaryRow;
|
|
113
113
|
// 用于存储计算后的表头高度(用于自动高度的精确计算)
|
|
114
114
|
var _0 = useState(undefined), preciseHeaderHeight = _0[0], setPreciseHeaderHeight = _0[1];
|
|
115
|
+
// 用于存储是否需要横向滚动条(用于自动高度的精确计算)
|
|
116
|
+
var _1 = useState(false), needHorizontalScrollbar = _1[0], setNeedHorizontalScrollbar = _1[1];
|
|
115
117
|
// 自动高度计算(需要在容器尺寸计算之前)
|
|
116
118
|
var autoHeight = useCanvasTableAutoHeight(isAutoScrollY, autoScrollYMarginBottom, canvasTableId, finalDataSource.length, // 数据行数(用于 content 模式)
|
|
117
119
|
headerHeight, // 表头基础高度(用于 content 模式的初始计算)
|
|
118
120
|
rowHeight, // 行高(用于 content 模式)
|
|
119
|
-
preciseHeaderHeight // 计算后的表头高度(用于 content 模式的精确计算)
|
|
121
|
+
preciseHeaderHeight, // 计算后的表头高度(用于 content 模式的精确计算)
|
|
122
|
+
needHorizontalScrollbar // 是否需要横向滚动条(用于计算额外高度)
|
|
120
123
|
);
|
|
121
124
|
// 监听容器尺寸变化(提前计算,用于列宽自适应)
|
|
122
125
|
var containerSize = useContainerSize({
|
|
@@ -124,6 +127,7 @@ function CanvasTable(props) {
|
|
|
124
127
|
width: width,
|
|
125
128
|
height: isAutoScrollY ? autoHeight || height : height,
|
|
126
129
|
});
|
|
130
|
+
console.log("containerSize", containerSize);
|
|
127
131
|
var containerWidth = containerSize.width;
|
|
128
132
|
var containerHeight = containerSize.height;
|
|
129
133
|
// 计算列的渲染信息(使用容器宽度进行自适应填充)
|
|
@@ -177,7 +181,7 @@ function CanvasTable(props) {
|
|
|
177
181
|
return calculateTotalHeight(calculatedHeaderHeight, finalDataSource.length, rowHeight);
|
|
178
182
|
}, [calculatedHeaderHeight, finalDataSource.length, rowHeight]);
|
|
179
183
|
// 计算滚动条指标
|
|
180
|
-
var
|
|
184
|
+
var _2 = useScrollbarMetrics({
|
|
181
185
|
containerWidth: containerWidth,
|
|
182
186
|
containerHeight: containerHeight,
|
|
183
187
|
totalWidth: totalWidth,
|
|
@@ -185,14 +189,14 @@ function CanvasTable(props) {
|
|
|
185
189
|
headerHeight: calculatedHeaderHeight,
|
|
186
190
|
scrollTop: 0,
|
|
187
191
|
scrollLeft: 0,
|
|
188
|
-
}), maxScrollTop =
|
|
192
|
+
}), maxScrollTop = _2.maxScrollTop, maxScrollLeft = _2.maxScrollLeft;
|
|
189
193
|
// 滚动管理(使用预先计算的maxScrollTop和maxScrollLeft)
|
|
190
|
-
var
|
|
194
|
+
var _3 = useTableScroll({
|
|
191
195
|
containerRef: containerRef,
|
|
192
196
|
maxScrollTop: maxScrollTop,
|
|
193
197
|
maxScrollLeft: maxScrollLeft,
|
|
194
198
|
onScroll: onScroll,
|
|
195
|
-
}), scrollState =
|
|
199
|
+
}), scrollState = _3.scrollState, setScrollState = _3.setScrollState;
|
|
196
200
|
// 使用 ref 保存最新的滚动位置,确保在组件卸载过程中仍能访问
|
|
197
201
|
var scrollPositionRef = useRef({ x: 0, y: 0 });
|
|
198
202
|
useEffect(function () {
|
|
@@ -220,13 +224,24 @@ function CanvasTable(props) {
|
|
|
220
224
|
scrollTop: scrollState.scrollTop,
|
|
221
225
|
scrollLeft: scrollState.scrollLeft,
|
|
222
226
|
}).actualMetrics;
|
|
227
|
+
// 在 content 模式下,当横向滚动条状态变化时,更新状态以触发自动高度重新计算
|
|
228
|
+
useEffect(function () {
|
|
229
|
+
if (isAutoScrollY === "content" &&
|
|
230
|
+
scrollbarMetrics.needHorizontalScrollbar !== needHorizontalScrollbar) {
|
|
231
|
+
setNeedHorizontalScrollbar(scrollbarMetrics.needHorizontalScrollbar);
|
|
232
|
+
}
|
|
233
|
+
}, [
|
|
234
|
+
isAutoScrollY,
|
|
235
|
+
scrollbarMetrics.needHorizontalScrollbar,
|
|
236
|
+
needHorizontalScrollbar,
|
|
237
|
+
]);
|
|
223
238
|
// 单元格框选
|
|
224
|
-
var
|
|
239
|
+
var _4 = useTableSelection({
|
|
225
240
|
state: state,
|
|
226
241
|
setState: setState,
|
|
227
242
|
}),
|
|
228
243
|
// selectionStartRef,
|
|
229
|
-
startSelection =
|
|
244
|
+
startSelection = _4.startSelection, updateSelection = _4.updateSelection, extendSelection = _4.extendSelection;
|
|
230
245
|
// 处理列宽调整
|
|
231
246
|
var handleColumnResize = useCallback(function (columnKey, newWidth) {
|
|
232
247
|
var _a;
|
|
@@ -281,20 +296,20 @@ function CanvasTable(props) {
|
|
|
281
296
|
onCurrentListChange,
|
|
282
297
|
]);
|
|
283
298
|
// 列宽调整
|
|
284
|
-
var
|
|
299
|
+
var _5 = useColumnResize({
|
|
285
300
|
columnRenderInfos: columnRenderInfos,
|
|
286
301
|
containerWidth: containerWidth,
|
|
287
302
|
headerHeight: calculatedHeaderHeight,
|
|
288
303
|
scrollLeft: scrollState.scrollLeft,
|
|
289
304
|
onColumnResize: handleColumnResize,
|
|
290
|
-
}), resizeState =
|
|
305
|
+
}), resizeState = _5.resizeState, checkResizeHandle = _5.checkResizeHandle, startResize = _5.startResize, updateResize = _5.updateResize, endResize = _5.endResize, setHoverResizeColumn = _5.setHoverResizeColumn, getColumnWidth = _5.getColumnWidth, RESIZE_HANDLE_WIDTH = _5.RESIZE_HANDLE_WIDTH;
|
|
291
306
|
// 复制到剪贴板
|
|
292
|
-
var
|
|
307
|
+
var _6 = useCopyToClipboard({
|
|
293
308
|
cellSelection: state.cellSelection,
|
|
294
309
|
processedDataSource: finalDataSource,
|
|
295
310
|
columns: processedColumns,
|
|
296
311
|
containerRef: containerRef,
|
|
297
|
-
}), getSelectedCellsText =
|
|
312
|
+
}), getSelectedCellsText = _6.getSelectedCellsText, copyToClipboard = _6.copyToClipboard;
|
|
298
313
|
// 处理右键菜单的复制操作
|
|
299
314
|
var handleCopy = useCallback(function () {
|
|
300
315
|
var text = getSelectedCellsText();
|
|
@@ -313,7 +328,7 @@ function CanvasTable(props) {
|
|
|
313
328
|
summaryConfig: (exportExcelConfig === null || exportExcelConfig === void 0 ? void 0 : exportExcelConfig.isExportNoSummary) ? undefined : [],
|
|
314
329
|
});
|
|
315
330
|
// 交互事件处理(使用baseScrollbarMetrics的maxScrollTop/maxScrollLeft以保持稳定)
|
|
316
|
-
var
|
|
331
|
+
var _7 = useTableInteraction({
|
|
317
332
|
state: state,
|
|
318
333
|
setState: setState,
|
|
319
334
|
scrollState: scrollState,
|
|
@@ -360,7 +375,7 @@ function CanvasTable(props) {
|
|
|
360
375
|
fixedRowsCount: fixedRowsCount,
|
|
361
376
|
fixedRowsConfig: fixedRowsConfig,
|
|
362
377
|
summaryFixed: summaryFixed,
|
|
363
|
-
}), handleCanvasMouseDown =
|
|
378
|
+
}), handleCanvasMouseDown = _7.handleCanvasMouseDown, handleCanvasMouseMove = _7.handleCanvasMouseMove, handleCanvasMouseUp = _7.handleCanvasMouseUp, handleCanvasMouseLeave = _7.handleCanvasMouseLeave, handleCanvasContextMenu = _7.handleCanvasContextMenu;
|
|
364
379
|
// 渲染表格
|
|
365
380
|
useTableRender(__assign(__assign({ canvasRef: canvasRef, processedDataSource: finalDataSource, columnRenderInfos: columnRenderInfos, columns: processedColumns, // 传递原始columns用于渲染多级表头
|
|
366
381
|
state: state, scrollState: scrollState, rowSelection: rowSelection, containerWidth: containerWidth, containerHeight: containerHeight, headerHeight: calculatedHeaderHeight, baseHeaderHeight: headerHeight, // 传入原始基础高度用于计算每层高度
|
|
@@ -3,6 +3,8 @@ import { useState, useEffect } from 'react';
|
|
|
3
3
|
/**
|
|
4
4
|
* CanvasTable 自动高度计算 Hook
|
|
5
5
|
*/
|
|
6
|
+
// 滚动条宽度常量
|
|
7
|
+
var SCROLLBAR_SIZE = 12;
|
|
6
8
|
/**
|
|
7
9
|
* 计算CanvasTable高度
|
|
8
10
|
* @param isAutoScrollY 自动高度模式
|
|
@@ -12,10 +14,12 @@ import { useState, useEffect } from 'react';
|
|
|
12
14
|
* @param headerHeight 表头基础高度(用于 content 模式的初始计算)
|
|
13
15
|
* @param rowHeight 行高(用于 content 模式)
|
|
14
16
|
* @param calculatedHeaderHeight 计算后的表头高度(优先使用,用于 content 模式的精确计算)
|
|
17
|
+
* @param needHorizontalScrollbar 是否需要横向滚动条(用于计算额外高度)
|
|
15
18
|
* @returns 计算出的表格高度
|
|
16
19
|
*/
|
|
17
|
-
function useCanvasTableAutoHeight(isAutoScrollY, marginBottom, canvasTableId, dataLength, headerHeight, rowHeight, calculatedHeaderHeight) {
|
|
20
|
+
function useCanvasTableAutoHeight(isAutoScrollY, marginBottom, canvasTableId, dataLength, headerHeight, rowHeight, calculatedHeaderHeight, needHorizontalScrollbar) {
|
|
18
21
|
if (marginBottom === void 0) { marginBottom = 65; }
|
|
22
|
+
if (needHorizontalScrollbar === void 0) { needHorizontalScrollbar = false; }
|
|
19
23
|
var _a = useState(undefined), tableHeight = _a[0], setTableHeight = _a[1];
|
|
20
24
|
useEffect(function () {
|
|
21
25
|
// 归一化模式:true 转换为 'viewport'
|
|
@@ -30,15 +34,14 @@ function useCanvasTableAutoHeight(isAutoScrollY, marginBottom, canvasTableId, da
|
|
|
30
34
|
// 优先使用计算后的表头高度(考虑了换行、多级表头等因素)
|
|
31
35
|
// 如果还未计算完成,使用基础高度作为初始值
|
|
32
36
|
var actualHeaderHeight = calculatedHeaderHeight || headerHeight;
|
|
33
|
-
// 计算总高度 = 表头高度 + (数据行数 * 行高)
|
|
34
|
-
var calculatedHeight = actualHeaderHeight +
|
|
37
|
+
// 计算总高度 = 表头高度 + (数据行数 * 行高) + (横向滚动条高度)
|
|
38
|
+
var calculatedHeight = actualHeaderHeight +
|
|
39
|
+
dataLength * rowHeight +
|
|
40
|
+
(needHorizontalScrollbar ? SCROLLBAR_SIZE : 0);
|
|
35
41
|
// 设置最小高度和最大高度
|
|
36
42
|
var minHeight = 200;
|
|
37
|
-
var maxHeight = 5000; // 防止数据过多时表格过高
|
|
38
43
|
// 如果没有数据,使用最小高度(包含表头和空状态提示)
|
|
39
|
-
var finalHeight = dataLength === 0
|
|
40
|
-
? minHeight
|
|
41
|
-
: Math.min(Math.max(calculatedHeight, minHeight), maxHeight);
|
|
44
|
+
var finalHeight = dataLength === 0 ? minHeight : Math.max(calculatedHeight, minHeight);
|
|
42
45
|
setTableHeight(finalHeight);
|
|
43
46
|
}
|
|
44
47
|
return;
|
|
@@ -95,7 +98,8 @@ function useCanvasTableAutoHeight(isAutoScrollY, marginBottom, canvasTableId, da
|
|
|
95
98
|
dataLength,
|
|
96
99
|
headerHeight,
|
|
97
100
|
rowHeight,
|
|
98
|
-
calculatedHeaderHeight,
|
|
101
|
+
calculatedHeaderHeight,
|
|
102
|
+
needHorizontalScrollbar, // 当横向滚动条状态变化时,重新计算总高度
|
|
99
103
|
]);
|
|
100
104
|
return tableHeight;
|
|
101
105
|
}
|