@syncfusion/ej2-schedule 26.2.12 → 27.1.48

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 (200) hide show
  1. package/dist/ej2-schedule.umd.min.js +2 -2
  2. package/dist/ej2-schedule.umd.min.js.map +1 -1
  3. package/dist/es6/ej2-schedule.es2015.js +173 -34
  4. package/dist/es6/ej2-schedule.es2015.js.map +1 -1
  5. package/dist/es6/ej2-schedule.es5.js +173 -34
  6. package/dist/es6/ej2-schedule.es5.js.map +1 -1
  7. package/dist/global/ej2-schedule.min.js +2 -2
  8. package/dist/global/ej2-schedule.min.js.map +1 -1
  9. package/dist/global/index.d.ts +1 -1
  10. package/package.json +18 -17
  11. package/src/schedule/actions/crud.js +22 -6
  12. package/src/schedule/actions/keyboard.d.ts +1 -0
  13. package/src/schedule/actions/keyboard.js +45 -3
  14. package/src/schedule/actions/resize.js +1 -0
  15. package/src/schedule/actions/virtual-scroll.d.ts +1 -0
  16. package/src/schedule/actions/virtual-scroll.js +35 -4
  17. package/src/schedule/base/interface.d.ts +1 -0
  18. package/src/schedule/base/resource.js +5 -0
  19. package/src/schedule/base/schedule.js +2 -1
  20. package/src/schedule/event-renderer/inline-edit.js +9 -1
  21. package/src/schedule/event-renderer/month.js +4 -1
  22. package/src/schedule/event-renderer/timeline-view.js +4 -1
  23. package/src/schedule/event-renderer/year.js +2 -2
  24. package/src/schedule/popups/event-tooltip.js +2 -1
  25. package/src/schedule/renderer/header-renderer.d.ts +1 -0
  26. package/src/schedule/renderer/header-renderer.js +9 -1
  27. package/src/schedule/renderer/month.js +6 -0
  28. package/src/schedule/renderer/timeline-header-row.js +1 -1
  29. package/src/schedule/renderer/timeline-view.js +5 -0
  30. package/src/schedule/renderer/timeline-year.js +6 -2
  31. package/src/schedule/renderer/vertical-view.js +2 -6
  32. package/src/schedule/renderer/view-base.d.ts +1 -0
  33. package/src/schedule/renderer/view-base.js +9 -0
  34. package/src/schedule/renderer/year.js +4 -4
  35. package/styles/bootstrap-dark-lite.css +4169 -0
  36. package/styles/bootstrap-dark-lite.scss +18 -0
  37. package/styles/bootstrap-dark.css +818 -596
  38. package/styles/bootstrap-dark.scss +3 -2
  39. package/styles/bootstrap-lite.css +4164 -0
  40. package/styles/bootstrap-lite.scss +18 -0
  41. package/styles/bootstrap.css +818 -596
  42. package/styles/bootstrap.scss +3 -2
  43. package/styles/bootstrap4-lite.css +4211 -0
  44. package/styles/bootstrap4-lite.scss +18 -0
  45. package/styles/bootstrap4.css +803 -636
  46. package/styles/bootstrap4.scss +3 -2
  47. package/styles/bootstrap5-dark-lite.css +4210 -0
  48. package/styles/bootstrap5-dark-lite.scss +18 -0
  49. package/styles/bootstrap5-dark.css +819 -597
  50. package/styles/bootstrap5-dark.scss +3 -2
  51. package/styles/bootstrap5-lite.css +4210 -0
  52. package/styles/bootstrap5-lite.scss +18 -0
  53. package/styles/bootstrap5.3-lite.css +4256 -0
  54. package/styles/bootstrap5.3-lite.scss +18 -0
  55. package/styles/bootstrap5.3.css +5017 -0
  56. package/styles/bootstrap5.3.scss +20 -0
  57. package/styles/bootstrap5.css +819 -597
  58. package/styles/bootstrap5.scss +3 -2
  59. package/styles/fabric-dark-lite.css +4139 -0
  60. package/styles/fabric-dark-lite.scss +18 -0
  61. package/styles/fabric-dark.css +825 -595
  62. package/styles/fabric-dark.scss +3 -2
  63. package/styles/fabric-lite.css +4136 -0
  64. package/styles/fabric-lite.scss +18 -0
  65. package/styles/fabric.css +825 -588
  66. package/styles/fabric.scss +3 -2
  67. package/styles/fluent-dark-lite.css +4202 -0
  68. package/styles/fluent-dark-lite.scss +18 -0
  69. package/styles/fluent-dark.css +823 -593
  70. package/styles/fluent-dark.scss +3 -2
  71. package/styles/fluent-lite.css +4202 -0
  72. package/styles/fluent-lite.scss +18 -0
  73. package/styles/fluent.css +823 -593
  74. package/styles/fluent.scss +3 -2
  75. package/styles/fluent2-lite.css +4422 -0
  76. package/styles/fluent2-lite.scss +18 -0
  77. package/styles/fluent2.css +860 -602
  78. package/styles/fluent2.scss +3 -2
  79. package/styles/highcontrast-light-lite.css +4228 -0
  80. package/styles/highcontrast-light-lite.scss +18 -0
  81. package/styles/highcontrast-light.css +828 -584
  82. package/styles/highcontrast-light.scss +3 -2
  83. package/styles/highcontrast-lite.css +4237 -0
  84. package/styles/highcontrast-lite.scss +18 -0
  85. package/styles/highcontrast.css +829 -585
  86. package/styles/highcontrast.scss +3 -2
  87. package/styles/material-dark-lite.css +4216 -0
  88. package/styles/material-dark-lite.scss +18 -0
  89. package/styles/material-dark.css +834 -582
  90. package/styles/material-dark.scss +3 -2
  91. package/styles/material-lite.css +4242 -0
  92. package/styles/material-lite.scss +18 -0
  93. package/styles/material.css +831 -600
  94. package/styles/material.scss +3 -2
  95. package/styles/material3-dark-lite.css +4233 -0
  96. package/styles/material3-dark-lite.scss +18 -0
  97. package/styles/material3-dark.css +825 -602
  98. package/styles/material3-dark.scss +3 -2
  99. package/styles/material3-lite.css +4235 -0
  100. package/styles/material3-lite.scss +18 -0
  101. package/styles/material3.css +825 -602
  102. package/styles/material3.scss +3 -2
  103. package/styles/recurrence-editor/_bigger.scss +134 -0
  104. package/styles/recurrence-editor/_layout.scss +0 -110
  105. package/styles/recurrence-editor/bootstrap-dark.css +87 -131
  106. package/styles/recurrence-editor/bootstrap-dark.scss +1 -0
  107. package/styles/recurrence-editor/bootstrap.css +87 -131
  108. package/styles/recurrence-editor/bootstrap.scss +1 -0
  109. package/styles/recurrence-editor/bootstrap4.css +87 -149
  110. package/styles/recurrence-editor/bootstrap4.scss +1 -0
  111. package/styles/recurrence-editor/bootstrap5-dark.css +87 -135
  112. package/styles/recurrence-editor/bootstrap5-dark.scss +1 -0
  113. package/styles/recurrence-editor/bootstrap5.3.css +501 -0
  114. package/styles/recurrence-editor/bootstrap5.3.scss +9 -0
  115. package/styles/recurrence-editor/bootstrap5.css +87 -135
  116. package/styles/recurrence-editor/bootstrap5.scss +1 -0
  117. package/styles/recurrence-editor/fabric-dark.css +87 -130
  118. package/styles/recurrence-editor/fabric-dark.scss +1 -0
  119. package/styles/recurrence-editor/fabric.css +87 -123
  120. package/styles/recurrence-editor/fabric.scss +1 -0
  121. package/styles/recurrence-editor/fluent-dark.css +87 -122
  122. package/styles/recurrence-editor/fluent-dark.scss +1 -0
  123. package/styles/recurrence-editor/fluent.css +87 -122
  124. package/styles/recurrence-editor/fluent.scss +1 -0
  125. package/styles/recurrence-editor/fluent2.css +91 -117
  126. package/styles/recurrence-editor/fluent2.scss +1 -0
  127. package/styles/recurrence-editor/highcontrast-light.css +87 -118
  128. package/styles/recurrence-editor/highcontrast-light.scss +1 -0
  129. package/styles/recurrence-editor/highcontrast.css +87 -118
  130. package/styles/recurrence-editor/highcontrast.scss +1 -0
  131. package/styles/recurrence-editor/material-dark.css +87 -115
  132. package/styles/recurrence-editor/material-dark.scss +1 -0
  133. package/styles/recurrence-editor/material.css +87 -136
  134. package/styles/recurrence-editor/material.scss +1 -0
  135. package/styles/recurrence-editor/material3-dark.css +87 -140
  136. package/styles/recurrence-editor/material3-dark.scss +1 -0
  137. package/styles/recurrence-editor/material3.css +87 -140
  138. package/styles/recurrence-editor/material3.scss +1 -0
  139. package/styles/recurrence-editor/tailwind-dark.css +87 -116
  140. package/styles/recurrence-editor/tailwind-dark.scss +1 -0
  141. package/styles/recurrence-editor/tailwind.css +87 -116
  142. package/styles/recurrence-editor/tailwind.scss +1 -0
  143. package/styles/schedule/_bds-definition.scss +1 -1
  144. package/styles/schedule/_bigger.scss +809 -0
  145. package/styles/schedule/_bootstrap4-definition.scss +1 -1
  146. package/styles/schedule/_bootstrap5-definition.scss +1 -1
  147. package/styles/schedule/_bootstrap5.3-definition.scss +9 -6
  148. package/styles/schedule/_fluent-definition.scss +1 -1
  149. package/styles/schedule/_fluent2-definition.scss +6 -6
  150. package/styles/schedule/_fusionnew-definition.scss +1 -1
  151. package/styles/schedule/_layout.scss +5 -442
  152. package/styles/schedule/_tailwind-definition.scss +1 -1
  153. package/styles/schedule/_theme.scss +23 -1
  154. package/styles/schedule/bootstrap-dark.css +699 -483
  155. package/styles/schedule/bootstrap-dark.scss +1 -0
  156. package/styles/schedule/bootstrap.css +699 -483
  157. package/styles/schedule/bootstrap.scss +1 -0
  158. package/styles/schedule/bootstrap4.css +684 -523
  159. package/styles/schedule/bootstrap4.scss +1 -0
  160. package/styles/schedule/bootstrap5-dark.css +707 -491
  161. package/styles/schedule/bootstrap5-dark.scss +1 -0
  162. package/styles/schedule/bootstrap5.3.css +4615 -0
  163. package/styles/schedule/bootstrap5.3.scss +17 -0
  164. package/styles/schedule/bootstrap5.css +707 -491
  165. package/styles/schedule/bootstrap5.scss +1 -0
  166. package/styles/schedule/fabric-dark.css +706 -482
  167. package/styles/schedule/fabric-dark.scss +1 -0
  168. package/styles/schedule/fabric.css +706 -475
  169. package/styles/schedule/fabric.scss +1 -0
  170. package/styles/schedule/fluent-dark.css +716 -492
  171. package/styles/schedule/fluent-dark.scss +1 -0
  172. package/styles/schedule/fluent.css +716 -492
  173. package/styles/schedule/fluent.scss +1 -0
  174. package/styles/schedule/fluent2.css +746 -497
  175. package/styles/schedule/fluent2.scss +1 -0
  176. package/styles/schedule/highcontrast-light.css +714 -476
  177. package/styles/schedule/highcontrast-light.scss +1 -0
  178. package/styles/schedule/highcontrast.css +714 -476
  179. package/styles/schedule/highcontrast.scss +1 -0
  180. package/styles/schedule/material-dark.css +725 -479
  181. package/styles/schedule/material-dark.scss +1 -0
  182. package/styles/schedule/material.css +722 -497
  183. package/styles/schedule/material.scss +1 -0
  184. package/styles/schedule/material3-dark.css +714 -497
  185. package/styles/schedule/material3-dark.scss +1 -0
  186. package/styles/schedule/material3.css +714 -497
  187. package/styles/schedule/material3.scss +1 -0
  188. package/styles/schedule/tailwind-dark.css +718 -483
  189. package/styles/schedule/tailwind-dark.scss +1 -0
  190. package/styles/schedule/tailwind.css +718 -483
  191. package/styles/schedule/tailwind.scss +1 -0
  192. package/styles/tailwind-dark-lite.css +4179 -0
  193. package/styles/tailwind-dark-lite.scss +18 -0
  194. package/styles/tailwind-dark.css +827 -586
  195. package/styles/tailwind-dark.scss +3 -2
  196. package/styles/tailwind-lite.css +4179 -0
  197. package/styles/tailwind-lite.scss +18 -0
  198. package/styles/tailwind.css +827 -586
  199. package/styles/tailwind.scss +3 -2
  200. package/dist/ej2-schedule.min.js +0 -10
@@ -1084,10 +1084,12 @@ class HeaderRenderer {
1084
1084
  items: args.items,
1085
1085
  overflowMode: 'Popup',
1086
1086
  clicked: this.toolbarClickHandler.bind(this),
1087
+ created: this.toolbarCreateHandler.bind(this),
1087
1088
  enableRtl: this.parent.enableRtl,
1088
1089
  enableHtmlSanitizer: this.parent.enableHtmlSanitizer,
1089
1090
  locale: this.parent.locale
1090
1091
  });
1092
+ this.toolbarObj.isStringTemplate = true;
1091
1093
  this.toolbarObj.root = this.parent.root ? this.parent.root : this.parent;
1092
1094
  this.toolbarObj.appendTo(this.parent.element.querySelector('.' + HEADER_TOOLBAR));
1093
1095
  this.toolbarObj.element.setAttribute('aria-label', 'Scheduler');
@@ -1516,6 +1518,12 @@ class HeaderRenderer {
1516
1518
  const views = [].slice.call(this.element.querySelectorAll('.e-views'));
1517
1519
  return views.indexOf(target);
1518
1520
  }
1521
+ toolbarCreateHandler() {
1522
+ if (this.parent && this.parent.portals && this.toolbarObj && this.toolbarObj.portals) {
1523
+ this.parent.portals = this.parent.portals.concat(this.toolbarObj.portals);
1524
+ this.parent['renderReactTemplates']();
1525
+ }
1526
+ }
1519
1527
  toolbarClickHandler(args) {
1520
1528
  if (!args.item) {
1521
1529
  return;
@@ -1659,7 +1667,7 @@ class HeaderRenderer {
1659
1667
  let firstDate = new Date(dates[0].getTime());
1660
1668
  let lastDate = new Date(dates[dates.length - 1].getTime());
1661
1669
  if (this.parent.currentView === 'WorkWeek' || this.parent.currentView === 'TimelineWorkWeek') {
1662
- firstDate = getWeekFirstDate(resetTime(this.parent.selectedDate), this.parent.firstDayOfWeek);
1670
+ firstDate = getWeekFirstDate(resetTime(this.parent.selectedDate), this.parent.activeViewOptions.firstDayOfWeek);
1663
1671
  lastDate = addDays(firstDate, 7 * this.parent.activeViewOptions.interval);
1664
1672
  }
1665
1673
  else if (this.parent.currentView === 'Month') {
@@ -2085,7 +2093,9 @@ class KeyboardInteraction {
2085
2093
  ctrlShiftUpArrow: 'ctrl+shift+uparrow',
2086
2094
  ctrlShiftDownArrow: 'ctrl+shift+downarrow',
2087
2095
  ctrlShiftLeftArrow: 'ctrl+shift+leftarrow',
2088
- ctrlShiftRightArrow: 'ctrl+shift+rightarrow'
2096
+ ctrlShiftRightArrow: 'ctrl+shift+rightarrow',
2097
+ shiftAltY: 'shift+alt+y',
2098
+ shiftAltN: 'shift+alt+n'
2089
2099
  };
2090
2100
  this.parent = parent;
2091
2101
  this.parent.element.tabIndex = this.parent.element.tabIndex === -1 ? 0 : this.parent.element.tabIndex;
@@ -2166,6 +2176,43 @@ class KeyboardInteraction {
2166
2176
  this.processFTwelve(e);
2167
2177
  }
2168
2178
  break;
2179
+ case 'shiftAltY':
2180
+ this.parent.changeDate(new Date(), e);
2181
+ break;
2182
+ case 'shiftAltN':
2183
+ if (this.parent.currentView === 'Agenda' || this.parent.currentView === 'MonthAgenda' ||
2184
+ this.parent.currentView === 'Year') {
2185
+ return;
2186
+ }
2187
+ this.processShiftAltN(e);
2188
+ break;
2189
+ }
2190
+ }
2191
+ processShiftAltN(e) {
2192
+ const selectedCells = this.parent.getSelectedCells();
2193
+ const target = e.target;
2194
+ let cellData = extend({}, null, true);
2195
+ if (selectedCells.length > 0 && (closest(target, '.' + WORK_CELLS_CLASS)
2196
+ || closest(target, '.' + ALLDAY_CELLS_CLASS) || closest(target, '.' + HEADER_CELLS_CLASS))) {
2197
+ cellData = this.getSelectedElements(target);
2198
+ }
2199
+ else if (closest(target, '.' + APPOINTMENT_CLASS) && !isNullOrUndefined(this.parent.activeEventData.event)) {
2200
+ const event = this.parent.activeEventData.event;
2201
+ cellData.startTime = event.StartTime;
2202
+ cellData.endTime = event.EndTime;
2203
+ cellData.isAllDay = event.IsAllDay;
2204
+ }
2205
+ else {
2206
+ const workHour = this.parent.getStartEndTime(this.parent.workHours.start);
2207
+ const slotInterval = this.parent.activeViewOptions.timeScale.interval /
2208
+ this.parent.activeViewOptions.timeScale.slotCount;
2209
+ cellData.startTime = new Date(this.parent.selectedDate);
2210
+ cellData.startTime.setHours(workHour.getHours(), workHour.getMinutes(), 0, 0);
2211
+ cellData.endTime = new Date(cellData.startTime.getTime() + slotInterval * 60000);
2212
+ }
2213
+ const args = extend(cellData, { cancel: false, event: e });
2214
+ if (args != null) {
2215
+ this.parent.eventWindow.openEditor(args, 'Add');
2169
2216
  }
2170
2217
  }
2171
2218
  processFTwelve(e) {
@@ -2586,8 +2633,11 @@ class KeyboardInteraction {
2586
2633
  return this.parent.eventBase.selectWorkCellByTime([selectedObject]);
2587
2634
  }
2588
2635
  processViewNavigation(e) {
2589
- const index = parseInt(e.key, 10) - 1;
2590
- if (!isNullOrUndefined(this.parent.views) && index < this.parent.views.length) {
2636
+ if (isNullOrUndefined(e.code)) {
2637
+ return;
2638
+ }
2639
+ const index = parseInt(e.code.slice(e.code.length - 1), 10) - 1;
2640
+ if (!isNaN(index) && !isNullOrUndefined(this.parent.views) && index < this.parent.views.length) {
2591
2641
  const view = this.parent.viewCollections[parseInt(index.toString(), 10)].option;
2592
2642
  this.parent.changeView(view, e, undefined, index);
2593
2643
  if (this.parent.headerModule) {
@@ -7910,7 +7960,10 @@ class MonthEvent extends EventBase {
7910
7960
  if (this.parent.crudModule && this.parent.crudModule.crudObj.isCrudAction) {
7911
7961
  for (let i = 0, len = this.parent.crudModule.crudObj.sourceEvent.length; i < len; i++) {
7912
7962
  const sourceRes = this.parent.crudModule.crudObj.sourceEvent[parseInt(i.toString(), 10)];
7913
- this.renderEventsHandler(sourceRes.renderDates, sourceRes.workDays, sourceRes);
7963
+ if (!this.parent.uiStateValues.isGroupAdaptive ||
7964
+ (this.parent.uiStateValues.groupIndex === sourceRes.groupIndex && this.parent.uiStateValues.isGroupAdaptive)) {
7965
+ this.renderEventsHandler(sourceRes.renderDates, sourceRes.workDays, sourceRes);
7966
+ }
7914
7967
  if (this.parent.crudModule.crudObj.sourceEvent[parseInt(i.toString(), 10)].groupIndex !==
7915
7968
  this.parent.crudModule.crudObj.targetEvent[parseInt(i.toString(), 10)].groupIndex) {
7916
7969
  const target = this.parent.crudModule.crudObj.targetEvent[parseInt(i.toString(), 10)];
@@ -8375,7 +8428,10 @@ class TimelineEvent extends MonthEvent {
8375
8428
  for (let i = 0, len = this.parent.crudModule.crudObj.sourceEvent.length; i < len; i++) {
8376
8429
  const source = this.parent.crudModule.crudObj.sourceEvent[parseInt(i.toString(), 10)];
8377
8430
  this.rowIndex = source.groupIndex;
8378
- this.renderEventsHandler(this.parent.activeView.renderDates, this.parent.activeViewOptions.workDays, source);
8431
+ if (!this.parent.uiStateValues.isGroupAdaptive ||
8432
+ (this.parent.uiStateValues.groupIndex === source.groupIndex && this.parent.uiStateValues.isGroupAdaptive)) {
8433
+ this.renderEventsHandler(this.parent.activeView.renderDates, this.parent.activeViewOptions.workDays, source);
8434
+ }
8379
8435
  if (this.parent.crudModule.crudObj.targetEvent[parseInt(i.toString(), 10)] && this.parent.crudModule.crudObj.sourceEvent[parseInt(i.toString(), 10)].groupIndex !==
8380
8436
  this.parent.crudModule.crudObj.targetEvent[parseInt(i.toString(), 10)].groupIndex) {
8381
8437
  const target = this.parent.crudModule.crudObj.targetEvent[parseInt(i.toString(), 10)];
@@ -8928,7 +8984,15 @@ class InlineEdit {
8928
8984
  subjectWrap.insertBefore(inlineSubject, subjectWrap.firstChild);
8929
8985
  }
8930
8986
  else {
8931
- args.element.querySelector('.e-appointment-details').prepend(inlineSubject);
8987
+ const elementSelector = ['TimelineDay', 'TimelineWeek', 'TimelineWorkWeek', 'TimelineMonth'].indexOf(this.parent.currentView) > -1 ?
8988
+ '.e-inner-wrap' : '.e-appointment-details';
8989
+ const innerWrapElement = args.element.querySelector(elementSelector);
8990
+ if (isNullOrUndefined(innerWrapElement)) {
8991
+ args.element.querySelector('.e-appointment-details').prepend(inlineSubject);
8992
+ }
8993
+ else {
8994
+ innerWrapElement.prepend(inlineSubject);
8995
+ }
8932
8996
  }
8933
8997
  inlineSubject.focus();
8934
8998
  }
@@ -10657,7 +10721,8 @@ class EventTooltip {
10657
10721
  const fields = this.parent.eventFields;
10658
10722
  const eventStart = new Date('' + record[fields.startTime]);
10659
10723
  let eventEnd = new Date('' + record[fields.endTime]);
10660
- eventEnd = (eventEnd.getHours() === 0 && eventEnd.getMinutes() === 0) ? new Date(eventEnd.setMilliseconds(-1000)) : eventEnd;
10724
+ eventEnd = ((eventEnd.getTime() - eventStart.getTime() !== 0) && eventEnd.getHours() === 0 && eventEnd.getMinutes() === 0) ?
10725
+ new Date(eventEnd.setMilliseconds(-1000)) : eventEnd;
10661
10726
  const startDate = resetTime(new Date('' + eventStart));
10662
10727
  const endDate = resetTime(new Date('' + eventEnd));
10663
10728
  const tooltipSubject = (record[fields.subject] || this.parent.eventSettings.fields.subject.default
@@ -13904,6 +13969,7 @@ class VirtualScroll {
13904
13969
  firstTDIndex = (endIndex > this.parent.resourceBase.expandedResources.length) ?
13905
13970
  (this.parent.resourceBase.expandedResources.length - this.renderedLength) : firstTDIndex;
13906
13971
  firstTDIndex = firstTDIndex < 0 ? 0 : firstTDIndex;
13972
+ this.existingDataCollection = this.parent.resourceBase.renderedResources;
13907
13973
  this.parent.resourceBase.renderedResources = this.parent.resourceBase.expandedResources.slice(firstTDIndex, endIndex);
13908
13974
  if (this.parent.resourceBase.renderedResources.length > 0) {
13909
13975
  this.updateContent(resWrap, conWrap, eventWrap, this.parent.resourceBase.renderedResources);
@@ -13952,6 +14018,7 @@ class VirtualScroll {
13952
14018
  const scrollHeight = this.parent.rowAutoHeight ?
13953
14019
  (conTable.offsetHeight - conWrap.offsetHeight) : this.bufferCount * this.itemSize;
13954
14020
  let resCollection = [];
14021
+ this.existingDataCollection = this.parent.resourceBase.renderedResources;
13955
14022
  if ((conWrap.scrollTop) - this.translateY < 0) {
13956
14023
  resCollection = this.upScroll(conWrap, firstTDIndex);
13957
14024
  }
@@ -14149,18 +14216,47 @@ class VirtualScroll {
14149
14216
  this.parent.element.focus();
14150
14217
  }
14151
14218
  for (let i = 0; i < renderedLength; i++) {
14152
- remove(resWrap.querySelector('tbody tr'));
14153
- remove(conWrap.querySelector('tbody tr'));
14154
14219
  remove(eventWrap.querySelector('div'));
14155
14220
  }
14156
14221
  this.parent.resourceBase.renderedResources = resCollection;
14222
+ const currentGroupIndices = this.parent.activeView.getGroupIndices(resCollection);
14223
+ const previousGroupIndices = this.parent.activeView.getGroupIndices(this.existingDataCollection);
14224
+ const newGroupIndices = currentGroupIndices.filter((index) => previousGroupIndices.indexOf(index) < 0);
14225
+ const resWrapRows = Array.from(resWrap.querySelectorAll('tbody tr'));
14226
+ const conWrapRows = Array.from(conWrap.querySelectorAll('tbody tr'));
14227
+ const resWrapBody = resWrap.querySelector('tbody');
14228
+ const conWrapBody = conWrap.querySelector('tbody');
14229
+ this.removeObsoleteRows(resWrapRows, currentGroupIndices);
14230
+ this.removeObsoleteRows(conWrapRows, currentGroupIndices);
14157
14231
  const resourceRows = this.parent.resourceBase.getContentRows(resCollection, true);
14158
14232
  const contentRows = this.parent.activeView.getContentRows();
14159
14233
  const eventRows = this.parent.activeView.getEventRows(resCollection.length);
14160
- append(resourceRows, resWrap.querySelector('tbody'));
14161
- append(contentRows, conWrap.querySelector('tbody'));
14234
+ for (let i = 0; i < newGroupIndices.length; i++) {
14235
+ const index = currentGroupIndices.indexOf(newGroupIndices[parseInt(i.toString(), 10)]);
14236
+ if (index === 0) {
14237
+ prepend([resourceRows[parseInt(i.toString(), 10)]], resWrapBody);
14238
+ prepend([contentRows[parseInt(i.toString(), 10)]], conWrapBody);
14239
+ }
14240
+ else if (resWrapBody && conWrapBody && resWrapBody.children[parseInt(index.toString(), 10)] &&
14241
+ conWrapBody.children[parseInt(index.toString(), 10)]) {
14242
+ resWrapBody.insertBefore(resourceRows[parseInt(i.toString(), 10)], resWrapBody.children[parseInt(index.toString(), 10)]);
14243
+ conWrapBody.insertBefore(contentRows[parseInt(i.toString(), 10)], conWrapBody.children[parseInt(index.toString(), 10)]);
14244
+ }
14245
+ else {
14246
+ append([resourceRows[parseInt(i.toString(), 10)]], resWrapBody);
14247
+ append([contentRows[parseInt(i.toString(), 10)]], conWrapBody);
14248
+ }
14249
+ }
14162
14250
  append(eventRows, eventWrap);
14163
14251
  }
14252
+ removeObsoleteRows(elements, currentGroupIndices) {
14253
+ elements.forEach((element) => {
14254
+ const groupIndex = parseInt(element.firstElementChild.getAttribute('data-group-index'), 10);
14255
+ if (currentGroupIndices.indexOf(groupIndex) < 0) {
14256
+ remove(element);
14257
+ }
14258
+ });
14259
+ }
14164
14260
  updateHorizontalContent(conWrap, resCollection) {
14165
14261
  this.existingDataCollection = this.parent.resourceBase.expandedResources;
14166
14262
  this.parent.resourceBase.expandedResources = resCollection;
@@ -14652,10 +14748,10 @@ class Crud {
14652
14748
  addedRecords: args.editParams.addedRecords, changedRecords: args.editParams.changedRecords,
14653
14749
  deletedRecords: args.editParams.deletedRecords
14654
14750
  };
14655
- if (this.parent.dragAndDropModule && this.parent.dragAndDropModule.actionObj && this.parent.dragAndDropModule.actionObj.element) {
14751
+ if (this.parent.dragAndDropModule && this.parent.dragAndDropModule.actionObj && this.parent.dragAndDropModule.actionObj.element && this.parent.dragAndDropModule.actionObj.action) {
14656
14752
  this.parent.dragAndDropModule.actionObj.element.style.display = 'none';
14657
14753
  }
14658
- if (this.parent.resizeModule && this.parent.resizeModule.actionObj && this.parent.resizeModule.actionObj.element) {
14754
+ if (this.parent.resizeModule && this.parent.resizeModule.actionObj && this.parent.resizeModule.actionObj.element && this.parent.resizeModule.actionObj.action) {
14659
14755
  this.parent.resizeModule.actionObj.element.style.display = 'none';
14660
14756
  }
14661
14757
  if (this.parent.isSpecificResourceEvents()) {
@@ -15018,16 +15114,32 @@ class Crud {
15018
15114
  const updateSeriesEvents = (eventData instanceof Array) ? eventData : [eventData];
15019
15115
  const args = {
15020
15116
  requestType: action === 'EditSeries' ? 'eventChange' : 'eventRemove', cancel: false,
15021
- addedRecords: [], changedRecords: updateSeriesEvents, deletedRecords: []
15117
+ addedRecords: [], changedRecords: [], deletedRecords: []
15022
15118
  };
15023
15119
  args.data = seriesData;
15120
+ if (action === 'EditSeries') {
15121
+ args.changedRecords = updateSeriesEvents;
15122
+ }
15123
+ else {
15124
+ args.deletedRecords = updateSeriesEvents;
15125
+ }
15126
+ if (action === 'EditSeries' && !this.parent.uiStateValues.isIgnoreOccurrence) {
15127
+ const seriesEvents = seriesData instanceof Array ? seriesData : [seriesData];
15128
+ for (let a = 0, count = args.changedRecords.length; a < count; a++) {
15129
+ const parentEvent = seriesEvents[parseInt(a.toString(), 10)];
15130
+ const eventCollections = this.parent.eventBase.getEventCollections(parentEvent);
15131
+ const deletedEvents = eventCollections.follow.concat(eventCollections.occurrence);
15132
+ args.deletedRecords = args.deletedRecords.concat(deletedEvents);
15133
+ }
15134
+ }
15024
15135
  this.parent.trigger(actionBegin, args, (seriesArgs) => {
15025
15136
  if (!seriesArgs.cancel) {
15026
15137
  const fields = this.parent.eventFields;
15027
15138
  const editParams = { addedRecords: [], changedRecords: [], deletedRecords: [] };
15028
15139
  const seriesEvents = seriesData instanceof Array ? seriesData : [seriesData];
15029
- for (let a = 0, count = seriesArgs.changedRecords.length; a < count; a++) {
15030
- const childEvent = seriesArgs.changedRecords[parseInt(a.toString(), 10)];
15140
+ const records = action === 'EditSeries' ? seriesArgs.changedRecords : seriesArgs.deletedRecords;
15141
+ for (let a = 0, count = records.length; a < count; a++) {
15142
+ const childEvent = records[parseInt(a.toString(), 10)];
15031
15143
  const parentEvent = seriesEvents[parseInt(a.toString(), 10)];
15032
15144
  const eventCollections = this.parent.eventBase.getEventCollections(parentEvent);
15033
15145
  const deletedEvents = eventCollections.follow.concat(eventCollections.occurrence);
@@ -15056,7 +15168,7 @@ class Crud {
15056
15168
  }
15057
15169
  }
15058
15170
  const promise = this.parent.dataModule.dataManager.saveChanges(editParams, fields.id, this.getTable(), this.getQuery());
15059
- const cloneEvent = extend({}, seriesArgs.changedRecords[seriesArgs.changedRecords.length - 1], null, true);
15171
+ const cloneEvent = extend({}, records[records.length - 1], null, true);
15060
15172
  this.parent.eventBase.selectWorkCellByTime(action === 'EditSeries' ? [this.parent.eventBase.processTimezone(cloneEvent)] : [cloneEvent]);
15061
15173
  const crudArgs = {
15062
15174
  requestType: action === 'EditSeries' ? 'eventChanged' : 'eventRemoved',
@@ -15710,7 +15822,11 @@ class ResourceBase {
15710
15822
  const resColl = this.resourceCollection;
15711
15823
  const tr = createElement('tr');
15712
15824
  const td = createElement('td', { attrs: { tabindex: isVirtualScroll ? '-1' : '0' } });
15825
+ const existingGroupIndices = this.parent.activeView.getGroupIndices();
15713
15826
  for (let i = 0; i < resData.length; i++) {
15827
+ if (existingGroupIndices.length > 0 && existingGroupIndices.indexOf(resData[parseInt(i.toString(), 10)].groupIndex) > -1) {
15828
+ continue;
15829
+ }
15714
15830
  const ntd = td.cloneNode();
15715
15831
  rIndex = findIndexInData(resColl, 'name', resData[parseInt(i.toString(), 10)].resource.name);
15716
15832
  if (rIndex === resColl.length - 1) {
@@ -15889,6 +16005,7 @@ class ResourceBase {
15889
16005
  this.setExpandedResources();
15890
16006
  const resourceCount = this.parent.virtualScrollModule.getRenderedCount();
15891
16007
  const startIndex = this.expandedResources.indexOf(this.renderedResources[0]);
16008
+ this.parent.virtualScrollModule.existingDataCollection = this.renderedResources;
15892
16009
  this.renderedResources = this.expandedResources.slice(startIndex, startIndex + resourceCount);
15893
16010
  if (this.renderedResources.length < resourceCount) {
15894
16011
  let sIndex = this.expandedResources.length - resourceCount;
@@ -17919,7 +18036,8 @@ let Schedule = class Schedule extends Component {
17919
18036
  }
17920
18037
  onScheduleResize() {
17921
18038
  if (isNullOrUndefined(this.activeView) || ((this.isAdaptive || isMobile()) && document.activeElement
17922
- && document.activeElement.classList.contains(SUBJECT_CLASS)) || this.uiStateValues.isTapHold) {
18039
+ && (document.activeElement.classList.contains(SUBJECT_CLASS) ||
18040
+ document.activeElement.classList.contains(INLINE_SUBJECT_CLASS))) || this.uiStateValues.isTapHold) {
17923
18041
  return;
17924
18042
  }
17925
18043
  if (this.virtualScrollModule && this.activeView.isTimelineView()) {
@@ -20524,6 +20642,7 @@ class Resize extends ActionBase {
20524
20642
  EventHandler.remove(document, Browser.touchEndEvent, this.resizeStop);
20525
20643
  clearInterval(this.actionObj.scrollInterval);
20526
20644
  this.actionObj.scrollInterval = null;
20645
+ this.actionObj.action = null;
20527
20646
  this.removeCloneElementClasses();
20528
20647
  this.removeCloneElement();
20529
20648
  this.actionClass('removeClass');
@@ -20870,8 +20989,8 @@ class YearEvent extends TimelineEvent {
20870
20989
  const monthDate = new Date(this.parent.selectedDate.getFullYear(), month, 1);
20871
20990
  const monthStart = this.parent.calendarUtil.getMonthStartDate(new Date(monthDate.getTime()));
20872
20991
  const monthEnd = this.parent.calendarUtil.getMonthEndDate(new Date(monthDate.getTime()));
20873
- let startDate = getWeekFirstDate(monthStart, this.parent.firstDayOfWeek);
20874
- const endDate = addDays(getWeekLastDate(monthEnd, this.parent.firstDayOfWeek), 1);
20992
+ let startDate = getWeekFirstDate(monthStart, this.parent.activeViewOptions.firstDayOfWeek);
20993
+ const endDate = addDays(getWeekLastDate(monthEnd, this.parent.activeViewOptions.firstDayOfWeek), 1);
20875
20994
  for (let index = 0; startDate.getTime() < endDate.getTime(); index++) {
20876
20995
  const start = resetTime(new Date(startDate.getTime()));
20877
20996
  const end = addDays(new Date(start.getTime()), 1);
@@ -23360,6 +23479,15 @@ class ViewBase {
23360
23479
  this.parent.resourceBase.expandedResources = this.colLevels[this.colLevels.length - 1];
23361
23480
  }
23362
23481
  }
23482
+ getGroupIndices(dataCollection) {
23483
+ let groupIndices = [];
23484
+ if (this.parent.virtualScrollModule && this.parent.activeViewOptions.group.resources.length > 0 && (dataCollection ||
23485
+ this.parent.virtualScrollModule.existingDataCollection.length > 0) && !this.parent.uiStateValues.isGroupAdaptive) {
23486
+ dataCollection = isNullOrUndefined(dataCollection) ? this.parent.virtualScrollModule.existingDataCollection : dataCollection;
23487
+ groupIndices = dataCollection.map((data) => data.groupIndex);
23488
+ }
23489
+ return groupIndices;
23490
+ }
23363
23491
  destroy() {
23364
23492
  if (this.element && this.element.parentNode) {
23365
23493
  remove(this.element);
@@ -24016,17 +24144,13 @@ class VerticalView extends ViewBase {
24016
24144
  const rows = [];
24017
24145
  const tr = createElement('tr');
24018
24146
  const td = createElement('td', { attrs: { 'aria-selected': 'false' } });
24019
- let existingGroupIndices = new Set();
24020
- if (this.parent.virtualScrollModule && this.parent.activeViewOptions.group.resources.length > 0 &&
24021
- this.parent.virtualScrollModule.existingDataCollection.length > 0) {
24022
- existingGroupIndices = new Set(this.parent.virtualScrollModule.existingDataCollection.map((data) => data.groupIndex));
24023
- }
24147
+ const existingGroupIndices = this.getGroupIndices();
24024
24148
  const handler = (r) => {
24025
24149
  const ntr = tr.cloneNode();
24026
24150
  for (const tdData of this.colLevels[this.colLevels.length - 1]) {
24027
24151
  let isAllowTdCreation = true;
24028
24152
  if (this.parent.virtualScrollModule && this.parent.activeViewOptions.group.resources.length > 0) {
24029
- if (existingGroupIndices.has(tdData.groupIndex)) {
24153
+ if (existingGroupIndices.indexOf(tdData.groupIndex) > -1) {
24030
24154
  isAllowTdCreation = false;
24031
24155
  }
24032
24156
  }
@@ -24755,7 +24879,13 @@ class Month extends ViewBase {
24755
24879
  const tr = createElement('tr');
24756
24880
  const td = createElement('td', { attrs: { 'aria-selected': 'false' } });
24757
24881
  const slotDatas = this.getContentSlots();
24882
+ const isTimeline = this.parent.currentView === 'TimelineMonth';
24883
+ const existingGroupIndices = isTimeline ? this.getGroupIndices() : [];
24758
24884
  for (let row = 0; row < slotDatas.length; row++) {
24885
+ if (existingGroupIndices.length > 0 &&
24886
+ existingGroupIndices.indexOf(slotDatas[parseInt(row.toString(), 10)][0].groupIndex) > -1) {
24887
+ continue;
24888
+ }
24759
24889
  const ntr = tr.cloneNode();
24760
24890
  for (let col = 0; col < slotDatas[parseInt(row.toString(), 10)].length; col++) {
24761
24891
  const ntd = this.createContentTd(slotDatas[parseInt(row.toString(), 10)][parseInt(col.toString(), 10)], td);
@@ -25084,7 +25214,7 @@ class Year extends ViewBase {
25084
25214
  this.setAriaAttributes(contentTable);
25085
25215
  const thead = createElement('thead', { className: 'e-week-header' });
25086
25216
  const tr = createElement('tr');
25087
- let currentWeek = getWeekFirstDate(firstDateOfMonth(currentDate), this.parent.firstDayOfWeek);
25217
+ let currentWeek = getWeekFirstDate(firstDateOfMonth(currentDate), this.parent.activeViewOptions.firstDayOfWeek);
25088
25218
  if (this.parent.activeViewOptions.showWeekNumber) {
25089
25219
  tr.appendChild(createElement('th'));
25090
25220
  }
@@ -25210,7 +25340,7 @@ class Year extends ViewBase {
25210
25340
  return dateCol;
25211
25341
  }
25212
25342
  getMonthDates(date) {
25213
- const startDate = getWeekFirstDate(firstDateOfMonth(date), this.parent.firstDayOfWeek);
25343
+ const startDate = getWeekFirstDate(firstDateOfMonth(date), this.parent.activeViewOptions.firstDayOfWeek);
25214
25344
  const endDate = addDays(new Date(+startDate), (6 * WEEK_LENGTH));
25215
25345
  const dateCollection = [];
25216
25346
  for (let start = startDate; start.getTime() < endDate.getTime(); start = addDays(start, 1)) {
@@ -25342,10 +25472,10 @@ class Year extends ViewBase {
25342
25472
  return addDays(addMonths(this.getStartDate(), this.parent.monthsCount), -1);
25343
25473
  }
25344
25474
  startDate() {
25345
- return this.parent.currentView === 'Year' ? getWeekFirstDate(this.getStartDate(), this.parent.firstDayOfWeek) : this.getStartDate();
25475
+ return this.parent.currentView === 'Year' ? getWeekFirstDate(this.getStartDate(), this.parent.activeViewOptions.firstDayOfWeek) : this.getStartDate();
25346
25476
  }
25347
25477
  endDate() {
25348
- return this.parent.currentView === 'Year' ? addDays(getWeekLastDate(this.getEndDate(), this.parent.firstDayOfWeek), 1) :
25478
+ return this.parent.currentView === 'Year' ? addDays(getWeekLastDate(this.getEndDate(), this.parent.activeViewOptions.firstDayOfWeek), 1) :
25349
25479
  addDays(this.getEndDate(), 1);
25350
25480
  }
25351
25481
  getEndDateFromStartDate(start) {
@@ -26465,7 +26595,7 @@ class TimelineHeaderRow {
26465
26595
  const jsDate = +new Date(1970, 0, 1);
26466
26596
  const tzOffsetDiff = d.getTimezoneOffset() - new Date(1970, 0, 1).getTimezoneOffset();
26467
26597
  let key = Math.ceil(((((+d - jsDate) - (tzOffsetDiff * 60 * 1000)) / MS_PER_DAY) + new Date(jsDate).getDay() + 1) / 7);
26468
- if (this.parent.firstDayOfWeek && this.parent.firstDayOfWeek > new Date(+d).getDay()) {
26598
+ if (this.parent.activeViewOptions.firstDayOfWeek && this.parent.activeViewOptions.firstDayOfWeek > new Date(+d).getDay()) {
26469
26599
  key = key - 1;
26470
26600
  }
26471
26601
  result[parseInt(key.toString(), 10)] = result[parseInt(key.toString(), 10)] || [];
@@ -26765,7 +26895,12 @@ class TimelineViews extends VerticalView {
26765
26895
  const tr = createElement('tr');
26766
26896
  const td = createElement('td', { attrs: { 'aria-selected': 'false' } });
26767
26897
  const trCount = this.getRowCount();
26898
+ const existingGroupIndices = this.getGroupIndices();
26768
26899
  for (let i = 0; i < trCount; i++) {
26900
+ if (existingGroupIndices.length > 0 &&
26901
+ existingGroupIndices.indexOf(this.parent.resourceBase.renderedResources[parseInt(i.toString(), 10)].groupIndex) > -1) {
26902
+ continue;
26903
+ }
26769
26904
  const ntr = tr.cloneNode();
26770
26905
  for (let tdData of this.colLevels[this.colLevels.length - 1]) {
26771
26906
  if (this.parent.activeViewOptions.group.resources.length > 0 && !this.parent.uiStateValues.isGroupAdaptive) {
@@ -27249,13 +27384,17 @@ class TimelineYear extends Year {
27249
27384
  getContentRows() {
27250
27385
  const tRow = [];
27251
27386
  const monthCells = this.getMonths();
27387
+ const existingGroupIndices = this.getGroupIndices();
27252
27388
  for (let row = 0; row < this.parent.resourceBase.renderedResources.length; row++) {
27253
- const tr = createElement('tr');
27254
- tRow.push(tr);
27255
27389
  let resData;
27256
27390
  if (this.parent.activeViewOptions.group.resources.length > 0 && !this.parent.uiStateValues.isGroupAdaptive) {
27257
27391
  resData = this.parent.resourceBase.renderedResources[parseInt(row.toString(), 10)];
27392
+ if (existingGroupIndices.length > 0 && existingGroupIndices.indexOf(resData.groupIndex) > -1) {
27393
+ continue;
27394
+ }
27258
27395
  }
27396
+ const tr = createElement('tr');
27397
+ tRow.push(tr);
27259
27398
  let monthDate = new Date(this.parent.selectedDate.getFullYear(), monthCells[parseInt(row.toString(), 10)], 1);
27260
27399
  let date = this.parent.calendarUtil.getMonthStartDate(new Date(monthDate.getTime()));
27261
27400
  for (let month = 0; month < this.columnCount; month++) {