@roo-ui/components
Version:
302 lines (238 loc) • 11.9 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
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 _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 _templateObject = _taggedTemplateLiteral(['\n border: ', ' ', ';\n color: transparent;\n text-shadow: 0 0 0 ', ';\n border-color: ', ';\n'], ['\n border: ', ' ', ';\n color: transparent;\n text-shadow: 0 0 0 ', ';\n border-color: ', ';\n']);
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _propTypes = require('prop-types');
var _propTypes2 = _interopRequireDefault(_propTypes);
var _dayzed = require('dayzed');
var _dayzed2 = _interopRequireDefault(_dayzed);
var _styledSystem = require('styled-system');
var _dateFns = require('date-fns');
var _throttle = require('lodash/throttle');
var _throttle2 = _interopRequireDefault(_throttle);
var _ = require('../');
var _isDateInRange = require('./lib/isDateInRange');
var _isDateInRange2 = _interopRequireDefault(_isDateInRange);
var _CalendarNav = require('./components/CalendarNav');
var _CalendarNav2 = _interopRequireDefault(_CalendarNav);
var _CalendarMonth = require('./components/CalendarMonth');
var _CalendarMonth2 = _interopRequireDefault(_CalendarMonth);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
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); } }
function _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
var DateInput = _.Input.extend(_templateObject, (0, _styledSystem.themeGet)('borders.2'), (0, _styledSystem.themeGet)('colors.greys.porcelain'), (0, _styledSystem.themeGet)('colors.greys.charcoal'), function (props) {
return props.highlight ? (0, _styledSystem.themeGet)('colors.brand.secondary') : (0, _styledSystem.themeGet)('colors.greys.porcelain');
});
DateInput.defaultProps = _extends({}, _.Input.defaultProps, {
blacklist: [].concat(_toConsumableArray(Object.keys(_.Input.propTypes)), ['highlight'])
});
var DateRangePicker = function (_React$Component) {
_inherits(DateRangePicker, _React$Component);
function DateRangePicker(props) {
_classCallCheck(this, DateRangePicker);
var _this = _possibleConstructorReturn(this, (DateRangePicker.__proto__ || Object.getPrototypeOf(DateRangePicker)).call(this, props));
_this.onMouseLeaveOfCalendar = function () {
return _this.setState({ hoveredDate: null });
};
_this.onMouseEnterOfDay = function (hoveredDate) {
(0, _throttle2.default)(function () {
if (_this.state.startDate && !_this.state.endDate) {
_this.setState({ hoveredDate: hoveredDate.date });
}
}, 10)();
};
_this.onDateSelected = function (_ref) {
var selectable = _ref.selectable,
date = _ref.date;
if (!selectable) return;
var _this$state = _this.state,
startDate = _this$state.startDate,
endDate = _this$state.endDate,
isSettingStartDate = _this$state.isSettingStartDate,
isSettingEndDate = _this$state.isSettingEndDate;
if (!startDate || isSettingStartDate) {
_this.selectStartDate(date);
} else if (!endDate || isSettingEndDate) {
_this.selectEndDate(date);
} else {
_this.resetWithStartDate(date);
}
_this.notifyRangeSelection();
};
_this.notifyRangeSelection = function () {
var _this$state2 = _this.state,
startDate = _this$state2.startDate,
endDate = _this$state2.endDate;
if (startDate && endDate) {
_this.props.onRangeSelected({ startDate: startDate, endDate: endDate });
}
};
_this.selectStartDate = function (startDate) {
var endDate = startDate <= _this.state.endDate ? _this.state.endDate : null;
var endDateRequiresSelection = endDate === null;
_this.setState({
startDate: startDate,
endDate: endDate,
isSettingStartDate: false,
isSettingEndDate: endDateRequiresSelection,
hoveredDate: null
});
};
_this.selectEndDate = function (date) {
if (date <= _this.state.startDate) {
_this.resetWithStartDate(date);
} else {
_this.setState({
endDate: date,
isSettingEndDate: false,
hoveredDate: null
});
}
};
_this.resetWithStartDate = function (startDate) {
_this.setState({
startDate: startDate,
endDate: null,
isSettingStartDate: false,
isSettingEndDate: true,
hoveredDate: null
});
};
_this.isInRange = function (date) {
var _this$state3 = _this.state,
startDate = _this$state3.startDate,
endDate = _this$state3.endDate,
isSettingStartDate = _this$state3.isSettingStartDate,
hoveredDate = _this$state3.hoveredDate;
return (0, _isDateInRange2.default)({
startDate: startDate, endDate: endDate, isSettingStartDate: isSettingStartDate, hoveredDate: hoveredDate, date: date
});
};
_this.state = {
hoveredDate: null,
startDate: props.startDate,
endDate: props.endDate,
isSettingStartDate: props.setStartDate,
isSettingEndDate: props.setEndDate
};
return _this;
}
_createClass(DateRangePicker, [{
key: 'componentDidUpdate',
value: function componentDidUpdate(prevProps, prevState) {
var _state = this.state,
startDate = _state.startDate,
endDate = _state.endDate;
var prevStartDate = prevState.startDate,
prevEndDate = prevState.endDate;
var _props = this.props,
onChangeStartDate = _props.onChangeStartDate,
onChangeEndDate = _props.onChangeEndDate;
if (!(0, _dateFns.isEqual)(startDate, prevStartDate) && onChangeStartDate) {
onChangeStartDate(startDate);
}
if (!(0, _dateFns.isEqual)(endDate, prevEndDate) && onChangeEndDate) {
onChangeEndDate(endDate);
}
}
}, {
key: 'render',
value: function render() {
var _this2 = this;
var _props2 = this.props,
monthNames = _props2.monthNames,
weekdayNames = _props2.weekdayNames,
monthsToDisplay = _props2.monthsToDisplay,
stacked = _props2.stacked,
disabledDates = _props2.disabledDates,
interactiveDisabledDates = _props2.interactiveDisabledDates,
rest = _objectWithoutProperties(_props2, ['monthNames', 'weekdayNames', 'monthsToDisplay', 'stacked', 'disabledDates', 'interactiveDisabledDates']);
var selectedDates = [this.state.startDate, this.state.endDate];
return _react2.default.createElement(_dayzed2.default, _extends({}, rest, {
selected: selectedDates,
monthsToDisplay: monthsToDisplay,
onDateSelected: this.onDateSelected,
render: function render(_ref2) {
var calendars = _ref2.calendars,
getBackProps = _ref2.getBackProps,
getForwardProps = _ref2.getForwardProps,
getDateProps = _ref2.getDateProps;
if (!calendars.length) return null;
return _react2.default.createElement(
_.Box,
{ onMouseLeave: _this2.onMouseLeaveOfCalendar },
_react2.default.createElement(_CalendarNav2.default, {
prevProps: getBackProps({ calendars: calendars }),
nextProps: getForwardProps({ calendars: calendars })
}),
_react2.default.createElement(
_.Flex,
{ flexWrap: 'wrap' },
calendars.map(function (calendar) {
return _react2.default.createElement(_CalendarMonth2.default, {
key: '' + calendar.month + calendar.year,
monthsToDisplay: monthsToDisplay,
monthName: monthNames[calendar.month],
month: calendar.month,
year: calendar.year,
stacked: stacked,
weekdayNames: weekdayNames,
weeks: calendar.weeks,
getDateProps: getDateProps,
disabledDates: disabledDates,
interactiveDisabledDates: interactiveDisabledDates,
onMouseEnterOfDay: _this2.onMouseEnterOfDay,
isInRange: _this2.isInRange
});
})
)
);
}
}));
}
}]);
return DateRangePicker;
}(_react2.default.Component);
DateRangePicker.defaultProps = {
monthsToDisplay: 1,
firstDayOfWeek: 1,
stacked: false,
minDate: (0, _dateFns.subDays)(new Date(), 1),
disabledDates: [],
monthNames: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
weekdayNames: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
interactiveDisabledDates: false,
startDate: null,
endDate: null,
onChangeStartDate: null,
onChangeEndDate: null,
setStartDate: false,
setEndDate: false
};
DateRangePicker.propTypes = {
monthsToDisplay: _propTypes2.default.number,
firstDayOfWeek: _propTypes2.default.number,
stacked: _propTypes2.default.bool,
minDate: _propTypes2.default.instanceOf(Date),
disabledDates: _propTypes2.default.arrayOf(_propTypes2.default.instanceOf(Date)),
interactiveDisabledDates: _propTypes2.default.bool,
monthNames: _propTypes2.default.arrayOf(_propTypes2.default.string),
weekdayNames: _propTypes2.default.arrayOf(_propTypes2.default.string),
startDate: _propTypes2.default.instanceOf(Date),
endDate: _propTypes2.default.instanceOf(Date),
onChangeStartDate: _propTypes2.default.func,
onChangeEndDate: _propTypes2.default.func,
onRangeSelected: _propTypes2.default.func.isRequired,
setStartDate: _propTypes2.default.bool,
setEndDate: _propTypes2.default.bool
};
exports.default = DateRangePicker;