You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ant-design/components/calendar/index.jsx

134 lines
3.7 KiB
React

import React, {PropTypes, Component} from 'react';
9 years ago
import GregorianCalendar from 'gregorian-calendar';
import CalendarLocale from 'rc-calendar/lib/locale/zh_CN';
import FullCalendar from 'rc-calendar/lib/FullCalendar';
9 years ago
import {PREFIX_CLS} from './Constants';
9 years ago
import Header from './Header';
function noop () { return null; }
function zerofixed (v) {
if (v < 10) return '0' + v;
return v + '';
}
class Calendar extends Component {
9 years ago
constructor(props) {
super();
this.state = {
value: this.parseDateFromValue(props.value || new Date()),
9 years ago
mode: props.mode,
9 years ago
};
}
parseDateFromValue(value) {
const date = new GregorianCalendar();
date.setTime(value);
return date;
}
componentWillReceiveProps(nextProps) {
if ('value' in nextProps) {
this.setState({
value: this.parseDateFromValue(nextProps.value)
});
}
}
monthCellRender(value, locale) {
9 years ago
const prefixCls = this.props.prefixCls;
const month = value.getMonth();
return <div className={`${prefixCls}-month`}>
<div className={`${prefixCls}-value`}>
{locale.format.shortMonths[month]}
</div>
<div className={`${prefixCls}-content`}>
{this.props.monthCellRender(value)}
</div>
</div>;
}
dateCellRender(value) {
9 years ago
const prefixCls = this.props.prefixCls;
return <div className={`${prefixCls}-date`}>
<div className={`${prefixCls}-value`}>
{zerofixed(value.getDayOfMonth())}
</div>
<div className={`${prefixCls}-content`}>
{this.props.dateCellRender(value)}
</div>
</div>;
}
9 years ago
setValue(value) {
if (!('value' in this.props) && this.state.value !== value) {
9 years ago
this.setState({ value });
}
this.props.onPanelChange(value, this.state.mode);
9 years ago
}
setType(type) {
9 years ago
const mode = (type === 'date') ? 'month' : 'year';
if (this.state.mode !== mode) {
this.setState({ mode });
this.props.onPanelChange(this.state.value, mode);
}
9 years ago
}
onPanelSelect(value, e) {
if (e && e.target === 'month') {
this.forceUpdate();// Because the fullcalendars'type will automaticlly change to 'date' when select month cell, but we didn't want this, so we force update view to get things right, since ours 'mode' would not change.
}
}
render() {
const props = this.props;
9 years ago
const {value, mode} = this.state;
const {locale, prefixCls, style, className, fullscreen} = props;
9 years ago
const type = (mode === 'year') ? 'month' : 'date';
let cls = className || '';
if (fullscreen) {
cls += (' ' + prefixCls + '-fullscreen');
}
9 years ago
return (
<div className={cls} style={style}>
9 years ago
<Header
9 years ago
fullscreen={fullscreen}
9 years ago
type={type}
value={value}
locale={locale}
prefixCls={prefixCls}
9 years ago
onTypeChange={this.setType.bind(this)}
onValueChange={this.setValue.bind(this)}/>
<FullCalendar
{...props}
type={type}
prefixCls={prefixCls}
9 years ago
showHeader={false}
onSelect={this.onPanelSelect.bind(this)}
9 years ago
value={value}
monthCellRender={this.monthCellRender.bind(this)}
dateCellRender={this.dateCellRender.bind(this)} />
9 years ago
</div>
);
}
}
9 years ago
Calendar.propTypes = {
monthCellRender: PropTypes.func,
dateCellRender: PropTypes.func,
fullscreen: PropTypes.bool,
locale: PropTypes.object,
9 years ago
prefixCls: PropTypes.string,
9 years ago
className: PropTypes.string,
style: PropTypes.object,
9 years ago
onPanelChange: PropTypes.func,
value: PropTypes.instanceOf(Date),
};
Calendar.defaultProps = {
monthCellRender: noop,
dateCellRender: noop,
locale: CalendarLocale,
9 years ago
fullscreen: true,
9 years ago
prefixCls: PREFIX_CLS,
9 years ago
onPanelChange: noop,
mode: 'month',
};
export default Calendar;