VirtualCell.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. import _extends from "@babel/runtime/helpers/esm/extends";
  2. import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
  3. import { useContext } from '@rc-component/context';
  4. import classNames from 'classnames';
  5. import * as React from 'react';
  6. import { getCellProps } from "../Body/BodyRow";
  7. import Cell from "../Cell";
  8. import { GridContext } from "./context";
  9. /**
  10. * Return the width of the column by `colSpan`.
  11. * When `colSpan` is `0` will be trade as `1`.
  12. */
  13. export function getColumnWidth(colIndex, colSpan, columnsOffset) {
  14. var mergedColSpan = colSpan || 1;
  15. return columnsOffset[colIndex + mergedColSpan] - (columnsOffset[colIndex] || 0);
  16. }
  17. function VirtualCell(props) {
  18. var rowInfo = props.rowInfo,
  19. column = props.column,
  20. colIndex = props.colIndex,
  21. indent = props.indent,
  22. index = props.index,
  23. component = props.component,
  24. renderIndex = props.renderIndex,
  25. record = props.record,
  26. style = props.style,
  27. className = props.className,
  28. inverse = props.inverse,
  29. getHeight = props.getHeight;
  30. var render = column.render,
  31. dataIndex = column.dataIndex,
  32. columnClassName = column.className,
  33. colWidth = column.width;
  34. var _useContext = useContext(GridContext, ['columnsOffset']),
  35. columnsOffset = _useContext.columnsOffset;
  36. // TODO: support `expandableRowOffset`
  37. var _getCellProps = getCellProps(rowInfo, column, colIndex, indent, index),
  38. key = _getCellProps.key,
  39. fixedInfo = _getCellProps.fixedInfo,
  40. appendCellNode = _getCellProps.appendCellNode,
  41. additionalCellProps = _getCellProps.additionalCellProps;
  42. var cellStyle = additionalCellProps.style,
  43. _additionalCellProps$ = additionalCellProps.colSpan,
  44. colSpan = _additionalCellProps$ === void 0 ? 1 : _additionalCellProps$,
  45. _additionalCellProps$2 = additionalCellProps.rowSpan,
  46. rowSpan = _additionalCellProps$2 === void 0 ? 1 : _additionalCellProps$2;
  47. // ========================= ColWidth =========================
  48. // column width
  49. var startColIndex = colIndex - 1;
  50. var concatColWidth = getColumnWidth(startColIndex, colSpan, columnsOffset);
  51. // margin offset
  52. var marginOffset = colSpan > 1 ? colWidth - concatColWidth : 0;
  53. // ========================== Style ===========================
  54. var mergedStyle = _objectSpread(_objectSpread(_objectSpread({}, cellStyle), style), {}, {
  55. flex: "0 0 ".concat(concatColWidth, "px"),
  56. width: "".concat(concatColWidth, "px"),
  57. marginRight: marginOffset,
  58. pointerEvents: 'auto'
  59. });
  60. // When `colSpan` or `rowSpan` is `0`, should skip render.
  61. var needHide = React.useMemo(function () {
  62. if (inverse) {
  63. return rowSpan <= 1;
  64. } else {
  65. return colSpan === 0 || rowSpan === 0 || rowSpan > 1;
  66. }
  67. }, [rowSpan, colSpan, inverse]);
  68. // 0 rowSpan or colSpan should not render
  69. if (needHide) {
  70. mergedStyle.visibility = 'hidden';
  71. } else if (inverse) {
  72. mergedStyle.height = getHeight === null || getHeight === void 0 ? void 0 : getHeight(rowSpan);
  73. }
  74. var mergedRender = needHide ? function () {
  75. return null;
  76. } : render;
  77. // ========================== Render ==========================
  78. var cellSpan = {};
  79. // Virtual should reset `colSpan` & `rowSpan`
  80. if (rowSpan === 0 || colSpan === 0) {
  81. cellSpan.rowSpan = 1;
  82. cellSpan.colSpan = 1;
  83. }
  84. return /*#__PURE__*/React.createElement(Cell, _extends({
  85. className: classNames(columnClassName, className),
  86. ellipsis: column.ellipsis,
  87. align: column.align,
  88. scope: column.rowScope,
  89. component: component,
  90. prefixCls: rowInfo.prefixCls,
  91. key: key,
  92. record: record,
  93. index: index,
  94. renderIndex: renderIndex,
  95. dataIndex: dataIndex,
  96. render: mergedRender,
  97. shouldCellUpdate: column.shouldCellUpdate
  98. }, fixedInfo, {
  99. appendNode: appendCellNode,
  100. additionalProps: _objectSpread(_objectSpread({}, additionalCellProps), {}, {
  101. style: mergedStyle
  102. }, cellSpan)
  103. }));
  104. }
  105. export default VirtualCell;