UNPKG

alliance-calendar

Version:

Calendrier Alliance Digital

329 lines (322 loc) 17.8 kB
"use strict"; function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _react = _interopRequireWildcard(require("react")); var _dayjs = _interopRequireDefault(require("dayjs")); var _GobalContext = _interopRequireDefault(require("../Context/GobalContext")); var _moment = _interopRequireDefault(require("moment")); var _Popover = _interopRequireDefault(require("@mui/material/Popover")); var _material = require("@mui/material"); var _hours = require("../utils/hours"); var _holidays = require("../utils/holidays"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } function _iterableToArrayLimit(arr, i) { var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"]; if (null != _i) { var _s, _e, _x, _r, _arr = [], _n = !0, _d = !1; try { if (_x = (_i = _i.call(arr)).next, 0 === i) { if (Object(_i) !== _i) return; _n = !1; } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0); } catch (err) { _d = !0, _e = err; } finally { try { if (!_n && null != _i["return"] && (_r = _i["return"](), Object(_r) !== _r)) return; } finally { if (_d) throw _e; } } return _arr; } } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } // Component pour afficher une case dans le calendrier var Day = function Day(_ref) { var day = _ref.day, rowIdx = _ref.rowIdx, setEventSelected = _ref.setEventSelected, setOpenEditModal = _ref.setOpenEditModal; var _useContext = (0, _react.useContext)(_GobalContext["default"]), setDaySelected = _useContext.setDaySelected, setShowEventModal = _useContext.setShowEventModal, savedEvents = _useContext.savedEvents, localDayJS = _useContext.localDayJS, viewType = _useContext.viewType, plageDebut = _useContext.plageDebut, plageFin = _useContext.plageFin, dayView = _useContext.dayView; var _useState = (0, _react.useState)(false), _useState2 = _slicedToArray(_useState, 2), openModal = _useState2[0], setOpenModal = _useState2[1]; var _React$useState = _react["default"].useState(null), _React$useState2 = _slicedToArray(_React$useState, 2), anchorEl = _React$useState2[0], setAnchorEl = _React$useState2[1]; var _useState3 = (0, _react.useState)({}), _useState4 = _slicedToArray(_useState3, 2), event = _useState4[0], setEvent = _useState4[1]; var handlePopoverOpen = function handlePopoverOpen(event) { setAnchorEl(event.currentTarget); }; var overlayCheck = (0, _react.useCallback)(function () { var rightPos = function rightPos(elem) { return elem.getBoundingClientRect().right; }; var leftPos = function leftPos(elem) { return elem.getBoundingClientRect().left; }; var topPos = function topPos(elem) { return elem.getBoundingClientRect().top; }; var btmPos = function btmPos(elem) { return elem.getBoundingClientRect().bottom; }; var cols = document.querySelectorAll('.dayCol'); if (viewType == "day") { for (var i = 0; i < cols.length; i++) { var width = cols[i].offsetWidth; var points = cols[i].querySelectorAll('.event'); var widthPoint = width / points.length; for (var x = 0; x < points.length; x++) { for (var y = 0; y < points.length; y++) { var isOverlapping = !(rightPos(points[x]) < leftPos(points[y]) || leftPos(points[x]) > rightPos(points[y]) || btmPos(points[x]) < topPos(points[y]) || topPos(points[x]) > btmPos(points[y])); if (isOverlapping && x !== y) { points[x].className = "".concat(points[x].className, " ml-[").concat(Math.ceil(widthPoint * x) - 20, "px] w-[").concat(Math.ceil(widthPoint - 10), "px]"); } else { points[x].className = "".concat(points[x].className, " w-[").concat(Math.ceil(widthPoint) - 10, "px]"); } } } } } else { for (var _i2 = 0; _i2 < cols.length; _i2++) { var _points = cols[_i2].querySelectorAll('.event'); for (var _x2 = 0; _x2 < _points.length; _x2++) { for (var _y = 0; _y < _points.length; _y++) { var _isOverlapping = !(rightPos(_points[_x2]) < leftPos(_points[_y]) || leftPos(_points[_x2]) > rightPos(_points[_y]) || btmPos(_points[_x2]) < topPos(_points[_y]) || topPos(_points[_x2]) > btmPos(_points[_y])); if (_isOverlapping && _x2 !== _y) { _points[_x2].className = "".concat(_points[_x2].className, " ml-[").concat(_x2, "%] w-[5%]"); } } } } } }, [viewType]); // Optimisation : useMemo pour filtrer et trier les événements // Utiliser une valeur stable pour la dépendance var dayString = day.format("DD-MM-YY"); var dayEvents = (0, _react.useMemo)(function () { if (!savedEvents || savedEvents.length === 0) return []; return savedEvents.filter(function (evt) { if (!evt.dateDebut || !evt.dateFin) return false; var evtDateDebut = _dayjs["default"].unix(evt.dateDebut.value); var evtDateFin = _dayjs["default"].unix(evt.dateFin.value); // Vérifier si l'événement commence ce jour // L'événement est affiché si sa date de début correspond au jour var startsToday = evtDateDebut.format("DD-MM-YY") === dayString; // Vérifier aussi que la date de début est avant la date de fin var isValid = evtDateDebut.isBefore(evtDateFin) || evtDateDebut.isSame(evtDateFin, 'day'); return startsToday && isValid; }).sort(function (a, b) { var dateA = _dayjs["default"].unix(a.dateDebut.value); var dateB = _dayjs["default"].unix(b.dateDebut.value); return dateA.isAfter(dateB) ? 1 : -1; }); }, [savedEvents, dayString]); (0, _react.useEffect)(function () { // Utiliser requestAnimationFrame pour éviter les calculs pendant le rendu var timer = requestAnimationFrame(function () { overlayCheck(); }); return function () { return cancelAnimationFrame(timer); }; }, [dayEvents, overlayCheck]); var open = Boolean(anchorEl); // Optimisation : useMemo pour les classes et vérifications var isToday = (0, _react.useMemo)(function () { return day.format('DD-MM-YY') === (0, _moment["default"])().format("DD-MM-YY"); }, [day]); var getCurrentDayClass = (0, _react.useMemo)(function () { return isToday ? ' bg-blue-600 text-white rounded-full w-7' : ''; }, [isToday]); // Vérifier si le jour est férié var isHolidayDay = (0, _react.useMemo)(function () { return (0, _holidays.isHoliday)(day); }, [day]); // Classes pour les jours fériés (grisé) var holidayClass = (0, _react.useMemo)(function () { return isHolidayDay ? ' bg-gray-200 opacity-60' : ''; }, [isHolidayDay]); var dayClassName = (0, _react.useMemo)(function () { var baseClass = isToday ? 'dayCol border border-gray-200 flex flex-col bg-white' : "dayCol border border-gray-200 flex flex-col"; return baseClass + holidayClass; }, [isToday, holidayClass]); return /*#__PURE__*/_react["default"].createElement("div", { className: dayClassName + " min-w-0 flex flex-col", onClick: function onClick() {} }, viewType !== "day" && /*#__PURE__*/_react["default"].createElement("header", { className: "flex flex-col items-center" }, rowIdx === 0 && /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("p", { className: "text-xs sm:text-sm mt-1" }, day.format('ddd').toUpperCase())), /*#__PURE__*/_react["default"].createElement("p", { className: "text-xs sm:text-sm p-1 my-1 text-center" + getCurrentDayClass }, day.format('DD'))), viewType == "day" || viewType == "week" ? /*#__PURE__*/_react["default"].createElement("div", { className: "flex-1 relative" }, _hours.hours.filter(function (h) { return h >= plageDebut && h <= plageFin; }).map(function (h) { var hourEvents = dayEvents.filter(function (evt) { return _moment["default"].unix(evt.dateDebut.value).hour() === h; }); return /*#__PURE__*/_react["default"].createElement("div", { key: "hours-".concat(h), className: 'cursor-pointer border border-collapse border-grey-200 h-[40px] sm:h-[5vh] min-h-[40px] relative', onClick: function onClick() { setDaySelected(day); // setShowEventModal(true); } }, hourEvents.map(function (evt, index) { var deltaHour = _moment["default"].unix(evt.dateFin.value).hour() - _moment["default"].unix(evt.dateDebut.value).hour() + 1; var heightMobile = 40 * deltaHour - 5; var heightDesktop = 5 * deltaHour - 5; var eventClassName = viewType == "day" ? "event border-1 border-white p-0.5 sm:p-1 mr-1 sm:mr-3 text-grey-600 text-[10px] sm:text-xs md:text-sm rounded overflow-hidden absolute left-0 right-1 sm:right-3" : "event border-1 border-white p-0.5 sm:p-1 mr-1 sm:mr-3 text-grey-600 text-[10px] sm:text-xs md:text-sm rounded overflow-hidden absolute left-0 right-1 sm:right-3"; return /*#__PURE__*/_react["default"].createElement("div", { key: "eventDay-".concat(evt.id || index), className: eventClassName, style: { background: evt.color.value, height: viewType == "day" ? "min(".concat(heightMobile, "px, ").concat(heightDesktop, "vh)") : "".concat(heightDesktop, "vh"), minHeight: "".concat(heightMobile, "px"), zIndex: h * 10 }, onClick: function onClick(e) { e.stopPropagation(); setEventSelected(evt); setOpenEditModal(true); }, onMouseEnter: function onMouseEnter(event) { setEvent(evt); setAnchorEl(event.currentTarget); }, onMouseLeave: function onMouseLeave() { setAnchorEl(null); setEvent({}); } }, /*#__PURE__*/_react["default"].createElement("div", { key: "a-".concat(index), style: { color: evt.textColor != undefined ? evt.textColor.value : "#000000" } }, /*#__PURE__*/_react["default"].createElement("div", { className: "flex flex-col sm:flex-row justify-between gap-1" }, /*#__PURE__*/_react["default"].createElement("div", { className: "truncate text-[9px] sm:text-xs" }, _moment["default"].unix(evt.dateDebut.value).format("HH:mm") + ' - ' + _moment["default"].unix(evt.dateFin.value).format("HH:mm")), /*#__PURE__*/_react["default"].createElement("div", { className: "flex items-center gap-1" }, evt.isReccurente.value == true && /*#__PURE__*/_react["default"].createElement("span", { className: "material-icons material-icons-outlined cursor-pointer text-grey-600 text-sm sm:text-base" }, "restart_alt"), evt.etat && /*#__PURE__*/_react["default"].createElement("span", { className: "material-icons material-icons-filled cursor-pointer text-grey-600 text-sm sm:text-base " + evt.etat.value }, "circle")))), Object.keys(evt).filter(function (key) { return evt[key].visible === true; }).map(function (key) { return /*#__PURE__*/_react["default"].createElement("div", { key: "objectB-".concat(key, "-").concat(index), className: "text-[9px] sm:text-xs truncate", style: { color: evt.textColor != undefined ? evt.textColor.value : "#000000" } }, evt[key].value); })); })); })) : /*#__PURE__*/_react["default"].createElement("div", { className: 'flex-1 cursor-pointer', onClick: function onClick() { setDaySelected(day); // setShowEventModal(true); } }, dayEvents.map(function (evt, index) { return /*#__PURE__*/_react["default"].createElement("div", { key: "daysBis-".concat(evt.id || index), className: "p-1 mr-3 text-grey-600 text-sm rounded mb-1 overflow-y-auto", style: { background: evt.color.value }, onClick: function onClick() { setEventSelected(evt); setOpenEditModal(true); }, onMouseEnter: function onMouseEnter(event) { setEvent(evt); setAnchorEl(event.currentTarget); }, onMouseLeave: function onMouseLeave() { setAnchorEl(null); setEvent({}); } }, /*#__PURE__*/_react["default"].createElement("div", { key: "c-".concat(index), style: { color: evt.textColor != undefined ? evt.textColor.value : "#000000" } }, /*#__PURE__*/_react["default"].createElement("div", { className: "flex justify-between" }, /*#__PURE__*/_react["default"].createElement("div", null, _moment["default"].unix(evt.dateDebut.value).format("HH:mm") + ' - ' + _moment["default"].unix(evt.dateFin.value).format("HH:mm")), evt.isReccurente.value == true && /*#__PURE__*/_react["default"].createElement("span", { className: "material-icons material-icons-outlined cursor-pointer text-grey-600 mx-2" }, "restart_alt"), evt.etat && /*#__PURE__*/_react["default"].createElement("span", { className: "material-icons material-icons-filled cursor-pointer text-grey-600 " + evt.etat.value }, "circle"))), Object.keys(evt).filter(function (key) { return evt[key].visible === true; }).map(function (key) { return /*#__PURE__*/_react["default"].createElement("div", { key: "keys-".concat(key, "-").concat(index), style: { color: evt.textColor != undefined ? evt.textColor.value : "#000000" } }, evt[key].value); })); })), /*#__PURE__*/_react["default"].createElement(_Popover["default"], { id: "mouse-over-popover", sx: { pointerEvents: 'none' }, open: open, anchorEl: anchorEl, anchorOrigin: { vertical: 'top', horizontal: 'right' }, transformOrigin: { vertical: 'top', horizontal: 'left' }, onClose: function onClose() { setAnchorEl(null); }, disableRestoreFocus: true }, /*#__PURE__*/_react["default"].createElement(_material.Box, { sx: { backgroundColor: "#414757", color: "white", padding: "5px" } }, event.details != undefined && Object.keys(event.details).length > 0 && Object.keys(event.details).map(function (key) { if (!Array.isArray(event.details[key])) { return /*#__PURE__*/_react["default"].createElement("div", { key: "d" + key }, event.details[key]); } else { return /*#__PURE__*/_react["default"].createElement("div", { key: "db" + key }, key.charAt(0).toUpperCase() + key.slice(1) + " : " + event.details[key].map(function (ek, ekIndex) { if (Object.keys(ek).length > 0 && isNaN(Object.keys(ek)[0])) { return Object.keys(ek).map(function (key2, key2Index) { return /*#__PURE__*/_react["default"].createElement("span", { key: "detail-".concat(key, "-").concat(ekIndex, "-").concat(key2Index) }, ek[key2]); }); } else { return /*#__PURE__*/_react["default"].createElement("span", { key: "detail-".concat(key, "-").concat(ekIndex) }, ek); } })); } })))); }; var _default = Day; exports["default"] = _default;