ColumnSorter.tsx 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import React, { PureComponent } from 'react';
  2. import PropTypes from 'prop-types';
  3. import cls from 'classnames';
  4. import { noop } from 'lodash';
  5. import { IconCaretup, IconCaretdown } from '@douyinfe/semi-icons';
  6. import { cssClasses, strings } from '@douyinfe/semi-foundation/table/constants';
  7. import { SortOrder } from './interface';
  8. export interface ColumnSorterProps {
  9. className?: string;
  10. style?: React.CSSProperties;
  11. onClick?: (e: React.MouseEvent<HTMLDivElement>) => void;
  12. prefixCls?: string;
  13. sortOrder?: SortOrder;
  14. }
  15. export default class ColumnSorter extends PureComponent<ColumnSorterProps> {
  16. static propTypes = {
  17. className: PropTypes.string,
  18. style: PropTypes.object,
  19. onClick: PropTypes.func,
  20. prefixCls: PropTypes.string,
  21. sortOrder: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]),
  22. };
  23. static defaultProps = {
  24. prefixCls: cssClasses.PREFIX,
  25. onClick: noop,
  26. sortOrder: false,
  27. };
  28. render() {
  29. const { prefixCls, onClick, sortOrder, style } = this.props;
  30. const iconBtnSize = 'small';
  31. const upCls = cls(`${prefixCls}-column-sorter-up`, {
  32. on: sortOrder === strings.SORT_DIRECTIONS[0],
  33. });
  34. const downCls = cls(`${prefixCls}-column-sorter-down`, {
  35. on: sortOrder === strings.SORT_DIRECTIONS[1],
  36. });
  37. return (
  38. <div style={style} className={`${prefixCls}-column-sorter`} onClick={onClick}>
  39. <span className={`${upCls}`}>
  40. <IconCaretup size={iconBtnSize} />
  41. </span>
  42. <span className={`${downCls}`}>
  43. <IconCaretdown size={iconBtnSize} />
  44. </span>
  45. </div>
  46. );
  47. }
  48. }