UNPKG

react-date-picker

Version:

A carefully crafted date picker for React

1,344 lines (1,041 loc) 39 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.renderFooter = exports.NAV_KEYS = undefined; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _reactDom = require('react-dom'); var _reactClass = require('react-class'); var _reactClass2 = _interopRequireDefault(_reactClass); var _moment = require('moment'); var _moment2 = _interopRequireDefault(_moment); var _objectAssign = require('object-assign'); var _objectAssign2 = _interopRequireDefault(_objectAssign); var _clampRange = require('../clampRange'); var _clampRange2 = _interopRequireDefault(_clampRange); var _toMoment = require('../toMoment'); var _toMoment2 = _interopRequireDefault(_toMoment); var _join = require('../join'); var _join2 = _interopRequireDefault(_join); var _isInRange = require('../utils/isInRange'); var _isInRange2 = _interopRequireDefault(_isInRange); var _NavBar = require('../NavBar'); var _NavBar2 = _interopRequireDefault(_NavBar); var _Footer = require('../Footer'); var _Footer2 = _interopRequireDefault(_Footer); var _bemFactory = require('../bemFactory'); var _bemFactory2 = _interopRequireDefault(_bemFactory); var _joinFunctions = require('../joinFunctions'); var _joinFunctions2 = _interopRequireDefault(_joinFunctions); var _assignDefined = require('../assignDefined'); var _assignDefined2 = _interopRequireDefault(_assignDefined); var _BasicMonthView = require('../BasicMonthView'); var _BasicMonthView2 = _interopRequireDefault(_BasicMonthView); var _onKeyDown = require('./onKeyDown'); var _onKeyDown2 = _interopRequireDefault(_onKeyDown); var _navKeys = require('./navKeys'); var _navKeys2 = _interopRequireDefault(_navKeys); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var TODAY = void 0; var RENDER_DAY = function RENDER_DAY(props) { var divProps = (0, _objectAssign2.default)({}, props); delete divProps.date; delete divProps.dateMoment; delete divProps.day; delete divProps.isAfterMaxDate; delete divProps.isBeforeMinDate; delete divProps.inRange; delete divProps.timestamp; return _react2.default.createElement('div', divProps); }; var isDateInMinMax = function isDateInMinMax(timestamp, props) { if (props.minDate && timestamp < props.minDate) { return false; } if (props.maxDate && timestamp > props.maxDate) { return false; } return true; }; var _isValidActiveDate = function _isValidActiveDate(timestamp, props) { if (!props) { throw new Error('props is mandatory in isValidActiveDate'); } var dayProps = props.dayPropsMap[timestamp]; if (dayProps && dayProps.disabled) { return false; } return isDateInMinMax(timestamp, props); }; var _isInView = function _isInView(mom, props) { if (!props) { throw new Error('props is mandatory in isInView'); } var daysInView = props.daysInView; return (0, _isInRange2.default)(mom, { range: daysInView, inclusive: true }); }; var prepareViewDate = function prepareViewDate(props, state) { var viewDate = props.viewDate === undefined ? state.viewDate : props.viewDate; if (!viewDate && props.moment) { return (0, _toMoment2.default)(props.moment); } return viewDate; }; var prepareDate = function prepareDate(props, state) { if (props.range) { return null; } return props.date === undefined ? state.date : props.date; }; var prepareRange = function prepareRange(props, state) { if (props.moment) { return null; } return props.partialRange ? props.range || state.range : state.range || props.range; }; var prepareActiveDate = function prepareActiveDate(props, state) { var fallbackDate = prepareDate(props, state) || (prepareRange(props, state) || [])[0]; var activeDate = props.activeDate === undefined ? // only fallback to date if activeDate not specified state.activeDate || fallbackDate : props.activeDate; var daysInView = props.daysInView; if (activeDate && daysInView && props.constrainActiveInView) { var activeMoment = this.toMoment(activeDate); if (!_isInView(activeMoment, props)) { var date = fallbackDate; var dateMoment = this.toMoment(date); if (date && _isInView(dateMoment, props) && _isValidActiveDate(+dateMoment, props)) { return date; } return null; } } return _isValidActiveDate(+activeDate, props) ? activeDate : null; }; var _renderFooter = function renderFooter(props, buttonHandlers) { if (!props.footer) { return null; } buttonHandlers = buttonHandlers || props; var renderFooter = props.renderFooter; var footerFnProps = { onTodayClick: buttonHandlers.onFooterTodayClick, onClearClick: buttonHandlers.onFooterClearClick, onOkClick: buttonHandlers.onFooterOkClick, onCancelClick: buttonHandlers.onFooterCancelClick }; var childFooter = _react2.default.Children.toArray(props.children).filter(function (c) { return c && c.props && c.props.isDatePickerFooter; })[0]; var childFooterProps = childFooter ? childFooter.props : null; if (childFooterProps) { // also take into account the props on childFooter // so we merge those with the other props already built Object.keys(footerFnProps).forEach(function (key) { if (childFooter.props[key]) { footerFnProps[key] = (0, _joinFunctions2.default)(footerFnProps[key], childFooter.props[key]); } }); } var footerProps = (0, _assignDefined2.default)({}, footerFnProps, { todayButton: props.todayButton, todayButtonText: props.todayButtonText, clearButton: props.clearButton, clearButtonText: props.clearButtonText, okButton: props.okButton === undefined && !props.insideField ? false : props.okButton, okButtonText: props.okButtonText, cancelButton: props.cancelButton === undefined && !props.insideField ? false : props.cancelButton, cancelButtonText: props.cancelButtonText, clearDate: props.clearDate || props.footerClearDate, selectDate: props.selectDate }); if (childFooter) { if (renderFooter) { return renderFooter((0, _objectAssign2.default)({}, childFooter.props, footerProps)); } return _react2.default.cloneElement(childFooter, footerProps); } if (renderFooter) { return renderFooter(footerProps); } return _react2.default.createElement(_Footer2.default, footerProps); }; var MonthView = function (_Component) { _inherits(MonthView, _Component); _createClass(MonthView, [{ key: 'isInView', value: function isInView(mom, props) { return _isInView(mom, props || this.p); } }]); function MonthView(props) { _classCallCheck(this, MonthView); var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(MonthView).call(this, props)); _this.state = { range: props.defaultRange, date: props.defaultDate, hoverRange: props.defaultHoverRange, activeDate: props.defaultActiveDate, viewDate: props.defaultViewDate }; return _this; } _createClass(MonthView, [{ key: 'componentWillMount', value: function componentWillMount() { this.updateBem(this.props); this.updateToMoment(this.props); } }, { key: 'componentWillReceiveProps', value: function componentWillReceiveProps(nextProps) { if (nextProps.defaultClassName != this.props.defaultClassName) { this.updateBem(nextProps); } this.updateToMoment(nextProps); } }, { key: 'updateBem', value: function updateBem(props) { this.bem = (0, _bemFactory2.default)(props.defaultClassName); } }, { key: 'updateToMoment', value: function updateToMoment(props) { this.toMoment = function (value, dateFormat) { return (0, _toMoment2.default)(value, { locale: props.locale, dateFormat: dateFormat || props.dateFormat }); }; TODAY = +this.toMoment().startOf('day'); } }, { key: 'prepareClassName', value: function prepareClassName(props) { return (0, _join2.default)(props.className, this.bem(), this.bem(null, 'theme-' + props.theme)); } }, { key: 'prepareProps', value: function prepareProps(thisProps, state) { var _this2 = this; var props = this.p = (0, _objectAssign2.default)({}, thisProps); state = state || this.state; props.hoverRange = props.hoverRange === undefined ? this.state.hoverRange : props.hoverRange; props.dayPropsMap = {}; props.className = this.prepareClassName && this.prepareClassName(props); var minDate = props.minDate; var maxDate = props.maxDate; if (minDate) { props.minDateMoment = this.toMoment(props.minDate).startOf('day'); props.minDate = +props.minDateMoment; } if (maxDate) { props.maxDateMoment = this.toMoment(props.maxDate); props.maxDate = +props.maxDateMoment; } var date = prepareDate(props, state); if (date) { props.moment = props.moment || (props.range ? null : this.toMoment(date).startOf('day')); props.timestamp = props.moment ? +props.moment : null; } props.viewMoment = props.viewMoment || this.toMoment(prepareViewDate(props, state)); if (props.constrainViewDate && props.minDate && props.viewMoment.isBefore(props.minDate)) { props.minConstrained = true; props.viewMoment = this.toMoment(props.minDate); } if (props.constrainViewDate && props.maxDate && props.viewMoment.isAfter(props.maxDate)) { props.maxConstrained = true; props.viewMoment = this.toMoment(props.maxDate); } props.viewMonthStart = this.toMoment(props.viewMoment).startOf('month'); props.viewMonthEnd = this.toMoment(props.viewMoment).endOf('month'); var range = prepareRange(props, state); if (range) { props.range = range.map(function (d) { return _this2.toMoment(d).startOf('day'); }); props.rangeStart = state.rangeStart || (props.range.length == 1 ? props.range[0] : null); } props.daysInView = (0, _BasicMonthView.getDaysInMonthView)(props.viewMoment, props); var activeDate = prepareActiveDate.call(this, props, state); if (activeDate) { props.activeDate = +this.toMoment(activeDate).startOf('day'); } return props; } }, { key: 'getViewMoment', value: function getViewMoment() { return this.p.viewMoment; } }, { key: 'getViewSize', value: function getViewSize() { return 1; } // handleViewMouseLeave(){ // this.state.range && this.setState({ range: null }) // } }, { key: 'preparePrevNextClassName', value: function preparePrevNextClassName(timestamp, props) { var viewMonthStart = props.viewMonthStart; var viewMonthEnd = props.viewMonthEnd; var before = timestamp < viewMonthStart; var after = timestamp > viewMonthEnd; var thisMonth = !before && !after; return (0, _join2.default)(timestamp == TODAY && this.bem('day--today'), props.highlightToday && timestamp == TODAY && this.bem('day--today-highlight'), before && this.bem('day--prev-month'), before && !props.showDaysBeforeMonth && this.bem('day--hidden'), after && this.bem('day--next-month'), after && !props.showDaysAfterMonth && this.bem('day--hidden'), thisMonth && this.bem('day--this-month')); } }, { key: 'prepareMinMaxProps', value: function prepareMinMaxProps(timestamp, props) { var classes = []; var isBeforeMinDate = false; var isAfterMaxDate = false; var minDate = props.minDate; var maxDate = props.maxDate; if (minDate && timestamp < minDate) { classes.push(this.bem('day--disabled-min')); isBeforeMinDate = true; } if (maxDate && timestamp > maxDate) { classes.push(this.bem('day--disabled-max')); isAfterMaxDate = true; } return { className: (0, _join2.default)(classes), isBeforeMinDate: isBeforeMinDate, isAfterMaxDate: isAfterMaxDate, disabled: isBeforeMinDate || isAfterMaxDate }; } }, { key: 'prepareWeekendClassName', value: function prepareWeekendClassName(dateMoment, _ref) { var highlightWeekends = _ref.highlightWeekends; // const props = this.p var weekDay = dateMoment.day(); // const weekendStartDay = getWeekendStartDay(props) if (weekDay === 0 /* Sunday */ || weekDay === 6 /* Saturday */) { // if (weekDay === weekendStartDay || weekDay === weekendStartDay + 1) { return (0, _join2.default)(this.bem('day--weekend'), highlightWeekends && this.bem('day--weekend-highlight')); } return ''; } }, { key: 'prepareRangeProps', value: function prepareRangeProps(dateMoment, props) { var inRange = false; var className = []; var hoverRange = props.hoverRange; var range = props.range; if (range) { var _range = _slicedToArray(range, 2); var rangeStart = _range[0]; var rangeEnd = _range[1]; if (!range.length) { rangeStart = props.rangeStart; } // const rangeName = !props.partialRange ? 'hover-range' : 'range' var rangeName = 'range'; //hoverRange ? 'range' : 'hover-range' if (rangeStart && dateMoment.isSame(rangeStart)) { className.push(this.bem('day--' + rangeName + '-start')); className.push(this.bem('day--in-' + rangeName)); if (!rangeEnd) { className.push(this.bem('day--' + rangeName + '-end')); } inRange = true; } if (rangeEnd && dateMoment.isSame(rangeEnd)) { className.push(this.bem('day--' + rangeName + '-end')); className.push(this.bem('day--in-' + rangeName)); inRange = true; } if (!inRange && (0, _isInRange2.default)(dateMoment, range)) { className.push(this.bem('day--in-' + rangeName)); inRange = true; } } if (range && range.length < 2 && hoverRange && (0, _isInRange2.default)(dateMoment, hoverRange)) { className.push(this.bem('day--in-hover-range')); if (dateMoment.isSame(hoverRange[0])) { className.push(this.bem('day--hover-range-start')); } if (dateMoment.isSame(hoverRange[1])) { className.push(this.bem('day--hover-range-end')); } } return { inRange: inRange, className: (0, _join2.default)(className) }; } }, { key: 'prepareDayProps', value: function prepareDayProps(renderDayProps, props) { var timestamp = renderDayProps.timestamp; var dateMoment = renderDayProps.dateMoment; var className = renderDayProps.className; props = props || this.p; var result = {}; var minMaxProps = this.prepareMinMaxProps(timestamp, props); var rangeProps = this.prepareRangeProps(dateMoment, props); var weekendClassName = this.prepareWeekendClassName(dateMoment, props); var prevNextClassName = this.preparePrevNextClassName(timestamp, props); var currentTimestamp = props.timestamp; (0, _objectAssign2.default)(result, minMaxProps, rangeProps, { children: _react2.default.createElement( 'div', { className: this.bem('day-text') }, renderDayProps.day ), className: (0, _join2.default)([minMaxProps.className, rangeProps.className, prevNextClassName, weekendClassName, timestamp == currentTimestamp ? this.bem('day--value') : null, timestamp == props.activeDate ? this.bem('day--active') : null, className]) }); if (!result.disabled && props.isDisabledDay) { result.disabled = props.isDisabledDay(renderDayProps, props); } return result; } }, { key: 'focus', value: function focus() { var domNode = (0, _reactDom.findDOMNode)(this); if (domNode) { domNode.focus(); } } }, { key: 'onDayTextMouseEnter', value: function onDayTextMouseEnter(_ref2) { var dateMoment = _ref2.dateMoment; var timestamp = _ref2.timestamp; if (!this.state.focused) { this.focus(); } this.onActiveDateChange({ dateMoment: dateMoment, timestamp: timestamp }); } }, { key: 'renderDay', value: function renderDay(renderProps) { var _this3 = this; var props = this.p; var _renderProps = renderProps; var dateMoment = _renderProps.dateMoment; var timestamp = _renderProps.timestamp; (0, _objectAssign2.default)(renderProps, this.prepareDayProps(renderProps, props)); if (props.range && props.highlightRangeOnMouseMove) { renderProps.onMouseEnter = this.handleDayMouseEnter.bind(this, renderProps); } if (typeof props.onRenderDay === 'function') { renderProps = props.onRenderDay(renderProps); } if (renderProps.disabled) { renderProps.className = (0, _join2.default)(this.bem('day--disabled'), renderProps.className); } else { (function () { var eventParam = { dateMoment: dateMoment, timestamp: timestamp }; var onClick = _this3.handleClick.bind(_this3, eventParam); var prevOnClick = renderProps.onClick; renderProps.onClick = prevOnClick ? function () { prevOnClick.apply(undefined, arguments); onClick.apply(undefined, arguments); } : onClick; if (props.activateOnHover && _this3.props.activeDate !== null) { (function () { var onMouseEnter = _this3.onDayTextMouseEnter.bind(_this3, eventParam); var prevOnMouseEnter = renderProps.onMouseEnter; renderProps.onMouseEnter = prevOnMouseEnter ? function () { prevOnMouseEnter.apply(undefined, arguments); onMouseEnter.apply(undefined, arguments); } : onMouseEnter; })(); } })(); } props.dayPropsMap[timestamp] = renderProps; var renderFunction = props.renderDay || RENDER_DAY; var result = renderFunction(renderProps); if (result === undefined) { result = RENDER_DAY(renderProps); } return result; } }, { key: 'render', value: function render() { var props = this.p = this.prepareProps(this.props); var basicViewProps = (0, _objectAssign2.default)({}, props); delete basicViewProps.activeDate; delete basicViewProps.activateOnHover; delete basicViewProps.arrows; delete basicViewProps.cleanup; delete basicViewProps.constrainViewDate; delete basicViewProps.constrainActiveInView; delete basicViewProps.dayPropsMap; delete basicViewProps.date; delete basicViewProps.defaultActiveDate; delete basicViewProps.defaultDate; delete basicViewProps.defaultRange; delete basicViewProps.defaultViewDate; delete basicViewProps.enableHistoryView; delete basicViewProps.focusOnFooterMouseDown; delete basicViewProps.focusOnNavMouseDown; delete basicViewProps.footer; delete basicViewProps.footerClearDate; delete basicViewProps.getTransitionTime; delete basicViewProps.highlightRangeOnMouseMove; delete basicViewProps.highlightToday; delete basicViewProps.highlightWeekends; delete basicViewProps.hoverRange; delete basicViewProps.insideField; delete basicViewProps.isDatePicker; delete basicViewProps.isDisabledDay; delete basicViewProps.maxConstrained; delete basicViewProps.maxDate; delete basicViewProps.maxDateMoment; delete basicViewProps.minConstrained; delete basicViewProps.minDate; delete basicViewProps.minDateMoment; delete basicViewProps.navBarArrows; delete basicViewProps.navNext; delete basicViewProps.navigation; delete basicViewProps.navOnDateClick; delete basicViewProps.navPrev; delete basicViewProps.onActiveDateChange; delete basicViewProps.onChange; delete basicViewProps.onRangeChange; delete basicViewProps.onViewDateChange; delete basicViewProps.onTransitionStart; delete basicViewProps.partialRange; delete basicViewProps.range; delete basicViewProps.rangeStart; delete basicViewProps.renderNavBar; delete basicViewProps.showDaysAfterMonth; delete basicViewProps.showDaysBeforeMonth; delete basicViewProps.theme; delete basicViewProps.viewDate; delete basicViewProps.viewMonthEnd; delete basicViewProps.viewMonthStart; if (typeof props.cleanup == 'function') { props.cleanup(basicViewProps); } return _react2.default.createElement(_BasicMonthView2.default, _extends({ tabIndex: 0 }, basicViewProps, { renderChildren: this.renderChildren, onKeyDown: this.onViewKeyDown, onFocus: this.onFocus, onBlur: this.onBlur, renderDay: this.renderDay, viewMoment: props.viewMoment, onMouseLeave: props.highlightRangeOnMouseMove && this.handleViewMouseLeave })); } }, { key: 'handleViewMouseLeave', value: function handleViewMouseLeave(event) { if (this.props.onMouseLeave) { this.props.onMouseLeave(event); } if (this.state.hoverRange) { this.setHoverRange(null); } } }, { key: 'renderChildren', value: function renderChildren(children) { var props = this.p; var navBar = this.renderNavBar(props); var footer = this.renderFooter(props); var result = [navBar, children, footer]; if (props.renderChildren) { return props.renderChildren(result); } return result; } }, { key: 'focusFromFooter', value: function focusFromFooter() { if (!this.isFocused() && this.props.focusOnFooterMouseDown) { this.focus(); } } }, { key: 'onFooterTodayClick', value: function onFooterTodayClick() { this.focusFromFooter(); if (this.props.onFooterTodayClick) { if (this.props.onFooterTodayClick() === false) { return; } } this.select({ dateMoment: this.toMoment(Date.now()) }); } }, { key: 'onFooterClearClick', value: function onFooterClearClick() { this.focusFromFooter(); if (this.props.onFooterClearClick) { if (this.props.onFooterClearClick() === false) { return; } } this.select({ dateMoment: null }); } }, { key: 'onFooterOkClick', value: function onFooterOkClick() { this.focusFromFooter(); if (this.props.onFooterOkClick) { this.props.onFooterOkClick(); } } }, { key: 'onFooterCancelClick', value: function onFooterCancelClick() { if (this.props.onFooterCancelClick) { this.props.onFooterCancelClick(); } } }, { key: 'renderFooter', value: function renderFooter(props) { return _renderFooter((0, _objectAssign2.default)({}, props, { selectDate: this.select, owner: this }), this); } }, { key: 'renderNavBar', value: function renderNavBar(props) { var _this4 = this; var theme = props.theme; var childNavBar = _react2.default.Children.toArray(props.children).filter(function (c) { return c && c.props && c.props.isDatePickerNavBar; })[0]; var ref = function ref(navBar) { _this4.navBar = navBar; }; if (!childNavBar) { if (props.navigation || props.renderNavBar) { return this.renderNavBarComponent((0, _assignDefined2.default)({ // prevDisabled, // nextDisabled, minDate: props.minDate, maxDate: props.maxDate, theme: theme, secondary: true, date: props.moment, viewMoment: props.viewMoment, onViewDateChange: this.onNavViewDateChange, onMouseDown: this.onNavMouseDown, arrows: props.navBarArrows, ref: ref }, { enableHistoryView: props.enableHistoryView })); } return null; } var navBarProps = (0, _objectAssign2.default)({}, childNavBar.props, (0, _assignDefined2.default)({ viewMoment: props.viewMoment, date: props.moment, theme: theme, ref: ref, minDate: props.minDate, maxDate: props.maxDate }, { enableHistoryView: props.enableHistoryView })); var prevOnViewDateChange = navBarProps.onViewDateChange; var onViewDateChange = this.onViewDateChange; if (prevOnViewDateChange) { onViewDateChange = function onViewDateChange() { prevOnViewDateChange.apply(undefined, arguments); _this4.onNavViewDateChange.apply(_this4, arguments); }; } navBarProps.onViewDateChange = onViewDateChange; var prevOnMouseDown = navBarProps.onMouseDown; var onMouseDown = this.onNavMouseDown; if (prevOnMouseDown) { onMouseDown = function onMouseDown() { prevOnMouseDown.apply(undefined, arguments); _this4.onNavMouseDown.apply(_this4, arguments); }; } navBarProps.onMouseDown = onMouseDown; if (navBarProps) { return this.renderNavBarComponent(navBarProps); } return null; } }, { key: 'onNavMouseDown', value: function onNavMouseDown(event) { if (this.props.focusOnNavMouseDown && !this.isFocused()) { this.focus(); } } }, { key: 'renderNavBarComponent', value: function renderNavBarComponent(navBarProps) { if (this.props.renderNavBar) { return this.props.renderNavBar(navBarProps); } return _react2.default.createElement(_NavBar2.default, navBarProps); } }, { key: 'isFocused', value: function isFocused() { return this.state.focused; } }, { key: 'onFocus', value: function onFocus(event) { this.setState({ focused: true }); this.props.onFocus(event); } }, { key: 'onBlur', value: function onBlur(event) { this.setState({ focused: false }); this.hideHistoryView(); this.props.onBlur(event); } }, { key: 'showHistoryView', value: function showHistoryView() { if (this.navBar) { this.navBar.showHistoryView(); } } }, { key: 'hideHistoryView', value: function hideHistoryView() { if (this.navBar) { this.navBar.hideHistoryView(); } } }, { key: 'isHistoryViewVisible', value: function isHistoryViewVisible() { if (this.navBar) { return this.navBar.isHistoryViewVisible(); } return false; } }, { key: 'tryNavBarKeyDown', value: function tryNavBarKeyDown(event) { if (this.navBar && this.navBar.getHistoryView) { var historyView = this.navBar.getHistoryView(); if (historyView && historyView.onKeyDown) { historyView.onKeyDown(event); return true; } } return false; } }, { key: 'onViewKeyDown', value: function onViewKeyDown(event) { if (this.tryNavBarKeyDown(event)) { return; } return _onKeyDown2.default.call(this, event); } }, { key: 'confirm', value: function confirm(date, event) { event.preventDefault(); if (this.props.confirm) { return this.props.confirm(date, event); } var dateMoment = this.toMoment(date); this.select({ dateMoment: dateMoment, timestamp: +dateMoment }, event); return undefined; } }, { key: 'navigate', value: function navigate(dir, event) { var _this5 = this; var props = this.p; var getNavigationDate = function getNavigationDate(dir, date, dateFormat) { var mom = _moment2.default.isMoment(date) ? date : _this5.toMoment(date, dateFormat); return typeof dir == 'function' ? dir(mom) : mom.add(dir, 'day'); }; if (props.navigate) { return props.navigate(dir, event, getNavigationDate); } event.preventDefault(); if (props.activeDate) { var nextMoment = getNavigationDate(dir, props.activeDate); this.gotoViewDate({ dateMoment: nextMoment }); } return undefined; } }, { key: 'handleDayMouseEnter', value: function handleDayMouseEnter(dayProps) { var props = this.p; var rangeStart = props.rangeStart; var range = props.range; var partial = !!(rangeStart && range.length < 2); if (partial) { this.setHoverRange((0, _clampRange2.default)([rangeStart, dayProps.dateMoment])); } } }, { key: 'handleClick', value: function handleClick(_ref3, event) { var timestamp = _ref3.timestamp; var dateMoment = _ref3.dateMoment; var props = this.p; if (props.minDate && timestamp < props.minDate) { return; } if (props.maxDate && timestamp > props.maxDate) { return; } event.target.value = timestamp; this.select({ dateMoment: dateMoment, timestamp: timestamp }, event); } }, { key: 'select', value: function select(_ref4, event) { var dateMoment = _ref4.dateMoment; var timestamp = _ref4.timestamp; if (dateMoment && timestamp === undefined) { timestamp = +dateMoment; } if (this.props.select) { return this.props.select({ dateMoment: dateMoment, timestamp: timestamp }, event); } if (!timestamp) { timestamp = +dateMoment; } this.gotoViewDate({ dateMoment: dateMoment, timestamp: timestamp }); var props = this.p; var range = props.range; if (range) { this.selectRange({ dateMoment: dateMoment, timestamp: timestamp }, event); } else { this.onChange({ dateMoment: dateMoment, timestamp: timestamp }, event); } return undefined; } }, { key: 'selectRange', value: function selectRange(_ref5, event) { var dateMoment = _ref5.dateMoment; var timestamp = _ref5.timestamp; var props = this.p; var range = props.range; var rangeStart = props.rangeStart; if (dateMoment == null) { this.setState({ rangeStart: null }); this.onRangeChange([], event); return; } if (!rangeStart) { this.setState({ rangeStart: dateMoment }); if (range.length == 2) { this.onRangeChange([], event); } } else { this.setState({ rangeStart: null }); this.onRangeChange((0, _clampRange2.default)([rangeStart, dateMoment]), event); } } }, { key: 'format', value: function format(mom) { return mom == null ? '' : mom.format(this.props.dateFormat); } }, { key: 'setHoverRange', value: function setHoverRange(hoverRange) { if (this.props.hoverRange === undefined) { this.setState({ hoverRange: hoverRange }); } if (this.props.onHoverRangeChange) { this.props.onHoverRangeChange(hoverRange); } } }, { key: 'onRangeChange', value: function onRangeChange(range, event) { var _this6 = this; this.setState({ range: this.props.range === undefined ? range : null }); this.setHoverRange(null); if (this.props.onRangeChange) { var newRange = range.map(function (m) { var dateMoment = _this6.toMoment(m); return { dateString: dateMoment.format(_this6.props.dateFormat), dateMoment: dateMoment, timestamp: +dateMoment }; }); var formatted = newRange.map(function (o) { return o.dateString; }); this.props.onRangeChange(formatted, newRange, event); } } }, { key: 'onChange', value: function onChange(_ref6, event) { var dateMoment = _ref6.dateMoment; var timestamp = _ref6.timestamp; if (this.props.date === undefined) { this.setState({ date: timestamp }); } if (this.props.onChange) { var dateString = this.format(dateMoment); this.props.onChange(dateString, { dateMoment: dateMoment, timestamp: timestamp, dateString: dateString }, event); } } }, { key: 'onNavViewDateChange', value: function onNavViewDateChange(dateString, _ref7) { var dateMoment = _ref7.dateMoment; var timestamp = _ref7.timestamp; this.onViewDateChange({ dateMoment: dateMoment, timestamp: timestamp }); } }, { key: 'onViewDateChange', value: function onViewDateChange(_ref8) { var dateMoment = _ref8.dateMoment; var timestamp = _ref8.timestamp; var minDate = void 0; var maxDate = void 0; if (this.p.minDateMoment) { minDate = +this.toMoment(this.p.minDateMoment).startOf('month'); } if (this.p.maxDateMoment) { maxDate = +this.toMoment(this.p.maxDateMoment).endOf('month'); } if (this.props.constrainViewDate && !isDateInMinMax(timestamp, { minDate: minDate, maxDate: maxDate })) { return; } if (this.props.viewDate === undefined && this.props.navOnDateClick) { this.setState({ viewDate: timestamp }); } if (this.props.onViewDateChange) { var dateString = this.format(dateMoment); this.props.onViewDateChange(dateString, { dateMoment: dateMoment, dateString: dateString, timestamp: timestamp }); } } }, { key: 'isValidActiveDate', value: function isValidActiveDate(date, props) { return _isValidActiveDate(date, props || this.p); } }, { key: 'onActiveDateChange', value: function onActiveDateChange(_ref9) { var dateMoment = _ref9.dateMoment; var timestamp = _ref9.timestamp; if (!_isValidActiveDate(timestamp, this.p)) { return; } var props = this.p; var range = props.range; if (range && props.rangeStart) { var newRange = (0, _clampRange2.default)([props.rangeStart, dateMoment]); if (props.partialRange) { this.onRangeChange(newRange); } this.setState({ rangeStart: props.rangeStart, range: newRange }); } if (this.props.activeDate === undefined) { this.setState({ activeDate: timestamp }); } if (this.props.onActiveDateChange) { var dateString = this.format(dateMoment); this.props.onActiveDateChange(dateString, { dateMoment: dateMoment, timestamp: timestamp, dateString: dateString }); } } }, { key: 'gotoViewDate', value: function gotoViewDate(_ref10) { var dateMoment = _ref10.dateMoment; var timestamp = _ref10.timestamp; if (!timestamp) { timestamp = dateMoment == null ? null : +dateMoment; } this.onViewDateChange({ dateMoment: dateMoment, timestamp: timestamp }); this.onActiveDateChange({ dateMoment: dateMoment, timestamp: timestamp }); } }]); return MonthView; }(_reactClass2.default); exports.default = MonthView; MonthView.defaultProps = { defaultClassName: 'react-date-picker__month-view', dateFormat: 'YYYY-MM-DD', theme: 'default', onBlur: function onBlur() {}, onFocus: function onFocus() {}, footerClearDate: null, partialRange: true, activateOnHover: false, constrainActiveInView: false, showDaysBeforeMonth: true, showDaysAfterMonth: true, highlightWeekends: true, highlightToday: true, navOnDateClick: true, navigation: true, constrainViewDate: true, highlightRangeOnMouseMove: false, isDatePicker: true, enableHistoryView: true, focusOnNavMouseDown: true, focusOnFooterMouseDown: true }; MonthView.propTypes = { navOnDateClick: _react.PropTypes.bool, isDisabledDay: _react.PropTypes.func, onChange: _react.PropTypes.func, onViewDateChange: _react.PropTypes.func, onActiveDateChange: _react.PropTypes.func }; exports.NAV_KEYS = _navKeys2.default; exports.renderFooter = _renderFooter;