@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.
- package/CHANGELOG.md +17 -0
- package/lib/cjs/BaseTable.js +47 -27
- package/lib/cjs/Table.js +9 -2
- package/lib/cjs/TableCell.js +2 -2
- package/lib/cjs/TbodyContent.js +20 -11
- package/lib/cjs/TheadContent.js +12 -3
- package/lib/cjs/hooks/use-col-width.js +34 -40
- package/lib/cjs/hooks/use-colgroup.js +1 -1
- package/lib/cjs/node_modules/rc-virtual-list/es/List.js +6 -1
- package/lib/cjs/node_modules/rc-virtual-list/es/hooks/useHeights.js +14 -3
- package/lib/cjs/styles/index.scss.js +1 -1
- package/lib/cjs/use-table.js +9 -6
- package/lib/cjs/utils/index.js +29 -10
- package/lib/esm/BaseTable.js +48 -28
- package/lib/esm/Table.js +9 -2
- package/lib/esm/TableCell.js +2 -2
- package/lib/esm/TbodyContent.js +20 -11
- package/lib/esm/TheadContent.js +13 -4
- package/lib/esm/hooks/use-col-width.js +33 -39
- package/lib/esm/hooks/use-colgroup.js +1 -1
- package/lib/esm/node_modules/rc-virtual-list/es/List.js +6 -1
- package/lib/esm/node_modules/rc-virtual-list/es/hooks/useHeights.js +14 -3
- package/lib/esm/styles/index.scss.js +3 -3
- package/lib/esm/use-table.js +9 -6
- package/lib/esm/utils/index.js +29 -11
- package/lib/types/context.d.ts +2 -4
- package/lib/types/hooks/use-col-width.d.ts +0 -1
- package/lib/types/use-table.d.ts +2 -2
- package/lib/types/utils/index.d.ts +2 -0
- package/package.json +2 -2
- package/lib/esm/packages/others/style-inject/lib/esm/index.js +0 -30
package/lib/cjs/use-table.js
CHANGED
|
@@ -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.
|
|
482
|
-
style.
|
|
483
|
-
// the value is same with
|
|
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
|
-
|
|
497
|
+
insetBlockStart: sticky ? stickyTop : undefined,
|
|
495
498
|
overflow: 'hidden',
|
|
496
499
|
zIndex: sticky ? 10 : undefined
|
|
497
500
|
};
|
package/lib/cjs/utils/index.js
CHANGED
|
@@ -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 (
|
|
73
|
-
var children =
|
|
74
|
-
width =
|
|
75
|
-
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) :
|
|
83
|
-
colWidths.push(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(
|
|
153
|
-
var key =
|
|
154
|
-
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;
|
package/lib/esm/BaseTable.js
CHANGED
|
@@ -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
|
-
|
|
137
|
-
|
|
138
|
-
|
|
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
|
-
|
|
166
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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'
|
|
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,
|
package/lib/esm/TableCell.js
CHANGED
|
@@ -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 特别消耗性能
|
package/lib/esm/TbodyContent.js
CHANGED
|
@@ -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,
|
|
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)));
|
package/lib/esm/TheadContent.js
CHANGED
|
@@ -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:
|
|
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 =
|
|
41
|
+
var _ref2 = (_a = flattedColumnsWithoutChildren[index]) !== null && _a !== void 0 ? _a : {},
|
|
38
42
|
fixed = _ref2.fixed;
|
|
39
|
-
var width =
|
|
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 =
|
|
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 =
|
|
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
|
|
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
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
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
|
-
|
|
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
|
|
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 : '
|
|
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
|
|
81
|
-
if (heightsRef.current.get(key) !==
|
|
82
|
-
heightsRef.current.set(key,
|
|
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
|