UNPKG

@josmangarsal/pragmatic-scheduler

Version:
198 lines (197 loc) 8.35 kB
"use strict"; 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 __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."); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.useCreatingEvent = void 0; var jsx_runtime_1 = require("@emotion/react/jsx-runtime"); var react_1 = require("react"); var Scheduler_1 = require("../components/Scheduler"); var EventTile_1 = require("../components/EventTile"); var useLayoutToCalEvent_1 = require("./useLayoutToCalEvent"); var useCalcEventPosition_1 = require("./useCalcEventPosition"); var useCreatingEvent = function (_a) { var ref = _a.ref, gridWidth = _a.gridWidth, cols = _a.cols, rows = _a.rows; var _b = __read((0, react_1.useState)(null), 2), creatingEvent = _b[0], setCreatingEvent = _b[1]; var layoutToCalEvent = (0, useLayoutToCalEvent_1.useLayoutToCalEvent)(); var calcEventPosition = (0, useCalcEventPosition_1.useCalcEventPosition)(); var _c = (0, react_1.useContext)(Scheduler_1.SchedulerContext), EventTileOverride = _c.EventTile, dndCreatingEvent = _c.dndCreatingEvent, onEventChange = _c.onEventChange, config = _c.config, events = _c.events; var Component = EventTileOverride || EventTile_1.DefaultEventTile; var contentRef = (0, react_1.useRef)(); var newEvent = (0, react_1.useMemo)(function () { return (!creatingEvent ? null : layoutToCalEvent(creatingEvent, true)); }, [creatingEvent, layoutToCalEvent]); var isCellOccupied = (0, react_1.useCallback)(function (startCol, endCol, row) { var e_1, _a; if (!events) return false; try { for (var events_1 = __values(events), events_1_1 = events_1.next(); !events_1_1.done; events_1_1 = events_1.next()) { var event_1 = events_1_1.value; var _b = calcEventPosition(event_1), eStart = _b.x, eTop = _b.y, eWidth = _b.w, eHeight = _b.h; var eEnd = eStart + eWidth; var sameRow = row >= eTop && row < eTop + eHeight; if (!sameRow) continue; var overlaps = !(endCol <= eStart || startCol >= eEnd); if (overlaps) { return true; } } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (events_1_1 && !events_1_1.done && (_a = events_1.return)) _a.call(events_1); } finally { if (e_1) throw e_1.error; } } return false; }, [calcEventPosition, events]); (0, react_1.useEffect)(function () { if (!dndCreatingEvent) return; var el = ref.current; if (!el) return; var timeoutId = null; var isPressed = false; var handleMouseDown = function (e) { var _a; if (e.button !== 0) return; // Only left click if (((_a = e.target) === null || _a === void 0 ? void 0 : _a.className) === 'os-scrollbar-handle') return; // Ignore clicks on scroll bar var bounds = el.getBoundingClientRect(); var startX = e.clientX - bounds.left + el.scrollLeft; var startCol = (startX / gridWidth) * cols; var startY = e.clientY - bounds.top + el.scrollTop; var startRow = Math.floor(startY / config.rowHeight) - 1; var startRowVisible = startY / config.rowHeight - 1; if (startCol < 0 || startRow < 0) return; if (startRowVisible >= rows) return; if (startCol >= cols) return; if (isCellOccupied(startCol, startCol + 1, startRow)) return; isPressed = true; timeoutId = setTimeout(function () { if (isPressed) { setCreatingEvent({ i: "NewEvent_".concat(Date.now()), x: startCol, y: startRow, w: 1, minW: 1, h: 1, maxH: 1, }); } }, 300); }; var handleMouseMove = function (e) { if (!creatingEvent) return; var bounds = el.getBoundingClientRect(); var auxX = e.clientX - bounds.left + el.scrollLeft; var auxCol = (auxX / gridWidth) * cols; var newStartCol = Math.min(creatingEvent.x, auxCol); var newEndCol = Math.max(creatingEvent.x, auxCol); var newX = Math.floor(newStartCol); var newW = Math.max(1, Math.ceil(newEndCol) - Math.floor(newStartCol)); setCreatingEvent(__assign(__assign({}, creatingEvent), { x: newX, w: newW })); }; var handleMouseUp = function () { isPressed = false; if (timeoutId) { clearTimeout(timeoutId); timeoutId = null; } if (!creatingEvent || !newEvent) return; if (onEventChange) { onEventChange(newEvent); } setCreatingEvent(null); }; var handleKeyDown = function (e) { if (e.key === 'Escape') { // Cancel creating event isPressed = false; if (timeoutId) { clearTimeout(timeoutId); timeoutId = null; } setCreatingEvent(null); } }; el.addEventListener('mousedown', handleMouseDown); el.addEventListener('mousemove', handleMouseMove); el.addEventListener('mouseup', handleMouseUp); window.addEventListener('keydown', handleKeyDown); return function () { el.removeEventListener('mousedown', handleMouseDown); el.removeEventListener('mousemove', handleMouseMove); el.removeEventListener('mouseup', handleMouseUp); window.removeEventListener('keydown', handleKeyDown); if (timeoutId) clearTimeout(timeoutId); }; }, [ creatingEvent, cols, gridWidth, config.rowHeight, ref, dndCreatingEvent, newEvent, onEventChange, isCellOccupied, rows, ]); var renderCreatingEvent = (0, react_1.useMemo)(function () { if (!newEvent) return null; return ((0, jsx_runtime_1.jsx)("div", __assign({ "data-grid": creatingEvent }, { children: (0, jsx_runtime_1.jsx)(Component, { event: newEvent, contentRef: contentRef }) }), "creatingEvent")); }, [Component, creatingEvent, newEvent]); return { isCreating: !!creatingEvent, renderCreatingEvent: renderCreatingEvent, }; }; exports.useCreatingEvent = useCreatingEvent;