@kdcloudjs/table 1.0.1 → 1.0.4

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 (207) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +34 -33
  3. package/dist/@kdcloudjs/table.css +1 -1
  4. package/dist/@kdcloudjs/table.css.map +1 -1
  5. package/dist/@kdcloudjs/table.js +6555 -3388
  6. package/dist/@kdcloudjs/table.js.map +1 -1
  7. package/dist/@kdcloudjs/table.min.css +1 -1
  8. package/dist/@kdcloudjs/table.min.js +32 -24
  9. package/dist/@kdcloudjs/table.min.js.map +1 -1
  10. package/es/_utils/hooks.js +1 -2
  11. package/es/_utils/numberUtil.js +3 -4
  12. package/es/locale/locale.js +1 -2
  13. package/es/table/base/calculations.js +3 -4
  14. package/es/table/base/empty.js +2 -2
  15. package/es/table/base/header.d.ts +6 -2
  16. package/es/table/base/header.js +41 -22
  17. package/es/table/base/helpers/SpanManager.js +1 -1
  18. package/es/table/base/helpers/TableDOMUtils.d.ts +3 -0
  19. package/es/table/base/helpers/TableDOMUtils.js +23 -5
  20. package/es/table/base/helpers/getRichVisibleRectsStream.d.ts +23 -0
  21. package/es/table/base/helpers/getRichVisibleRectsStream.js +216 -0
  22. package/es/table/base/html-table.d.ts +3 -1
  23. package/es/table/base/html-table.js +43 -26
  24. package/es/table/base/interfaces.d.ts +1 -0
  25. package/es/table/base/renderTemplates.d.ts +1 -0
  26. package/es/table/base/renderTemplates.js +344 -0
  27. package/es/table/base/styles.d.ts +24 -0
  28. package/es/table/base/styles.js +31 -9
  29. package/es/table/base/table.d.ts +12 -4
  30. package/es/table/base/table.js +183 -136
  31. package/es/table/base/utils.d.ts +6 -3
  32. package/es/table/base/utils.js +27 -6
  33. package/es/table/common-views.js +3 -3
  34. package/es/table/pipeline/features/autoFill.js +7 -1
  35. package/es/table/pipeline/features/columnDrag.js +168 -59
  36. package/es/table/pipeline/features/columnFilter.js +7 -9
  37. package/es/table/pipeline/features/columnResizeWidth.d.ts +3 -0
  38. package/es/table/pipeline/features/columnResizeWidth.js +11 -4
  39. package/es/table/pipeline/features/contextMenu.js +78 -31
  40. package/es/table/pipeline/features/filter/Filter.js +74 -37
  41. package/es/table/pipeline/features/index.d.ts +1 -0
  42. package/es/table/pipeline/features/index.js +2 -1
  43. package/es/table/pipeline/features/multiSelect.js +85 -79
  44. package/es/table/pipeline/features/rangeSelection.d.ts +10 -0
  45. package/es/table/pipeline/features/rangeSelection.js +231 -0
  46. package/es/table/pipeline/features/rowDetail.js +39 -16
  47. package/es/table/pipeline/features/rowGrouping.js +2 -1
  48. package/es/table/pipeline/features/singleSelect.js +4 -1
  49. package/es/table/pipeline/features/sort.js +2 -3
  50. package/es/table/pipeline/features/treeMode.js +4 -4
  51. package/es/table/pipeline/pipeline.d.ts +8 -0
  52. package/es/table/pipeline/pipeline.js +49 -5
  53. package/es/table/pivot/cross-table/buildCrossTable.js +1 -2
  54. package/es/table/pivot/cross-tree-table/buildCrossTreeTable.js +1 -2
  55. package/es/table/pivot/pivot-utils/builders.js +1 -2
  56. package/es/table/pivot/pivot-utils/convert-utils.js +5 -4
  57. package/es/table/transforms/autoWidth.js +1 -2
  58. package/es/table/transforms/sort.js +1 -2
  59. package/es/table/transforms/treeMode.js +1 -2
  60. package/es/table/utils/applyTransforms.js +1 -3
  61. package/es/table/utils/browserType.d.ts +6 -0
  62. package/es/table/utils/browserType.js +6 -0
  63. package/es/table/utils/buildTree.js +4 -5
  64. package/es/table/utils/collectNodes.js +1 -2
  65. package/es/table/utils/exportTableAsExcel.js +1 -2
  66. package/es/table/utils/getTreeDepth.js +1 -2
  67. package/es/table/utils/groupBy.js +1 -2
  68. package/es/table/utils/index.d.ts +1 -0
  69. package/es/table/utils/index.js +2 -1
  70. package/es/table/utils/layeredSort.js +5 -2
  71. package/es/table/utils/makeRecursiveMapper.js +4 -5
  72. package/es/table/utils/others.d.ts +1 -1
  73. package/es/table/utils/others.js +20 -14
  74. package/es/table/utils/traverseColumn.js +1 -2
  75. package/es/table/utils/tree-data-helpers/StrictTreeDataHelper.js +4 -5
  76. package/es/table/utils/tree-data-helpers/TreeDataHelper.js +4 -5
  77. package/lib/_utils/formatUtil.js +1 -1
  78. package/lib/_utils/hooks.js +2 -4
  79. package/lib/_utils/numberUtil.js +7 -9
  80. package/lib/_utils/usePopper.js +9 -1
  81. package/lib/config-provider/configProvider.js +9 -1
  82. package/lib/config-provider/index.js +5 -5
  83. package/lib/locale/index.js +14 -6
  84. package/lib/locale/locale.js +2 -4
  85. package/lib/table/base/calculations.js +4 -6
  86. package/lib/table/base/empty.js +11 -3
  87. package/lib/table/base/header.d.ts +6 -2
  88. package/lib/table/base/header.js +39 -19
  89. package/lib/table/base/helpers/SpanManager.js +1 -1
  90. package/lib/table/base/helpers/TableDOMUtils.d.ts +3 -0
  91. package/lib/table/base/helpers/TableDOMUtils.js +21 -5
  92. package/lib/table/base/helpers/getRichVisibleRectsStream.d.ts +23 -0
  93. package/lib/table/base/helpers/getRichVisibleRectsStream.js +246 -0
  94. package/lib/table/base/html-table.d.ts +3 -1
  95. package/lib/table/base/html-table.js +44 -26
  96. package/lib/table/base/index.js +4 -4
  97. package/lib/table/base/interfaces.d.ts +1 -0
  98. package/lib/table/base/renderTemplates.d.ts +1 -0
  99. package/lib/table/base/renderTemplates.js +370 -0
  100. package/lib/table/base/styles.d.ts +24 -0
  101. package/lib/table/base/styles.js +42 -13
  102. package/lib/table/base/table.d.ts +12 -4
  103. package/lib/table/base/table.js +191 -137
  104. package/lib/table/base/utils.d.ts +6 -3
  105. package/lib/table/base/utils.js +47 -10
  106. package/lib/table/common-views.js +3 -3
  107. package/lib/table/pipeline/features/autoFill.js +9 -2
  108. package/lib/table/pipeline/features/columnDrag.js +168 -59
  109. package/lib/table/pipeline/features/columnFilter.js +6 -9
  110. package/lib/table/pipeline/features/columnResizeWidth.d.ts +3 -0
  111. package/lib/table/pipeline/features/columnResizeWidth.js +21 -5
  112. package/lib/table/pipeline/features/contextMenu.js +89 -32
  113. package/lib/table/pipeline/features/filter/DefaultFilterContent.js +10 -2
  114. package/lib/table/pipeline/features/filter/Filter.js +88 -37
  115. package/lib/table/pipeline/features/filter/FilterPanel.js +10 -2
  116. package/lib/table/pipeline/features/filter/index.js +4 -4
  117. package/lib/table/pipeline/features/index.d.ts +1 -0
  118. package/lib/table/pipeline/features/index.js +37 -27
  119. package/lib/table/pipeline/features/multiSelect.js +81 -75
  120. package/lib/table/pipeline/features/rangeSelection.d.ts +10 -0
  121. package/lib/table/pipeline/features/rangeSelection.js +256 -0
  122. package/lib/table/pipeline/features/rowDetail.js +42 -16
  123. package/lib/table/pipeline/features/rowGrouping.js +3 -1
  124. package/lib/table/pipeline/features/singleSelect.js +4 -1
  125. package/lib/table/pipeline/features/sort.js +2 -4
  126. package/lib/table/pipeline/features/treeMode.js +6 -6
  127. package/lib/table/pipeline/index.js +11 -3
  128. package/lib/table/pipeline/pipeline.d.ts +8 -0
  129. package/lib/table/pipeline/pipeline.js +50 -7
  130. package/lib/table/pivot/cross-table/buildCrossTable.js +1 -3
  131. package/lib/table/pivot/cross-table/index.js +4 -4
  132. package/lib/table/pivot/cross-tree-table/buildCrossTreeTable.js +1 -3
  133. package/lib/table/pivot/pivot-utils/builders.js +2 -4
  134. package/lib/table/pivot/pivot-utils/convert-utils.js +7 -5
  135. package/lib/table/pivot/pivot-utils/index.js +4 -4
  136. package/lib/table/transforms/autoWidth.js +10 -4
  137. package/lib/table/transforms/columnResize.js +10 -2
  138. package/lib/table/transforms/index.js +32 -32
  139. package/lib/table/transforms/sort.js +10 -4
  140. package/lib/table/transforms/treeMode.js +9 -3
  141. package/lib/table/utils/applyTransforms.js +1 -5
  142. package/lib/table/utils/browserType.d.ts +6 -0
  143. package/lib/table/utils/browserType.js +13 -0
  144. package/lib/table/utils/buildTree.js +1 -3
  145. package/lib/table/utils/collectNodes.js +1 -3
  146. package/lib/table/utils/copyToClipboard.js +1 -1
  147. package/lib/table/utils/element.js +3 -3
  148. package/lib/table/utils/exportTableAsExcel.js +1 -3
  149. package/lib/table/utils/getTreeDepth.js +1 -3
  150. package/lib/table/utils/groupBy.js +1 -3
  151. package/lib/table/utils/index.d.ts +1 -0
  152. package/lib/table/utils/index.js +57 -49
  153. package/lib/table/utils/layeredSort.js +6 -2
  154. package/lib/table/utils/makeRecursiveMapper.js +1 -3
  155. package/lib/table/utils/others.d.ts +1 -1
  156. package/lib/table/utils/others.js +23 -18
  157. package/lib/table/utils/traverseColumn.js +1 -3
  158. package/lib/table/utils/tree-data-helpers/StrictTreeDataHelper.js +5 -7
  159. package/lib/table/utils/tree-data-helpers/TreeDataHelper.js +5 -7
  160. package/package.json +6 -2
  161. package/dist/kd-table.css +0 -422
  162. package/dist/kd-table.css.map +0 -1
  163. package/dist/kd-table.js +0 -38578
  164. package/dist/kd-table.js.map +0 -1
  165. package/dist/kd-table.min.css +0 -9
  166. package/dist/kd-table.min.js +0 -208
  167. package/dist/kd-table.min.js.map +0 -1
  168. package/es/table/base/helpers/__test__/visible-part.test.d.ts +0 -1
  169. package/es/table/base/helpers/__test__/visible-part.test.js +0 -28
  170. package/es/table/base/helpers/visible-part.d.ts +0 -23
  171. package/es/table/base/helpers/visible-part.js +0 -58
  172. package/es/table/pipeline/features/__test__/multiSelect.test.d.ts +0 -1
  173. package/es/table/pipeline/features/__test__/multiSelect.test.js +0 -152
  174. package/es/table/pipeline/features/__test__/rowDetail.test.d.ts +0 -1
  175. package/es/table/pipeline/features/__test__/rowDetail.test.js +0 -223
  176. package/es/table/pipeline/features/__test__/rowGrouping.test.d.ts +0 -1
  177. package/es/table/pipeline/features/__test__/rowGrouping.test.js +0 -120
  178. package/es/table/pipeline/features/__test__/singleSelect.test.d.ts +0 -1
  179. package/es/table/pipeline/features/__test__/singleSelect.test.js +0 -191
  180. package/es/table/pipeline/features/__test__/sort.test.d.ts +0 -1
  181. package/es/table/pipeline/features/__test__/sort.test.js +0 -213
  182. package/es/table/pipeline/features/__test__/tips.test.d.ts +0 -1
  183. package/es/table/pipeline/features/__test__/tips.test.js +0 -123
  184. package/es/table/pipeline/features/__test__/treeMode.test.d.ts +0 -1
  185. package/es/table/pipeline/features/__test__/treeMode.test.js +0 -202
  186. package/es/table/pipeline/features/filter/__test__/Filter.test.d.ts +0 -1
  187. package/es/table/pipeline/features/filter/__test__/Filter.test.js +0 -29
  188. package/lib/table/base/helpers/__test__/visible-part.test.d.ts +0 -1
  189. package/lib/table/base/helpers/__test__/visible-part.test.js +0 -31
  190. package/lib/table/base/helpers/visible-part.d.ts +0 -23
  191. package/lib/table/base/helpers/visible-part.js +0 -72
  192. package/lib/table/pipeline/features/__test__/multiSelect.test.d.ts +0 -1
  193. package/lib/table/pipeline/features/__test__/multiSelect.test.js +0 -163
  194. package/lib/table/pipeline/features/__test__/rowDetail.test.d.ts +0 -1
  195. package/lib/table/pipeline/features/__test__/rowDetail.test.js +0 -230
  196. package/lib/table/pipeline/features/__test__/rowGrouping.test.d.ts +0 -1
  197. package/lib/table/pipeline/features/__test__/rowGrouping.test.js +0 -129
  198. package/lib/table/pipeline/features/__test__/singleSelect.test.d.ts +0 -1
  199. package/lib/table/pipeline/features/__test__/singleSelect.test.js +0 -201
  200. package/lib/table/pipeline/features/__test__/sort.test.d.ts +0 -1
  201. package/lib/table/pipeline/features/__test__/sort.test.js +0 -218
  202. package/lib/table/pipeline/features/__test__/tips.test.d.ts +0 -1
  203. package/lib/table/pipeline/features/__test__/tips.test.js +0 -133
  204. package/lib/table/pipeline/features/__test__/treeMode.test.d.ts +0 -1
  205. package/lib/table/pipeline/features/__test__/treeMode.test.js +0 -206
  206. package/lib/table/pipeline/features/filter/__test__/Filter.test.d.ts +0 -1
  207. package/lib/table/pipeline/features/filter/__test__/Filter.test.js +0 -36
@@ -8,8 +8,6 @@ var _Symbol = require("@babel/runtime-corejs3/core-js-stable/symbol");
8
8
 
9
9
  var _getIteratorMethod = require("@babel/runtime-corejs3/core-js/get-iterator-method");
10
10
 
11
- var _getIterator = require("@babel/runtime-corejs3/core-js/get-iterator");
12
-
13
11
  var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
14
12
 
15
13
  Object.defineProperty(exports, "__esModule", {
@@ -17,6 +15,8 @@ Object.defineProperty(exports, "__esModule", {
17
15
  });
18
16
  exports.default = TableHeader;
19
17
 
18
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));
19
+
20
20
  var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/extends"));
21
21
 
22
22
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/toConsumableArray"));
@@ -35,7 +35,7 @@ var _utils = require("../utils");
35
35
 
36
36
  var _styles = require("./styles");
37
37
 
38
- function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof _Symbol === "undefined" || _getIteratorMethod(o) == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = _getIterator(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
38
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof _Symbol !== "undefined" && _getIteratorMethod(o) || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
39
39
 
40
40
  function _unsupportedIterableToArray(o, minLen) { var _context6; if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = _sliceInstanceProperty(_context6 = Object.prototype.toString.call(o)).call(_context6, 8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return _Array$from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
41
41
 
@@ -247,21 +247,40 @@ function calculateHeaderRenderInfo(_ref, rowCount) {
247
247
  function TableHeader(_ref2) {
248
248
  var _context4, _context5;
249
249
 
250
- var info = _ref2.info;
250
+ var info = _ref2.info,
251
+ theaderPosition = _ref2.theaderPosition,
252
+ _rowCount = _ref2.rowCount;
251
253
  var nested = info.nested,
252
254
  flat = (0, _flat.default)(info),
253
255
  stickyLeftMap = info.stickyLeftMap,
254
256
  stickyRightMap = info.stickyRightMap;
255
- var rowCount = (0, _utils.getTreeDepth)(nested.full) + 1;
257
+ var rowCount = _rowCount !== null && _rowCount !== void 0 ? _rowCount : (0, _utils.getTreeDepth)(nested.full) + 1;
256
258
  var headerRenderInfo = calculateHeaderRenderInfo(info, rowCount);
257
259
  var fullFlatCount = flat.full.length;
258
260
  var leftFlatCount = flat.left.length;
259
261
  var rightFlatCount = flat.right.length;
260
262
  var thead = (0, _map.default)(_context4 = headerRenderInfo.leveled).call(_context4, function (wrappedCols, level) {
261
- var headerCells = (0, _map.default)(wrappedCols).call(wrappedCols, function (wrapped, index) {
263
+ var _cx2;
264
+
265
+ var _wrappedCols = (0, _concat.default)(wrappedCols).call(wrappedCols); // 左中右区域渲染,分组列可能单独位于一个区域,此时其他区域也需要适配分组的高度
266
+ // rowspan 需要空白的列头去占位, 需要补充额外的空白列头
267
+
268
+
269
+ if (rowCount > 1 && ['left', 'right'].indexOf(theaderPosition) > -1) {
270
+ _wrappedCols.push({
271
+ type: 'blank',
272
+ blankSide: 'left',
273
+ width: 1,
274
+ isPlacehoder: true
275
+ });
276
+ }
277
+
278
+ var headerCells = (0, _map.default)(_wrappedCols).call(_wrappedCols, function (wrapped, index) {
262
279
  var _a, _b, _c;
263
280
 
264
281
  if (wrapped.type === 'normal') {
282
+ var _cx;
283
+
265
284
  var colIndex = wrapped.colIndex,
266
285
  colSpan = wrapped.colSpan,
267
286
  isLeaf = wrapped.isLeaf,
@@ -277,16 +296,12 @@ function TableHeader(_ref2) {
277
296
  positionStyle.right = stickyRightMap.get(colIndex);
278
297
  }
279
298
 
299
+ var justifyContent = col.align === 'right' ? 'flex-end' : col.align === 'center' ? 'center' : 'flex-start';
300
+
280
301
  var cell = /*#__PURE__*/_react.default.createElement("th", (0, _extends2.default)({
281
302
  key: colIndex
282
303
  }, headerCellProps, {
283
- className: (0, _classnames.default)(_styles.Classes.tableHeaderCell, headerCellProps.className, {
284
- first: colIndex === 0,
285
- last: colIndex + colSpan === fullFlatCount,
286
- 'lock-left': colIndex < leftFlatCount,
287
- 'lock-right': colIndex >= fullFlatCount - rightFlatCount,
288
- leaf: wrapped.isLeaf
289
- }),
304
+ className: (0, _classnames.default)(_styles.Classes.tableHeaderCell, headerCellProps.className, (_cx = {}, (0, _defineProperty2.default)(_cx, _styles.Classes.first, colIndex === 0), (0, _defineProperty2.default)(_cx, _styles.Classes.last, colIndex + colSpan === fullFlatCount), (0, _defineProperty2.default)(_cx, _styles.Classes.lockLeft, colIndex < leftFlatCount || theaderPosition === 'left'), (0, _defineProperty2.default)(_cx, _styles.Classes.lockRight, colIndex >= fullFlatCount - rightFlatCount || theaderPosition === 'right'), (0, _defineProperty2.default)(_cx, _styles.Classes.leaf, wrapped.isLeaf), _cx)),
290
305
  colSpan: colSpan,
291
306
  rowSpan: isLeaf ? rowCount - level : undefined,
292
307
  style: (0, _extends2.default)((0, _extends2.default)({
@@ -294,13 +309,21 @@ function TableHeader(_ref2) {
294
309
  verticalAlign: (_b = col.verticalAlign) !== null && _b !== void 0 ? _b : 'middle'
295
310
  }, headerCellProps.style), positionStyle),
296
311
  "data-code": col.code
297
- }), (_c = col.title) !== null && _c !== void 0 ? _c : col.name);
312
+ }), theaderPosition === 'center' && positionStyle.position === 'sticky' ? null : /*#__PURE__*/_react.default.createElement("div", {
313
+ className: _styles.Classes.tableHeaderCellContent,
314
+ style: {
315
+ justifyContent: justifyContent
316
+ }
317
+ }, (_c = col.title) !== null && _c !== void 0 ? _c : col.name));
298
318
 
299
319
  return cell;
300
320
  } else {
301
321
  if (wrapped.width > 0) {
302
322
  return /*#__PURE__*/_react.default.createElement("th", {
303
- key: wrapped.blankSide
323
+ key: wrapped.blankSide,
324
+ style: {
325
+ visibility: wrapped.isPlacehoder ? 'hidden' : undefined
326
+ }
304
327
  });
305
328
  } else {
306
329
  return null;
@@ -309,10 +332,7 @@ function TableHeader(_ref2) {
309
332
  });
310
333
  return /*#__PURE__*/_react.default.createElement("tr", {
311
334
  key: level,
312
- className: (0, _classnames.default)(_styles.Classes.tableHeaderRow, {
313
- first: level === 0,
314
- last: level === rowCount - 1
315
- })
335
+ className: (0, _classnames.default)(_styles.Classes.tableHeaderRow, (_cx2 = {}, (0, _defineProperty2.default)(_cx2, _styles.Classes.first, level === 0), (0, _defineProperty2.default)(_cx2, _styles.Classes.last, level === rowCount - 1), _cx2))
316
336
  }, headerCells);
317
337
  });
318
338
  var colgroup = (0, _map.default)(_context5 = (0, _flat.default)(headerRenderInfo)).call(_context5, function (wrapped) {
@@ -47,7 +47,7 @@ var SpanManager = /*#__PURE__*/function () {
47
47
  value: function add(rowIndex, colIndex, colSpan, rowSpan) {
48
48
  this.rects.push({
49
49
  left: colIndex,
50
- right: colIndex + colSpan,
50
+ right: colIndex + (colSpan < 1 ? 1 : colSpan),
51
51
  top: rowIndex,
52
52
  bottom: rowIndex + rowSpan
53
53
  });
@@ -8,6 +8,8 @@ export declare class TableDOMHelper {
8
8
  readonly tableFooter: HTMLDivElement;
9
9
  readonly stickyScroll: HTMLDivElement;
10
10
  readonly stickyScrollItem: HTMLDivElement;
11
+ readonly tableHeaderMain: HTMLDivElement;
12
+ readonly tableFooterMain: HTMLDivElement;
11
13
  constructor(artTableWrapper: HTMLDivElement);
12
14
  getVirtualTop(): HTMLDivElement;
13
15
  getTableRows(): NodeListOf<HTMLTableRowElement>;
@@ -15,4 +17,5 @@ export declare class TableDOMHelper {
15
17
  getLeftLockShadow(): HTMLDivElement;
16
18
  getRightLockShadow(): HTMLDivElement;
17
19
  getLoadingIndicator(): HTMLDivElement;
20
+ getRowTop(rowIndex: number): number;
18
21
  }
@@ -60,10 +60,12 @@ var TableDOMHelper = /*#__PURE__*/function () {
60
60
  this.artTableWrapper = artTableWrapper;
61
61
  this.artTable = artTableWrapper.querySelector(".".concat(_styles.Classes.artTable));
62
62
  this.tableHeader = this.artTable.querySelector(".".concat(_styles.Classes.tableHeader));
63
+ this.tableHeaderMain = this.artTable.querySelector(".".concat(_styles.Classes.tableHeaderMain));
63
64
  this.tableBody = this.artTable.querySelector(".".concat(_styles.Classes.tableBody));
64
65
  this.virtual = this.artTable.querySelector(".".concat(_styles.Classes.virtual));
65
66
  this.tableElement = this.artTable.querySelector(".".concat(_styles.Classes.tableBody, " table"));
66
67
  this.tableFooter = this.artTable.querySelector(".".concat(_styles.Classes.tableFooter));
68
+ this.tableFooterMain = this.artTable.querySelector(".".concat(_styles.Classes.tableFooterMain));
67
69
  var stickyScrollSelector = (0, _concat.default)(_context = ".".concat(_styles.Classes.artTable, " + .")).call(_context, _styles.Classes.stickyScroll);
68
70
  this.stickyScroll = artTableWrapper.querySelector(stickyScrollSelector);
69
71
  this.stickyScrollItem = this.stickyScroll.querySelector(".".concat(_styles.Classes.stickyScrollItem));
@@ -83,22 +85,24 @@ var TableDOMHelper = /*#__PURE__*/function () {
83
85
  }, {
84
86
  key: "getTableBodyHtmlTable",
85
87
  value: function getTableBodyHtmlTable() {
86
- return this.artTable.querySelector(".".concat(_styles.Classes.tableBody, " table"));
88
+ var _context2;
89
+
90
+ return this.artTable.querySelector((0, _concat.default)(_context2 = ".".concat(_styles.Classes.tableBody, " .")).call(_context2, _styles.Classes.virtual, " table"));
87
91
  }
88
92
  }, {
89
93
  key: "getLeftLockShadow",
90
94
  value: function getLeftLockShadow() {
91
- var _context2;
95
+ var _context3;
92
96
 
93
- var selector = (0, _concat.default)(_context2 = ".".concat(_styles.Classes.lockShadowMask, " .")).call(_context2, _styles.Classes.leftLockShadow);
97
+ var selector = (0, _concat.default)(_context3 = ".".concat(_styles.Classes.lockShadowMask, " .")).call(_context3, _styles.Classes.leftLockShadow);
94
98
  return this.artTable.querySelector(selector);
95
99
  }
96
100
  }, {
97
101
  key: "getRightLockShadow",
98
102
  value: function getRightLockShadow() {
99
- var _context3;
103
+ var _context4;
100
104
 
101
- var selector = (0, _concat.default)(_context3 = ".".concat(_styles.Classes.lockShadowMask, " .")).call(_context3, _styles.Classes.rightLockShadow);
105
+ var selector = (0, _concat.default)(_context4 = ".".concat(_styles.Classes.lockShadowMask, " .")).call(_context4, _styles.Classes.rightLockShadow);
102
106
  return this.artTable.querySelector(selector);
103
107
  }
104
108
  }, {
@@ -106,6 +110,18 @@ var TableDOMHelper = /*#__PURE__*/function () {
106
110
  value: function getLoadingIndicator() {
107
111
  return this.artTableWrapper.querySelector(".".concat(_styles.Classes.loadingIndicator));
108
112
  }
113
+ }, {
114
+ key: "getRowTop",
115
+ value: function getRowTop(rowIndex) {
116
+ var _context5, _context6;
117
+
118
+ if (rowIndex === 0) return 0;
119
+ var selector = (0, _concat.default)(_context5 = (0, _concat.default)(_context6 = ".".concat(_styles.Classes.tableBody, " .")).call(_context6, _styles.Classes.tableRow, "[data-rowindex=\"")).call(_context5, rowIndex, "\"]");
120
+ var row = this.artTable.querySelector(selector);
121
+ var rowOffsetTop = row && row.offsetTop || 0;
122
+ var tableOffsetTop = this.tableElement.offsetTop || 0;
123
+ return rowOffsetTop + tableOffsetTop;
124
+ }
109
125
  }]);
110
126
  return TableDOMHelper;
111
127
  }();
@@ -0,0 +1,23 @@
1
+ import { Observable } from 'rxjs';
2
+ export declare function getRichVisibleRectsStream(target: HTMLElement, structureMayChange$: Observable<'structure-may-change'>, virtualDebugLabel?: string): Observable<{
3
+ event: unknown;
4
+ targetRect: {
5
+ top: number;
6
+ left: number;
7
+ bottom: number;
8
+ right: number;
9
+ };
10
+ scrollParentRect: {
11
+ top: number;
12
+ left: number;
13
+ bottom: number;
14
+ right: number;
15
+ };
16
+ offsetY: number;
17
+ clipRect: {
18
+ left: number;
19
+ top: number;
20
+ right: number;
21
+ bottom: number;
22
+ };
23
+ }>;
@@ -0,0 +1,246 @@
1
+ "use strict";
2
+
3
+ var _typeof = require("@babel/runtime-corejs3/helpers/typeof");
4
+
5
+ var _WeakMap = require("@babel/runtime-corejs3/core-js-stable/weak-map");
6
+
7
+ var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");
8
+
9
+ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
10
+
11
+ Object.defineProperty(exports, "__esModule", {
12
+ value: true
13
+ });
14
+ exports.getRichVisibleRectsStream = getRichVisibleRectsStream;
15
+
16
+ var _includes = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/includes"));
17
+
18
+ var _getNodeName = _interopRequireDefault(require("@popperjs/core/lib/dom-utils/getNodeName"));
19
+
20
+ var _getOffsetParent = _interopRequireDefault(require("@popperjs/core/lib/dom-utils/getOffsetParent"));
21
+
22
+ var _getParentNode = _interopRequireDefault(require("@popperjs/core/lib/dom-utils/getParentNode"));
23
+
24
+ var _getWindow = _interopRequireDefault(require("@popperjs/core/lib/dom-utils/getWindow"));
25
+
26
+ var _getWindowScroll = _interopRequireDefault(require("@popperjs/core/lib/dom-utils/getWindowScroll"));
27
+
28
+ var _instanceOf = require("@popperjs/core/lib/dom-utils/instanceOf");
29
+
30
+ var _isScrollParent = _interopRequireDefault(require("@popperjs/core/lib/dom-utils/isScrollParent"));
31
+
32
+ var _resizeObserverPolyfill = _interopRequireDefault(require("resize-observer-polyfill"));
33
+
34
+ var _rxjs = require("rxjs");
35
+
36
+ var op = _interopRequireWildcard(require("rxjs/operators"));
37
+
38
+ var _utils = require("../utils");
39
+
40
+ function _getRequireWildcardCache(nodeInterop) { if (typeof _WeakMap !== "function") return null; var cacheBabelInterop = new _WeakMap(); var cacheNodeInterop = new _WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
41
+
42
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && _Object$getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
43
+
44
+ function isWindow(arg) {
45
+ return arg.toString() === '[object Window]';
46
+ }
47
+
48
+ function isBody(arg) {
49
+ return (0, _getNodeName.default)(arg) === 'body';
50
+ }
51
+
52
+ function isHtml(arg) {
53
+ return (0, _getNodeName.default)(arg) === 'html';
54
+ }
55
+
56
+ function isHtmlOrBody(arg) {
57
+ return isHtml(arg) || isBody(arg);
58
+ } // 计算从 start(子元素)到 stop(祖先元素)之间所有元素的 scrollTop 或 scrollLeft 的和
59
+ // 注意 start 和 stop 都是 INCLUSIVE 的,即两者的 scrollTop 或 scrollLeft 都会统计在内
60
+
61
+
62
+ function accumulateScrollOffset(start, stop, scrollOffsetKey) {
63
+ var result = 0;
64
+ var elem = start;
65
+
66
+ while (elem != null) {
67
+ result += elem[scrollOffsetKey];
68
+
69
+ if (elem === stop || isWindow(stop) && isHtmlOrBody(elem)) {
70
+ break;
71
+ }
72
+
73
+ elem = elem.parentElement;
74
+ }
75
+
76
+ if (isWindow(stop)) {
77
+ result += (0, _getWindowScroll.default)(elem)[scrollOffsetKey];
78
+ }
79
+
80
+ return result;
81
+ }
82
+ /**
83
+ * 获取 target 相对于 base 的布局大小和相对位置。
84
+ * 注意该方法会考虑滚动所带来的影响
85
+ */
86
+
87
+
88
+ function getRelativeLayoutRect(base, target) {
89
+ if (isWindow(target) || isHtmlOrBody(target)) {
90
+ return {
91
+ left: 0,
92
+ right: window.innerWidth,
93
+ top: 0,
94
+ bottom: window.innerHeight
95
+ };
96
+ }
97
+
98
+ var deltaX = 0;
99
+ var deltaY = 0;
100
+ var elem = target;
101
+
102
+ while (elem != null && elem != base) {
103
+ deltaY += elem.offsetTop;
104
+ deltaX += elem.offsetLeft;
105
+ var offsetParent = (0, _getOffsetParent.default)(elem);
106
+ deltaY -= accumulateScrollOffset(elem.parentElement, offsetParent, 'scrollTop');
107
+ deltaX -= accumulateScrollOffset(elem.parentElement, offsetParent, 'scrollLeft');
108
+
109
+ if (isWindow(offsetParent)) {
110
+ break;
111
+ }
112
+
113
+ deltaY += offsetParent.clientTop;
114
+ deltaX += offsetParent.clientLeft;
115
+ elem = offsetParent;
116
+ }
117
+
118
+ return {
119
+ top: deltaY,
120
+ bottom: deltaY + target.offsetHeight,
121
+ left: deltaX,
122
+ right: deltaX + target.offsetWidth
123
+ };
124
+ }
125
+
126
+ function findCommonOffsetAncestor(target, scrollParent) {
127
+ if (isWindow(scrollParent)) {
128
+ return scrollParent;
129
+ }
130
+
131
+ var offsetParents = listOffsetParents(target);
132
+
133
+ if ((0, _includes.default)(offsetParents).call(offsetParents, scrollParent)) {
134
+ return scrollParent;
135
+ }
136
+
137
+ return (0, _getOffsetParent.default)(scrollParent);
138
+ } // 列出 target 元素上层的所有 offset parents
139
+
140
+
141
+ function listOffsetParents(target) {
142
+ var result = [];
143
+ var elem = target;
144
+
145
+ while (true) {
146
+ if (isWindow(elem)) {
147
+ break;
148
+ }
149
+
150
+ elem = (0, _getOffsetParent.default)(elem);
151
+ result.push(elem);
152
+ }
153
+
154
+ return result;
155
+ }
156
+
157
+ function fromScrollEvent(element) {
158
+ return (0, _rxjs.fromEvent)(element, 'scroll', {
159
+ passive: true
160
+ });
161
+ }
162
+
163
+ function fromResizeEvent(element) {
164
+ if (isWindow(element)) {
165
+ return (0, _rxjs.fromEvent)(element, 'resize', {
166
+ passive: true
167
+ });
168
+ }
169
+
170
+ return new _rxjs.Observable(function (subscriber) {
171
+ var resizeObserver = new _resizeObserverPolyfill.default(function (entries) {
172
+ subscriber.next(entries);
173
+ });
174
+ resizeObserver.observe(element);
175
+ return function () {
176
+ resizeObserver.disconnect();
177
+ };
178
+ });
179
+ }
180
+
181
+ function getScrollParent(elem) {
182
+ var _context;
183
+
184
+ if ((0, _includes.default)(_context = ['html', 'body', '#document']).call(_context, (0, _getNodeName.default)(elem))) {
185
+ return (0, _getWindow.default)(elem);
186
+ }
187
+
188
+ if ((0, _instanceOf.isHTMLElement)(elem) && (0, _isScrollParent.default)(elem)) {
189
+ return elem;
190
+ }
191
+
192
+ return getScrollParent((0, _getParentNode.default)(elem));
193
+ } // 获取 target 相对于「它的滚动父元素」的可见部分的大小与位置
194
+
195
+
196
+ function getRichVisibleRectsStream(target, structureMayChange$, virtualDebugLabel) {
197
+ return structureMayChange$.pipe(op.startWith('init'), op.map(function () {
198
+ // target 的第一个滚动父元素,我们认为这就是虚拟滚动发生的地方
199
+ // 即虚拟滚动不考虑「更上层元素发生滚动」的情况
200
+ // 直接从父元素开始查找,防止自身设置overflow属性导致是同一个元素
201
+ var scrollParent = getScrollParent((0, _getParentNode.default)(target)); // target 和 scrollParent 的共同 offset 祖先,作为布局尺寸计算时的参照元素
202
+
203
+ var commonOffsetAncestor = findCommonOffsetAncestor(target, scrollParent);
204
+ return {
205
+ scrollParent: scrollParent,
206
+ commonOffsetAncestor: commonOffsetAncestor
207
+ };
208
+ }), op.distinctUntilChanged(_utils.shallowEqual), op.tap(function (structure) {
209
+ if (virtualDebugLabel) {
210
+ console.log("%c[ali-react-table STRUCTURE ".concat(virtualDebugLabel, "]"), 'color: #4f9052; font-weight: bold', '\ntarget:', target, '\nscrollParent:', structure.scrollParent, '\ncommonOffsetAncestor:', structure.commonOffsetAncestor);
211
+ }
212
+ }), op.switchMap(function (_ref) {
213
+ var scrollParent = _ref.scrollParent,
214
+ commonOffsetAncestor = _ref.commonOffsetAncestor;
215
+ var events$ = (0, _rxjs.merge)(fromScrollEvent(scrollParent), fromResizeEvent(scrollParent), fromResizeEvent(target));
216
+ return events$.pipe(op.map(function (event) {
217
+ return {
218
+ targetRect: getRelativeLayoutRect(commonOffsetAncestor, target),
219
+ scrollParentRect: getRelativeLayoutRect(commonOffsetAncestor, scrollParent),
220
+ event: event
221
+ };
222
+ }), op.map(function (_ref2) {
223
+ var event = _ref2.event,
224
+ scrollParentRect = _ref2.scrollParentRect,
225
+ targetRect = _ref2.targetRect;
226
+ return {
227
+ event: event,
228
+ targetRect: targetRect,
229
+ scrollParentRect: scrollParentRect,
230
+ offsetY: Math.max(0, scrollParentRect.top - targetRect.top),
231
+ // 表格的横向滚动总是发生在表格内部,所以这里不需要计算 offsetX
232
+ // offsetX: Math.max(0, scrollParentRect.left - targetRect.left),
233
+ clipRect: {
234
+ left: Math.max(targetRect.left, scrollParentRect.left),
235
+ top: Math.max(targetRect.top, scrollParentRect.top),
236
+ right: Math.min(targetRect.right, scrollParentRect.right),
237
+ bottom: Math.min(targetRect.bottom, scrollParentRect.bottom)
238
+ }
239
+ };
240
+ }));
241
+ }), op.tap(function (rects) {
242
+ if (virtualDebugLabel) {
243
+ console.log("%c[ali-react-table RECTS ".concat(virtualDebugLabel, "]"), 'color: #4f9052; font-weight: bold', '\noffsetY:', rects.offsetY, '\ntargetRect:', rects.targetRect, '\nscrollParentRect:', rects.scrollParentRect, '\nclipRect:', rects.clipRect, '\nevent:', rects.event);
244
+ }
245
+ }));
246
+ }
@@ -4,6 +4,7 @@ import { BaseTableProps } from './table';
4
4
  export interface HtmlTableProps extends Required<Pick<BaseTableProps, 'getRowProps' | 'primaryKey'>> {
5
5
  tbodyHtmlTag: 'tbody' | 'tfoot';
6
6
  data: any[];
7
+ hasScrollY?: boolean;
7
8
  horizontalRenderInfo: Pick<RenderInfo, 'flat' | 'visible' | 'horizontalRenderRange' | 'stickyLeftMap' | 'stickyRightMap'>;
8
9
  verticalRenderInfo: {
9
10
  offset: number;
@@ -11,5 +12,6 @@ export interface HtmlTableProps extends Required<Pick<BaseTableProps, 'getRowPro
11
12
  last: number;
12
13
  limit: number;
13
14
  };
15
+ tbodyPosition?: 'left' | 'center' | 'right';
14
16
  }
15
- export declare function HtmlTable({ tbodyHtmlTag, getRowProps, primaryKey, data, verticalRenderInfo: verInfo, horizontalRenderInfo: hozInfo }: HtmlTableProps): JSX.Element;
17
+ export declare function HtmlTable({ tbodyHtmlTag, getRowProps, primaryKey, hasScrollY, data, verticalRenderInfo: verInfo, horizontalRenderInfo: hozInfo, tbodyPosition }: HtmlTableProps): JSX.Element;
@@ -9,10 +9,14 @@ exports.HtmlTable = HtmlTable;
9
9
 
10
10
  var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/extends"));
11
11
 
12
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));
13
+
12
14
  var _flat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/flat"));
13
15
 
14
16
  var _map = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/map"));
15
17
 
18
+ var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));
19
+
16
20
  var _classnames = _interopRequireDefault(require("classnames"));
17
21
 
18
22
  var _react = _interopRequireDefault(require("react"));
@@ -25,13 +29,17 @@ var _SpanManager = _interopRequireDefault(require("./helpers/SpanManager"));
25
29
 
26
30
  var _styles = require("./styles");
27
31
 
32
+ var _utils = require("./utils");
33
+
28
34
  function HtmlTable(_ref) {
29
35
  var tbodyHtmlTag = _ref.tbodyHtmlTag,
30
36
  getRowProps = _ref.getRowProps,
31
37
  primaryKey = _ref.primaryKey,
38
+ hasScrollY = _ref.hasScrollY,
32
39
  data = _ref.data,
33
40
  verInfo = _ref.verticalRenderInfo,
34
- hozInfo = _ref.horizontalRenderInfo;
41
+ hozInfo = _ref.horizontalRenderInfo,
42
+ tbodyPosition = _ref.tbodyPosition;
35
43
  var flat = (0, _flat.default)(hozInfo),
36
44
  hoz = hozInfo.horizontalRenderRange;
37
45
  var spanManager = new _SpanManager.default();
@@ -43,26 +51,37 @@ function HtmlTable(_ref) {
43
51
  }), /*#__PURE__*/_react.default.createElement(tbodyHtmlTag, null, (0, _map.default)(data).call(data, renderRow)));
44
52
 
45
53
  function renderRow(record, i) {
46
- var _context;
54
+ var _cx, _context;
47
55
 
48
56
  var rowIndex = verInfo.offset + i;
49
57
  spanManager.stripUpwards(rowIndex);
50
58
  var rowProps = getRowProps(record, rowIndex);
51
- var rowClass = (0, _classnames.default)(_styles.Classes.tableRow, {
52
- first: rowIndex === verInfo.first,
53
- last: rowIndex === verInfo.last,
54
- even: rowIndex % 2 === 0,
55
- odd: rowIndex % 2 === 1
56
- }, rowProps === null || rowProps === void 0 ? void 0 : rowProps.className);
59
+ var rowClass = (0, _classnames.default)(_styles.Classes.tableRow, (_cx = {}, (0, _defineProperty2.default)(_cx, _styles.Classes.first, rowIndex === verInfo.first), (0, _defineProperty2.default)(_cx, _styles.Classes.last, rowIndex === verInfo.last), (0, _defineProperty2.default)(_cx, _styles.Classes.even, rowIndex % 2 === 0), (0, _defineProperty2.default)(_cx, _styles.Classes.odd, rowIndex % 2 === 1), _cx), rowProps === null || rowProps === void 0 ? void 0 : rowProps.className);
60
+ var visibleColumnDescriptor = (0, _concat.default)(_context = hozInfo.visible).call(_context); // 左中右区域渲染,存在融合单元格时需要适配rowspan属性
61
+ // 如果固定的列均存在融合单元格,需空白一列做占位,否则融合的单元格不会渲染,导致显示异常
62
+ // 这里无法区分是否存在融合列,默认左右固定区域均添加占位空白列
63
+
64
+ if (['left', 'right'].indexOf(tbodyPosition) > -1) {
65
+ visibleColumnDescriptor.push({
66
+ type: 'blank',
67
+ blankSide: 'left',
68
+ width: 0,
69
+ isPlacehoder: true
70
+ });
71
+ }
72
+
57
73
  return /*#__PURE__*/_react.default.createElement("tr", (0, _extends2.default)({}, rowProps, {
58
74
  className: rowClass,
59
- key: _internals.internals.safeGetRowKey(primaryKey, record, rowIndex),
75
+ key: (rowProps === null || rowProps === void 0 ? void 0 : rowProps['data-row-detail-key']) ? rowProps['data-row-detail-key'] : _internals.internals.safeGetRowKey(primaryKey, record, rowIndex),
60
76
  "data-rowindex": rowIndex,
61
77
  "data-role": 'table-row'
62
- }), (0, _map.default)(_context = hozInfo.visible).call(_context, function (descriptor) {
78
+ }), (0, _map.default)(visibleColumnDescriptor).call(visibleColumnDescriptor, function (descriptor) {
63
79
  if (descriptor.type === 'blank') {
64
80
  return /*#__PURE__*/_react.default.createElement("td", {
65
- key: descriptor.blankSide
81
+ key: descriptor.blankSide,
82
+ style: {
83
+ visibility: descriptor.isPlacehoder ? 'hidden' : undefined
84
+ }
66
85
  });
67
86
  }
68
87
 
@@ -71,6 +90,8 @@ function HtmlTable(_ref) {
71
90
  }
72
91
 
73
92
  function renderBodyCell(record, rowIndex, column, colIndex) {
93
+ var _cx2;
94
+
74
95
  var _a, _b, _c;
75
96
 
76
97
  if (spanManager.testSkip(rowIndex, colIndex)) {
@@ -101,38 +122,35 @@ function HtmlTable(_ref) {
101
122
  if (cellProps.rowSpan != null) {
102
123
  rowSpan = cellProps.rowSpan;
103
124
  }
104
- } // rowSpan/colSpan 不能过大,避免 rowSpan/colSpan 影响因虚拟滚动而未渲染的单元格
105
-
125
+ }
106
126
 
107
- rowSpan = Math.min(rowSpan, verInfo.limit - rowIndex);
108
- colSpan = Math.min(colSpan, leftFlatCount + hoz.rightIndex - colIndex);
109
127
  var hasSpan = colSpan > 1 || rowSpan > 1;
110
128
 
111
129
  if (hasSpan) {
112
130
  spanManager.add(rowIndex, colIndex, colSpan, rowSpan);
113
- }
131
+ } // rowSpan/colSpan 不能过大,避免 rowSpan/colSpan 影响因虚拟滚动而未渲染的单元格
132
+
133
+
134
+ rowSpan = Math.min(rowSpan, verInfo.limit - rowIndex);
135
+ colSpan = Math.min(colSpan, hozInfo.visible.length - colIndex); // todo: 右侧有列固定的情况下colSpan计算不对,这里先限制一下
114
136
 
137
+ rowSpan = Math.max(rowSpan, 1);
138
+ colSpan = Math.max(colSpan, 1);
115
139
  var positionStyle = {};
140
+ var scrollbarWidth = hasScrollY ? (0, _utils.getScrollbarSize)().width : 0;
116
141
 
117
142
  if (colIndex < leftFlatCount) {
118
143
  positionStyle.position = 'sticky';
119
144
  positionStyle.left = hozInfo.stickyLeftMap.get(colIndex);
120
145
  } else if (colIndex >= fullFlatCount - rightFlatCount) {
121
146
  positionStyle.position = 'sticky';
122
- positionStyle.right = hozInfo.stickyRightMap.get(colIndex);
147
+ positionStyle.right = hozInfo.stickyRightMap.get(colIndex) - scrollbarWidth;
123
148
  }
124
149
 
125
150
  return /*#__PURE__*/_react.default.createElement('td', (0, _extends2.default)((0, _extends2.default)((0, _extends2.default)((0, _extends2.default)({
126
151
  key: colIndex
127
152
  }, cellProps), {
128
- className: (0, _classnames.default)(_styles.Classes.tableCell, cellProps.className, {
129
- // class
130
- first: colIndex === 0,
131
- last: colIndex + colSpan === fullFlatCount,
132
- 'lock-left': colIndex < leftFlatCount,
133
- 'lock-right': colIndex >= fullFlatCount - rightFlatCount,
134
- 'row-span': rowSpan > 1
135
- })
153
+ className: (0, _classnames.default)(_styles.Classes.tableCell, cellProps.className, (_cx2 = {}, (0, _defineProperty2.default)(_cx2, _styles.Classes.first, colIndex === 0), (0, _defineProperty2.default)(_cx2, _styles.Classes.last, colIndex + colSpan === fullFlatCount), (0, _defineProperty2.default)(_cx2, _styles.Classes.lockLeft, colIndex < leftFlatCount || tbodyPosition === 'left'), (0, _defineProperty2.default)(_cx2, _styles.Classes.lockRight, colIndex >= fullFlatCount - rightFlatCount), (0, _defineProperty2.default)(_cx2, _styles.Classes.rowSpan, rowSpan > 1), _cx2))
136
154
  }), hasSpan ? {
137
155
  colSpan: colSpan,
138
156
  rowSpan: rowSpan
@@ -144,6 +162,6 @@ function HtmlTable(_ref) {
144
162
  'data-role': 'table-cell',
145
163
  'data-rowindex': rowIndex,
146
164
  'data-code': column.code
147
- }), cellContent);
165
+ }), tbodyPosition === 'center' && positionStyle.position === 'sticky' ? null : cellContent);
148
166
  }
149
167
  }