wix-style-react
Version:
wix-style-react
492 lines (390 loc) • 17.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = 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 _class, _temp;
var _Calendar = require('./Calendar.scss');
var _Calendar2 = _interopRequireDefault(_Calendar);
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _propTypes = require('prop-types');
var _propTypes2 = _interopRequireDefault(_propTypes);
var _DayPicker = require('react-day-picker/DayPicker');
var _DayPicker2 = _interopRequireDefault(_DayPicker);
var _classnames = require('classnames');
var _classnames2 = _interopRequireDefault(_classnames);
var _add_months = require('date-fns/add_months');
var _add_months2 = _interopRequireDefault(_add_months);
var _sub_months = require('date-fns/sub_months');
var _sub_months2 = _interopRequireDefault(_sub_months);
var _start_of_month = require('date-fns/start_of_month');
var _start_of_month2 = _interopRequireDefault(_start_of_month);
var _parse = require('date-fns/parse');
var _parse2 = _interopRequireDefault(_parse);
var _is_same_day = require('date-fns/is_same_day');
var _is_same_day2 = _interopRequireDefault(_is_same_day);
var _utils = require('./utils');
var _WixComponent2 = require('../BaseComponents/WixComponent');
var _WixComponent3 = _interopRequireDefault(_WixComponent2);
var _LocaleUtils = require('../LocaleUtils');
var _LocaleUtils2 = _interopRequireDefault(_LocaleUtils);
var _DatePickerHead = require('./DatePickerHead');
var _DatePickerHead2 = _interopRequireDefault(_DatePickerHead);
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 Calendar = (_temp = _class = function (_WixComponent) {
_inherits(Calendar, _WixComponent);
function Calendar(props) {
_classCallCheck(this, Calendar);
var _this = _possibleConstructorReturn(this, (Calendar.__proto__ || Object.getPrototypeOf(Calendar)).call(this, props));
_this._setMonth = function (month) {
_this.setState({ month: month });
};
_this._handleDayClick = function (value) {
var modifiers = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var event = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
_this._preventActionEventDefault(event);
var propsValue = _this.props.value || {};
var _this$props = _this.props,
onChange = _this$props.onChange,
shouldCloseOnSelect = _this$props.shouldCloseOnSelect;
if (_this.props.selectionMode === 'range') {
if (!propsValue.from && !propsValue.to || propsValue.from && propsValue.to) {
onChange({ from: value }, modifiers);
} else {
var anchor = propsValue.from || propsValue.to;
var newVal = anchor < value ? { from: anchor, to: value } : { from: value, to: anchor };
onChange(newVal, modifiers);
shouldCloseOnSelect && _this.props.onClose(event);
}
} else {
onChange(value, modifiers);
shouldCloseOnSelect && _this.props.onClose(event);
}
};
_this._preventActionEventDefault = function () {
var event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
// We should not prevent "TAB"/"ESC" key
if (event && (!event.keyCode || !_this.keyHandlers[event.keyCode])) {
event.preventDefault();
}
};
_this._createCaptionElement = function (month) {
var _this$props2 = _this.props,
locale = _this$props2.locale,
showMonthDropdown = _this$props2.showMonthDropdown,
showYearDropdown = _this$props2.showYearDropdown;
var localeUtils = (0, _LocaleUtils2.default)(locale);
return _react2.default.createElement(_DatePickerHead2.default, {
date: month,
showYearDropdown: showYearDropdown,
showMonthDropdown: showMonthDropdown,
localeUtils: localeUtils,
onChange: _this._setMonth,
onLeftArrowClick: function onLeftArrowClick() {
return _this._setMonth((0, _start_of_month2.default)((0, _add_months2.default)(month, -1)));
},
onRightArrowClick: function onRightArrowClick() {
return _this._setMonth((0, _start_of_month2.default)((0, _add_months2.default)(month, 1)));
}
});
};
_this._createDayPickerProps = function () {
var _this$props3 = _this.props,
locale = _this$props3.locale,
filterDate = _this$props3.filterDate,
excludePastDates = _this$props3.excludePastDates,
numOfMonths = _this$props3.numOfMonths;
var value = Calendar.parseValue(_this.props.value);
var month = _this.state.month;
var localeUtils = (0, _LocaleUtils2.default)(locale);
var _ref = value || {},
from = _ref.from,
to = _ref.to;
var singleDay = !from && !to && value;
var firstOfMonth = [new Date(month.getFullYear(), month.getMonth(), 1), new Date(month.getFullYear(), month.getMonth() + 1, 1)];
var lastOfMonth = [new Date(month.getFullYear(), month.getMonth() + 1, 0), new Date(month.getFullYear(), month.getMonth() + 2, 0)];
var captionElement = _this._createCaptionElement(month);
var selectedDays = _this._getSelectedDays(value);
return {
disabledDays: excludePastDates ? { before: new Date() } : function (date) {
return !filterDate(date);
},
initialMonth: month,
initialYear: month,
selectedDays: selectedDays,
month: month,
year: month,
firstDayOfWeek: 1,
locale: typeof locale === 'string' ? locale : '',
fixedWeeks: true,
onKeyDown: _this._handleKeyDown,
onDayClick: _this._handleDayClick,
localeUtils: localeUtils,
navbarElement: function navbarElement() {
return null;
},
captionElement: captionElement,
onCaptionClick: _this._preventActionEventDefault,
onDayKeyDown: _this._handleDayKeyDown,
numberOfMonths: numOfMonths,
className: numOfMonths > 1 ? _Calendar2.default.TwoMonths : '',
modifiers: { start: from, end: to, firstOfMonth: firstOfMonth, lastOfMonth: lastOfMonth, singleDay: singleDay },
renderDay: Calendar.renderDay
};
};
_this._handleKeyDown = function (event) {
var keyHandler = _this.keyHandlers[event.keyCode];
keyHandler && keyHandler(event);
};
_this.keyHandlers = {
// escape
27: _this.props.onClose,
// tab
9: _this.props.onClose
};
_this._focusSelectedDay = function (dayPickerRef) {
if (dayPickerRef) {
_this.dayPickerRef = dayPickerRef;
var selectedDay = _this.dayPickerRef.dayPicker.querySelector('.DayPicker-Day--selected');
if (selectedDay) {
selectedDay.classList.add('DayPicker-Day--unfocused');
selectedDay.focus();
}
}
};
_this._handleDayKeyDown = function (_value) {
var _modifiers = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var event = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
_this._preventActionEventDefault(event);
var unfocusedDay = _this.dayPickerRef.dayPicker.querySelector('.DayPicker-Day--unfocused');
if (unfocusedDay) {
unfocusedDay.classList.remove('DayPicker-Day--unfocused');
}
};
var initialMonth = Calendar.getUpdatedMonth(props.value, props.numOfMonths);
_this.state = {
month: initialMonth || new Date()
};
return _this;
}
_createClass(Calendar, [{
key: 'componentWillReceiveProps',
value: function componentWillReceiveProps(nextProps) {
if (nextProps.value !== this.props.value) {
var month = Calendar.getUpdatedMonth(nextProps.value, nextProps.numOfMonths, this.state.month);
if (month) {
this.setState({ month: month });
}
}
}
}, {
key: '_getSelectedDays',
value: function _getSelectedDays(value) {
var _ref2 = value || {},
from = _ref2.from,
to = _ref2.to;
if (from && to) {
return { from: from, to: to };
} else if (from) {
return { after: prevDay(from) };
} else if (to) {
return { before: nextDay(to) };
} else {
// Single day OR empty value
return value;
}
}
}, {
key: 'render',
value: function render() {
return _react2.default.createElement(
'div',
{
className: (0, _classnames2.default)(_Calendar2.default.calendar, this.props.className),
onClick: this._preventActionEventDefault
},
_react2.default.createElement(_DayPicker2.default, _extends({
ref: this._focusSelectedDay
}, this._createDayPickerProps()))
);
}
}], [{
key: 'areValuesEqual',
value: function areValuesEqual() {
var value1 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var value2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
if (!Boolean(value1) && !Boolean(value2)) {
return true;
}
if (Calendar.isRangeValue(value1) && Calendar.isRangeValue(value2)) {
return (0, _is_same_day2.default)(value1.from, value2.from) && (0, _is_same_day2.default)(value1.to, value2.to);
}
return (0, _is_same_day2.default)(value1, value2);
}
}, {
key: 'renderDay',
value: function renderDay(day, modifiers) {
var relevantModifiers = ['start', 'end', 'selected'];
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = relevantModifiers[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var modifier = _step.value;
if (modifier in modifiers) {
return _react2.default.createElement(
'div',
{
className: _Calendar2.default.dayCircle,
'data-date': day.getFullYear() + '-' + day.getMonth() + '-' + day.getDate()
},
day.getDate()
);
}
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
return _react2.default.createElement(
'div',
{
'data-date': day.getFullYear() + '-' + day.getMonth() + '-' + day.getDate()
},
day.getDate()
);
}
/** Return a value in which all string-dates are parsed into Date objects */
}, {
key: 'isSingleDay',
value: function isSingleDay(value) {
return value instanceof Date;
}
}, {
key: 'isRangeValue',
value: function isRangeValue(value) {
return Boolean(value.from || value.to);
}
}]);
return Calendar;
}(_WixComponent3.default), _class.displayName = 'Calendar', _class.defaultProps = {
locale: 'en',
className: '',
filterDate: function filterDate() {
return true;
},
shouldCloseOnSelect: true,
onClose: function onClose() {}
}, _class.optionalParse = function (dateOrString) {
return typeof dateOrString === 'string' ? (0, _parse2.default)(dateOrString) : dateOrString;
}, _class.parseValue = function (value) {
if (!value) {
return new Date();
}
if (typeof value === 'string') {
return (0, _parse2.default)(value);
} else if (value instanceof Date) {
return value;
} else {
return {
from: Calendar.optionalParse(value.from),
to: Calendar.optionalParse(value.to)
};
}
}, _class.getUpdatedMonth = function (nextPropsValue, numOfMonths, currentMonthDate) {
var nextValue = Calendar.parseValue(nextPropsValue);
if (!currentMonthDate) {
return Calendar.isSingleDay(nextValue) ? nextValue : nextValue.from || nextValue.to;
}
var view = new _utils.CalendarView(currentMonthDate, numOfMonths);
if (Calendar.isSingleDay(nextValue)) {
if (!view.isContained(nextValue)) {
return nextValue;
}
} else {
var from = nextValue.from,
to = nextValue.to;
if (from && view.isAfterView(from)) {
// F--- => F---
// VVVVV => VVVVV
return from;
} else if (to && view.isBeforeView(to)) {
if (view.isRangeFits(from, to)) {
// F-T => F-T
// VVVVV => VVVVV
return from;
} else {
// F-----T => F-----T
// VVVVV => VVVVV
return (0, _sub_months2.default)(to, numOfMonths - 1);
}
} else if (from && view.isBeforeView(from) && to && view.isAfterView(to)) {
// F-------T => F-------T
// VVVVV => VVVVV
return from; // choose the 'from' anchor arbitrarly
}
}
/*
* We only changed the month if the day (or range.edges) are outside the view.
* This is to avoid changing the month right after a user clicks on the calendar.
*/
return null;
}, _temp);
exports.default = Calendar;
Calendar.propTypes = {
/** Display multiple months, currently allowing only 1 or 2 */
numOfMonths: _propTypes2.default.oneOf([1, 2]),
className: _propTypes2.default.string,
/** Callback function called with a Date or a Range whenever the user selects a day in the calendar */
onChange: _propTypes2.default.func.isRequired,
/** Callback function called whenever user press escape or click outside of the element or a date is selected and `shouldCloseOnSelect` is set. Receives an event as first argument */
onClose: _propTypes2.default.func,
/** Past dates are unselectable */
excludePastDates: _propTypes2.default.bool,
/** Only the truthy dates are selectable */
filterDate: _propTypes2.default.func,
/** The selected date */
value: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.instanceOf(Date), _propTypes2.default.shape({
from: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.instanceOf(Date)]),
to: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.instanceOf(Date)])
})]),
/** Whether the user should be able to select a date range, or just a single day */
selectionMode: _propTypes2.default.oneOf(['day', 'range']),
/** Display a selectable yearDropdown */
showYearDropdown: _propTypes2.default.bool,
/** Display a selectable monthDropdown */
showMonthDropdown: _propTypes2.default.bool,
/** should the calendar close on day selection */
shouldCloseOnSelect: _propTypes2.default.bool,
/** DatePicker instance locale */
locale: _propTypes2.default.oneOfType([_propTypes2.default.oneOf(['en', 'es', 'pt', 'fr', 'de', 'pl', 'it', 'ru', 'ja', 'ko', 'tr', 'sv', 'no', 'nl', 'da']), _propTypes2.default.shape({
distanceInWords: _propTypes2.default.object,
format: _propTypes2.default.object
})])
};
function nextDay(date) {
var day = new Date(date);
day.setDate(day.getDate() + 1);
return day;
}
function prevDay(date) {
var day = new Date(date);
day.setDate(day.getDate() - 1);
return day;
}