@hi-ui/table 5.0.0-canary.24 → 5.0.0-canary.26

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.
@@ -468,7 +468,10 @@ var useTable = function useTable(_a) {
468
468
  return acc;
469
469
  }, []);
470
470
  }, [mergedColumns1]);
471
- var getStickyColProps = useLatest.useLatestCallback(function (column) {
471
+ var getStickyColProps = useLatest.useLatestCallback(function (column, type) {
472
+ if (type === void 0) {
473
+ type = 'td';
474
+ }
472
475
  var rightStickyWidth = column.rightStickyWidth,
473
476
  leftStickyWidth = column.leftStickyWidth,
474
477
  align = column.align;
@@ -478,10 +481,10 @@ var useTable = function useTable(_a) {
478
481
  };
479
482
  if (sticky) {
480
483
  style.position = 'sticky';
481
- style.right = rightStickyWidth + 'px';
482
- style.left = leftStickyWidth + 'px';
483
- // the value is same with v3
484
- style.zIndex = 5;
484
+ style.insetInlineEnd = rightStickyWidth + 'px';
485
+ style.insetInlineStart = leftStickyWidth + 'px';
486
+ // the value is same with v4
487
+ style.zIndex = type === 'th' ? 5 : 4;
485
488
  }
486
489
  return {
487
490
  style: style,
@@ -491,7 +494,7 @@ var useTable = function useTable(_a) {
491
494
  var getTableHeaderProps = React__default["default"].useCallback(function () {
492
495
  var style = {
493
496
  position: sticky ? 'sticky' : 'relative',
494
- top: sticky ? stickyTop : undefined,
497
+ insetBlockStart: sticky ? stickyTop : undefined,
495
498
  overflow: 'hidden',
496
499
  zIndex: sticky ? 10 : undefined
497
500
  };
@@ -68,26 +68,29 @@ var setColumnsDefaultWidth = function setColumnsDefaultWidth(columns, defaultWid
68
68
  var getGroupItemWidth = function getGroupItemWidth(columns) {
69
69
  var colWidths = [];
70
70
  var minColWidths = [];
71
+ var flattedColumnsWithoutChildren = [];
71
72
  var dig = function dig(column) {
72
- column.forEach(function (_ref) {
73
- var children = _ref.children,
74
- width = _ref.width,
75
- minWidth = _ref.minWidth;
73
+ column.forEach(function (item) {
74
+ var children = item.children,
75
+ width = item.width,
76
+ minWidth = item.minWidth;
76
77
  if (Array.isArray(children)) {
77
78
  dig(children);
78
79
  return;
79
80
  }
80
81
  // 如果没有设置列宽度,css 宽度默认是 `auto`,这里对于非数字 width 均设置为 0
81
82
  var colWidth = typeAssertion.isNumeric(width) ? Number(width) : 0;
82
- var minColWidth = typeAssertion.isNumeric(minWidth) ? Number(minWidth) : colWidth || 60;
83
- colWidths.push(colWidth < minColWidth ? minColWidth : colWidth);
83
+ var minColWidth = typeAssertion.isNumeric(minWidth) ? Number(minWidth) : 0;
84
+ colWidths.push(colWidth);
84
85
  minColWidths.push(minColWidth);
86
+ flattedColumnsWithoutChildren.push(item);
85
87
  });
86
88
  };
87
89
  dig(columns);
88
90
  return {
89
91
  colWidths: colWidths,
90
- minColWidths: minColWidths
92
+ minColWidths: minColWidths,
93
+ flattedColumnsWithoutChildren: flattedColumnsWithoutChildren
91
94
  };
92
95
  };
93
96
  var parseFixedColumns = function parseFixedColumns(item, index, columns, arr, key, parentStickyWidth) {
@@ -149,9 +152,9 @@ var parseFixedColumns = function parseFixedColumns(item, index, columns, arr, ke
149
152
  var uuid = function uuid() {
150
153
  return Math.random().toString(36).substring(5).split('').join('.');
151
154
  };
152
- var parseLocalArray = function parseLocalArray(_ref3) {
153
- var key = _ref3.key,
154
- defaultValue = _ref3.defaultValue;
155
+ var parseLocalArray = function parseLocalArray(_ref2) {
156
+ var key = _ref2.key,
157
+ defaultValue = _ref2.defaultValue;
155
158
  if (key) {
156
159
  try {
157
160
  var localArr = window.localStorage.getItem(key);
@@ -223,7 +226,23 @@ var getColumnByDefaultSortOrder = function getColumnByDefaultSortOrder(columns)
223
226
  }
224
227
  return {};
225
228
  };
229
+ var flattenColumns = function flattenColumns(columns) {
230
+ var result = [];
231
+ var traverse = function traverse(cols) {
232
+ cols.forEach(function (col) {
233
+ var _a;
234
+ if ((_a = col.children) === null || _a === void 0 ? void 0 : _a.length) {
235
+ traverse(col.children);
236
+ } else {
237
+ result.push(col);
238
+ }
239
+ });
240
+ };
241
+ traverse(columns);
242
+ return result;
243
+ };
226
244
  exports.checkNeedTotalOrEvg = checkNeedTotalOrEvg;
245
+ exports.flattenColumns = flattenColumns;
227
246
  exports.getColumnByDataKey = getColumnByDataKey;
228
247
  exports.getColumnByDefaultSortOrder = getColumnByDefaultSortOrder;
229
248
  exports.getGroupItemWidth = getGroupItemWidth;
@@ -20,7 +20,7 @@ import { TableBody } from './TableBody.js';
20
20
  import { TableHeader } from './TableHeader.js';
21
21
  import { defaultLoadingIcon } from './icons/index.js';
22
22
  import { TableProvider } from './context.js';
23
- import { uuid, checkNeedTotalOrEvg, getTotalOrEvgRowData } from './utils/index.js';
23
+ import { uuid, flattenColumns, checkNeedTotalOrEvg, getTotalOrEvgRowData } from './utils/index.js';
24
24
  import { useTable } from './use-table.js';
25
25
  import { useEmbedExpand } from './hooks/use-embed-expand.js';
26
26
  import { TheadContent } from './TheadContent.js';
@@ -93,6 +93,7 @@ var BaseTable = /*#__PURE__*/forwardRef(function (_a, ref) {
93
93
  dataKey: EMBED_DATA_KEY,
94
94
  title: '',
95
95
  width: 38,
96
+ fixed: true,
96
97
  className: prefixCls + "__embed-col",
97
98
  align: 'center',
98
99
  render: function render(_, rowItem) {
@@ -125,6 +126,8 @@ var BaseTable = /*#__PURE__*/forwardRef(function (_a, ref) {
125
126
  }, [embedExpandable, getEmbedPanelColumn, columns]);
126
127
  var i18n = useLocaleContext();
127
128
  var _useMemo = useMemo(function () {
129
+ var _a;
130
+ // 确保包含 avg 属性,且值为数字类型的字符串
128
131
  // 确保包含 avg 属性,且值为数字类型的字符串
129
132
  var avgRow = {
130
133
  id: 'avg',
@@ -133,9 +136,15 @@ var BaseTable = /*#__PURE__*/forwardRef(function (_a, ref) {
133
136
  }
134
137
  };
135
138
  var hasAvgColumn = false;
136
- columns.forEach(function (column, index) {
137
- // 行选中模式下,index=0是checkbox列,index=1才是第一列 ; fix issue: https://github.com/XiaoMi/hiui/issues/2863
138
- if (index === 0 || index === 1 && columns[0].dataKey === SELECTION_DATA_KEY) {
139
+ var flattenedColumns = flattenColumns(columns);
140
+ // 找第一个非选择框列
141
+ // 找第一个非选择框列
142
+ var firstDataColumnIndex = 0;
143
+ if (((_a = columns[0]) === null || _a === void 0 ? void 0 : _a.dataKey) === SELECTION_DATA_KEY) {
144
+ firstDataColumnIndex = 1;
145
+ }
146
+ flattenedColumns.forEach(function (column, index) {
147
+ if (index === firstDataColumnIndex) {
139
148
  // @ts-ignore
140
149
  avgRow.raw[column.dataKey] = i18n.get('table.average');
141
150
  }
@@ -154,6 +163,8 @@ var BaseTable = /*#__PURE__*/forwardRef(function (_a, ref) {
154
163
  avgRow = _useMemo.avgRow,
155
164
  hasAvgColumn = _useMemo.hasAvgColumn;
156
165
  var _useMemo2 = useMemo(function () {
166
+ var _a;
167
+ // 确保包含total属性,且值为数字类型的字符串
157
168
  // 确保包含total属性,且值为数字类型的字符串
158
169
  var sumRow = {
159
170
  id: 'sum',
@@ -162,16 +173,19 @@ var BaseTable = /*#__PURE__*/forwardRef(function (_a, ref) {
162
173
  }
163
174
  };
164
175
  var hasSumColumn = false;
165
- columns.forEach(function (column, index) {
166
- if (index === 0 || index === 1 && columns[0].dataKey === SELECTION_DATA_KEY) {
176
+ var flattenedColumns = flattenColumns(columns);
177
+ var firstDataColumnIndex = 0;
178
+ if (((_a = columns[0]) === null || _a === void 0 ? void 0 : _a.dataKey) === SELECTION_DATA_KEY) {
179
+ firstDataColumnIndex = 1;
180
+ }
181
+ flattenedColumns.forEach(function (column, index) {
182
+ if (index === firstDataColumnIndex) {
167
183
  // @ts-ignore
168
184
  sumRow.raw[column.dataKey] = i18n.get('table.total');
169
185
  }
170
186
  if (checkNeedTotalOrEvg(data, column, 'total')) {
171
187
  hasSumColumn = true;
172
- // 获取当前数据最大小数点个数,并设置最后总和值小数点
173
188
  // @ts-ignore
174
- // 获取当前数据最大小数点个数,并设置最后总和值小数点
175
189
  // @ts-ignore
176
190
  sumRow.raw[column.dataKey] = getTotalOrEvgRowData(data, column, false);
177
191
  }
@@ -210,7 +224,30 @@ var BaseTable = /*#__PURE__*/forwardRef(function (_a, ref) {
210
224
  var extraHeader = extra && extra.header;
211
225
  var extraFooter = extra && extra.footer;
212
226
  var alwaysFixedColumn = fixedColumnTrigger === 'always';
227
+ var wrapperRef = React__default.useRef(null);
228
+ var isTableContentExceedWrapperHeight = bodyTableRef.current && wrapperRef.current && bodyTableRef.current.offsetHeight > wrapperRef.current.offsetHeight;
213
229
  var renderTable = function renderTable() {
230
+ if (needDoubleTable) {
231
+ var _a2 = getTableHeaderProps(),
232
+ style = _a2.style,
233
+ restTableHeaderProps = __rest(_a2, ["style"]);
234
+ var doubleTableContent = /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement("div", Object.assign({}, restTableHeaderProps, {
235
+ style: Object.assign(Object.assign({}, style), {
236
+ overflow: undefined
237
+ })
238
+ }), /*#__PURE__*/React__default.createElement(TableHeader, null), extraHeader ? ( /*#__PURE__*/React__default.createElement("div", {
239
+ style: {
240
+ position: 'absolute',
241
+ right: 0,
242
+ zIndex: 11,
243
+ bottom: 0,
244
+ top: 0
245
+ }
246
+ }, extraHeader)) : null), /*#__PURE__*/React__default.createElement(TableBody, {
247
+ emptyContent: emptyContent
248
+ }));
249
+ return doubleTableContent;
250
+ }
214
251
  var tableContent = /*#__PURE__*/React__default.createElement("table", {
215
252
  ref: bodyTableRef,
216
253
  style: {
@@ -232,25 +269,7 @@ var BaseTable = /*#__PURE__*/forwardRef(function (_a, ref) {
232
269
  ref: scrollBodyElementRef,
233
270
  onScroll: onTableBodyScroll
234
271
  }, isObject(scrollbar) ? scrollbar : null), tableContent)));
235
- var _a = getTableHeaderProps(),
236
- style = _a.style,
237
- restTableHeaderProps = __rest(_a, ["style"]);
238
- var doubleTableContent = /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement("div", Object.assign({}, restTableHeaderProps, {
239
- style: Object.assign(Object.assign({}, style), {
240
- overflow: undefined
241
- })
242
- }), /*#__PURE__*/React__default.createElement(TableHeader, null), extraHeader ? ( /*#__PURE__*/React__default.createElement("div", {
243
- style: {
244
- position: 'absolute',
245
- right: 0,
246
- zIndex: 11,
247
- bottom: 0,
248
- top: 0
249
- }
250
- }, extraHeader)) : null), /*#__PURE__*/React__default.createElement(TableBody, {
251
- emptyContent: emptyContent
252
- }));
253
- return needDoubleTable ? doubleTableContent : singleTableContent;
272
+ return singleTableContent;
254
273
  };
255
274
  var renderFreezeShadow = function renderFreezeShadow() {
256
275
  return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, (alwaysFixedColumn || scrollSize.scrollLeft > 0) && leftFrozenColKeys.length > 0 ? ( /*#__PURE__*/React__default.createElement("div", {
@@ -278,7 +297,8 @@ var BaseTable = /*#__PURE__*/forwardRef(function (_a, ref) {
278
297
  role: role,
279
298
  className: cls
280
299
  }, rootProps), /*#__PURE__*/React__default.createElement("div", {
281
- className: prefixCls + "__wrapper"
300
+ ref: wrapperRef,
301
+ className: cx(prefixCls + "__wrapper", isTableContentExceedWrapperHeight && prefixCls + "--exceed-wrapper-height")
282
302
  }, /*#__PURE__*/React__default.createElement(TableProvider, {
283
303
  value: Object.assign(Object.assign({}, providedValue), {
284
304
  striped: striped,
package/lib/esm/Table.js CHANGED
@@ -32,7 +32,7 @@ var _prefix = getPrefixCls('table');
32
32
  * 需要使用双表格的场景对应的 API
33
33
  * 这些场景下的功能无法通过单表格实现,故而设计成双表格,即表头和表体分别用一个 table 实现
34
34
  */
35
- var DOUBLE_TABLE_SCENE = ['needDoubleTable', 'maxHeight', 'sticky', 'stickyTop', 'setting', 'virtual', 'stretchHeight'];
35
+ var DOUBLE_TABLE_SCENE = ['needDoubleTable', 'maxHeight', 'sticky', 'stickyTop', 'setting', 'virtual'];
36
36
  var STANDARD_PRESET = {
37
37
  striped: true,
38
38
  bordered: true,
@@ -74,9 +74,10 @@ var Table = /*#__PURE__*/forwardRef(function (_a, ref) {
74
74
  data = _a$data === void 0 ? DEFAULT_DATA : _a$data,
75
75
  rest = __rest(_a, ["prefixCls", "standard", "loading", "dataSource", "pagination", "uniqueId", "columns", "hiddenColKeys", "onHiddenColKeysChange", "sortedColKeys", "onSortedColKeysChange", "checkDisabledColKeys", "onSetColKeysChange", "rowSelection", "fieldKey", "extra", "data"]);
76
76
  // 是否需要双表格
77
+ // 当 data 为空时,如果使用单表格,在表头分组下会导致表头错位(原生 table 特性),故而该情况下也要使用双表格
77
78
  var needDoubleTable = DOUBLE_TABLE_SCENE.some(function (prop) {
78
79
  return !!rest[prop];
79
- });
80
+ }) || data.length === 0;
80
81
  var virtual = rest.virtual;
81
82
  // ************************ 预置标准模式 ************************ //
82
83
  var tableProps = withDefaultProps(rest, standard ? STANDARD_PRESET : undefined);
@@ -191,6 +192,12 @@ var Table = /*#__PURE__*/forwardRef(function (_a, ref) {
191
192
  var rowKey = getRowKeyField(rowItem);
192
193
  var checked = isCheckedRowKey(rowKey);
193
194
  var disabledCheckbox = checkRowIsDisabledCheckbox(rowItem);
195
+ if (rowItem.key === 'avg' || rowItem.key === 'sum') {
196
+ return {
197
+ node: null,
198
+ checked: false
199
+ };
200
+ }
194
201
  return {
195
202
  node: type === 'checkbox' ? ( /*#__PURE__*/React__default.createElement(Checkbox, {
196
203
  checked: checked,
@@ -92,7 +92,7 @@ var TableCell = /*#__PURE__*/forwardRef(function (_ref, ref) {
92
92
  var cls = cx(prefixCls, className, raw.className, canScroll && sticky && prefixCls + "__col--sticky", isHighlightedCol(dataKey) && prefixCls + "__col--highlight", isHoveredHighlightCol(dataKey) && prefixCls + "__col--hovered-highlight");
93
93
  if (virtual) {
94
94
  var width = colWidths[colIndex];
95
- var colProps = getStickyColProps(column);
95
+ var colProps = getStickyColProps(column, 'td');
96
96
  return /*#__PURE__*/React__default.createElement("div", Object.assign({
97
97
  ref: ref,
98
98
  key: dataKey,
@@ -130,7 +130,7 @@ var TableCell = /*#__PURE__*/forwardRef(function (_ref, ref) {
130
130
  ref: ref,
131
131
  key: dataKey,
132
132
  className: cls
133
- }, getStickyColProps(column), {
133
+ }, getStickyColProps(column, 'td'), {
134
134
  colSpan: cellContent.props.colSpan,
135
135
  rowSpan: cellContent.props.rowSpan,
136
136
  // 按需绑定函数,避免频繁调用 setState 特别消耗性能
@@ -33,7 +33,8 @@ var TbodyContent = /*#__PURE__*/forwardRef(function (_ref, ref) {
33
33
  sumRow = _useTableContext.sumRow,
34
34
  measureRowElementRef = _useTableContext.measureRowElementRef,
35
35
  rowClassName = _useTableContext.rowClassName,
36
- fixedToRow = _useTableContext.fixedToRow;
36
+ fixedToRow = _useTableContext.fixedToRow,
37
+ flattedColumnsWithoutChildren = _useTableContext.flattedColumnsWithoutChildren;
37
38
  var getRequiredProps = useLatestCallback(function (id) {
38
39
  return {
39
40
  // @ts-ignore
@@ -79,19 +80,27 @@ var TbodyContent = /*#__PURE__*/forwardRef(function (_ref, ref) {
79
80
  measureRowElementRefNeedUpdate.current = true;
80
81
  }, [columns]);
81
82
  // 外层增加 div 作为滚动容器
82
- return /*#__PURE__*/React__default.createElement("tbody", null, isArrayNonEmpty(transitionData) ? ( /*#__PURE__*/React__default.createElement(React__default.Fragment, null, transitionData.map(function (row, index) {
83
+ return /*#__PURE__*/React__default.createElement("tbody", null, /*#__PURE__*/React__default.createElement("tr", {
84
+ ref: measureRowElementRef,
85
+ "aria-hidden": true,
86
+ style: {
87
+ height: 0
88
+ }
89
+ }, flattedColumnsWithoutChildren.map(function (column) {
90
+ return /*#__PURE__*/React__default.createElement("td", {
91
+ key: column.id,
92
+ style: {
93
+ height: 0,
94
+ paddingTop: 0,
95
+ paddingBottom: 0,
96
+ borderTop: 'none',
97
+ borderBottom: 'none'
98
+ }
99
+ });
100
+ })), isArrayNonEmpty(transitionData) ? ( /*#__PURE__*/React__default.createElement(React__default.Fragment, null, transitionData.map(function (row, index) {
83
101
  return /*#__PURE__*/React__default.createElement(TableRow, Object.assign({
84
- ref: function ref(el) {
85
- // 当 el 的子节点数量和 columns 的数量相等时(考虑单元格合并的情况),并且measureRowElementRefNeedUpdate.current为true时,才更新measureRowElementRef
86
- if ((el === null || el === void 0 ? void 0 : el.childNodes.length) === columns.length && measureRowElementRefNeedUpdate.current) {
87
- measureRowElementRef.current = el;
88
- measureRowElementRefNeedUpdate.current = false;
89
- }
90
- },
91
- // key={depth + index}
92
102
  key: row.id,
93
103
  className: cx.apply(void 0, [rowClassName === null || rowClassName === void 0 ? void 0 : rowClassName(row, index)].concat(fixedToRowTopClassName(row, index))),
94
- // @ts-ignore
95
104
  rowIndex: index,
96
105
  rowData: row
97
106
  }, getRequiredProps(row.id)));
@@ -8,7 +8,7 @@
8
8
  * LICENSE file in the root directory of this source tree.
9
9
  */
10
10
  import { __rest } from 'tslib';
11
- import React__default, { forwardRef } from 'react';
11
+ import React__default, { forwardRef, useRef } from 'react';
12
12
  import { Resizable } from 'react-resizable';
13
13
  import { getPrefixCls, cx } from '@hi-ui/classname';
14
14
  import { __DEV__ } from '@hi-ui/env';
@@ -34,12 +34,20 @@ var TheadContent = /*#__PURE__*/forwardRef(function (_a, ref) {
34
34
  setHeaderTableElement = _useTableContext.setHeaderTableElement,
35
35
  _onResizeStop = _useTableContext.onResizeStop;
36
36
  var activeColumnKeysAction = useCheckState();
37
+ var trRefs = useRef([]);
37
38
  return /*#__PURE__*/React__default.createElement("thead", Object.assign({}, rest), groupedColumns.map(function (cols, colsIndex) {
38
39
  return /*#__PURE__*/React__default.createElement("tr", {
39
40
  key: colsIndex,
40
- ref: setHeaderTableElement
41
+ ref: function ref(el) {
42
+ if (el) {
43
+ trRefs.current[colsIndex] = el;
44
+ if (colsIndex === 0) {
45
+ setHeaderTableElement(el);
46
+ }
47
+ }
48
+ }
41
49
  }, cols.map(function (col, colIndex) {
42
- var _a;
50
+ var _a, _b;
43
51
  var _ref = col || {},
44
52
  dataKey = _ref.dataKey,
45
53
  title = _ref.title,
@@ -56,11 +64,12 @@ var TheadContent = /*#__PURE__*/forwardRef(function (_a, ref) {
56
64
  groupLastColumn = true;
57
65
  }
58
66
  }
59
- var stickyColProps = getStickyColProps(col);
67
+ var stickyColProps = getStickyColProps(col, 'th');
60
68
  var cell = /*#__PURE__*/React__default.createElement("th", Object.assign({
61
69
  key: dataKey
62
70
  }, stickyColProps, {
63
71
  style: Object.assign(Object.assign({}, stickyColProps.style), {
72
+ insetBlockStart: (_b = trRefs.current[colsIndex]) === null || _b === void 0 ? void 0 : _b.offsetTop,
64
73
  // 表头合并场景下,被合并的表头需要隐藏
65
74
  display: (col === null || col === void 0 ? void 0 : col.colSpan) === 0 ? 'none' : undefined
66
75
  }),
@@ -26,17 +26,21 @@ var useColWidth = function useColWidth(_ref) {
26
26
  setColWidths = _React$useState[1];
27
27
  /**
28
28
  * 根据实际内容区(table 的第一行)渲染,再次精确收集并设置每列宽度
29
+ * 如果实际总宽度大于设置的宽度,则将多余的宽度平分到没有设置 fixed 的列上
29
30
  */
30
31
  var getWidths = useCallback(function (measureRowElement) {
31
32
  if (measureRowElement && measureRowElement.childNodes) {
32
33
  // 超出的宽度,即每列真实的宽度超出设置的宽度的总和
33
34
  var exceedWidth = 0;
35
+ var _getGroupItemWidth = getGroupItemWidth(columns),
36
+ flattedColumnsWithoutChildren = _getGroupItemWidth.flattedColumnsWithoutChildren,
37
+ _colWidths = _getGroupItemWidth.colWidths;
34
38
  var _realColumnsWidth = Array.from(measureRowElement.childNodes).map(function (node, index) {
35
39
  var _a;
36
40
  var realWidth = node.offsetWidth || 60;
37
- var _ref2 = (_a = columns[index]) !== null && _a !== void 0 ? _a : {},
41
+ var _ref2 = (_a = flattedColumnsWithoutChildren[index]) !== null && _a !== void 0 ? _a : {},
38
42
  fixed = _ref2.fixed;
39
- var width = getGroupItemWidth(columns).colWidths[index];
43
+ var width = _colWidths[index];
40
44
  // 如果该列设置了 fixed 并且真实宽度大于设置的 width 则设置为 width
41
45
  if (fixed && width && width < realWidth) {
42
46
  exceedWidth += realWidth - width;
@@ -46,12 +50,12 @@ var useColWidth = function useColWidth(_ref) {
46
50
  });
47
51
  // 如果有多余的宽度,则将多余的宽度平分到没有设置 fixed 的列上
48
52
  if (exceedWidth > 0) {
49
- var noFixedColumns = columns.filter(function (item) {
53
+ var noFixedColumns = flattedColumnsWithoutChildren.filter(function (item) {
50
54
  return !item.fixed;
51
55
  });
52
56
  _realColumnsWidth = _realColumnsWidth.map(function (item, index) {
53
57
  var _a;
54
- if (!((_a = columns[index]) === null || _a === void 0 ? void 0 : _a.fixed)) {
58
+ if (!((_a = flattedColumnsWithoutChildren[index]) === null || _a === void 0 ? void 0 : _a.fixed)) {
55
59
  return item + Math.floor(exceedWidth / noFixedColumns.length);
56
60
  }
57
61
  return item;
@@ -143,7 +147,7 @@ var useColWidth = function useColWidth(_ref) {
143
147
  if (virtual) {
144
148
  setColWidths(getVirtualWidths());
145
149
  } else {
146
- // 当第一行有内容时并且没有重新设置列宽时,在去设置列宽
150
+ // 当第一行有内容时并且没有重新设置列宽时,再去设置列宽
147
151
  // Warning hasResetWidths.current 作用是防止某些浏览器下,下面逻辑死循环
148
152
  if ((measureRowElement === null || measureRowElement === void 0 ? void 0 : measureRowElement.childNodes) && hasResetWidths.current === false) {
149
153
  hasResetWidths.current = true;
@@ -161,8 +165,8 @@ var useColWidth = function useColWidth(_ref) {
161
165
  var _React$useState2 = React__default.useState(null),
162
166
  headerTableElement = _React$useState2[0],
163
167
  setHeaderTableElement = _React$useState2[1];
164
- // 控制列最小可调整宽度
165
- var _React$useState3 = React__default.useState([]),
168
+ // 控制列最小可调整宽度,主要用于可拖拽调节列宽的场景,目前表头分组还不支持该功能
169
+ var _React$useState3 = React__default.useState(getGroupItemWidth(columns).minColWidths),
166
170
  minColWidths = _React$useState3[0],
167
171
  setMinColWidths = _React$useState3[1];
168
172
  // 当列变化时同步更新 minColWidths
@@ -170,17 +174,26 @@ var useColWidth = function useColWidth(_ref) {
170
174
  var resizeObserver;
171
175
  if (headerTableElement) {
172
176
  resizeObserver = new ResizeObserver(function () {
173
- var resizableHandlerWidth = 4;
174
177
  var calcMinColWidths = Array.from(headerTableElement.childNodes).map(function (th, index) {
175
- var minColWidth = getGroupItemWidth(columns).minColWidths[index];
178
+ var _a;
179
+ var _getGroupItemWidth2 = getGroupItemWidth(columns),
180
+ colWidths = _getGroupItemWidth2.colWidths,
181
+ minColWidths = _getGroupItemWidth2.minColWidths;
182
+ var colWidth = colWidths[index];
183
+ var minColWidth = minColWidths[index];
184
+ // 如果设置了最小宽度,则直接使用最小宽度
185
+ if (minColWidth !== undefined && minColWidth !== 0) {
186
+ return minColWidth;
187
+ }
176
188
  var thPaddingLeft = parseFloat(window.getComputedStyle(th).getPropertyValue('padding-left'));
177
- var childNodes = Array.from(th.childNodes);
178
- var childNodesWidth = childNodes.map(function (child) {
179
- return child.offsetWidth;
180
- }).reduce(function (prev, next) {
181
- return prev + next;
182
- }, 0) + thPaddingLeft * 2 + resizableHandlerWidth;
183
- return childNodesWidth > minColWidth ? minColWidth : childNodesWidth;
189
+ var childNode = Array.from(th.childNodes)[0];
190
+ // 计算真实标题内容宽度
191
+ var childNodeWidth = ((_a = childNode) === null || _a === void 0 ? void 0 : _a.offsetWidth) + thPaddingLeft * 2;
192
+ // 如果设置的标题宽度小于真实内容宽度,则使用设置的宽度,否则使用真实内容宽度
193
+ if (colWidth && colWidth < childNodeWidth) {
194
+ return colWidth;
195
+ }
196
+ return childNodeWidth || 40;
184
197
  });
185
198
  setMinColWidths(calcMinColWidths);
186
199
  });
@@ -192,25 +205,6 @@ var useColWidth = function useColWidth(_ref) {
192
205
  resizeObserver === null || resizeObserver === void 0 ? void 0 : resizeObserver.disconnect();
193
206
  };
194
207
  }, [columns, columns.length, headerTableElement, resizable]);
195
- /**
196
- * 控制列最小可调整宽度
197
- */
198
- React__default.useMemo(function () {
199
- if (resizable && headerTableElement) {
200
- var resizableHandlerWidth = 4;
201
- var _minColWidth = Array.from(headerTableElement.childNodes).map(function (th) {
202
- var thPaddingLeft = parseFloat(window.getComputedStyle(th).getPropertyValue('padding-left'));
203
- var childNodes = Array.from(th.childNodes);
204
- return childNodes.map(function (child) {
205
- return child.offsetWidth;
206
- }).reduce(function (prev, next) {
207
- return prev + next;
208
- }) + thPaddingLeft * 2 + resizableHandlerWidth;
209
- });
210
- return _minColWidth;
211
- }
212
- return Array(columns.length).fill(0);
213
- }, [columns.length, headerTableElement, resizable]);
214
208
  /**
215
209
  * 列宽拖拽 resize,只处理拖拽线两边的列宽度
216
210
  */
@@ -237,15 +231,15 @@ var useColWidth = function useColWidth(_ref) {
237
231
  }, [minColWidths, tableWidthAdjustOnResize]);
238
232
  var getColgroupProps = React__default.useCallback(function (column, index) {
239
233
  var width = colWidths[index] || undefined;
240
- var minWidth = minColWidths[index] || undefined;
234
+ // const minWidth = minColWidths[index] || undefined
241
235
  return {
242
236
  style: {
243
- width: width,
244
- minWidth: minWidth || width
237
+ width: width
238
+ // minWidth: minWidth || width,
245
239
  }
246
240
  // 'data-hover-highlight': setAttrStatus(isHoveredCol(column.dataKey)),
247
241
  };
248
- }, [colWidths, minColWidths]);
242
+ }, [colWidths]);
249
243
  return {
250
244
  measureRowElementRef: measureRowElementRef,
251
245
  onColumnResizable: onColumnResizable,
@@ -30,7 +30,7 @@ var useColumns = function useColumns(_ref) {
30
30
  // TODO: remove it
31
31
  dataKey: raw.dataKey,
32
32
  title: raw.title,
33
- align: (_a = raw.align) !== null && _a !== void 0 ? _a : 'left',
33
+ align: (_a = raw.align) !== null && _a !== void 0 ? _a : 'start',
34
34
  render: raw.render,
35
35
  colSpan: raw.colSpan
36
36
  });
@@ -383,7 +383,12 @@ function RawList(props, ref) {
383
383
  useLayoutEffect(function () {
384
384
  if (onVisibleChange) {
385
385
  var renderList = mergedData.slice(start, end + 1);
386
- onVisibleChange(renderList, mergedData);
386
+ onVisibleChange(renderList, mergedData, {
387
+ start: start,
388
+ end: end,
389
+ scrollTop: scrollTop,
390
+ heights: heights
391
+ });
387
392
  }
388
393
  }, [start, end, mergedData]); // ================================ Render ================================
389
394
 
@@ -60,6 +60,17 @@ function _iterableToArrayLimit(arr, i) {
60
60
  function _arrayWithHoles(arr) {
61
61
  if (Array.isArray(arr)) return arr;
62
62
  }
63
+
64
+ /**
65
+ * To get exact height to avoid scrolling deviation
66
+ */
67
+ function getOuterHeight(el) {
68
+ var height = el.offsetHeight;
69
+ var computedStyle = window.getComputedStyle(el);
70
+ height += parseInt(computedStyle.marginTop, 10);
71
+ height += parseInt(computedStyle.marginBottom, 10);
72
+ return height;
73
+ }
63
74
  function useHeights(getKey, onItemAdd, onItemRemove) {
64
75
  var _React$useState = React.useState(0),
65
76
  _React$useState2 = _slicedToArray(_React$useState, 2),
@@ -77,9 +88,9 @@ function useHeights(getKey, onItemAdd, onItemRemove) {
77
88
  instanceRef.current.forEach(function (element, key) {
78
89
  if (element && element.offsetParent) {
79
90
  var htmlElement = findDOMNode(element);
80
- var offsetHeight = htmlElement.offsetHeight;
81
- if (heightsRef.current.get(key) !== offsetHeight) {
82
- heightsRef.current.set(key, htmlElement.offsetHeight);
91
+ var outerHeight = getOuterHeight(htmlElement);
92
+ if (heightsRef.current.get(key) !== outerHeight) {
93
+ heightsRef.current.set(key, outerHeight);
83
94
  }
84
95
  }
85
96
  }); // Always trigger update mark to tell parent that should re-calculate heights when resized