react-big-calendar
Version:
Calendar! with events
178 lines (173 loc) • 8.41 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _react = _interopRequireDefault(require("react"));
var _clsx = _interopRequireDefault(require("clsx"));
var _EventRowMixin = _interopRequireDefault(require("./EventRowMixin"));
var _eventLevels = require("./utils/eventLevels");
var _range = _interopRequireDefault(require("lodash/range"));
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2.default)(o), (0, _possibleConstructorReturn2.default)(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2.default)(t).constructor) : o.apply(t, e)); }
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
// Modified: Check if a segment spans through this slot (including events that started earlier)
var isSegmentInSlot = function isSegmentInSlot(seg, slot) {
return seg.left <= slot && seg.right >= slot;
};
var eventsInSlot = function eventsInSlot(segments, slot) {
return segments.filter(function (seg) {
return isSegmentInSlot(seg, slot);
}).map(function (seg) {
return seg.event;
});
};
var EventEndingRow = /*#__PURE__*/function (_React$Component) {
function EventEndingRow() {
(0, _classCallCheck2.default)(this, EventEndingRow);
return _callSuper(this, EventEndingRow, arguments);
}
(0, _inherits2.default)(EventEndingRow, _React$Component);
return (0, _createClass2.default)(EventEndingRow, [{
key: "render",
value: function render() {
var _this$props = this.props,
segments = _this$props.segments,
slots = _this$props.slotMetrics.slots;
var rowSegments = (0, _eventLevels.eventLevels)(segments).levels[0];
var current = 1,
lastEnd = 1,
row = [];
while (current <= slots) {
var key = '_lvl_' + current;
// Find segment that starts at or spans through current slot
var _ref = rowSegments.filter(function (seg) {
return isSegmentInSlot(seg, current);
})[0] || {},
event = _ref.event,
left = _ref.left,
right = _ref.right,
span = _ref.span;
if (!event) {
// No visible event starts at this slot, but check if we need a "more" button
// for hidden events that span this slot
var hiddenEvents = this.getHiddenEventsForSlot(segments, current);
if (hiddenEvents.length > 0) {
var _gap = current - lastEnd;
if (_gap) {
row.push(_EventRowMixin.default.renderSpan(slots, _gap, key + '_gap'));
}
row.push(_EventRowMixin.default.renderSpan(slots, 1, key, this.renderShowMore(segments, current)));
lastEnd = current = current + 1;
continue;
}
current++;
continue;
}
var gap = Math.max(0, left - lastEnd);
if (this.canRenderSlotEvent(left, span)) {
var content = _EventRowMixin.default.renderEvent(this.props, event);
if (gap) {
row.push(_EventRowMixin.default.renderSpan(slots, gap, key + '_gap'));
}
row.push(_EventRowMixin.default.renderSpan(slots, span, key, content));
lastEnd = current = right + 1;
} else {
if (gap) {
row.push(_EventRowMixin.default.renderSpan(slots, gap, key + '_gap'));
}
row.push(_EventRowMixin.default.renderSpan(slots, 1, key, this.renderShowMore(segments, current)));
lastEnd = current = current + 1;
}
}
return /*#__PURE__*/_react.default.createElement("div", {
className: "rbc-row"
}, row);
}
// New helper method to find hidden events for a slot
}, {
key: "getHiddenEventsForSlot",
value: function getHiddenEventsForSlot(segments, slot) {
// Get all events (visible and hidden) for this slot
var allEventsInSlot = eventsInSlot(segments, slot);
// Get visible events for this slot from the first level
var rowSegments = (0, _eventLevels.eventLevels)(segments).levels[0];
var visibleEventsInSlot = rowSegments.filter(function (seg) {
return isSegmentInSlot(seg, slot);
}).map(function (seg) {
return seg.event;
});
// Return events that are in allEventsInSlot but not in visibleEventsInSlot
return allEventsInSlot.filter(function (event) {
return !visibleEventsInSlot.some(function (visEvent) {
return visEvent === event;
});
});
}
}, {
key: "canRenderSlotEvent",
value: function canRenderSlotEvent(slot, span) {
var segments = this.props.segments;
return (0, _range.default)(slot, slot + span).every(function (s) {
var count = eventsInSlot(segments, s).length;
return count === 1;
});
}
}, {
key: "renderShowMore",
value: function renderShowMore(segments, slot) {
var _this = this;
var _this$props2 = this.props,
localizer = _this$props2.localizer,
slotMetrics = _this$props2.slotMetrics,
components = _this$props2.components;
var events = slotMetrics.getEventsForSlot(slot);
var remainingEvents = eventsInSlot(segments, slot);
var count = remainingEvents.length;
if (components !== null && components !== void 0 && components.showMore) {
var ShowMore = components.showMore;
// The received slot seems to be 1-based, but the range we use to pull the date is 0-based
var slotDate = slotMetrics.getDateForSlot(slot - 1);
return count ? /*#__PURE__*/_react.default.createElement(ShowMore, {
localizer: localizer,
slotDate: slotDate,
slot: slot,
count: count,
events: events,
remainingEvents: remainingEvents
}) : false;
}
return count ? /*#__PURE__*/_react.default.createElement("button", {
type: "button",
key: 'sm_' + slot,
className: (0, _clsx.default)('rbc-button-link', 'rbc-show-more'),
onClick: function onClick(e) {
return _this.showMore(slot, e);
}
}, localizer.messages.showMore(count, remainingEvents, events)) : false;
}
}, {
key: "showMore",
value: function showMore(slot, e) {
e.preventDefault();
e.stopPropagation();
this.props.onShowMore(slot, e.target);
}
}]);
}(_react.default.Component);
EventEndingRow.propTypes = process.env.NODE_ENV !== "production" ? _objectSpread({
segments: _propTypes.default.array,
slots: _propTypes.default.number,
onShowMore: _propTypes.default.func
}, _EventRowMixin.default.propTypes) : {};
EventEndingRow.defaultProps = _objectSpread({}, _EventRowMixin.default.defaultProps);
var _default = exports.default = EventEndingRow;