import * as React from 'react'; import * as moment from 'moment'; import { PREFIX_CLS } from './Constants'; import Select from '../select'; import { Group, Button, RadioChangeEvent } from '../radio'; const Option = Select.Option; export interface HeaderProps { prefixCls?: string; locale?: any; fullscreen?: boolean; yearSelectOffset?: number; yearSelectTotal?: number; type?: string; onValueChange?: (value: moment.Moment) => void; onTypeChange?: (type: string) => void; value: any; validRange ?: [moment.Moment, moment.Moment]; } export default class Header extends React.Component { static defaultProps = { prefixCls: `${PREFIX_CLS}-header`, yearSelectOffset: 10, yearSelectTotal: 20, }; private calenderHeaderNode: HTMLDivElement; getYearSelectElement(year: number) { const { yearSelectOffset, yearSelectTotal, locale, prefixCls, fullscreen, validRange, } = this.props; let start = year - (yearSelectOffset as number); let end = start + (yearSelectTotal as number); if (validRange) { start = validRange[0].get('year'); end = validRange[1].get('year') + 1; } const suffix = locale.year === '年' ? '年' : ''; const options: React.ReactElement[] = []; for (let index = start; index < end; index++) { options.push(); } return ( ); } getMonthsLocale(value: moment.Moment) { const current = value.clone(); const localeData = value.localeData(); const months: any[] = []; for (let i = 0; i < 12; i++) { current.month(i); months.push(localeData.monthsShort(current)); } return months; } getMonthSelectElement(month: number, months: number[]) { const props = this.props; const { prefixCls, fullscreen, validRange, value } = props; const options: React.ReactElement[] = []; let start = 0; let end = 12; if (validRange) { const [rangeStart, rangeEnd] = validRange; const currentYear = value.get('year'); if (rangeEnd.get('year') === currentYear) { end = rangeEnd.get('month') + 1; } else if (rangeStart.get('year') === currentYear) { start = rangeStart.get('month'); } } for (let index = start; index < end; index++) { options.push(); } return ( ); } onYearChange = (year: string) => { const { value, validRange } = this.props; const newValue = value.clone(); newValue.year(parseInt(year, 10)); // switch the month so that it remains within range when year changes if (validRange) { const [ start, end ] = validRange; const newYear = newValue.get('year'); const newMonth = newValue.get('month'); if (newYear === end.get('year') && newMonth > end.get('month')) { newValue.month(end.get('month')); } if (newYear === start.get('year') && newMonth < start.get('month')) { newValue.month(start.get('month')); } } const onValueChange = this.props.onValueChange; if (onValueChange) { onValueChange(newValue); } } onMonthChange = (month: string) => { const newValue = this.props.value.clone(); newValue.month(parseInt(month, 10)); const onValueChange = this.props.onValueChange; if (onValueChange) { onValueChange(newValue); } } onTypeChange = (e: RadioChangeEvent) => { const onTypeChange = this.props.onTypeChange; if (onTypeChange) { onTypeChange(e.target.value); } } getCalenderHeaderNode = (node: HTMLDivElement) => { this.calenderHeaderNode = node; } render() { const { type, value, prefixCls, locale, fullscreen } = this.props; const yearSelect = this.getYearSelectElement(value.year()); const monthSelect = type === 'date' ? this.getMonthSelectElement(value.month(), this.getMonthsLocale(value)) : null; const size = (fullscreen ? 'default' : 'small') as any; const typeSwitch = ( ); return (
{yearSelect} {monthSelect} {typeSwitch}
); } }