UNPKG

react-big-schedule

Version:

React Big Schedule is a powerful and intuitive scheduler and resource planning solution built with React. Seamlessly integrate this modern browser-compatible component into your applications to effectively manage time, appointments, and resources. With d

1,182 lines (1,176 loc) 53.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _dayjs = _interopRequireDefault(require("dayjs")); var _quarterOfYear = _interopRequireDefault(require("dayjs/plugin/quarterOfYear")); var _utc = _interopRequireDefault(require("dayjs/plugin/utc")); var _weekday = _interopRequireDefault(require("dayjs/plugin/weekday")); var _isoWeek = _interopRequireDefault(require("dayjs/plugin/isoWeek")); var _rrule = require("rrule"); var _default = require("../config/default"); var _scheduler = _interopRequireDefault(require("../config/scheduler")); var _i18n = require("../config/i18n"); var _behaviors = _interopRequireDefault(require("../helper/behaviors")); function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; } function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } var SchedulerData = exports["default"] = /*#__PURE__*/function () { function SchedulerData() { var date = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : (0, _dayjs["default"])(); var viewType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _default.ViewType.Week; var showAgenda = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; var isEventPerspective = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; var newConfig = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : undefined; var newBehaviors = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : undefined; _classCallCheck(this, SchedulerData); this.resources = []; this.events = []; this.eventGroups = []; this.eventGroupsAutoGenerated = true; this.viewType = viewType; this.cellUnit = viewType === _default.ViewType.Day ? _default.CellUnit.Hour : _default.CellUnit.Day; this.showAgenda = showAgenda; this.isEventPerspective = isEventPerspective; this.resizing = false; this.scrollToSpecialDayjs = false; this.documentWidth = 0; this.documentHeight = 0; this.schedulerHeaderHeight = 0; this._shouldReloadViewType = false; this.calendarPopoverLocale = undefined; _dayjs["default"].extend(_quarterOfYear["default"]); _dayjs["default"].extend(_weekday["default"]); _dayjs["default"].extend(_utc["default"]); _dayjs["default"].extend(_isoWeek["default"]); this.localeDayjs = _dayjs["default"]; this.config = newConfig === undefined ? _scheduler["default"] : _objectSpread(_objectSpread({}, _scheduler["default"]), newConfig); this._updateLabelsFromI18n(); this._validateMinuteStep(this.config.minuteStep); this.behaviors = newBehaviors === undefined ? _behaviors["default"] : _objectSpread(_objectSpread({}, _behaviors["default"]), newBehaviors); this._resolveDate(0, date); this._createHeaders(); this._createRenderData(); } /** * Update user-facing labels from the i18n provider * This allows apps to provide localized labels via setLabelsProvider() * @private */ return _createClass(SchedulerData, [{ key: "_updateLabelsFromI18n", value: function _updateLabelsFromI18n(locale) { // Get labels from the i18n provider if available var defaults = (0, _i18n.getDefaultLabels)(); var applyIfProvided = function applyIfProvided(key, current) { var value = (0, _i18n.getLabel)(key, locale); if (value === undefined || value === null) return current; return value !== defaults[key] ? value : current; }; this.config.resourceName = applyIfProvided('resourceName', this.config.resourceName); this.config.taskName = applyIfProvided('taskName', this.config.taskName); this.config.agendaViewHeader = applyIfProvided('agendaViewHeader', this.config.agendaViewHeader); this.config.weekNumberLabel = applyIfProvided('weekNumberLabel', this.config.weekNumberLabel); } }, { key: "setSchedulerLocale", value: function setSchedulerLocale(preset) { if (!preset) return; this.localeDayjs.locale(preset); this._updateLabelsFromI18n(preset); this._shouldReloadViewType = true; this.setViewType(this.viewType, this.showAgenda, this.isEventPerspective); } }, { key: "setCalendarPopoverLocale", value: function setCalendarPopoverLocale(lang) { if (lang) { this.calendarPopoverLocale = lang; } } }, { key: "setResources", value: function setResources(resources) { this._validateResource(resources); this.resources = Array.from(new Set(resources)); this._createRenderData(); this.setScrollToSpecialDayjs(true); } }, { key: "setEventGroupsAutoGenerated", value: function setEventGroupsAutoGenerated(autoGenerated) { this.eventGroupsAutoGenerated = autoGenerated; } // optional }, { key: "setEventGroups", value: function setEventGroups(eventGroups) { this._validateEventGroups(eventGroups); this.eventGroups = Array.from(new Set(eventGroups)); this.eventGroupsAutoGenerated = false; this._createRenderData(); this.setScrollToSpecialDayjs(true); } }, { key: "setMinuteStep", value: function setMinuteStep(minuteStep) { if (this.config.minuteStep !== minuteStep) { this._validateMinuteStep(minuteStep); this.config.minuteStep = minuteStep; this._createHeaders(); this._createRenderData(); } } }, { key: "setBesidesWidth", value: function setBesidesWidth(besidesWidth) { if (besidesWidth >= 0) { this.config.besidesWidth = besidesWidth; } } }, { key: "setUnderneathHeight", value: function setUnderneathHeight(underneathHeight) { if (underneathHeight >= 0) { this.config.underneathHeight = underneathHeight; } } }, { key: "getMinuteStepsInHour", value: function getMinuteStepsInHour() { return 60 / this.config.minuteStep; } }, { key: "addResource", value: function addResource(resource) { var existedResources = this.resources.filter(function (x) { return x.id === resource.id; }); if (existedResources.length === 0) { this.resources.push(resource); this._createRenderData(); } } }, { key: "addEventGroup", value: function addEventGroup(eventGroup) { var existedEventGroups = this.eventGroups.filter(function (x) { return x.id === eventGroup.id; }); if (existedEventGroups.length === 0) { this.eventGroups.push(eventGroup); this._createRenderData(); } } }, { key: "removeEventGroupById", value: function removeEventGroupById(eventGroupId) { var index = -1; this.eventGroups.forEach(function (item, idx) { if (item.id === eventGroupId) index = idx; }); if (index !== -1) this.eventGroups.splice(index, 1); } }, { key: "containsEventGroupId", value: function containsEventGroupId(eventGroupId) { var index = -1; this.eventGroups.forEach(function (item, idx) { if (item.id === eventGroupId) index = idx; }); return index !== -1; } }, { key: "setEvents", value: function setEvents(events) { this._validateEvents(events); this.events = Array.from(events); if (this.eventGroupsAutoGenerated) this._generateEventGroups(); if (this.config.recurringEventsEnabled) this._handleRecurringEvents(); this._createRenderData(); } }, { key: "setScrollToSpecialDayjs", value: function setScrollToSpecialDayjs(scrollToSpecialDayjs) { if (this.config.scrollToSpecialDayjsEnabled) this.scrollToSpecialDayjs = scrollToSpecialDayjs; } }, { key: "prev", value: function prev() { this._resolveDate(-1); this.events = []; this._createHeaders(); this._createRenderData(); } }, { key: "next", value: function next() { this._resolveDate(1); this.events = []; this._createHeaders(); this._createRenderData(); } }, { key: "setDate", value: function setDate() { var date = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : (0, _dayjs["default"])(new Date()); this._resolveDate(0, date); this.events = []; this._createHeaders(); this._createRenderData(); } }, { key: "setViewType", value: function setViewType() { var viewType = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _default.ViewType.Week; var showAgenda = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; var isEventPerspective = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; this.showAgenda = showAgenda; this.isEventPerspective = isEventPerspective; this.cellUnit = _default.CellUnit.Day; if (this.viewType !== viewType || this._shouldReloadViewType) { var date = this.startDate; if (viewType === _default.ViewType.Custom || viewType === _default.ViewType.Custom1 || viewType === _default.ViewType.Custom2) { this.viewType = viewType; this._resolveDate(0, date); } else { if (this.viewType < viewType) { if (viewType === _default.ViewType.Week) { this.startDate = this.localeDayjs(new Date(date)).startOf('isoWeek'); this.endDate = this.localeDayjs(new Date(this.startDate)).endOf('isoWeek'); } else if (viewType === _default.ViewType.Month) { this.startDate = this.localeDayjs(new Date(date)).startOf('month'); this.endDate = this.localeDayjs(new Date(this.startDate)).endOf('month'); } else if (viewType === _default.ViewType.Quarter) { this.startDate = this.localeDayjs(new Date(date)).startOf('quarter'); this.endDate = this.localeDayjs(new Date(this.startDate)).endOf('quarter'); } else if (viewType === _default.ViewType.Year) { this.startDate = this.localeDayjs(new Date(date)).startOf('year'); this.endDate = this.localeDayjs(new Date(this.startDate)).endOf('year'); } } else { var start = this.localeDayjs(new Date(this.startDate)); var end = this.localeDayjs(new Date(this.endDate)).add(1, 'days'); if (this.selectDate !== undefined) { var selectDate = this.localeDayjs(new Date(this.selectDate)); if (selectDate >= start && selectDate < end) { date = this.selectDate; } } var now = this.localeDayjs(); if (now >= start && now < end) { date = now.startOf('day'); } if (viewType === _default.ViewType.Day) { this.startDate = date; this.endDate = this.startDate; this.cellUnit = _default.CellUnit.Hour; } else if (viewType === _default.ViewType.Week) { this.startDate = this.localeDayjs(new Date(date)).startOf('isoWeek'); this.endDate = this.localeDayjs(new Date(this.startDate)).endOf('isoWeek'); } else if (viewType === _default.ViewType.Month) { this.startDate = this.localeDayjs(new Date(date)).startOf('month'); this.endDate = this.localeDayjs(new Date(this.startDate)).endOf('month'); } else if (viewType === _default.ViewType.Quarter) { this.startDate = this.localeDayjs(new Date(date)).startOf('quarter'); this.endDate = this.localeDayjs(new Date(this.startDate)).endOf('quarter'); } } this.viewType = viewType; } this._shouldReloadViewType = false; this.events = []; this._createHeaders(); this._createRenderData(); this.setScrollToSpecialDayjs(true); } } }, { key: "setSchedulerMaxHeight", value: function setSchedulerMaxHeight(newSchedulerMaxHeight) { this.config.schedulerMaxHeight = newSchedulerMaxHeight; } }, { key: "isSchedulerResponsive", value: function isSchedulerResponsive() { return !!this.config.schedulerWidth.endsWith && this.config.schedulerWidth.endsWith('%'); } }, { key: "toggleExpandStatus", value: function toggleExpandStatus(slotId) { var slotEntered = false; var slotIndent = -1; var isExpanded = false; var expandedMap = new Map(); this.renderData.forEach(function (item) { if (slotEntered === false) { if (item.slotId === slotId && item.hasChildren) { slotEntered = true; isExpanded = !item.expanded; item.expanded = isExpanded; slotIndent = item.indent; expandedMap.set(item.indent, { expanded: item.expanded, render: item.render }); } } else if (item.indent > slotIndent) { var expandStatus = expandedMap.get(item.indent - 1); item.render = expandStatus.expanded && expandStatus.render; if (item.hasChildren) { expandedMap.set(item.indent, { expanded: item.expanded, render: item.render }); } } else { slotEntered = false; } }); } }, { key: "isResourceViewResponsive", value: function isResourceViewResponsive() { var resourceTableWidth = this.getResourceTableConfigWidth(); return !!resourceTableWidth.endsWith && resourceTableWidth.endsWith('%'); } }, { key: "isContentViewResponsive", value: function isContentViewResponsive() { var contentCellWidth = this.getContentCellConfigWidth(); return !!contentCellWidth.endsWith && contentCellWidth.endsWith('%'); } }, { key: "getSchedulerWidth", value: function getSchedulerWidth() { var baseWidth = this.documentWidth - this.config.besidesWidth > 0 ? this.documentWidth - this.config.besidesWidth : 0; return this.isSchedulerResponsive() ? parseInt(baseWidth * Number(this.config.schedulerWidth.slice(0, -1)) / 100, 10) : this.config.schedulerWidth; } }, { key: "getSchedulerHeight", value: function getSchedulerHeight() { // Use the header height tracked in SchedulerData (set via _setSchedulerHeaderHeight) var headerHeight = this.schedulerHeaderHeight || 0; var baseHeight = this.documentHeight - headerHeight - this.config.tableHeaderHeight - (this.config.underneathHeight || 0); var validBaseHeight = baseHeight > 0 ? baseHeight : 0; if (this.isSchedulerResponsive() && this.config.schedulerHeight && this.config.schedulerHeight.endsWith && this.config.schedulerHeight.endsWith('%')) { return parseInt(validBaseHeight * Number(this.config.schedulerHeight.slice(0, -1)) / 100, 10); } // fallback to max height if set, else just use base height return this.config.schedulerMaxHeight || validBaseHeight; } }, { key: "getResourceTableWidth", value: function getResourceTableWidth() { var resourceTableConfigWidth = this.getResourceTableConfigWidth(); var schedulerWidth = this.getSchedulerWidth(); var resourceTableWidth = this.isResourceViewResponsive() ? parseInt(schedulerWidth * Number(resourceTableConfigWidth.slice(0, -1)) / 100, 10) : resourceTableConfigWidth; if (this.isSchedulerResponsive() && this.getContentTableWidth() + resourceTableWidth < schedulerWidth) resourceTableWidth = schedulerWidth - this.getContentTableWidth(); return resourceTableWidth; } }, { key: "getContentCellWidth", value: function getContentCellWidth() { var contentCellConfigWidth = this.getContentCellConfigWidth(); var schedulerWidth = this.getSchedulerWidth(); return this.isContentViewResponsive() ? parseInt(schedulerWidth * Number(contentCellConfigWidth.slice(0, -1)) / 100, 10) : contentCellConfigWidth; } }, { key: "getContentTableWidth", value: function getContentTableWidth() { return this.headers.length * this.getContentCellWidth(); } }, { key: "getScrollToSpecialDayjs", value: function getScrollToSpecialDayjs() { if (this.config.scrollToSpecialDayjsEnabled) return this.scrollToSpecialDayjs; return false; } }, { key: "getSlots", value: function getSlots() { return this.isEventPerspective ? this.eventGroups : this.resources; } }, { key: "getSlotById", value: function getSlotById(slotId) { var slots = this.getSlots(); var slot; slots.forEach(function (item) { if (item.id === slotId) slot = item; }); return slot; } }, { key: "getResourceById", value: function getResourceById(resourceId) { var resource; this.resources.forEach(function (item) { if (item.id === resourceId) resource = item; }); return resource; } }, { key: "getTableHeaderHeight", value: function getTableHeaderHeight() { return this.config.tableHeaderHeight; } }, { key: "getSchedulerContentDesiredHeight", value: function getSchedulerContentDesiredHeight() { var height = 0; this.renderData.forEach(function (item) { if (item.render) height += item.rowHeight; }); return height; } }, { key: "getCellMaxEvents", value: function getCellMaxEvents() { var viewConfigMap = _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty({}, _default.ViewType.Week, 'weekMaxEvents'), _default.ViewType.Day, 'dayMaxEvents'), _default.ViewType.Month, 'monthMaxEvents'), _default.ViewType.Year, 'yearMaxEvents'), _default.ViewType.Quarter, 'quarterMaxEvents'); var configProperty = viewConfigMap[this.viewType] || 'customMaxEvents'; return this.config[configProperty]; } }, { key: "getCalendarPopoverLocale", value: function getCalendarPopoverLocale() { return this.calendarPopoverLocale; } }, { key: "getSelectedDate", value: function getSelectedDate() { return this.selectDate.format(_default.DATE_FORMAT); } }, { key: "getViewStartDate", value: function getViewStartDate() { return this.startDate; } }, { key: "getViewEndDate", value: function getViewEndDate() { return this.endDate; } }, { key: "getViewDates", value: function getViewDates() { return { startDate: this.startDate, endDate: this.endDate }; } }, { key: "getDateLabel", value: function getDateLabel() { var start = this.localeDayjs(new Date(this.startDate)); var end = this.localeDayjs(new Date(this.endDate)); var dateLabel = start.format('LL'); if (start !== end) dateLabel = "".concat(start.format('LL'), "-").concat(end.format('LL')); if (this.behaviors.getDateLabelFunc) dateLabel = this.behaviors.getDateLabelFunc(this, this.viewType, this.startDate, this.endDate); return dateLabel; } }, { key: "addEvent", value: function addEvent(newEvent) { this._attachEvent(newEvent); if (this.eventGroupsAutoGenerated) this._generateEventGroups(); this._createRenderData(); } }, { key: "updateEventStart", value: function updateEventStart(event, newStart) { this._detachEvent(event); event.start = newStart; this._attachEvent(event); this._createRenderData(); } }, { key: "updateEventEnd", value: function updateEventEnd(event, newEnd) { event.end = newEnd; this._createRenderData(); } }, { key: "swapEvent", value: function swapEvent(eventSource, eventDest) { // Swap group or resource IDs if (this.isEventPerspective) { var _ref = [eventDest.groupId, eventSource.groupId]; eventSource.groupId = _ref[0]; eventDest.groupId = _ref[1]; var _ref2 = [eventDest.groupName, eventSource.groupName]; eventSource.groupName = _ref2[0]; eventDest.groupName = _ref2[1]; } else { var _ref3 = [eventDest.resourceId, eventSource.resourceId]; eventSource.resourceId = _ref3[0]; eventDest.resourceId = _ref3[1]; } // Swap start and end times var _ref4 = [eventDest.start, eventSource.start]; eventSource.start = _ref4[0]; eventDest.start = _ref4[1]; // Update the events var _ref5 = [eventDest.end, eventSource.end]; eventSource.end = _ref5[0]; eventDest.end = _ref5[1]; this._detachEvent(eventSource); this._detachEvent(eventDest); this._attachEvent(eventSource); this._attachEvent(eventDest); this._createRenderData(); } }, { key: "swapEvent2", value: function swapEvent2(eventSource, eventDest) { var tempEventSource = _objectSpread({}, eventSource); var tempEventDest = _objectSpread({}, eventDest); this._detachEvent(eventSource); this._detachEvent(eventDest); if (this.isEventPerspective) { tempEventSource.groupId = eventDest.groupId; tempEventSource.groupName = eventDest.groupName; tempEventDest.groupId = eventSource.groupId; tempEventDest.groupName = eventSource.groupName; } else { tempEventSource.resourceId = eventDest.resourceId; tempEventDest.resourceId = eventSource.resourceId; } tempEventSource.end = eventDest.end; tempEventSource.start = eventDest.start; tempEventDest.end = eventSource.end; tempEventDest.start = eventSource.start; this._attachEvent(tempEventSource); this._attachEvent(tempEventDest); this._createRenderData(); } }, { key: "moveEvent", value: function moveEvent(event, newSlotId, newSlotName, newStart, newEnd) { this._detachEvent(event); if (this.isEventPerspective) { event.groupId = newSlotId; event.groupName = newSlotName; } else event.resourceId = newSlotId; event.end = newEnd; event.start = newStart; this._attachEvent(event); this._createRenderData(); } }, { key: "isEventInTimeWindow", value: function isEventInTimeWindow(eventStart, eventEnd, windowStart, windowEnd) { return eventStart < windowEnd && eventEnd > windowStart; } }, { key: "removeEvent", value: function removeEvent(event) { var index = this.events.indexOf(event); if (index !== -1) { this.events.splice(index, 1); this._createRenderData(); } } }, { key: "removeEventById", value: function removeEventById(eventId) { var index = -1; this.events.forEach(function (item, idx) { if (item.id === eventId) index = idx; }); if (index !== -1) { this.events.splice(index, 1); this._createRenderData(); } } }, { key: "getResourceTableConfigWidth", value: function getResourceTableConfigWidth() { if (this.showAgenda) { return this.config.agendaResourceTableWidth; } var viewConfigMap = _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty({}, _default.ViewType.Week, 'weekResourceTableWidth'), _default.ViewType.Day, 'dayResourceTableWidth'), _default.ViewType.Month, 'monthResourceTableWidth'), _default.ViewType.Year, 'yearResourceTableWidth'), _default.ViewType.Quarter, 'quarterResourceTableWidth'); var configProperty = viewConfigMap[this.viewType] || 'customResourceTableWidth'; return this.config[configProperty]; } }, { key: "getContentCellConfigWidth", value: function getContentCellConfigWidth() { var viewConfigMap = _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty({}, _default.ViewType.Week, 'weekCellWidth'), _default.ViewType.Day, 'dayCellWidth'), _default.ViewType.Month, 'monthCellWidth'), _default.ViewType.Year, 'yearCellWidth'), _default.ViewType.Quarter, 'quarterCellWidth'); var configProperty = viewConfigMap[this.viewType] || 'customCellWidth'; return this.config[configProperty]; } }, { key: "_setDocumentWidth", value: function _setDocumentWidth(documentWidth) { if (documentWidth >= 0) { this.documentWidth = documentWidth; } } }, { key: "_setDocumentHeight", value: function _setDocumentHeight(documentHeight) { if (documentHeight >= 0) { this.documentHeight = documentHeight; } } }, { key: "_setSchedulerHeaderHeight", value: function _setSchedulerHeaderHeight(schedulerHeaderHeight) { if (schedulerHeaderHeight >= 0) { this.schedulerHeaderHeight = schedulerHeaderHeight; } } }, { key: "_detachEvent", value: function _detachEvent(event) { var index = this.events.indexOf(event); if (index !== -1) this.events.splice(index, 1); } }, { key: "_attachEvent", value: function _attachEvent(event) { var _this = this; var pos = 0; var eventStart = this.localeDayjs(new Date(event.start)); this.events.forEach(function (item, index) { var start = _this.localeDayjs(new Date(item.start)); if (eventStart >= start) pos = index + 1; }); this.events.splice(pos, 0, event); } }, { key: "_handleRecurringEvents", value: function _handleRecurringEvents() { var _this2 = this; var recurringEvents = this.events.filter(function (x) { return !!x.rrule; }); recurringEvents.forEach(function (item) { _this2._detachEvent(item); }); recurringEvents.forEach(function (item) { var windowStart = _this2.startDate; var windowEnd = _this2.endDate.add(1, 'days'); var oldStart = _this2.localeDayjs(new Date(item.start)); var oldEnd = _this2.localeDayjs(new Date(item.end)); var rule = (0, _rrule.rrulestr)(item.rrule); var oldDtstart; var oldUntil = rule.origOptions.until || windowEnd.toDate(); if (rule.origOptions.dtstart) { oldDtstart = _this2.localeDayjs(new Date(rule.origOptions.dtstart)); } // rule.origOptions.dtstart = oldStart.toDate(); if (windowEnd < oldUntil) { rule.origOptions.until = windowEnd.toDate(); } // reload rule = (0, _rrule.rrulestr)(rule.toString()); if (item.exdates || item.exrule) { var rruleSet = new _rrule.RRuleSet(); rruleSet.rrule(rule); if (item.exrule) { rruleSet.exrule((0, _rrule.rrulestr)(item.exrule)); } if (item.exdates) { item.exdates.forEach(function (exdate) { rruleSet.exdate(_this2.localeDayjs(exdate).toDate()); }); } rule = rruleSet; } var all = rule.between(new Date(windowStart), new Date(windowEnd)); all.forEach(function (time, index) { var newEvent = _objectSpread(_objectSpread({}, item), {}, { recurringEventId: item.id, recurringEventStart: item.start, recurringEventEnd: item.end, id: "".concat(item.id, "-").concat(index), start: rule.origOptions.tzid ? _this2.localeDayjs.utc(time).utcOffset(_this2.localeDayjs(new Date()).utcOffset(), true).format(_default.DATETIME_FORMAT) : _this2.localeDayjs(new Date(time)).format(_default.DATETIME_FORMAT), end: rule.origOptions.tzid ? _this2.localeDayjs.utc(time).utcOffset(_this2.localeDayjs(new Date()).utcOffset(), true).add(oldEnd.diff(oldStart), 'ms').add(_this2.localeDayjs(new Date(oldUntil)).utcOffset() - _this2.localeDayjs(new Date(item.start)).utcOffset(), 'm').format(_default.DATETIME_FORMAT) : _this2.localeDayjs(new Date(time)).add(oldEnd.diff(oldStart), 'ms').format(_default.DATETIME_FORMAT) }); var eventStart = _this2.localeDayjs(newEvent.start); var eventEnd = _this2.localeDayjs(newEvent.end); if (_this2.isEventInTimeWindow(eventStart, eventEnd, windowStart, windowEnd) && (!oldDtstart || eventStart >= oldDtstart)) { _this2._attachEvent(newEvent); } }); }); } }, { key: "_resolveDate", value: function _resolveDate(num) { var _this3 = this; var date = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined; if (date !== undefined) { this.selectDate = this.localeDayjs(date); } var setStartAndEndDates = function setStartAndEndDates(unit) { _this3.startDate = date !== undefined ? _this3.selectDate.startOf(unit) : _this3.startDate.add(num, "".concat(unit, "s")); _this3.endDate = _this3.startDate.endOf(unit); }; switch (this.viewType) { case _default.ViewType.Week: if (date !== undefined) { this.startDate = this.selectDate.startOf('isoWeek'); } else { this.startDate = this.startDate.add(num, 'weeks'); } this.endDate = this.startDate.endOf('isoWeek'); break; case _default.ViewType.Day: this.startDate = date !== undefined ? this.selectDate : this.startDate.add(num, 'days'); this.endDate = this.startDate; break; case _default.ViewType.Month: setStartAndEndDates('month'); break; case _default.ViewType.Quarter: setStartAndEndDates('quarter'); break; case _default.ViewType.Year: setStartAndEndDates('year'); break; case _default.ViewType.Custom: case _default.ViewType.Custom1: case _default.ViewType.Custom2: if (this.behaviors.getCustomDateFunc !== undefined) { var customDate = this.behaviors.getCustomDateFunc(this, num, date); this.startDate = this.localeDayjs(customDate.startDate); this.endDate = this.localeDayjs(customDate.endDate); if (customDate.cellUnit) { this.cellUnit = customDate.cellUnit; } } else { throw new Error('This is a custom view type, set behaviors.getCustomDateFunc func ' + 'to resolve the time window (startDate and endDate) yourself'); } break; default: break; } } // Previous Code }, { key: "_createHeaders", value: function _createHeaders() { var headers = []; var start = this.localeDayjs(new Date(this.startDate)); var end = this.localeDayjs(new Date(this.endDate)); var header = start; if (this.showAgenda) { headers.push({ time: header.format(_default.DATETIME_FORMAT), nonWorkingTime: false }); } else if (this.cellUnit === _default.CellUnit.Hour) { if (start.hour() === 0) { start = start.add(this.config.dayStartFrom, 'hours'); } if (end.hour() === 0) { end = end.add(this.config.dayStopTo, 'hours'); } header = start; var prevHour = -1; while (header >= start && header <= end) { // prevent doubled hours on time change if (header.hour() === prevHour) { header = header.add(1, 'hours'); continue; } prevHour = header.hour(); var minuteSteps = this.getMinuteStepsInHour(); for (var i = 0; i < minuteSteps; i += 1) { var hour = header.hour(); if (hour >= this.config.dayStartFrom && hour <= this.config.dayStopTo) { var time = header.format(_default.DATETIME_FORMAT); var nonWorkingTime = this.behaviors.isNonWorkingTimeFunc(this, time); headers.push({ time: time, nonWorkingTime: nonWorkingTime }); } header = header.add(this.config.minuteStep, 'minutes'); } } } else if (this.cellUnit === _default.CellUnit.Day) { while (header >= start && header <= end) { var _time = header.format(_default.DATETIME_FORMAT); var dayOfWeek = header.day(); if (this.config.displayWeekend || dayOfWeek !== 0 && dayOfWeek !== 6) { var _nonWorkingTime = this.behaviors.isNonWorkingTimeFunc(this, _time); headers.push({ time: _time, nonWorkingTime: _nonWorkingTime }); } header = header.add(1, 'days'); } } else if (this.cellUnit === _default.CellUnit.Week) { while (header >= start && header <= end) { var _time2 = header.format(_default.DATE_FORMAT); headers.push({ time: _time2 }); header = header.add(1, 'weeks').startOf('isoWeek'); } } else if (this.cellUnit === _default.CellUnit.Month) { while (header >= start && header <= end) { var _time3 = header.format(_default.DATE_FORMAT); headers.push({ time: _time3 }); header = header.add(1, 'months').startOf('month'); } } else if (this.cellUnit === _default.CellUnit.Year) { while (header >= start && header <= end) { var _time4 = header.format(_default.DATE_FORMAT); headers.push({ time: _time4 }); header = header.add(1, 'years').startOf('year'); } } this.headers = headers; } }, { key: "_createInitHeaderEvents", value: function _createInitHeaderEvents(header) { var start = this.localeDayjs(new Date(header.time)); var startValue = start.format(_default.DATETIME_FORMAT); var endValue; if (this.showAgenda) { var incrementUnit = _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty({}, _default.ViewType.Day, 'days'), _default.ViewType.Week, 'weeks'), _default.ViewType.Month, 'months'), _default.ViewType.Year, 'years'), _default.ViewType.Quarter, 'quarters')[this.viewType] || 'days'; if (incrementUnit === 'days') { endValue = this.localeDayjs(new Date(this.endDate)).add(1, 'days').format(_default.DATETIME_FORMAT); } else { endValue = start.add(1, incrementUnit).format(_default.DATETIME_FORMAT); } } else { var _incrementUnit = _defineProperty(_defineProperty(_defineProperty(_defineProperty({}, _default.CellUnit.Hour, 'minutes'), _default.CellUnit.Week, 'weeks'), _default.CellUnit.Month, 'months'), _default.CellUnit.Year, 'years')[this.cellUnit] || 'days'; endValue = start.add(_incrementUnit === 'minutes' ? this.config.minuteStep : 1, _incrementUnit).format(this.cellUnit === _default.CellUnit.Year || this.cellUnit === _default.CellUnit.Month || this.cellUnit === _default.CellUnit.Week ? _default.DATE_FORMAT : _default.DATETIME_FORMAT); } return { time: header.time, nonWorkingTime: header.nonWorkingTime, start: startValue, end: endValue, count: 0, addMore: 0, addMoreIndex: 0, events: Array(3) }; } }, { key: "_createHeaderEvent", value: function _createHeaderEvent(render, span, eventItem) { return { render: render, span: span, eventItem: eventItem }; } }, { key: "_getEventSlotId", value: function _getEventSlotId(event) { return this.isEventPerspective ? this._getEventGroupId(event) : event.resourceId; } }, { key: "_getEventGroupId", value: function _getEventGroupId(event) { return event.groupId ? event.groupId.toString() : event.id.toString(); } }, { key: "_getEventGroupName", value: function _getEventGroupName(event) { return event.groupName ? event.groupName : event.title; } }, { key: "_generateEventGroups", value: function _generateEventGroups() { var _this4 = this; var eventGroups = []; var set = new Set(); this.events.forEach(function (item) { var groupId = _this4._getEventGroupId(item); var groupName = _this4._getEventGroupName(item); if (!set.has(groupId)) { eventGroups.push({ id: groupId, name: groupName, state: item }); set.add(groupId); } }); this.eventGroups = eventGroups; } }, { key: "_createInitRenderData", value: function _createInitRenderData(isEventPerspective, eventGroups, resources, headers) { var _this5 = this; var slots = isEventPerspective ? eventGroups : resources; var slotTree = []; var slotMap = new Map(); slots.forEach(function (slot) { var headerEvents = headers.map(function (header) { return _this5._createInitHeaderEvents(header); }); var slotRenderData = _objectSpread(_objectSpread({}, slot), {}, { slotId: slot.id, slotName: slot.name, slotTitle: slot.title, parentId: slot.parentId, groupOnly: slot.groupOnly, hasSummary: false, rowMaxCount: 0, rowHeight: _this5.config.nonAgendaSlotMinHeight !== 0 ? _this5.config.nonAgendaSlotMinHeight : _this5.config.eventItemLineHeight + 2, headerItems: headerEvents, indent: 0, hasChildren: false, expanded: true, render: true }); var id = slot.id; var value; if (slotMap.has(id)) { value = slotMap.get(id); value.data = slotRenderData; } else { value = { data: slotRenderData, children: [] }; slotMap.set(id, value); } var parentId = slot.parentId; if (!parentId || parentId === id) { slotTree.push(value); } else { var parentValue; if (slotMap.has(parentId)) { parentValue = slotMap.get(parentId); } else { parentValue = { data: undefined, children: [] }; slotMap.set(parentId, parentValue); } parentValue.children.push(value); } }); var slotStack = []; var i; for (i = slotTree.length - 1; i >= 0; i -= 1) { slotStack.push(slotTree[i]); } var initRenderData = []; var currentNode; while (slotStack.length > 0) { currentNode = slotStack.pop(); if (currentNode.data.indent > 0) { currentNode.data.render = this.config.defaultExpanded; } if (currentNode.children.length > 0) { currentNode.data.hasChildren = true; currentNode.data.expanded = this.config.defaultExpanded; } initRenderData.push(currentNode.data); for (i = currentNode.children.length - 1; i >= 0; i -= 1) { currentNode.children[i].data.indent = currentNode.data.indent + 1; slotStack.push(currentNode.children[i]); } } return initRenderData; } }, { key: "_getSpan", value: function _getSpan(startTime, endTime, headers) { if (this.showAgenda) return 1; var timeBetween = function timeBetween(date1, date2, timeIn) { if (timeIn === 'days' || timeIn === 'day') { if (date1.getDate() === date2.getDate() && date1.getMonth() === date2.getMonth() && date1.getFullYear() === date2.getFullYear()) { return 1; } } var one; switch (timeIn) { case 'days': case 'day': one = 1000 * 60 * 60 * 24; break; case 'minutes': case 'minute': one = 1000 * 60; break; default: return 0; } var date1Ms = date1.getTime(); var date2Ms = date2.getTime(); var diff = (date2Ms - date1Ms) / one; return diff < 0 ? 0 : diff; }; var eventStart = new Date(startTime); var eventEnd = new Date(endTime); var span = 0; var windowStart = new Date(this.startDate); var windowEnd = new Date(this.endDate); windowStart.setHours(0, 0, 0, 0); windowEnd.setHours(23, 59, 59); if (this.viewType === _default.ViewType.Day) { if (headers.length > 0) { var day = new Date(headers[0].time); if (day.getDate() > eventStart.getDate() && day.getDate() < eventEnd.getDate()) { span = 1440 / this.config.minuteStep; } else if (day.getDate() > eventStart.getDate() && day.getDate() === eventEnd.getDate()) { span = Math.ceil(timeBetween(day, eventEnd, 'minutes') / this.config.minuteStep); } else if (day.getDate() === eventStart.getDate() && day.getDate() < eventEnd.getDate()) { day.setHours(23, 59, 59); span = Math.ceil(timeBetween(eventStart, day, 'minutes') / this.config.minuteStep); } else if (day.getDate() === eventStart.getDate() && day.getDate() === eventEnd.getDate() || eventEnd.getDate() === eventStart.getDate()) { span = Math.ceil(timeBetween(eventStart, eventEnd, 'minutes') / this.config.minuteStep); } } } else if (this.viewType === _default.ViewType.Week || this.viewType === _default.ViewType.Month || this.viewType === _default.ViewType.Quarter || this.viewType === _default.ViewType.Year) { var startDate = windowStart < eventStart ? eventStart : windowStart; var endDate = windowEnd > eventEnd ? eventEnd : windowEnd; startDate.setHours(0, 0, 0, 0); // Only extend to end-of-day if the event does not end exactly at midnight // (midnight = start of the day, treated as exclusive by the header-item check) if (endDate.getHours() !== 0 || endDate.getMinutes() !== 0 || endDate.getSeconds() !== 0) { endDate.setHours(23, 59, 59, 0); } else { endDate.setDate(endDate.getDate() - 1); endDate.setHours(23, 59, 59, 0); } span = Math.ceil(timeBetween(startDate, endDate, 'days')); } else { if (this.cellUnit === _default.CellUnit.Day) { eventEnd.setHours(23, 59, 59); eventStart.setHours(0, 0, 0, 0); } var timeIn = this.cellUnit === _default.CellUnit.Day ? 'days' : 'minutes'; var dividedBy = this.cellUnit === _default.CellUnit.Day ? 1 : this.config.minuteStep; if (windowStart >= eventStart && eventEnd <= windowEnd) { span = Math.ceil(timeBetween(windowStart, eventEnd, timeIn) / dividedBy); } else if (windowStart > eventStart && eventEnd > windowEnd) { span = Math.ceil(timeBetween(windowStart, windowEnd, timeIn) / dividedBy); } else if (windowStart <= eventStart && eventEnd >= windowEnd) { span = Math.ceil(timeBetween(eventStart, windowEnd, timeIn) / dividedBy); } else { span = Math.ceil(timeBetween(eventStart, eventEnd, timeIn) / dividedBy); } } return span; } }, { key: "_validateResource", value: function _validateResource(resources) { if (Object.prototype.toString.call(resources) !== '[object Array]') { throw new Error('Resources should be Array object'); } resources.forEach(function (item, index) { if (item === undefined) { console.error("Resource undefined: ".concat(index)); throw new Error("Resource undefined: ".concat(index)); } if (item.id === undefined || item.name === undefined) { console.error('Resource property missed', index, item); throw new Error("Resource property undefined: ".concat(index)); } }); } }, { key: "_validateEventGroups", value: function _validateEventGroups(eventGroups) { if (Object.prototype.toString.call(eventGroups) !== '[object Array]') { throw new Error('Event groups should be Array object'); } eventGroups.forEach(function (item, index) { if (item === undefined) { console.error("Event group undefined: ".concat(index)); throw new Error("Event group undefined: ".concat(index)); } if (item.id === undefined || item.name === undefined) { console.error('Event group property missed', index, item); throw new Error("Event group property undefined: ".concat(index)); } }); } }, { key: "_validateEvents", value: function _validateEvents(events) { if (Object.prototype.toString.call(events) !== '[object Array]') { throw new Error('Events should be Array object'); } events.forEach(function (e, index) { if (e === undefined) { console.error("Event undefined: ".concat(index)); throw new Error("Event undefined: ".concat(index)); } if (e.id === undefined || e.resourceId === undefined || e.title === undefined || e.start === undefined || e.end === undefined) { console.error('Event property missed', index, e); throw new Error("Event property undefined: ".concat(index)); } }); } }, { key: "_validateMinuteStep", value: function _validateMinuteStep(minuteStep) { if (60 % minuteStep !== 0) { console.error('Minute step is not set properly - 60 minutes must be divisible without remainder by this number'); throw new Error('Minute step is not set properly - 60 minutes must be divisible without remainder by this number'); } } }, { key: "_compare", value: function _compare(event1, event2) { var start1 = this.localeDayjs(event1.start); var start2 = this.localeDayjs(event2.start); if (start1 !== start2) return start1 < start2 ? -1 : 1; var end1 = this.localeDayjs(event1.end); var end2 = this.localeDayjs(event2.end); if (end1 !== end2) return end1 < end2 ? -1 : 1; return event1.id < event2.id ? -1 : 1; } }, { key: "_createRenderData", value: function _createRenderData() { var _this6 = this; var initRenderData = this._createInitRenderData(this.isEventPerspective, this.eventGroups, this.resources, this.headers); // this.events.sort(this._compare); var cellMaxEventsCount = this.getCellMaxEvents(); var cellMaxEventsCountValue = 30; this.events.forEach(function (item) { var resourceEventsList = initRenderData.filter(function (x) { return x.slotId === _this6._getEventSlotId(item); }); if (resourceEventsList.length > 0) { var resourceEvents = resourceEventsList[0]; var span = _this6._getSpan(item.start, item.end, _this6.headers); var eventStart = new Date(item.start); var eventEnd = new Date(item.end); var pos = -1; resourceEvents.headerItems.forEach(function (header, index) { var headerStart = new Date(header.start); var headerEnd = new Date(header.end); if (headerEnd > eventStart && headerStart < eventEnd) { header.count += 1; if (header.count > resourceEvents.rowMaxCount) { resourceEvents.rowMaxCount = header.count; var rowsCount = cellMaxEventsCount <= cellMaxEventsCountValue && resourceEvents.rowMaxCount > cellMaxEventsCount ? cellMaxEventsCount : resourceEvents.rowMaxCount; var newRowHeight = rowsCount * _this6.config.eventItemLineHeight + (_this6.config.creatable && _this6.config.checkConflict === false ? 20 : 2); if (newRowHeight > resourceEvents.rowHeight) resourceEvents.rowHeight = newRowHeight; } if (pos === -1) { var tmp = 0; while (header.events[tmp