@rusinov/react-big-calendar
Version:
276 lines (225 loc) • 9.03 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 _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _react = _interopRequireDefault(require("react"));
var _dates = _interopRequireDefault(require("../../utils/dates"));
var _reactDom = require("react-dom");
var _Selection = _interopRequireWildcard(require("../../Selection"));
var _TimeGridEvent = _interopRequireDefault(require("../../TimeGridEvent"));
var _common = require("./common");
var _NoopWrapper = _interopRequireDefault(require("../../NoopWrapper"));
var pointInColumn = function pointInColumn(bounds, _ref) {
var x = _ref.x,
y = _ref.y;
var left = bounds.left,
right = bounds.right,
top = bounds.top;
return x < right + 10 && x > left && y > top;
};
var propTypes = {};
var EventContainerWrapper =
/*#__PURE__*/
function (_React$Component) {
(0, _inheritsLoose2.default)(EventContainerWrapper, _React$Component);
function EventContainerWrapper() {
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.handleMove = function (point, boundaryBox) {
var event = _this.context.draggable.dragAndDropAction.event;
var _this$props = _this.props,
accessors = _this$props.accessors,
slotMetrics = _this$props.slotMetrics;
if (!pointInColumn(boundaryBox, point)) {
_this.reset();
return;
}
var currentSlot = slotMetrics.closestSlotFromPoint({
y: point.y - _this.eventOffsetTop,
x: point.x
}, boundaryBox);
var eventStart = accessors.start(event);
var eventEnd = accessors.end(event);
var end = _dates.default.add(currentSlot, _dates.default.diff(eventStart, eventEnd, 'minutes'), 'minutes');
_this.update(event, slotMetrics.getRange(currentSlot, end));
};
_this._selectable = function () {
var node = (0, _reactDom.findDOMNode)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));
var selector = _this._selector = new _Selection.default(function () {
return node.closest('.rbc-time-view');
});
selector.on('beforeSelect', function (point) {
var dragAndDropAction = _this.context.draggable.dragAndDropAction;
if (!dragAndDropAction.action) return false;
if (dragAndDropAction.action === 'resize') {
return pointInColumn((0, _Selection.getBoundsForNode)(node), point);
}
var eventNode = (0, _Selection.getEventNodeFromPoint)(node, point);
if (!eventNode) return false;
_this.eventOffsetTop = point.y - (0, _Selection.getBoundsForNode)(eventNode).top;
});
selector.on('selecting', function (box) {
var bounds = (0, _Selection.getBoundsForNode)(node);
var dragAndDropAction = _this.context.draggable.dragAndDropAction;
if (dragAndDropAction.action === 'move') _this.handleMove(box, bounds);
if (dragAndDropAction.action === 'resize') _this.handleResize(box, bounds);
});
selector.on('selectStart', function () {
return _this.context.draggable.onStart();
});
selector.on('select', function (point) {
var bounds = (0, _Selection.getBoundsForNode)(node);
if (!_this.state.event || !pointInColumn(bounds, point)) return;
_this.handleInteractionEnd();
});
selector.on('click', function () {
return _this.context.draggable.onEnd(null);
});
selector.on('reset', function () {
_this.reset();
_this.context.draggable.onEnd(null);
});
};
_this.handleInteractionEnd = function () {
var resource = _this.props.resource;
var event = _this.state.event;
_this.reset();
_this.context.draggable.onEnd({
start: event.start,
end: event.end,
resourceId: resource
});
};
_this._teardownSelectable = function () {
if (!_this._selector) return;
_this._selector.teardown();
_this._selector = null;
};
_this.state = {};
return _this;
}
var _proto = EventContainerWrapper.prototype;
_proto.componentDidMount = function componentDidMount() {
this._selectable();
};
_proto.componentWillUnmount = function componentWillUnmount() {
this._teardownSelectable();
};
_proto.reset = function reset() {
if (this.state.event) this.setState({
event: null,
top: null,
height: null
});
};
_proto.update = function update(event, _ref2) {
var startDate = _ref2.startDate,
endDate = _ref2.endDate,
top = _ref2.top,
height = _ref2.height;
var lastEvent = this.state.event;
if (lastEvent && startDate === lastEvent.start && endDate === lastEvent.end) {
return;
}
this.setState({
top: top,
height: height,
event: (0, _extends2.default)({}, event, {
start: startDate,
end: endDate
})
});
};
_proto.handleResize = function handleResize(point, boundaryBox) {
var start, end;
var _this$props2 = this.props,
accessors = _this$props2.accessors,
slotMetrics = _this$props2.slotMetrics;
var _this$context$draggab = this.context.draggable.dragAndDropAction,
event = _this$context$draggab.event,
direction = _this$context$draggab.direction;
var currentSlot = slotMetrics.closestSlotFromPoint(point, boundaryBox);
if (direction === 'UP') {
end = accessors.end(event);
start = _dates.default.min(currentSlot, slotMetrics.closestSlotFromDate(end, -1));
} else if (direction === 'DOWN') {
start = accessors.start(event);
end = _dates.default.max(currentSlot, slotMetrics.closestSlotFromDate(start));
}
this.update(event, slotMetrics.getRange(start, end));
};
_proto.render = function render() {
var _this$props3 = this.props,
children = _this$props3.children,
accessors = _this$props3.accessors,
components = _this$props3.components,
getters = _this$props3.getters,
slotMetrics = _this$props3.slotMetrics,
localizer = _this$props3.localizer;
var _this$state = this.state,
event = _this$state.event,
top = _this$state.top,
height = _this$state.height;
if (!event) return children;
var events = children.props.children;
var start = event.start,
end = event.end;
var label;
var format = 'eventTimeRangeFormat';
var startsBeforeDay = slotMetrics.startsBeforeDay(start);
var startsAfterDay = slotMetrics.startsAfterDay(end);
if (startsBeforeDay) format = 'eventTimeRangeEndFormat';else if (startsAfterDay) format = 'eventTimeRangeStartFormat';
if (startsBeforeDay && startsAfterDay) label = localizer.messages.allDay;else label = localizer.format({
start: start,
end: end
}, format);
return _react.default.cloneElement(children, {
children: _react.default.createElement(_react.default.Fragment, null, events, event && _react.default.createElement(_TimeGridEvent.default, {
event: event,
label: label,
className: "rbc-addons-dnd-drag-preview",
style: {
top: top,
height: height,
width: 100
},
getters: getters,
components: (0, _extends2.default)({}, components, {
eventWrapper: _NoopWrapper.default
}),
accessors: (0, _extends2.default)({}, accessors, _common.dragAccessors),
continuesEarlier: startsBeforeDay,
continuesLater: startsAfterDay
}))
});
};
return EventContainerWrapper;
}(_react.default.Component);
EventContainerWrapper.propTypes = {
accessors: _propTypes.default.object.isRequired,
components: _propTypes.default.object.isRequired,
getters: _propTypes.default.object.isRequired,
localizer: _propTypes.default.object.isRequired,
slotMetrics: _propTypes.default.object.isRequired,
resource: _propTypes.default.any
};
EventContainerWrapper.contextTypes = {
draggable: _propTypes.default.shape({
onStart: _propTypes.default.func,
onEnd: _propTypes.default.func,
onBeginAction: _propTypes.default.func,
dragAndDropAction: _propTypes.default.object
})
};
EventContainerWrapper.propTypes = propTypes;
var _default = EventContainerWrapper;
exports.default = _default;
module.exports = exports["default"];