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

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,29 +55,67 @@ 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), {}, {
82
- Header: column.title,
115
+ width: initialColumnsWidthMap.columnMap.get(column.dataIndex) || initialColumnsWidthMap.averageWidth,
116
+ Header: column.title ? column.title : function () {
117
+ return null;
118
+ },
83
119
  disableSortBy: !sortable || typeof column.sorter === 'boolean',
84
120
  accessor: column.dataIndex,
85
121
  Cell: function Cell(_ref2) {
@@ -89,7 +125,7 @@ function Table(_ref) {
89
125
  }
90
126
  });
91
127
  });
92
- }, [columns, sortable]);
128
+ }, [columns, sortable, initialColumnsWidthMap]);
93
129
 
94
130
  var getInitialSortDirection = function getInitialSortDirection() {
95
131
  if (defaultSort && defaultSort.id) {
@@ -144,7 +180,8 @@ function Table(_ref) {
144
180
  headerGroups = _useTable.headerGroups,
145
181
  rows = _useTable.rows,
146
182
  prepareRow = _useTable.prepareRow,
147
- setSortBy = _useTable.setSortBy;
183
+ setSortBy = _useTable.setSortBy,
184
+ totalColumnsWidth = _useTable.totalColumnsWidth;
148
185
 
149
186
  var theadRowWidthRef = React.useRef(DEFAULT_ROW_WIDTH);
150
187
  var prefixCls = usePrefixCls('block-table');
@@ -156,48 +193,6 @@ function Table(_ref) {
156
193
  setSelectedRowId(row.id);
157
194
  onRowSelected(row.original);
158
195
  }, [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
196
 
202
197
  var renderHeader = function renderHeader(len) {
203
198
  return /*#__PURE__*/React.createElement("div", {
@@ -289,8 +284,8 @@ function Table(_ref) {
289
284
  return column.getHeaderProps();
290
285
  };
291
286
 
292
- var SortIcons = function SortIcons(_ref4) {
293
- var id = _ref4.id;
287
+ var SortIcons = function SortIcons(_ref3) {
288
+ var id = _ref3.id;
294
289
  var currentSortId = sortDirection.id,
295
290
  desc = sortDirection.desc;
296
291
 
@@ -309,45 +304,79 @@ function Table(_ref) {
309
304
  });
310
305
  };
311
306
 
307
+ var scrollToTop = function scrollToTop() {
308
+ var INITIAL_OFFSET_TOP = 0;
309
+
310
+ if (tableBodyListRef && tableBodyListRef.current) {
311
+ tableBodyListRef.current.scrollTop = INITIAL_OFFSET_TOP;
312
+ }
313
+ };
314
+
315
+ React.useImperativeHandle(ref, function () {
316
+ return {
317
+ backToTop: function backToTop() {
318
+ scrollToTop();
319
+ }
320
+ };
321
+ });
322
+ var LoadingNode = /*#__PURE__*/React.createElement("div", {
323
+ className: classnames("".concat(prefixCls, "-loading"))
324
+ }, /*#__PURE__*/React.createElement(Icon, {
325
+ type: "waiting",
326
+ size: 16
327
+ }), "Loading");
328
+
312
329
  var renderTableBody = function renderTableBody() {
330
+ if (loading && !rows.length) {
331
+ return LoadingNode;
332
+ }
333
+
313
334
  if (!loading && !rows.length) {
314
335
  return /*#__PURE__*/React.createElement(Empty, {
315
336
  description: "\u5F53\u524D\u65E0\u6570\u636E"
316
337
  });
317
338
  }
318
339
 
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);
340
+ var renderRowList = function renderRowList() {
341
+ return data.map(function (item, index) {
342
+ var row = rows[index];
343
+ prepareRow(row);
344
+
345
+ var _row$getRowProps = row.getRowProps(),
346
+ rowStyle = _row$getRowProps.style,
347
+ rowProps = _objectWithoutProperties(_row$getRowProps, _excluded);
348
+
349
+ return /*#__PURE__*/React.createElement("div", _objectSpread(_objectSpread({}, rowProps), {}, {
350
+ style: _objectSpread({}, rowStyle),
351
+ className: classnames("".concat(prefixCls, "-row"), _defineProperty({}, "".concat(prefixCls, "-row-selected"), row.id === selectedRowId)),
352
+ onClick: function onClick() {
353
+ return onRowClick(row);
354
+ },
355
+ key: row.id
356
+ }), row.cells.map(function (cell) {
357
+ return /*#__PURE__*/React.createElement("div", _objectSpread(_objectSpread({}, cell.getCellProps()), {}, {
358
+ className: classnames("".concat(prefixCls, "-cell"))
359
+ }), cell.render('Cell'));
360
+ }));
337
361
  });
338
- }
362
+ };
339
363
 
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);
364
+ return /*#__PURE__*/React.createElement("div", {
365
+ className: classnames("".concat(prefixCls, "-list"), _defineProperty({}, "".concat(prefixCls, "-innerScroll"), innerScroll)),
366
+ id: RANDOM_ID,
367
+ ref: tableBodyListRef
368
+ }, innerScroll ? /*#__PURE__*/React.createElement(InfiniteScroll, {
369
+ dataLength: rows.length,
370
+ next: loadMore,
371
+ hasMore: !!hasNextPage,
372
+ loader: LoadingNode,
373
+ scrollableTarget: RANDOM_ID
374
+ }, renderRowList()) : renderRowList());
347
375
  };
348
376
 
349
377
  return /*#__PURE__*/React.createElement("div", {
350
- className: prefixCls
378
+ className: prefixCls,
379
+ ref: tableRef
351
380
  }, showHeader && renderHeader(data.length), /*#__PURE__*/React.createElement("div", _objectSpread(_objectSpread({}, getTableProps()), {}, {
352
381
  className: classnames("".concat(prefixCls, "-table-wrap"), _defineProperty({}, "".concat(prefixCls, "-column-resizable"), resizeColumn))
353
382
  }), /*#__PURE__*/React.createElement("div", {
@@ -365,21 +394,28 @@ function Table(_ref) {
365
394
  className: "".concat(prefixCls, "-row")
366
395
  }), headerGroup.headers.map(function (column) {
367
396
  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)), {}, {
397
+ return /*#__PURE__*/React.createElement("div", {
398
+ className: classnames(_defineProperty({}, "".concat(prefixCls, "-cell-sorting"), column.id === sortDirection.id), "".concat(prefixCls, "-cell")),
399
+ style: getHeaderProps(column).style,
372
400
  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, {
401
+ }, /*#__PURE__*/React.createElement("div", _objectSpread(_objectSpread({
402
+ className: "".concat(prefixCls, "-cell-content")
403
+ }, getHeaderProps(column)), {}, {
404
+ style: {
405
+ width: '100%'
406
+ }
407
+ }), column.render('Header'), /*#__PURE__*/React.createElement(SortIcons, {
376
408
  id: column.id
377
- }));
409
+ })), /*#__PURE__*/React.createElement("div", _objectSpread(_objectSpread({}, barPorps), {}, {
410
+ className: classnames(_defineProperty({}, "".concat(prefixCls, "-dragBar"), resizeColumn), "".concat(prefixCls, "-bar"))
411
+ })));
378
412
  }));
379
413
  })), /*#__PURE__*/React.createElement("div", _objectSpread(_objectSpread({}, getTableBodyProps()), {}, {
380
- className: classnames("".concat(prefixCls, "-tbody")),
381
- ref: tableBodyRef
414
+ className: classnames("".concat(prefixCls, "-tbody"), _defineProperty({}, "".concat(prefixCls, "-innerScroll"), innerScroll)),
415
+ style: {
416
+ width: totalColumnsWidth
417
+ }
382
418
  }), renderTableBody())));
383
419
  }
384
420
 
385
- export default Table;
421
+ export default /*#__PURE__*/React.forwardRef(Table);
@@ -6,7 +6,7 @@ export interface ISort<T> {
6
6
  desc?: boolean;
7
7
  }
8
8
  export interface IColumn<T extends object> {
9
- title: string;
9
+ title: string | null;
10
10
  dataIndex: string;
11
11
  render?: (value: any, row: Record<string, T>, index: number) => React.ReactNode;
12
12
  width?: number;
@@ -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,29 +77,67 @@ 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), {}, {
105
- Header: column.title,
137
+ width: initialColumnsWidthMap.columnMap.get(column.dataIndex) || initialColumnsWidthMap.averageWidth,
138
+ Header: column.title ? column.title : function () {
139
+ return null;
140
+ },
106
141
  disableSortBy: !sortable || typeof column.sorter === 'boolean',
107
142
  accessor: column.dataIndex,
108
143
  Cell: function Cell(_ref2) {
@@ -112,7 +147,7 @@ function Table(_ref) {
112
147
  }
113
148
  });
114
149
  });
115
- }, [columns, sortable]);
150
+ }, [columns, sortable, initialColumnsWidthMap]);
116
151
 
117
152
  var getInitialSortDirection = function getInitialSortDirection() {
118
153
  if (defaultSort && defaultSort.id) {
@@ -167,7 +202,8 @@ function Table(_ref) {
167
202
  headerGroups = _useTable.headerGroups,
168
203
  rows = _useTable.rows,
169
204
  prepareRow = _useTable.prepareRow,
170
- setSortBy = _useTable.setSortBy;
205
+ setSortBy = _useTable.setSortBy,
206
+ totalColumnsWidth = _useTable.totalColumnsWidth;
171
207
 
172
208
  var theadRowWidthRef = _react.default.useRef(DEFAULT_ROW_WIDTH);
173
209
 
@@ -180,56 +216,14 @@ function Table(_ref) {
180
216
  setSelectedRowId(row.id);
181
217
  onRowSelected(row.original);
182
218
  }, [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
219
 
226
220
  var renderHeader = function renderHeader(len) {
227
221
  return /*#__PURE__*/_react.default.createElement("div", {
228
- className: (0, _classnames5.default)("".concat(prefixCls, "-header"))
222
+ className: (0, _classnames7.default)("".concat(prefixCls, "-header"))
229
223
  }, renderHeaderLeft ? renderHeaderLeft() : /*#__PURE__*/_react.default.createElement("span", {
230
- className: (0, _classnames5.default)("".concat(prefixCls, "-header-left"))
224
+ className: (0, _classnames7.default)("".concat(prefixCls, "-header-left"))
231
225
  }, "\u5171\u8BA1", total || len, "\u6761"), /*#__PURE__*/_react.default.createElement("div", {
232
- className: (0, _classnames5.default)("".concat(prefixCls, "-header-right"))
226
+ className: (0, _classnames7.default)("".concat(prefixCls, "-header-right"))
233
227
  }, renderHeaderRight ? renderHeaderRight() : null));
234
228
  };
235
229
 
@@ -313,8 +307,8 @@ function Table(_ref) {
313
307
  return column.getHeaderProps();
314
308
  };
315
309
 
316
- var SortIcons = function SortIcons(_ref4) {
317
- var id = _ref4.id;
310
+ var SortIcons = function SortIcons(_ref3) {
311
+ var id = _ref3.id;
318
312
  var currentSortId = sortDirection.id,
319
313
  desc = sortDirection.desc;
320
314
 
@@ -333,47 +327,82 @@ function Table(_ref) {
333
327
  });
334
328
  };
335
329
 
330
+ var scrollToTop = function scrollToTop() {
331
+ var INITIAL_OFFSET_TOP = 0;
332
+
333
+ if (tableBodyListRef && tableBodyListRef.current) {
334
+ tableBodyListRef.current.scrollTop = INITIAL_OFFSET_TOP;
335
+ }
336
+ };
337
+
338
+ _react.default.useImperativeHandle(ref, function () {
339
+ return {
340
+ backToTop: function backToTop() {
341
+ scrollToTop();
342
+ }
343
+ };
344
+ });
345
+
346
+ var LoadingNode = /*#__PURE__*/_react.default.createElement("div", {
347
+ className: (0, _classnames7.default)("".concat(prefixCls, "-loading"))
348
+ }, /*#__PURE__*/_react.default.createElement(_Icon.default, {
349
+ type: "waiting",
350
+ size: 16
351
+ }), "Loading");
352
+
336
353
  var renderTableBody = function renderTableBody() {
354
+ if (loading && !rows.length) {
355
+ return LoadingNode;
356
+ }
357
+
337
358
  if (!loading && !rows.length) {
338
359
  return /*#__PURE__*/_react.default.createElement(_Empty.default, {
339
360
  description: "\u5F53\u524D\u65E0\u6570\u636E"
340
361
  });
341
362
  }
342
363
 
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);
364
+ var renderRowList = function renderRowList() {
365
+ return data.map(function (item, index) {
366
+ var row = rows[index];
367
+ prepareRow(row);
368
+
369
+ var _row$getRowProps = row.getRowProps(),
370
+ rowStyle = _row$getRowProps.style,
371
+ rowProps = _objectWithoutProperties(_row$getRowProps, _excluded);
372
+
373
+ return /*#__PURE__*/_react.default.createElement("div", _objectSpread(_objectSpread({}, rowProps), {}, {
374
+ style: _objectSpread({}, rowStyle),
375
+ className: (0, _classnames7.default)("".concat(prefixCls, "-row"), _defineProperty({}, "".concat(prefixCls, "-row-selected"), row.id === selectedRowId)),
376
+ onClick: function onClick() {
377
+ return onRowClick(row);
378
+ },
379
+ key: row.id
380
+ }), row.cells.map(function (cell) {
381
+ return /*#__PURE__*/_react.default.createElement("div", _objectSpread(_objectSpread({}, cell.getCellProps()), {}, {
382
+ className: (0, _classnames7.default)("".concat(prefixCls, "-cell"))
383
+ }), cell.render('Cell'));
384
+ }));
361
385
  });
362
- }
386
+ };
363
387
 
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);
388
+ return /*#__PURE__*/_react.default.createElement("div", {
389
+ className: (0, _classnames7.default)("".concat(prefixCls, "-list"), _defineProperty({}, "".concat(prefixCls, "-innerScroll"), innerScroll)),
390
+ id: RANDOM_ID,
391
+ ref: tableBodyListRef
392
+ }, innerScroll ? /*#__PURE__*/_react.default.createElement(_reactInfiniteScrollComponent.default, {
393
+ dataLength: rows.length,
394
+ next: loadMore,
395
+ hasMore: !!hasNextPage,
396
+ loader: LoadingNode,
397
+ scrollableTarget: RANDOM_ID
398
+ }, renderRowList()) : renderRowList());
371
399
  };
372
400
 
373
401
  return /*#__PURE__*/_react.default.createElement("div", {
374
- className: prefixCls
402
+ className: prefixCls,
403
+ ref: tableRef
375
404
  }, 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))
405
+ className: (0, _classnames7.default)("".concat(prefixCls, "-table-wrap"), _defineProperty({}, "".concat(prefixCls, "-column-resizable"), resizeColumn))
377
406
  }), /*#__PURE__*/_react.default.createElement("div", {
378
407
  className: "".concat(prefixCls, "-thead")
379
408
  }, headerGroups.map(function (headerGroup) {
@@ -389,22 +418,30 @@ function Table(_ref) {
389
418
  className: "".concat(prefixCls, "-row")
390
419
  }), headerGroup.headers.map(function (column) {
391
420
  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)), {}, {
421
+ return /*#__PURE__*/_react.default.createElement("div", {
422
+ className: (0, _classnames7.default)(_defineProperty({}, "".concat(prefixCls, "-cell-sorting"), column.id === sortDirection.id), "".concat(prefixCls, "-cell")),
423
+ style: getHeaderProps(column).style,
396
424
  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, {
425
+ }, /*#__PURE__*/_react.default.createElement("div", _objectSpread(_objectSpread({
426
+ className: "".concat(prefixCls, "-cell-content")
427
+ }, getHeaderProps(column)), {}, {
428
+ style: {
429
+ width: '100%'
430
+ }
431
+ }), column.render('Header'), /*#__PURE__*/_react.default.createElement(SortIcons, {
400
432
  id: column.id
401
- }));
433
+ })), /*#__PURE__*/_react.default.createElement("div", _objectSpread(_objectSpread({}, barPorps), {}, {
434
+ className: (0, _classnames7.default)(_defineProperty({}, "".concat(prefixCls, "-dragBar"), resizeColumn), "".concat(prefixCls, "-bar"))
435
+ })));
402
436
  }));
403
437
  })), /*#__PURE__*/_react.default.createElement("div", _objectSpread(_objectSpread({}, getTableBodyProps()), {}, {
404
- className: (0, _classnames5.default)("".concat(prefixCls, "-tbody")),
405
- ref: tableBodyRef
438
+ className: (0, _classnames7.default)("".concat(prefixCls, "-tbody"), _defineProperty({}, "".concat(prefixCls, "-innerScroll"), innerScroll)),
439
+ style: {
440
+ width: totalColumnsWidth
441
+ }
406
442
  }), renderTableBody())));
407
443
  }
408
444
 
409
- var _default = Table;
445
+ var _default = /*#__PURE__*/_react.default.forwardRef(Table);
446
+
410
447
  exports.default = _default;
@@ -6,7 +6,7 @@ export interface ISort<T> {
6
6
  desc?: boolean;
7
7
  }
8
8
  export interface IColumn<T extends object> {
9
- title: string;
9
+ title: string | null;
10
10
  dataIndex: string;
11
11
  render?: (value: any, row: Record<string, T>, index: number) => React.ReactNode;
12
12
  width?: number;
@@ -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.16",
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"