@rusinov/react-big-calendar
Version:
421 lines (343 loc) • 13.8 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
exports.__esModule = true;
exports.default = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
var _inheritsLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/inheritsLoose"));
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _react = _interopRequireDefault(require("react"));
var _reactDom = require("react-dom");
var _classnames = _interopRequireDefault(require("classnames"));
var _dates = _interopRequireDefault(require("./utils/dates"));
var _chunk = _interopRequireDefault(require("lodash/chunk"));
var _constants = require("./utils/constants");
var _helpers = require("./utils/helpers");
var _position = _interopRequireDefault(require("dom-helpers/query/position"));
var _requestAnimationFrame = _interopRequireDefault(require("dom-helpers/util/requestAnimationFrame"));
var _Popup = _interopRequireDefault(require("./Popup"));
var _Overlay = _interopRequireDefault(require("react-overlays/lib/Overlay"));
var _DateContentRow = _interopRequireDefault(require("./DateContentRow"));
var _Header = _interopRequireDefault(require("./Header"));
var _DateHeader = _interopRequireDefault(require("./DateHeader"));
var _eventLevels = require("./utils/eventLevels");
var eventsForWeek = function eventsForWeek(evts, start, end, accessors) {
return evts.filter(function (e) {
return (0, _eventLevels.inRange)(e, start, end, accessors);
});
};
var propTypes = {
events: _propTypes.default.array.isRequired,
date: _propTypes.default.instanceOf(Date),
min: _propTypes.default.instanceOf(Date),
max: _propTypes.default.instanceOf(Date),
step: _propTypes.default.number,
getNow: _propTypes.default.func.isRequired,
scrollToTime: _propTypes.default.instanceOf(Date),
rtl: _propTypes.default.bool,
width: _propTypes.default.number,
accessors: _propTypes.default.object.isRequired,
components: _propTypes.default.object.isRequired,
getters: _propTypes.default.object.isRequired,
localizer: _propTypes.default.object.isRequired,
selected: _propTypes.default.object,
selectable: _propTypes.default.oneOf([true, false, 'ignoreEvents']),
longPressThreshold: _propTypes.default.number,
onNavigate: _propTypes.default.func,
onSelectSlot: _propTypes.default.func,
onSelectEvent: _propTypes.default.func,
onDoubleClickEvent: _propTypes.default.func,
onShowMore: _propTypes.default.func,
onDrillDown: _propTypes.default.func,
getDrilldownView: _propTypes.default.func.isRequired,
popup: _propTypes.default.bool,
popupOffset: _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.shape({
x: _propTypes.default.number,
y: _propTypes.default.number
})])
};
var MonthView =
/*#__PURE__*/
function (_React$Component) {
(0, _inheritsLoose2.default)(MonthView, _React$Component);
function MonthView() {
var _this;
for (var _len = arguments.length, _args = new Array(_len), _key = 0; _key < _len; _key++) {
_args[_key] = arguments[_key];
}
_this = _React$Component.call.apply(_React$Component, [this].concat(_args)) || this;
_this.getContainer = function () {
return (0, _reactDom.findDOMNode)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));
};
_this.renderWeek = function (week, weekIdx) {
var _this$props = _this.props,
events = _this$props.events,
components = _this$props.components,
selectable = _this$props.selectable,
getNow = _this$props.getNow,
selected = _this$props.selected,
date = _this$props.date,
localizer = _this$props.localizer,
longPressThreshold = _this$props.longPressThreshold,
accessors = _this$props.accessors,
getters = _this$props.getters;
var _this$state = _this.state,
needLimitMeasure = _this$state.needLimitMeasure,
rowLimit = _this$state.rowLimit;
events = eventsForWeek(events, week[0], week[week.length - 1], accessors);
events.sort(function (a, b) {
return (0, _eventLevels.sortEvents)(a, b, accessors);
});
return _react.default.createElement(_DateContentRow.default, {
key: weekIdx,
ref: weekIdx === 0 ? 'slotRow' : undefined,
container: _this.getContainer,
className: "rbc-month-row",
getNow: getNow,
date: date,
range: week,
events: events,
maxRows: rowLimit,
selected: selected,
selectable: selectable,
components: components,
accessors: accessors,
getters: getters,
localizer: localizer,
renderHeader: _this.readerDateHeading,
renderForMeasure: needLimitMeasure,
onShowMore: _this.handleShowMore,
onSelect: _this.handleSelectEvent,
onDoubleClick: _this.handleDoubleClickEvent,
onSelectSlot: _this.handleSelectSlot,
longPressThreshold: longPressThreshold,
rtl: _this.props.rtl
});
};
_this.readerDateHeading = function (_ref) {
var date = _ref.date,
className = _ref.className,
props = (0, _objectWithoutPropertiesLoose2.default)(_ref, ["date", "className"]);
var _this$props2 = _this.props,
currentDate = _this$props2.date,
getDrilldownView = _this$props2.getDrilldownView,
localizer = _this$props2.localizer;
var isOffRange = _dates.default.month(date) !== _dates.default.month(currentDate);
var isCurrent = _dates.default.eq(date, currentDate, 'day');
var drilldownView = getDrilldownView(date);
var label = localizer.format(date, 'dateFormat');
var DateHeaderComponent = _this.props.components.dateHeader || _DateHeader.default;
return _react.default.createElement("div", (0, _extends2.default)({}, props, {
className: (0, _classnames.default)(className, isOffRange && 'rbc-off-range', isCurrent && 'rbc-current')
}), _react.default.createElement(DateHeaderComponent, {
label: label,
date: date,
drilldownView: drilldownView,
isOffRange: isOffRange,
onDrillDown: function onDrillDown(e) {
return _this.handleHeadingClick(date, drilldownView, e);
}
}));
};
_this.handleSelectSlot = function (range, slotInfo) {
_this._pendingSelection = _this._pendingSelection.concat(range);
clearTimeout(_this._selectTimer);
_this._selectTimer = setTimeout(function () {
return _this.selectDates(slotInfo);
});
};
_this.handleHeadingClick = function (date, view, e) {
e.preventDefault();
_this.clearSelection();
(0, _helpers.notify)(_this.props.onDrillDown, [date, view]);
};
_this.handleSelectEvent = function () {
_this.clearSelection();
for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
args[_key2] = arguments[_key2];
}
(0, _helpers.notify)(_this.props.onSelectEvent, args);
};
_this.handleDoubleClickEvent = function () {
_this.clearSelection();
for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
args[_key3] = arguments[_key3];
}
(0, _helpers.notify)(_this.props.onDoubleClickEvent, args);
};
_this.handleShowMore = function (events, date, cell, slot) {
var _this$props3 = _this.props,
popup = _this$props3.popup,
onDrillDown = _this$props3.onDrillDown,
onShowMore = _this$props3.onShowMore,
getDrilldownView = _this$props3.getDrilldownView; //cancel any pending selections so only the event click goes through.
_this.clearSelection();
if (popup) {
var position = (0, _position.default)(cell, (0, _reactDom.findDOMNode)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this))));
_this.setState({
overlay: {
date: date,
events: events,
position: position
}
});
} else {
(0, _helpers.notify)(onDrillDown, [date, getDrilldownView(date) || _constants.views.DAY]);
}
(0, _helpers.notify)(onShowMore, [events, date, slot]);
};
_this._bgRows = [];
_this._pendingSelection = [];
_this.state = {
rowLimit: 5,
needLimitMeasure: true
};
return _this;
}
var _proto = MonthView.prototype;
_proto.componentWillReceiveProps = function componentWillReceiveProps(_ref2) {
var date = _ref2.date;
this.setState({
needLimitMeasure: !_dates.default.eq(date, this.props.date)
});
};
_proto.componentDidMount = function componentDidMount() {
var _this2 = this;
var running;
if (this.state.needLimitMeasure) this.measureRowLimit(this.props);
window.addEventListener('resize', this._resizeListener = function () {
if (!running) {
(0, _requestAnimationFrame.default)(function () {
running = false;
_this2.setState({
needLimitMeasure: true
}); //eslint-disable-line
});
}
}, false);
};
_proto.componentDidUpdate = function componentDidUpdate() {
if (this.state.needLimitMeasure) this.measureRowLimit(this.props);
};
_proto.componentWillUnmount = function componentWillUnmount() {
window.removeEventListener('resize', this._resizeListener, false);
};
_proto.render = function render() {
var _this$props4 = this.props,
date = _this$props4.date,
localizer = _this$props4.localizer,
className = _this$props4.className,
month = _dates.default.visibleDays(date, localizer),
weeks = (0, _chunk.default)(month, 7);
this._weekCount = weeks.length;
return _react.default.createElement("div", {
className: (0, _classnames.default)('rbc-month-view', className)
}, _react.default.createElement("div", {
className: "rbc-row rbc-month-header"
}, this.renderHeaders(weeks[0])), weeks.map(this.renderWeek), this.props.popup && this.renderOverlay());
};
_proto.renderHeaders = function renderHeaders(row) {
var _this$props5 = this.props,
localizer = _this$props5.localizer,
components = _this$props5.components;
var first = row[0];
var last = row[row.length - 1];
var HeaderComponent = components.header || _Header.default;
return _dates.default.range(first, last, 'day').map(function (day, idx) {
return _react.default.createElement("div", {
key: 'header_' + idx,
className: "rbc-header"
}, _react.default.createElement(HeaderComponent, {
date: day,
localizer: localizer,
label: localizer.format(day, 'weekdayFormat')
}));
});
};
_proto.renderOverlay = function renderOverlay() {
var _this3 = this;
var overlay = this.state && this.state.overlay || {};
var _this$props6 = this.props,
accessors = _this$props6.accessors,
localizer = _this$props6.localizer,
components = _this$props6.components,
getters = _this$props6.getters,
selected = _this$props6.selected;
return _react.default.createElement(_Overlay.default, {
rootClose: true,
placement: "bottom",
container: this,
show: !!overlay.position,
onHide: function onHide() {
return _this3.setState({
overlay: null
});
}
}, _react.default.createElement(_Popup.default, {
accessors: accessors,
getters: getters,
selected: selected,
components: components,
localizer: localizer,
position: overlay.position,
events: overlay.events,
slotStart: overlay.date,
slotEnd: overlay.end,
onSelect: this.handleSelectEvent,
onDoubleClick: this.handleDoubleClickEvent
}));
};
_proto.measureRowLimit = function measureRowLimit() {
this.setState({
needLimitMeasure: false,
rowLimit: this.refs.slotRow.getRowLimit()
});
};
_proto.selectDates = function selectDates(slotInfo) {
var slots = this._pendingSelection.slice();
this._pendingSelection = [];
slots.sort(function (a, b) {
return +a - +b;
});
(0, _helpers.notify)(this.props.onSelectSlot, {
slots: slots,
start: slots[0],
end: slots[slots.length - 1],
action: slotInfo.action
});
};
_proto.clearSelection = function clearSelection() {
clearTimeout(this._selectTimer);
this._pendingSelection = [];
};
return MonthView;
}(_react.default.Component);
MonthView.displayName = 'MonthView';
MonthView.propTypes = propTypes;
MonthView.range = function (date, _ref3) {
var localizer = _ref3.localizer;
var start = _dates.default.firstVisibleDay(date, localizer);
var end = _dates.default.lastVisibleDay(date, localizer);
return {
start: start,
end: end
};
};
MonthView.navigate = function (date, action) {
switch (action) {
case _constants.navigate.PREVIOUS:
return _dates.default.add(date, -1, 'month');
case _constants.navigate.NEXT:
return _dates.default.add(date, 1, 'month');
default:
return date;
}
};
MonthView.title = function (date, _ref4) {
var localizer = _ref4.localizer;
return localizer.format(date, 'monthHeaderFormat');
};
var _default = MonthView;
exports.default = _default;
module.exports = exports["default"];