| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 | import React, { PureComponent } from 'react';import PropTypes from 'prop-types';import cls from 'classnames';import { noop } from 'lodash';import { IconCaretup, IconCaretdown } from '@douyinfe/semi-icons';import { cssClasses, strings } from '@douyinfe/semi-foundation/table/constants';import { SortOrder } from './interface';import isEnterPress from '@douyinfe/semi-foundation/utils/isEnterPress';export interface ColumnSorterProps {    className?: string;    style?: React.CSSProperties;    onClick?: (e: React.MouseEvent<HTMLDivElement>) => void;    prefixCls?: string;    sortOrder?: SortOrder;    title?: React.ReactNode}export default class ColumnSorter extends PureComponent<ColumnSorterProps> {    static propTypes = {        className: PropTypes.string,        style: PropTypes.object,        onClick: PropTypes.func,        prefixCls: PropTypes.string,        sortOrder: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]),    };    static defaultProps = {        prefixCls: cssClasses.PREFIX,        onClick: noop,        sortOrder: false,    };    render() {        const { prefixCls, onClick, sortOrder, style, title } = this.props;        const iconBtnSize = 'default';        const upCls = cls(`${prefixCls}-column-sorter-up`, {            on: sortOrder === strings.SORT_DIRECTIONS[0],        });        const downCls = cls(`${prefixCls}-column-sorter-down`, {            on: sortOrder === strings.SORT_DIRECTIONS[1],        });        const ariaProps = {            /**             * Set 'aria-sort' to aria-columnheader is difficult, so set 'aria-label' about sort info to sorter             * reference: https://developer.mozilla.org/en-US/docs/Web/API/Element/ariaSort             */            'aria-label': `Current sort order is ${sortOrder ? `${sortOrder}ing` : 'none'}`,            'aria-roledescription': 'Sort data with this column',        };        return (            <div                role='button'                {...ariaProps}                tabIndex={-1}                className={`${prefixCls}-column-sorter-wrapper`}                onClick={onClick}                onKeyPress={e => isEnterPress(e) && onClick(e as any)}            >                {title}                <div                    style={style}                    className={`${prefixCls}-column-sorter`}                >                    <span className={`${upCls}`}>                        <IconCaretup size={iconBtnSize} />                    </span>                    <span className={`${downCls}`}>                        <IconCaretdown size={iconBtnSize} />                    </span>                </div>            </div>        );    }}
 |