@aloudata/aloudata-design 0.2.0-beta.13 → 0.2.0-beta.14

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.
@@ -1,4 +1,4 @@
1
- import { ReactElement } from 'react';
1
+ import React from 'react';
2
2
  import { ITableProps } from './interface';
3
- declare function Table<T extends Record<string, unknown>>({ columns, data, total, renderHeaderLeft, renderHeaderRight, onRowSelected, loadMore, hasNextPage, loading, sortable, defaultSort, resizeColumn, sortDirections: allSortDirections, showHeader, onChange, }: ITableProps<T>): ReactElement;
4
- export default Table;
3
+ declare const _default: React.ForwardRefExoticComponent<Pick<ITableProps<Record<string, unknown>>, "onChange" | "loading" | "data" | "columns" | "total" | "renderHeaderLeft" | "renderHeaderRight" | "onRowSelected" | "loadMore" | "hasNextPage" | "sortable" | "defaultSort" | "resizeColumn" | "sortDirections" | "showHeader" | "innerScroll"> & React.RefAttributes<unknown>>;
4
+ export default _default;
package/es/Table/index.js CHANGED
@@ -26,19 +26,17 @@ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
26
26
  /// <reference types ='./react-table-config' />
27
27
  import _ from 'lodash';
28
28
  import classnames from 'classnames';
29
- import Empty from '../Empty';
30
29
  import Icon from '../Icon';
31
- import InfiniteLoader from 'react-window-infinite-loader';
32
30
  import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
33
31
  import usePrefixCls from '../_utils/hooks/usePrefixCls';
34
- import { FixedSizeList } from 'react-window';
32
+ import InfiniteScroll from 'react-infinite-scroll-component';
33
+ import Empty from '../Empty';
35
34
  import { useTable, useBlockLayout, useRowSelect, useSortBy, useResizeColumns } from 'react-table';
36
- var DEFAULT_ROW_HEIGHT = 40;
37
35
  var ARRAY_FIRST_INDEX = 0;
38
36
  var DEFAULT_ROW_WIDTH = 0;
39
37
  var DEFAULT_BODY_HEIGHT = 0;
40
38
 
41
- function Table(_ref) {
39
+ function Table(_ref, ref) {
42
40
  var columns = _ref.columns,
43
41
  data = _ref.data,
44
42
  total = _ref.total,
@@ -46,8 +44,8 @@ function Table(_ref) {
46
44
  renderHeaderRight = _ref.renderHeaderRight,
47
45
  onRowSelected = _ref.onRowSelected,
48
46
  loadMore = _ref.loadMore,
49
- hasNextPage = _ref.hasNextPage,
50
47
  loading = _ref.loading,
48
+ hasNextPage = _ref.hasNextPage,
51
49
  _ref$sortable = _ref.sortable,
52
50
  sortable = _ref$sortable === void 0 ? false : _ref$sortable,
53
51
  defaultSort = _ref.defaultSort,
@@ -57,28 +55,64 @@ function Table(_ref) {
57
55
  _ref$showHeader = _ref.showHeader,
58
56
  showHeader = _ref$showHeader === void 0 ? true : _ref$showHeader,
59
57
  _ref$onChange = _ref.onChange,
60
- onChange = _ref$onChange === void 0 ? function () {} : _ref$onChange;
58
+ onChange = _ref$onChange === void 0 ? function () {} : _ref$onChange,
59
+ _ref$innerScroll = _ref.innerScroll,
60
+ innerScroll = _ref$innerScroll === void 0 ? false : _ref$innerScroll;
61
61
 
62
62
  var _React$useState = React.useState(null),
63
63
  _React$useState2 = _slicedToArray(_React$useState, 2),
64
64
  selectedRowId = _React$useState2[0],
65
65
  setSelectedRowId = _React$useState2[1];
66
66
 
67
- var tableBodyRef = useRef(null);
67
+ var tableBodyListRef = useRef(null);
68
+ var tableRef = useRef(null);
68
69
 
69
70
  var _useState = useState(DEFAULT_BODY_HEIGHT),
70
71
  _useState2 = _slicedToArray(_useState, 2),
71
- bodyClientHeight = _useState2[0],
72
- setBodyClientHeight = _useState2[1];
72
+ tableClientWidth = _useState2[0],
73
+ setTableClientWidth = _useState2[1];
73
74
 
75
+ var RANDOM_ID = "INNER_SCROLL_ID_".concat(Math.random());
74
76
  useEffect(function () {
75
- if (tableBodyRef.current) {
76
- setBodyClientHeight(tableBodyRef.current.clientHeight);
77
+ if (tableRef.current) {
78
+ setTableClientWidth(tableRef.current.clientWidth);
77
79
  }
78
80
  }, []);
81
+ var initialColumnsWidthMap = useMemo(function () {
82
+ var map = new Map();
83
+
84
+ if (tableClientWidth !== DEFAULT_BODY_HEIGHT) {
85
+ var noGivenColumns = 0;
86
+ var givenColumnsTotalWidth = 0;
87
+ columns.forEach(function (column) {
88
+ if (column.width) {
89
+ map.set(column.dataIndex, column.width);
90
+ givenColumnsTotalWidth += column.width;
91
+ } else {
92
+ noGivenColumns += 1;
93
+ }
94
+ });
95
+ var averageWidth = (tableClientWidth - givenColumnsTotalWidth) / noGivenColumns;
96
+ return {
97
+ columnMap: map,
98
+ averageWidth: averageWidth
99
+ };
100
+ }
101
+
102
+ columns.forEach(function (column) {
103
+ if (column.width) {
104
+ map.set(column.dataIndex, column.width);
105
+ }
106
+ });
107
+ return {
108
+ columnMap: map,
109
+ averageWidth: DEFAULT_ROW_WIDTH
110
+ };
111
+ }, [columns, tableClientWidth]);
79
112
  var newColumns = useMemo(function () {
80
113
  return columns.map(function (column) {
81
114
  return _objectSpread(_objectSpread({}, column), {}, {
115
+ width: initialColumnsWidthMap.columnMap.get(column.dataIndex) || initialColumnsWidthMap.averageWidth,
82
116
  Header: column.title,
83
117
  disableSortBy: !sortable || typeof column.sorter === 'boolean',
84
118
  accessor: column.dataIndex,
@@ -89,7 +123,7 @@ function Table(_ref) {
89
123
  }
90
124
  });
91
125
  });
92
- }, [columns, sortable]);
126
+ }, [columns, sortable, initialColumnsWidthMap]);
93
127
 
94
128
  var getInitialSortDirection = function getInitialSortDirection() {
95
129
  if (defaultSort && defaultSort.id) {
@@ -144,7 +178,8 @@ function Table(_ref) {
144
178
  headerGroups = _useTable.headerGroups,
145
179
  rows = _useTable.rows,
146
180
  prepareRow = _useTable.prepareRow,
147
- setSortBy = _useTable.setSortBy;
181
+ setSortBy = _useTable.setSortBy,
182
+ totalColumnsWidth = _useTable.totalColumnsWidth;
148
183
 
149
184
  var theadRowWidthRef = React.useRef(DEFAULT_ROW_WIDTH);
150
185
  var prefixCls = usePrefixCls('block-table');
@@ -156,48 +191,6 @@ function Table(_ref) {
156
191
  setSelectedRowId(row.id);
157
192
  onRowSelected(row.original);
158
193
  }, [onRowSelected]);
159
- var itemCount = hasNextPage ? data.length + 1 : data.length;
160
- var loadMoreItems = loading ? function () {} : loadMore;
161
-
162
- var isItemLoaded = function isItemLoaded(index) {
163
- return !hasNextPage || index < data.length;
164
- };
165
-
166
- var RenderRow = function RenderRow(_ref3) {
167
- var index = _ref3.index,
168
- style = _ref3.style;
169
-
170
- if (!isItemLoaded(index)) {
171
- return /*#__PURE__*/React.createElement("div", {
172
- style: style,
173
- className: classnames("".concat(prefixCls, "-loading"))
174
- }, /*#__PURE__*/React.createElement(Icon, {
175
- type: "waiting",
176
- size: 16
177
- }), "Loading");
178
- }
179
-
180
- var row = rows[index];
181
- prepareRow(row);
182
-
183
- var _row$getRowProps = row.getRowProps(),
184
- rowStyle = _row$getRowProps.style,
185
- rowProps = _objectWithoutProperties(_row$getRowProps, _excluded);
186
-
187
- return /*#__PURE__*/React.createElement("div", _objectSpread(_objectSpread({}, rowProps), {}, {
188
- style: _objectSpread(_objectSpread(_objectSpread({}, style), rowStyle), {}, {
189
- width: resizeColumn ? style === null || style === void 0 ? void 0 : style.width : '100%'
190
- }),
191
- className: classnames("".concat(prefixCls, "-row"), _defineProperty({}, "".concat(prefixCls, "-row-selected"), row.id === selectedRowId)),
192
- onClick: function onClick() {
193
- return onRowClick(row);
194
- }
195
- }), row.cells.map(function (cell) {
196
- return /*#__PURE__*/React.createElement("div", _objectSpread(_objectSpread({}, cell.getCellProps()), {}, {
197
- className: classnames("".concat(prefixCls, "-cell"))
198
- }), cell.render('Cell'));
199
- }));
200
- };
201
194
 
202
195
  var renderHeader = function renderHeader(len) {
203
196
  return /*#__PURE__*/React.createElement("div", {
@@ -289,8 +282,8 @@ function Table(_ref) {
289
282
  return column.getHeaderProps();
290
283
  };
291
284
 
292
- var SortIcons = function SortIcons(_ref4) {
293
- var id = _ref4.id;
285
+ var SortIcons = function SortIcons(_ref3) {
286
+ var id = _ref3.id;
294
287
  var currentSortId = sortDirection.id,
295
288
  desc = sortDirection.desc;
296
289
 
@@ -309,45 +302,79 @@ function Table(_ref) {
309
302
  });
310
303
  };
311
304
 
305
+ var scrollToTop = function scrollToTop() {
306
+ var INITIAL_OFFSET_TOP = 0;
307
+
308
+ if (tableBodyListRef && tableBodyListRef.current) {
309
+ tableBodyListRef.current.scrollTop = INITIAL_OFFSET_TOP;
310
+ }
311
+ };
312
+
313
+ React.useImperativeHandle(ref, function () {
314
+ return {
315
+ backToTop: function backToTop() {
316
+ scrollToTop();
317
+ }
318
+ };
319
+ });
320
+ var LoadingNode = /*#__PURE__*/React.createElement("div", {
321
+ className: classnames("".concat(prefixCls, "-loading"))
322
+ }, /*#__PURE__*/React.createElement(Icon, {
323
+ type: "waiting",
324
+ size: 16
325
+ }), "Loading");
326
+
312
327
  var renderTableBody = function renderTableBody() {
328
+ if (loading && !rows.length) {
329
+ return LoadingNode;
330
+ }
331
+
313
332
  if (!loading && !rows.length) {
314
333
  return /*#__PURE__*/React.createElement(Empty, {
315
334
  description: "\u5F53\u524D\u65E0\u6570\u636E"
316
335
  });
317
336
  }
318
337
 
319
- if (loadMore && typeof loadMore === 'function') {
320
- return /*#__PURE__*/React.createElement(InfiniteLoader, {
321
- isItemLoaded: isItemLoaded,
322
- itemCount: itemCount,
323
- loadMoreItems: loadMoreItems,
324
- threshold: 3
325
- }, function (_ref5) {
326
- var onItemsRendered = _ref5.onItemsRendered,
327
- ref = _ref5.ref;
328
- return /*#__PURE__*/React.createElement(FixedSizeList, {
329
- itemCount: itemCount,
330
- onItemsRendered: onItemsRendered,
331
- height: bodyClientHeight,
332
- itemSize: DEFAULT_ROW_HEIGHT,
333
- width: resizeColumn ? theadRowWidthRef.current : '100%',
334
- ref: ref,
335
- className: "".concat(prefixCls, "-list")
336
- }, RenderRow);
338
+ var renderRowList = function renderRowList() {
339
+ return data.map(function (item, index) {
340
+ var row = rows[index];
341
+ prepareRow(row);
342
+
343
+ var _row$getRowProps = row.getRowProps(),
344
+ rowStyle = _row$getRowProps.style,
345
+ rowProps = _objectWithoutProperties(_row$getRowProps, _excluded);
346
+
347
+ return /*#__PURE__*/React.createElement("div", _objectSpread(_objectSpread({}, rowProps), {}, {
348
+ style: _objectSpread({}, rowStyle),
349
+ className: classnames("".concat(prefixCls, "-row"), _defineProperty({}, "".concat(prefixCls, "-row-selected"), row.id === selectedRowId)),
350
+ onClick: function onClick() {
351
+ return onRowClick(row);
352
+ },
353
+ key: row.id
354
+ }), row.cells.map(function (cell) {
355
+ return /*#__PURE__*/React.createElement("div", _objectSpread(_objectSpread({}, cell.getCellProps()), {}, {
356
+ className: classnames("".concat(prefixCls, "-cell"))
357
+ }), cell.render('Cell'));
358
+ }));
337
359
  });
338
- }
360
+ };
339
361
 
340
- return /*#__PURE__*/React.createElement(FixedSizeList, {
341
- itemCount: itemCount,
342
- height: bodyClientHeight,
343
- itemSize: DEFAULT_ROW_HEIGHT,
344
- width: resizeColumn ? theadRowWidthRef.current : '100%',
345
- className: "".concat(prefixCls, "-list")
346
- }, RenderRow);
362
+ return /*#__PURE__*/React.createElement("div", {
363
+ className: classnames("".concat(prefixCls, "-list"), _defineProperty({}, "".concat(prefixCls, "-innerScroll"), innerScroll)),
364
+ id: RANDOM_ID,
365
+ ref: tableBodyListRef
366
+ }, innerScroll && loadMore ? /*#__PURE__*/React.createElement(InfiniteScroll, {
367
+ dataLength: rows.length,
368
+ next: loadMore,
369
+ hasMore: !!hasNextPage,
370
+ loader: LoadingNode,
371
+ scrollableTarget: RANDOM_ID
372
+ }, renderRowList()) : renderRowList());
347
373
  };
348
374
 
349
375
  return /*#__PURE__*/React.createElement("div", {
350
- className: prefixCls
376
+ className: prefixCls,
377
+ ref: tableRef
351
378
  }, showHeader && renderHeader(data.length), /*#__PURE__*/React.createElement("div", _objectSpread(_objectSpread({}, getTableProps()), {}, {
352
379
  className: classnames("".concat(prefixCls, "-table-wrap"), _defineProperty({}, "".concat(prefixCls, "-column-resizable"), resizeColumn))
353
380
  }), /*#__PURE__*/React.createElement("div", {
@@ -365,21 +392,28 @@ function Table(_ref) {
365
392
  className: "".concat(prefixCls, "-row")
366
393
  }), headerGroup.headers.map(function (column) {
367
394
  var barPorps = resizeColumn ? column.getResizerProps() : {};
368
- return /*#__PURE__*/React.createElement("div", _objectSpread(_objectSpread({
369
- // {...column.getHeaderProps(column.getSortByToggleProps())}
370
- className: classnames(_defineProperty({}, "".concat(prefixCls, "-cell-sorting"), column.id === sortDirection.id), "".concat(prefixCls, "-cell"))
371
- }, getHeaderProps(column)), {}, {
395
+ return /*#__PURE__*/React.createElement("div", {
396
+ className: classnames(_defineProperty({}, "".concat(prefixCls, "-cell-sorting"), column.id === sortDirection.id), "".concat(prefixCls, "-cell")),
397
+ style: getHeaderProps(column).style,
372
398
  key: column.id
373
- }), column.render('Header'), /*#__PURE__*/React.createElement("div", _objectSpread(_objectSpread({}, barPorps), {}, {
374
- className: classnames(_defineProperty({}, "".concat(prefixCls, "-dragBar"), resizeColumn), "".concat(prefixCls, "-bar"))
375
- })), /*#__PURE__*/React.createElement(SortIcons, {
399
+ }, /*#__PURE__*/React.createElement("div", _objectSpread(_objectSpread({
400
+ className: "".concat(prefixCls, "-cell-content")
401
+ }, getHeaderProps(column)), {}, {
402
+ style: {
403
+ width: '100%'
404
+ }
405
+ }), column.render('Header'), /*#__PURE__*/React.createElement(SortIcons, {
376
406
  id: column.id
377
- }));
407
+ })), /*#__PURE__*/React.createElement("div", _objectSpread(_objectSpread({}, barPorps), {}, {
408
+ className: classnames(_defineProperty({}, "".concat(prefixCls, "-dragBar"), resizeColumn), "".concat(prefixCls, "-bar"))
409
+ })));
378
410
  }));
379
411
  })), /*#__PURE__*/React.createElement("div", _objectSpread(_objectSpread({}, getTableBodyProps()), {}, {
380
- className: classnames("".concat(prefixCls, "-tbody")),
381
- ref: tableBodyRef
412
+ className: classnames("".concat(prefixCls, "-tbody"), _defineProperty({}, "".concat(prefixCls, "-innerScroll"), innerScroll)),
413
+ style: {
414
+ width: totalColumnsWidth
415
+ }
382
416
  }), renderTableBody())));
383
417
  }
384
418
 
385
- export default Table;
419
+ export default /*#__PURE__*/React.forwardRef(Table);
@@ -21,7 +21,7 @@ export interface ITableProps<T extends object> {
21
21
  data: T[];
22
22
  total?: number;
23
23
  onRowSelected?: (row: T) => void;
24
- loadMore?: (startIndex: number, stopIndex: number) => void | Promise<void>;
24
+ loadMore?: () => void | Promise<void>;
25
25
  hasNextPage?: boolean;
26
26
  loading?: boolean;
27
27
  renderHeaderLeft?: () => React.ReactNode;
@@ -32,4 +32,6 @@ export interface ITableProps<T extends object> {
32
32
  sortDirections?: Array<'ascend' | 'descend'>;
33
33
  resizeColumn?: boolean;
34
34
  showHeader?: boolean;
35
+ innerScroll?: boolean;
36
+ ref?: React.RefObject<unknown>;
35
37
  }
@@ -12,23 +12,33 @@
12
12
  overflow: hidden;
13
13
  user-select: none;
14
14
 
15
+ &-page-loading {
16
+ opacity: 0;
17
+ }
18
+
15
19
  &-table-wrap {
16
20
  display: flex;
17
21
  flex: 1;
18
22
  flex-direction: column;
23
+ overflow: hidden;
19
24
  }
20
25
 
21
26
  &-cell {
22
27
  flex-grow: 1;
23
- height: @table-row-height;
24
- padding: 0 12px;
25
- overflow: hidden;
28
+ height: unset;
29
+ min-height: @table-row-height;
26
30
  color: @NL0;
27
31
  line-height: @table-row-height;
28
- white-space: nowrap;
29
32
  text-align: left;
30
- text-overflow: ellipsis;
31
33
  border-bottom: 1px solid @NL95;
34
+ word-break: break-all;
35
+ display: flex;
36
+ padding: 0 12px;
37
+ align-items: center;
38
+
39
+ &-content {
40
+ flex: 1;
41
+ }
32
42
  }
33
43
 
34
44
  &-row {
@@ -51,12 +61,19 @@
51
61
  right: 0;
52
62
  z-index: 1;
53
63
  display: inline-block;
54
- width: 1px;
64
+ width: 12px;
55
65
  height: 12px;
56
- background: blue;
57
- background-color: @NL95;
58
66
  transform: translateY(-50%);
59
67
  touch-action: none;
68
+ padding-left: 5px;
69
+
70
+ &::after {
71
+ display: block;
72
+ height: 100%;
73
+ width: 1px;
74
+ content: '';
75
+ background-color: @NL95;
76
+ }
60
77
  }
61
78
 
62
79
  &:last-child {
@@ -73,6 +90,8 @@
73
90
 
74
91
  .ant-empty {
75
92
  padding-top: 80px;
93
+ display: flex;
94
+ justify-content: center;
76
95
  }
77
96
 
78
97
  .ant-block-table-row {
@@ -125,9 +144,18 @@
125
144
  }
126
145
  }
127
146
 
128
- &-list {
147
+ /* stylelint-disable-next-line selector-class-pattern */
148
+ &-list&-innerScroll {
149
+ height: 100%;
129
150
  overflow: overlay !important;
151
+ }
152
+
153
+ // 当出现多行的时候 会顶出一个滚动条 通过复写三方库的样式覆盖
154
+ &-list&-canNotInnerScroll {
155
+ overflow: hidden !important;
156
+ }
130
157
 
158
+ &-list {
131
159
  &::-webkit-scrollbar-thumb {
132
160
  background: @NL90;
133
161
  background-clip: padding-box;
@@ -1,4 +1,4 @@
1
- import { ReactElement } from 'react';
1
+ import React from 'react';
2
2
  import { ITableProps } from './interface';
3
- declare function Table<T extends Record<string, unknown>>({ columns, data, total, renderHeaderLeft, renderHeaderRight, onRowSelected, loadMore, hasNextPage, loading, sortable, defaultSort, resizeColumn, sortDirections: allSortDirections, showHeader, onChange, }: ITableProps<T>): ReactElement;
4
- export default Table;
3
+ declare const _default: React.ForwardRefExoticComponent<Pick<ITableProps<Record<string, unknown>>, "onChange" | "loading" | "data" | "columns" | "total" | "renderHeaderLeft" | "renderHeaderRight" | "onRowSelected" | "loadMore" | "hasNextPage" | "sortable" | "defaultSort" | "resizeColumn" | "sortDirections" | "showHeader" | "innerScroll"> & React.RefAttributes<unknown>>;
4
+ export default _default;
@@ -9,19 +9,17 @@ exports.default = void 0;
9
9
 
10
10
  var _lodash = _interopRequireDefault(require("lodash"));
11
11
 
12
- var _classnames5 = _interopRequireDefault(require("classnames"));
13
-
14
- var _Empty = _interopRequireDefault(require("../Empty"));
12
+ var _classnames7 = _interopRequireDefault(require("classnames"));
15
13
 
16
14
  var _Icon = _interopRequireDefault(require("../Icon"));
17
15
 
18
- var _reactWindowInfiniteLoader = _interopRequireDefault(require("react-window-infinite-loader"));
19
-
20
16
  var _react = _interopRequireWildcard(require("react"));
21
17
 
22
18
  var _usePrefixCls = _interopRequireDefault(require("../_utils/hooks/usePrefixCls"));
23
19
 
24
- var _reactWindow = require("react-window");
20
+ var _reactInfiniteScrollComponent = _interopRequireDefault(require("react-infinite-scroll-component"));
21
+
22
+ var _Empty = _interopRequireDefault(require("../Empty"));
25
23
 
26
24
  var _reactTable = require("react-table");
27
25
 
@@ -56,12 +54,11 @@ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Sy
56
54
 
57
55
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
58
56
 
59
- var DEFAULT_ROW_HEIGHT = 40;
60
57
  var ARRAY_FIRST_INDEX = 0;
61
58
  var DEFAULT_ROW_WIDTH = 0;
62
59
  var DEFAULT_BODY_HEIGHT = 0;
63
60
 
64
- function Table(_ref) {
61
+ function Table(_ref, ref) {
65
62
  var columns = _ref.columns,
66
63
  data = _ref.data,
67
64
  total = _ref.total,
@@ -69,8 +66,8 @@ function Table(_ref) {
69
66
  renderHeaderRight = _ref.renderHeaderRight,
70
67
  onRowSelected = _ref.onRowSelected,
71
68
  loadMore = _ref.loadMore,
72
- hasNextPage = _ref.hasNextPage,
73
69
  loading = _ref.loading,
70
+ hasNextPage = _ref.hasNextPage,
74
71
  _ref$sortable = _ref.sortable,
75
72
  sortable = _ref$sortable === void 0 ? false : _ref$sortable,
76
73
  defaultSort = _ref.defaultSort,
@@ -80,28 +77,64 @@ function Table(_ref) {
80
77
  _ref$showHeader = _ref.showHeader,
81
78
  showHeader = _ref$showHeader === void 0 ? true : _ref$showHeader,
82
79
  _ref$onChange = _ref.onChange,
83
- onChange = _ref$onChange === void 0 ? function () {} : _ref$onChange;
80
+ onChange = _ref$onChange === void 0 ? function () {} : _ref$onChange,
81
+ _ref$innerScroll = _ref.innerScroll,
82
+ innerScroll = _ref$innerScroll === void 0 ? false : _ref$innerScroll;
84
83
 
85
84
  var _React$useState = _react.default.useState(null),
86
85
  _React$useState2 = _slicedToArray(_React$useState, 2),
87
86
  selectedRowId = _React$useState2[0],
88
87
  setSelectedRowId = _React$useState2[1];
89
88
 
90
- var tableBodyRef = (0, _react.useRef)(null);
89
+ var tableBodyListRef = (0, _react.useRef)(null);
90
+ var tableRef = (0, _react.useRef)(null);
91
91
 
92
92
  var _useState = (0, _react.useState)(DEFAULT_BODY_HEIGHT),
93
93
  _useState2 = _slicedToArray(_useState, 2),
94
- bodyClientHeight = _useState2[0],
95
- setBodyClientHeight = _useState2[1];
94
+ tableClientWidth = _useState2[0],
95
+ setTableClientWidth = _useState2[1];
96
96
 
97
+ var RANDOM_ID = "INNER_SCROLL_ID_".concat(Math.random());
97
98
  (0, _react.useEffect)(function () {
98
- if (tableBodyRef.current) {
99
- setBodyClientHeight(tableBodyRef.current.clientHeight);
99
+ if (tableRef.current) {
100
+ setTableClientWidth(tableRef.current.clientWidth);
100
101
  }
101
102
  }, []);
103
+ var initialColumnsWidthMap = (0, _react.useMemo)(function () {
104
+ var map = new Map();
105
+
106
+ if (tableClientWidth !== DEFAULT_BODY_HEIGHT) {
107
+ var noGivenColumns = 0;
108
+ var givenColumnsTotalWidth = 0;
109
+ columns.forEach(function (column) {
110
+ if (column.width) {
111
+ map.set(column.dataIndex, column.width);
112
+ givenColumnsTotalWidth += column.width;
113
+ } else {
114
+ noGivenColumns += 1;
115
+ }
116
+ });
117
+ var averageWidth = (tableClientWidth - givenColumnsTotalWidth) / noGivenColumns;
118
+ return {
119
+ columnMap: map,
120
+ averageWidth: averageWidth
121
+ };
122
+ }
123
+
124
+ columns.forEach(function (column) {
125
+ if (column.width) {
126
+ map.set(column.dataIndex, column.width);
127
+ }
128
+ });
129
+ return {
130
+ columnMap: map,
131
+ averageWidth: DEFAULT_ROW_WIDTH
132
+ };
133
+ }, [columns, tableClientWidth]);
102
134
  var newColumns = (0, _react.useMemo)(function () {
103
135
  return columns.map(function (column) {
104
136
  return _objectSpread(_objectSpread({}, column), {}, {
137
+ width: initialColumnsWidthMap.columnMap.get(column.dataIndex) || initialColumnsWidthMap.averageWidth,
105
138
  Header: column.title,
106
139
  disableSortBy: !sortable || typeof column.sorter === 'boolean',
107
140
  accessor: column.dataIndex,
@@ -112,7 +145,7 @@ function Table(_ref) {
112
145
  }
113
146
  });
114
147
  });
115
- }, [columns, sortable]);
148
+ }, [columns, sortable, initialColumnsWidthMap]);
116
149
 
117
150
  var getInitialSortDirection = function getInitialSortDirection() {
118
151
  if (defaultSort && defaultSort.id) {
@@ -167,7 +200,8 @@ function Table(_ref) {
167
200
  headerGroups = _useTable.headerGroups,
168
201
  rows = _useTable.rows,
169
202
  prepareRow = _useTable.prepareRow,
170
- setSortBy = _useTable.setSortBy;
203
+ setSortBy = _useTable.setSortBy,
204
+ totalColumnsWidth = _useTable.totalColumnsWidth;
171
205
 
172
206
  var theadRowWidthRef = _react.default.useRef(DEFAULT_ROW_WIDTH);
173
207
 
@@ -180,56 +214,14 @@ function Table(_ref) {
180
214
  setSelectedRowId(row.id);
181
215
  onRowSelected(row.original);
182
216
  }, [onRowSelected]);
183
- var itemCount = hasNextPage ? data.length + 1 : data.length;
184
- var loadMoreItems = loading ? function () {} : loadMore;
185
-
186
- var isItemLoaded = function isItemLoaded(index) {
187
- return !hasNextPage || index < data.length;
188
- };
189
-
190
- var RenderRow = function RenderRow(_ref3) {
191
- var index = _ref3.index,
192
- style = _ref3.style;
193
-
194
- if (!isItemLoaded(index)) {
195
- return /*#__PURE__*/_react.default.createElement("div", {
196
- style: style,
197
- className: (0, _classnames5.default)("".concat(prefixCls, "-loading"))
198
- }, /*#__PURE__*/_react.default.createElement(_Icon.default, {
199
- type: "waiting",
200
- size: 16
201
- }), "Loading");
202
- }
203
-
204
- var row = rows[index];
205
- prepareRow(row);
206
-
207
- var _row$getRowProps = row.getRowProps(),
208
- rowStyle = _row$getRowProps.style,
209
- rowProps = _objectWithoutProperties(_row$getRowProps, _excluded);
210
-
211
- return /*#__PURE__*/_react.default.createElement("div", _objectSpread(_objectSpread({}, rowProps), {}, {
212
- style: _objectSpread(_objectSpread(_objectSpread({}, style), rowStyle), {}, {
213
- width: resizeColumn ? style === null || style === void 0 ? void 0 : style.width : '100%'
214
- }),
215
- className: (0, _classnames5.default)("".concat(prefixCls, "-row"), _defineProperty({}, "".concat(prefixCls, "-row-selected"), row.id === selectedRowId)),
216
- onClick: function onClick() {
217
- return onRowClick(row);
218
- }
219
- }), row.cells.map(function (cell) {
220
- return /*#__PURE__*/_react.default.createElement("div", _objectSpread(_objectSpread({}, cell.getCellProps()), {}, {
221
- className: (0, _classnames5.default)("".concat(prefixCls, "-cell"))
222
- }), cell.render('Cell'));
223
- }));
224
- };
225
217
 
226
218
  var renderHeader = function renderHeader(len) {
227
219
  return /*#__PURE__*/_react.default.createElement("div", {
228
- className: (0, _classnames5.default)("".concat(prefixCls, "-header"))
220
+ className: (0, _classnames7.default)("".concat(prefixCls, "-header"))
229
221
  }, renderHeaderLeft ? renderHeaderLeft() : /*#__PURE__*/_react.default.createElement("span", {
230
- className: (0, _classnames5.default)("".concat(prefixCls, "-header-left"))
222
+ className: (0, _classnames7.default)("".concat(prefixCls, "-header-left"))
231
223
  }, "\u5171\u8BA1", total || len, "\u6761"), /*#__PURE__*/_react.default.createElement("div", {
232
- className: (0, _classnames5.default)("".concat(prefixCls, "-header-right"))
224
+ className: (0, _classnames7.default)("".concat(prefixCls, "-header-right"))
233
225
  }, renderHeaderRight ? renderHeaderRight() : null));
234
226
  };
235
227
 
@@ -313,8 +305,8 @@ function Table(_ref) {
313
305
  return column.getHeaderProps();
314
306
  };
315
307
 
316
- var SortIcons = function SortIcons(_ref4) {
317
- var id = _ref4.id;
308
+ var SortIcons = function SortIcons(_ref3) {
309
+ var id = _ref3.id;
318
310
  var currentSortId = sortDirection.id,
319
311
  desc = sortDirection.desc;
320
312
 
@@ -333,47 +325,82 @@ function Table(_ref) {
333
325
  });
334
326
  };
335
327
 
328
+ var scrollToTop = function scrollToTop() {
329
+ var INITIAL_OFFSET_TOP = 0;
330
+
331
+ if (tableBodyListRef && tableBodyListRef.current) {
332
+ tableBodyListRef.current.scrollTop = INITIAL_OFFSET_TOP;
333
+ }
334
+ };
335
+
336
+ _react.default.useImperativeHandle(ref, function () {
337
+ return {
338
+ backToTop: function backToTop() {
339
+ scrollToTop();
340
+ }
341
+ };
342
+ });
343
+
344
+ var LoadingNode = /*#__PURE__*/_react.default.createElement("div", {
345
+ className: (0, _classnames7.default)("".concat(prefixCls, "-loading"))
346
+ }, /*#__PURE__*/_react.default.createElement(_Icon.default, {
347
+ type: "waiting",
348
+ size: 16
349
+ }), "Loading");
350
+
336
351
  var renderTableBody = function renderTableBody() {
352
+ if (loading && !rows.length) {
353
+ return LoadingNode;
354
+ }
355
+
337
356
  if (!loading && !rows.length) {
338
357
  return /*#__PURE__*/_react.default.createElement(_Empty.default, {
339
358
  description: "\u5F53\u524D\u65E0\u6570\u636E"
340
359
  });
341
360
  }
342
361
 
343
- if (loadMore && typeof loadMore === 'function') {
344
- return /*#__PURE__*/_react.default.createElement(_reactWindowInfiniteLoader.default, {
345
- isItemLoaded: isItemLoaded,
346
- itemCount: itemCount,
347
- loadMoreItems: loadMoreItems,
348
- threshold: 3
349
- }, function (_ref5) {
350
- var onItemsRendered = _ref5.onItemsRendered,
351
- ref = _ref5.ref;
352
- return /*#__PURE__*/_react.default.createElement(_reactWindow.FixedSizeList, {
353
- itemCount: itemCount,
354
- onItemsRendered: onItemsRendered,
355
- height: bodyClientHeight,
356
- itemSize: DEFAULT_ROW_HEIGHT,
357
- width: resizeColumn ? theadRowWidthRef.current : '100%',
358
- ref: ref,
359
- className: "".concat(prefixCls, "-list")
360
- }, RenderRow);
362
+ var renderRowList = function renderRowList() {
363
+ return data.map(function (item, index) {
364
+ var row = rows[index];
365
+ prepareRow(row);
366
+
367
+ var _row$getRowProps = row.getRowProps(),
368
+ rowStyle = _row$getRowProps.style,
369
+ rowProps = _objectWithoutProperties(_row$getRowProps, _excluded);
370
+
371
+ return /*#__PURE__*/_react.default.createElement("div", _objectSpread(_objectSpread({}, rowProps), {}, {
372
+ style: _objectSpread({}, rowStyle),
373
+ className: (0, _classnames7.default)("".concat(prefixCls, "-row"), _defineProperty({}, "".concat(prefixCls, "-row-selected"), row.id === selectedRowId)),
374
+ onClick: function onClick() {
375
+ return onRowClick(row);
376
+ },
377
+ key: row.id
378
+ }), row.cells.map(function (cell) {
379
+ return /*#__PURE__*/_react.default.createElement("div", _objectSpread(_objectSpread({}, cell.getCellProps()), {}, {
380
+ className: (0, _classnames7.default)("".concat(prefixCls, "-cell"))
381
+ }), cell.render('Cell'));
382
+ }));
361
383
  });
362
- }
384
+ };
363
385
 
364
- return /*#__PURE__*/_react.default.createElement(_reactWindow.FixedSizeList, {
365
- itemCount: itemCount,
366
- height: bodyClientHeight,
367
- itemSize: DEFAULT_ROW_HEIGHT,
368
- width: resizeColumn ? theadRowWidthRef.current : '100%',
369
- className: "".concat(prefixCls, "-list")
370
- }, RenderRow);
386
+ return /*#__PURE__*/_react.default.createElement("div", {
387
+ className: (0, _classnames7.default)("".concat(prefixCls, "-list"), _defineProperty({}, "".concat(prefixCls, "-innerScroll"), innerScroll)),
388
+ id: RANDOM_ID,
389
+ ref: tableBodyListRef
390
+ }, innerScroll && loadMore ? /*#__PURE__*/_react.default.createElement(_reactInfiniteScrollComponent.default, {
391
+ dataLength: rows.length,
392
+ next: loadMore,
393
+ hasMore: !!hasNextPage,
394
+ loader: LoadingNode,
395
+ scrollableTarget: RANDOM_ID
396
+ }, renderRowList()) : renderRowList());
371
397
  };
372
398
 
373
399
  return /*#__PURE__*/_react.default.createElement("div", {
374
- className: prefixCls
400
+ className: prefixCls,
401
+ ref: tableRef
375
402
  }, showHeader && renderHeader(data.length), /*#__PURE__*/_react.default.createElement("div", _objectSpread(_objectSpread({}, getTableProps()), {}, {
376
- className: (0, _classnames5.default)("".concat(prefixCls, "-table-wrap"), _defineProperty({}, "".concat(prefixCls, "-column-resizable"), resizeColumn))
403
+ className: (0, _classnames7.default)("".concat(prefixCls, "-table-wrap"), _defineProperty({}, "".concat(prefixCls, "-column-resizable"), resizeColumn))
377
404
  }), /*#__PURE__*/_react.default.createElement("div", {
378
405
  className: "".concat(prefixCls, "-thead")
379
406
  }, headerGroups.map(function (headerGroup) {
@@ -389,22 +416,30 @@ function Table(_ref) {
389
416
  className: "".concat(prefixCls, "-row")
390
417
  }), headerGroup.headers.map(function (column) {
391
418
  var barPorps = resizeColumn ? column.getResizerProps() : {};
392
- return /*#__PURE__*/_react.default.createElement("div", _objectSpread(_objectSpread({
393
- // {...column.getHeaderProps(column.getSortByToggleProps())}
394
- className: (0, _classnames5.default)(_defineProperty({}, "".concat(prefixCls, "-cell-sorting"), column.id === sortDirection.id), "".concat(prefixCls, "-cell"))
395
- }, getHeaderProps(column)), {}, {
419
+ return /*#__PURE__*/_react.default.createElement("div", {
420
+ className: (0, _classnames7.default)(_defineProperty({}, "".concat(prefixCls, "-cell-sorting"), column.id === sortDirection.id), "".concat(prefixCls, "-cell")),
421
+ style: getHeaderProps(column).style,
396
422
  key: column.id
397
- }), column.render('Header'), /*#__PURE__*/_react.default.createElement("div", _objectSpread(_objectSpread({}, barPorps), {}, {
398
- className: (0, _classnames5.default)(_defineProperty({}, "".concat(prefixCls, "-dragBar"), resizeColumn), "".concat(prefixCls, "-bar"))
399
- })), /*#__PURE__*/_react.default.createElement(SortIcons, {
423
+ }, /*#__PURE__*/_react.default.createElement("div", _objectSpread(_objectSpread({
424
+ className: "".concat(prefixCls, "-cell-content")
425
+ }, getHeaderProps(column)), {}, {
426
+ style: {
427
+ width: '100%'
428
+ }
429
+ }), column.render('Header'), /*#__PURE__*/_react.default.createElement(SortIcons, {
400
430
  id: column.id
401
- }));
431
+ })), /*#__PURE__*/_react.default.createElement("div", _objectSpread(_objectSpread({}, barPorps), {}, {
432
+ className: (0, _classnames7.default)(_defineProperty({}, "".concat(prefixCls, "-dragBar"), resizeColumn), "".concat(prefixCls, "-bar"))
433
+ })));
402
434
  }));
403
435
  })), /*#__PURE__*/_react.default.createElement("div", _objectSpread(_objectSpread({}, getTableBodyProps()), {}, {
404
- className: (0, _classnames5.default)("".concat(prefixCls, "-tbody")),
405
- ref: tableBodyRef
436
+ className: (0, _classnames7.default)("".concat(prefixCls, "-tbody"), _defineProperty({}, "".concat(prefixCls, "-innerScroll"), innerScroll)),
437
+ style: {
438
+ width: totalColumnsWidth
439
+ }
406
440
  }), renderTableBody())));
407
441
  }
408
442
 
409
- var _default = Table;
443
+ var _default = /*#__PURE__*/_react.default.forwardRef(Table);
444
+
410
445
  exports.default = _default;
@@ -21,7 +21,7 @@ export interface ITableProps<T extends object> {
21
21
  data: T[];
22
22
  total?: number;
23
23
  onRowSelected?: (row: T) => void;
24
- loadMore?: (startIndex: number, stopIndex: number) => void | Promise<void>;
24
+ loadMore?: () => void | Promise<void>;
25
25
  hasNextPage?: boolean;
26
26
  loading?: boolean;
27
27
  renderHeaderLeft?: () => React.ReactNode;
@@ -32,4 +32,6 @@ export interface ITableProps<T extends object> {
32
32
  sortDirections?: Array<'ascend' | 'descend'>;
33
33
  resizeColumn?: boolean;
34
34
  showHeader?: boolean;
35
+ innerScroll?: boolean;
36
+ ref?: React.RefObject<unknown>;
35
37
  }
@@ -12,23 +12,33 @@
12
12
  overflow: hidden;
13
13
  user-select: none;
14
14
 
15
+ &-page-loading {
16
+ opacity: 0;
17
+ }
18
+
15
19
  &-table-wrap {
16
20
  display: flex;
17
21
  flex: 1;
18
22
  flex-direction: column;
23
+ overflow: hidden;
19
24
  }
20
25
 
21
26
  &-cell {
22
27
  flex-grow: 1;
23
- height: @table-row-height;
24
- padding: 0 12px;
25
- overflow: hidden;
28
+ height: unset;
29
+ min-height: @table-row-height;
26
30
  color: @NL0;
27
31
  line-height: @table-row-height;
28
- white-space: nowrap;
29
32
  text-align: left;
30
- text-overflow: ellipsis;
31
33
  border-bottom: 1px solid @NL95;
34
+ word-break: break-all;
35
+ display: flex;
36
+ padding: 0 12px;
37
+ align-items: center;
38
+
39
+ &-content {
40
+ flex: 1;
41
+ }
32
42
  }
33
43
 
34
44
  &-row {
@@ -51,12 +61,19 @@
51
61
  right: 0;
52
62
  z-index: 1;
53
63
  display: inline-block;
54
- width: 1px;
64
+ width: 12px;
55
65
  height: 12px;
56
- background: blue;
57
- background-color: @NL95;
58
66
  transform: translateY(-50%);
59
67
  touch-action: none;
68
+ padding-left: 5px;
69
+
70
+ &::after {
71
+ display: block;
72
+ height: 100%;
73
+ width: 1px;
74
+ content: '';
75
+ background-color: @NL95;
76
+ }
60
77
  }
61
78
 
62
79
  &:last-child {
@@ -73,6 +90,8 @@
73
90
 
74
91
  .ant-empty {
75
92
  padding-top: 80px;
93
+ display: flex;
94
+ justify-content: center;
76
95
  }
77
96
 
78
97
  .ant-block-table-row {
@@ -125,9 +144,18 @@
125
144
  }
126
145
  }
127
146
 
128
- &-list {
147
+ /* stylelint-disable-next-line selector-class-pattern */
148
+ &-list&-innerScroll {
149
+ height: 100%;
129
150
  overflow: overlay !important;
151
+ }
152
+
153
+ // 当出现多行的时候 会顶出一个滚动条 通过复写三方库的样式覆盖
154
+ &-list&-canNotInnerScroll {
155
+ overflow: hidden !important;
156
+ }
130
157
 
158
+ &-list {
131
159
  &::-webkit-scrollbar-thumb {
132
160
  background: @NL90;
133
161
  background-clip: padding-box;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aloudata/aloudata-design",
3
- "version": "0.2.0-beta.13",
3
+ "version": "0.2.0-beta.14",
4
4
  "scripts": {
5
5
  "start": "dumi dev",
6
6
  "docs:build": "dumi build",
@@ -57,6 +57,7 @@
57
57
  "rc-overflow": "^1.2.3",
58
58
  "rc-trigger": "^5.2.10",
59
59
  "rc-virtual-list": "^3.4.2",
60
+ "react-infinite-scroll-component": "^6.1.0",
60
61
  "react-table": "^7.7.0",
61
62
  "react-window": "^1.8.6",
62
63
  "react-window-infinite-loader": "^1.0.7"