react-date-picker
Version:
A carefully crafted date picker for React
556 lines (419 loc) • 16.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getDaysInMonthView = exports.getWeekendStartDay = exports.getWeekStartMoment = exports.getWeekStartDay = 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 _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 _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 _reactFlex = require('react-flex');
var _format = require('./utils/format');
var _format2 = _interopRequireDefault(_format);
var _toMoment = require('./toMoment');
var _toMoment2 = _interopRequireDefault(_toMoment);
var _getWeekDayNames = require('./utils/getWeekDayNames');
var _getWeekDayNames2 = _interopRequireDefault(_getWeekDayNames);
var _join = require('./join');
var _join2 = _interopRequireDefault(_join);
var _bemFactory = require('./bemFactory');
var _bemFactory2 = _interopRequireDefault(_bemFactory);
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; }
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
var CLASS_NAME = 'react-date-picker__basic-month-view';
var RENDER_DAY = function RENDER_DAY(props) {
var divProps = (0, _objectAssign2.default)({}, props);
delete divProps.date;
delete divProps.dateMoment;
delete divProps.day;
delete divProps.timestamp;
return _react2.default.createElement('div', divProps);
};
var getWeekStartDay = function getWeekStartDay(props) {
var locale = props.locale;
var weekStartDay = props.weekStartDay;
if (weekStartDay == null) {
var localeData = props.localeData || _moment2.default.localeData(locale);
weekStartDay = localeData._week ? localeData._week.dow : null;
}
return weekStartDay;
};
/**
* Gets the number for the first day of the weekend
*
* @param {Object} props
* @param {Number/String} props.weekStartDay
*
* @return {Number}
*/
var getWeekendStartDay = function getWeekendStartDay(props) {
var weekendStartDay = props.weekendStartDay;
if (weekendStartDay == null) {
return getWeekStartDay(props) + 5 % 7;
}
return weekendStartDay;
};
/**
* Gets a moment that points to the first day of the week
*
* @param {Moment/Date/String} value]
* @param {Object} props
* @param {String} props.dateFormat
* @param {String} props.locale
* @param {Number/String} props.weekStartDay
*
* @return {Moment}
*/
var getWeekStartMoment = function getWeekStartMoment(value, props) {
var locale = props.locale;
var dateFormat = props.dateFormat;
var weekStartDay = getWeekStartDay(props);
return (0, _toMoment2.default)(value, {
locale: locale,
dateFormat: dateFormat
}).day(weekStartDay);
};
/**
* Returns an array of moments with the days in the month of the value
*
* @param {Moment/Date/String} value
*
* @param {Object} props
* @param {String} props.locale
* @param {String} props.dateFormat
* @param {String} props.weekStartDay
* @param {Boolean} props.alwaysShowPrevWeek
*
* @return {Moment[]}
*/
var getDaysInMonthView = function getDaysInMonthView(value, props) {
var locale = props.locale;
var dateFormat = props.dateFormat;
var toMomentParam = { locale: locale, dateFormat: dateFormat };
var first = (0, _toMoment2.default)(value, toMomentParam).startOf('month');
var beforeFirst = (0, _toMoment2.default)(value, toMomentParam).startOf('month').add(-1, 'days');
var start = getWeekStartMoment(first, props);
var result = [];
var i = 0;
if (beforeFirst.isBefore(start)
// and it doesn't start with a full week before and the
// week has at least 1 day from current month (default)
&& (props.alwaysShowPrevWeek || !start.isSame(first))) {
start.add(-1, 'weeks');
}
for (; i < 42; i++) {
result.push((0, _toMoment2.default)(start, toMomentParam));
start.add(1, 'days');
}
return result;
};
/**
* @param {Object} props
* @param {String} props.locale
* @param {Number} props.weekStartDay
* @param {Array/Function} props.weekDayNames
*
* @return {String[]}
*/
var getWeekDayNames = function getWeekDayNames(props) {
var weekStartDay = props.weekStartDay;
var weekDayNames = props.weekDayNames;
var locale = props.locale;
var names = weekDayNames;
if (typeof names == 'function') {
names = names(weekStartDay, locale);
} else if (Array.isArray(names)) {
names = [].concat(_toConsumableArray(names));
var index = weekStartDay;
while (index > 0) {
names.push(names.shift());
index--;
}
}
return names;
};
var BasicMonthView = function (_Component) {
_inherits(BasicMonthView, _Component);
function BasicMonthView() {
_classCallCheck(this, BasicMonthView);
return _possibleConstructorReturn(this, Object.getPrototypeOf(BasicMonthView).apply(this, arguments));
}
_createClass(BasicMonthView, [{
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
});
};
}
}, {
key: 'prepareProps',
value: function prepareProps(thisProps) {
var props = (0, _objectAssign2.default)({}, thisProps);
props.viewMoment = props.viewMoment || this.toMoment(props.viewDate);
props.weekStartDay = getWeekStartDay(props);
props.className = this.prepareClassName(props);
return props;
}
}, {
key: 'prepareClassName',
value: function prepareClassName(props) {
return (0, _join2.default)(props.className, CLASS_NAME + ' dp-month-view');
}
}, {
key: 'render',
value: function render() {
var props = this.p = this.prepareProps(this.props);
var viewMoment = props.viewMoment;
var daysInView = props.daysInView || getDaysInMonthView(viewMoment, props);
var children = [this.renderWeekDayNames(), this.renderDays(props, daysInView)];
if (props.renderChildren) {
children = props.renderChildren(children, props);
}
var flexProps = (0, _objectAssign2.default)({}, props);
delete flexProps.alwaysShowPrevWeek;
delete flexProps.cleanup;
delete flexProps.dateFormat;
delete flexProps.daysInView;
delete flexProps.defaultClassName;
delete flexProps.defaultDate;
delete flexProps.defaultValue;
delete flexProps.forceValidDate;
delete flexProps.locale;
delete flexProps.moment;
delete flexProps.onClockEnterKey;
delete flexProps.onClockEscapeKey;
delete flexProps.onClockInputBlur;
delete flexProps.onClockInputFocus;
delete flexProps.onClockInputMouseDown;
delete flexProps.onFooterCancelClick;
delete flexProps.onFooterClearClick;
delete flexProps.onFooterOkClick;
delete flexProps.onFooterTodayClick;
delete flexProps.onRenderDay;
delete flexProps.renderChildren;
delete flexProps.renderDay;
delete flexProps.timestamp;
delete flexProps.value;
delete flexProps.viewDate;
delete flexProps.viewMoment;
delete flexProps.weekDayNames;
delete flexProps.weekNumbers;
delete flexProps.weekNumberName;
delete flexProps.weekStartDay;
if (typeof props.cleanup == 'function') {
props.cleanup(flexProps);
}
return _react2.default.createElement(_reactFlex.Flex, _extends({
column: true,
wrap: false,
inline: true,
alignItems: 'stretch'
}, flexProps, {
children: children
}));
}
/**
* Render the week number cell
* @param {Moment[]} days The days in a week
* @return {React.DOM}
*/
}, {
key: 'renderWeekNumber',
value: function renderWeekNumber(props, days) {
var firstDayOfWeek = days[0];
var week = firstDayOfWeek.weeks();
var weekNumberProps = {
key: 'week',
className: this.bem('cell') + ' ' + this.bem('week-number') + ' dp-cell dp-weeknumber',
// week number
week: week,
// the days in this week
days: days,
date: firstDayOfWeek,
children: week
};
var renderWeekNumber = props.renderWeekNumber;
var result = void 0;
if (renderWeekNumber) {
result = renderWeekNumber(weekNumberProps);
}
if (result === undefined) {
var divProps = (0, _objectAssign2.default)({}, weekNumberProps);
delete divProps.date;
delete divProps.days;
delete divProps.week;
result = _react2.default.createElement('div', divProps);
}
return result;
}
/**
* Render the given array of days
* @param {Moment[]} days
*
* @return {React.DOM}
*/
}, {
key: 'renderDays',
value: function renderDays(props, days) {
var _this2 = this;
var nodes = days.map(function (date) {
return _this2.renderDay(props, date);
});
var len = days.length;
var buckets = [];
var bucketsLen = Math.ceil(len / 7);
var i = 0;
var weekStart = void 0;
var weekEnd = void 0;
for (; i < bucketsLen; i++) {
weekStart = i * 7;
weekEnd = (i + 1) * 7;
buckets.push([props.weekNumbers && this.renderWeekNumber(props, days.slice(weekStart, weekEnd))].concat(nodes.slice(weekStart, weekEnd)));
}
return buckets.map(function (bucket, index) {
return _react2.default.createElement('div', {
key: 'row_' + index,
className: _this2.bem('row') + ' dp-week dp-row',
children: bucket
});
});
}
}, {
key: 'renderDay',
value: function renderDay(props, dateMoment) {
var dayText = _format2.default.day(dateMoment, props.dayFormat);
var classes = [this.bem('cell'), this.bem('day'), 'dp-cell dp-day'];
var renderDayProps = {
day: dayText,
dateMoment: dateMoment,
timestamp: +dateMoment,
key: dayText,
className: classes.join(' '),
children: dayText
};
if (typeof props.onRenderDay === 'function') {
renderDayProps = props.onRenderDay(renderDayProps);
}
var renderFunction = props.renderDay || RENDER_DAY;
var result = renderFunction(renderDayProps);
if (result === undefined) {
result = RENDER_DAY(renderDayProps);
}
return result;
}
}, {
key: 'renderWeekDayNames',
value: function renderWeekDayNames() {
var _this3 = this;
var props = this.p;
var weekNumbers = props.weekNumbers;
var weekNumberName = props.weekNumberName;
var weekDayNames = props.weekDayNames;
var renderWeekDayNames = props.renderWeekDayNames;
var renderWeekDayName = props.renderWeekDayName;
var weekStartDay = props.weekStartDay;
if (weekDayNames === false) {
return null;
}
var names = weekNumbers ? [weekNumberName].concat(getWeekDayNames(props)) : getWeekDayNames(props);
var className = this.bem('row') + ' ' + this.bem('week-day-names') + ' dp-row dp-week-day-names';
var renderProps = {
className: className,
names: names
};
if (renderWeekDayNames) {
return renderWeekDayNames(renderProps);
}
return _react2.default.createElement(
'div',
{ className: className },
names.map(function (name, index) {
var props = {
weekStartDay: weekStartDay,
index: index,
name: name,
key: index,
className: _this3.bem('cell') + ' ' + _this3.bem('week-day-name') + ' dp-week-day-name',
children: name
};
if (renderWeekDayName) {
return renderWeekDayName(props);
}
var divProps = (0, _objectAssign2.default)({}, props);
delete divProps.index;
delete divProps.weekStartDay;
delete divProps.name;
return _react2.default.createElement('div', divProps);
})
);
}
}]);
return BasicMonthView;
}(_reactClass2.default);
BasicMonthView.propTypes = {
viewDate: _react.PropTypes.any,
viewMoment: _react.PropTypes.any,
locale: _react.PropTypes.string,
weekStartDay: _react.PropTypes.number, // 0 is Sunday in the English locale
// boolean prop to show/hide week numbers
weekNumbers: _react.PropTypes.bool,
// the name to give to the week number column
weekNumberName: _react.PropTypes.string,
weekDayNames: function weekDayNames(props, propName) {
var value = props[propName];
if (typeof value != 'function' && value !== false && !Array.isArray(value)) {
return new Error('"weekDayNames" should be a function, an array or the boolean "false"');
}
return undefined;
},
renderWeekDayNames: _react.PropTypes.func,
renderWeekDayName: _react.PropTypes.func,
renderWeekNumber: _react.PropTypes.func,
renderDay: _react.PropTypes.func,
onRenderDay: _react.PropTypes.func,
alwaysShowPrevWeek: _react.PropTypes.bool
};
BasicMonthView.defaultProps = {
defaultClassName: CLASS_NAME,
dateFormat: 'YYYY-MM-DD',
alwaysShowPrevWeek: false,
weekNumbers: true,
weekNumberName: null,
weekDayNames: _getWeekDayNames2.default
};
exports.default = BasicMonthView;
exports.getWeekStartDay = getWeekStartDay;
exports.getWeekStartMoment = getWeekStartMoment;
exports.getWeekendStartDay = getWeekendStartDay;
exports.getDaysInMonthView = getDaysInMonthView;