UNPKG

generator-bingo-dig-h5

Version:

Bingo-dig-h5 generator by BINGO.DIG

193 lines (158 loc) 5.37 kB
var React = require('react'); var Classable = require('../../mixins/classable'); var WindowListenable = require('../../mixins/window-listenable'); var DateTime = require('../../utils/date-time'); var KeyCode = require('../../utils/key-code'); var CalendarDay = require('./calendar-day'); var CalendarToolbar = require('./calendar-toolbar'); var DateDisplay = require('./date-display'); var SlideInTransitionGroup = require('../transition-groups/slide-in'); var Calendar = React.createClass({ mixins: [Classable, WindowListenable], propTypes: { initialDate: React.PropTypes.object, isActive: React.PropTypes.bool }, windowListeners: { 'keydown': '_handleWindowKeyDown' }, getDefaultProps: function() { return { initialDate: new Date() }; }, getInitialState: function() { return { displayDate: DateTime.getFirstDayOfMonth(this.props.initialDate), selectedDate: this.props.initialDate, transitionDirection: 'left' }; }, componentWillReceiveProps: function(nextProps) { if (nextProps.initialDate !== this.props.initialDate) { var d = nextProps.initialDate || new Date(); this.setState({ displayDate: DateTime.getFirstDayOfMonth(d), selectedDate: d }); } }, render: function() { var weekCount = DateTime.getWeekArray(this.state.displayDate).length; var classes = this.getClasses('dig-date-picker-calendar', { 'dig-is-4week': weekCount === 4, 'dig-is-5week': weekCount === 5, 'dig-is-6week': weekCount === 6 }); return ( <div className={classes}> <DateDisplay className="dig-date-picker-calendar-date-display" selectedDate={this.state.selectedDate} /> <div className="dig-date-picker-calendar-container"> <CalendarToolbar displayDate={this.state.displayDate} onLeftTouchTap={this._handleLeftTouchTap} onRightTouchTap={this._handleRightTouchTap} /> <ul className="dig-date-picker-calendar-week-title"> <li className="dig-date-picker-calendar-week-title-day">S</li> <li className="dig-date-picker-calendar-week-title-day">M</li> <li className="dig-date-picker-calendar-week-title-day">T</li> <li className="dig-date-picker-calendar-week-title-day">W</li> <li className="dig-date-picker-calendar-week-title-day">T</li> <li className="dig-date-picker-calendar-week-title-day">F</li> <li className="dig-date-picker-calendar-week-title-day">S</li> </ul> <SlideInTransitionGroup direction={this.state.transitionDirection}> <CalendarDay key={this.state.displayDate.toDateString()} displayDate={this.state.displayDate} onDayTouchTap={this._handleDayTouchTap} selectedDate={this.state.selectedDate} /> </SlideInTransitionGroup> </div> </div> ); }, getSelectedDate: function() { return this.state.selectedDate; }, _addDisplayDate: function(m) { var newDisplayDate = DateTime.clone(this.state.displayDate); newDisplayDate.setMonth(newDisplayDate.getMonth() + m); this._setDisplayDate(newDisplayDate); }, _addSelectedDays: function(days) { this._setSelectedDate(DateTime.addDays(this.state.selectedDate, days)); }, _addSelectedMonths: function(months) { this._setSelectedDate(DateTime.addMonths(this.state.selectedDate, months)); }, _setDisplayDate: function(d, newSelectedDate) { var newDisplayDate = DateTime.getFirstDayOfMonth(d); var direction = newDisplayDate > this.state.displayDate ? 'left' : 'right'; if (newDisplayDate !== this.state.displayDate) { this.setState({ displayDate: newDisplayDate, transitionDirection: direction, selectedDate: newSelectedDate || this.state.selectedDate }); } }, _setSelectedDate: function(d) { var newDisplayDate = DateTime.getFirstDayOfMonth(d); if (newDisplayDate !== this.state.displayDate) { this._setDisplayDate(newDisplayDate, d); } else { this.setState({ selectedDate: d }); } }, _handleDayTouchTap: function(e, date) { this._setSelectedDate(date); }, _handleLeftTouchTap: function() { this._addDisplayDate(-1); }, _handleRightTouchTap: function() { this._addDisplayDate(1); }, _handleWindowKeyDown: function(e) { var newSelectedDate; if (this.props.isActive) { switch (e.keyCode) { case KeyCode.UP: if (e.shiftKey) { this._addSelectedMonths(-1); } else { this._addSelectedDays(-7); } break; case KeyCode.DOWN: if (e.shiftKey) { this._addSelectedMonths(1); } else { this._addSelectedDays(7); } break; case KeyCode.RIGHT: if (e.shiftKey) { this._addSelectedMonths(1); } else { this._addSelectedDays(1); } break; case KeyCode.LEFT: if (e.shiftKey) { this._addSelectedMonths(-1); } else { this._addSelectedDays(-1); } break; } } } }); module.exports = Calendar;