material-ui
Version:
Material Design UI components built with React
185 lines (154 loc) • 4.36 kB
JSX
let React = require('react');
let StylePropable = require('../mixins/style-propable');
let WindowListenable = require('../mixins/window-listenable');
let CssEvent = require('../utils/css-event');
let KeyCode = require('../utils/key-code');
let Calendar = require('./calendar');
let Dialog = require('../dialog');
let FlatButton = require('../flat-button');
let DatePickerDialog = React.createClass({
mixins: [StylePropable, WindowListenable],
contextTypes: {
muiTheme: React.PropTypes.object,
},
propTypes: {
initialDate: React.PropTypes.object,
onAccept: React.PropTypes.func,
onShow: React.PropTypes.func,
onDismiss: React.PropTypes.func,
onClickAway: React.PropTypes.func,
minDate: React.PropTypes.object,
maxDate: React.PropTypes.object,
shouldDisableDate: React.PropTypes.func,
hideToolbarYearChange: React.PropTypes.bool,
showYearSelector: React.PropTypes.bool,
},
windowListeners: {
keyup: '_handleWindowKeyUp',
},
getInitialState() {
return {
isCalendarActive: false,
showMonthDayPicker: true,
};
},
render() {
let {
initialDate,
onAccept,
style,
...other
} = this.props;
let styles = {
root: {
fontSize: 14,
color: this.context.muiTheme.component.datePicker.calendarTextColor,
},
dialogContent: {
width: this.props.mode === 'landscape' ? 560 : 280,
},
dialogBodyContent: {
padding: 0,
},
actions: {
marginRight: 8,
},
};
let actions = [
<FlatButton
key={0}
label="Cancel"
secondary={true}
style={styles.actions}
onTouchTap={this._handleCancelTouchTap} />,
];
if (!this.props.autoOk) {
actions.push(
<FlatButton
key={1}
label="OK"
secondary={true}
disabled={this.refs.calendar !== undefined && this.refs.calendar.isSelectedDateDisabled()}
style={styles.actions}
onTouchTap={this._handleOKTouchTap} />
);
}
return (
<Dialog {...other}
ref="dialog"
style={styles.root}
contentStyle={styles.dialogContent}
bodyStyle={styles.dialogBodyContent}
actions={actions}
onDismiss={this._handleDialogDismiss}
onShow={this._handleDialogShow}
onClickAway={this._handleDialogClickAway}
repositionOnUpdate={false}>
<Calendar
ref="calendar"
onSelectedDate={this._onSelectedDate}
initialDate={this.props.initialDate}
isActive={this.state.isCalendarActive}
minDate={this.props.minDate}
maxDate={this.props.maxDate}
shouldDisableDate={this.props.shouldDisableDate}
shouldShowMonthDayPickerFirst={this.state.showMonthDayPicker}
hideToolbarYearChange={this.props.hideToolbarYearChange}
showYearSelector={this.props.showYearSelector}
mode={this.props.mode} />
</Dialog>
);
},
show() {
this.refs.dialog.show();
},
dismiss() {
this.refs.dialog.dismiss();
},
_onSelectedDate() {
if (this.props.autoOk) {
setTimeout(this._handleOKTouchTap, 300);
}
},
_handleCancelTouchTap() {
this.dismiss();
},
_handleOKTouchTap() {
if (this.props.onAccept && !this.refs.calendar.isSelectedDateDisabled()) {
this.props.onAccept(this.refs.calendar.getSelectedDate());
}
this.dismiss();
},
_handleDialogShow() {
this.setState({
isCalendarActive: true,
});
if (this.props.onShow) this.props.onShow();
},
_handleDialogDismiss() {
CssEvent.onTransitionEnd(this.refs.dialog.getDOMNode(), () => {
this.setState({
isCalendarActive: false,
showMonthDayPicker: true,
});
});
if (this.props.onDismiss) this.props.onDismiss();
},
_handleDialogClickAway() {
CssEvent.onTransitionEnd(this.refs.dialog.getDOMNode(), () => {
this.setState({
isCalendarActive: false,
showMonthDayPicker: true,
});
});
if (this.props.onClickAway) this.props.onClickAway();
},
_handleWindowKeyUp(e) {
switch (e.keyCode) {
case KeyCode.ENTER:
this._handleOKTouchTap();
break;
}
},
});
module.exports = DatePickerDialog;