@blueprintjs/datetime
Version:
Components for interacting with dates and times
508 lines • 30.5 kB
JavaScript
/*
* Copyright 2016 Palantir Technologies, Inc. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { __assign, __extends, __spreadArray } from "tslib";
import classNames from "classnames";
import * as React from "react";
import DayPicker from "react-day-picker";
import { AbstractPureComponent2, Boundary, DISPLAYNAME_PREFIX, Divider } from "@blueprintjs/core";
import * as DateClasses from "./common/classes";
import * as DateUtils from "./common/dateUtils";
import * as Errors from "./common/errors";
import { MonthAndYear } from "./common/monthAndYear";
import { DatePickerCaption } from "./datePickerCaption";
import { combineModifiers, getDefaultMaxDate, getDefaultMinDate, HOVERED_RANGE_MODIFIER, SELECTED_RANGE_MODIFIER, } from "./datePickerCore";
import { DatePickerNavbar } from "./datePickerNavbar";
import { DateRangeSelectionStrategy } from "./dateRangeSelectionStrategy";
import { Shortcuts } from "./shortcuts";
import { TimePicker } from "./timePicker";
/**
* Date range picker component.
*
* @see https://blueprintjs.com/docs/#datetime/daterangepicker
*/
var DateRangePicker = /** @class */ (function (_super) {
__extends(DateRangePicker, _super);
function DateRangePicker(props, context) {
var _a;
var _this = _super.call(this, props, context) || this;
// these will get merged with the user's own
_this.modifiers = (_a = {},
_a[SELECTED_RANGE_MODIFIER] = function (day) {
var value = _this.state.value;
return value[0] != null && value[1] != null && DateUtils.isDayInRange(day, value, true);
},
_a["".concat(SELECTED_RANGE_MODIFIER, "-start")] = function (day) { return DateUtils.areSameDay(_this.state.value[0], day); },
_a["".concat(SELECTED_RANGE_MODIFIER, "-end")] = function (day) { return DateUtils.areSameDay(_this.state.value[1], day); },
_a[HOVERED_RANGE_MODIFIER] = function (day) {
var _a = _this.state, hoverValue = _a.hoverValue, _b = _a.value, selectedStart = _b[0], selectedEnd = _b[1];
if (selectedStart == null && selectedEnd == null) {
return false;
}
if (hoverValue == null || hoverValue[0] == null || hoverValue[1] == null) {
return false;
}
return DateUtils.isDayInRange(day, hoverValue, true);
},
_a["".concat(HOVERED_RANGE_MODIFIER, "-start")] = function (day) {
var hoverValue = _this.state.hoverValue;
if (hoverValue == null || hoverValue[0] == null) {
return false;
}
return DateUtils.areSameDay(hoverValue[0], day);
},
_a["".concat(HOVERED_RANGE_MODIFIER, "-end")] = function (day) {
var hoverValue = _this.state.hoverValue;
if (hoverValue == null || hoverValue[1] == null) {
return false;
}
return DateUtils.areSameDay(hoverValue[1], day);
},
_a);
_this.shouldHighlightCurrentDay = function (date) {
var highlightCurrentDay = _this.props.highlightCurrentDay;
return highlightCurrentDay && DateUtils.isToday(date);
};
_this.getDateRangePickerModifiers = function () {
var modifiers = _this.props.modifiers;
return combineModifiers(_this.modifiers, __assign({ isToday: _this.shouldHighlightCurrentDay }, modifiers));
};
_this.renderDay = function (day) {
var date = day.getDate();
return React.createElement("div", { className: DateClasses.DATEPICKER_DAY_WRAPPER }, date);
};
_this.disabledDays = function (day) { return !DateUtils.isDayInRange(day, [_this.props.minDate, _this.props.maxDate]); };
_this.getDisabledDaysModifier = function () {
var disabledDays = _this.props.dayPickerProps.disabledDays;
return disabledDays instanceof Array ? __spreadArray([_this.disabledDays], disabledDays, true) : [_this.disabledDays, disabledDays];
};
_this.handleTimeChange = function (newTime, dateIndex) {
var _a, _b, _c, _d;
(_b = (_a = _this.props.timePickerProps) === null || _a === void 0 ? void 0 : _a.onChange) === null || _b === void 0 ? void 0 : _b.call(_a, newTime);
var _e = _this.state, value = _e.value, time = _e.time;
var newValue = DateUtils.getDateTime(value[dateIndex] != null ? DateUtils.clone(value[dateIndex]) : new Date(), newTime);
var newDateRange = [value[0], value[1]];
newDateRange[dateIndex] = newValue;
var newTimeRange = [time[0], time[1]];
newTimeRange[dateIndex] = newTime;
(_d = (_c = _this.props).onChange) === null || _d === void 0 ? void 0 : _d.call(_c, newDateRange);
_this.setState({ value: newDateRange, time: newTimeRange });
};
_this.handleTimeChangeLeftCalendar = function (time) {
_this.handleTimeChange(time, 0);
};
_this.handleTimeChangeRightCalendar = function (time) {
_this.handleTimeChange(time, 1);
};
_this.renderSingleNavbar = function (navbarProps) { return (React.createElement(DatePickerNavbar, __assign({}, navbarProps, { maxDate: _this.props.maxDate, minDate: _this.props.minDate }))); };
_this.renderLeftNavbar = function (navbarProps) { return (React.createElement(DatePickerNavbar, __assign({}, navbarProps, { hideRightNavButton: _this.props.contiguousCalendarMonths, maxDate: _this.props.maxDate, minDate: _this.props.minDate }))); };
_this.renderRightNavbar = function (navbarProps) { return (React.createElement(DatePickerNavbar, __assign({}, navbarProps, { hideLeftNavButton: _this.props.contiguousCalendarMonths, maxDate: _this.props.maxDate, minDate: _this.props.minDate }))); };
_this.renderSingleCaption = function (captionProps) { return (React.createElement(DatePickerCaption, __assign({}, captionProps, { maxDate: _this.props.maxDate, minDate: _this.props.minDate, onMonthChange: _this.handleLeftMonthSelectChange, onYearChange: _this.handleLeftYearSelectChange, reverseMonthAndYearMenus: _this.props.reverseMonthAndYearMenus }))); };
_this.renderLeftCaption = function (captionProps) { return (React.createElement(DatePickerCaption, __assign({}, captionProps, { maxDate: DateUtils.getDatePreviousMonth(_this.props.maxDate), minDate: _this.props.minDate, onMonthChange: _this.handleLeftMonthSelectChange, onYearChange: _this.handleLeftYearSelectChange, reverseMonthAndYearMenus: _this.props.reverseMonthAndYearMenus }))); };
_this.renderRightCaption = function (captionProps) { return (React.createElement(DatePickerCaption, __assign({}, captionProps, { maxDate: _this.props.maxDate, minDate: DateUtils.getDateNextMonth(_this.props.minDate), onMonthChange: _this.handleRightMonthSelectChange, onYearChange: _this.handleRightYearSelectChange, reverseMonthAndYearMenus: _this.props.reverseMonthAndYearMenus }))); };
_this.handleDayMouseEnter = function (day, modifiers, e) {
var _a, _b, _c, _d;
(_b = (_a = _this.props.dayPickerProps).onDayMouseEnter) === null || _b === void 0 ? void 0 : _b.call(_a, day, modifiers, e);
if (modifiers.disabled) {
return;
}
var _e = DateRangeSelectionStrategy.getNextState(_this.state.value, day, _this.props.allowSingleDayRange, _this.props.boundaryToModify), dateRange = _e.dateRange, boundary = _e.boundary;
_this.setState({ hoverValue: dateRange });
(_d = (_c = _this.props).onHoverChange) === null || _d === void 0 ? void 0 : _d.call(_c, dateRange, day, boundary);
};
_this.handleDayMouseLeave = function (day, modifiers, e) {
var _a, _b, _c, _d;
(_b = (_a = _this.props.dayPickerProps).onDayMouseLeave) === null || _b === void 0 ? void 0 : _b.call(_a, day, modifiers, e);
if (modifiers.disabled) {
return;
}
_this.setState({ hoverValue: undefined });
(_d = (_c = _this.props).onHoverChange) === null || _d === void 0 ? void 0 : _d.call(_c, undefined, day, undefined);
};
_this.handleDayClick = function (day, modifiers, e) {
var _a, _b;
(_b = (_a = _this.props.dayPickerProps).onDayClick) === null || _b === void 0 ? void 0 : _b.call(_a, day, modifiers, e);
if (modifiers.disabled) {
// rerender base component to get around bug where you can navigate past bounds by clicking days
_this.forceUpdate();
return;
}
var nextValue = DateRangeSelectionStrategy.getNextState(_this.state.value, day, _this.props.allowSingleDayRange, _this.props.boundaryToModify).dateRange;
// update the hovered date range after click to show the newly selected
// state, at leasts until the mouse moves again
_this.handleDayMouseEnter(day, modifiers, e);
_this.handleNextState(nextValue);
};
_this.handleShortcutClick = function (shortcut, selectedShortcutIndex) {
var _a = _this.props, onChange = _a.onChange, contiguousCalendarMonths = _a.contiguousCalendarMonths, onShortcutChange = _a.onShortcutChange;
var dateRange = shortcut.dateRange, includeTime = shortcut.includeTime;
if (includeTime) {
var newDateRange = [dateRange[0], dateRange[1]];
var newTimeRange = [dateRange[0], dateRange[1]];
var nextState = getStateChange(_this.state.value, dateRange, _this.state, contiguousCalendarMonths);
_this.setState(__assign(__assign({}, nextState), { time: newTimeRange }));
onChange === null || onChange === void 0 ? void 0 : onChange(newDateRange);
}
else {
_this.handleNextState(dateRange);
}
if (_this.props.selectedShortcutIndex === undefined) {
_this.setState({ selectedShortcutIndex: selectedShortcutIndex });
}
onShortcutChange === null || onShortcutChange === void 0 ? void 0 : onShortcutChange(shortcut, selectedShortcutIndex);
};
_this.handleNextState = function (nextValue) {
var _a, _b;
var value = _this.state.value;
nextValue[0] = DateUtils.getDateTime(nextValue[0], _this.state.time[0]);
nextValue[1] = DateUtils.getDateTime(nextValue[1], _this.state.time[1]);
var nextState = getStateChange(value, nextValue, _this.state, _this.props.contiguousCalendarMonths);
if (_this.props.value == null) {
_this.setState(nextState);
}
(_b = (_a = _this.props).onChange) === null || _b === void 0 ? void 0 : _b.call(_a, nextValue);
};
_this.handleLeftMonthChange = function (newDate) {
var _a, _b;
var leftView = MonthAndYear.fromDate(newDate);
(_b = (_a = _this.props.dayPickerProps).onMonthChange) === null || _b === void 0 ? void 0 : _b.call(_a, leftView.getFullDate());
_this.updateLeftView(leftView);
};
_this.handleRightMonthChange = function (newDate) {
var _a, _b;
var rightView = MonthAndYear.fromDate(newDate);
(_b = (_a = _this.props.dayPickerProps).onMonthChange) === null || _b === void 0 ? void 0 : _b.call(_a, rightView.getFullDate());
_this.updateRightView(rightView);
};
_this.handleLeftMonthSelectChange = function (leftMonth) {
var _a, _b;
var leftView = new MonthAndYear(leftMonth, _this.state.leftView.getYear());
(_b = (_a = _this.props.dayPickerProps).onMonthChange) === null || _b === void 0 ? void 0 : _b.call(_a, leftView.getFullDate());
_this.updateLeftView(leftView);
};
_this.handleRightMonthSelectChange = function (rightMonth) {
var _a, _b;
var rightView = new MonthAndYear(rightMonth, _this.state.rightView.getYear());
(_b = (_a = _this.props.dayPickerProps).onMonthChange) === null || _b === void 0 ? void 0 : _b.call(_a, rightView.getFullDate());
_this.updateRightView(rightView);
};
/*
* The min / max months are offset by one because we are showing two months.
* We do a comparison check to see if
* a) the proposed [Month, Year] change throws the two calendars out of order
* b) the proposed [Month, Year] goes beyond the min / max months
* and rectify appropriately.
*/
_this.handleLeftYearSelectChange = function (leftDisplayYear) {
var _a, _b;
var leftView = new MonthAndYear(_this.state.leftView.getMonth(), leftDisplayYear);
(_b = (_a = _this.props.dayPickerProps).onMonthChange) === null || _b === void 0 ? void 0 : _b.call(_a, leftView.getFullDate());
var _c = _this.props, minDate = _c.minDate, maxDate = _c.maxDate;
var adjustedMaxDate = DateUtils.getDatePreviousMonth(maxDate);
var minMonthAndYear = new MonthAndYear(minDate.getMonth(), minDate.getFullYear());
var maxMonthAndYear = new MonthAndYear(adjustedMaxDate.getMonth(), adjustedMaxDate.getFullYear());
if (leftView.isBefore(minMonthAndYear)) {
leftView = minMonthAndYear;
}
else if (leftView.isAfter(maxMonthAndYear)) {
leftView = maxMonthAndYear;
}
var rightView = _this.state.rightView.clone();
if (!leftView.isBefore(rightView) || _this.props.contiguousCalendarMonths) {
rightView = leftView.getNextMonth();
}
_this.setViews(leftView, rightView);
};
_this.handleRightYearSelectChange = function (rightDisplayYear) {
var _a, _b;
var rightView = new MonthAndYear(_this.state.rightView.getMonth(), rightDisplayYear);
(_b = (_a = _this.props.dayPickerProps).onMonthChange) === null || _b === void 0 ? void 0 : _b.call(_a, rightView.getFullDate());
var _c = _this.props, minDate = _c.minDate, maxDate = _c.maxDate;
var adjustedMinDate = DateUtils.getDateNextMonth(minDate);
var minMonthAndYear = MonthAndYear.fromDate(adjustedMinDate);
var maxMonthAndYear = MonthAndYear.fromDate(maxDate);
if (rightView.isBefore(minMonthAndYear)) {
rightView = minMonthAndYear;
}
else if (rightView.isAfter(maxMonthAndYear)) {
rightView = maxMonthAndYear;
}
var leftView = _this.state.leftView.clone();
if (!rightView.isAfter(leftView) || _this.props.contiguousCalendarMonths) {
leftView = rightView.getPreviousMonth();
}
_this.setViews(leftView, rightView);
};
var value = getInitialValue(props);
var time = value;
var initialMonth = getInitialMonth(props, value);
// if the initial month is the last month of the picker's
// allowable range, the react-day-picker library will show
// the max month on the left and the *min* month on the right.
// subtracting one avoids that weird, wraparound state (#289).
var initialMonthEqualsMinMonth = DateUtils.areSameMonth(initialMonth, props.minDate);
var initalMonthEqualsMaxMonth = DateUtils.areSameMonth(initialMonth, props.maxDate);
if (!props.singleMonthOnly && !initialMonthEqualsMinMonth && initalMonthEqualsMaxMonth) {
initialMonth.setMonth(initialMonth.getMonth() - 1);
}
// show the selected end date's encompassing month in the right view if
// the calendars don't have to be contiguous.
// if left view and right view months are the same, show next month in the right view.
var leftView = MonthAndYear.fromDate(initialMonth);
var rightDate = value[1];
var rightView = !props.contiguousCalendarMonths && rightDate != null && !DateUtils.areSameMonth(initialMonth, rightDate)
? MonthAndYear.fromDate(rightDate)
: leftView.getNextMonth();
_this.state = {
hoverValue: [null, null],
leftView: leftView,
rightView: rightView,
selectedShortcutIndex: _this.props.selectedShortcutIndex !== undefined ? _this.props.selectedShortcutIndex : -1,
time: time,
value: value,
};
return _this;
}
DateRangePicker.prototype.render = function () {
var _a;
var _b = this.props, className = _b.className, contiguousCalendarMonths = _b.contiguousCalendarMonths, singleMonthOnly = _b.singleMonthOnly, footerElement = _b.footerElement;
var isShowingOneMonth = singleMonthOnly || DateUtils.areSameMonth(this.props.minDate, this.props.maxDate);
var classes = classNames(DateClasses.DATEPICKER, DateClasses.DATERANGEPICKER, className, (_a = {},
_a[DateClasses.DATERANGEPICKER_CONTIGUOUS] = contiguousCalendarMonths,
_a[DateClasses.DATERANGEPICKER_SINGLE_MONTH] = isShowingOneMonth,
_a));
// use the left DayPicker when we only need one
return (React.createElement("div", { className: classes },
this.maybeRenderShortcuts(),
React.createElement("div", { className: DateClasses.DATEPICKER_CONTENT },
this.renderCalendars(isShowingOneMonth),
this.maybeRenderTimePickers(isShowingOneMonth),
footerElement)));
};
DateRangePicker.prototype.componentDidUpdate = function (prevProps, prevState) {
_super.prototype.componentDidUpdate.call(this, prevProps, prevState);
if (!DateUtils.areRangesEqual(prevProps.value, this.props.value) ||
prevProps.contiguousCalendarMonths !== this.props.contiguousCalendarMonths) {
var nextState = getStateChange(prevProps.value, this.props.value, this.state, prevProps.contiguousCalendarMonths);
this.setState(nextState);
}
if (this.props.selectedShortcutIndex !== prevProps.selectedShortcutIndex) {
this.setState({ selectedShortcutIndex: this.props.selectedShortcutIndex });
}
};
DateRangePicker.prototype.validateProps = function (props) {
var defaultValue = props.defaultValue, initialMonth = props.initialMonth, maxDate = props.maxDate, minDate = props.minDate, boundaryToModify = props.boundaryToModify, value = props.value;
var dateRange = [minDate, maxDate];
if (defaultValue != null && !DateUtils.isDayRangeInRange(defaultValue, dateRange)) {
console.error(Errors.DATERANGEPICKER_DEFAULT_VALUE_INVALID);
}
if (initialMonth != null && !DateUtils.isMonthInRange(initialMonth, dateRange)) {
console.error(Errors.DATERANGEPICKER_INITIAL_MONTH_INVALID);
}
if (maxDate != null && minDate != null && maxDate < minDate && !DateUtils.areSameDay(maxDate, minDate)) {
console.error(Errors.DATERANGEPICKER_MAX_DATE_INVALID);
}
if (value != null && !DateUtils.isDayRangeInRange(value, dateRange)) {
console.error(Errors.DATERANGEPICKER_VALUE_INVALID);
}
if (boundaryToModify != null && boundaryToModify !== Boundary.START && boundaryToModify !== Boundary.END) {
console.error(Errors.DATERANGEPICKER_PREFERRED_BOUNDARY_TO_MODIFY_INVALID);
}
};
DateRangePicker.prototype.maybeRenderShortcuts = function () {
var shortcuts = this.props.shortcuts;
if (shortcuts == null || shortcuts === false) {
return null;
}
var selectedShortcutIndex = this.state.selectedShortcutIndex;
var _a = this.props, allowSingleDayRange = _a.allowSingleDayRange, maxDate = _a.maxDate, minDate = _a.minDate, timePrecision = _a.timePrecision;
return [
React.createElement(Shortcuts, __assign({ key: "shortcuts" }, {
allowSingleDayRange: allowSingleDayRange,
maxDate: maxDate,
minDate: minDate,
selectedShortcutIndex: selectedShortcutIndex,
shortcuts: shortcuts,
timePrecision: timePrecision,
}, { onShortcutClick: this.handleShortcutClick })),
React.createElement(Divider, { key: "div" }),
];
};
DateRangePicker.prototype.maybeRenderTimePickers = function (isShowingOneMonth) {
var _a = this.props, timePrecision = _a.timePrecision, timePickerProps = _a.timePickerProps;
if (timePrecision == null && timePickerProps === DateRangePicker.defaultProps.timePickerProps) {
return null;
}
if (isShowingOneMonth) {
return (React.createElement(TimePicker, __assign({ precision: timePrecision }, timePickerProps, { onChange: this.handleTimeChangeLeftCalendar, value: this.state.time[0] })));
}
else {
return (React.createElement("div", { className: DateClasses.DATERANGEPICKER_TIMEPICKERS },
React.createElement(TimePicker, __assign({ precision: timePrecision }, timePickerProps, { onChange: this.handleTimeChangeLeftCalendar, value: this.state.time[0] })),
React.createElement(TimePicker, __assign({ precision: timePrecision }, timePickerProps, { onChange: this.handleTimeChangeRightCalendar, value: this.state.time[1] }))));
}
};
DateRangePicker.prototype.renderCalendars = function (isShowingOneMonth) {
var _a, _b, _c;
var _d = this.props, dayPickerProps = _d.dayPickerProps, locale = _d.locale, localeUtils = _d.localeUtils, maxDate = _d.maxDate, minDate = _d.minDate;
var dayPickerBaseProps = __assign(__assign({ locale: locale, localeUtils: localeUtils, modifiers: this.getDateRangePickerModifiers(), showOutsideDays: true }, dayPickerProps), { disabledDays: this.getDisabledDaysModifier(), onDayClick: this.handleDayClick, onDayMouseEnter: this.handleDayMouseEnter, onDayMouseLeave: this.handleDayMouseLeave, selectedDays: this.state.value });
if (isShowingOneMonth) {
return (React.createElement(DayPicker, __assign({}, dayPickerBaseProps, { captionElement: this.renderSingleCaption, navbarElement: this.renderSingleNavbar, fromMonth: minDate, month: this.state.leftView.getFullDate(), numberOfMonths: 1, onMonthChange: this.handleLeftMonthChange, toMonth: maxDate, renderDay: (_a = dayPickerProps === null || dayPickerProps === void 0 ? void 0 : dayPickerProps.renderDay) !== null && _a !== void 0 ? _a : this.renderDay })));
}
else {
return (React.createElement("div", { className: DateClasses.DATERANGEPICKER_CALENDARS },
React.createElement(DayPicker, __assign({ key: "left" }, dayPickerBaseProps, { canChangeMonth: true, captionElement: this.renderLeftCaption, navbarElement: this.renderLeftNavbar, fromMonth: minDate, month: this.state.leftView.getFullDate(), numberOfMonths: 1, onMonthChange: this.handleLeftMonthChange, toMonth: DateUtils.getDatePreviousMonth(maxDate), renderDay: (_b = dayPickerProps === null || dayPickerProps === void 0 ? void 0 : dayPickerProps.renderDay) !== null && _b !== void 0 ? _b : this.renderDay })),
React.createElement(DayPicker, __assign({ key: "right" }, dayPickerBaseProps, { canChangeMonth: true, captionElement: this.renderRightCaption, navbarElement: this.renderRightNavbar, fromMonth: DateUtils.getDateNextMonth(minDate), month: this.state.rightView.getFullDate(), numberOfMonths: 1, onMonthChange: this.handleRightMonthChange, toMonth: maxDate, renderDay: (_c = dayPickerProps === null || dayPickerProps === void 0 ? void 0 : dayPickerProps.renderDay) !== null && _c !== void 0 ? _c : this.renderDay }))));
}
};
DateRangePicker.prototype.updateLeftView = function (leftView) {
var rightView = this.state.rightView.clone();
if (!leftView.isBefore(rightView) || this.props.contiguousCalendarMonths) {
rightView = leftView.getNextMonth();
}
this.setViews(leftView, rightView);
};
DateRangePicker.prototype.updateRightView = function (rightView) {
var leftView = this.state.leftView.clone();
if (!rightView.isAfter(leftView) || this.props.contiguousCalendarMonths) {
leftView = rightView.getPreviousMonth();
}
this.setViews(leftView, rightView);
};
DateRangePicker.prototype.setViews = function (leftView, rightView) {
this.setState({ leftView: leftView, rightView: rightView });
};
DateRangePicker.defaultProps = {
allowSingleDayRange: false,
contiguousCalendarMonths: true,
dayPickerProps: {},
maxDate: getDefaultMaxDate(),
minDate: getDefaultMinDate(),
reverseMonthAndYearMenus: false,
shortcuts: true,
singleMonthOnly: false,
timePickerProps: {},
};
DateRangePicker.displayName = "".concat(DISPLAYNAME_PREFIX, ".DateRangePicker");
return DateRangePicker;
}(AbstractPureComponent2));
export { DateRangePicker };
function getStateChange(value, nextValue, state, contiguousCalendarMonths) {
if (value != null && nextValue == null) {
return { value: [null, null] };
}
else if (nextValue != null) {
var leftView = state.leftView.clone();
var rightView = state.rightView.clone();
var nextValueStartView = MonthAndYear.fromDate(nextValue[0]);
var nextValueEndView = MonthAndYear.fromDate(nextValue[1]);
// Only end date selected.
// If the newly selected end date isn't in either of the displayed months, then
// - set the right DayPicker to the month of the selected end date
// - ensure the left DayPicker is before the right, changing if needed
if (nextValueStartView == null && nextValueEndView != null) {
if (!nextValueEndView.isSame(leftView) && !nextValueEndView.isSame(rightView)) {
rightView = nextValueEndView;
if (!leftView.isBefore(rightView)) {
leftView = rightView.getPreviousMonth();
}
}
}
else if (nextValueStartView != null && nextValueEndView == null) {
// Only start date selected.
// If the newly selected start date isn't in either of the displayed months, then
// - set the left DayPicker to the month of the selected start date
// - ensure the right DayPicker is before the left, changing if needed
if (!nextValueStartView.isSame(leftView) && !nextValueStartView.isSame(rightView)) {
leftView = nextValueStartView;
if (!rightView.isAfter(leftView)) {
rightView = leftView.getNextMonth();
}
}
}
else if (nextValueStartView != null && nextValueEndView != null) {
// Both start and end date months are identical
// If the selected month isn't in either of the displayed months, then
// - set the left DayPicker to be the selected month
// - set the right DayPicker to +1
if (nextValueStartView.isSame(nextValueEndView)) {
if (leftView.isSame(nextValueStartView) || rightView.isSame(nextValueStartView)) {
// do nothing
}
else {
leftView = nextValueStartView;
rightView = nextValueStartView.getNextMonth();
}
}
else {
// Different start and end date months, adjust display months.
if (!leftView.isSame(nextValueStartView)) {
leftView = nextValueStartView;
rightView = nextValueStartView.getNextMonth();
}
if (contiguousCalendarMonths === false && !rightView.isSame(nextValueEndView)) {
rightView = nextValueEndView;
}
}
}
return {
leftView: leftView,
rightView: rightView,
value: nextValue,
};
}
else if (contiguousCalendarMonths === true) {
// contiguousCalendarMonths is toggled on.
// If the previous leftView and rightView are not contiguous, then set the right DayPicker to left + 1
if (!state.leftView.getNextMonth().isSameMonth(state.rightView)) {
var nextRightView = state.leftView.getNextMonth();
return { rightView: nextRightView };
}
}
return {};
}
function getInitialValue(props) {
if (props.value != null) {
return props.value;
}
if (props.defaultValue != null) {
return props.defaultValue;
}
return [null, null];
}
function getInitialMonth(props, value) {
var today = new Date();
// != because we must have a real `Date` to begin the calendar on.
if (props.initialMonth != null) {
return props.initialMonth;
}
else if (value[0] != null) {
return DateUtils.clone(value[0]);
}
else if (value[1] != null) {
var month = DateUtils.clone(value[1]);
if (!DateUtils.areSameMonth(month, props.minDate)) {
month.setMonth(month.getMonth() - 1);
}
return month;
}
else if (DateUtils.isDayInRange(today, [props.minDate, props.maxDate])) {
return today;
}
else {
return DateUtils.getDateBetween([props.minDate, props.maxDate]);
}
}
//# sourceMappingURL=dateRangePicker.js.map