react-weekly-schedule
Version:
 
1,750 lines (1,201 loc) • 49.6 kB
JavaScript
'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
var React = require('react');
var React__default = _interopDefault(React);
var useComponentSize = _interopDefault(require('@rehooks/component-size'));
var classcat = _interopDefault(require('classcat'));
var addDays = _interopDefault(require('date-fns/add_days'));
var addHours = _interopDefault(require('date-fns/add_hours'));
var format = _interopDefault(require('date-fns/format'));
var isDateEqual = _interopDefault(require('date-fns/is_equal'));
var startOfDay = _interopDefault(require('date-fns/start_of_day'));
var invariant = _interopDefault(require('invariant'));
var isEqual = _interopDefault(require('lodash/isEqual'));
var times = _interopDefault(require('lodash/times'));
var scrollIntoView = _interopDefault(require('scroll-into-view-if-needed'));
var en = _interopDefault(require('date-fns/locale/en'));
var rxjs = require('rxjs');
var operators = require('rxjs/operators');
var Mousetrap = _interopDefault(require('mousetrap'));
var clamp = _interopDefault(require('lodash/clamp'));
var floor = _interopDefault(require('lodash/floor'));
var round = _interopDefault(require('lodash/round'));
var addMinutes = _interopDefault(require('date-fns/add_minutes'));
var compareAsc = _interopDefault(require('date-fns/compare_asc'));
var endOfDay = _interopDefault(require('date-fns/end_of_day'));
var isBefore = _interopDefault(require('date-fns/is_before'));
var min = _interopDefault(require('date-fns/min'));
var range = _interopDefault(require('lodash/range'));
var differenceInDays = _interopDefault(require('date-fns/difference_in_days'));
var differenceInMinutes = _interopDefault(require('date-fns/difference_in_minutes'));
var setDay = _interopDefault(require('date-fns/set_day'));
var _mergeRanges = _interopDefault(require('merge-ranges'));
var getMinutes = _interopDefault(require('date-fns/get_minutes'));
var Resizable = _interopDefault(require('re-resizable'));
var Draggable = _interopDefault(require('react-draggable'));
var VisuallyHidden = _interopDefault(require('@reach/visually-hidden'));
var isSameDay = _interopDefault(require('date-fns/is_same_day'));
function _defineProperty(obj, key, value) {
if (key in obj) {
Object.defineProperty(obj, key, {
value: value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
return obj;
}
function _extends() {
_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;
};
return _extends.apply(this, arguments);
}
function ownKeys(object, enumerableOnly) {
var keys = Object.keys(object);
if (Object.getOwnPropertySymbols) {
var symbols = Object.getOwnPropertySymbols(object);
if (enumerableOnly) symbols = symbols.filter(function (sym) {
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
});
keys.push.apply(keys, symbols);
}
return keys;
}
function _objectSpread2(target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i] != null ? arguments[i] : {};
if (i % 2) {
ownKeys(Object(source), true).forEach(function (key) {
_defineProperty(target, key, source[key]);
});
} else if (Object.getOwnPropertyDescriptors) {
Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
} else {
ownKeys(Object(source)).forEach(function (key) {
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
});
}
}
return target;
}
function _objectWithoutPropertiesLoose(source, excluded) {
if (source == null) return {};
var target = {};
var sourceKeys = Object.keys(source);
var key, i;
for (i = 0; i < sourceKeys.length; i++) {
key = sourceKeys[i];
if (excluded.indexOf(key) >= 0) continue;
target[key] = source[key];
}
return target;
}
function _objectWithoutProperties(source, excluded) {
if (source == null) return {};
var target = _objectWithoutPropertiesLoose(source, excluded);
var key, i;
if (Object.getOwnPropertySymbols) {
var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
for (i = 0; i < sourceSymbolKeys.length; i++) {
key = sourceSymbolKeys[i];
if (excluded.indexOf(key) >= 0) continue;
if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
target[key] = source[key];
}
}
return target;
}
function _slicedToArray(arr, i) {
return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest();
}
function _toArray(arr) {
return _arrayWithHoles(arr) || _iterableToArray(arr) || _nonIterableRest();
}
function _toConsumableArray(arr) {
return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread();
}
function _arrayWithoutHoles(arr) {
if (Array.isArray(arr)) {
for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];
return arr2;
}
}
function _arrayWithHoles(arr) {
if (Array.isArray(arr)) return arr;
}
function _iterableToArray(iter) {
if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter);
}
function _iterableToArrayLimit(arr, i) {
if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) {
return;
}
var _arr = [];
var _n = true;
var _d = false;
var _e = undefined;
try {
for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
_arr.push(_s.value);
if (i && _arr.length === i) break;
}
} catch (err) {
_d = true;
_e = err;
} finally {
try {
if (!_n && _i["return"] != null) _i["return"]();
} finally {
if (_d) throw _e;
}
}
return _arr;
}
function _nonIterableSpread() {
throw new TypeError("Invalid attempt to spread non-iterable instance");
}
function _nonIterableRest() {
throw new TypeError("Invalid attempt to destructure non-iterable instance");
}
var DefaultEventRootComponent = /*#__PURE__*/React__default.forwardRef(
function DefaultEventRootComponent(_ref,
ref)
{var isActive = _ref.isActive,handleDelete = _ref.handleDelete,cellIndex = _ref.cellIndex,rangeIndex = _ref.rangeIndex,classes = _ref.classes,disabled = _ref.disabled,props = _objectWithoutProperties(_ref, ["isActive", "handleDelete", "cellIndex", "rangeIndex", "classes", "disabled"]);
return React__default.createElement("div", _extends({ ref: ref, "aria-disabled": disabled }, props));
});
var SchedulerContext = /*#__PURE__*/React.createContext({ locale: en });
var createPageMapCoordsToContainer = function createPageMapCoordsToContainer(container) {
return function (event) {
var clientX;
var clientY;
var pageX;
var pageY;
if ('changedTouches' in event) {var _event$changedTouches =
event.changedTouches[0];clientX = _event$changedTouches.clientX;clientY = _event$changedTouches.clientY;pageX = _event$changedTouches.pageX;pageY = _event$changedTouches.pageY;
} else {
clientX = event.clientX;clientY = event.clientY;pageX = event.pageX;pageY = event.pageY;
}var _container$getBoundin =
container.getBoundingClientRect(),top = _container$getBoundin.top,left = _container$getBoundin.left;
return {
clientX: clientX,
clientY: clientY,
pageX: pageX,
pageY: pageY,
top: top,
left: left,
x: clientX - left,
y: clientY - top };
};
};
var prevent = /*#__PURE__*/operators.tap(function (e) {
e.preventDefault();
e.stopPropagation();
});
function useClickAndDrag(
ref,
isDisabled)
{var _useState =
React.useState({
transform: 'translate(0, 0)',
width: 0,
height: 0 }),_useState2 = _slicedToArray(_useState, 2),style = _useState2[0],setStyle = _useState2[1];var _useState3 =
React.useState(null),_useState4 = _slicedToArray(_useState3, 2),box = _useState4[0],setBox = _useState4[1];var _useState5 =
React.useState(false),_useState6 = _slicedToArray(_useState5, 2),isDragging = _useState6[0],setIsDragging = _useState6[1];var _useState7 =
React.useState(false),_useState8 = _slicedToArray(_useState7, 2),hasFinishedDragging = _useState8[0],setHasFinishedDragging = _useState8[1];
var container = ref.current;
React.useEffect(function () {
if (!container || isDisabled) {
return;
}
var mapCoordsToContainer = createPageMapCoordsToContainer(container);
var touchMove$ = rxjs.fromEvent(window, 'touchmove', {
passive: false }).
pipe(prevent);
var touchEnd$ = rxjs.fromEvent(window, 'touchend', {
passive: true });
var touchStart$ = rxjs.fromEvent(container, 'touchstart', {
passive: false });
var touchStartWithDelay$ = touchStart$.pipe(
operators.mergeMap(function (start) {return (
rxjs.of(start).pipe(
operators.delay(300),
operators.takeUntil(touchMove$),
prevent));}));
var mouseDown$ = rxjs.fromEvent(container, 'mousedown', {
passive: true }).
pipe(operators.filter(function (event) {return event.which === 1;}));
var mouseMove$ = rxjs.fromEvent(window, 'mousemove', {
passive: true });
var mouseUp$ = rxjs.fromEvent(window, 'mouseup', {
passive: true });
var dragStart$ = rxjs.merge(mouseDown$, touchStartWithDelay$).pipe(
operators.map(mapCoordsToContainer));
var dragEnd$ = rxjs.merge(mouseUp$, touchEnd$).pipe(
operators.map(mapCoordsToContainer),
operators.tap(function () {
setIsDragging(false);
setHasFinishedDragging(true);
}));
var move$ = rxjs.merge(mouseMove$, touchMove$).pipe(operators.map(mapCoordsToContainer));
var box$ = dragStart$.pipe(
operators.tap(function () {
setIsDragging(true);
setHasFinishedDragging(false);
}),
operators.mergeMap(function (down) {
return move$.pipe(
operators.startWith(down),
operators.map(
function (move) {
var startX = Math.max(down.x, 0);
var startY = Math.max(down.y, 0);
var endX = Math.min(move.x, container.scrollWidth);
var endY = Math.min(move.y, container.scrollHeight);
var top = Math.min(startY, endY);
var bottom = Math.max(startY, endY);
var left = Math.min(startX, endX);
var right = Math.max(startX, endX);
return {
startX: startX,
startY: startY,
endX: endX,
endY: endY,
top: top,
bottom: bottom,
left: left,
right: right,
width: right - left,
height: bottom - top };
}),
operators.takeUntil(dragEnd$));
}),
operators.map(function (rect) {
return rect.width === 0 && rect.height === 0 ? null : rect;
}));
var style$ = box$.pipe(
operators.map(function (rect) {
if (rect !== null) {var
width = rect.width,height = rect.height,left = rect.left,top = rect.top;
return {
transform: "translate(".concat(left, "px, ").concat(top, "px)"),
width: width,
height: height };
}
return { display: 'none' };
}));
var boxSubscriber = box$.subscribe(setBox);
var styleSubscriber = style$.subscribe(setStyle);
return function () {
boxSubscriber.unsubscribe();
styleSubscriber.unsubscribe();
};
}, [container, isDisabled]);
var cancel = React.useCallback(function () {
setIsDragging(false);
setHasFinishedDragging(false);
setBox(null);
}, []);
return { style: style, box: box, isDragging: isDragging, cancel: cancel, hasFinishedDragging: hasFinishedDragging };
}
/**
* Use mousetrap hook
*
* @param handlerKey - A key, key combo or array of combos according to Mousetrap documentation.
* @param handlerCallback - A function that is triggered on key combo catch.
*/
function useMousetrap(
handlerKey,
handlerCallback,
elementOrElementRef)
{
var actionRef = React.useRef(null);
actionRef.current = handlerCallback;
var element =
'current' in elementOrElementRef ? elementOrElementRef.current : document;
React.useEffect(function () {
var instance = new Mousetrap(element);
instance.bind(handlerKey, function (e, combo) {
typeof actionRef.current === 'function' && actionRef.current(e, combo);
});
return function () {
instance.unbind(handlerKey);
};
}, [handlerKey, element]);
}
var getSpan = function getSpan(x1, x2) {return 1 + Math.abs(x2 - x1);};
var createGrid = function createGrid(_ref)
{var totalHeight = _ref.totalHeight,totalWidth = _ref.totalWidth,numVerticalCells = _ref.numVerticalCells,numHorizontalCells = _ref.numHorizontalCells;
var cellHeight = totalHeight / numVerticalCells;
var cellWidth = totalWidth / numHorizontalCells;
return {
totalHeight: totalHeight,
totalWidth: totalWidth,
numVerticalCells: numVerticalCells,
numHorizontalCells: numHorizontalCells,
cellWidth: cellWidth,
cellHeight: cellHeight,
getRectFromCell: function getRectFromCell(data) {var
endX = data.endX,startX = data.startX,endY = data.endY,startY = data.startY,spanX = data.spanX,spanY = data.spanY;
var bottom = endY * this.cellHeight;
var top = startY * this.cellHeight;
var left = startX * this.cellWidth;
var right = endX * this.cellWidth;
var height = spanY * this.cellHeight;
var width = spanX * this.cellWidth;
return {
bottom: bottom,
top: top,
left: left,
right: right,
height: height,
width: width,
// @TODO: check the math
startX: startX * this.cellWidth,
endX: endX * this.cellWidth,
startY: startY * this.cellHeight,
endY: endY * this.cellHeight };
},
getCellFromRect: function getCellFromRect(data) {
var startX = clamp(
floor(data.left / this.cellWidth),
0,
numHorizontalCells - 1);
var startY = clamp(
round(data.top / this.cellHeight),
0,
numVerticalCells - 1);
var endX = clamp(
floor(data.right / this.cellWidth),
0,
numHorizontalCells - 1);
var endY = clamp(
round(data.bottom / this.cellHeight),
0,
numVerticalCells - 1);
var spanX = clamp(getSpan(startX, endX), 1, numHorizontalCells);
var spanY = clamp(getSpan(startY, endY), 1, numVerticalCells);
return {
spanX: spanX,
spanY: spanY,
startX: startX,
startY: startY,
endX: endX,
endY: endY };
} };
};
var cellToDate = function cellToDate(_ref) {var
startX = _ref.startX,
startY = _ref.startY,
toMin = _ref.toMin,
originDate = _ref.originDate;return (
addMinutes(addDays(originDate, startX), toMin(startY)));};
var createMapCellInfoToRecurringTimeRange = function createMapCellInfoToRecurringTimeRange(_ref) {var
toMin = _ref.fromY,
toDay = _ref.fromX,
originDate = _ref.originDate;return (
function (_ref2) {var startX = _ref2.startX,startY = _ref2.startY,endX = _ref2.endX,spanY = _ref2.spanY;
var result = range(startX, endX + 1).
map(function (i) {
var startDate = cellToDate({
startX: i,
startY: startY,
toMin: toMin,
toDay: toDay,
originDate: originDate });
var endDate = min(
addMinutes(startDate, toMin(spanY)),
endOfDay(startDate));
var range = isBefore(startDate, endDate) ?
[startDate, endDate] :
[endDate, startDate];
return range;
}).
sort(function (range1, range2) {return compareAsc(range1[0], range2[0]);});
return result;
});};
var createMapDateRangeToCells = function createMapDateRangeToCells(_ref) {var _ref$toX = _ref.
toX,toX = _ref$toX === void 0 ? function (x) {return x;} : _ref$toX,
toY = _ref.toY,
numVerticalCells = _ref.numVerticalCells,
originDate = _ref.originDate;return (
function (_ref2) {var _ref3 = _slicedToArray(_ref2, 2),start = _ref3[0],end = _ref3[1];
var originOfThisDay = startOfDay(start);
var _startX = toX(differenceInDays(start, originDate));
var _startY = toY(differenceInMinutes(start, originOfThisDay));
var _endX = toX(differenceInDays(end, originDate));
var _endY = toY(differenceInMinutes(end, startOfDay(end))) - 1;
var cells = range(_startX, _endX + 1).map(function (i) {
var startX = i;
var endX = i;
var atStart = i === _startX;
var atEnd = i === _endX;
var startY = !atStart ? 0 : _startY;
var endY = !atEnd ? numVerticalCells - 1 : _endY;
var spanX = getSpan(startX, endX);
var spanY = getSpan(startY, endY);
return {
startX: startX,
startY: startY,
endX: endX,
endY: endY,
spanX: spanX,
spanY: spanY };
});
if (isDateEqual(end, startOfDay(end))) {
cells.pop();
}
return cells;
});};
function getEarliestTimeRange(
ranges)
{
return _toConsumableArray(ranges).sort(function (_ref, _ref2) {var _ref3 = _slicedToArray(_ref, 1),startA = _ref3[0];var _ref4 = _slicedToArray(_ref2, 1),startB = _ref4[0];return (
compareAsc(setDay(startA, 0), setDay(startB, 0)));})[
0];
}
function mergeRanges(event) {
return _mergeRanges(
_toConsumableArray(event).map(function (d) {return d.map(function (c) {return new Date(c);});}));
}
function mergeEvents(
event1,
event2)
{
if (event2 === null) {
return event1;
}
return mergeRanges([].concat(_toConsumableArray(event1), _toConsumableArray(event2))).sort(function (range1, range2) {return (
compareAsc(range1[0], range2[0]));});
}
var Cell = /*#__PURE__*/React__default.memo(function Cell(_ref)
{var timeIndex = _ref.timeIndex,children = _ref.children,classes = _ref.classes,getDateRangeForVisualGrid = _ref.getDateRangeForVisualGrid,onClick = _ref.onClick;var _getDateRangeForVisua =
getDateRangeForVisualGrid({
startX: 0,
startY: timeIndex,
endX: 0,
endY: timeIndex + 1,
spanX: 1,
spanY: 1 }),_getDateRangeForVisua2 = _slicedToArray(_getDateRangeForVisua, 1),_getDateRangeForVisua3 = _slicedToArray(_getDateRangeForVisua2[0], 1),start = _getDateRangeForVisua3[0];
var isHourStart = getMinutes(start) === 0;
return (
React__default.createElement("div", {
role: "button",
onClick: onClick,
className: classcat([
classes.cell, _defineProperty({},
classes['is-hour-start'], isHourStart)]) },
children && children({ start: start, isHourStart: isHourStart })));
});
var formatTemplate = 'ddd h:mma';
var dropSame = function dropSame(
dates,
template)
{var takeSecond = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;var locale = arguments.length > 3 ? arguments[3] : undefined;var _dates$map =
dates.map(function (date) {return format(date, template, { locale: locale });}),_dates$map2 = _slicedToArray(_dates$map, 2),first = _dates$map2[0],second = _dates$map2[1];
if (first !== second) {
return [first, second];
}
if (takeSecond) {
return ['', second];
}
return [first, ''];
};
var formatHour = function formatHour(
date,
locale)
{
if (getMinutes(date) === 0) {
return format(date, 'h', { locale: locale });
}
return format(date, 'h:mm', { locale: locale });
};
var getFormattedComponentsForDateRange = function getFormattedComponentsForDateRange(_ref)
{var dateRange = _ref.dateRange,locale = _ref.locale,template = _ref.template,template2 = _ref.template2,_ref$includeDayIfSame = _ref.includeDayIfSame,includeDayIfSame = _ref$includeDayIfSame === void 0 ? true : _ref$includeDayIfSame;
var start = dateRange[0];
var end = dateRange[dateRange.length - 1];
if (isSameDay(start, end) && !template) {var _dropSame =
dropSame(dateRange, 'a', true, locale),_dropSame2 = _slicedToArray(_dropSame, 2),firstM = _dropSame2[0],secondM = _dropSame2[1];
var day = includeDayIfSame ? "".concat(format(start, 'ddd', { locale: locale }), " ") : '';
return ["".concat(
day).concat(formatHour(start, {
locale: locale })).concat(
firstM), "".concat(
formatHour(end, { locale: locale })).concat(secondM)];
}
var startDateStr = format(start, template || formatTemplate, { locale: locale });
var endDateStr = format(end, template2 || formatTemplate, { locale: locale });
return [startDateStr, endDateStr];
};
var getTextForDateRange = function getTextForDateRange(options) {
return getFormattedComponentsForDateRange(options).join(' – ');
};
var EventContent = /*#__PURE__*/React__default.memo(function EventContent(_ref)
{var width = _ref.width,height = _ref.height,classes = _ref.classes,dateRange = _ref.dateRange,isStart = _ref.isStart,isEnd = _ref.isEnd;var _useContext =
React.useContext(SchedulerContext),locale = _useContext.locale;var _getFormattedComponen =
getFormattedComponentsForDateRange({
dateRange: dateRange,
locale: locale,
includeDayIfSame: false }),_getFormattedComponen2 = _slicedToArray(_getFormattedComponen, 2),start = _getFormattedComponen2[0],end = _getFormattedComponen2[1];
return (
React__default.createElement("div", {
style: { width: width - 20, height: height },
className: classes['event-content'] },
React__default.createElement(VisuallyHidden, null,
getTextForDateRange({ dateRange: dateRange, locale: locale })),
React__default.createElement("span", { "aria-hidden": true, className: classes.start },
isStart && start),
React__default.createElement("span", { "aria-hidden": true, className: classes.end },
isEnd && end)));
});
var RangeBox = /*#__PURE__*/React__default.memo(function RangeBox(_ref2)
{var _ref4;var classes = _ref2.classes,grid = _ref2.grid,rangeIndex = _ref2.rangeIndex,cellIndex = _ref2.cellIndex,cellArray = _ref2.cellArray,cell = _ref2.cell,className = _ref2.className,onChange = _ref2.onChange,cellInfoToDateRange = _ref2.cellInfoToDateRange,isResizable = _ref2.isResizable,moveAxis = _ref2.moveAxis,onActiveChange = _ref2.onActiveChange,onClick = _ref2.onClick,getIsActive = _ref2.getIsActive,_ref2$eventContentCom = _ref2.eventContentComponent,EventContentComponent = _ref2$eventContentCom === void 0 ? EventContent : _ref2$eventContentCom,_ref2$eventRootCompon = _ref2.eventRootComponent,EventRootComponent = _ref2$eventRootCompon === void 0 ? DefaultEventRootComponent : _ref2$eventRootCompon,disabled = _ref2.disabled;
var ref = React.useRef(null);var _useState =
React.useState(cell),_useState2 = _slicedToArray(_useState, 2),modifiedCell = _useState2[0],setModifiedCell = _useState2[1];
var originalRect = React.useMemo(function () {return grid.getRectFromCell(cell);}, [cell, grid]);
var rect = React.useMemo(function () {return grid.getRectFromCell(modifiedCell);}, [
modifiedCell,
grid]);
React.useEffect(function () {
setModifiedCell(cell);
}, [cell]);
var modifiedDateRange = React.useMemo(function () {return cellInfoToDateRange(modifiedCell);}, [
cellInfoToDateRange,
modifiedCell]);var
top = rect.top,left = rect.left,width = rect.width,height = rect.height;
var isStart = cellIndex === 0;
var isEnd = cellIndex === cellArray.length - 1;
var handleStop = React.useCallback(function () {
if (!onChange || disabled) {
return;
}
onChange(cellInfoToDateRange(modifiedCell), rangeIndex);
}, [modifiedCell, rangeIndex, disabled, cellInfoToDateRange, onChange]);
var isActive = React.useMemo(function () {return getIsActive({ cellIndex: cellIndex, rangeIndex: rangeIndex });}, [
cellIndex,
rangeIndex,
getIsActive]);
useMousetrap(
'up',
function () {
if (!onChange || disabled || !isActive) {
return;
}
if (moveAxis === 'none' || moveAxis === 'x') {
return;
}
if (modifiedCell.startY === 0) {
return;
}
var newCell = _objectSpread2({},
modifiedCell, {
startY: modifiedCell.startY - 1,
endY: modifiedCell.endY - 1 });
onChange(cellInfoToDateRange(newCell), rangeIndex);
},
ref);
useMousetrap(
'shift+up',
function () {
if (!onChange || !isResizable || disabled || !isActive) {
return;
}
if (
modifiedCell.endY === modifiedCell.startY ||
modifiedCell.spanY === 0)
{
return;
}
var newCell = _objectSpread2({},
modifiedCell, {
endY: modifiedCell.endY - 1,
spanY: modifiedCell.spanY - 1 });
onChange(cellInfoToDateRange(newCell), rangeIndex);
},
ref);
useMousetrap(
'down',
function () {
if (!onChange || disabled || !isActive) {
return;
}
if (moveAxis === 'none' || moveAxis === 'x') {
return;
}
if (Math.round(modifiedCell.endY) >= grid.numVerticalCells - 1) {
return;
}
var newCell = _objectSpread2({},
modifiedCell, {
startY: modifiedCell.startY + 1,
endY: modifiedCell.endY + 1 });
onChange(cellInfoToDateRange(newCell), rangeIndex);
},
ref);
useMousetrap(
'shift+down',
function () {
if (!onChange || !isResizable || disabled || !isActive) {
return;
}
if (moveAxis === 'none' || moveAxis === 'x') {
return;
}
if (Math.round(modifiedCell.endY) >= grid.numVerticalCells - 1) {
return;
}
var newCell = _objectSpread2({},
modifiedCell, {
spanY: modifiedCell.spanY + 1,
endY: modifiedCell.endY + 1 });
onChange(cellInfoToDateRange(newCell), rangeIndex);
},
ref);
var handleDrag = React.useCallback(
function (event, _ref3) {var y = _ref3.y,x = _ref3.x;
if (moveAxis === 'none' || disabled) {
return;
}
event.preventDefault();
event.stopPropagation();
var newRect = _objectSpread2({},
rect);
if (moveAxis === 'both' || moveAxis === 'y') {
var startOrEnd1 = y;
var startOrEnd2 = startOrEnd1 + rect.height;
var newTop = Math.min(startOrEnd1, startOrEnd2);
var newBottom = newTop + rect.height;
newRect.bottom = newBottom;
newRect.top = newTop;
}
if (moveAxis === 'both' || moveAxis === 'x') {
var _startOrEnd = x;
var _startOrEnd2 = _startOrEnd + rect.width;
var newLeft = Math.min(_startOrEnd, _startOrEnd2);
var newRight = newLeft + rect.width;
newRect.right = newRight;
newRect.left = newLeft;
}var _grid$getCellFromRect =
grid.getCellFromRect(newRect),startY = _grid$getCellFromRect.startY,startX = _grid$getCellFromRect.startX;
var newCell = _objectSpread2({},
cell, {
startX: moveAxis === 'y' ? cell.startX : startX,
endX: moveAxis === 'x' ? startX + cell.spanX - 1 : cell.endX,
startY: moveAxis === 'x' ? cell.startY : startY,
endY: moveAxis === 'y' ? startY + cell.spanY - 1 : cell.endY });
invariant(
newCell.spanY === cell.spanY && newCell.spanX === cell.spanX, "Expected the dragged time cell to have the same dimensions");
setModifiedCell(newCell);
},
[grid, rect, moveAxis, disabled, cell, setModifiedCell]);
var handleResize = React.useCallback(
function (event, direction, _ref, delta) {
if (!isResizable || disabled) {
return;
}
event.preventDefault();
event.stopPropagation();
if (delta.height === 0) {
return;
}
var newSize = {
height: delta.height + rect.height,
width: delta.width + rect.width + 20 };
var newRect = _objectSpread2({},
originalRect, {},
newSize);
if (direction.includes('top')) {
newRect.top -= delta.height;
} else if (direction.includes('bottom')) {
newRect.bottom += delta.height;
}var _grid$getCellFromRect2 =
grid.getCellFromRect(newRect),spanY = _grid$getCellFromRect2.spanY,startY = _grid$getCellFromRect2.startY,endY = _grid$getCellFromRect2.endY;
var newCell = _objectSpread2({},
cell, {
spanY: spanY,
startY: startY,
endY: endY });
setModifiedCell(newCell);
},
[grid, rect, disabled, isResizable, setModifiedCell, cell, originalRect]);
var handleDelete = React.useCallback(function () {
if (!onChange || disabled) {
return;
}
onChange(undefined, rangeIndex);
}, [onChange, disabled, rangeIndex]);
var handleOnFocus = React.useCallback(function () {
if (!onActiveChange || disabled) {
return;
}
onActiveChange([rangeIndex, cellIndex]);
}, [onActiveChange, disabled, rangeIndex, cellIndex]);
var handleOnClick = React.useCallback(function () {
if (!onClick || disabled || !isActive) {
return;
}
onClick([rangeIndex, cellIndex]);
}, [onClick, rangeIndex, disabled, isActive, cellIndex]);
useMousetrap('enter', handleOnClick, ref);
var cancelClasses = React.useMemo(
function () {return (
classes.handle ?
classes.handle.
split(' ').
map(function (className) {return ".".concat(className);}).
join(', ') :
undefined);},
[classes.handle]);
return (
React__default.createElement(Draggable, {
axis: moveAxis,
bounds: {
top: 0,
bottom: grid.totalHeight - height,
left: 0,
right: grid.totalWidth },
position: { x: left, y: top },
onDrag: handleDrag,
onStop: handleStop,
cancel: cancelClasses,
disabled: disabled },
React__default.createElement(EventRootComponent, {
role: "button",
disabled: disabled,
onFocus: handleOnFocus,
onClick: handleOnClick,
handleDelete: handleDelete,
cellIndex: cellIndex,
rangeIndex: rangeIndex,
isActive: isActive,
classes: classes,
className: classcat([
classes.event,
classes['range-boxes'],
className, (_ref4 = {}, _defineProperty(_ref4,
classes['is-draggable'], !disabled && moveAxis !== 'none'), _defineProperty(_ref4,
classes['is-disabled'], disabled), _ref4)]),
ref: ref,
style: { width: width - 20, height: height } },
React__default.createElement(Resizable, {
size: _objectSpread2({}, originalRect, { width: originalRect.width - 20 }),
key: "".concat(rangeIndex, ".").concat(cellIndex, ".").concat(cellArray.length, ".").concat(
originalRect.top, ".").concat(
originalRect.left),
onResize: handleResize,
onResizeStop: handleStop,
handleWrapperClass: classes['handle-wrapper'],
enable:
isResizable && !disabled ?
{
top: true,
bottom: true } :
{},
handleClasses: {
bottom: classcat([classes.handle, classes.bottom]),
bottomLeft: classes.handle,
bottomRight: classes.handle,
left: classes.handle,
right: classes.handle,
top: classcat([classes.handle, classes.top]),
topLeft: classes.handle,
topRight: classes.handle } },
React__default.createElement(EventContentComponent, {
width: width,
height: height,
classes: classes,
dateRange: modifiedDateRange,
isStart: isStart,
isEnd: isEnd })))));
});
var Schedule = /*#__PURE__*/React__default.memo(function Schedule(_ref)
{var classes = _ref.classes,ranges = _ref.ranges,grid = _ref.grid,className = _ref.className,onChange = _ref.onChange,isResizable = _ref.isResizable,isDeletable = _ref.isDeletable,moveAxis = _ref.moveAxis,cellInfoToDateRange = _ref.cellInfoToDateRange,dateRangeToCells = _ref.dateRangeToCells,onActiveChange = _ref.onActiveChange,eventContentComponent = _ref.eventContentComponent,eventRootComponent = _ref.eventRootComponent,onClick = _ref.onClick,getIsActive = _ref.getIsActive,disabled = _ref.disabled;
return (
React__default.createElement("div", { className: classes['range-boxes'] },
ranges.map(function (dateRange, rangeIndex) {
return (
React__default.createElement("span", { key: rangeIndex },
dateRangeToCells(dateRange).map(function (cell, cellIndex, cellArray) {
return (
React__default.createElement(RangeBox, {
classes: classes,
onActiveChange: onActiveChange,
key: "".concat(rangeIndex, ".").concat(ranges.length, ".").concat(cellIndex, ".").concat(
cellArray.length),
isResizable: isResizable,
moveAxis: moveAxis,
isDeletable: isDeletable,
cellInfoToDateRange: cellInfoToDateRange,
cellArray: cellArray,
cellIndex: cellIndex,
rangeIndex: rangeIndex,
className: className,
onChange: onChange,
onClick: onClick,
grid: grid,
cell: cell,
getIsActive: getIsActive,
eventContentComponent: eventContentComponent,
eventRootComponent: eventRootComponent,
disabled: disabled }));
})));
})));
});
var MINS_IN_DAY = 24 * 60;
var horizontalPrecision = 1;
var toDay = function toDay(x) {return x * horizontalPrecision;};
var toX = function toX(days) {return days / horizontalPrecision;};
var DELETE_KEYS = ['del', 'backspace'];
var TimeGridScheduler = /*#__PURE__*/React__default.memo(function TimeGridScheduler(_ref)
{var _ref$verticalPrecisio = _ref.verticalPrecision,verticalPrecision = _ref$verticalPrecisio === void 0 ? 30 : _ref$verticalPrecisio,_ref$visualGridVertic = _ref.visualGridVerticalPrecision,visualGridVerticalPrecision = _ref$visualGridVertic === void 0 ? 30 : _ref$visualGridVertic,_ref$cellClickPrecisi = _ref.cellClickPrecision,cellClickPrecision = _ref$cellClickPrecisi === void 0 ? visualGridVerticalPrecision : _ref$cellClickPrecisi,style = _ref.style,schedule = _ref.schedule,_ref$originDate = _ref.originDate,_originDate = _ref$originDate === void 0 ? new Date() : _ref$originDate,_ref$defaultHours = _ref.defaultHours,defaultHours = _ref$defaultHours === void 0 ? [9, 15] : _ref$defaultHours,classes = _ref.classes,className = _ref.className,onChange = _ref.onChange,onEventClick = _ref.onEventClick,eventContentComponent = _ref.eventContentComponent,eventRootComponent = _ref.eventRootComponent,disabled = _ref.disabled;var _useContext =
React.useContext(SchedulerContext),locale = _useContext.locale;
var originDate = React.useMemo(function () {return startOfDay(_originDate);}, [_originDate]);
var numVerticalCells = MINS_IN_DAY / verticalPrecision;
var numHorizontalCells = 7 / horizontalPrecision;
var toMin = React.useCallback(function (y) {return y * verticalPrecision;}, [
verticalPrecision]);
var toY = React.useCallback(function (mins) {return mins / verticalPrecision;}, [
verticalPrecision]);
var cellInfoToDateRanges = React.useMemo(function () {
return createMapCellInfoToRecurringTimeRange({
originDate: originDate,
fromY: toMin,
fromX: toDay });
}, [toMin, originDate]);
var cellInfoToSingleDateRange = React.useCallback(
function (cell) {var _cellInfoToDateRanges =
cellInfoToDateRanges(cell),_cellInfoToDateRanges2 = _toArray(_cellInfoToDateRanges),first = _cellInfoToDateRanges2[0],rest = _cellInfoToDateRanges2.slice(1);
invariant(
rest.length === 0, "Expected \"cellInfoToSingleDateRange\" to return a single date range, found ".concat(
rest.length, " additional ranges instead. This is a bug in @remotelock/react-week-scheduler"));
return first;
},
[cellInfoToDateRanges]);
var dateRangeToCells = React.useMemo(function () {
return createMapDateRangeToCells({
originDate: originDate,
numVerticalCells: numVerticalCells,
numHorizontalCells: numHorizontalCells,
toX: toX,
toY: toY });
}, [toY, numVerticalCells, numHorizontalCells, originDate]);
var root = React.useRef(null);
var parent = React.useRef(null);
var size = useComponentSize(parent);var _useClickAndDrag =
useClickAndDrag(parent, disabled),dragBoxStyle = _useClickAndDrag.style,box = _useClickAndDrag.box,isDragging = _useClickAndDrag.isDragging,hasFinishedDragging = _useClickAndDrag.hasFinishedDragging,cancel = _useClickAndDrag.cancel;var _useState =
React.useState(null),_useState2 = _slicedToArray(_useState, 2),pendingCreation = _useState2[0],setPendingCreation = _useState2[1];var _useState3 =
React.useState([0, 0]),_useState4 = _slicedToArray(_useState3, 2),_useState4$ = _slicedToArray(_useState4[0], 2),totalHeight = _useState4$[0],totalWidth = _useState4$[1],setDimensions = _useState4[1];
var numVisualVerticalCells = 24 * 60 / visualGridVerticalPrecision;
React.useEffect(
function updateGridDimensionsOnSizeOrCellCountChange() {
if (!parent.current) {
setDimensions([0, 0]);
return;
}
setDimensions([parent.current.scrollHeight, parent.current.scrollWidth]);
},
[size, numVisualVerticalCells]);
var grid = React.useMemo(function () {
if (totalHeight === null || totalWidth === null) {
return null;
}
return createGrid({
totalHeight: totalHeight,
totalWidth: totalWidth,
numHorizontalCells: numHorizontalCells,
numVerticalCells: numVerticalCells });
}, [totalHeight, totalWidth, numHorizontalCells, numVerticalCells]);
React.useEffect(
function updatePendingCreationOnDragBoxUpdate() {
if (grid === null || box === null) {
setPendingCreation(null);
return;
}
var cell = grid.getCellFromRect(box);
var dateRanges = cellInfoToDateRanges(cell);
var event = dateRanges;
setPendingCreation(event);
},
[box, grid, cellInfoToDateRanges, toY]);var _useState5 =
React.useState(
[null, null]),_useState6 = _slicedToArray(_useState5, 2),_useState6$ = _slicedToArray(_useState6[0], 2),activeRangeIndex = _useState6$[0],activeCellIndex = _useState6$[1],setActive = _useState6[1];
React.useEffect(
function updateScheduleAfterDraggingFinished() {
if (disabled) {
return;
}
if (hasFinishedDragging) {
onChange(mergeEvents(schedule, pendingCreation));
setPendingCreation(null);
}
},
[
hasFinishedDragging,
disabled,
onChange,
setPendingCreation,
pendingCreation,
schedule]);
React.useEffect(
function clearActiveBlockAfterCreation() {
if (pendingCreation === null) {
setActive([null, null]);
}
},
[pendingCreation]);
var handleEventChange = React.useCallback(
function (newDateRange, rangeIndex) {
if (disabled) {
return;
}
if (!schedule && newDateRange) {
onChange([newDateRange]);
return;
}
var newSchedule = _toConsumableArray(schedule);
if (!newDateRange) {
newSchedule.splice(rangeIndex, 1);
} else {
if (
isDateEqual(newDateRange[0], newSchedule[rangeIndex][0]) &&
isDateEqual(newDateRange[1], newSchedule[rangeIndex][1]))
{
return;
}
newSchedule[rangeIndex] = newDateRange;
}
newSchedule = mergeRanges(newSchedule);
onChange(newSchedule);
},
[schedule, onChange, disabled]);
useMousetrap(
'esc',
function cancelOnEsc() {
if (pendingCreation) {
cancel();
}
},
document);
var getIsActive = React.useCallback(
function (_ref2) {var rangeIndex = _ref2.rangeIndex,cellIndex = _ref2.cellIndex;
return rangeIndex === activeRangeIndex && cellIndex === activeCellIndex;
},
[activeCellIndex, activeRangeIndex]);
var handleDelete = React.useCallback(
function (e) {
if (activeRangeIndex === null || disabled) {
return;
}
e.preventDefault();
e.stopPropagation();
handleEventChange(undefined, activeRangeIndex);
},
[activeRangeIndex, disabled, handleEventChange]);
useMousetrap(DELETE_KEYS, handleDelete, root);
React.useEffect(
function cancelPendingCreationOnSizeChange() {
cancel();
},
[size, cancel]);
var getDateRangeForVisualGrid = React.useMemo(function () {
return createMapCellInfoToRecurringTimeRange({
originDate: originDate,
fromX: toDay,
fromY: function fromY(y) {return y * visualGridVerticalPrecision;} });
}, [visualGridVerticalPrecision, originDate]);
React.useEffect(
function scrollToActiveTimeBlock() {
if (!document.activeElement) {
return;
}
if (!root.current || !root.current.contains(document.activeElement)) {
return;
}
scrollIntoView(document.activeElement, {
scrollMode: 'if-needed',
block: 'nearest',
inline: 'nearest' });
},
[schedule]);var _useState7 =
React.useState(
false),_useState8 = _slicedToArray(_useState7, 2),wasInitialScrollPerformed = _useState8[0],setWasInitialScrollPerformed = _useState8[1];
React.useEffect(
function performInitialScroll() {
if (wasInitialScrollPerformed || !root.current || !grid) {
return;
}
var range = dateRangeToCells(
getEarliestTimeRange(schedule) || [
addHours(originDate, defaultHours[0]),
addHours(originDate, defaultHours[1])]);
var rect = grid.getRectFromCell(range[0]);var
top = rect.top,bottom = rect.bottom;
if (top === 0 && bottom === 0) {
return;
}
// IE, Edge do not support it
if (!('scrollBy' in root.current)) {
return;
}
root.current.scrollBy(0, top);
setWasInitialScrollPerformed(true);
},
[
wasInitialScrollPerformed,
grid,
schedule,
defaultHours,
originDate,
dateRangeToCells]);
var handleBlur = React.useCallback(
function (event) {
if (!event.target.contains(document.activeElement)) {
setActive([null, null]);
}
},
[setActive]);
var handleCellClick = React.useCallback(
function (dayIndex, timeIndex) {return function (event) {
if (!grid || disabled) {
return;
}
var spanY = toY(cellClickPrecision);
var cell = {
startX: dayIndex,
startY: timeIndex,
endX: dayIndex,
endY: spanY + timeIndex,
spanY: spanY,
spanX: getSpan(dayIndex, dayIndex) };
var dateRanges = cellInfoToDateRanges(cell);
setPendingCreation(dateRanges);
event.stopPropagation();
event.preventDefault();
};},
[grid, disabled, toY, cellClickPrecision, cellInfoToDateRanges]);
return (
React__default.createElement("div", {
ref: root,
style: style,
onBlur: handleBlur,
"touch-action": isDragging ? 'none' : undefined,
className: classcat([
classes.root,
classes.theme,
className, _defineProperty({},
classes['no-scroll'], isDragging)]) },
React__default.createElement("div", { className: classes['grid-root'] },
React__default.createElement("div", {
"aria-hidden": true,
className: classcat([classes.timeline, classes['sticky-left']]) },
React__default.createElement("div", { className: classes.header },
React__default.createElement("div", { className: classes['day-column'] },
React__default.createElement("div", { className: classcat([classes.cell, classes.title]) }, "T"))),
React__default.createElement("div", { className: classes.calendar },
React__default.createElement("div", { className: classes['day-column'] },
React__default.createElement("div", { className: classes['day-hours'] },
times(numVisualVerticalCells).map(function (timeIndex) {
return (
React__default.createElement(Cell, {
classes: classes,
getDateRangeForVisualGrid: getDateRangeForVisualGrid,
key: timeIndex,
timeIndex: timeIndex },
function (_ref4) {var start = _ref4.start,isHourStart = _ref4.isHourStart;
if (isHourStart) {
return (
React__default.createElement("div", { className: classes.time },
format(start, 'h a', { locale: locale })));
}
return null;
}));
}))))),
React__default.createElement("div", {
className: classcat([
classes['sticky-top'],
classes['day-header-row']]) },
React__default.createElement("div", {
role: "presentation",
className: classcat([classes.calendar, classes.header]) },
times(7).map(function (i) {return (
React__default.createElement("div", {
key: i,
role: "presentation",
className: classes['day-column'] },
React__default.createElement("div", { className: classcat([classes.cell, classes.title]) },
format(addDays(originDate, i), 'ddd', { locale: locale }))));}))),
React__default.createElement("div", { className: classes['layer-container'] },
isDragging &&
React__default.createElement("div", { className: classes['drag-box'], style: dragBoxStyle },
hasFinishedDragging && React__default.createElement("div", { className: classes.popup })),
grid && pendingCreation && isDragging &&
React__default.createElement(Schedule, {
classes: classes,
dateRangeToCells: dateRangeToCells,
cellInfoToDateRange: cellInfoToSingleDateRange,
className: classes['is-pending-creation'],
ranges: mergeEvents(schedule, pendingCreation),
grid: grid,
moveAxis: "none",
eventContentComponent: eventContentComponent,
getIsActive: getIsActive }),
grid && !pendingCreation &&
React__default.createElement(Schedule, {
classes: classes,
onActiveChange: setActive,
dateRangeToCells: dateRangeToCells,
cellInfoToDateRange: cellInfoToSingleDateRange,
isResizable: true,
moveAxis: "y",
isDeletable: true,
onChange: handleEventChange,
onClick: onEventClick,
ranges: schedule,
grid: grid,
eventContentComponent: eventContentComponent,
eventRootComponent: eventRootComponent,
getIsActive: getIsActive,
disabled: disabled }),
React__default.createElement("div", { ref: parent, role: "grid", className: classes.calendar },
times(7).map(function (dayIndex) {
return (
React__default.createElement("div", {
role: "gridcell",
key: dayIndex,
className: classes['day-column'] },
React__default.createElement("div", { className: classes['day-hours'] },
times(numVisualVerticalCells).map(function (timeIndex) {
return (
React__default.createElement(Cell, {
classes: classes,
onClick: handleCellClick(
dayIndex,
timeIndex * (
numVerticalCells / numVisualVerticalCells)),
getDateRangeForVisualGrid: getDateRangeForVisualGrid,
key: timeIndex,
timeIndex: timeIndex }));
}))));
}))))));
}, isEqual);
var styles_module = {"no-scroll":"styles-module_no-scroll__3IUv5","theme":"styles-module_theme__1FIRA","root":"styles-module_root__2iNXQ","grid-root":"styles-module_grid-root__2ktzS","debug":"styles-module_debug__2eCNx","debug-active":"styles-module_debug-active__QqNIZ","calendar":"styles-module_calendar__tGgRK","react-draggable":"styles-module_react-draggable__3LVqd","handle-wrapper":"styles-module_handle-wrapper__26Eew","handle":"styles-module_handle__LTyBN","top":"styles-module_top__3D7og","bottom":"styles-module_bottom__daw_j","layer-container":"styles-module_layer-container__1wxVL","event":"styles-module_event__1PixZ","drag-box":"styles-module_drag-box__3w784","draggable":"styles-module_draggable__1Z1sE","button-reset":"styles-module_button-reset__1EwGq","is-draggable":"styles-module_is-draggable__176XM","is-pending-creation":"styles-module_is-pending-creation__3Qr4x","is-disabled":"styles-module_is-disabled__2JPDR","hours-container":"styles-module_hours-container__2srEU","day-column":"styles-module_day-column__30McI","day-hours":"styles-module_day-hours__1E9lT","cell":"styles-module_cell__sVJZY","time":"styles-module_time__LJQW4","title":"styles-module_title__2VBFp","is-hour-start":"styles-module_is-hour-start__1_0Zo","header":"styles-module_header__10uIZ","day-header-row":"styles-module_day-header-row__27lss","sticky-top":"styles-module_sticky-top__2dSgb","sticky-left":"styles-module_sticky-left__3tNLK","first":"styles-module_first__IeNvS","popup":"styles-module_popup__2iu0Y","range-boxes":"styles-module_range-boxes__ib1Nb","event-content":"styles-module_event-content__3sakH","start":"styles-module_start__3CzHL","end":"styles-module_end__2L7Oy","timeline":"styles-module_timeline__1hCLT"};
exports.DefaultEventRootComponent = DefaultEventRootComponent;
exports.SchedulerContext = SchedulerContext;
exports.TimeGridScheduler = TimeGridScheduler;
exports.classes = styles_module;
exports.getFormattedTimeRangeComponents = getFormattedComponentsForDateRange;
exports.getTextForDateRange = getTextForDateRange;
exports.useMousetrap = useMousetrap;
//# sourceMappingURL=index.js.map