@hi-ui/table 4.2.0 → 4.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.
- package/CHANGELOG.md +26 -0
- package/lib/cjs/BaseTable.js +127 -71
- package/lib/cjs/ColGroupContent.js +56 -0
- package/lib/cjs/Table.js +14 -3
- package/lib/cjs/TableBody.js +22 -75
- package/lib/cjs/TableHeader.js +5 -71
- package/lib/cjs/TbodyContent.js +129 -0
- package/lib/cjs/TheadContent.js +120 -0
- package/lib/cjs/hooks/use-col-width.js +27 -22
- package/lib/cjs/node_modules/perfect-scrollbar/dist/perfect-scrollbar.esm.js +1286 -0
- package/lib/cjs/packages/hooks/use-merge-refs/lib/esm/index.js +76 -0
- package/lib/cjs/packages/ui/scrollbar/lib/esm/Scrollbar.js +185 -0
- package/lib/cjs/packages/ui/scrollbar/lib/esm/styles/index.scss.js +42 -0
- package/lib/cjs/packages/ui/scrollbar/lib/esm/utils/index.js +81 -0
- package/lib/cjs/styles/index.scss.js +1 -1
- package/lib/cjs/use-table.js +39 -23
- package/lib/esm/BaseTable.js +124 -71
- package/lib/esm/ColGroupContent.js +37 -0
- package/lib/esm/Table.js +14 -3
- package/lib/esm/TableBody.js +19 -75
- package/lib/esm/TableHeader.js +5 -69
- package/lib/esm/TbodyContent.js +105 -0
- package/lib/esm/TheadContent.js +96 -0
- package/lib/esm/hooks/use-col-width.js +27 -22
- package/lib/esm/node_modules/perfect-scrollbar/dist/perfect-scrollbar.esm.js +1281 -0
- package/lib/esm/packages/hooks/use-merge-refs/lib/esm/index.js +68 -0
- package/lib/esm/packages/ui/scrollbar/lib/esm/Scrollbar.js +162 -0
- package/lib/esm/packages/ui/scrollbar/lib/esm/styles/index.scss.js +25 -0
- package/lib/esm/packages/ui/scrollbar/lib/esm/utils/index.js +76 -0
- package/lib/esm/styles/index.scss.js +1 -1
- package/lib/esm/use-table.js +33 -17
- package/lib/types/BaseTable.d.ts +4 -0
- package/lib/types/ColGroupContent.d.ts +8 -0
- package/lib/types/TbodyContent.d.ts +18 -0
- package/lib/types/TheadContent.d.ts +9 -0
- package/lib/types/context.d.ts +14 -8
- package/lib/types/hooks/use-col-width.d.ts +1 -1
- package/lib/types/use-table.d.ts +18 -6
- package/package.json +6 -6
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/** @LICENSE
|
|
2
|
+
* @hi-ui/table
|
|
3
|
+
* https://github.com/XiaoMi/hiui/tree/master/packages/ui/table#readme
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) HiUI <mi-hiui@xiaomi.com>.
|
|
6
|
+
*
|
|
7
|
+
* This source code is licensed under the MIT license found in the
|
|
8
|
+
* LICENSE file in the root directory of this source tree.
|
|
9
|
+
*/
|
|
10
|
+
'use strict';
|
|
11
|
+
|
|
12
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
13
|
+
|
|
14
|
+
Object.defineProperty(exports, '__esModule', {
|
|
15
|
+
value: true
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
var React = require('react');
|
|
19
|
+
|
|
20
|
+
var classname = require('@hi-ui/classname');
|
|
21
|
+
|
|
22
|
+
var env = require('@hi-ui/env');
|
|
23
|
+
|
|
24
|
+
var useLatest = require('@hi-ui/use-latest');
|
|
25
|
+
|
|
26
|
+
var typeAssertion = require('@hi-ui/type-assertion');
|
|
27
|
+
|
|
28
|
+
var emptyState = require('@hi-ui/empty-state');
|
|
29
|
+
|
|
30
|
+
var TableRow = require('./TableRow.js');
|
|
31
|
+
|
|
32
|
+
var context = require('./context.js');
|
|
33
|
+
|
|
34
|
+
function _interopDefaultLegacy(e) {
|
|
35
|
+
return e && _typeof(e) === 'object' && 'default' in e ? e : {
|
|
36
|
+
'default': e
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
|
|
41
|
+
|
|
42
|
+
var _prefix = classname.getPrefixCls('table-body');
|
|
43
|
+
|
|
44
|
+
var TbodyContent = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
|
|
45
|
+
var _ref$prefixCls = _ref.prefixCls,
|
|
46
|
+
prefixCls = _ref$prefixCls === void 0 ? _prefix : _ref$prefixCls,
|
|
47
|
+
emptyContent = _ref.emptyContent;
|
|
48
|
+
|
|
49
|
+
var _useTableContext = context.useTableContext(),
|
|
50
|
+
columns = _useTableContext.columns,
|
|
51
|
+
isExpandTreeRows = _useTableContext.isExpandTreeRows,
|
|
52
|
+
transitionData = _useTableContext.transitionData,
|
|
53
|
+
scrollBodyElementRef = _useTableContext.scrollBodyElementRef,
|
|
54
|
+
hasAvgColumn = _useTableContext.hasAvgColumn,
|
|
55
|
+
avgRow = _useTableContext.avgRow,
|
|
56
|
+
hasSumColumn = _useTableContext.hasSumColumn,
|
|
57
|
+
sumRow = _useTableContext.sumRow,
|
|
58
|
+
measureRowElementRef = _useTableContext.measureRowElementRef;
|
|
59
|
+
|
|
60
|
+
var getRequiredProps = useLatest.useLatestCallback(function (id) {
|
|
61
|
+
return {
|
|
62
|
+
// @ts-ignore
|
|
63
|
+
expandedTree: isExpandTreeRows(id) // checked: isCheckedId(id),
|
|
64
|
+
// semiChecked: isSemiCheckedId(id),
|
|
65
|
+
// selected: selectedId === id,
|
|
66
|
+
// loading: isLoadingId(id),
|
|
67
|
+
// focused: focusedId === id,
|
|
68
|
+
|
|
69
|
+
};
|
|
70
|
+
}); // 外层增加 div 作为滚动容器
|
|
71
|
+
|
|
72
|
+
return /*#__PURE__*/React__default["default"].createElement("tbody", null, typeAssertion.isArrayNonEmpty(transitionData) ? /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, transitionData.map(function (row, index) {
|
|
73
|
+
return /*#__PURE__*/React__default["default"].createElement(TableRow.TableRow, Object.assign({
|
|
74
|
+
ref: index === 0 ? measureRowElementRef : null,
|
|
75
|
+
// key={depth + index}
|
|
76
|
+
key: row.id,
|
|
77
|
+
// @ts-ignore
|
|
78
|
+
rowIndex: index,
|
|
79
|
+
rowData: row
|
|
80
|
+
}, getRequiredProps(row.id)));
|
|
81
|
+
}), hasSumColumn ? /*#__PURE__*/React__default["default"].createElement(TableRow.TableRow, {
|
|
82
|
+
key: sumRow.id,
|
|
83
|
+
rowIndex: transitionData.length,
|
|
84
|
+
rowData: sumRow,
|
|
85
|
+
isSumRow: true
|
|
86
|
+
}) : null, hasAvgColumn ? /*#__PURE__*/React__default["default"].createElement(TableRow.TableRow, {
|
|
87
|
+
key: avgRow.id,
|
|
88
|
+
rowIndex: transitionData.length + 1,
|
|
89
|
+
rowData: avgRow,
|
|
90
|
+
isAvgRow: true
|
|
91
|
+
}) : null) : // 空状态,colSpan 占满表格整行
|
|
92
|
+
renderEmptyContent(Object.assign({
|
|
93
|
+
className: prefixCls + "-empty-content",
|
|
94
|
+
colSpan: columns.length,
|
|
95
|
+
emptyContent: emptyContent
|
|
96
|
+
}, scrollBodyElementRef.current ? {
|
|
97
|
+
scrollBodyWidth: window.getComputedStyle(scrollBodyElementRef.current).getPropertyValue('width')
|
|
98
|
+
} : {})));
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
if (env.__DEV__) {
|
|
102
|
+
TbodyContent.displayName = 'TbodyContent';
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* 负责空状态渲染
|
|
106
|
+
*/
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
var renderEmptyContent = function renderEmptyContent(_ref2) {
|
|
110
|
+
var className = _ref2.className,
|
|
111
|
+
colSpan = _ref2.colSpan,
|
|
112
|
+
emptyContent = _ref2.emptyContent,
|
|
113
|
+
scrollBodyWidth = _ref2.scrollBodyWidth;
|
|
114
|
+
return /*#__PURE__*/React__default["default"].createElement("tr", {
|
|
115
|
+
className: className
|
|
116
|
+
}, /*#__PURE__*/React__default["default"].createElement("td", {
|
|
117
|
+
colSpan: colSpan
|
|
118
|
+
}, /*#__PURE__*/React__default["default"].createElement("div", {
|
|
119
|
+
style: {
|
|
120
|
+
position: 'sticky',
|
|
121
|
+
left: 0,
|
|
122
|
+
width: scrollBodyWidth !== null && scrollBodyWidth !== void 0 ? scrollBodyWidth : '100%',
|
|
123
|
+
overflow: 'hidden'
|
|
124
|
+
}
|
|
125
|
+
}, emptyContent || /*#__PURE__*/React__default["default"].createElement(emptyState.EmptyState, null))));
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
exports.TbodyContent = TbodyContent;
|
|
129
|
+
exports.renderEmptyContent = renderEmptyContent;
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/** @LICENSE
|
|
2
|
+
* @hi-ui/table
|
|
3
|
+
* https://github.com/XiaoMi/hiui/tree/master/packages/ui/table#readme
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) HiUI <mi-hiui@xiaomi.com>.
|
|
6
|
+
*
|
|
7
|
+
* This source code is licensed under the MIT license found in the
|
|
8
|
+
* LICENSE file in the root directory of this source tree.
|
|
9
|
+
*/
|
|
10
|
+
'use strict';
|
|
11
|
+
|
|
12
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
13
|
+
|
|
14
|
+
Object.defineProperty(exports, '__esModule', {
|
|
15
|
+
value: true
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
var tslib = require('tslib');
|
|
19
|
+
|
|
20
|
+
var React = require('react');
|
|
21
|
+
|
|
22
|
+
var reactResizable = require('react-resizable');
|
|
23
|
+
|
|
24
|
+
var classname = require('@hi-ui/classname');
|
|
25
|
+
|
|
26
|
+
var env = require('@hi-ui/env');
|
|
27
|
+
|
|
28
|
+
var typeAssertion = require('@hi-ui/type-assertion');
|
|
29
|
+
|
|
30
|
+
var useCheckState = require('@hi-ui/use-check-state');
|
|
31
|
+
|
|
32
|
+
var context = require('./context.js');
|
|
33
|
+
|
|
34
|
+
var TableAdvancedFilter = require('./TableAdvancedFilter.js');
|
|
35
|
+
|
|
36
|
+
function _interopDefaultLegacy(e) {
|
|
37
|
+
return e && _typeof(e) === 'object' && 'default' in e ? e : {
|
|
38
|
+
'default': e
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
|
|
43
|
+
|
|
44
|
+
var _prefix = classname.getPrefixCls('table-header');
|
|
45
|
+
|
|
46
|
+
var TheadContent = /*#__PURE__*/React.forwardRef(function (_a, ref) {
|
|
47
|
+
var _a$prefixCls = _a.prefixCls,
|
|
48
|
+
prefixCls = _a$prefixCls === void 0 ? _prefix : _a$prefixCls,
|
|
49
|
+
rest = tslib.__rest(_a, ["prefixCls"]);
|
|
50
|
+
|
|
51
|
+
var _useTableContext = context.useTableContext(),
|
|
52
|
+
groupedColumns = _useTableContext.groupedColumns,
|
|
53
|
+
resizable = _useTableContext.resizable,
|
|
54
|
+
colWidths = _useTableContext.colWidths,
|
|
55
|
+
isHoveredHighlightCol = _useTableContext.isHoveredHighlightCol,
|
|
56
|
+
isHighlightedCol = _useTableContext.isHighlightedCol,
|
|
57
|
+
onColumnResizable = _useTableContext.onColumnResizable,
|
|
58
|
+
getStickyColProps = _useTableContext.getStickyColProps,
|
|
59
|
+
showColMenu = _useTableContext.showColMenu,
|
|
60
|
+
setHeaderTableElement = _useTableContext.setHeaderTableElement;
|
|
61
|
+
|
|
62
|
+
var activeColumnKeysAction = useCheckState.useCheckState();
|
|
63
|
+
return /*#__PURE__*/React__default["default"].createElement("thead", Object.assign({}, rest), groupedColumns.map(function (cols, colsIndex) {
|
|
64
|
+
return /*#__PURE__*/React__default["default"].createElement("tr", {
|
|
65
|
+
key: colsIndex,
|
|
66
|
+
ref: setHeaderTableElement
|
|
67
|
+
}, cols.map(function (col, colIndex) {
|
|
68
|
+
var _ref = col || {},
|
|
69
|
+
dataKey = _ref.dataKey,
|
|
70
|
+
title = _ref.title,
|
|
71
|
+
raw = _ref.raw;
|
|
72
|
+
|
|
73
|
+
var titleContent = typeAssertion.isFunction(title) ? title(col) : title;
|
|
74
|
+
titleContent = resizable ? /*#__PURE__*/React__default["default"].createElement("span", {
|
|
75
|
+
className: prefixCls + "-header__title"
|
|
76
|
+
}, titleContent) : titleContent;
|
|
77
|
+
var cell = /*#__PURE__*/React__default["default"].createElement("th", Object.assign({
|
|
78
|
+
key: dataKey
|
|
79
|
+
}, getStickyColProps(col), {
|
|
80
|
+
className: classname.cx(prefixCls + "-cell", raw.className, isHighlightedCol(dataKey) && prefixCls + "-cell__col--highlight", isHoveredHighlightCol(dataKey) && prefixCls + "-cell__col--hovered-highlight", activeColumnKeysAction.has(dataKey) && prefixCls + "-cell__col--active"),
|
|
81
|
+
// @ts-ignore
|
|
82
|
+
colSpan: col.colSpan,
|
|
83
|
+
// @ts-ignore
|
|
84
|
+
rowSpan: col.rowSpan
|
|
85
|
+
}), titleContent, TableAdvancedFilter.renderFilter({
|
|
86
|
+
prefixCls: prefixCls + "-filter",
|
|
87
|
+
columnKey: dataKey,
|
|
88
|
+
showColMenu: showColMenu,
|
|
89
|
+
column: col,
|
|
90
|
+
onOpen: function onOpen() {
|
|
91
|
+
return activeColumnKeysAction.add(dataKey);
|
|
92
|
+
},
|
|
93
|
+
onClose: function onClose() {
|
|
94
|
+
return activeColumnKeysAction.remove(dataKey);
|
|
95
|
+
}
|
|
96
|
+
}));
|
|
97
|
+
return resizable && colIndex !== colWidths.length - 1 ? /*#__PURE__*/React__default["default"].createElement(reactResizable.Resizable, {
|
|
98
|
+
key: colIndex,
|
|
99
|
+
className: prefixCls + "__resizable",
|
|
100
|
+
draggableOpts: {
|
|
101
|
+
enableUserSelectHack: false
|
|
102
|
+
},
|
|
103
|
+
handle: /*#__PURE__*/React__default["default"].createElement("span", {
|
|
104
|
+
className: prefixCls + "__resizable-handle"
|
|
105
|
+
}),
|
|
106
|
+
height: 0,
|
|
107
|
+
width: colWidths[colIndex],
|
|
108
|
+
onResize: function onResize(evt, options) {
|
|
109
|
+
onColumnResizable(evt, options, colIndex);
|
|
110
|
+
}
|
|
111
|
+
}, cell) : cell;
|
|
112
|
+
}));
|
|
113
|
+
}));
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
if (env.__DEV__) {
|
|
117
|
+
TheadContent.displayName = 'TheadContent';
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
exports.TheadContent = TheadContent;
|
|
@@ -30,7 +30,8 @@ function _interopDefaultLegacy(e) {
|
|
|
30
30
|
var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
|
|
31
31
|
|
|
32
32
|
var useColWidth = function useColWidth(_ref) {
|
|
33
|
-
var
|
|
33
|
+
var resizable = _ref.resizable,
|
|
34
|
+
columns = _ref.columns,
|
|
34
35
|
virtual = _ref.virtual;
|
|
35
36
|
var measureRowElementRef = React__default["default"].useRef(null);
|
|
36
37
|
|
|
@@ -90,19 +91,17 @@ var useColWidth = function useColWidth(_ref) {
|
|
|
90
91
|
var _resizeObserver = new ResizeObserver(function () {
|
|
91
92
|
if (virtual) {
|
|
92
93
|
setColWidths(getVirtualWidths());
|
|
93
|
-
} else {
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
}
|
|
105
|
-
}
|
|
94
|
+
} // else {
|
|
95
|
+
// if (measureRowElement.childNodes) {
|
|
96
|
+
// const _realColumnsWidth = Array.from(measureRowElement.childNodes).map((node) => {
|
|
97
|
+
// return (node as HTMLElement).getBoundingClientRect().width || 0
|
|
98
|
+
// })
|
|
99
|
+
// if (_realColumnsWidth.some((width) => width && width > 0)) {
|
|
100
|
+
// setColWidths(_realColumnsWidth)
|
|
101
|
+
// }
|
|
102
|
+
// }
|
|
103
|
+
// }
|
|
104
|
+
|
|
106
105
|
});
|
|
107
106
|
|
|
108
107
|
_resizeObserver.observe(measureRowElement);
|
|
@@ -120,26 +119,32 @@ var useColWidth = function useColWidth(_ref) {
|
|
|
120
119
|
|
|
121
120
|
|
|
122
121
|
var minColWidth = React__default["default"].useMemo(function () {
|
|
123
|
-
if (
|
|
124
|
-
var
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
th.
|
|
122
|
+
if (resizable && headerTableElement) {
|
|
123
|
+
var resizableHandlerWidth = 4;
|
|
124
|
+
|
|
125
|
+
var _minColWidth = Array.from(headerTableElement.childNodes).map(function (th) {
|
|
126
|
+
var thPaddingLeft = parseFloat(window.getComputedStyle(th).getPropertyValue('padding-left'));
|
|
127
|
+
var childNodes = Array.from(th.childNodes);
|
|
128
|
+
return childNodes.map(function (child) {
|
|
129
|
+
return child.offsetWidth;
|
|
130
|
+
}).reduce(function (prev, next) {
|
|
131
|
+
return prev + next;
|
|
132
|
+
}) + thPaddingLeft * 2 + resizableHandlerWidth;
|
|
128
133
|
});
|
|
129
134
|
|
|
130
135
|
return _minColWidth;
|
|
131
136
|
}
|
|
132
137
|
|
|
133
138
|
return Array(columns.length).fill(0);
|
|
134
|
-
}, [columns, headerTableElement]);
|
|
139
|
+
}, [columns.length, headerTableElement, resizable]);
|
|
135
140
|
/**
|
|
136
141
|
* 列宽拖拽 resize,只处理拖拽线两边的列宽度
|
|
137
142
|
*/
|
|
138
143
|
|
|
139
144
|
var onColumnResizable = React__default["default"].useCallback(function (_, _ref2, index) {
|
|
140
145
|
var size = _ref2.size;
|
|
141
|
-
var minWidth = minColWidth[index]
|
|
142
|
-
var anotherMinWidth = minColWidth[index + 1]
|
|
146
|
+
var minWidth = minColWidth[index];
|
|
147
|
+
var anotherMinWidth = minColWidth[index + 1];
|
|
143
148
|
var nextWidth = size.width > minWidth ? size.width : minWidth;
|
|
144
149
|
setColWidths(function (prev) {
|
|
145
150
|
var nextColWidths = [].concat(prev);
|