@syncfusion/ej2-schedule 20.1.61 → 20.2.36

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.
Files changed (76) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/ej2-schedule.umd.min.js +2 -2
  3. package/dist/ej2-schedule.umd.min.js.map +1 -1
  4. package/dist/es6/ej2-schedule.es2015.js +165 -40
  5. package/dist/es6/ej2-schedule.es2015.js.map +1 -1
  6. package/dist/es6/ej2-schedule.es5.js +170 -40
  7. package/dist/es6/ej2-schedule.es5.js.map +1 -1
  8. package/dist/global/ej2-schedule.min.js +2 -2
  9. package/dist/global/ej2-schedule.min.js.map +1 -1
  10. package/dist/global/index.d.ts +1 -1
  11. package/helpers/e2e/index.js +9 -7
  12. package/helpers/e2e/recurrence-editor.js +41 -25
  13. package/helpers/e2e/schedule.js +44 -28
  14. package/package.json +15 -15
  15. package/src/recurrence-editor/recurrence-editor.js +4 -1
  16. package/src/schedule/actions/crud.js +9 -7
  17. package/src/schedule/base/interface.d.ts +6 -0
  18. package/src/schedule/base/schedule.d.ts +8 -0
  19. package/src/schedule/base/schedule.js +66 -0
  20. package/src/schedule/event-renderer/agenda-base.js +6 -6
  21. package/src/schedule/event-renderer/event-base.js +4 -4
  22. package/src/schedule/event-renderer/month.js +2 -3
  23. package/src/schedule/event-renderer/vertical-view.js +3 -3
  24. package/src/schedule/event-renderer/year.js +2 -2
  25. package/src/schedule/exports/excel-export.js +8 -4
  26. package/src/schedule/popups/event-window.js +2 -1
  27. package/src/schedule/popups/quick-popups.js +3 -3
  28. package/src/schedule/renderer/agenda.js +2 -2
  29. package/src/schedule/renderer/timeline-month.d.ts +1 -0
  30. package/src/schedule/renderer/timeline-month.js +9 -0
  31. package/src/schedule/renderer/timeline-view.d.ts +1 -0
  32. package/src/schedule/renderer/timeline-view.js +14 -0
  33. package/src/schedule/renderer/timeline-year.js +3 -0
  34. package/src/schedule/renderer/vertical-view.d.ts +1 -0
  35. package/src/schedule/renderer/vertical-view.js +21 -4
  36. package/src/schedule/renderer/view-base.d.ts +1 -0
  37. package/src/schedule/renderer/view-base.js +11 -0
  38. package/src/schedule/renderer/year.js +2 -1
  39. package/styles/bootstrap-dark.css +5 -1
  40. package/styles/bootstrap.css +5 -1
  41. package/styles/bootstrap4.css +5 -1
  42. package/styles/bootstrap5-dark.css +5 -1
  43. package/styles/bootstrap5.css +5 -1
  44. package/styles/fabric-dark.css +5 -1
  45. package/styles/fabric.css +5 -1
  46. package/styles/fluent-dark.css +7 -3
  47. package/styles/fluent.css +7 -3
  48. package/styles/highcontrast-light.css +5 -1
  49. package/styles/highcontrast.css +5 -1
  50. package/styles/material-dark.css +5 -1
  51. package/styles/material.css +5 -1
  52. package/styles/recurrence-editor/_fusionnew-definition.scss +15 -0
  53. package/styles/recurrence-editor/_material3-definition.scss +15 -0
  54. package/styles/schedule/_fluent-definition.scss +1 -1
  55. package/styles/schedule/_fusionnew-definition.scss +224 -0
  56. package/styles/schedule/_layout.scss +6 -1
  57. package/styles/schedule/_material3-definition.scss +224 -0
  58. package/styles/schedule/bootstrap-dark.css +5 -1
  59. package/styles/schedule/bootstrap.css +5 -1
  60. package/styles/schedule/bootstrap4.css +5 -1
  61. package/styles/schedule/bootstrap5-dark.css +5 -1
  62. package/styles/schedule/bootstrap5.css +5 -1
  63. package/styles/schedule/fabric-dark.css +5 -1
  64. package/styles/schedule/fabric.css +5 -1
  65. package/styles/schedule/fluent-dark.css +7 -3
  66. package/styles/schedule/fluent.css +7 -3
  67. package/styles/schedule/highcontrast-light.css +5 -1
  68. package/styles/schedule/highcontrast.css +5 -1
  69. package/styles/schedule/icons/_fusionnew.scss +232 -0
  70. package/styles/schedule/icons/_material3.scss +232 -0
  71. package/styles/schedule/material-dark.css +5 -1
  72. package/styles/schedule/material.css +5 -1
  73. package/styles/schedule/tailwind-dark.css +5 -1
  74. package/styles/schedule/tailwind.css +5 -1
  75. package/styles/tailwind-dark.css +5 -1
  76. package/styles/tailwind.css +5 -1
@@ -5600,7 +5600,7 @@ class EventBase {
5600
5600
  removeSelectedAppointmentClass() {
5601
5601
  const selectedAppointments = this.getSelectedAppointments();
5602
5602
  for (const appointment of selectedAppointments) {
5603
- appointment.setAttribute('aria-selected', 'false');
5603
+ appointment.setAttribute('aria-pressed', 'false');
5604
5604
  }
5605
5605
  removeClass(selectedAppointments, APPOINTMENT_BORDER);
5606
5606
  if (this.parent.currentView === 'Agenda' || this.parent.currentView === 'MonthAgenda') {
@@ -5609,7 +5609,7 @@ class EventBase {
5609
5609
  }
5610
5610
  addSelectedAppointments(cells) {
5611
5611
  for (const cell of cells) {
5612
- cell.setAttribute('aria-selected', 'true');
5612
+ cell.setAttribute('aria-pressed', 'true');
5613
5613
  }
5614
5614
  if (this.parent.currentView !== 'MonthAgenda') {
5615
5615
  this.parent.removeSelectedClass();
@@ -5946,7 +5946,7 @@ class EventBase {
5946
5946
  const exception = event[this.parent.eventFields.recurrenceException];
5947
5947
  let maxCount;
5948
5948
  if (this.parent.currentView !== 'Agenda' && isMaxCount) {
5949
- maxCount = getDateCount(this.parent.activeView.startDate(), this.parent.activeView.endDate()) + 1;
5949
+ maxCount = getDateCount(viewDate, this.parent.activeView.endDate()) + 1;
5950
5950
  }
5951
5951
  const newTimezone = this.parent.timezone || this.parent.tzModule.getLocalTimezoneName();
5952
5952
  const firstDay = this.parent.activeViewOptions.firstDayOfWeek;
@@ -6123,7 +6123,7 @@ class EventBase {
6123
6123
  className: BLOCK_APPOINTMENT_CLASS,
6124
6124
  attrs: {
6125
6125
  'data-id': 'Appointment_' + record[this.parent.eventFields.id],
6126
- 'aria-readonly': 'true', 'aria-selected': 'false'
6126
+ 'aria-disabled': 'true', 'aria-pressed': 'false'
6127
6127
  }
6128
6128
  });
6129
6129
  let templateElement;
@@ -6547,8 +6547,8 @@ class VerticalEvent extends EventBase {
6547
6547
  'data-guid': record.Guid,
6548
6548
  'role': 'button',
6549
6549
  'tabindex': '0',
6550
- 'aria-readonly': this.parent.eventBase.getReadonlyAttribute(record),
6551
- 'aria-selected': 'false',
6550
+ 'aria-disabled': this.parent.eventBase.getReadonlyAttribute(record),
6551
+ 'aria-pressed': 'false',
6552
6552
  'aria-grabbed': 'true',
6553
6553
  'aria-label': this.parent.getAnnouncementString(record)
6554
6554
  }
@@ -6643,7 +6643,7 @@ class VerticalEvent extends EventBase {
6643
6643
  });
6644
6644
  const moreIndicatorElement = createElement('div', {
6645
6645
  className: MORE_INDICATOR_CLASS,
6646
- attrs: { 'tabindex': '0', 'role': 'list', 'data-index': index.toString(), 'data-count': '1' },
6646
+ attrs: { 'tabindex': '0', 'data-index': index.toString(), 'data-count': '1' },
6647
6647
  innerHTML: '+1 ' + (this.parent.isAdaptive ? '' : this.parent.localeObj.getConstant('more'))
6648
6648
  });
6649
6649
  innerCountWrap.appendChild(moreIndicatorElement);
@@ -7436,7 +7436,7 @@ class MonthEvent extends EventBase {
7436
7436
  const attrs = {
7437
7437
  'data-id': 'Appointment_' + record[this.fields.id],
7438
7438
  'role': 'button', 'tabindex': '0',
7439
- 'aria-readonly': this.parent.eventBase.getReadonlyAttribute(record), 'aria-selected': 'false', 'aria-grabbed': 'true',
7439
+ 'aria-disabled': this.parent.eventBase.getReadonlyAttribute(record), 'aria-pressed': 'false', 'aria-grabbed': 'true',
7440
7440
  'aria-label': this.parent.getAnnouncementString(newRecord, eventSubject)
7441
7441
  };
7442
7442
  if (!isCloneElement) {
@@ -7726,8 +7726,7 @@ class MonthEvent extends EventBase {
7726
7726
  'tabindex': '0',
7727
7727
  'data-count': count.toString(),
7728
7728
  'data-start-date': startDate.getTime().toString(),
7729
- 'data-end-date': endDate.getTime().toString(),
7730
- 'role': 'list'
7729
+ 'data-end-date': endDate.getTime().toString()
7731
7730
  }
7732
7731
  });
7733
7732
  return moreIndicatorElement;
@@ -8893,8 +8892,8 @@ class QuickPopups {
8893
8892
  attrs: {
8894
8893
  'data-id': '' + eventData[fields.id],
8895
8894
  'data-guid': eventData.Guid, 'role': 'button', 'tabindex': '0',
8896
- 'aria-readonly': this.parent.eventBase.getReadonlyAttribute(eventData),
8897
- 'aria-selected': 'false', 'aria-grabbed': 'true', 'aria-label': this.parent.getAnnouncementString(eventData)
8895
+ 'aria-disabled': this.parent.eventBase.getReadonlyAttribute(eventData),
8896
+ 'aria-pressed': 'false', 'aria-grabbed': 'true', 'aria-label': this.parent.getAnnouncementString(eventData)
8898
8897
  }
8899
8898
  });
8900
8899
  let templateElement;
@@ -8985,7 +8984,7 @@ class QuickPopups {
8985
8984
  this.quickPopupHide();
8986
8985
  return;
8987
8986
  }
8988
- const targetEle = args.event.target;
8987
+ const targetEle = !isNullOrUndefined(args.event) ? args.event.target : args.element;
8989
8988
  if (this.parent.isAdaptive) {
8990
8989
  this.quickPopupHide();
8991
8990
  let newEventClone = this.parent.element.querySelector('.' + NEW_EVENT_CLASS);
@@ -10372,7 +10371,7 @@ let RecurrenceEditor = class RecurrenceEditor extends Component {
10372
10371
  value: VALUEFIELD
10373
10372
  },
10374
10373
  placeholder: this.localeObj.getConstant(REPEAT),
10375
- htmlAttributes: { 'title': this.localeObj.getConstant(REPEAT) },
10374
+ htmlAttributes: { 'title': this.localeObj.getConstant(REPEAT), role: 'option' },
10376
10375
  change: (args) => {
10377
10376
  self.setProperties({ selectedType: this.frequencies.indexOf(args.value) }, false);
10378
10377
  self.element.querySelector('.' + REPEATCONTENT).innerHTML =
@@ -10394,6 +10393,7 @@ let RecurrenceEditor = class RecurrenceEditor extends Component {
10394
10393
  text: TEXTFIELD,
10395
10394
  value: VALUEFIELD
10396
10395
  },
10396
+ htmlAttributes: { role: 'option' },
10397
10397
  change: (args) => {
10398
10398
  self.freshOnEndForm();
10399
10399
  self.updateEndOnForm(args.value);
@@ -10411,6 +10411,7 @@ let RecurrenceEditor = class RecurrenceEditor extends Component {
10411
10411
  text: TEXTFIELD,
10412
10412
  value: VALUEFIELD
10413
10413
  },
10414
+ htmlAttributes: { role: 'option' },
10414
10415
  index: 1,
10415
10416
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
10416
10417
  change: (args) => {
@@ -10430,6 +10431,7 @@ let RecurrenceEditor = class RecurrenceEditor extends Component {
10430
10431
  text: TEXTFIELD,
10431
10432
  value: VALUEFIELD
10432
10433
  },
10434
+ htmlAttributes: { role: 'option' },
10433
10435
  enableRtl: this.enableRtl,
10434
10436
  index: 7,
10435
10437
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
@@ -11528,6 +11530,7 @@ class EventWindow {
11528
11530
  resourceData.colorField + '}"></div><div class="e-resource-text">${' + resourceData.textField + '}</div></div>';
11529
11531
  if (resourceData.allowMultiple) {
11530
11532
  const listObj = new MultiSelect({
11533
+ enableRtl: this.parent.enableRtl,
11531
11534
  cssClass: this.parent.cssClass || '',
11532
11535
  dataSource: resourceData.dataSource,
11533
11536
  change: this.onMultiselectResourceChange.bind(this),
@@ -11585,7 +11588,7 @@ class EventWindow {
11585
11588
  query = (e.text !== '') ? query.where('Text', 'contains', e.text, true) : query;
11586
11589
  e.updateData(this.parent.timezoneDataSource, query);
11587
11590
  },
11588
- htmlAttributes: { 'title': this.getFieldLabel(value), 'name': fieldName },
11591
+ htmlAttributes: { 'title': this.getFieldLabel(value), 'name': fieldName, role: 'option' },
11589
11592
  floatLabelType: 'Always',
11590
11593
  placeholder: this.getFieldLabel(value),
11591
11594
  popupHeight: '230px'
@@ -13927,13 +13930,15 @@ class Crud {
13927
13930
  else {
13928
13931
  endDate = new Date(+followEvent[fields.startTime]);
13929
13932
  const newRecurrenceRule = followEvent[fields.recurrenceRule];
13930
- const startDate = parentEvent[fields.startTime];
13931
- const ruleException = (this.parent.currentAction === 'DeleteFollowingEvents') ? followEvent[fields.recurrenceException] : null;
13932
- const dateCollection = generate(startDate, newRecurrenceRule, ruleException, this.parent.activeViewOptions.firstDayOfWeek);
13933
- const untilDate = new Date(dateCollection.slice(-1)[0]);
13934
- untilDate.setHours(endDate.getHours(), endDate.getMinutes(), endDate.getSeconds());
13935
- endDate.setHours(startDate.getHours(), startDate.getMinutes(), startDate.getSeconds());
13936
- followEvent[fields.recurrenceRule] = this.getUpdatedRecurrenceRule(newRecurrenceRule, new Date(+untilDate), false);
13933
+ if (newRecurrenceRule) {
13934
+ const startDate = parentEvent[fields.startTime];
13935
+ const ruleException = (this.parent.currentAction === 'DeleteFollowingEvents') ? followEvent[fields.recurrenceException] : null;
13936
+ const dateCollection = generate(startDate, newRecurrenceRule, ruleException, this.parent.activeViewOptions.firstDayOfWeek);
13937
+ const untilDate = new Date(dateCollection.slice(-1)[0]);
13938
+ untilDate.setHours(endDate.getHours(), endDate.getMinutes(), endDate.getSeconds());
13939
+ endDate.setHours(startDate.getHours(), startDate.getMinutes(), startDate.getSeconds());
13940
+ followEvent[fields.recurrenceRule] = this.getUpdatedRecurrenceRule(newRecurrenceRule, new Date(+untilDate), false);
13941
+ }
13937
13942
  }
13938
13943
  parentEvent[fields.recurrenceRule] = this.getUpdatedRecurrenceRule(recurrenceRule, addDays(new Date(endDate.getTime()), -1), true);
13939
13944
  }
@@ -17628,6 +17633,67 @@ let Schedule = class Schedule extends Component {
17628
17633
  this.eventWindow.dialogClose();
17629
17634
  }
17630
17635
  }
17636
+ /**
17637
+ * To manually open the quick info popup based on cell or event details.
17638
+ *
17639
+ * @param {object} data Defines the cell or event data. If the data contains valid ID, it will open event quick info popup,
17640
+ * otherwise cell quick info popup displayed.
17641
+ * @returns {void}
17642
+ */
17643
+ openQuickInfoPopup(data) {
17644
+ if (this.currentView === 'Year' || isNullOrUndefined(data)) {
17645
+ return;
17646
+ }
17647
+ if (isNullOrUndefined(data[this.eventFields.id])) {
17648
+ if (this.currentView === 'Agenda' || this.currentView === 'MonthAgenda' || isNullOrUndefined(this.activeView)) {
17649
+ return;
17650
+ }
17651
+ const cellData = {
17652
+ startTime: this.activeCellsData.startTime = this.getDateTime(data[this.eventFields.startTime]),
17653
+ endTime: this.activeCellsData.endTime = this.getDateTime(data[this.eventFields.endTime]),
17654
+ isAllDay: this.activeCellsData.isAllDay =
17655
+ !isNullOrUndefined(data[this.eventFields.isAllDay]) ? data[this.eventFields.isAllDay] : false
17656
+ };
17657
+ const startTime = this.activeView.getAdjustedDate(new Date(cellData.startTime));
17658
+ if (startTime) {
17659
+ let query = '.' + WORK_CELLS_CLASS + '[data-date="' + startTime.getTime() + '"]';
17660
+ if (this.activeViewOptions.group.resources.length > 0 && !this.uiStateValues.isGroupAdaptive
17661
+ && this.resourceBase && this.eventBase) {
17662
+ cellData.groupIndex = this.eventBase.getGroupIndexFromEvent(data);
17663
+ query = '.' + WORK_CELLS_CLASS + '[data-date="' + startTime.getTime() + '"][data-group-index="' + cellData.groupIndex + '"]';
17664
+ }
17665
+ const workCell = this.element.querySelector(query);
17666
+ if (workCell) {
17667
+ workCell.focus();
17668
+ cellData.element = workCell;
17669
+ this.notify(cellClick, cellData);
17670
+ }
17671
+ }
17672
+ }
17673
+ else {
17674
+ const app = this.getCurrentViewEvents().filter((item) => data[this.eventFields.id] === item[this.eventFields.id]);
17675
+ if (app.length <= 0) {
17676
+ return;
17677
+ }
17678
+ let selectEvent = app[0];
17679
+ if (data[this.eventFields.recurrenceRule]) {
17680
+ const occurence = app.filter((x) => x[this.eventFields.startTime].getTime() === data[this.eventFields.startTime].getTime());
17681
+ if (occurence.length > 0) {
17682
+ selectEvent = occurence[0];
17683
+ }
17684
+ }
17685
+ const element = this.element.querySelector('div[data-guid="' + selectEvent.Guid + '"]');
17686
+ if (element) {
17687
+ this.eventBase.removeSelectedAppointmentClass();
17688
+ this.eventBase.addSelectedAppointments([element]);
17689
+ this.activeEventData = { event: selectEvent, element: element };
17690
+ if (this.currentView === 'Agenda' || this.currentView === 'MonthAgenda') {
17691
+ addClass([this.activeEventData.element], AGENDA_SELECTED_CELL);
17692
+ }
17693
+ this.notify(eventClick, this.activeEventData);
17694
+ }
17695
+ }
17696
+ }
17631
17697
  /**
17632
17698
  * To manually close the quick info popup
17633
17699
  *
@@ -19061,7 +19127,7 @@ class YearEvent extends TimelineEvent {
19061
19127
  }
19062
19128
  }
19063
19129
  timelineYearViewEvents() {
19064
- const workCell = this.parent.element.querySelector('.' + WORK_CELLS_CLASS);
19130
+ const workCell = this.parent.element.querySelector('.' + WORK_CELLS_CLASS + ':not(.' + OTHERMONTH_CLASS + ')');
19065
19131
  this.cellWidth = workCell.offsetWidth;
19066
19132
  this.cellHeader = getOuterHeight(workCell.querySelector('.' + DATE_HEADER_CLASS));
19067
19133
  const eventTable = this.parent.element.querySelector('.' + EVENT_TABLE_CLASS);
@@ -19337,7 +19403,7 @@ class YearEvent extends TimelineEvent {
19337
19403
  'data-id': 'Appointment_' + record[this.fields.id],
19338
19404
  'data-guid': record.Guid,
19339
19405
  'role': 'button', 'tabindex': '0',
19340
- 'aria-readonly': this.parent.eventBase.getReadonlyAttribute(record), 'aria-selected': 'false', 'aria-grabbed': 'true',
19406
+ 'aria-disabled': this.parent.eventBase.getReadonlyAttribute(record), 'aria-pressed': 'false', 'aria-grabbed': 'true',
19341
19407
  'aria-label': this.parent.getAnnouncementString(record)
19342
19408
  }
19343
19409
  });
@@ -21279,6 +21345,17 @@ class ViewBase {
21279
21345
  }
21280
21346
  return endDate;
21281
21347
  }
21348
+ getAdjustedDate(startTime) {
21349
+ if (!this.parent.activeViewOptions.timeScale.enable || this.parent.currentView === 'Month' ||
21350
+ (this.parent.currentView === 'TimelineYear' && this.parent.activeViewOptions.group.resources.length === 0)) {
21351
+ return new Date(startTime.setHours(0, 0, 0, 0));
21352
+ }
21353
+ else if (this.parent.currentView === 'TimelineYear' && this.parent.activeViewOptions.group.resources.length > 0) {
21354
+ startTime.setHours(0, 0, 0, 0);
21355
+ return new Date(startTime.setDate(1));
21356
+ }
21357
+ return null;
21358
+ }
21282
21359
  destroy() {
21283
21360
  if (this.element && this.element.parentNode) {
21284
21361
  remove(this.element);
@@ -21774,12 +21851,11 @@ class VerticalView extends ViewBase {
21774
21851
  const wrap = createElement('div', { className: DATE_HEADER_WRAP_CLASS });
21775
21852
  container.appendChild(wrap);
21776
21853
  const tbl = this.createTableLayout();
21777
- const trEle = createElement('tr');
21854
+ const trEle = createElement('tr', { className: HEADER_ROW_CLASS });
21778
21855
  const rowCount = this.colLevels.length;
21779
21856
  const lastLevel = this.colLevels[rowCount - 1];
21780
21857
  for (let i = 0; i < rowCount; i++) {
21781
21858
  const ntr = trEle.cloneNode();
21782
- addClass([ntr], HEADER_ROW_CLASS);
21783
21859
  const level = this.colLevels[i];
21784
21860
  for (let j = 0; j < level.length; j++) {
21785
21861
  ntr.appendChild(this.createTd(level[j]));
@@ -21792,13 +21868,13 @@ class VerticalView extends ViewBase {
21792
21868
  return container;
21793
21869
  }
21794
21870
  createAllDayRow(table, tdData) {
21795
- const ntr = createElement('tr');
21796
- addClass([ntr], ALLDAY_ROW_CLASS);
21871
+ const ntr = createElement('tr', { className: ALLDAY_ROW_CLASS });
21797
21872
  for (let j = 0; j < tdData.length; j++) {
21798
21873
  const td = extend({}, tdData[j]);
21799
21874
  td.className = [ALLDAY_CELLS_CLASS];
21800
21875
  td.type = 'alldayCells';
21801
21876
  const ntd = this.createTd(td);
21877
+ ntd.setAttribute('role', 'gridcell');
21802
21878
  ntd.setAttribute('data-date', td.date.getTime().toString());
21803
21879
  if (!isNullOrUndefined(td.groupIndex)) {
21804
21880
  ntd.setAttribute('data-group-index', '' + td.groupIndex);
@@ -21831,6 +21907,7 @@ class VerticalView extends ViewBase {
21831
21907
  }
21832
21908
  if (td.type === 'dateHeader' && td.className.indexOf(HEADER_CELLS_CLASS) >= 0) {
21833
21909
  tdEle.setAttribute('data-date', td.date.getTime().toString());
21910
+ tdEle.setAttribute('role', 'gridcell');
21834
21911
  if (!isNullOrUndefined(td.groupIndex)) {
21835
21912
  tdEle.setAttribute('data-group-index', '' + td.groupIndex);
21836
21913
  }
@@ -22029,6 +22106,23 @@ class VerticalView extends ViewBase {
22029
22106
  }
22030
22107
  return rows;
22031
22108
  }
22109
+ getAdjustedDate(startTime) {
22110
+ if (!this.parent.activeViewOptions.timeScale.enable) {
22111
+ return new Date(startTime.setHours(0, 0, 0, 0));
22112
+ }
22113
+ else {
22114
+ const timeSlots = this.getTimeSlotRows();
22115
+ const startDate = new Date(new Date(timeSlots[0].date.getTime()).
22116
+ setHours(startTime.getHours(), startTime.getMinutes(), startTime.getMilliseconds()));
22117
+ for (let i = 0; i < timeSlots.length; i++) {
22118
+ if (timeSlots[i].date.getTime() > startDate.getTime()) {
22119
+ startTime.setHours(timeSlots[i - 1].date.getHours(), timeSlots[i - 1].date.getMinutes(), timeSlots[i - 1].date.getMilliseconds());
22120
+ return new Date(startTime);
22121
+ }
22122
+ }
22123
+ }
22124
+ return null;
22125
+ }
22032
22126
  destroy() {
22033
22127
  if (!this.parent || this.parent && this.parent.isDestroyed) {
22034
22128
  return;
@@ -23079,7 +23173,8 @@ class Year extends ViewBase {
23079
23173
  return this.parent.currentView === 'Year' ? getWeekFirstDate(this.getStartDate(), this.parent.firstDayOfWeek) : this.getStartDate();
23080
23174
  }
23081
23175
  endDate() {
23082
- return this.parent.currentView === 'Year' ? addDays(getWeekLastDate(this.getEndDate(), this.parent.firstDayOfWeek), 1) : this.getEndDate();
23176
+ return this.parent.currentView === 'Year' ? addDays(getWeekLastDate(this.getEndDate(), this.parent.firstDayOfWeek), 1) :
23177
+ addDays(this.getEndDate(), 1);
23083
23178
  }
23084
23179
  getEndDateFromStartDate(start) {
23085
23180
  let date = new Date(start.getTime());
@@ -23189,8 +23284,8 @@ class AgendaBase extends ViewBase {
23189
23284
  'data-guid': listData[li].Guid,
23190
23285
  'role': 'button',
23191
23286
  'tabindex': '0',
23192
- 'aria-readonly': this.parent.eventBase.getReadonlyAttribute(listData[li]),
23193
- 'aria-selected': 'false',
23287
+ 'aria-disabled': this.parent.eventBase.getReadonlyAttribute(listData[li]),
23288
+ 'aria-pressed': 'false',
23194
23289
  'aria-grabbed': 'true',
23195
23290
  'aria-label': this.parent.getAnnouncementString(listData[li])
23196
23291
  }
@@ -23455,8 +23550,8 @@ class AgendaBase extends ViewBase {
23455
23550
  ntd.appendChild(this.createDateHeaderElement(tempData.date));
23456
23551
  addClass([ntd], [AGENDA_CELLS_CLASS, AGENDA_DATE_CLASS, DATE_BORDER_CLASS]);
23457
23552
  const daysCount = getDaysCount(this.parent.selectedDate.getTime(), tempData.date.getTime());
23458
- ntr.setAttribute('aria-rowindex', daysCount.toString());
23459
- if (this.parent.element.querySelector(`.e-agenda-view tr[aria-rowindex="${daysCount}"]`)) {
23553
+ ntr.setAttribute('data-row-index', daysCount.toString());
23554
+ if (this.parent.element.querySelector(`.e-agenda-view tr[data-row-index="${daysCount}"]`)) {
23460
23555
  break;
23461
23556
  }
23462
23557
  ntr.insertBefore(ntd, ntr.childNodes[0]);
@@ -23492,13 +23587,13 @@ class AgendaBase extends ViewBase {
23492
23587
  }
23493
23588
  createTableRowElement(date, type) {
23494
23589
  const daysCount = getDaysCount(this.parent.selectedDate.getTime(), date.getTime());
23495
- const tr = createElement('tr', { attrs: { 'role': 'row', 'aria-rowindex': daysCount.toString() } });
23590
+ const tr = createElement('tr', { attrs: { 'role': 'row', 'data-row-index': daysCount.toString() } });
23496
23591
  const td = createElement('td', {
23497
23592
  attrs: {
23498
23593
  'class': (type === 'monthHeader') ? MONTH_HEADER_CLASS : AGENDA_CELLS_CLASS,
23499
23594
  'role': 'gridcell',
23500
23595
  'aria-selected': 'false',
23501
- 'aria-colindex': daysCount.toString(),
23596
+ 'data-column-index': daysCount.toString(),
23502
23597
  'data-date': date.getTime().toString()
23503
23598
  }
23504
23599
  });
@@ -23665,7 +23760,7 @@ class Agenda extends AgendaBase {
23665
23760
  for (let day = 0; day < this.parent.agendaDaysCount; day++) {
23666
23761
  const filterData = this.appointmentFiltering(agendaDate);
23667
23762
  const nTr = this.createTableRowElement(agendaDate, 'data');
23668
- if (this.element.querySelector('tr[aria-rowindex="' + parseInt(nTr.getAttribute('aria-rowindex'), 10) + '"]')) {
23763
+ if (this.element.querySelector('tr[data-row-index="' + parseInt(nTr.getAttribute('data-row-index'), 10) + '"]')) {
23669
23764
  agendaDate = addDays(agendaDate, 1);
23670
23765
  continue;
23671
23766
  }
@@ -23729,7 +23824,7 @@ class Agenda extends AgendaBase {
23729
23824
  prepend([].slice.call(emptyTBody.childNodes), tBody);
23730
23825
  this.wireEventActions();
23731
23826
  for (let s = 0, element = tBody.children; s < element.length; s++) {
23732
- if (element[s].getAttribute('aria-rowindex') === topElement.getAttribute('aria-colindex')) {
23827
+ if (element[s].getAttribute('data-row-index') === topElement.getAttribute('data-column-index')) {
23733
23828
  const scrollToValue = element[s].offsetTop -
23734
23829
  this.element.querySelector('.e-agenda-item').offsetHeight;
23735
23830
  target.scrollTop = scrollToValue;
@@ -24429,6 +24524,20 @@ class TimelineViews extends VerticalView {
24429
24524
  this.timelineAppointment.renderAppointments();
24430
24525
  this.parent.notify(eventsLoaded, {});
24431
24526
  }
24527
+ getAdjustedDate(date) {
24528
+ if (!this.parent.activeViewOptions.timeScale.enable) {
24529
+ return new Date(date.setHours(0, 0, 0, 0));
24530
+ }
24531
+ else {
24532
+ const timeSlots = this.colLevels[this.colLevels.length - 1];
24533
+ for (let i = 0; i < timeSlots.length; i++) {
24534
+ if (timeSlots[i].date.getTime() > date.getTime()) {
24535
+ return timeSlots[i - 1].date;
24536
+ }
24537
+ }
24538
+ }
24539
+ return null;
24540
+ }
24432
24541
  destroy() {
24433
24542
  if (!this.parent || this.parent && this.parent.isDestroyed) {
24434
24543
  return;
@@ -24569,6 +24678,15 @@ class TimelineMonth extends Month {
24569
24678
  this.colLevels = colLevels;
24570
24679
  return colLevels;
24571
24680
  }
24681
+ getAdjustedDate(startTime) {
24682
+ const timeSlots = this.colLevels[this.colLevels.length - 1];
24683
+ for (let i = 0; i < timeSlots.length; i++) {
24684
+ if (timeSlots[i].date.getTime() > startTime.getTime()) {
24685
+ return timeSlots[i - 1].date;
24686
+ }
24687
+ }
24688
+ return null;
24689
+ }
24572
24690
  destroy() {
24573
24691
  if (!this.parent || this.parent && this.parent.isDestroyed) {
24574
24692
  return;
@@ -24838,6 +24956,9 @@ class TimelineYear extends Year {
24838
24956
  else {
24839
24957
  addClass([td], OTHERMONTH_CLASS);
24840
24958
  }
24959
+ if (td.classList.contains(OTHERMONTH_CLASS)) {
24960
+ continue;
24961
+ }
24841
24962
  td.appendChild(dateHeader);
24842
24963
  if (isDateAvail) {
24843
24964
  td.setAttribute('data-date', date.getTime().toString());
@@ -25342,6 +25463,10 @@ class ExcelExport {
25342
25463
  const exportName = excelExportOptions.fileName || 'Schedule';
25343
25464
  const exportType = excelExportOptions.exportType || 'xlsx';
25344
25465
  const isIncludeOccurrences = excelExportOptions.includeOccurrences || false;
25466
+ let separator;
25467
+ if (!isNullOrUndefined(excelExportOptions.separator) && excelExportOptions.separator !== ',') {
25468
+ separator = excelExportOptions.separator;
25469
+ }
25345
25470
  let eventCollection;
25346
25471
  if (excelExportOptions.customData) {
25347
25472
  eventCollection = !isIncludeOccurrences ? excelExportOptions.customData :
@@ -25350,9 +25475,9 @@ class ExcelExport {
25350
25475
  else {
25351
25476
  eventCollection = !isIncludeOccurrences ? this.parent.eventsData : this.parent.eventsProcessed;
25352
25477
  }
25353
- this.processWorkbook(exportColumns, exportName, exportType, eventCollection);
25478
+ this.processWorkbook(exportColumns, exportName, exportType, eventCollection, separator);
25354
25479
  }
25355
- processWorkbook(fields, name, type, eventCollection) {
25480
+ processWorkbook(fields, name, type, eventCollection, separator) {
25356
25481
  const columns = [];
25357
25482
  const rows = [];
25358
25483
  const columnHeader = [];
@@ -25373,7 +25498,7 @@ class ExcelExport {
25373
25498
  rows.push({ index: i + 2, cells: columnData });
25374
25499
  });
25375
25500
  const workSheet = [{ columns: columns, rows: rows }];
25376
- const book = new Workbook({ worksheets: workSheet }, type, this.parent.locale);
25501
+ const book = new Workbook({ worksheets: workSheet }, type, this.parent.locale, undefined, separator);
25377
25502
  book.save(name + '.' + type);
25378
25503
  }
25379
25504
  getExportColumns(exportOptions) {