Header.js 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import { useContext } from '@rc-component/context';
  2. import * as React from 'react';
  3. import TableContext, { responseImmutable } from "../context/TableContext";
  4. import devRenderTimes from "../hooks/useRenderTimes";
  5. import HeaderRow from "./HeaderRow";
  6. function parseHeaderRows(rootColumns) {
  7. var rows = [];
  8. function fillRowCells(columns, colIndex) {
  9. var rowIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
  10. // Init rows
  11. rows[rowIndex] = rows[rowIndex] || [];
  12. var currentColIndex = colIndex;
  13. var colSpans = columns.filter(Boolean).map(function (column) {
  14. var cell = {
  15. key: column.key,
  16. className: column.className || '',
  17. children: column.title,
  18. column: column,
  19. colStart: currentColIndex
  20. };
  21. var colSpan = 1;
  22. var subColumns = column.children;
  23. if (subColumns && subColumns.length > 0) {
  24. colSpan = fillRowCells(subColumns, currentColIndex, rowIndex + 1).reduce(function (total, count) {
  25. return total + count;
  26. }, 0);
  27. cell.hasSubColumns = true;
  28. }
  29. if ('colSpan' in column) {
  30. colSpan = column.colSpan;
  31. }
  32. if ('rowSpan' in column) {
  33. cell.rowSpan = column.rowSpan;
  34. }
  35. cell.colSpan = colSpan;
  36. cell.colEnd = cell.colStart + colSpan - 1;
  37. rows[rowIndex].push(cell);
  38. currentColIndex += colSpan;
  39. return colSpan;
  40. });
  41. return colSpans;
  42. }
  43. // Generate `rows` cell data
  44. fillRowCells(rootColumns, 0);
  45. // Handle `rowSpan`
  46. var rowCount = rows.length;
  47. var _loop = function _loop(rowIndex) {
  48. rows[rowIndex].forEach(function (cell) {
  49. if (!('rowSpan' in cell) && !cell.hasSubColumns) {
  50. // eslint-disable-next-line no-param-reassign
  51. cell.rowSpan = rowCount - rowIndex;
  52. }
  53. });
  54. };
  55. for (var rowIndex = 0; rowIndex < rowCount; rowIndex += 1) {
  56. _loop(rowIndex);
  57. }
  58. return rows;
  59. }
  60. var Header = function Header(props) {
  61. if (process.env.NODE_ENV !== 'production') {
  62. devRenderTimes(props);
  63. }
  64. var stickyOffsets = props.stickyOffsets,
  65. columns = props.columns,
  66. flattenColumns = props.flattenColumns,
  67. onHeaderRow = props.onHeaderRow;
  68. var _useContext = useContext(TableContext, ['prefixCls', 'getComponent']),
  69. prefixCls = _useContext.prefixCls,
  70. getComponent = _useContext.getComponent;
  71. var rows = React.useMemo(function () {
  72. return parseHeaderRows(columns);
  73. }, [columns]);
  74. var WrapperComponent = getComponent(['header', 'wrapper'], 'thead');
  75. var trComponent = getComponent(['header', 'row'], 'tr');
  76. var thComponent = getComponent(['header', 'cell'], 'th');
  77. return /*#__PURE__*/React.createElement(WrapperComponent, {
  78. className: "".concat(prefixCls, "-thead")
  79. }, rows.map(function (row, rowIndex) {
  80. var rowNode = /*#__PURE__*/React.createElement(HeaderRow, {
  81. key: rowIndex,
  82. flattenColumns: flattenColumns,
  83. cells: row,
  84. stickyOffsets: stickyOffsets,
  85. rowComponent: trComponent,
  86. cellComponent: thComponent,
  87. onHeaderRow: onHeaderRow,
  88. index: rowIndex
  89. });
  90. return rowNode;
  91. }));
  92. };
  93. export default responseImmutable(Header);