@syncfusion/ej2-schedule 27.1.55 → 27.1.57

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -66,6 +66,14 @@ const cellSelect = 'cellSelect';
66
66
  const virtualScrollStart = 'virtualScrollStart';
67
67
  /** @private */
68
68
  const virtualScrollStop = 'virtualScrollStop';
69
+ /** @private */
70
+ const noEvents = 'noEvents';
71
+ /** @private */
72
+ const agendaCells = 'agendaCells';
73
+ /** @private */
74
+ const resourceHeader = 'resourceHeader';
75
+ /** @private */
76
+ const dateHeader = 'dateHeader';
69
77
  /**
70
78
  * Specifies schedule internal events
71
79
  */
@@ -4031,7 +4039,7 @@ function generate(startDate, rule, excludeDate, startDayOfWeek, maximumCount = M
4031
4039
  dailyType(modifiedDate, ruleObject.until, data, ruleObject);
4032
4040
  break;
4033
4041
  case 'WEEKLY':
4034
- weeklyType(modifiedDate, ruleObject.until, data, ruleObject);
4042
+ weeklyType(modifiedDate, ruleObject.until, data, ruleObject, startDayOfWeek);
4035
4043
  break;
4036
4044
  case 'MONTHLY':
4037
4045
  monthlyType(modifiedDate, ruleObject.until, data, ruleObject);
@@ -4134,10 +4142,11 @@ function dailyType(startDate, endDate, data, ruleObject) {
4134
4142
  * @param {Date} endDate Accepts the end date
4135
4143
  * @param {number[]} data Accepts the collection of dates
4136
4144
  * @param {RecRule} ruleObject Accepts the recurrence rule object
4145
+ * @param {number} startDayOfWeek Accepts the start day index of week
4137
4146
  * @returns {void}
4138
4147
  * @private
4139
4148
  */
4140
- function weeklyType(startDate, endDate, data, ruleObject) {
4149
+ function weeklyType(startDate, endDate, data, ruleObject, startDayOfWeek) {
4141
4150
  let tempDate = new Date(startDate.getTime());
4142
4151
  if (!ruleObject.day.length) {
4143
4152
  ruleObject.day.push(DAYINDEX[startDate.getDay()]);
@@ -4186,7 +4195,7 @@ function weeklyType(startDate, endDate, data, ruleObject) {
4186
4195
  }
4187
4196
  else {
4188
4197
  tempDate = getStartDateForWeek(startDate, ruleObject.day);
4189
- if (interval > 1 && dayIndex.indexOf(ruleObject.day[0]) < startDate.getDay()) {
4198
+ if (interval > 1 && dayIndex.indexOf(ruleObject.day[0]) < (startDate.getDay() - startDayOfWeek)) {
4190
4199
  tempDate.setDate(tempDate.getDate() + ((interval - 1) * 7));
4191
4200
  }
4192
4201
  while (compareDates(tempDate, endDate)) {
@@ -6056,11 +6065,14 @@ class EventBase {
6056
6065
  if (eventsData.length > 0) {
6057
6066
  const selectedObject = eventsData[eventsData.length - 1];
6058
6067
  const eventStartTime = selectedObject[this.parent.eventFields.startTime];
6059
- let nearestTime = new Date(+eventStartTime).setMinutes(0, 0, 0);
6068
+ let nearestTime;
6060
6069
  const isAllDay = this.isAllDayAppointment(selectedObject);
6061
- if (this.parent.currentView === 'Month' || isAllDay) {
6070
+ if (this.parent.currentView === 'Month' || isAllDay || !this.parent.activeViewOptions.timeScale.enable) {
6062
6071
  nearestTime = new Date(+eventStartTime).setHours(0, 0, 0, 0);
6063
6072
  }
6073
+ else {
6074
+ nearestTime = this.findNearestSlot(eventStartTime);
6075
+ }
6064
6076
  let targetArea;
6065
6077
  if (isAllDay && ['Day', 'Week', 'WorkWeek'].indexOf(this.parent.currentView) !== -1) {
6066
6078
  targetArea = this.parent.getAllDayRow();
@@ -6069,7 +6081,8 @@ class EventBase {
6069
6081
  targetArea = this.parent.getContentTable();
6070
6082
  }
6071
6083
  let queryString = '[data-date="' + new Date(nearestTime).getTime() + '"]';
6072
- if (this.parent.activeViewOptions.group.resources.length > 0) {
6084
+ if (!isNullOrUndefined(this.parent.activeViewOptions.group.resources) &&
6085
+ this.parent.activeViewOptions.group.resources.length > 0) {
6073
6086
  queryString += '[data-group-index="' + this.getGroupIndexFromEvent(selectedObject) + '"]';
6074
6087
  }
6075
6088
  target = targetArea.querySelector(queryString);
@@ -6083,6 +6096,25 @@ class EventBase {
6083
6096
  }
6084
6097
  return target;
6085
6098
  }
6099
+ findNearestSlot(appointmentTime) {
6100
+ const msMajorInterval = this.parent.activeViewOptions.timeScale.interval * MS_PER_MINUTE;
6101
+ const msInterval = msMajorInterval / this.parent.activeViewOptions.timeScale.slotCount;
6102
+ const numberOfSlots = Math.round(MS_PER_DAY / msInterval);
6103
+ const startTime = new Date(appointmentTime);
6104
+ startTime.setHours(0, 0, 0, 0);
6105
+ const slots = Array.from({ length: numberOfSlots }, (_, i) => {
6106
+ const slotTime = new Date(startTime.getTime() + i * msInterval);
6107
+ return slotTime;
6108
+ });
6109
+ const nearestSlot = slots.reduce((nearest, slot) => {
6110
+ const difference = Math.abs(appointmentTime.getTime() - slot.getTime());
6111
+ if (!nearest || difference < Math.abs(appointmentTime.getTime() - nearest.getTime())) {
6112
+ return slot;
6113
+ }
6114
+ return nearest;
6115
+ }, null);
6116
+ return Math.trunc(nearestSlot.getTime() / 1000) * 1000;
6117
+ }
6086
6118
  getGroupIndexFromEvent(eventData) {
6087
6119
  let levelIndex;
6088
6120
  let resource;
@@ -6371,7 +6403,7 @@ class EventBase {
6371
6403
  const newTimezone = this.parent.timezone || this.parent.tzModule.getLocalTimezoneName();
6372
6404
  const firstDay = this.parent.activeViewOptions.firstDayOfWeek;
6373
6405
  const calendarMode = this.parent.calendarMode;
6374
- if (event[this.parent.eventFields.recurrenceRule] && event[this.parent.eventFields.recurrenceRule].includes('BYMONTHDAY') &&
6406
+ if (event[this.parent.eventFields.recurrenceRule] && this.isDayBasedRecurrence(event) &&
6375
6407
  this.parent.timezone && event[this.parent.eventFields.startTimezone] && event[this.parent.eventFields.endTimezone]) {
6376
6408
  startDate = this.parent.tzModule.convert(event[this.parent.eventFields.startTime], this.parent.timezone, event[this.parent.eventFields.startTimezone]);
6377
6409
  }
@@ -6391,7 +6423,7 @@ class EventBase {
6391
6423
  }
6392
6424
  let isDSTAdjusted = false;
6393
6425
  let convertedDates = [];
6394
- if (event[this.parent.eventFields.recurrenceRule] && event[this.parent.eventFields.recurrenceRule].includes('BYMONTHDAY') &&
6426
+ if (event[this.parent.eventFields.recurrenceRule] && this.isDayBasedRecurrence(event) &&
6395
6427
  this.parent.timezone && event[this.parent.eventFields.startTimezone] && event[this.parent.eventFields.endTimezone]) {
6396
6428
  isDSTAdjusted = true;
6397
6429
  convertedDates.push(...dates.map((date) => this.parent.tzModule.convert(new Date(date), event[this.parent.eventFields.startTimezone], this.parent.timezone).getTime()));
@@ -6411,6 +6443,10 @@ class EventBase {
6411
6443
  }
6412
6444
  return occurrenceCollection;
6413
6445
  }
6446
+ isDayBasedRecurrence(event) {
6447
+ return (event[this.parent.eventFields.recurrenceRule].includes('BYMONTHDAY')
6448
+ || event[this.parent.eventFields.recurrenceRule].includes('BYDAY'));
6449
+ }
6414
6450
  getDSTAdjustedTime(date, event) {
6415
6451
  let occurDate = date;
6416
6452
  if (this.parent.timezone &&
@@ -25934,12 +25970,24 @@ class AgendaBase extends ViewBase {
25934
25970
  }
25935
25971
  else if (data.type === 'eventColumn') {
25936
25972
  const elementType = (data.eventData.length === 0) ? 'noEvents' : 'data';
25973
+ for (let i = 0; i < ntr.childNodes.length; i++) {
25974
+ const currentElement = ntr.childNodes.item(i);
25975
+ const renderCellElementType = currentElement.classList.contains('e-resource-column') ?
25976
+ resourceHeader : dateHeader;
25977
+ this.parent.trigger(renderCell, {
25978
+ elementType: renderCellElementType, element: currentElement, date: data.date, groupIndex: data.groupIndex
25979
+ });
25980
+ }
25937
25981
  ntd = this.createAgendaContentElement(elementType, data.eventData, ntd, data.groupOrder, data.groupIndex);
25938
25982
  ntd.setAttribute('data-date', data.date.getTime().toString());
25939
25983
  if (this.parent.activeViewOptions.group.byDate || this.parent.currentView === 'MonthAgenda') {
25940
25984
  addClass([ntd], [AGENDA_CELLS_CLASS, AGENDA_DAY_PADDING_CLASS]);
25941
25985
  }
25942
25986
  ntr.appendChild(ntd);
25987
+ const renderCellType = (data.eventData.length === 0) ? noEvents : agendaCells;
25988
+ this.parent.trigger(renderCell, {
25989
+ elementType: renderCellType, element: ntd, date: data.date, groupIndex: data.groupIndex
25990
+ });
25943
25991
  }
25944
25992
  else {
25945
25993
  ntd.setAttribute('rowspan', data.rowSpan.toString());
@@ -25980,15 +26028,18 @@ class AgendaBase extends ViewBase {
25980
26028
  }
25981
26029
  return dateHeader;
25982
26030
  }
25983
- renderEmptyContent(tBody, agendaDate) {
26031
+ renderEmptyContent(tBody, agendaDate, hasNoEvents) {
25984
26032
  const eTr = this.createTableRowElement(agendaDate, 'noEvents');
25985
26033
  const eTd = eTr.children[0];
25986
- const noEvents = createElement('div', {
26034
+ const noEvents$1 = createElement('div', {
25987
26035
  className: AGENDA_EMPTY_EVENT_CLASS,
25988
26036
  innerHTML: this.parent.localeObj.getConstant('noEvents')
25989
26037
  });
25990
- eTd.appendChild(noEvents);
26038
+ eTd.appendChild(noEvents$1);
25991
26039
  tBody.appendChild(eTr);
26040
+ if (hasNoEvents) {
26041
+ this.parent.trigger(renderCell, { elementType: noEvents, element: eTd, date: agendaDate });
26042
+ }
25992
26043
  }
25993
26044
  createTableRowElement(date, type) {
25994
26045
  const daysCount = getDaysCount(this.parent.selectedDate.getTime(), date.getTime());
@@ -26135,7 +26186,7 @@ class Agenda extends AgendaBase {
26135
26186
  }
26136
26187
  }
26137
26188
  if (tBody.childNodes.length <= 0) {
26138
- this.renderEmptyContent(tBody, agendaDate);
26189
+ this.renderEmptyContent(tBody, agendaDate, true);
26139
26190
  }
26140
26191
  }
26141
26192
  renderContent(tBody, agendaDate, lastDate) {
@@ -26192,11 +26243,15 @@ class Agenda extends AgendaBase {
26192
26243
  const elementType = (!this.parent.hideEmptyAgendaDays && filterData.length === 0) ? 'noEvents' : 'data';
26193
26244
  dTd.appendChild(this.createDateHeaderElement(agendaDate));
26194
26245
  nTr.appendChild(dTd);
26246
+ this.parent.trigger(renderCell, { elementType: dateHeader, element: dTd, date: agendaDate });
26195
26247
  const cTd = this.createAgendaContentElement(elementType, filterData, aTd);
26196
26248
  nTr.appendChild(cTd);
26197
26249
  if (cTd.querySelectorAll('li').length > 0) {
26198
26250
  tBody.appendChild(nTr);
26199
26251
  }
26252
+ const renderCellElementType = (!this.parent.hideEmptyAgendaDays && filterData.length === 0) ?
26253
+ noEvents : agendaCells;
26254
+ this.parent.trigger(renderCell, { elementType: renderCellElementType, element: cTd, date: agendaDate });
26200
26255
  }
26201
26256
  else if (this.parent.activeViewOptions.allowVirtualScrolling) {
26202
26257
  day--;
@@ -28279,5 +28334,5 @@ class Print {
28279
28334
  }
28280
28335
  }
28281
28336
 
28282
- export { Agenda, DEFAULT_WEEKS, Day, DragAndDrop, ExcelExport, Gregorian, HeaderRenderer, ICalendarExport, ICalendarImport, Islamic, MS_PER_DAY, MS_PER_MINUTE, Month, MonthAgenda, Print, RecurrenceEditor, Resize, Schedule, TimelineMonth, TimelineViews, TimelineYear, Timezone, ViewBase, WEEK_LENGTH, Week, WorkWeek, Year, actionBegin, actionComplete, actionFailure, addDays, addMonths, addYears, capitalizeFirstWord, cellClick, cellDoubleClick, cellMouseDown, cellSelect, contentReady, dataBinding, dataBound, dataReady, documentClick, drag, dragStart, dragStop, eventClick, eventDoubleClick, eventRendered, eventsLoaded, extractObjectFromRule, findIndexInData, firstDateOfMonth, generate, generateSummary, getCalendarUtil, getDateCount, getDateFromRecurrenceDateString, getDateFromString, getDateInMs, getDaysCount, getElementHeight, getElementHeightFromClass, getElementTop, getElementWidth, getElementWidthFromClass, getMaxDays, getOuterHeight, getRecurrenceStringFromDate, getScrollBarWidth, getStartEndHours, getTranslateX, getTranslateY, getUniversalTime, getWeekFirstDate, getWeekLastDate, getWeekMiddleDate, getWeekNumber, hover, initialEnd, initialLoad, inlineClick, isDaylightSavingTime, isIPadDevice, isMobile, lastDateOfMonth, moreEventsClick, navigating, popupClose, popupOpen, print, removeChildren, renderCell, resetScrollbarWidth, resetTime, resizeStart, resizeStop, resizing, scroll, scrollUiUpdate, select, setTime, timezoneData, uiUpdate, virtualScroll, virtualScrollStart, virtualScrollStop };
28337
+ export { Agenda, DEFAULT_WEEKS, Day, DragAndDrop, ExcelExport, Gregorian, HeaderRenderer, ICalendarExport, ICalendarImport, Islamic, MS_PER_DAY, MS_PER_MINUTE, Month, MonthAgenda, Print, RecurrenceEditor, Resize, Schedule, TimelineMonth, TimelineViews, TimelineYear, Timezone, ViewBase, WEEK_LENGTH, Week, WorkWeek, Year, actionBegin, actionComplete, actionFailure, addDays, addMonths, addYears, agendaCells, capitalizeFirstWord, cellClick, cellDoubleClick, cellMouseDown, cellSelect, contentReady, dataBinding, dataBound, dataReady, dateHeader, documentClick, drag, dragStart, dragStop, eventClick, eventDoubleClick, eventRendered, eventsLoaded, extractObjectFromRule, findIndexInData, firstDateOfMonth, generate, generateSummary, getCalendarUtil, getDateCount, getDateFromRecurrenceDateString, getDateFromString, getDateInMs, getDaysCount, getElementHeight, getElementHeightFromClass, getElementTop, getElementWidth, getElementWidthFromClass, getMaxDays, getOuterHeight, getRecurrenceStringFromDate, getScrollBarWidth, getStartEndHours, getTranslateX, getTranslateY, getUniversalTime, getWeekFirstDate, getWeekLastDate, getWeekMiddleDate, getWeekNumber, hover, initialEnd, initialLoad, inlineClick, isDaylightSavingTime, isIPadDevice, isMobile, lastDateOfMonth, moreEventsClick, navigating, noEvents, popupClose, popupOpen, print, removeChildren, renderCell, resetScrollbarWidth, resetTime, resizeStart, resizeStop, resizing, resourceHeader, scroll, scrollUiUpdate, select, setTime, timezoneData, uiUpdate, virtualScroll, virtualScrollStart, virtualScrollStop };
28283
28338
  //# sourceMappingURL=ej2-schedule.es2015.js.map