@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.
Files changed (39) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/lib/cjs/BaseTable.js +127 -71
  3. package/lib/cjs/ColGroupContent.js +56 -0
  4. package/lib/cjs/Table.js +14 -3
  5. package/lib/cjs/TableBody.js +22 -75
  6. package/lib/cjs/TableHeader.js +5 -71
  7. package/lib/cjs/TbodyContent.js +129 -0
  8. package/lib/cjs/TheadContent.js +120 -0
  9. package/lib/cjs/hooks/use-col-width.js +27 -22
  10. package/lib/cjs/node_modules/perfect-scrollbar/dist/perfect-scrollbar.esm.js +1286 -0
  11. package/lib/cjs/packages/hooks/use-merge-refs/lib/esm/index.js +76 -0
  12. package/lib/cjs/packages/ui/scrollbar/lib/esm/Scrollbar.js +185 -0
  13. package/lib/cjs/packages/ui/scrollbar/lib/esm/styles/index.scss.js +42 -0
  14. package/lib/cjs/packages/ui/scrollbar/lib/esm/utils/index.js +81 -0
  15. package/lib/cjs/styles/index.scss.js +1 -1
  16. package/lib/cjs/use-table.js +39 -23
  17. package/lib/esm/BaseTable.js +124 -71
  18. package/lib/esm/ColGroupContent.js +37 -0
  19. package/lib/esm/Table.js +14 -3
  20. package/lib/esm/TableBody.js +19 -75
  21. package/lib/esm/TableHeader.js +5 -69
  22. package/lib/esm/TbodyContent.js +105 -0
  23. package/lib/esm/TheadContent.js +96 -0
  24. package/lib/esm/hooks/use-col-width.js +27 -22
  25. package/lib/esm/node_modules/perfect-scrollbar/dist/perfect-scrollbar.esm.js +1281 -0
  26. package/lib/esm/packages/hooks/use-merge-refs/lib/esm/index.js +68 -0
  27. package/lib/esm/packages/ui/scrollbar/lib/esm/Scrollbar.js +162 -0
  28. package/lib/esm/packages/ui/scrollbar/lib/esm/styles/index.scss.js +25 -0
  29. package/lib/esm/packages/ui/scrollbar/lib/esm/utils/index.js +76 -0
  30. package/lib/esm/styles/index.scss.js +1 -1
  31. package/lib/esm/use-table.js +33 -17
  32. package/lib/types/BaseTable.d.ts +4 -0
  33. package/lib/types/ColGroupContent.d.ts +8 -0
  34. package/lib/types/TbodyContent.d.ts +18 -0
  35. package/lib/types/TheadContent.d.ts +9 -0
  36. package/lib/types/context.d.ts +14 -8
  37. package/lib/types/hooks/use-col-width.d.ts +1 -1
  38. package/lib/types/use-table.d.ts +18 -6
  39. 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 columns = _ref.columns,
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
- if (measureRowElement.childNodes) {
95
- var _realColumnsWidth = Array.from(measureRowElement.childNodes).map(function (node) {
96
- return node.getBoundingClientRect().width || 0;
97
- });
98
-
99
- if (_realColumnsWidth.some(function (width) {
100
- return width && width > 0;
101
- })) {
102
- setColWidths(_realColumnsWidth);
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 (headerTableElement && headerTableElement.childNodes && headerTableElement.childNodes[1].childNodes[0]) {
124
- var _minColWidth = Array.from(headerTableElement.childNodes[1].childNodes[0].childNodes).map(function (th) {
125
- // @ts-ignore
126
- return th.childNodes[0].className === 'hi-table__header__title' ? // @ts-ignore
127
- th.childNodes[0].offsetWidth : 0;
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] + 31;
142
- var anotherMinWidth = minColWidth[index + 1] + 31;
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);