HeadTable.tsx 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  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, OnHeaderRow } 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. onHeaderRow?: OnHeaderRow<any>;
  25. }
  26. /**
  27. * When there are fixed columns, the header is rendered as a separate Table
  28. */
  29. class HeadTable extends React.PureComponent<HeadTableProps> {
  30. static propTypes = {
  31. anyColumnFixed: PropTypes.bool,
  32. bodyHasScrollBar: PropTypes.bool,
  33. columns: PropTypes.array,
  34. components: PropTypes.object,
  35. dataSource: PropTypes.array,
  36. fixed: PropTypes.oneOfType([PropTypes.bool, PropTypes.string]),
  37. handleBodyScroll: PropTypes.func,
  38. prefixCls: PropTypes.string,
  39. forwardedRef: PropTypes.oneOfType([PropTypes.object, PropTypes.func]),
  40. scroll: PropTypes.shape({
  41. x: PropTypes.oneOfType([PropTypes.number, PropTypes.string, PropTypes.bool]),
  42. y: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
  43. }),
  44. selectedRowKeysSet: PropTypes.instanceOf(Set).isRequired, // Useful when update is selected
  45. showHeader: PropTypes.bool,
  46. onDidUpdate: PropTypes.func,
  47. onHeaderRow: PropTypes.func,
  48. };
  49. static defaultProps = {
  50. handleBodyScroll: noop,
  51. };
  52. constructor(props: HeadTableProps = { selectedRowKeysSet: new Set() }) {
  53. super(props);
  54. }
  55. render() {
  56. const {
  57. scroll,
  58. prefixCls,
  59. fixed,
  60. forwardedRef,
  61. handleBodyScroll,
  62. columns,
  63. components,
  64. onDidUpdate,
  65. showHeader,
  66. anyColumnFixed,
  67. bodyHasScrollBar
  68. } = this.props;
  69. if (!showHeader) {
  70. return null;
  71. }
  72. const Table = get(components, 'header.outer', 'table');
  73. const x = get(scroll, 'x');
  74. const headStyle: Partial<React.CSSProperties> = {};
  75. const tableStyle: { width?: number | string } = {};
  76. if (x && !fixed) {
  77. tableStyle.width = x;
  78. }
  79. if (bodyHasScrollBar) {
  80. headStyle.overflowY = 'scroll';
  81. }
  82. const colgroup = <ColGroup columns={columns} prefixCls={prefixCls} />;
  83. const tableHeader = (
  84. <TableHeader {...this.props} columns={columns} components={components} onDidUpdate={onDidUpdate} />
  85. );
  86. return (
  87. <div
  88. key="headTable"
  89. style={headStyle}
  90. className={`${prefixCls}-header`}
  91. ref={forwardedRef}
  92. onScroll={handleBodyScroll}
  93. >
  94. <Table
  95. style={tableStyle}
  96. className={classnames(prefixCls, {
  97. [`${prefixCls}-fixed`]: anyColumnFixed,
  98. })}
  99. >
  100. {colgroup}
  101. {tableHeader}
  102. </Table>
  103. </div>
  104. );
  105. }
  106. }
  107. export default React.forwardRef<HTMLDivElement, HeadTableProps>((props, ref) => <HeadTable {...props} forwardedRef={ref} />);