| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 | import React, { PureComponent } from 'react';// import cls from 'classnames';import PropTypes from 'prop-types';import { noop } from 'lodash';import IconButton from '../iconButton';import Button from '../button';import { cssClasses, strings } from '@douyinfe/semi-foundation/datePicker/constants';import { IconChevronLeft, IconChevronRight, IconDoubleChevronLeft, IconDoubleChevronRight } from '@douyinfe/semi-icons';import { PanelType } from '@douyinfe/semi-foundation/datePicker/monthsGridFoundation';const prefixCls = cssClasses.NAVIGATION;interface NavigationProps {    forwardRef?: React.Ref<HTMLDivElement>;    monthText?: string;    density?: string;    onMonthClick?: (e: React.MouseEvent) => void;    onNextMonth?: () => void;    onPrevMonth?: () => void;    onNextYear?: () => void;    onPrevYear?: () => void;    navPrev?: React.ReactNode;    navNext?: React.ReactNode;    // Whether to switch synchronously for two panels    shouldBimonthSwitch?: boolean;    // Panel type, divided into left panel and right panel    panelType?: PanelType;}export default class Navigation extends PureComponent<NavigationProps> {    static propTypes = {        monthText: PropTypes.string,        density: PropTypes.string,        onMonthClick: PropTypes.func,        onNextMonth: PropTypes.func,        onPrevMonth: PropTypes.func,        onNextYear: PropTypes.func,        onPrevYear: PropTypes.func,        navPrev: PropTypes.node,        navNext: PropTypes.node,        // Whether to switch synchronously for two panels        shouldBimonthSwitch: PropTypes.bool,        // Panel type, divided into left panel and right panel        panelType: PropTypes.oneOf([strings.PANEL_TYPE_LEFT, strings.PANEL_TYPE_RIGHT])    };    static defaultProps = {        monthText: '',        onMonthClick: noop,        onNextMonth: noop,        onPrevMonth: noop,        onNextYear: noop,        onPrevYear: noop,    };    navRef: React.RefObject<HTMLDivElement>;    constructor(props: NavigationProps) {        super(props);        this.navRef = React.createRef();    }    render() {        const {            forwardRef,            monthText,            onMonthClick,            onNextMonth,            onPrevMonth,            onPrevYear,            onNextYear,            density,            shouldBimonthSwitch,            panelType        } = this.props;        const btnTheme = 'borderless';        const iconBtnSize = density === 'compact' ? 'default' : 'large';        const btnNoHorizontalPadding = true;        const buttonSize = density === 'compact' ? 'small' : 'default';        const isLeftPanel = panelType === strings.PANEL_TYPE_LEFT;        const isRightPanel =  panelType === strings.PANEL_TYPE_RIGHT;        // syncSwitchMonth and the current panel is the left        const hiddenLeftPanelRightButtons = shouldBimonthSwitch && isLeftPanel;        // syncSwitchMonth and the current panel is the right        const hiddenRightPanelLeftButtons = shouldBimonthSwitch && isRightPanel;        // `visibility: hidden` will keep the icon in position        const leftButtonStyle: React.CSSProperties = {};        const rightButtonStyle: React.CSSProperties = {};        if (hiddenRightPanelLeftButtons) {            leftButtonStyle.visibility = 'hidden';        }        if (hiddenLeftPanelRightButtons) {            rightButtonStyle.visibility = 'hidden';        }        const ref = forwardRef || this.navRef;        return (            <div className={prefixCls} ref={ref}>                <IconButton                    key="double-chevron-left"                    aria-label="Previous year"                    icon={<IconDoubleChevronLeft aria-hidden size={iconBtnSize} />}                    size={buttonSize}                    theme={btnTheme}                    noHorizontalPadding={btnNoHorizontalPadding}                    onClick={onPrevYear}                    style={leftButtonStyle}                />                <IconButton                    key="chevron-left"                    aria-label="Previous month"                    icon={<IconChevronLeft aria-hidden size={iconBtnSize} />}                    size={buttonSize}                    onClick={onPrevMonth}                    theme={btnTheme}                    noHorizontalPadding={btnNoHorizontalPadding}                    style={leftButtonStyle}                />                <div className={`${prefixCls}-month`}>                    <Button onClick={onMonthClick} theme={btnTheme} size={buttonSize}>                        <span>{monthText}</span>                    </Button>                </div>                <IconButton                    key="chevron-right"                    aria-label="Next month"                    icon={<IconChevronRight aria-hidden size={iconBtnSize} />}                    size={buttonSize}                    onClick={onNextMonth}                    theme={btnTheme}                    noHorizontalPadding={btnNoHorizontalPadding}                    style={rightButtonStyle}                />                <IconButton                    key="double-chevron-right"                    aria-label="Next year"                    icon={<IconDoubleChevronRight aria-hidden size={iconBtnSize} />}                    size={buttonSize}                    theme={btnTheme}                    noHorizontalPadding={btnNoHorizontalPadding}                    onClick={onNextYear}                    style={rightButtonStyle}                />            </div>        );    }}
 |