@josmangarsal/pragmatic-scheduler
Version:
React resource scheduler
173 lines (172 loc) • 9.48 kB
JavaScript
;
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __read = (this && this.__read) || function (o, n) {
var m = typeof Symbol === "function" && o[Symbol.iterator];
if (!m) return o;
var i = m.call(o), r, ar = [], e;
try {
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
}
catch (error) { e = { error: error }; }
finally {
try {
if (r && !r.done && (m = i["return"])) m.call(i);
}
finally { if (e) throw e.error; }
}
return ar;
};
var __values = (this && this.__values) || function(o) {
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
if (m) return m.call(o);
if (o && typeof o.length === "number") return {
next: function () {
if (o && i >= o.length) o = void 0;
return { value: o && o[i++], done: !o };
}
};
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Scheduler = exports.SchedulerContext = void 0;
var jsx_runtime_1 = require("@emotion/react/jsx-runtime");
var react_1 = __importStar(require("react"));
require("react-grid-layout/css/styles.css");
require("react-resizable/css/styles.css");
var material_1 = require("@mui/material");
var date_fns_1 = require("date-fns");
var defaults_1 = require("../constants/defaults");
var useDateToDivisions_1 = require("../hooks/useDateToDivisions");
var TimelineView_1 = require("../views/TimelineView");
var noop_1 = __importDefault(require("lodash/noop"));
exports.SchedulerContext = react_1.default.createContext({
activeDate: new Date(),
days: [],
resources: [],
events: [],
config: defaults_1.defaultConfig,
calendarBounds: { start: new Date(), end: new Date(), range: 0, totalDivisions: 0 },
resizingEvent: null,
setResizingEvent: noop_1.default,
});
var Container = (0, material_1.styled)(material_1.Box)(function () { return ({
display: 'flex',
flexDirection: 'column',
}); });
var Scheduler = function (_a) {
var activeDate = _a.activeDate, _b = _a.divisionDetails, divisionDetails = _b === void 0 ? defaults_1.defaultDivisionDetails : _b, resources = _a.resources, events = _a.events, _c = _a.config, config = _c === void 0 ? defaults_1.defaultConfig : _c, onEventChange = _a.onEventChange, HeaderRow = _a.HeaderRow, ResourceCell = _a.ResourceCell, ResourceHeader = _a.ResourceHeader, UnassignedHeader = _a.UnassignedHeader, UnAssignedBoxProps = _a.UnAssignedBoxProps, GridCell = _a.GridCell, EventTile = _a.EventTile, extendFrom = _a.extendFrom, extendTo = _a.extendTo, extendWithScroll = _a.extendWithScroll, changeDates = _a.changeDates, ExtendLeftIconButton = _a.ExtendLeftIconButton, ExtendRightIconButton = _a.ExtendRightIconButton, ScrollLeftIconButton = _a.ScrollLeftIconButton, ScrollRightIconButton = _a.ScrollRightIconButton, firstDayProp = _a.firstDay, lastDayProp = _a.lastDay, _d = _a.goNow, goNow = _d === void 0 ? false : _d, _e = _a.lockNow, lockNow = _e === void 0 ? false : _e, GoNowIconButton = _a.GoNowIconButton, LockNowIconButton = _a.LockNowIconButton, _f = _a.dndCreatingEvent, dndCreatingEvent = _f === void 0 ? false : _f;
var dateToDivisions = (0, useDateToDivisions_1.useDateToDivisions)().dateToDivisions;
var _g = __read(react_1.default.useState(null), 2), resizingEvent = _g[0], setResizingEvent = _g[1];
var firstDay = (0, react_1.useMemo)(function () { var _a; return firstDayProp !== null && firstDayProp !== void 0 ? firstDayProp : (0, date_fns_1.startOfDay)((0, date_fns_1.addDays)(activeDate, -1 * ((_a = config.previousDaysToDisplay) !== null && _a !== void 0 ? _a : 0))); }, [activeDate, config.previousDaysToDisplay, firstDayProp]);
var lastDay = (0, react_1.useMemo)(function () { return lastDayProp !== null && lastDayProp !== void 0 ? lastDayProp : (0, date_fns_1.endOfDay)((0, date_fns_1.addDays)(firstDay, config.daysToDisplay)); }, [lastDayProp, firstDay, config.daysToDisplay]);
var days = (0, react_1.useMemo)(function () {
var date = new Date(firstDay);
var days = [];
while (date <= lastDay) {
days.push(dateToDivisions(date, divisionDetails));
date.setDate(date.getDate() + 1);
}
return days;
}, [dateToDivisions, divisionDetails, firstDay, lastDay]);
var range = (0, react_1.useMemo)(function () { return lastDay.getTime() - firstDay.getTime(); }, [firstDay, lastDay]);
var totalDivisions = (0, react_1.useMemo)(function () { return days.reduce(function (acc, day) { return acc + day.divisions.length; }, 0); }, [days]);
var daysWithDivisionsOrder = (0, react_1.useMemo)(function () {
var e_1, _a;
var daysWithDivisionsOrder = [];
var order = 0;
try {
for (var days_1 = __values(days), days_1_1 = days_1.next(); !days_1_1.done; days_1_1 = days_1.next()) {
var day = days_1_1.value;
var divisions = day.divisions.map(function (division) { return (__assign(__assign({}, division), { order: order++ })); });
daysWithDivisionsOrder.push(__assign(__assign({}, day), { divisions: divisions }));
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (days_1_1 && !days_1_1.done && (_a = days_1.return)) _a.call(days_1);
}
finally { if (e_1) throw e_1.error; }
}
return daysWithDivisionsOrder;
}, [days]);
var filteredEvents = (0, react_1.useMemo)(function () {
return events.filter(function (event) {
var eventDay = days.find(function (day) { return (0, date_fns_1.isSameDay)(day.date, event.startTime); });
if (eventDay) {
return ((event.startTime >= eventDay.date && event.startTime <= eventDay.dateEnd) ||
(event.endTime >= eventDay.date && event.endTime <= eventDay.dateEnd));
}
return ((event.startTime >= firstDay && event.startTime <= lastDay) ||
(event.endTime >= firstDay && event.endTime <= lastDay));
});
}, [days, events, firstDay, lastDay]);
return ((0, jsx_runtime_1.jsx)(exports.SchedulerContext.Provider, __assign({ value: {
activeDate: activeDate,
resources: resources,
days: daysWithDivisionsOrder,
events: filteredEvents,
config: config,
calendarBounds: { start: firstDay, end: lastDay, range: range, totalDivisions: totalDivisions },
onEventChange: onEventChange,
HeaderRow: HeaderRow,
ResourceCell: ResourceCell,
ResourceHeader: ResourceHeader,
UnassignedHeader: UnassignedHeader,
UnAssignedBoxProps: UnAssignedBoxProps,
GridCell: GridCell,
EventTile: EventTile,
extendFrom: extendFrom,
extendTo: extendTo,
changeDates: changeDates,
extendWithScroll: extendWithScroll,
ExtendLeftIconButton: ExtendLeftIconButton,
ExtendRightIconButton: ExtendRightIconButton,
ScrollLeftIconButton: ScrollLeftIconButton,
ScrollRightIconButton: ScrollRightIconButton,
goNow: goNow,
lockNow: lockNow,
GoNowIconButton: GoNowIconButton,
LockNowIconButton: LockNowIconButton,
resizingEvent: resizingEvent,
setResizingEvent: setResizingEvent,
dndCreatingEvent: dndCreatingEvent,
} }, { children: (0, jsx_runtime_1.jsx)(Container, { children: (0, jsx_runtime_1.jsx)(TimelineView_1.TimelineView, {}) }) })));
};
exports.Scheduler = Scheduler;