@syncfusion/ej2-schedule 19.3.46 → 19.4.38

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 (125) hide show
  1. package/.github/PULL_REQUEST_TEMPLATE/Bug.md +63 -0
  2. package/.github/PULL_REQUEST_TEMPLATE/Feature.md +39 -0
  3. package/CHANGELOG.md +49 -5
  4. package/dist/ej2-schedule.umd.min.js +2 -2
  5. package/dist/ej2-schedule.umd.min.js.map +1 -1
  6. package/dist/es6/ej2-schedule.es2015.js +479 -133
  7. package/dist/es6/ej2-schedule.es2015.js.map +1 -1
  8. package/dist/es6/ej2-schedule.es5.js +480 -137
  9. package/dist/es6/ej2-schedule.es5.js.map +1 -1
  10. package/dist/global/ej2-schedule.min.js +2 -2
  11. package/dist/global/ej2-schedule.min.js.map +1 -1
  12. package/dist/global/index.d.ts +1 -1
  13. package/package.json +15 -15
  14. package/src/recurrence-editor/date-generator.js +3 -3
  15. package/src/recurrence-editor/recurrence-editor.js +2 -2
  16. package/src/schedule/actions/crud.js +2 -0
  17. package/src/schedule/actions/drag.js +28 -18
  18. package/src/schedule/actions/keyboard.d.ts +7 -0
  19. package/src/schedule/actions/keyboard.js +197 -28
  20. package/src/schedule/base/interface.d.ts +19 -0
  21. package/src/schedule/base/resource.js +1 -0
  22. package/src/schedule/base/schedule-model.d.ts +97 -20
  23. package/src/schedule/base/schedule.d.ts +97 -21
  24. package/src/schedule/base/schedule.js +27 -5
  25. package/src/schedule/base/type.d.ts +4 -0
  26. package/src/schedule/base/util.d.ts +1 -0
  27. package/src/schedule/base/util.js +1 -0
  28. package/src/schedule/event-renderer/event-base.d.ts +2 -0
  29. package/src/schedule/event-renderer/event-base.js +29 -9
  30. package/src/schedule/event-renderer/inline-edit.js +8 -5
  31. package/src/schedule/event-renderer/month.js +2 -2
  32. package/src/schedule/event-renderer/timeline-view.js +4 -0
  33. package/src/schedule/event-renderer/vertical-view.js +9 -6
  34. package/src/schedule/event-renderer/year.js +1 -1
  35. package/src/schedule/exports/excel-export.d.ts +2 -1
  36. package/src/schedule/exports/excel-export.js +21 -18
  37. package/src/schedule/models/event-settings-model.d.ts +20 -1
  38. package/src/schedule/models/event-settings.d.ts +18 -0
  39. package/src/schedule/models/event-settings.js +6 -0
  40. package/src/schedule/models/views-model.d.ts +19 -0
  41. package/src/schedule/models/views.d.ts +17 -0
  42. package/src/schedule/models/views.js +6 -0
  43. package/src/schedule/popups/event-window.d.ts +0 -1
  44. package/src/schedule/popups/event-window.js +4 -5
  45. package/src/schedule/popups/form-validator.js +4 -1
  46. package/src/schedule/popups/quick-popups.js +3 -0
  47. package/src/schedule/renderer/agenda.js +3 -1
  48. package/src/schedule/renderer/header-renderer.d.ts +1 -0
  49. package/src/schedule/renderer/header-renderer.js +22 -8
  50. package/src/schedule/renderer/month.d.ts +4 -0
  51. package/src/schedule/renderer/month.js +68 -19
  52. package/src/schedule/renderer/timeline-year.js +3 -0
  53. package/src/schedule/renderer/view-base.js +9 -0
  54. package/src/schedule/renderer/year.d.ts +2 -2
  55. package/src/schedule/renderer/year.js +24 -6
  56. package/src/schedule/timezone/timezone.d.ts +3 -2
  57. package/src/schedule/timezone/timezone.js +0 -1
  58. package/styles/bootstrap-dark.css +108 -27
  59. package/styles/bootstrap.css +105 -27
  60. package/styles/bootstrap4.css +117 -62
  61. package/styles/bootstrap5-dark.css +118 -67
  62. package/styles/bootstrap5.css +118 -67
  63. package/styles/fabric-dark.css +108 -26
  64. package/styles/fabric.css +109 -26
  65. package/styles/highcontrast-light.css +104 -26
  66. package/styles/highcontrast.css +109 -28
  67. package/styles/material-dark.css +110 -32
  68. package/styles/material.css +103 -25
  69. package/styles/recurrence-editor/_bootstrap-dark-definition.scss +7 -0
  70. package/styles/recurrence-editor/_bootstrap-definition.scss +7 -0
  71. package/styles/recurrence-editor/_bootstrap4-definition.scss +7 -0
  72. package/styles/recurrence-editor/_bootstrap5-definition.scss +7 -0
  73. package/styles/recurrence-editor/_fabric-dark-definition.scss +8 -0
  74. package/styles/recurrence-editor/_fabric-definition.scss +7 -0
  75. package/styles/recurrence-editor/_fluent-definition.scss +15 -0
  76. package/styles/recurrence-editor/_highcontrast-definition.scss +7 -0
  77. package/styles/recurrence-editor/_highcontrast-light-definition.scss +7 -0
  78. package/styles/recurrence-editor/_layout.scss +20 -4
  79. package/styles/recurrence-editor/_material-dark-definition.scss +7 -0
  80. package/styles/recurrence-editor/_material-definition.scss +7 -0
  81. package/styles/recurrence-editor/_tailwind-definition.scss +15 -8
  82. package/styles/recurrence-editor/bootstrap-dark.css +20 -4
  83. package/styles/recurrence-editor/bootstrap.css +20 -4
  84. package/styles/recurrence-editor/bootstrap4.css +20 -4
  85. package/styles/recurrence-editor/bootstrap5-dark.css +20 -4
  86. package/styles/recurrence-editor/bootstrap5.css +20 -4
  87. package/styles/recurrence-editor/fabric-dark.css +20 -4
  88. package/styles/recurrence-editor/fabric.css +20 -4
  89. package/styles/recurrence-editor/highcontrast-light.css +20 -4
  90. package/styles/recurrence-editor/highcontrast.css +20 -4
  91. package/styles/recurrence-editor/material-dark.css +20 -4
  92. package/styles/recurrence-editor/material.css +20 -4
  93. package/styles/recurrence-editor/tailwind-dark.css +20 -4
  94. package/styles/recurrence-editor/tailwind.css +20 -4
  95. package/styles/schedule/_bootstrap-dark-definition.scss +22 -1
  96. package/styles/schedule/_bootstrap-definition.scss +22 -1
  97. package/styles/schedule/_bootstrap4-definition.scss +23 -1
  98. package/styles/schedule/_bootstrap5-definition.scss +145 -119
  99. package/styles/schedule/_fabric-dark-definition.scss +22 -1
  100. package/styles/schedule/_fabric-definition.scss +22 -1
  101. package/styles/schedule/_fluent-definition.scss +218 -0
  102. package/styles/schedule/_highcontrast-definition.scss +22 -1
  103. package/styles/schedule/_highcontrast-light-definition.scss +22 -1
  104. package/styles/schedule/_layout.scss +95 -158
  105. package/styles/schedule/_material-dark-definition.scss +22 -1
  106. package/styles/schedule/_material-definition.scss +21 -0
  107. package/styles/schedule/_tailwind-definition.scss +216 -195
  108. package/styles/schedule/_theme.scss +1 -1
  109. package/styles/schedule/bootstrap-dark.css +88 -23
  110. package/styles/schedule/bootstrap.css +85 -23
  111. package/styles/schedule/bootstrap4.css +97 -58
  112. package/styles/schedule/bootstrap5-dark.css +98 -63
  113. package/styles/schedule/bootstrap5.css +98 -63
  114. package/styles/schedule/fabric-dark.css +88 -22
  115. package/styles/schedule/fabric.css +89 -22
  116. package/styles/schedule/highcontrast-light.css +84 -22
  117. package/styles/schedule/highcontrast.css +89 -24
  118. package/styles/schedule/icons/_fluent.scss +231 -0
  119. package/styles/schedule/icons/_tailwind.scss +231 -231
  120. package/styles/schedule/material-dark.css +90 -28
  121. package/styles/schedule/material.css +83 -21
  122. package/styles/schedule/tailwind-dark.css +94 -52
  123. package/styles/schedule/tailwind.css +94 -52
  124. package/styles/tailwind-dark.css +114 -56
  125. package/styles/tailwind.css +114 -56
@@ -91,6 +91,7 @@ const cellMouseDown = 'cell-mouse-down';
91
91
  * Schedule common utilities
92
92
  */
93
93
  const WEEK_LENGTH = 7;
94
+ const DEFAULT_WEEKS = 6;
94
95
  const MS_PER_DAY = 86400000;
95
96
  const MS_PER_MINUTE = 60000;
96
97
  /**
@@ -1243,8 +1244,10 @@ class HeaderRenderer {
1243
1244
  enableRtl: this.parent.enableRtl
1244
1245
  });
1245
1246
  const calendarView = this.getCalendarView();
1247
+ const isDisplayDate = this.parent.currentView === 'Month' &&
1248
+ !isNullOrUndefined(this.parent.activeViewOptions.displayDate) && !this.hasSelectedDate();
1246
1249
  this.headerCalendar = new Calendar({
1247
- value: this.parent.selectedDate,
1250
+ value: isDisplayDate ? this.parent.activeViewOptions.displayDate : this.parent.selectedDate,
1248
1251
  min: this.parent.minDate,
1249
1252
  max: this.parent.maxDate,
1250
1253
  firstDayOfWeek: this.parent.activeViewOptions.firstDayOfWeek,
@@ -1332,8 +1335,13 @@ class HeaderRenderer {
1332
1335
  this.parent.changeView('TimelineYear', args.originalEvent, undefined, this.calculateViewIndex(args));
1333
1336
  break;
1334
1337
  case 'e-today':
1335
- if (this.parent.currentView === 'Agenda' || !this.parent.isSelectedDate(resetTime(this.parent.getCurrentTime()))) {
1336
- this.parent.changeDate(resetTime(this.parent.getCurrentTime()), args.originalEvent);
1338
+ const currentTime = resetTime(this.parent.getCurrentTime());
1339
+ if (this.parent.currentView === 'Agenda' || !this.parent.isSelectedDate(currentTime) ||
1340
+ this.parent.currentView === 'Month' && this.parent.activeViewOptions.displayDate && !this.hasSelectedDate() &&
1341
+ resetTime(this.parent.activeViewOptions.displayDate) !== currentTime || this.parent.currentView === 'Month' &&
1342
+ this.parent.activeViewOptions.numberOfWeeks > 0 && !this.hasSelectedDate()
1343
+ && resetTime(firstDateOfMonth(this.parent.selectedDate)) !== currentTime) {
1344
+ this.parent.changeDate(currentTime, args.originalEvent);
1337
1345
  }
1338
1346
  break;
1339
1347
  case 'e-prev':
@@ -1368,6 +1376,11 @@ class HeaderRenderer {
1368
1376
  toolbarPopUp.ej2_instances[0].hide({ name: 'SlideUp', duration: 100 });
1369
1377
  }
1370
1378
  }
1379
+ hasSelectedDate() {
1380
+ const selectedTime = resetTime(this.parent.selectedDate).getTime();
1381
+ return selectedTime >= this.parent.activeView.getStartDate().getTime() &&
1382
+ selectedTime <= this.parent.activeView.getEndDate().getTime();
1383
+ }
1371
1384
  getHeaderElement() {
1372
1385
  return this.toolbarObj.element;
1373
1386
  }
@@ -1412,9 +1425,11 @@ class HeaderRenderer {
1412
1425
  lastDate = addDays(firstDate, 7 * this.parent.activeViewOptions.interval);
1413
1426
  }
1414
1427
  if (this.parent.currentView === 'Month') {
1415
- firstDate = firstDateOfMonth(this.parent.selectedDate);
1416
- const lastMonthFirstDate = addMonths(firstDate, this.parent.activeViewOptions.interval - 1);
1417
- lastDate = lastDateOfMonth(lastMonthFirstDate);
1428
+ const isCustomMonth = !isNullOrUndefined(this.parent.activeViewOptions.displayDate) ||
1429
+ this.parent.activeViewOptions.numberOfWeeks > 0;
1430
+ firstDate = isCustomMonth ? this.parent.activeView.getStartDate() : firstDateOfMonth(this.parent.selectedDate);
1431
+ lastDate = isCustomMonth ? this.parent.activeView.getEndDate() :
1432
+ lastDateOfMonth(addMonths(firstDate, this.parent.activeViewOptions.interval - 1));
1418
1433
  }
1419
1434
  if (!isNullOrUndefined(prevNavEle)) {
1420
1435
  this.toolbarObj.enableItems(prevNavEle, firstDate > this.parent.minDate);
@@ -1945,6 +1960,9 @@ class KeyboardInteraction {
1945
1960
  }
1946
1961
  const queryStr = '.' + WORK_CELLS_CLASS + ',.' + ALLDAY_CELLS_CLASS + ',.' + HEADER_CELLS_CLASS;
1947
1962
  const target = closest(e.target, queryStr);
1963
+ if (this.parent.currentView === 'TimelineYear' && target.classList.contains(OTHERMONTH_CLASS)) {
1964
+ return;
1965
+ }
1948
1966
  this.parent.activeCellsData = this.getSelectedElements(target);
1949
1967
  const cellData = {};
1950
1968
  if (this.parent.eventWindow) {
@@ -1968,6 +1986,9 @@ class KeyboardInteraction {
1968
1986
  || this.isPreventAction(e)) {
1969
1987
  return;
1970
1988
  }
1989
+ if (this.parent.currentView === 'TimelineYear' && e.target.classList.contains(OTHERMONTH_CLASS)) {
1990
+ return;
1991
+ }
1971
1992
  const target = e.target;
1972
1993
  if (closest(target, '.' + POPUP_WRAPPER_CLASS)) {
1973
1994
  if (target.classList.contains(QUICK_POPUP_EVENT_DETAILS_CLASS) ||
@@ -2002,11 +2023,16 @@ class KeyboardInteraction {
2002
2023
  this.parent.notify(inlineClick, inlineArgs);
2003
2024
  }
2004
2025
  else {
2005
- this.parent.notify(cellClick, args);
2026
+ if (this.parent.currentView === 'Year') {
2027
+ target.click();
2028
+ }
2029
+ else {
2030
+ this.parent.notify(cellClick, args);
2031
+ }
2006
2032
  }
2007
2033
  return;
2008
2034
  }
2009
- if (target.classList.contains(INLINE_SUBJECT_CLASS)) {
2035
+ if (target.classList.contains(INLINE_SUBJECT_CLASS) && this.parent.inlineModule) {
2010
2036
  this.parent.inlineModule.inlineCrudActions(target);
2011
2037
  return;
2012
2038
  }
@@ -2038,7 +2064,9 @@ class KeyboardInteraction {
2038
2064
  }
2039
2065
  getCells(isInverseTable, start, end) {
2040
2066
  const tableEle = this.parent.getContentTable();
2041
- let cells = [].slice.call(tableEle.querySelectorAll('td'));
2067
+ const isTimelineYear = this.parent.currentView === 'TimelineYear';
2068
+ const query = isTimelineYear && !isInverseTable ? '.' + WORK_CELLS_CLASS + ':not(.' + OTHERMONTH_CLASS + ')' : 'td';
2069
+ let cells = [].slice.call(tableEle.querySelectorAll(query));
2042
2070
  let maxRow = tableEle.rows.length;
2043
2071
  let maxColumn = tableEle.rows[0].cells.length;
2044
2072
  if (start && start.classList.contains(ALLDAY_CELLS_CLASS)) {
@@ -2053,7 +2081,11 @@ class KeyboardInteraction {
2053
2081
  if (isInverseTable) {
2054
2082
  for (let i = 0; i < maxColumn; i++) {
2055
2083
  for (let j = 0; j < maxRow; j++) {
2056
- inverseCells.push(cells[maxColumn * j + i]);
2084
+ const cell = cells[maxColumn * j + i];
2085
+ if (isTimelineYear && cell.classList.contains(OTHERMONTH_CLASS)) {
2086
+ continue;
2087
+ }
2088
+ inverseCells.push(cell);
2057
2089
  }
2058
2090
  }
2059
2091
  startIndex = inverseCells.indexOf(start);
@@ -2075,11 +2107,17 @@ class KeyboardInteraction {
2075
2107
  return;
2076
2108
  }
2077
2109
  this.parent.eventBase.removeSelectedAppointmentClass();
2078
- if (this.parent.activeView.isTimelineView()) {
2110
+ if (this.parent.activeView.isTimelineView() && this.parent.currentView !== 'TimelineYear') {
2079
2111
  const cell = this.parent.element.querySelector('.' + CONTENT_TABLE_CLASS +
2080
2112
  ' tr:not(.' + HIDDEN_CLASS + ') .' + WORK_CELLS_CLASS + ':not(.' + RESOURCE_GROUP_CELLS_CLASS + ')');
2081
2113
  this.selectCells(false, cell);
2082
2114
  }
2115
+ else if (this.parent.currentView.indexOf('Year') > -1) {
2116
+ let query = '.' + WORK_CELLS_CLASS + ':not(.' + OTHERMONTH_CLASS + ')' + ':not(.' + RESOURCE_GROUP_CELLS_CLASS + ')';
2117
+ const isVerticalYear = this.parent.currentView === 'TimelineYear' && this.parent.activeViewOptions.orientation === 'Vertical';
2118
+ query += isVerticalYear ? '[data-date="' + this.parent.activeView.startDate().getTime() + '"]' : '';
2119
+ this.selectCells(false, this.parent.element.querySelector(query));
2120
+ }
2083
2121
  else {
2084
2122
  this.selectCells(false, this.parent.getWorkCellElements()[0]);
2085
2123
  }
@@ -2100,13 +2138,21 @@ class KeyboardInteraction {
2100
2138
  let target = (targetCell instanceof Array) ? targetCell.slice(-1)[0] : targetCell;
2101
2139
  if (isMultiple) {
2102
2140
  let initialId;
2103
- const views = ['Day', 'Week', 'WorkWeek', 'Month', 'TimelineDay', 'TimelineWeek', 'TimelineWorkWeek', 'TimelineMonth'];
2141
+ const views = ['Day', 'Week', 'WorkWeek', 'TimelineDay', 'TimelineWeek', 'TimelineWorkWeek', 'TimelineMonth', 'TimelineYear'];
2104
2142
  const args = { element: targetCell, requestType: 'mousemove', allowMultipleRow: true };
2105
2143
  this.parent.inlineModule.removeInlineAppointmentElement();
2106
2144
  this.parent.trigger(select, args, (selectArgs) => {
2107
2145
  const allowMultipleRow = (!selectArgs.allowMultipleRow) || (!this.parent.allowMultiRowSelection);
2108
- if (allowMultipleRow && (views.indexOf(this.parent.currentView) > -1)) {
2109
- target = target.parentElement.children[this.initialTarget.cellIndex];
2146
+ if (allowMultipleRow) {
2147
+ const isTimelineYear = this.parent.currentView === 'TimelineYear';
2148
+ if (isTimelineYear && this.parent.activeViewOptions.orientation === 'Horizontal' || this.parent.currentView === 'Month') {
2149
+ const isGroupYear = isTimelineYear && this.parent.activeViewOptions.group.resources.length > 0;
2150
+ target = isGroupYear ? this.initialTarget :
2151
+ this.initialTarget.parentElement.children[target.cellIndex];
2152
+ }
2153
+ else if (views.indexOf(this.parent.currentView) > -1) {
2154
+ target = target.parentElement.children[this.initialTarget.cellIndex];
2155
+ }
2110
2156
  }
2111
2157
  let selectedCells = this.getCells(this.isInverseTableSelect(), this.initialTarget, target);
2112
2158
  if (this.parent.activeViewOptions.group.resources.length > 0) {
@@ -2239,8 +2285,20 @@ class KeyboardInteraction {
2239
2285
  }
2240
2286
  }
2241
2287
  }
2288
+ cancelUpDownAction(isTimelineYear) {
2289
+ const isVerticalYear = isTimelineYear && this.parent.activeViewOptions.orientation === 'Vertical';
2290
+ const isGroup = this.parent.activeViewOptions.group.resources.length > 0;
2291
+ if (isVerticalYear && isGroup || isTimelineYear && this.initialTarget.classList.contains(OTHERMONTH_CLASS)) {
2292
+ return true;
2293
+ }
2294
+ if (this.parent.activeView.isTimelineView() && !isTimelineYear || this.parent.currentView === 'MonthAgenda') {
2295
+ return true;
2296
+ }
2297
+ return false;
2298
+ }
2242
2299
  processUp(e, isMultiple) {
2243
- if ((isMultiple && (this.parent.activeView.isTimelineView() || this.parent.currentView === 'MonthAgenda'))) {
2300
+ const isTimelineYear = this.parent.currentView === 'TimelineYear';
2301
+ if (isMultiple && this.cancelUpDownAction(isTimelineYear)) {
2244
2302
  return;
2245
2303
  }
2246
2304
  let target = (e.target);
@@ -2263,8 +2321,22 @@ class KeyboardInteraction {
2263
2321
  if (target.classList.contains(WORK_CELLS_CLASS) && !this.parent.element.querySelector('.' + POPUP_OPEN)) {
2264
2322
  const tableRows = this.parent.getTableRows();
2265
2323
  const curRowIndex = tableRows.indexOf(target.parentElement);
2266
- if (curRowIndex > 0 && curRowIndex < tableRows.length) {
2267
- this.selectCells(isMultiple, (tableRows[curRowIndex - 1]).cells[target.cellIndex]);
2324
+ let targetCell;
2325
+ if (isTimelineYear && isMultiple && this.parent.activeViewOptions.group.resources.length === 0) {
2326
+ targetCell = this.isInverseTableSelect() ? this.getVerticalUpDownCell(tableRows, target, curRowIndex, true) :
2327
+ this.getHorizontalUpDownCell(tableRows, target, curRowIndex, true);
2328
+ }
2329
+ if ((curRowIndex > 0 || targetCell) && curRowIndex < tableRows.length) {
2330
+ targetCell = targetCell ? targetCell : (tableRows[curRowIndex - 1]).cells[target.cellIndex];
2331
+ if (this.parent.currentView === 'Year' && targetCell.classList.contains(OTHERMONTH_CLASS)) {
2332
+ if (this.parent.activeView.getStartDate().getTime() < +targetCell.getAttribute('data-date')) {
2333
+ targetCell = this.getYearUpDownCell(tableRows, curRowIndex - 1, target.cellIndex, true);
2334
+ }
2335
+ else {
2336
+ return;
2337
+ }
2338
+ }
2339
+ this.selectCells(isMultiple, targetCell);
2268
2340
  }
2269
2341
  }
2270
2342
  else if (this.parent.currentView === 'Agenda' || this.parent.currentView === 'MonthAgenda') {
@@ -2272,7 +2344,8 @@ class KeyboardInteraction {
2272
2344
  }
2273
2345
  }
2274
2346
  processDown(e, isMultiple) {
2275
- if (isMultiple && (this.parent.activeView.isTimelineView() || this.parent.currentView === 'MonthAgenda')) {
2347
+ const isTimelineYear = this.parent.currentView === 'TimelineYear';
2348
+ if (isMultiple && this.cancelUpDownAction(isTimelineYear)) {
2276
2349
  return;
2277
2350
  }
2278
2351
  let target = (e.target);
@@ -2295,16 +2368,62 @@ class KeyboardInteraction {
2295
2368
  }
2296
2369
  if (target.classList.contains(WORK_CELLS_CLASS) && !this.parent.element.querySelector('.' + POPUP_OPEN)) {
2297
2370
  const curRowIndex = tableRows.indexOf(target.parentElement);
2298
- if (curRowIndex >= 0 && curRowIndex < tableRows.length - 1) {
2299
- this.selectCells(isMultiple, (tableRows[curRowIndex + 1]).cells[target.cellIndex]);
2371
+ let targetCell;
2372
+ if (isTimelineYear && isMultiple && this.parent.activeViewOptions.group.resources.length === 0) {
2373
+ targetCell = this.isInverseTableSelect() ? this.getVerticalUpDownCell(tableRows, target, curRowIndex, false)
2374
+ : this.getHorizontalUpDownCell(tableRows, target, curRowIndex, false);
2375
+ }
2376
+ if (curRowIndex >= 0 && ((curRowIndex < tableRows.length - 1) || targetCell)) {
2377
+ targetCell = targetCell ? targetCell : (tableRows[curRowIndex + 1]).cells[target.cellIndex];
2378
+ if (this.parent.currentView === 'Year' && targetCell.classList.contains(OTHERMONTH_CLASS)) {
2379
+ if (this.parent.activeView.getEndDate().getTime() > +targetCell.getAttribute('data-date')) {
2380
+ targetCell = this.getYearUpDownCell(tableRows, curRowIndex + 1, target.cellIndex, false);
2381
+ }
2382
+ else {
2383
+ return;
2384
+ }
2385
+ }
2386
+ this.selectCells(isMultiple, targetCell);
2300
2387
  }
2301
2388
  }
2302
2389
  else if (this.parent.currentView === 'Agenda' || this.parent.currentView === 'MonthAgenda') {
2303
2390
  this.selectAppointment(false, target);
2304
2391
  }
2305
2392
  }
2393
+ getYearUpDownCell(tableRows, rowIndex, cellIndex, isUp) {
2394
+ while (tableRows[rowIndex] && tableRows[rowIndex].cells[cellIndex].classList.contains(OTHERMONTH_CLASS)) {
2395
+ rowIndex = rowIndex + (isUp ? -1 : 1);
2396
+ }
2397
+ return tableRows[rowIndex].cells[cellIndex];
2398
+ }
2399
+ // eslint-disable-next-line max-len
2400
+ getHorizontalUpDownCell(tableRows, target, curRowIndex, isUp) {
2401
+ const row = tableRows[curRowIndex + (isUp ? -1 : 1)];
2402
+ let cell = row ? row.cells[target.cellIndex] : target;
2403
+ if (cell.classList.contains(OTHERMONTH_CLASS)) {
2404
+ const workCell = row.querySelector('.' + WORK_CELLS_CLASS + ':not(.' + OTHERMONTH_CLASS + ')');
2405
+ const date = new Date(+workCell.getAttribute('data-date'));
2406
+ const query = '[data-date="' + new Date(date.getFullYear(), date.getMonth() + 1, 0).getTime() + '"]';
2407
+ cell = cell.cellIndex < workCell.cellIndex ? workCell : row.querySelector(query);
2408
+ }
2409
+ return cell;
2410
+ }
2411
+ // eslint-disable-next-line max-len
2412
+ getVerticalUpDownCell(tableRows, target, curRowIndex, isUp) {
2413
+ const hasRow = isUp && curRowIndex > 0 || !isUp && curRowIndex < tableRows.length - 1;
2414
+ let targetCell = hasRow ? tableRows[curRowIndex + (isUp ? -1 : 1)].cells[target.cellIndex] : undefined;
2415
+ if (!targetCell || targetCell.classList.contains(OTHERMONTH_CLASS)) {
2416
+ const column = tableRows[curRowIndex].cells[target.cellIndex - (isUp ? 1 : -1)];
2417
+ if (column) {
2418
+ const dateAttr = +target.getAttribute('data-date') - (isUp ? MS_PER_DAY : -MS_PER_DAY);
2419
+ return this.parent.getContentTable().querySelector('.' + WORK_CELLS_CLASS + '[data-date="' + dateAttr + '"]');
2420
+ }
2421
+ targetCell = target;
2422
+ }
2423
+ return targetCell;
2424
+ }
2306
2425
  processLeftRight(target) {
2307
- const tableEle = this.parent.getContentTable();
2426
+ const tableEle = (this.parent.currentView === 'Year' ? target.closest('tbody') : this.parent.getContentTable());
2308
2427
  const curRowIndex = target.parentNode.sectionRowIndex;
2309
2428
  const key = {
2310
2429
  element: tableEle,
@@ -2317,8 +2436,9 @@ class KeyboardInteraction {
2317
2436
  getQuickPopupElement() {
2318
2437
  return (this.parent.isAdaptive ? document.body : this.parent.element).querySelector('.' + POPUP_WRAPPER_CLASS);
2319
2438
  }
2320
- isCancelLeftRightAction(e, isMultiple) {
2321
- if (this.parent.currentView === 'Agenda' || (isMultiple && this.parent.currentView === 'MonthAgenda')) {
2439
+ isCancelLeftRightAction(e, isMultiple, isTimelineYear) {
2440
+ const prevent = this.parent.currentView === 'MonthAgenda' || isTimelineYear && this.initialTarget.classList.contains(OTHERMONTH_CLASS);
2441
+ if (this.parent.currentView === 'Agenda' || (isMultiple && prevent)) {
2322
2442
  return true;
2323
2443
  }
2324
2444
  if (this.isPreventAction(e) && isMultiple) {
@@ -2332,7 +2452,8 @@ class KeyboardInteraction {
2332
2452
  return false;
2333
2453
  }
2334
2454
  processRight(e, isMultiple) {
2335
- if (this.isCancelLeftRightAction(e, isMultiple)) {
2455
+ const isTimelineYear = this.parent.currentView === 'TimelineYear';
2456
+ if (this.isCancelLeftRightAction(e, isMultiple, isTimelineYear)) {
2336
2457
  return;
2337
2458
  }
2338
2459
  const selectedCells = this.parent.getSelectedElements();
@@ -2353,24 +2474,36 @@ class KeyboardInteraction {
2353
2474
  if (target.classList.contains(WORK_CELLS_CLASS) &&
2354
2475
  (e.target).classList.contains(WORK_CELLS_CLASS)) {
2355
2476
  const key = this.processLeftRight(target);
2356
- if (key.columnIndex >= 0 && key.columnIndex < key.maxIndex - 1) {
2477
+ const targetDate = new Date(+target.getAttribute('data-date'));
2478
+ const isMonthEnd = this.parent.currentView === 'Year' && targetDate.getTime() === lastDateOfMonth(targetDate).getTime();
2479
+ if (key.columnIndex >= 0 && key.columnIndex < key.maxIndex - 1 && !isMonthEnd) {
2357
2480
  targetCell = this.calculateNextPrevDate(target, key.element.rows[key.rowIndex].cells[target.cellIndex + 1], 'right');
2481
+ if (isTimelineYear && isMultiple && targetCell.classList.contains(OTHERMONTH_CLASS)) {
2482
+ targetCell = this.getTimelineYearTargetCell(key, target, true);
2483
+ }
2358
2484
  if (!isNullOrUndefined(targetCell)) {
2359
2485
  this.selectCells(isMultiple, targetCell);
2360
2486
  }
2361
2487
  }
2362
- else if (key.columnIndex === key.maxIndex - 1) {
2363
- if (!this.isInverseTableSelect() && key.rowIndex < key.element.rows.length - 1) {
2488
+ else if (key.columnIndex === key.maxIndex - 1 || isMonthEnd) {
2489
+ if (!this.isInverseTableSelect() && key.rowIndex < key.element.rows.length - 1 && !isMonthEnd) {
2364
2490
  targetCell = this.calculateNextPrevDate(target, key.element.rows[key.rowIndex + 1].cells[0], 'right');
2491
+ const changeTargetCell = isTimelineYear && isMultiple && targetCell.classList.contains(OTHERMONTH_CLASS);
2492
+ targetCell = changeTargetCell ? this.getHorizontalLeftRightCell(key, target, true) : targetCell;
2365
2493
  if (!isNullOrUndefined(targetCell)) {
2366
2494
  this.selectCells(isMultiple, targetCell);
2367
2495
  }
2368
2496
  }
2369
2497
  else if (!isMultiple) {
2498
+ if (isMonthEnd && targetDate.getTime() !== this.parent.activeView.getEndDate().getTime()) {
2499
+ this.selectCells(isMultiple, this.parent.element.querySelector(':not(.' + OTHERMONTH_CLASS + ')[data-date="' + (targetDate.getTime() + MS_PER_DAY) + '"]'));
2500
+ return;
2501
+ }
2370
2502
  const rowIndex = this.isInverseTableSelect() ? key.rowIndex : 0;
2371
2503
  this.parent.changeDate(this.parent.activeView.getNextPreviousDate('next'), e);
2372
2504
  const tableEle = this.parent.getContentTable();
2373
- this.selectCells(false, tableEle.rows[rowIndex].cells[0]);
2505
+ const cell = isMonthEnd ? tableEle.rows[rowIndex].querySelector('.' + WORK_CELLS_CLASS + ':not(.' + OTHERMONTH_CLASS + ')') : tableEle.rows[rowIndex].cells[0];
2506
+ this.selectCells(false, cell);
2374
2507
  }
2375
2508
  }
2376
2509
  }
@@ -2389,7 +2522,8 @@ class KeyboardInteraction {
2389
2522
  }
2390
2523
  }
2391
2524
  processLeft(e, isMultiple) {
2392
- if (this.isCancelLeftRightAction(e, isMultiple)) {
2525
+ const isTimelineYear = this.parent.currentView === 'TimelineYear';
2526
+ if (this.isCancelLeftRightAction(e, isMultiple, isTimelineYear)) {
2393
2527
  return;
2394
2528
  }
2395
2529
  let target = (e.target);
@@ -2410,24 +2544,40 @@ class KeyboardInteraction {
2410
2544
  if ((e.target).classList.contains(WORK_CELLS_CLASS) &&
2411
2545
  target.classList.contains(WORK_CELLS_CLASS)) {
2412
2546
  const key = this.processLeftRight(target);
2413
- if (key.columnIndex > 0 && key.columnIndex < key.maxIndex) {
2547
+ const targetDate = new Date(+target.getAttribute('data-date'));
2548
+ const isMonthStart = this.parent.currentView === 'Year' && targetDate.getTime() === firstDateOfMonth(targetDate).getTime();
2549
+ if (key.columnIndex > 0 && key.columnIndex < key.maxIndex && !isMonthStart) {
2414
2550
  targetCell = this.calculateNextPrevDate(target, key.element.rows[key.rowIndex].cells[target.cellIndex - 1], 'left');
2551
+ if (isTimelineYear && isMultiple && targetCell.classList.contains(OTHERMONTH_CLASS)) {
2552
+ targetCell = this.getTimelineYearTargetCell(key, target, false);
2553
+ }
2415
2554
  if (!isNullOrUndefined(targetCell)) {
2416
2555
  this.selectCells(isMultiple, targetCell);
2417
2556
  }
2418
2557
  }
2419
- else if (key.columnIndex === 0) {
2558
+ else if (key.columnIndex === 0 || isMonthStart) {
2420
2559
  if (!this.isInverseTableSelect() && key.rowIndex > 0) {
2421
2560
  targetCell = this.calculateNextPrevDate(target, key.element.rows[key.rowIndex - 1].cells[key.maxIndex - 1], 'left');
2561
+ const otherMonthCell = isTimelineYear && isMultiple && targetCell.classList.contains(OTHERMONTH_CLASS);
2562
+ targetCell = otherMonthCell ? this.getHorizontalLeftRightCell(key, target, false) : targetCell;
2422
2563
  if (!isNullOrUndefined(targetCell)) {
2423
2564
  this.selectCells(isMultiple, targetCell);
2424
2565
  }
2425
2566
  }
2426
2567
  else if (!isMultiple) {
2568
+ if (isMonthStart && targetDate.getTime() !== this.parent.activeView.getStartDate().getTime()) {
2569
+ this.selectCells(isMultiple, this.parent.element.querySelector('[data-date="' + (targetDate.getTime() - MS_PER_DAY) + '"]'));
2570
+ return;
2571
+ }
2427
2572
  this.parent.changeDate(this.parent.activeView.getNextPreviousDate('previous'), e);
2428
2573
  const tableEle = this.parent.getContentTable();
2429
2574
  const rowIndex = this.isInverseTableSelect() ? key.rowIndex : tableEle.rows.length - 1;
2430
- this.selectCells(false, tableEle.rows[rowIndex].cells[key.maxIndex - 1]);
2575
+ let cell = tableEle.rows[rowIndex].cells[key.maxIndex - 1];
2576
+ if (isMonthStart) {
2577
+ const tbody = this.parent.element.querySelectorAll('.' + CONTENT_TABLE_CLASS + ' tbody');
2578
+ cell = tbody.item(tbody.length - 1).querySelector(':not(.' + OTHERMONTH_CLASS + ')[data-date="' + this.parent.activeView.getEndDate().getTime() + '"]');
2579
+ }
2580
+ this.selectCells(false, cell);
2431
2581
  }
2432
2582
  }
2433
2583
  }
@@ -2445,6 +2595,29 @@ class KeyboardInteraction {
2445
2595
  }
2446
2596
  }
2447
2597
  }
2598
+ getTimelineYearTargetCell(key, target, isRight) {
2599
+ return this.isInverseTableSelect() ? this.getVerticalLeftRightCell(target, isRight) :
2600
+ this.getHorizontalLeftRightCell(key, target, isRight);
2601
+ }
2602
+ getHorizontalLeftRightCell(key, target, isRight) {
2603
+ const row = key.element.rows[target.parentNode.sectionRowIndex + (isRight ? 1 : -1)];
2604
+ if (row) {
2605
+ const query = isRight ? '.' + WORK_CELLS_CLASS + ':not(.' + OTHERMONTH_CLASS + ')'
2606
+ : '[data-date="' + ((+target.getAttribute('data-date')) - MS_PER_DAY) + '"]';
2607
+ return row.querySelector(query);
2608
+ }
2609
+ return target;
2610
+ }
2611
+ getVerticalLeftRightCell(target, isRight) {
2612
+ const date = new Date(+target.getAttribute('data-date'));
2613
+ const start = new Date(date.getFullYear(), date.getMonth() + (isRight ? 1 : -1), 1);
2614
+ const tableEle = this.parent.getContentTable();
2615
+ const targetCell = tableEle.querySelector('[data-date="' + start.getTime() + '"]');
2616
+ if (targetCell.parentNode.sectionRowIndex > target.parentNode.sectionRowIndex) {
2617
+ return targetCell;
2618
+ }
2619
+ return tableEle.querySelector('[data-date="' + new Date(start.getFullYear(), start.getMonth() + 1, 0).getTime() + '"]');
2620
+ }
2448
2621
  calculateNextPrevDate(currentCell, target, type) {
2449
2622
  const initialId = this.initialTarget.getAttribute('data-group-index');
2450
2623
  if (this.parent.activeViewOptions.group.resources.length > 0 && this.parent.currentView === 'Month') {
@@ -2488,6 +2661,16 @@ class KeyboardInteraction {
2488
2661
  }
2489
2662
  processTab(e, isReverse) {
2490
2663
  let target = e.target;
2664
+ if (target.classList.contains(INLINE_SUBJECT_CLASS) && this.parent.inlineModule) {
2665
+ target = target.closest('.e-appointment');
2666
+ this.parent.inlineModule.inlineCrudActions(e.target);
2667
+ }
2668
+ if (this.parent.currentView === 'TimelineYear' && target.classList.contains(OTHERMONTH_CLASS)) {
2669
+ if (target.classList.contains(SELECTED_CELL_CLASS)) {
2670
+ this.parent.removeSelectedClass();
2671
+ }
2672
+ return;
2673
+ }
2491
2674
  const popupWrapper = closest(target, '.' + POPUP_WRAPPER_CLASS + ',.' + MORE_POPUP_WRAPPER_CLASS);
2492
2675
  if (popupWrapper && popupWrapper.classList.contains(POPUP_OPEN)) {
2493
2676
  if (popupWrapper.classList.contains(MORE_POPUP_WRAPPER_CLASS)) {
@@ -2529,7 +2712,9 @@ class KeyboardInteraction {
2529
2712
  }
2530
2713
  if (target.classList.contains(APPOINTMENT_CLASS)) {
2531
2714
  let appElements = [].slice.call(this.parent.element.querySelectorAll('.' + APPOINTMENT_CLASS));
2532
- if (this.parent.activeView.isTimelineView() && this.parent.activeViewOptions.group.resources.length > 0) {
2715
+ const isTimelineYear = this.parent.currentView === 'TimelineYear';
2716
+ const isTimeline = this.parent.activeView.isTimelineView() && !isTimelineYear;
2717
+ if ((isTimeline || isTimelineYear && this.parent.activeViewOptions.orientation === 'Vertical') && this.parent.activeViewOptions.group.resources.length > 0) {
2533
2718
  const index = parseInt(target.getAttribute('data-group-index'), 10);
2534
2719
  appElements = [].slice.call(this.parent.element.querySelectorAll(`.${APPOINTMENT_CLASS}[data-group-index="${index}"]`));
2535
2720
  const resCellSelector = `.${RESOURCE_CELLS_CLASS}[data-group-index="${isReverse ? index : index + 1}"]`;
@@ -2578,7 +2763,6 @@ class KeyboardInteraction {
2578
2763
  this.processTabOnResourceCells(target, isReverse);
2579
2764
  }
2580
2765
  }
2581
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
2582
2766
  processDelete(e) {
2583
2767
  let activeEle = document.activeElement;
2584
2768
  if (this.parent.currentView === 'MonthAgenda') {
@@ -2977,7 +3161,6 @@ class Islamic {
2977
3161
  }
2978
3162
  }
2979
3163
 
2980
- /* eslint-disable @typescript-eslint/no-explicit-any */
2981
3164
  /**
2982
3165
  * Time zone
2983
3166
  */
@@ -3546,10 +3729,10 @@ function weeklyType(startDate, endDate, data, ruleObject) {
3546
3729
  let startDateDiff = DAYINDEX.indexOf(DAYINDEX[tempDate.getDay()]) - wkstIndex;
3547
3730
  startDateDiff = startDateDiff === -1 ? 6 : startDateDiff;
3548
3731
  const weekstartDate = addDays(tempDate, -startDateDiff);
3549
- const weekendDate = addDays(weekstartDate, 6);
3732
+ let weekendDate = addDays(weekstartDate, 6);
3550
3733
  let compareTempDate = new Date(tempDate.getTime());
3551
- resetTime(weekendDate);
3552
- resetTime(compareTempDate);
3734
+ weekendDate = resetTime(weekendDate);
3735
+ compareTempDate = resetTime(compareTempDate);
3553
3736
  while (weekendDate >= compareTempDate) {
3554
3737
  if (expectedDays.indexOf(DAYINDEX[tempDate.getDay()]) > -1) {
3555
3738
  weekCollection.push([tempDate.getTime()]);
@@ -3559,7 +3742,7 @@ function weeklyType(startDate, endDate, data, ruleObject) {
3559
3742
  }
3560
3743
  tempDate.setDate(tempDate.getDate() + 1);
3561
3744
  compareTempDate = new Date(tempDate.getTime());
3562
- resetTime(compareTempDate);
3745
+ compareTempDate = resetTime(compareTempDate);
3563
3746
  }
3564
3747
  tempDate.setDate(tempDate.getDate() - 1);
3565
3748
  if (expectedCount && (data.length + ruleObject.recExceptionCount) >= expectedCount) {
@@ -4927,12 +5110,7 @@ class EventBase {
4927
5110
  if (generateID) {
4928
5111
  event[fields.id] = temp++;
4929
5112
  }
4930
- if (typeof event[fields.startTime] === 'string') {
4931
- event[fields.startTime] = getDateFromString(event[fields.startTime]);
4932
- }
4933
- if (typeof event[fields.endTime] === 'string') {
4934
- event[fields.endTime] = getDateFromString(event[fields.endTime]);
4935
- }
5113
+ event = this.updateEventDateTime(event);
4936
5114
  if (timeZonePropChanged) {
4937
5115
  this.processTimezoneChange(event, oldTimezone);
4938
5116
  }
@@ -4991,6 +5169,15 @@ class EventBase {
4991
5169
  this.parent.blockProcessed = blockData;
4992
5170
  return eventData;
4993
5171
  }
5172
+ updateEventDateTime(eventData) {
5173
+ if (typeof eventData[this.parent.eventFields.startTime] === 'string') {
5174
+ eventData[this.parent.eventFields.startTime] = getDateFromString(eventData[this.parent.eventFields.startTime]);
5175
+ }
5176
+ if (typeof eventData[this.parent.eventFields.endTime] === 'string') {
5177
+ eventData[this.parent.eventFields.endTime] = getDateFromString(eventData[this.parent.eventFields.endTime]);
5178
+ }
5179
+ return eventData;
5180
+ }
4994
5181
  getProcessedEvents(eventCollection = this.parent.eventsData) {
4995
5182
  let processed = [];
4996
5183
  for (const event of eventCollection) {
@@ -5490,7 +5677,7 @@ class EventBase {
5490
5677
  const isAllDay = event[fieldMapping.isAllDay];
5491
5678
  const isFullDay = ((event[fieldMapping.endTime].getTime() - event[fieldMapping.startTime].getTime())
5492
5679
  / MS_PER_DAY) >= 1;
5493
- return (isAllDay || isFullDay) ? true : false;
5680
+ return (isAllDay || (this.parent.eventSettings.spannedEventPlacement !== 'TimeSlot' && isFullDay)) ? true : false;
5494
5681
  }
5495
5682
  addEventListener() {
5496
5683
  this.parent.on(documentClick, this.appointmentBorderRemove, this);
@@ -5576,7 +5763,8 @@ class EventBase {
5576
5763
  }
5577
5764
  eventClick(eventData) {
5578
5765
  const target = eventData.target;
5579
- if (target.classList.contains(DRAG_CLONE_CLASS) || target.classList.contains(RESIZE_CLONE_CLASS)) {
5766
+ if (target.classList.contains(DRAG_CLONE_CLASS) || target.classList.contains(RESIZE_CLONE_CLASS) ||
5767
+ target.classList.contains(INLINE_SUBJECT_CLASS)) {
5580
5768
  return;
5581
5769
  }
5582
5770
  if ((eventData.ctrlKey || eventData.metaKey) && eventData.which === 1 && this.parent.keyboardInteractionModule) {
@@ -6025,13 +6213,28 @@ class EventBase {
6025
6213
  indentHeight = dateHeader.offsetHeight - indentHeight;
6026
6214
  this.parent.element.querySelector('.' + ALLDAY_CELLS_CLASS).style.height = (indentHeight / 12) + 'em';
6027
6215
  const content = this.parent.element.querySelector('.' + CONTENT_WRAP_CLASS);
6028
- if (this.parent.uiStateValues.expand && (content.offsetWidth - content.clientWidth > 0 || heightPropChanged)) {
6216
+ if (this.parent.uiStateValues.expand && (content.offsetWidth - content.clientWidth > 0 || heightPropChanged || this.parent.element.classList.contains(DEVICE_CLASS))) {
6029
6217
  addClass([dateHeader], ALLDAY_APPOINTMENT_SCROLL);
6030
6218
  }
6031
6219
  else {
6032
6220
  removeClass([dateHeader], ALLDAY_APPOINTMENT_SCROLL);
6033
6221
  }
6034
6222
  }
6223
+ updateEventMinimumDuration(startEndHours, startTime, endTime) {
6224
+ const eventDuration = (getUniversalTime(endTime) - getUniversalTime(startTime)) / MS_PER_MINUTE;
6225
+ if (eventDuration < this.parent.eventSettings.minimumEventDuration) {
6226
+ const tempEnd = new Date(startTime);
6227
+ tempEnd.setMinutes(tempEnd.getMinutes() + this.parent.eventSettings.minimumEventDuration);
6228
+ endTime = tempEnd;
6229
+ if (endTime.getTime() > startEndHours.endHour.getTime()) {
6230
+ const tempStart = new Date(startEndHours.endHour.getTime());
6231
+ tempStart.setMinutes(tempStart.getMinutes() - this.parent.eventSettings.minimumEventDuration);
6232
+ startTime = tempStart;
6233
+ endTime = startEndHours.endHour;
6234
+ }
6235
+ }
6236
+ return { startDate: startTime, endDate: endTime };
6237
+ }
6035
6238
  unWireEvents() {
6036
6239
  const appElements = [].slice.call(this.parent.element.querySelectorAll('.' + APPOINTMENT_CLASS));
6037
6240
  for (const element of appElements) {
@@ -6433,18 +6636,21 @@ class VerticalEvent extends EventBase {
6433
6636
  if (currentDay.length === 0) {
6434
6637
  currentDate = resetTime(renderedDate[0]);
6435
6638
  }
6436
- const fieldMapping = this.parent.eventFields;
6437
- const startEndHours = getStartEndHours(currentDate, this.startHour, this.endHour);
6639
+ const field = this.parent.eventFields;
6640
+ const schedule = getStartEndHours(currentDate, this.startHour, this.endHour);
6438
6641
  const event = extend({}, record, null, true);
6439
6642
  event.isSpanned = { isBottom: false, isTop: false };
6440
- if (record[fieldMapping.startTime].getTime() < startEndHours.startHour.getTime()) {
6441
- event[fieldMapping.startTime] = startEndHours.startHour;
6643
+ if (record[field.startTime].getTime() < schedule.startHour.getTime()) {
6644
+ event[field.startTime] = schedule.startHour;
6442
6645
  event.isSpanned.isTop = true;
6443
6646
  }
6444
- if (record[fieldMapping.endTime].getTime() > startEndHours.endHour.getTime()) {
6445
- event[fieldMapping.endTime] = startEndHours.endHour;
6647
+ if (record[field.endTime].getTime() > schedule.endHour.getTime()) {
6648
+ event[field.endTime] = schedule.endHour;
6446
6649
  event.isSpanned.isBottom = true;
6447
6650
  }
6651
+ const eventDates = this.updateEventMinimumDuration(schedule, event[field.startTime], event[field.endTime]);
6652
+ event[field.startTime] = eventDates.startDate;
6653
+ event[field.endTime] = eventDates.endDate;
6448
6654
  return event;
6449
6655
  }
6450
6656
  renderAllDayEvents(eventObj, dayIndex, resource, dayCount, inline) {
@@ -6927,10 +7133,10 @@ class MonthEvent extends EventBase {
6927
7133
  this.parent.virtualScrollModule.updateVirtualScrollHeight();
6928
7134
  }
6929
7135
  }
6930
- this.parent.notify(scrollUiUpdate, data);
6931
7136
  if (!this.parent.enablePersistence) {
6932
7137
  this.parent.notify(contentReady, {});
6933
7138
  }
7139
+ this.parent.notify(scrollUiUpdate, data);
6934
7140
  if (this.parent.currentView === 'Month' && this.parent.showWeekNumber) {
6935
7141
  const totalCells = [].slice.call(this.parent.element.querySelectorAll('.e-content-wrap table tr td:first-child'));
6936
7142
  const weekNumberCells = [].slice.call(this.parent.element.querySelectorAll('.' + WEEK_NUMBER_CLASS));
@@ -6978,7 +7184,7 @@ class MonthEvent extends EventBase {
6978
7184
  this.cellHeight = cellDetail.height;
6979
7185
  this.dateRender = dateRender;
6980
7186
  const filteredDates = this.getRenderedDates(dateRender);
6981
- this.getSlotDates(workDays);
7187
+ this.getSlotDates(workDays || this.parent.activeViewOptions.workDays);
6982
7188
  this.processBlockEvents(blockList, resIndex, resData);
6983
7189
  for (const event of eventsList) {
6984
7190
  if (this.parent.resourceBase && !resData) {
@@ -7604,6 +7810,10 @@ class TimelineEvent extends MonthEvent {
7604
7810
  const eventData = event.data;
7605
7811
  startTime = this.getStartTime(event, eventData);
7606
7812
  endTime = this.getEndTime(event, eventData);
7813
+ const startEndHours = getStartEndHours(event[this.fields.startTime], this.startHour, this.endHour);
7814
+ const eventDates = this.updateEventMinimumDuration(startEndHours, startTime, endTime);
7815
+ startTime = eventDates.startDate;
7816
+ endTime = eventDates.endDate;
7607
7817
  this.day = this.parent.getIndexOfDate(this.dateRender, resetTime(new Date(startTime.getTime())));
7608
7818
  if (this.day < 0) {
7609
7819
  return;
@@ -7990,11 +8200,11 @@ class InlineEdit {
7990
8200
  if (this.parent.quickPopup) {
7991
8201
  this.parent.quickPopup.quickPopupHide();
7992
8202
  }
7993
- const moreWrapper = this.parent.element.querySelector('.e-more-popup-wrapper ');
7994
- if (moreWrapper && moreWrapper.classList.contains(POPUP_OPEN)) {
7995
- this.parent.quickPopup.morePopup.hide();
7996
- }
7997
8203
  if (args.type === 'Cell') {
8204
+ const moreWrapper = this.parent.element.querySelector('.' + MORE_POPUP_WRAPPER_CLASS);
8205
+ if (moreWrapper && moreWrapper.classList.contains(POPUP_OPEN)) {
8206
+ this.parent.quickPopup.morePopup.hide();
8207
+ }
7998
8208
  this.removeInlineAppointmentElement();
7999
8209
  this.cellEdit(args);
8000
8210
  }
@@ -8057,8 +8267,8 @@ class InlineEdit {
8057
8267
  '.e-inner-wrap' : '.e-appointment-details';
8058
8268
  args.element.querySelector(elementSelector).insertBefore(inlineSubject, timeEle);
8059
8269
  }
8270
+ inlineSubject.focus();
8060
8271
  }
8061
- inlineSubject.focus();
8062
8272
  inlineSubject.setSelectionRange(subject.length, subject.length);
8063
8273
  }
8064
8274
  createVerticalViewInline(saveObj, dayIndex, resIndex, daysCount) {
@@ -8152,6 +8362,9 @@ class InlineEdit {
8152
8362
  if (target && target.value !== '') {
8153
8363
  this.inlineCrudActions(target);
8154
8364
  }
8365
+ else {
8366
+ this.removeInlineAppointmentElement();
8367
+ }
8155
8368
  }
8156
8369
  inlineCrudActions(target) {
8157
8370
  if (closest(target, '.' + INLINE_APPOINTMENT_CLASS)) {
@@ -8246,6 +8459,9 @@ class FieldValidator {
8246
8459
  if (!elem && !this.ignoreError) {
8247
8460
  this.createTooltip(inputElement, error, id, '');
8248
8461
  }
8462
+ if (!isNullOrUndefined(elem)) {
8463
+ elem.querySelector('.e-error').innerHTML = error.innerHTML;
8464
+ }
8249
8465
  }
8250
8466
  createTooltip(element, error, name, display) {
8251
8467
  let dlgContent;
@@ -9182,6 +9398,9 @@ class QuickPopups {
9182
9398
  }
9183
9399
  closeClick(event) {
9184
9400
  this.dialogEvent = event;
9401
+ if (this.parent.currentView === 'Year' && this.parent.activeCellsData && this.parent.activeCellsData.element) {
9402
+ this.parent.selectCell(this.parent.activeCellsData.element);
9403
+ }
9185
9404
  this.quickPopupHide();
9186
9405
  this.morePopup.hide();
9187
9406
  }
@@ -9765,6 +9984,7 @@ const INTERVALCLASS = 'e-interval';
9765
9984
  const DAYWRAPPER = 'e-days';
9766
9985
  const WEEKWRAPPER = 'e-non-week';
9767
9986
  const WEEKPOSITION = 'e-week-position';
9987
+ const DAYPOSITION = 'e-day-position';
9768
9988
  const YEAREXPANDERWRAPPER = 'e-year-expander';
9769
9989
  const YEAREXPANDERELEMENT = 'e-year-expander-element';
9770
9990
  const MONETHEXPANDERWRAPPER = 'e-month-expander';
@@ -10109,7 +10329,6 @@ let RecurrenceEditor = class RecurrenceEditor extends Component {
10109
10329
  }
10110
10330
  });
10111
10331
  this.endType.appendTo(this.element.querySelector('.' + ENDONELEMENT));
10112
- // eslint-disable-next-line @typescript-eslint/ban-types
10113
10332
  const renderDropDownList = (dropDownData) => {
10114
10333
  return new DropDownList({
10115
10334
  dataSource: dropDownData,
@@ -10471,7 +10690,7 @@ let RecurrenceEditor = class RecurrenceEditor extends Component {
10471
10690
  '<td><div class="' + INPUTWARAPPER + ' ' + WEEKPOSITION + '" >' +
10472
10691
  '<input type="text" tabindex="0" class="' + MONTHPOS + '"title="' + this.localeObj.getConstant('monthPosition') + '" />' +
10473
10692
  '</div></td>' +
10474
- '<td><div class="' + INPUTWARAPPER + '" style="min-width: 120px;">' +
10693
+ '<td><div class="' + INPUTWARAPPER + ' ' + DAYPOSITION + '">' +
10475
10694
  '<input type="text" tabindex="0" class="' + MONTHWEEK + '"title="' + this.localeObj.getConstant('monthWeek') + '" />' +
10476
10695
  '</div></td></tr></table>' +
10477
10696
  '</div></div>' +
@@ -10852,7 +11071,6 @@ class EventWindow {
10852
11071
  this.parent = parent;
10853
11072
  this.l10n = this.parent.localeObj;
10854
11073
  this.fields = this.parent.eventFields;
10855
- this.timezoneData = this.parent.tzModule.timezoneData;
10856
11074
  this.eventWindowTime = { startTime: new Date(), endTime: new Date() };
10857
11075
  this.renderEventWindow();
10858
11076
  }
@@ -11284,14 +11502,15 @@ class EventWindow {
11284
11502
  allowFiltering: true,
11285
11503
  change: this.onTimezoneChange.bind(this),
11286
11504
  cssClass: this.parent.cssClass || '',
11287
- dataSource: this.timezoneData,
11505
+ dataSource: this.parent.timezoneDataSource,
11288
11506
  enableRtl: this.parent.enableRtl,
11289
11507
  fields: { text: 'Text', value: 'Value' },
11290
- filterBarPlaceholder: 'Search Timezone',
11508
+ filterBarPlaceholder: this.parent.localeObj.getConstant('searchTimezone'),
11509
+ noRecordsTemplate: this.parent.localeObj.getConstant('noRecords'),
11291
11510
  filtering: (e) => {
11292
11511
  let query = new Query();
11293
11512
  query = (e.text !== '') ? query.where('Text', 'contains', e.text, true) : query;
11294
- e.updateData(this.timezoneData, query);
11513
+ e.updateData(this.parent.timezoneDataSource, query);
11295
11514
  },
11296
11515
  htmlAttributes: { 'title': this.getFieldLabel(value), 'name': fieldName },
11297
11516
  floatLabelType: 'Always',
@@ -12586,7 +12805,6 @@ class EventWindow {
12586
12805
  this.fields = null;
12587
12806
  this.buttonObj = null;
12588
12807
  this.repeatStatus = null;
12589
- this.timezoneData = null;
12590
12808
  this.eventWindowTime = null;
12591
12809
  }
12592
12810
  }
@@ -13175,7 +13393,8 @@ class Crud {
13175
13393
  const editParams = { addedRecords: [], changedRecords: [], deletedRecords: [] };
13176
13394
  let promise;
13177
13395
  if (addArgs.addedRecords instanceof Array) {
13178
- for (const event of addArgs.addedRecords) {
13396
+ for (let event of addArgs.addedRecords) {
13397
+ event = this.parent.eventBase.updateEventDateTime(event);
13179
13398
  const eventData = extend({}, this.parent.eventBase.processTimezone(event, true), null, true);
13180
13399
  editParams.addedRecords.push(eventData);
13181
13400
  }
@@ -13230,7 +13449,8 @@ class Crud {
13230
13449
  const fields = this.parent.eventFields;
13231
13450
  const editParams = { addedRecords: [], changedRecords: [], deletedRecords: [] };
13232
13451
  if (saveArgs.changedRecords instanceof Array) {
13233
- for (const event of saveArgs.changedRecords) {
13452
+ for (let event of saveArgs.changedRecords) {
13453
+ event = this.parent.eventBase.updateEventDateTime(event);
13234
13454
  const eventData = extend({}, this.parent.eventBase.processTimezone(event, true), null, true);
13235
13455
  editParams.changedRecords.push(eventData);
13236
13456
  }
@@ -13920,6 +14140,12 @@ __decorate$6([
13920
14140
  __decorate$6([
13921
14141
  Property(false)
13922
14142
  ], EventSettings.prototype, "enableTooltip", void 0);
14143
+ __decorate$6([
14144
+ Property('AllDayRow')
14145
+ ], EventSettings.prototype, "spannedEventPlacement", void 0);
14146
+ __decorate$6([
14147
+ Property(1)
14148
+ ], EventSettings.prototype, "minimumEventDuration", void 0);
13923
14149
  __decorate$6([
13924
14150
  Property()
13925
14151
  ], EventSettings.prototype, "tooltipTemplate", void 0);
@@ -14371,6 +14597,7 @@ class ResourceBase {
14371
14597
  targetType: 'relative',
14372
14598
  actionOnScroll: 'none',
14373
14599
  content: this.treeViewObj.element,
14600
+ relateTo: this.parent.element.querySelector('.' + TABLE_CONTAINER_CLASS),
14374
14601
  enableRtl: this.parent.enableRtl,
14375
14602
  hideAnimation: { name: 'SlideLeftOut', duration: 500 },
14376
14603
  showAnimation: { name: 'SlideLeftIn', duration: 500 },
@@ -15269,13 +15496,19 @@ let Schedule = class Schedule extends Component {
15269
15496
  timeFormat: this.internalTimeFormat,
15270
15497
  group: group,
15271
15498
  headerRows: this.headerRows,
15272
- orientation: 'Horizontal'
15499
+ orientation: 'Horizontal',
15500
+ numberOfWeeks: 0,
15501
+ displayDate: null
15273
15502
  };
15274
15503
  const viewOptions = this.viewCollections[this.viewIndex];
15275
15504
  const viewsData = extend(scheduleOptions, viewOptions, undefined, true);
15276
15505
  if (this.firstDayOfWeek !== 0 && viewOptions.firstDayOfWeek && this.firstDayOfWeek !== viewOptions.firstDayOfWeek) {
15277
15506
  viewsData.firstDayOfWeek = this.firstDayOfWeek;
15278
15507
  }
15508
+ if (viewsData.displayDate) {
15509
+ viewsData.displayDate = viewsData.displayDate instanceof Date ? new Date(viewsData.displayDate.getTime()) :
15510
+ new Date(viewsData.displayDate);
15511
+ }
15279
15512
  return viewsData;
15280
15513
  }
15281
15514
  initializeDataModule() {
@@ -15582,7 +15815,7 @@ let Schedule = class Schedule extends Component {
15582
15815
  if (this && isNullOrUndefined(this.uiStateValues) || !(this.enablePersistence)) {
15583
15816
  this.uiStateValues = {
15584
15817
  expand: false, isInitial: true, left: 0, top: 0, isGroupAdaptive: false,
15585
- isIgnoreOccurrence: false, groupIndex: 0, action: false, isBlock: false
15818
+ isIgnoreOccurrence: false, groupIndex: 0, action: false, isBlock: false, isCustomMonth: true
15586
15819
  };
15587
15820
  }
15588
15821
  this.activeCellsData = { startTime: this.getCurrentTime(), endTime: this.getCurrentTime(), isAllDay: false };
@@ -15681,7 +15914,9 @@ let Schedule = class Schedule extends Component {
15681
15914
  beginFrom: 'Begin From',
15682
15915
  endAt: 'Ends At',
15683
15916
  expandAllDaySection: 'Expand-all-day-section',
15684
- collapseAllDaySection: 'Collapse-all-day-section'
15917
+ collapseAllDaySection: 'Collapse-all-day-section',
15918
+ searchTimezone: 'Search Timezone',
15919
+ noRecords: 'No records found'
15685
15920
  };
15686
15921
  }
15687
15922
  wireEvents() {
@@ -16397,6 +16632,11 @@ let Schedule = class Schedule extends Component {
16397
16632
  this.keyboardInteractionModule = new KeyboardInteraction(this);
16398
16633
  }
16399
16634
  break;
16635
+ case 'timezoneDataSource':
16636
+ if (this.eventWindow) {
16637
+ this.eventWindow.refresh();
16638
+ }
16639
+ break;
16400
16640
  case 'editorTemplate':
16401
16641
  if (!isNullOrUndefined(this.editorTemplate)) {
16402
16642
  this.editorTemplateFn = this.templateParser(this.editorTemplate);
@@ -16538,6 +16778,8 @@ let Schedule = class Schedule extends Component {
16538
16778
  this.eventWindow.refresh();
16539
16779
  }
16540
16780
  break;
16781
+ case 'spannedEventPlacement':
16782
+ case 'minimumEventDuration':
16541
16783
  case 'enableMaxHeight':
16542
16784
  case 'enableIndicator':
16543
16785
  this.refreshEvents(false);
@@ -16910,7 +17152,7 @@ let Schedule = class Schedule extends Component {
16910
17152
  */
16911
17153
  exportToExcel(excelExportOptions) {
16912
17154
  if (this.excelExportModule) {
16913
- this.excelExportModule.initializeExcelExport(excelExportOptions || {});
17155
+ this.excelExportModule.initializeExcelExport(excelExportOptions);
16914
17156
  }
16915
17157
  else {
16916
17158
  throw Error('Inject ExcelExport module');
@@ -17094,6 +17336,9 @@ let Schedule = class Schedule extends Component {
17094
17336
  this.crudModule.refreshDataManager();
17095
17337
  }
17096
17338
  else {
17339
+ if (this.activeViewOptions && this.activeViewOptions.eventTemplate) {
17340
+ this.resetTemplates(['eventTemplate']);
17341
+ }
17097
17342
  const eventsData = this.eventsData || [];
17098
17343
  const blockData = this.blockData || [];
17099
17344
  const data = eventsData.concat(blockData);
@@ -17348,6 +17593,7 @@ let Schedule = class Schedule extends Component {
17348
17593
  this.eventTooltip = null;
17349
17594
  }
17350
17595
  this.destroyPopups();
17596
+ this.hideSpinner();
17351
17597
  this.unWireEvents();
17352
17598
  this.destroyHeaderModule();
17353
17599
  if (this.eventTooltip) {
@@ -17559,6 +17805,9 @@ __decorate([
17559
17805
  __decorate([
17560
17806
  Complex({}, EventSettings)
17561
17807
  ], Schedule.prototype, "eventSettings", void 0);
17808
+ __decorate([
17809
+ Property(timezoneData)
17810
+ ], Schedule.prototype, "timezoneDataSource", void 0);
17562
17811
  __decorate([
17563
17812
  Property()
17564
17813
  ], Schedule.prototype, "resourceHeaderTemplate", void 0);
@@ -19096,7 +19345,7 @@ class YearEvent extends TimelineEvent {
19096
19345
  }
19097
19346
  }
19098
19347
  else {
19099
- if (((resetTime(appStart).getTime() <= dateStart) && (resetTime(appEnd).getTime() > dateStart)) ||
19348
+ if (((resetTime(appStart).getTime() <= dateStart) && (resetTime(appEnd).getTime() >= dateStart)) ||
19100
19349
  (resetTime(appStart).getTime() >= dateStart) && (resetTime(appEnd).getTime() <= dateEnd)) {
19101
19350
  appointmentsList.push(app);
19102
19351
  }
@@ -19274,7 +19523,9 @@ class DragAndDrop extends ActionBase {
19274
19523
  const eventGuid = this.actionObj.element.getAttribute('data-guid');
19275
19524
  this.actionObj.event = this.parent.eventBase.getEventByGuid(eventGuid);
19276
19525
  const eventObj = extend({}, this.actionObj.event, null, true);
19277
- this.startTime = eventObj[this.parent.eventFields.startTime].getTime();
19526
+ if (!isNullOrUndefined(eventObj)) {
19527
+ this.startTime = eventObj[this.parent.eventFields.startTime].getTime();
19528
+ }
19278
19529
  const dragArgs = {
19279
19530
  cancel: false,
19280
19531
  data: eventObj,
@@ -19691,7 +19942,7 @@ class DragAndDrop extends ActionBase {
19691
19942
  return;
19692
19943
  }
19693
19944
  const td = tr.children[colIndex];
19694
- if (this.parent.activeViewOptions.group.resources.length > 0) {
19945
+ if (this.parent.activeViewOptions.group.resources.length > 0 && !this.parent.uiStateValues.isGroupAdaptive) {
19695
19946
  this.actionObj.groupIndex = parseInt(td.getAttribute('data-group-index'), 10);
19696
19947
  }
19697
19948
  let dragStart$$1;
@@ -19776,18 +20027,20 @@ class DragAndDrop extends ActionBase {
19776
20027
  const eventData = [];
19777
20028
  const startTime = event[eventFields.startTime];
19778
20029
  const endTime = event[eventFields.endTime];
19779
- const isDifferentDate = resetTime(new Date(startTime.getTime())) < resetTime(new Date(endTime.getTime()));
19780
- if (isDifferentDate) {
19781
- const scheduleStartHour = this.parent.activeView.getStartHour();
19782
- const scheduleEndHour = this.parent.activeView.getEndHour();
19783
- const startDate = getStartEndHours(resetTime(startTime), scheduleStartHour, scheduleEndHour);
19784
- const endDate = getStartEndHours(resetTime(endTime), scheduleStartHour, scheduleEndHour);
19785
- const firstEventObj = extend({}, event, null, true);
19786
- firstEventObj[eventFields.endTime] = startDate.endHour;
19787
- eventData.push(firstEventObj);
19788
- const secondEventObj = extend({}, event, null, true);
19789
- secondEventObj[eventFields.startTime] = endDate.startHour;
19790
- eventData.push(secondEventObj);
20030
+ if (resetTime(new Date(startTime.getTime())) < resetTime(new Date(endTime.getTime()))) {
20031
+ let startReferenceDate = resetTime(new Date(startTime.getTime()));
20032
+ let endReferenceDate = new Date(startReferenceDate.getTime());
20033
+ for (let i = 0; startReferenceDate < new Date(endTime.getTime()); i++) {
20034
+ endReferenceDate = new Date(endReferenceDate.setDate(startReferenceDate.getDate() + 1));
20035
+ const eventObj = extend({}, event, null, true);
20036
+ eventObj[eventFields.startTime] = new Date(startReferenceDate);
20037
+ eventObj[eventFields.endTime] = new Date(endReferenceDate);
20038
+ startReferenceDate = new Date(startReferenceDate.setDate(startReferenceDate.getDate() + 1));
20039
+ eventData.push(eventObj);
20040
+ }
20041
+ const index = eventData.length - 1;
20042
+ eventData[0][eventFields.startTime] = startTime;
20043
+ eventData[index][eventFields.endTime] = endTime;
19791
20044
  }
19792
20045
  else {
19793
20046
  eventData.push(event);
@@ -19858,8 +20111,8 @@ class DragAndDrop extends ActionBase {
19858
20111
  // eslint-disable-next-line max-len
19859
20112
  this.parent.getDateFromElement(isNullOrUndefined(index) ? this.actionObj.target : this.targetTd)));
19860
20113
  const splitEvents = this.splitEvent(event);
19861
- const events = event[this.parent.eventFields.isAllDay] ||
19862
- this.parent.eventBase.isAllDayAppointment(event) || splitEvents.length > 2 ? [event] : splitEvents;
20114
+ const events = this.parent.eventBase.isAllDayAppointment(event) || splitEvents.length > 2 ||
20115
+ this.parent.eventSettings.spannedEventPlacement !== 'TimeSlot' ? [event] : splitEvents;
19863
20116
  for (let i = 0; i < events.length; i++) {
19864
20117
  if (i > 0) {
19865
20118
  let filterQuery = `.e-day-wrapper[data-date="${resetTime(events[i][this.parent.eventFields.startTime]).getTime()}"]`;
@@ -19955,7 +20208,7 @@ class DragAndDrop extends ActionBase {
19955
20208
  const renderDates = this.getRenderedDates();
19956
20209
  const events = this.parent.eventBase.splitEvent(event, renderDates);
19957
20210
  let query = `.e-all-day-cells[data-date="${events[0][this.parent.eventFields.startTime].getTime()}"]`;
19958
- if (this.parent.activeViewOptions.group.resources.length > 0) {
20211
+ if (this.parent.activeViewOptions.group.resources.length > 0 && !this.parent.uiStateValues.isGroupAdaptive) {
19959
20212
  query = query.concat('[data-group-index = "' + this.actionObj.groupIndex + '"]');
19960
20213
  }
19961
20214
  const cell = [].slice.call(this.parent.element.querySelectorAll(query));
@@ -20153,7 +20406,13 @@ class DragAndDrop extends ActionBase {
20153
20406
  if (this.parent.eventDragArea) {
20154
20407
  const targetDate = this.parent.getDateFromElement(e.target);
20155
20408
  if (!isNullOrUndefined(targetDate)) {
20156
- eventStart = targetDate;
20409
+ if (!this.parent.activeViewOptions.timeScale.enable || (this.parent.currentView == "TimelineMonth")) {
20410
+ const eventSrt = eventObj[this.parent.eventFields.startTime];
20411
+ eventStart = new Date(eventStart.setHours(eventSrt.getHours(), eventSrt.getMinutes(), eventSrt.getSeconds()));
20412
+ }
20413
+ else {
20414
+ eventStart = targetDate;
20415
+ }
20157
20416
  }
20158
20417
  }
20159
20418
  const eventEnd = new Date(eventStart.getTime());
@@ -20582,6 +20841,10 @@ class ViewBase {
20582
20841
  return date.setHours(0, 0, 0, 0) === this.parent.getCurrentTime().setHours(0, 0, 0, 0);
20583
20842
  }
20584
20843
  isCurrentMonth(date) {
20844
+ if (this.parent.activeViewOptions.displayDate || this.parent.activeViewOptions.numberOfWeeks > 0) {
20845
+ return this.parent.activeView.getStartDate().getTime() <= this.parent.getCurrentTime().getTime() &&
20846
+ this.parent.activeView.getEndDate().getTime() >= this.parent.getCurrentTime().getTime();
20847
+ }
20585
20848
  return date.getFullYear() ===
20586
20849
  this.parent.getCurrentTime().getFullYear() && date.getMonth() === this.parent.getCurrentTime().getMonth();
20587
20850
  }
@@ -20812,6 +21075,11 @@ class ViewBase {
20812
21075
  setStyleAttribute(resourceColumn, { 'height': formatUnit(content.clientHeight) });
20813
21076
  }
20814
21077
  }
21078
+ const headerCellElements = [].slice.call(this.element.querySelectorAll('.' + HEADER_CELLS_CLASS));
21079
+ headerCellElements.forEach((ele) => {
21080
+ const headerCellColSpan = parseInt(ele.getAttribute('colspan'), 10);
21081
+ setStyleAttribute(ele, { 'width': formatUnit(colWidth * headerCellColSpan) });
21082
+ });
20815
21083
  }
20816
21084
  }
20817
21085
  resetColWidth() {
@@ -21849,10 +22117,11 @@ class Month extends ViewBase {
21849
22117
  getDateSlots(renderDates, workDays) {
21850
22118
  const count = this.parent.activeViewOptions.showWeekend ? WEEK_LENGTH : workDays.length;
21851
22119
  const dateSlots = [];
22120
+ const isCurrentMonth = this.isCurrentMonth(this.parent.selectedDate);
21852
22121
  for (let col = 0; col < count; col++) {
21853
22122
  const classList$$1 = [HEADER_CELLS_CLASS];
21854
22123
  const currentDateIndex = renderDates.slice(0, count).map((date) => date.getDay());
21855
- if (this.isCurrentMonth(this.parent.selectedDate) && currentDateIndex.indexOf(this.parent.getCurrentTime().getDay()) === col) {
22124
+ if (isCurrentMonth && currentDateIndex.indexOf(this.parent.getCurrentTime().getDay()) === col) {
21856
22125
  classList$$1.push(CURRENT_DAY_CLASS);
21857
22126
  }
21858
22127
  dateSlots.push({ date: renderDates[col], type: 'monthDay', className: classList$$1, colSpan: 1, workDays: workDays });
@@ -21891,6 +22160,9 @@ class Month extends ViewBase {
21891
22160
  this.renderResourceMobileLayout();
21892
22161
  }
21893
22162
  this.parent.notify(contentReady, {});
22163
+ if (this.parent.uiStateValues.isCustomMonth) {
22164
+ this.parent.uiStateValues.isCustomMonth = false;
22165
+ }
21894
22166
  }
21895
22167
  refreshHeader() {
21896
22168
  remove(this.element.querySelector('tbody tr'));
@@ -22073,7 +22345,7 @@ class Month extends ViewBase {
22073
22345
  return slotDatas;
22074
22346
  }
22075
22347
  updateClassList(data) {
22076
- if (this.isOtherMonth(data.date)) {
22348
+ if (!this.isCustomMonth() && this.isOtherMonth(data.date)) {
22077
22349
  data.className.push(OTHERMONTH_CLASS);
22078
22350
  }
22079
22351
  if (!this.parent.isMinMaxDate(data.date)) {
@@ -22182,15 +22454,33 @@ class Month extends ViewBase {
22182
22454
  }
22183
22455
  }
22184
22456
  getMonthStart(currentDate) {
22185
- const monthStart = getWeekFirstDate(this.parent.calendarUtil.firstDateOfMonth(currentDate), this.parent.activeViewOptions.firstDayOfWeek);
22186
- const start = new Date(monthStart.getFullYear(), monthStart.getMonth(), monthStart.getDate());
22187
- return start;
22457
+ const useDisplayDate = this.parent.currentView === 'Month' && !isNullOrUndefined(this.parent.activeViewOptions.displayDate) && (this.parent.uiStateValues.isCustomMonth || this.isCustomRange());
22458
+ const date = useDisplayDate ? this.parent.activeViewOptions.displayDate : !(this.parent.uiStateValues.isCustomMonth ||
22459
+ this.isCustomRange()) && this.isCustomMonth() ? currentDate : this.parent.calendarUtil.firstDateOfMonth(currentDate);
22460
+ const monthStart = getWeekFirstDate(date, this.parent.activeViewOptions.firstDayOfWeek);
22461
+ return new Date(monthStart.getFullYear(), monthStart.getMonth(), monthStart.getDate());
22188
22462
  }
22189
22463
  getMonthEnd(currentDate) {
22190
- const endDate = addMonths(currentDate, this.parent.activeViewOptions.interval - 1);
22191
- const lastWeekOfMonth = getWeekFirstDate(this.parent.calendarUtil.lastDateOfMonth(endDate), this.parent.activeViewOptions.firstDayOfWeek);
22192
- const monthEnd = addDays(lastWeekOfMonth, WEEK_LENGTH - 1);
22193
- return monthEnd;
22464
+ if (this.isCustomMonth()) {
22465
+ const start = this.getMonthStart(currentDate);
22466
+ const numberOfDays = WEEK_LENGTH * (this.parent.activeViewOptions.numberOfWeeks > 0 ?
22467
+ this.parent.activeViewOptions.numberOfWeeks : DEFAULT_WEEKS);
22468
+ return addDays(start, (numberOfDays - 1));
22469
+ }
22470
+ else {
22471
+ const endDate = addMonths(currentDate, this.parent.activeViewOptions.interval - 1);
22472
+ const lastWeekOfMonth = getWeekFirstDate(this.parent.calendarUtil.lastDateOfMonth(endDate), this.parent.activeViewOptions.firstDayOfWeek);
22473
+ return addDays(lastWeekOfMonth, WEEK_LENGTH - 1);
22474
+ }
22475
+ }
22476
+ isCustomRange() {
22477
+ const dates = this.parent.getCurrentViewDates();
22478
+ if (dates && dates.length > 0) {
22479
+ const selectedTime = resetTime(this.parent.selectedDate).getTime();
22480
+ return !(selectedTime >= getWeekFirstDate(dates[0], this.parent.activeViewOptions.firstDayOfWeek).getTime() &&
22481
+ selectedTime <= addDays(getWeekFirstDate(dates[dates.length - 1], this.parent.activeViewOptions.firstDayOfWeek), 6).getTime());
22482
+ }
22483
+ return false;
22194
22484
  }
22195
22485
  getRenderDates(workDays) {
22196
22486
  const renderDates = [];
@@ -22220,34 +22510,57 @@ class Month extends ViewBase {
22220
22510
  return renderDates;
22221
22511
  }
22222
22512
  getNextPreviousDate(type) {
22223
- if (type === 'next') {
22224
- return addMonths(this.parent.selectedDate, this.parent.activeViewOptions.interval);
22513
+ if (this.isCustomMonth()) {
22514
+ const dates = this.parent.getCurrentViewDates();
22515
+ const date = getWeekFirstDate(type === 'next' ? dates[dates.length - 1]
22516
+ : dates[0], this.parent.activeViewOptions.firstDayOfWeek);
22517
+ return addDays(date, type === 'next' ? WEEK_LENGTH : -(this.parent.activeViewOptions.numberOfWeeks > 0 ?
22518
+ this.parent.activeViewOptions.numberOfWeeks : DEFAULT_WEEKS) * WEEK_LENGTH);
22225
22519
  }
22226
22520
  else {
22227
- return addMonths(this.parent.selectedDate, -(this.parent.activeViewOptions.interval));
22521
+ return addMonths(this.parent.selectedDate, ((type === 'next' ? 1 : -1) * this.parent.activeViewOptions.interval));
22228
22522
  }
22229
22523
  }
22524
+ getStartDate() {
22525
+ return this.getMonthStart(this.parent.selectedDate);
22526
+ }
22527
+ getEndDate() {
22528
+ return this.getMonthEnd(this.parent.selectedDate);
22529
+ }
22230
22530
  getEndDateFromStartDate(start) {
22231
22531
  return addDays(new Date(start.getTime()), 1);
22232
22532
  }
22233
22533
  getDateRangeText() {
22234
22534
  if (this.parent.isAdaptive || isNullOrUndefined(this.parent.activeViewOptions.dateFormat)) {
22235
- if (this.parent.activeViewOptions.interval > 1) {
22236
- const endDate = addMonths(lastDateOfMonth(this.parent.selectedDate), this.parent.activeViewOptions.interval - 1);
22237
- if (this.parent.selectedDate.getFullYear() === endDate.getFullYear()) {
22238
- const monthNames = (this.parent.globalize.formatDate(this.parent.selectedDate, { format: 'MMMM', calendar: this.parent.getCalendarMode() })) + ' - ' +
22535
+ let startDate = this.parent.selectedDate;
22536
+ let endDate;
22537
+ let updateCustomRange = false;
22538
+ if (this.isCustomMonth()) {
22539
+ const dates = this.parent.getCurrentViewDates();
22540
+ updateCustomRange = dates[0].getMonth() !== dates[dates.length - 1].getMonth() ||
22541
+ dates[0].getFullYear() !== dates[dates.length - 1].getFullYear();
22542
+ if (updateCustomRange) {
22543
+ startDate = dates[0];
22544
+ endDate = dates[dates.length - 1];
22545
+ }
22546
+ }
22547
+ const isUpdateDateRange = (this.parent.currentView !== 'Month' || !this.isCustomMonth());
22548
+ if (this.parent.activeViewOptions.interval > 1 && isUpdateDateRange || updateCustomRange) {
22549
+ endDate = endDate ? endDate : addMonths(lastDateOfMonth(startDate), this.parent.activeViewOptions.interval - 1);
22550
+ if (startDate.getFullYear() === endDate.getFullYear()) {
22551
+ const monthNames = (this.parent.globalize.formatDate(startDate, { format: 'MMMM', calendar: this.parent.getCalendarMode() })) + ' - ' +
22239
22552
  (this.parent.globalize.formatDate(endDate, { format: 'MMMM ', calendar: this.parent.getCalendarMode() })) +
22240
22553
  this.parent.globalize.formatDate(endDate, { skeleton: 'y', calendar: this.parent.getCalendarMode() });
22241
22554
  return capitalizeFirstWord(monthNames, 'single');
22242
22555
  }
22243
- const text = (this.parent.globalize.formatDate(this.parent.selectedDate, { format: 'MMMM', calendar: this.parent.getCalendarMode() })) + ' ' +
22244
- this.parent.selectedDate.getFullYear() + ' - ' +
22556
+ const text = (this.parent.globalize.formatDate(startDate, { format: 'MMMM', calendar: this.parent.getCalendarMode() })) + ' ' +
22557
+ startDate.getFullYear() + ' - ' +
22245
22558
  this.parent.globalize.formatDate(endDate, { format: 'MMMM ', calendar: this.parent.getCalendarMode() }) +
22246
22559
  this.parent.globalize.formatDate(endDate, { skeleton: 'y', calendar: this.parent.getCalendarMode() });
22247
22560
  return capitalizeFirstWord(text, 'single');
22248
22561
  }
22249
22562
  const format = (this.parent.activeViewOptions.dateFormat) ? this.parent.activeViewOptions.dateFormat : 'MMMM y';
22250
- return capitalizeFirstWord(this.parent.globalize.formatDate(this.parent.selectedDate, { format: format, calendar: this.parent.getCalendarMode() }), 'single');
22563
+ return capitalizeFirstWord(this.parent.globalize.formatDate(startDate, { format: format, calendar: this.parent.getCalendarMode() }), 'single');
22251
22564
  }
22252
22565
  return this.formatDateRange(this.parent.selectedDate);
22253
22566
  }
@@ -22272,6 +22585,10 @@ class Month extends ViewBase {
22272
22585
  EventHandler.remove(contentScrollableEle, 'scroll', this.onContentScroll);
22273
22586
  }
22274
22587
  }
22588
+ isCustomMonth() {
22589
+ return this.parent.currentView === 'Month' &&
22590
+ (!isNullOrUndefined(this.parent.activeViewOptions.displayDate) || this.parent.activeViewOptions.numberOfWeeks > 0);
22591
+ }
22275
22592
  getModuleName() {
22276
22593
  return 'month';
22277
22594
  }
@@ -22503,12 +22820,29 @@ class Year extends ViewBase {
22503
22820
  return Array.apply(null, { length: this.parent.activeViewOptions.monthsCount }).map((value, index) => this.parent.firstMonthOfYear + index);
22504
22821
  }
22505
22822
  onCellClick(e) {
22506
- const target = closest(e.target, '.' + WORK_CELLS_CLASS);
22823
+ let target = closest(e.target, '.' + WORK_CELLS_CLASS);
22507
22824
  const startDate = this.parent.getDateFromElement(target);
22508
- const endDate = addDays(new Date(startDate.getTime()), 1);
22509
- const filteredEvents = this.parent.eventBase.filterEvents(startDate, endDate);
22510
- const moreEventArgs = { date: startDate, event: filteredEvents, element: e.target };
22511
- this.parent.quickPopup.moreEventClick(moreEventArgs, endDate);
22825
+ this.parent.activeCellsData = this.parent.getCellDetails(target);
22826
+ const isPrevious = startDate.getTime() < this.getStartDate().getTime();
22827
+ if (isPrevious || startDate.getTime() > this.getEndDate().getTime()) {
22828
+ this.parent.changeDate(this.parent.activeView.getNextPreviousDate(isPrevious ? 'previous' : 'next'), e);
22829
+ const activeDate = this.parent.activeCellsData.startTime.getTime();
22830
+ const inRange = activeDate >= this.getStartDate().getTime() && activeDate <= this.getEndDate().getTime();
22831
+ const dateAttr = inRange ? activeDate : (isPrevious ? this.getEndDate() : this.getStartDate()).getTime();
22832
+ const selectedCell = this.parent.element.querySelector(':not(.' + OTHERMONTH_CLASS + ')[data-date="' + dateAttr + '"]');
22833
+ this.parent.selectCell(selectedCell);
22834
+ this.parent.activeCellsData = this.parent.getCellDetails(selectedCell);
22835
+ }
22836
+ else {
22837
+ const endDate = addDays(new Date(startDate.getTime()), 1);
22838
+ const filteredEvents = this.parent.eventBase.filterEvents(startDate, endDate);
22839
+ const moreEventArgs = { date: startDate, event: filteredEvents, element: e.target };
22840
+ if (target.classList.contains(OTHERMONTH_CLASS)) {
22841
+ target = this.parent.element.querySelector(':not(.' + OTHERMONTH_CLASS + ')[data-date="' + target.getAttribute('data-date') + '"]');
22842
+ }
22843
+ this.parent.activeCellsData = this.parent.getCellDetails(target);
22844
+ this.parent.quickPopup.moreEventClick(moreEventArgs, endDate);
22845
+ }
22512
22846
  }
22513
22847
  onContentScroll(e) {
22514
22848
  const target = e.target;
@@ -22560,10 +22894,10 @@ class Year extends ViewBase {
22560
22894
  return addDays(addMonths(this.getStartDate(), this.parent.monthsCount), -1);
22561
22895
  }
22562
22896
  startDate() {
22563
- return getWeekFirstDate(this.getStartDate(), this.parent.firstDayOfWeek);
22897
+ return this.parent.currentView === 'Year' ? getWeekFirstDate(this.getStartDate(), this.parent.firstDayOfWeek) : this.getStartDate();
22564
22898
  }
22565
22899
  endDate() {
22566
- return addDays(getWeekLastDate(this.getEndDate(), this.parent.firstDayOfWeek), 1);
22900
+ return this.parent.currentView === 'Year' ? addDays(getWeekLastDate(this.getEndDate(), this.parent.firstDayOfWeek), 1) : this.getEndDate();
22567
22901
  }
22568
22902
  getEndDateFromStartDate(start) {
22569
22903
  let date = new Date(start.getTime());
@@ -22606,6 +22940,7 @@ class Year extends ViewBase {
22606
22940
  EventHandler.add(element, 'click', this.onCellClick, this);
22607
22941
  }
22608
22942
  else {
22943
+ EventHandler.add(element, 'mousedown', this.parent.workCellAction.cellMouseDown, this.parent.workCellAction);
22609
22944
  EventHandler.add(element, 'click', this.parent.workCellAction.cellClick, this.parent.workCellAction);
22610
22945
  if (!this.parent.isAdaptive) {
22611
22946
  EventHandler.add(element, 'dblclick', this.parent.workCellAction.cellDblClick, this.parent.workCellAction);
@@ -23042,7 +23377,8 @@ class Agenda extends AgendaBase {
23042
23377
  for (const event of this.parent.eventsData) {
23043
23378
  delete event.generatedDates;
23044
23379
  }
23045
- let eventCollection = args.processedData;
23380
+ let eventCollection = this.parent.activeViewOptions.allowVirtualScrolling ?
23381
+ args.processedData : this.parent.eventsProcessed;
23046
23382
  if (this.parent.uiStateValues.isGroupAdaptive) {
23047
23383
  const resource = this.parent.resourceBase.lastResourceLevel[this.parent.uiStateValues.groupIndex];
23048
23384
  this.dataSource = this.parent.eventBase.filterEventsByResource(resource, this.dataSource);
@@ -23145,6 +23481,7 @@ class Agenda extends AgendaBase {
23145
23481
  const filterData = this.appointmentFiltering(agendaDate);
23146
23482
  const nTr = this.createTableRowElement(agendaDate, 'data');
23147
23483
  if (this.element.querySelector('tr[aria-rowindex="' + parseInt(nTr.getAttribute('aria-rowindex'), 10) + '"]')) {
23484
+ agendaDate = addDays(agendaDate, 1);
23148
23485
  continue;
23149
23486
  }
23150
23487
  const dTd = nTr.children[0];
@@ -24090,6 +24427,9 @@ class TimelineYear extends Year {
24090
24427
  tr.appendChild(leftHeaderCells);
24091
24428
  leftHeaderCells.appendChild(this.renderResourceHeader(LEFT_INDENT_WRAP_CLASS));
24092
24429
  }
24430
+ const isHorizontal = this.parent.activeViewOptions.orientation === 'Horizontal';
24431
+ const isGroup = this.parent.activeViewOptions.group.resources.length > 0;
24432
+ this.isInverseTableSelect = isHorizontal && !isGroup ? false : true;
24093
24433
  const td = createElement('td');
24094
24434
  tr.appendChild(td);
24095
24435
  const container = createElement('div', { className: DATE_HEADER_CONTAINER_CLASS });
@@ -24767,8 +25107,8 @@ class ExcelExport {
24767
25107
  constructor(parent) {
24768
25108
  this.parent = parent;
24769
25109
  }
24770
- initializeExcelExport(excelExportOptions) {
24771
- const exportFields = excelExportOptions.fields || Object.keys(this.parent.eventFields).map((field) => this.parent.eventFields[field]);
25110
+ initializeExcelExport(excelExportOptions = {}) {
25111
+ const exportColumns = this.getExportColumns(excelExportOptions);
24772
25112
  const exportName = excelExportOptions.fileName || 'Schedule';
24773
25113
  const exportType = excelExportOptions.exportType || 'xlsx';
24774
25114
  const isIncludeOccurrences = excelExportOptions.includeOccurrences || false;
@@ -24780,34 +25120,40 @@ class ExcelExport {
24780
25120
  else {
24781
25121
  eventCollection = !isIncludeOccurrences ? this.parent.eventsData : this.parent.eventsProcessed;
24782
25122
  }
24783
- this.processWorkbook(exportFields, exportName, exportType, eventCollection);
25123
+ this.processWorkbook(exportColumns, exportName, exportType, eventCollection);
24784
25124
  }
24785
25125
  processWorkbook(fields, name, type, eventCollection) {
24786
25126
  const columns = [];
24787
25127
  const rows = [];
24788
25128
  const columnHeader = [];
24789
- fields.forEach((field, i) => columns.push({ index: i + 1, width: (field === 'Id' ? 20 : 150) }));
25129
+ fields.forEach((field, i) => { columns.push({ index: i + 1, width: (field.name === 'Id' ? 50 : 150) }); });
24790
25130
  const style = { fontSize: 12, borders: { color: '#E0E0E0' }, bold: true };
24791
- fields.forEach((field, i) => columnHeader.push({ index: i + 1, value: field, style: style }));
25131
+ fields.forEach((field, i) => { columnHeader.push({ index: i + 1, value: field.text, style: style }); });
24792
25132
  rows.push({ index: 1, cells: columnHeader });
24793
- let i = 2;
24794
- for (const event of eventCollection) {
25133
+ eventCollection.forEach((event, i) => {
24795
25134
  const columnData = [];
24796
25135
  fields.forEach((field, n) => {
24797
- let columnRule = { index: n + 1, value: event[field] || '' };
24798
- if (field === this.parent.eventFields.startTime || field === this.parent.eventFields.endTime) {
25136
+ let columnRule = { index: n + 1, value: event[field.name] || '' };
25137
+ if (field.name === this.parent.eventFields.startTime || field.name === this.parent.eventFields.endTime) {
24799
25138
  const styleRule = { fontSize: 12, numberFormat: 'm/d/yyyy h:mm AM/PM' };
24800
25139
  columnRule = extend({}, columnRule, { style: styleRule }, true);
24801
25140
  }
24802
25141
  columnData.push(columnRule);
24803
25142
  });
24804
- rows.push({ index: i, cells: columnData });
24805
- i++;
24806
- }
25143
+ rows.push({ index: i + 2, cells: columnData });
25144
+ });
24807
25145
  const workSheet = [{ columns: columns, rows: rows }];
24808
25146
  const book = new Workbook({ worksheets: workSheet }, type, this.parent.locale);
24809
25147
  book.save(name + '.' + type);
24810
25148
  }
25149
+ getExportColumns(exportOptions) {
25150
+ const exportColumns = exportOptions.fieldsInfo || [];
25151
+ if (exportColumns.length === 0) {
25152
+ const fields = exportOptions.fields || Object.keys(this.parent.eventFields).map((field) => this.parent.eventFields[field]);
25153
+ fields.forEach((field) => { exportColumns.push({ name: field, text: field }); });
25154
+ }
25155
+ return exportColumns;
25156
+ }
24811
25157
  getModuleName() {
24812
25158
  return 'excelExport';
24813
25159
  }
@@ -24952,5 +25298,5 @@ class Print {
24952
25298
  * Export Schedule components
24953
25299
  */
24954
25300
 
24955
- export { Schedule, cellClick, cellDoubleClick, moreEventsClick, select, hover, actionBegin, actionComplete, actionFailure, navigating, renderCell, eventClick, eventRendered, dataBinding, dataBound, popupOpen, popupClose, dragStart, drag, dragStop, resizeStart, resizing, resizeStop, inlineClick, initialLoad, initialEnd, print$1 as print, dataReady, eventsLoaded, contentReady, scroll, virtualScroll, scrollUiUpdate, uiUpdate, documentClick, cellMouseDown, WEEK_LENGTH, MS_PER_DAY, MS_PER_MINUTE, getElementHeightFromClass, getTranslateY, getWeekFirstDate, getWeekLastDate, firstDateOfMonth, lastDateOfMonth, getWeekNumber, getWeekMiddleDate, setTime, resetTime, getDateInMs, getDateCount, addDays, addMonths, addYears, getStartEndHours, getMaxDays, getDaysCount, getDateFromString, getScrollBarWidth, findIndexInData, getOuterHeight, removeChildren, isDaylightSavingTime, getUniversalTime, isMobile, isIPadDevice, capitalizeFirstWord, Resize, DragAndDrop, HeaderRenderer, ViewBase, Day, Week, WorkWeek, Month, Year, Agenda, MonthAgenda, TimelineViews, TimelineMonth, TimelineYear, Timezone, timezoneData, ICalendarExport, ICalendarImport, ExcelExport, Print, RecurrenceEditor, generateSummary, generate, getDateFromRecurrenceDateString, extractObjectFromRule, getCalendarUtil, getRecurrenceStringFromDate, Gregorian, Islamic };
25301
+ export { Schedule, cellClick, cellDoubleClick, moreEventsClick, select, hover, actionBegin, actionComplete, actionFailure, navigating, renderCell, eventClick, eventRendered, dataBinding, dataBound, popupOpen, popupClose, dragStart, drag, dragStop, resizeStart, resizing, resizeStop, inlineClick, initialLoad, initialEnd, print$1 as print, dataReady, eventsLoaded, contentReady, scroll, virtualScroll, scrollUiUpdate, uiUpdate, documentClick, cellMouseDown, WEEK_LENGTH, DEFAULT_WEEKS, MS_PER_DAY, MS_PER_MINUTE, getElementHeightFromClass, getTranslateY, getWeekFirstDate, getWeekLastDate, firstDateOfMonth, lastDateOfMonth, getWeekNumber, getWeekMiddleDate, setTime, resetTime, getDateInMs, getDateCount, addDays, addMonths, addYears, getStartEndHours, getMaxDays, getDaysCount, getDateFromString, getScrollBarWidth, findIndexInData, getOuterHeight, removeChildren, isDaylightSavingTime, getUniversalTime, isMobile, isIPadDevice, capitalizeFirstWord, Resize, DragAndDrop, HeaderRenderer, ViewBase, Day, Week, WorkWeek, Month, Year, Agenda, MonthAgenda, TimelineViews, TimelineMonth, TimelineYear, Timezone, timezoneData, ICalendarExport, ICalendarImport, ExcelExport, Print, RecurrenceEditor, generateSummary, generate, getDateFromRecurrenceDateString, extractObjectFromRule, getCalendarUtil, getRecurrenceStringFromDate, Gregorian, Islamic };
24956
25302
  //# sourceMappingURL=ej2-schedule.es2015.js.map