react-flex-picker
Version:
Helps to build your own calendar by using prepared components and api to control them
928 lines (872 loc) • 43.8 kB
JavaScript
(function webpackUniversalModuleDefinition(root, factory) {
if(typeof exports === 'object' && typeof module === 'object')
module.exports = factory(require("react"), require("moment"), require("classnames"), require("react-dom"));
else if(typeof define === 'function' && define.amd)
define(["React", "moment", "classnames", "ReactDOM"], factory);
else {
var a = typeof exports === 'object' ? factory(require("react"), require("moment"), require("classnames"), require("react-dom")) : factory(root["React"], root["moment"], root["classnames"], root["ReactDOM"]);
for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
}
})(window, function(__WEBPACK_EXTERNAL_MODULE__0__, __WEBPACK_EXTERNAL_MODULE__1__, __WEBPACK_EXTERNAL_MODULE__3__, __WEBPACK_EXTERNAL_MODULE__7__) {
return /******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/ }
/******/ };
/******/
/******/ // define __esModule on exports
/******/ __webpack_require__.r = function(exports) {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/
/******/ // create a fake namespace object
/******/ // mode & 1: value is a module id, require it
/******/ // mode & 2: merge all properties of value into the ns
/******/ // mode & 4: return value when already ns object
/******/ // mode & 8|1: behave like require
/******/ __webpack_require__.t = function(value, mode) {
/******/ if(mode & 1) value = __webpack_require__(value);
/******/ if(mode & 8) return value;
/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ var ns = Object.create(null);
/******/ __webpack_require__.r(ns);
/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ return ns;
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "/";
/******/
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = 6);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, exports) {
module.exports = __WEBPACK_EXTERNAL_MODULE__0__;
/***/ }),
/* 1 */
/***/ (function(module, exports) {
module.exports = __WEBPACK_EXTERNAL_MODULE__1__;
/***/ }),
/* 2 */
/***/ (function(module, exports, __webpack_require__) {
;
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
var React = __webpack_require__(0);
var ReactDOM = __webpack_require__(7);
var moment = __webpack_require__(1);
// import {initRange, pipe, reverseDates, setMonthBounds, setWeekBounds, validateRange} from '../utils/provider';
var PickerContext = React.createContext(null);
var PickerProvider = /** @class */ (function (_super) {
__extends(PickerProvider, _super);
function PickerProvider(props) {
var _this = _super.call(this, props) || this;
_this.handlePrevUnit = _this.handlePrevUnit.bind(_this);
_this.handleNextUnit = _this.handleNextUnit.bind(_this);
_this.handleClick = _this.handleClick.bind(_this);
_this.handleHover = _this.handleHover.bind(_this);
_this.setRef = _this.setRef.bind(_this);
_this.units = new Map();
_this.state = {
focus: 'startDate',
pickerType: props.pickerType,
setRef: _this.setRef,
handlePrevUnit: _this.handlePrevUnit,
handleNextUnit: _this.handleNextUnit,
handleTitleClick: _this.props.onTitleClick,
handleClick: _this.handleClick,
handleHover: _this.handleHover,
currentMonth: props.initialStartDate || moment(),
startDate: props.initialStartDate,
endDate: props.initialEndDate,
unitWidth: null,
height: null,
translateX: 0,
isAnimating: false,
unitWrapper: React.createRef(),
pickerProps: _this.props,
};
return _this;
}
PickerProvider.getDerivedStateFromProps = function (props, state) {
if (state.pickerType !== props.pickerType) {
return { pickerType: props.pickerType, unitWidth: null };
}
if (state.pickerProps.initialStartDate !== props.initialStartDate) {
return {
startDate: props.initialStartDate,
endDate: state.pickerProps.initialEndDate !== props.initialEndDate ? props.initialEndDate : state.endDate,
currentMonth: props.initialStartDate,
pickerProps: props,
unitWidth: null,
};
}
if (state.pickerProps.initialEndDate !== props.initialEndDate) {
return {
endDate: props.initialEndDate,
pickerProps: props,
unitWidth: null,
};
}
return null;
};
PickerProvider.prototype.componentDidMount = function () {
this.setUnitSize();
};
PickerProvider.prototype.componentDidUpdate = function (prevProps) {
if (prevProps.pickerType !== this.props.pickerType || prevProps.initialStartDate !== this.props.initialStartDate) {
this.setUnitSize();
}
};
PickerProvider.prototype.getUnit = function () {
return this.state.pickerType === 'day' ? 'month' : 'year';
};
PickerProvider.prototype.getPickerHeight = function (currentMonth) {
if (currentMonth === void 0) { currentMonth = this.state.currentMonth; }
var visibleHeight = 0;
for (var i = 0; i < this.props.unitCount; i = i + 1) {
var key = moment(currentMonth).add(i, this.getUnit()).format('YYYY-MM');
visibleHeight = Math.max(visibleHeight, this.units.get(key).offsetHeight);
}
return visibleHeight;
};
PickerProvider.prototype.setUnitSize = function () {
var unitWidth = this.state.unitWrapper.current.offsetWidth / (this.props.unitCount + 2);
if (this.props.onChangeWidth) {
this.props.onChangeWidth(unitWidth * this.props.unitCount);
}
this.setState({
unitWidth: unitWidth,
height: this.getPickerHeight(),
translateX: -unitWidth,
});
};
PickerProvider.prototype.setRef = function (key) {
var _this = this;
return function (e) { return _this.units.set(key, ReactDOM.findDOMNode(e)); };
};
PickerProvider.prototype.handleUnit = function (add) {
var _this = this;
if (this.state.isAnimating) {
return;
}
// Shift to the next month/year and get new height of new visible part of picker
this.setState({
translateX: this.state.translateX + (this.state.unitWidth * (add < 0 ? 1 : -1)),
isAnimating: true,
height: this.getPickerHeight(moment(this.state.currentMonth).add(add, this.getUnit())),
});
// After animation set new current month
setTimeout(function () {
_this.setState({
translateX: -_this.state.unitWidth,
isAnimating: false,
currentMonth: moment(_this.state.currentMonth).add(add, _this.getUnit()),
});
}, 200);
};
PickerProvider.prototype.handlePrevUnit = function () {
this.handleUnit(-1);
};
PickerProvider.prototype.handleNextUnit = function () {
this.handleUnit(1);
};
PickerProvider.prototype.handleClick = function (day) {
var _a = this.props, locale = _a.locale, isWeeksSelection = _a.isWeeksSelection, maxDate = _a.maxDate, minDate = _a.minDate, isSingle = _a.isSingle, maxDaysCount = _a.maxDaysCount;
var _b = this.state, focus = _b.focus, pickerType = _b.pickerType;
var newStartDate = moment(day);
var newEndDate = moment(day);
var currentFocus = focus;
if (isSingle) {
currentFocus = 'startDate';
}
// Если выбираются недели, то начальной датой диапазона будет первый день недели, по которой был сделан клик
if (isWeeksSelection && currentFocus === 'startDate') {
newStartDate = moment(day).locale(locale).startOf('week');
}
var startDate = currentFocus === 'startDate' ? newStartDate : this.state.startDate;
var maxEndDate = moment(startDate).add(maxDaysCount - 1, 'day');
// Если выбираются недели, то конечной датой диапазона будет последний день недели, по которой был сделан клик
if (isWeeksSelection && currentFocus === 'endDate') {
newEndDate = moment(day).locale(locale).endOf('week');
if (moment(newEndDate).locale(locale).isSame(moment(maxEndDate).locale(locale), 'week')) {
newEndDate = moment.min(newEndDate, maxEndDate);
}
}
var endDate = currentFocus === 'endDate' ? newEndDate : this.state.endDate;
var nextFocus = currentFocus === 'startDate' ? 'endDate' : 'startDate';
// если снова выбираем начальную дату, то сбрасываем конечную
if (currentFocus === 'startDate') {
endDate = null;
}
var maxStartDate = moment(startDate).add(-maxDaysCount + 1, 'day');
// если при выборе недель начальная дата меньше, чем выбранная, то конечная дата становится началом выбранном недели
// такое возможно, когда выделение происходит не слева направо, справа налево.
if (isWeeksSelection && currentFocus === 'endDate' && startDate.isAfter(day)) {
endDate = moment(day).locale(locale).startOf('week');
}
// если получилось так, что конечная дата меньше начальной (выделение справа налево), то меняем эти даты местами
if (currentFocus === 'endDate') {
if (endDate.isBefore(startDate, 'day')) {
endDate = startDate.clone();
startDate = moment(day);
if (isWeeksSelection) {
startDate = moment(day).locale(locale).startOf('week');
if (moment(startDate).locale(locale).isSame(moment(maxStartDate).locale(locale), 'week')) {
startDate = moment.max(startDate, maxStartDate);
}
}
if (pickerType === 'month') {
startDate = moment(startDate).startOf('month');
endDate = moment(endDate).endOf('month');
endDate = endDate && maxDate ? moment.min(maxDate, endDate) : endDate;
var maxStartDate_1 = moment(endDate).add(-maxDaysCount + 1, 'day');
if (maxDaysCount) {
startDate = moment.max(startDate, maxStartDate_1);
}
}
nextFocus = 'startDate';
}
else {
if (pickerType === 'month') {
startDate = moment(startDate).startOf('month');
endDate = endDate ? moment(endDate).endOf('month') : endDate;
var maxEndDate_1 = moment(startDate).add(maxDaysCount - 1, 'day');
if (maxDaysCount && endDate && endDate.isSame(maxEndDate_1, 'month')) {
endDate = moment.min(endDate, maxEndDate_1);
}
}
}
}
// нужно убедиться, что новые выбранные даты не выходят за рамки разрешенного диапазона
endDate = endDate && maxDate ? moment.min(maxDate, endDate) : endDate;
startDate = startDate && minDate ? moment.max(minDate, startDate) : startDate;
if (this.props.onDatesChange) {
this.props.onDatesChange(startDate, endDate);
}
this.setState({ startDate: startDate, endDate: endDate, focus: nextFocus });
};
PickerProvider.prototype.handleHover = function (hoveredDate) {
var _a = this.props, locale = _a.locale, isWeeksSelection = _a.isWeeksSelection, minDate = _a.minDate, maxDate = _a.maxDate, isSingle = _a.isSingle;
var _b = this.state, startDate = _b.startDate, endDate = _b.endDate, pickerType = _b.pickerType;
if (isSingle) {
return;
}
if (isWeeksSelection && hoveredDate && pickerType === 'day') {
// Highlight the whole week if startDate is picked
var startHoveredDate = moment(hoveredDate).locale(locale).startOf('week');
startHoveredDate = minDate ? moment.max(startHoveredDate, minDate) : startHoveredDate;
var endHoveredDate = moment(hoveredDate).locale(locale).endOf('week');
endHoveredDate = maxDate ? moment.min(endHoveredDate, maxDate) : endHoveredDate;
var newStartDate = startDate ? startDate.clone() : null;
// if cursor is being moved set proper date
if (startDate && !endDate) {
if (hoveredDate.isBefore(startDate)) {
newStartDate = moment(startDate).locale(locale).endOf('week');
newStartDate = maxDate ? moment.min(newStartDate, maxDate) : newStartDate;
}
if (hoveredDate.isAfter(startDate)) {
newStartDate = moment(startDate).locale(locale).startOf('week');
newStartDate = minDate ? moment.max(newStartDate, minDate) : newStartDate;
}
}
this.setState({ hoveredDate: [startHoveredDate, endHoveredDate], startDate: newStartDate });
return;
}
this.setState({ hoveredDate: hoveredDate });
};
PickerProvider.prototype.render = function () {
return (React.createElement(PickerContext.Provider, { value: this.state }, this.props.children));
};
PickerProvider.defaultProps = {
pickerType: 'day',
unitCount: 1,
locale: 'en',
isSingle: false,
};
return PickerProvider;
}(React.Component));
exports.PickerProvider = PickerProvider;
exports.PickerConsumer = PickerContext.Consumer;
/***/ }),
/* 3 */
/***/ (function(module, exports) {
module.exports = __WEBPACK_EXTERNAL_MODULE__3__;
/***/ }),
/* 4 */
/***/ (function(module, exports, __webpack_require__) {
;
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
Object.defineProperty(exports, "__esModule", { value: true });
var React = __webpack_require__(0);
var cn = __webpack_require__(3);
var defaultStyles = __webpack_require__(14);
var Day = /** @class */ (function (_super) {
__extends(Day, _super);
function Day() {
return _super !== null && _super.apply(this, arguments) || this;
}
Day.prototype.renderDay = function () {
var text = this.props.text;
if (!text) {
return React.createElement("span", null, "\u00A0");
}
return text;
};
Day.prototype.render = function () {
var _a = this.props, isDisabled = _a.isDisabled, isDayOff = _a.isDayOff, isSelected = _a.isSelected, isFirstSelected = _a.isFirstSelected, isLastSelected = _a.isLastSelected, isClickable = _a.isClickable, isHovered = _a.isHovered, onClick = _a.onClick, onHover = _a.onHover;
var styles = __assign({}, defaultStyles, this.props.styles);
return (React.createElement("span", { className: cn(styles.day, isDisabled && styles.dayDisabled, isDayOff && styles.dayOff, isSelected && styles.daySelected, isFirstSelected && styles.dayFirstSelected, isLastSelected && styles.dayLastSelected, isClickable && styles.dayClickable, isHovered && styles.dayHovered), onClick: onClick, onMouseOver: onHover }, this.renderDay()));
};
return Day;
}(React.PureComponent));
exports.Day = Day;
/***/ }),
/* 5 */
/***/ (function(module, exports, __webpack_require__) {
;
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
Object.defineProperty(exports, "__esModule", { value: true });
var React = __webpack_require__(0);
var cn = __webpack_require__(3);
var defaultStyles = __webpack_require__(21);
var PickerProvider_1 = __webpack_require__(2);
function Wrapper(props) {
var styles = __assign({}, defaultStyles, props.styles);
return (React.createElement(PickerProvider_1.PickerConsumer, null, function (_a) {
var unitWrapper = _a.unitWrapper, unitWidth = _a.unitWidth, translateX = _a.translateX, currentMonth = _a.currentMonth, isAnimating = _a.isAnimating, height = _a.height, pickerProps = _a.pickerProps, handleHover = _a.handleHover;
return (React.createElement("div", { ref: unitWrapper, className: cn(styles.wrapper), style: { width: unitWidth * pickerProps.unitCount || 'auto' }, onMouseLeave: function () { return handleHover(null); } },
React.createElement("div", { className: isAnimating ? styles.transition : null, style: {
height: height,
width: 'auto',
transform: "translateX(" + (unitWidth ? translateX : 0) + "px)",
} }, props.children)));
}));
}
exports.Wrapper = Wrapper;
/***/ }),
/* 6 */
/***/ (function(module, exports, __webpack_require__) {
;
Object.defineProperty(exports, "__esModule", { value: true });
var PickerProvider_1 = __webpack_require__(2);
exports.PickerConsumer = PickerProvider_1.PickerConsumer;
exports.PickerProvider = PickerProvider_1.PickerProvider;
var DayPickerController_1 = __webpack_require__(8);
exports.DayPickerController = DayPickerController_1.DayPickerController;
var MonthPickerController_1 = __webpack_require__(11);
exports.MonthPickerController = MonthPickerController_1.MonthPickerController;
/***/ }),
/* 7 */
/***/ (function(module, exports) {
module.exports = __WEBPACK_EXTERNAL_MODULE__7__;
/***/ }),
/* 8 */
/***/ (function(module, exports, __webpack_require__) {
;
Object.defineProperty(exports, "__esModule", { value: true });
var React = __webpack_require__(0);
var moment = __webpack_require__(1);
var Month_1 = __webpack_require__(9);
var Wrapper_1 = __webpack_require__(5);
var PickerProvider_1 = __webpack_require__(2);
function DayPickerController() {
return (React.createElement(PickerProvider_1.PickerConsumer, null, function (_a) {
var setRef = _a.setRef, currentMonth = _a.currentMonth, startDate = _a.startDate, endDate = _a.endDate, hoveredDate = _a.hoveredDate, handleClick = _a.handleClick, handleHover = _a.handleHover, pickerProps = _a.pickerProps, handleTitleClick = _a.handleTitleClick;
var prevInvisibleMonth = moment(currentMonth).add(-1, 'month');
var nextInvisibleMonth = moment(currentMonth).add(pickerProps.unitCount, 'month');
var monthList = [
prevInvisibleMonth,
currentMonth
].concat(Array.from({ length: pickerProps.unitCount - 1 }, function (v, k) { return moment(currentMonth).add(1 + k, 'month'); }), [
nextInvisibleMonth,
]);
return (React.createElement(Wrapper_1.Wrapper, { styles: pickerProps.styles }, monthList.map(function (month) {
var key = "" + month.format('YYYY-MM');
return (React.createElement(Month_1.Month, { key: key, ref: setRef(key), month: Number(month.format('MM')), year: Number(month.format('YYYY')), locale: pickerProps.locale, showOutsideDays: pickerProps.showOutsideDays, startDate: startDate, endDate: endDate, minDate: pickerProps.minDate, maxDate: pickerProps.maxDate, hoveredDate: hoveredDate, onTitleClick: handleTitleClick, onClick: handleClick, onHover: handleHover, minDaysCount: pickerProps.minDaysCount, maxDaysCount: pickerProps.maxDaysCount, styles: pickerProps.styles }));
})));
}));
}
exports.DayPickerController = DayPickerController;
/***/ }),
/* 9 */
/***/ (function(module, exports, __webpack_require__) {
;
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
Object.defineProperty(exports, "__esModule", { value: true });
var React = __webpack_require__(0);
var moment = __webpack_require__(1);
var cn = __webpack_require__(3);
var Day_1 = __webpack_require__(4);
var day_1 = __webpack_require__(10);
var defaultStyles = __webpack_require__(19);
var Month = /** @class */ (function (_super) {
__extends(Month, _super);
function Month(props) {
return _super.call(this, props) || this;
}
Month.prototype.handleClick = function (date) {
var _this = this;
return function (e) {
_this.props.onClick(date);
};
};
Month.prototype.handleHover = function (date) {
var _this = this;
return function (e) {
_this.props.onHover(date);
};
};
Month.prototype.handleTitleClick = function (date) {
var _this = this;
return function () {
if (_this.props.onTitleClick) {
_this.props.onTitleClick(date);
}
};
};
Month.prototype.render = function () {
var _this = this;
var _a = this.props, month = _a.month, year = _a.year, locale = _a.locale, showOutsideDays = _a.showOutsideDays, startDate = _a.startDate, endDate = _a.endDate, hoveredDate = _a.hoveredDate, onTitleClick = _a.onTitleClick;
var styles = __assign({}, defaultStyles, this.props.styles);
var yearMonth = year + "-" + month;
var localeData = moment.localeData(locale);
var prevMonth = moment(yearMonth, 'YYYY-MM').add(-1, 'month');
var currentMonth = moment(yearMonth, 'YYYY-MM');
var nextMonth = moment(yearMonth, 'YYYY-MM').add(1, 'month');
var daysInPrevMonth = prevMonth.daysInMonth();
var daysInMonth = currentMonth.daysInMonth();
var weekDays = Array.from(localeData.weekdaysShort());
var firstDayOfWeek = localeData.firstDayOfWeek();
var firstDayOfMonth = Number(currentMonth.startOf('month').format('E'));
if (firstDayOfWeek === 1) {
var sunday = weekDays.shift();
weekDays.push(sunday);
// index of week's day from weekDays that is first day of current month
firstDayOfMonth = firstDayOfMonth - 1 < 0 ? 6 : firstDayOfMonth - 1;
}
// if month doesn't start from monday then add days from previous month to complete week
var daysOfPrevMonth = Array.from({ length: firstDayOfMonth }, function (v, k) { return !showOutsideDays ? null : daysInPrevMonth - k; }).reverse();
var days = Array.from({ length: daysInMonth }, function (v, k) { return k + 1; });
days.unshift.apply(days, daysOfPrevMonth);
// Month may cross five or six weeks (35 or 42 days) so add days from next month to complete 5-th or 6-th week just for beauty performance
var daysOfNextMonth = Array.from({ length: (days.length > 35 ? 42 : 35) - daysInMonth - firstDayOfMonth }, function (v, k) { return !showOutsideDays ? null : k + 1; });
days.push.apply(days, daysOfNextMonth);
return (React.createElement("div", { className: cn(styles.month) },
React.createElement("div", { className: cn(styles.headerMonthWrapper) },
React.createElement("div", { className: cn(styles.headerMonth, onTitleClick && styles.headerClickable), onClick: this.handleTitleClick(currentMonth) },
localeData.months(currentMonth),
", ",
currentMonth.format('YYYY')),
React.createElement("div", { className: cn(styles.headerWeekDays) }, weekDays.map(function (monthName, index) { return (React.createElement("span", { key: index }, monthName)); }))),
React.createElement("div", { className: 'days' },
React.createElement("div", { className: styles.daysWeek }, days.map(function (day, index) {
var currentDay = moment(currentMonth).date(day);
if (index < firstDayOfMonth) {
currentDay = !showOutsideDays ? moment.invalid() : moment(prevMonth).date(day);
}
if (index > (daysInMonth - 1) + firstDayOfMonth) {
currentDay = !showOutsideDays ? moment.invalid() : moment(nextMonth).date(day);
}
var isDayOff = day_1.isWeekEnd(currentDay);
var isSelected = day_1.isDaySelected(currentDay, startDate, endDate);
var isFirstSelected = day_1.isSameDay(currentDay, startDate);
var isLastSelected = day_1.isSameDay(currentDay, endDate);
var isDisabled = day_1.isDayDisabled(currentDay, _this.props);
var isClickable = !isDisabled;
var isHovered = day_1.isDayHovered(currentDay, startDate, endDate, hoveredDate);
return (React.createElement(Day_1.Day, { key: index, text: day, isDisabled: isDisabled, isDayOff: isDayOff, isSelected: isSelected, isFirstSelected: isFirstSelected, isLastSelected: isLastSelected, isClickable: isClickable, isHovered: isHovered, onClick: isClickable ? _this.handleClick(currentDay) : null, onHover: _this.handleHover(currentDay.isValid() ? currentDay : null), styles: styles }));
})))));
};
return Month;
}(React.PureComponent));
exports.Month = Month;
/***/ }),
/* 10 */
/***/ (function(module, exports, __webpack_require__) {
;
Object.defineProperty(exports, "__esModule", { value: true });
var moment = __webpack_require__(1);
function isWeekEnd(day) {
return day.isoWeekday() === 6 || day.isoWeekday() === 7;
}
exports.isWeekEnd = isWeekEnd;
function isDaySelected(day, startDate, endDate) {
/*index >= firstDayOfMonth && index <= (daysInMonth - 1) + firstDayOfMonth */
if (!startDate || !endDate || !day.isValid()) {
return false;
}
return day.isBetween(startDate, endDate, 'day', '[]');
}
exports.isDaySelected = isDaySelected;
function isDayHovered(day, startDate, endDate, hoveredDate) {
if (Array.isArray(hoveredDate)) {
var startHoveredDate = hoveredDate[0], endHoveredDate = hoveredDate[1];
if (startDate && !endDate) {
return (day.isBetween(startDate, endHoveredDate, 'day', '(]')
|| day.isBetween(startHoveredDate, startDate, 'day', '[)'));
}
return false;
}
return !endDate && startDate && hoveredDate
&& (day.isBetween(startDate, hoveredDate, 'day', '(]')
|| day.isBetween(hoveredDate, startDate, 'day', '[)'));
}
exports.isDayHovered = isDayHovered;
function isDayDisabled(day, props) {
if (!day.isValid()) {
return true;
}
var startDate = props.startDate, endDate = props.endDate, minDate = props.minDate, maxDate = props.maxDate, minDaysCount = props.minDaysCount, maxDaysCount = props.maxDaysCount, month = props.month;
var minPrevAvailableDay = moment(startDate).add(-minDaysCount + 1, 'day');
var minNextAvailableDay = moment(startDate).add(minDaysCount - 1, 'day');
var maxPrevAvailableDay = moment(startDate).add(-maxDaysCount + 1, 'day');
var maxNextAvailableDay = moment(startDate).add(maxDaysCount - 1, 'day');
// отключаем дни из смежных месяцев
var isDisabled = Number(day.format('MM')) !== month;
// отключаем даты вне валидного диапазона
if (minDate && day.isBefore(minDate, 'day') || maxDate && day.isAfter(maxDate, 'day')) {
isDisabled = true;
}
if (minDaysCount && startDate && !endDate
&& (day.isBetween(startDate, minNextAvailableDay, 'day', '[)')
|| day.isBetween(minPrevAvailableDay, startDate, 'day', '(]'))) {
isDisabled = true;
}
if (maxDaysCount && startDate && !endDate && (day.isAfter(maxNextAvailableDay, 'day') || day.isBefore(maxPrevAvailableDay, 'day'))) {
isDisabled = true;
}
return isDisabled;
}
exports.isDayDisabled = isDayDisabled;
function isSameDay(day, b) {
if (!b || !day.isValid()) {
return false;
}
return day.isSame(b, 'day');
}
exports.isSameDay = isSameDay;
/***/ }),
/* 11 */
/***/ (function(module, exports, __webpack_require__) {
;
Object.defineProperty(exports, "__esModule", { value: true });
var React = __webpack_require__(0);
var moment = __webpack_require__(1);
var Year_1 = __webpack_require__(12);
var Wrapper_1 = __webpack_require__(5);
var PickerProvider_1 = __webpack_require__(2);
function MonthPickerController() {
return (React.createElement(PickerProvider_1.PickerConsumer, null, function (_a) {
var setRef = _a.setRef, currentMonth = _a.currentMonth, startDate = _a.startDate, endDate = _a.endDate, hoveredDate = _a.hoveredDate, handleClick = _a.handleClick, handleHover = _a.handleHover, pickerProps = _a.pickerProps, focus = _a.focus, handleTitleClick = _a.handleTitleClick;
var prevInvisibleMonth = moment(currentMonth).add(-1, 'year');
var nextInvisibleMonth = moment(currentMonth).add(pickerProps.unitCount, 'year');
var monthList = [
prevInvisibleMonth,
currentMonth
].concat(Array.from({ length: pickerProps.unitCount - 1 }, function (v, k) { return moment(currentMonth).add(1 + k, 'year'); }), [
nextInvisibleMonth,
]);
return (React.createElement(Wrapper_1.Wrapper, { styles: pickerProps.styles }, monthList.map(function (month) {
var key = "" + month.format('YYYY-MM');
return (React.createElement(Year_1.Year, { key: key, ref: setRef(key), year: Number(month.format('YYYY')), locale: pickerProps.locale, startDate: startDate, endDate: endDate, minDate: pickerProps.minDate, maxDate: pickerProps.maxDate, hoveredDate: hoveredDate, onTitleClick: handleTitleClick, onClick: handleClick, onHover: handleHover, focus: focus, styles: pickerProps.styles, minDaysCount: pickerProps.minDaysCount, maxDaysCount: pickerProps.maxDaysCount }));
})));
}));
}
exports.MonthPickerController = MonthPickerController;
/***/ }),
/* 12 */
/***/ (function(module, exports, __webpack_require__) {
;
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
Object.defineProperty(exports, "__esModule", { value: true });
var React = __webpack_require__(0);
var moment = __webpack_require__(1);
var cn = __webpack_require__(3);
var Day_1 = __webpack_require__(4);
var month_1 = __webpack_require__(13);
var defaultStyles = __webpack_require__(23);
var Year = /** @class */ (function (_super) {
__extends(Year, _super);
function Year(props) {
return _super.call(this, props) || this;
}
Year.prototype.handleClick = function (date) {
var _this = this;
return function (e) {
var selectedDate = moment(date).startOf('month');
if (_this.props.focus === 'endDate') {
selectedDate = moment(date).endOf('month');
}
_this.props.onClick(selectedDate);
};
};
Year.prototype.handleHover = function (date) {
var _this = this;
return function (e) {
_this.props.onHover(date);
};
};
Year.prototype.handleTitleClick = function (date) {
var _this = this;
return function () {
if (_this.props.onTitleClick) {
_this.props.onTitleClick(date);
}
};
};
Year.prototype.render = function () {
var _this = this;
var _a = this.props, year = _a.year, locale = _a.locale, startDate = _a.startDate, endDate = _a.endDate, hoveredDate = _a.hoveredDate, onTitleClick = _a.onTitleClick;
var styles = __assign({}, defaultStyles, this.props.styles);
var localeData = moment.localeData(locale);
var monthList = Array.from(localeData.monthsShort());
return (React.createElement("div", { className: styles.year },
React.createElement("div", { className: 'header' },
React.createElement("div", { className: cn(styles.headerYear, onTitleClick && styles.headerClickable), onClick: this.handleTitleClick(moment(year, 'YYYY')) }, year)),
React.createElement("div", { className: 'days' },
React.createElement("div", { className: styles.daysWeek }, monthList.map(function (month, index) {
var currentMonth = moment(year + "-" + (index + 1), 'YYYY-MM');
var isSelected = month_1.isMonthSelected(currentMonth, startDate, endDate);
var isFirstSelected = month_1.isSameMonth(currentMonth, startDate);
var isLastSelected = month_1.isSameMonth(currentMonth, endDate);
var isDisabled = month_1.isMonthDisabled(currentMonth, _this.props);
var isClickable = !isDisabled;
var isHovered = month_1.isMonthHovered(currentMonth, startDate, endDate, hoveredDate);
return (React.createElement(Day_1.Day, { key: index, text: month, isDisabled: isDisabled, isSelected: isSelected, isFirstSelected: isFirstSelected, isLastSelected: isLastSelected, isClickable: isClickable, isHovered: isHovered, onClick: isClickable ? _this.handleClick(currentMonth) : null, onHover: _this.handleHover(currentMonth), styles: styles }));
})))));
};
return Year;
}(React.PureComponent));
exports.Year = Year;
/***/ }),
/* 13 */
/***/ (function(module, exports, __webpack_require__) {
;
Object.defineProperty(exports, "__esModule", { value: true });
var moment = __webpack_require__(1);
function isMonthSelected(month, startDate, endDate) {
if (!startDate || !endDate) {
return false;
}
var firstMonthDay = moment(month).startOf('month');
var lastMonthDay = moment(month).endOf('month');
return firstMonthDay.isBetween(startDate, endDate, 'month', '[]')
|| lastMonthDay.isBetween(startDate, endDate, 'month', '[]');
}
exports.isMonthSelected = isMonthSelected;
function isMonthHovered(month, startDate, endDate, hoveredDate) {
return !Array.isArray(hoveredDate) && !endDate && startDate && hoveredDate
&& (month.isBetween(startDate, hoveredDate, 'month', '(]')
|| month.isBetween(hoveredDate, startDate, 'month', '[)'));
}
exports.isMonthHovered = isMonthHovered;
function isMonthDisabled(month, props) {
var minDate = props.minDate, maxDate = props.maxDate, minDaysCount = props.minDaysCount, maxDaysCount = props.maxDaysCount, startDate = props.startDate, endDate = props.endDate;
var firstMonthDay = moment(month).startOf('month');
var lastMonthDay = moment(month).endOf('month');
var isDisabled = false;
var minPrevAvailableMonth = moment(startDate).endOf('month').add(-minDaysCount + 1, 'day');
var minNextAvailableMonth = moment(startDate).startOf('month').add(minDaysCount - 1, 'day');
var endMonthDate = moment(startDate).endOf('month');
endMonthDate = maxDate ? moment.min(endMonthDate, maxDate) : endMonthDate;
var maxPrevAvailableMonth = moment(endMonthDate).add(-maxDaysCount + 1, 'day');
var maxNextAvailableMonth = moment(startDate).startOf('month').add(maxDaysCount - 1, 'day');
if (minDaysCount && startDate && !endDate
&& (month.isBetween(minPrevAvailableMonth, startDate, 'month', '()') || month.isBetween(startDate, minNextAvailableMonth, 'month', '()'))) {
isDisabled = true;
}
if (maxDaysCount && startDate && !endDate
&& (month.isBefore(maxPrevAvailableMonth, 'month') || month.isAfter(maxNextAvailableMonth, 'month'))) {
isDisabled = true;
}
// отключаем даты вне валидного диапазона
if (minDate && lastMonthDay.isBefore(minDate, 'day') || maxDate && firstMonthDay.isAfter(maxDate, 'day')) {
isDisabled = true;
}
return isDisabled;
}
exports.isMonthDisabled = isMonthDisabled;
function isSameMonth(month, b) {
if (!b || !month.isValid()) {
return false;
}
return month.isSame(b, 'month');
}
exports.isSameMonth = isSameMonth;
/***/ }),
/* 14 */
/***/ (function(module, exports) {
// removed by extract-text-webpack-plugin
module.exports = {"day":"day-module___day--3-1tp","dayDisabled":"day-module___dayDisabled--2cMco","dayOff":"day-module___dayOff--3JvNx","daySelected":"day-module___daySelected--Srbbc","dayFirstSelected":"day-module___dayFirstSelected--_-5Zf","dayLastSelected":"day-module___dayLastSelected--3UpPZ","dayClickable":"day-module___dayClickable--JfOnh","dayHovered":"day-module___dayHovered--2aKsi"};
/***/ }),
/* 15 */,
/* 16 */,
/* 17 */,
/* 18 */,
/* 19 */
/***/ (function(module, exports) {
// removed by extract-text-webpack-plugin
module.exports = {"month":"month-module___month--3-G0C","headerMonth":"month-module___headerMonth--3dLLP","headerWeekDays":"month-module___headerWeekDays--35FAE","headerClickable":"month-module___headerClickable--18krZ"};
/***/ }),
/* 20 */,
/* 21 */
/***/ (function(module, exports) {
// removed by extract-text-webpack-plugin
module.exports = {"wrapper":"wrapper-module___wrapper--2w65P","transition":"wrapper-module___transition--1ufHD"};
/***/ }),
/* 22 */,
/* 23 */
/***/ (function(module, exports) {
// removed by extract-text-webpack-plugin
module.exports = {"year":"year-module___year--vO_pS","day":"year-module___day--1U4JJ","headerYear":"year-module___headerYear--4V7Ir","headerClickable":"year-module___headerClickable--25MCU"};
/***/ })
/******/ ]);
});