@rusinov/react-big-calendar
Version:
342 lines (282 loc) • 11.2 kB
JavaScript
"use strict";
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
exports.__esModule = true;
exports.default = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _inheritsLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/inheritsLoose"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _classnames = _interopRequireDefault(require("classnames"));
var _requestAnimationFrame = _interopRequireDefault(require("dom-helpers/util/requestAnimationFrame"));
var _react = _interopRequireWildcard(require("react"));
var _reactDom = require("react-dom");
var _dates = _interopRequireDefault(require("./utils/dates"));
var _DayColumn = _interopRequireDefault(require("./DayColumn"));
var _TimeGutter = _interopRequireDefault(require("./TimeGutter"));
var _width = _interopRequireDefault(require("dom-helpers/query/width"));
var _TimeGridHeader = _interopRequireDefault(require("./TimeGridHeader"));
var _helpers = require("./utils/helpers");
var _eventLevels = require("./utils/eventLevels");
var _Resources = _interopRequireDefault(require("./utils/Resources"));
var TimeGrid =
/*#__PURE__*/
function (_Component) {
(0, _inheritsLoose2.default)(TimeGrid, _Component);
function TimeGrid(props) {
var _this;
_this = _Component.call(this, props) || this;
_this.handleScroll = function (e) {
if (_this.scrollRef.current) {
_this.scrollRef.current.scrollLeft = e.target.scrollLeft;
}
};
_this.handleResize = function () {
_requestAnimationFrame.default.cancel(_this.rafHandle);
_this.rafHandle = (0, _requestAnimationFrame.default)(_this.checkOverflow);
};
_this.gutterRef = function (ref) {
_this.gutter = ref && (0, _reactDom.findDOMNode)(ref);
};
_this.handleSelectAlldayEvent = function () {
//cancel any pending selections so only the event click goes through.
_this.clearSelection();
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
(0, _helpers.notify)(_this.props.onSelectEvent, args);
};
_this.handleSelectAllDaySlot = function (slots, slotInfo) {
var onSelectSlot = _this.props.onSelectSlot;
(0, _helpers.notify)(onSelectSlot, {
slots: slots,
start: slots[0],
end: slots[slots.length - 1],
action: slotInfo.action
});
};
_this.checkOverflow = function () {
if (_this._updatingOverflow) return;
var isOverflowing = _this.refs.content.scrollHeight > _this.refs.content.clientHeight;
if (_this.state.isOverflowing !== isOverflowing) {
_this._updatingOverflow = true;
_this.setState({
isOverflowing: isOverflowing
}, function () {
_this._updatingOverflow = false;
});
}
};
_this.state = {
gutterWidth: undefined,
isOverflowing: null
};
_this.scrollRef = _react.default.createRef();
_this.resources = (0, _Resources.default)(props.resources, props.accessors);
return _this;
}
var _proto = TimeGrid.prototype;
_proto.componentWillMount = function componentWillMount() {
this.calculateScroll();
};
_proto.componentDidMount = function componentDidMount() {
this.checkOverflow();
if (this.props.width == null) {
this.measureGutter();
}
this.applyScroll();
window.addEventListener('resize', this.handleResize);
};
_proto.componentWillUnmount = function componentWillUnmount() {
window.removeEventListener('resize', this.handleResize);
_requestAnimationFrame.default.cancel(this.rafHandle);
};
_proto.componentDidUpdate = function componentDidUpdate() {
if (this.props.width == null) {
this.measureGutter();
}
this.applyScroll(); //this.checkOverflow()
};
_proto.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {
var _this$props = this.props,
range = _this$props.range,
scrollToTime = _this$props.scrollToTime; // When paginating, reset scroll
if (!_dates.default.eq(nextProps.range[0], range[0], 'minute') || !_dates.default.eq(nextProps.scrollToTime, scrollToTime, 'minute')) {
this.calculateScroll(nextProps);
}
};
_proto.renderEvents = function renderEvents(range, events, now) {
var _this2 = this;
var _this$props2 = this.props,
min = _this$props2.min,
max = _this$props2.max,
components = _this$props2.components,
accessors = _this$props2.accessors,
localizer = _this$props2.localizer;
var groupedEvents = this.resources.groupEvents(events);
return this.resources.map(function (_ref, i) {
var id = _ref[0],
resource = _ref[1];
return range.map(function (date, jj) {
var daysEvents = (groupedEvents.get(id) || []).filter(function (event) {
return _dates.default.inRange(date, accessors.start(event), accessors.end(event), 'day');
});
return _react.default.createElement(_DayColumn.default, (0, _extends2.default)({}, _this2.props, {
localizer: localizer,
min: _dates.default.merge(date, min),
max: _dates.default.merge(date, max),
resource: resource && id,
components: components,
isNow: _dates.default.eq(date, now, 'day'),
key: i + '-' + jj,
date: date,
events: daysEvents
}));
});
});
};
_proto.render = function render() {
var _this$props3 = this.props,
events = _this$props3.events,
range = _this$props3.range,
width = _this$props3.width,
selected = _this$props3.selected,
getNow = _this$props3.getNow,
resources = _this$props3.resources,
components = _this$props3.components,
accessors = _this$props3.accessors,
getters = _this$props3.getters,
localizer = _this$props3.localizer,
min = _this$props3.min,
max = _this$props3.max,
showMultiDayTimes = _this$props3.showMultiDayTimes,
longPressThreshold = _this$props3.longPressThreshold;
width = width || this.state.gutterWidth;
var start = range[0],
end = range[range.length - 1];
this.slots = range.length;
var allDayEvents = [],
rangeEvents = [];
events.forEach(function (event) {
if ((0, _eventLevels.inRange)(event, start, end, accessors)) {
var eStart = accessors.start(event),
eEnd = accessors.end(event);
if (accessors.allDay(event) || _dates.default.isJustDate(eStart) && _dates.default.isJustDate(eEnd) || !showMultiDayTimes && !_dates.default.eq(eStart, eEnd, 'day')) {
allDayEvents.push(event);
} else {
rangeEvents.push(event);
}
}
});
allDayEvents.sort(function (a, b) {
return (0, _eventLevels.sortEvents)(a, b, accessors);
});
return _react.default.createElement("div", {
className: (0, _classnames.default)('rbc-time-view', resources && 'rbc-time-view-resources')
}, _react.default.createElement(_TimeGridHeader.default, {
range: range,
events: allDayEvents,
width: width,
getNow: getNow,
localizer: localizer,
selected: selected,
resources: this.resources,
selectable: this.props.selectable,
accessors: accessors,
getters: getters,
components: components,
scrollRef: this.scrollRef,
isOverflowing: this.state.isOverflowing,
longPressThreshold: longPressThreshold,
onSelectSlot: this.handleSelectAllDaySlot,
onSelectEvent: this.handleSelectAlldayEvent,
onDoubleClickEvent: this.props.onDoubleClickEvent,
onDrillDown: this.props.onDrillDown,
getDrilldownView: this.props.getDrilldownView
}), _react.default.createElement("div", {
ref: "content",
className: "rbc-time-content",
onScroll: this.handleScroll
}, _react.default.createElement(_TimeGutter.default, {
date: start,
ref: this.gutterRef,
localizer: localizer,
min: _dates.default.merge(start, min),
max: _dates.default.merge(start, max),
step: this.props.step,
getNow: this.props.getNow,
timeslots: this.props.timeslots,
components: components,
className: "rbc-time-gutter"
}), this.renderEvents(range, rangeEvents, getNow())));
};
_proto.clearSelection = function clearSelection() {
clearTimeout(this._selectTimer);
this._pendingSelection = [];
};
_proto.measureGutter = function measureGutter() {
var width = (0, _width.default)(this.gutter);
if (width && this.state.gutterWidth !== width) {
this.setState({
gutterWidth: width
});
}
};
_proto.applyScroll = function applyScroll() {
if (this._scrollRatio) {
var content = this.refs.content;
content.scrollTop = content.scrollHeight * this._scrollRatio; // Only do this once
this._scrollRatio = null;
}
};
_proto.calculateScroll = function calculateScroll(props) {
if (props === void 0) {
props = this.props;
}
var _props = props,
min = _props.min,
max = _props.max,
scrollToTime = _props.scrollToTime;
var diffMillis = scrollToTime - _dates.default.startOf(scrollToTime, 'day');
var totalMillis = _dates.default.diff(max, min);
this._scrollRatio = diffMillis / totalMillis;
};
return TimeGrid;
}(_react.Component);
exports.default = TimeGrid;
TimeGrid.propTypes = {
events: _propTypes.default.array.isRequired,
resources: _propTypes.default.array,
step: _propTypes.default.number,
timeslots: _propTypes.default.number,
range: _propTypes.default.arrayOf(_propTypes.default.instanceOf(Date)),
min: _propTypes.default.instanceOf(Date),
max: _propTypes.default.instanceOf(Date),
getNow: _propTypes.default.func.isRequired,
scrollToTime: _propTypes.default.instanceOf(Date),
showMultiDayTimes: _propTypes.default.bool,
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,
onSelectEnd: _propTypes.default.func,
onSelectStart: _propTypes.default.func,
onSelectEvent: _propTypes.default.func,
onDoubleClickEvent: _propTypes.default.func,
onDrillDown: _propTypes.default.func,
getDrilldownView: _propTypes.default.func.isRequired
};
TimeGrid.defaultProps = {
step: 30,
timeslots: 2,
min: _dates.default.startOf(new Date(), 'day'),
max: _dates.default.endOf(new Date(), 'day'),
scrollToTime: _dates.default.startOf(new Date(), 'day')
};
module.exports = exports["default"];