HeadTable.tsx 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. /* eslint-disable max-len */
  2. import React from 'react';
  3. import PropTypes from 'prop-types';
  4. import { get, noop } from 'lodash';
  5. import classnames from 'classnames';
  6. import ColGroup from './ColGroup';
  7. import TableHeader from './TableHeader';
  8. import { Fixed, TableComponents, Scroll, BodyScrollEvent, ColumnProps } from './interface';
  9. export interface HeadTableProps {
  10. [x: string]: any;
  11. anyColumnFixed?: boolean;
  12. bodyHasScrollBar?: boolean;
  13. columns?: ColumnProps[];
  14. components?: TableComponents;
  15. dataSource?: Record<string, any>[];
  16. fixed?: Fixed;
  17. handleBodyScroll?: React.EventHandler<BodyScrollEvent>;
  18. prefixCls?: string;
  19. forwardedRef?: React.MutableRefObject<HTMLDivElement> | ((instance: any) => void);
  20. scroll?: Scroll;
  21. selectedRowKeysSet: Set<any>;
  22. showHeader?: boolean;
  23. onDidUpdate?: (ref: React.MutableRefObject<any>) => void;
  24. }
  25. /**
  26. * When there are fixed columns, the header is rendered as a separate Table
  27. */
  28. class HeadTable extends React.PureComponent<HeadTableProps> {
  29. static propTypes = {
  30. anyColumnFixed: PropTypes.bool,
  31. bodyHasScrollBar: PropTypes.bool,
  32. columns: PropTypes.array,
  33. components: PropTypes.object,
  34. dataSource: PropTypes.array,
  35. fixed: PropTypes.oneOfType([PropTypes.bool, PropTypes.string]),
  36. handleBodyScroll: PropTypes.func,
  37. prefixCls: PropTypes.string,
  38. forwardedRef: PropTypes.oneOfType([PropTypes.object, PropTypes.func]),
  39. scroll: PropTypes.shape({
  40. x: PropTypes.oneOfType([PropTypes.number, PropTypes.string, PropTypes.bool]),
  41. y: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
  42. }),
  43. selectedRowKeysSet: PropTypes.instanceOf(Set).isRequired, // Useful when update is selected
  44. showHeader: PropTypes.bool,
  45. onDidUpdate: PropTypes.func,
  46. };
  47. static defaultProps = {
  48. handleBodyScroll: noop,
  49. };
  50. constructor(props: HeadTableProps = { selectedRowKeysSet: new Set() }) {
  51. super(props);
  52. }
  53. render() {
  54. const {
  55. scroll,
  56. prefixCls,
  57. fixed,
  58. forwardedRef,
  59. handleBodyScroll,
  60. columns,
  61. components,
  62. onDidUpdate,
  63. showHeader,
  64. anyColumnFixed,
  65. bodyHasScrollBar
  66. } = this.props;
  67. if (!showHeader) {
  68. return null;
  69. }
  70. const Table = get(components, 'header.outer', 'table');
  71. const x = get(scroll, 'x');
  72. const headStyle: Partial<React.CSSProperties> = {};
  73. const tableStyle: { width?: number | string } = {};
  74. if (x && !fixed) {
  75. tableStyle.width = x;
  76. }
  77. if (bodyHasScrollBar) {
  78. headStyle.overflowY = 'scroll';
  79. }
  80. const colgroup = <ColGroup columns={columns} prefixCls={prefixCls} />;
  81. const tableHeader = (
  82. <TableHeader {...this.props} columns={columns} components={components} onDidUpdate={onDidUpdate} />
  83. );
  84. return (
  85. <div
  86. key="headTable"
  87. style={headStyle}
  88. className={`${prefixCls}-header`}
  89. ref={forwardedRef}
  90. onScroll={handleBodyScroll}
  91. >
  92. <Table
  93. style={tableStyle}
  94. className={classnames(prefixCls, {
  95. [`${prefixCls}-fixed`]: anyColumnFixed,
  96. })}
  97. >
  98. {colgroup}
  99. {tableHeader}
  100. </Table>
  101. </div>
  102. );
  103. }
  104. }
  105. export default React.forwardRef<HTMLDivElement, HeadTableProps>((props, ref) => <HeadTable {...props} forwardedRef={ref} />);