@syncfusion/ej2-schedule 22.2.12 → 23.1.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 (111) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/ej2-schedule.min.js +3 -3
  3. package/dist/ej2-schedule.umd.min.js +3 -3
  4. package/dist/ej2-schedule.umd.min.js.map +1 -1
  5. package/dist/es6/ej2-schedule.es2015.js +309 -67
  6. package/dist/es6/ej2-schedule.es2015.js.map +1 -1
  7. package/dist/es6/ej2-schedule.es5.js +311 -67
  8. package/dist/es6/ej2-schedule.es5.js.map +1 -1
  9. package/dist/global/ej2-schedule.min.js +3 -3
  10. package/dist/global/ej2-schedule.min.js.map +1 -1
  11. package/dist/global/index.d.ts +2 -2
  12. package/package.json +16 -16
  13. package/src/schedule/actions/crud.d.ts +1 -1
  14. package/src/schedule/actions/crud.js +13 -5
  15. package/src/schedule/actions/data.js +29 -8
  16. package/src/schedule/actions/keyboard.js +1 -2
  17. package/src/schedule/actions/virtual-scroll.d.ts +1 -0
  18. package/src/schedule/actions/virtual-scroll.js +37 -2
  19. package/src/schedule/base/constant.d.ts +6 -0
  20. package/src/schedule/base/constant.js +6 -0
  21. package/src/schedule/base/interface.d.ts +15 -0
  22. package/src/schedule/base/resource.js +1 -0
  23. package/src/schedule/base/schedule-model.d.ts +48 -35
  24. package/src/schedule/base/schedule.d.ts +60 -35
  25. package/src/schedule/base/schedule.js +74 -6
  26. package/src/schedule/event-renderer/event-base.js +17 -11
  27. package/src/schedule/models/views-model.d.ts +10 -1
  28. package/src/schedule/models/views.d.ts +9 -1
  29. package/src/schedule/models/views.js +3 -0
  30. package/src/schedule/popups/event-tooltip.js +7 -3
  31. package/src/schedule/popups/event-window.d.ts +7 -0
  32. package/src/schedule/popups/event-window.js +123 -29
  33. package/src/schedule/popups/quick-popups.js +3 -0
  34. package/styles/bootstrap-dark.css +15 -0
  35. package/styles/bootstrap.css +15 -0
  36. package/styles/bootstrap4.css +15 -0
  37. package/styles/bootstrap5-dark.css +15 -0
  38. package/styles/bootstrap5.css +15 -0
  39. package/styles/fabric-dark.css +15 -0
  40. package/styles/fabric.css +15 -0
  41. package/styles/fluent-dark.css +15 -0
  42. package/styles/fluent.css +15 -0
  43. package/styles/highcontrast-light.css +15 -0
  44. package/styles/highcontrast.css +15 -0
  45. package/styles/material-dark.css +15 -1
  46. package/styles/material.css +15 -1
  47. package/styles/material3-dark.css +16 -2
  48. package/styles/material3-dark.scss +1 -1
  49. package/styles/material3.css +16 -2
  50. package/styles/material3.scss +1 -1
  51. package/styles/recurrence-editor/bootstrap-dark.scss +1 -1
  52. package/styles/recurrence-editor/bootstrap.scss +1 -1
  53. package/styles/recurrence-editor/bootstrap4.scss +1 -1
  54. package/styles/recurrence-editor/bootstrap5-dark.scss +1 -1
  55. package/styles/recurrence-editor/bootstrap5.scss +1 -1
  56. package/styles/recurrence-editor/fabric-dark.scss +1 -1
  57. package/styles/recurrence-editor/fabric.scss +1 -1
  58. package/styles/recurrence-editor/fluent-dark.scss +1 -1
  59. package/styles/recurrence-editor/fluent.scss +1 -1
  60. package/styles/recurrence-editor/highcontrast-light.scss +1 -1
  61. package/styles/recurrence-editor/highcontrast.scss +1 -1
  62. package/styles/recurrence-editor/material-dark.css +0 -1
  63. package/styles/recurrence-editor/material-dark.scss +1 -1
  64. package/styles/recurrence-editor/material.css +0 -1
  65. package/styles/recurrence-editor/material.scss +1 -1
  66. package/styles/recurrence-editor/material3-dark.css +0 -1
  67. package/styles/recurrence-editor/material3-dark.scss +1 -1
  68. package/styles/recurrence-editor/material3.css +0 -1
  69. package/styles/recurrence-editor/material3.scss +1 -1
  70. package/styles/recurrence-editor/tailwind-dark.css +0 -1
  71. package/styles/recurrence-editor/tailwind-dark.scss +1 -1
  72. package/styles/recurrence-editor/tailwind.css +0 -1
  73. package/styles/recurrence-editor/tailwind.scss +1 -1
  74. package/styles/schedule/_layout.scss +15 -0
  75. package/styles/schedule/_material3-definition.scss +1 -1
  76. package/styles/schedule/bootstrap-dark.css +15 -0
  77. package/styles/schedule/bootstrap-dark.scss +1 -1
  78. package/styles/schedule/bootstrap.css +15 -0
  79. package/styles/schedule/bootstrap.scss +1 -1
  80. package/styles/schedule/bootstrap4.css +15 -0
  81. package/styles/schedule/bootstrap4.scss +1 -1
  82. package/styles/schedule/bootstrap5-dark.css +15 -0
  83. package/styles/schedule/bootstrap5-dark.scss +1 -1
  84. package/styles/schedule/bootstrap5.css +15 -0
  85. package/styles/schedule/bootstrap5.scss +1 -1
  86. package/styles/schedule/fabric-dark.css +15 -0
  87. package/styles/schedule/fabric-dark.scss +1 -1
  88. package/styles/schedule/fabric.css +15 -0
  89. package/styles/schedule/fabric.scss +1 -1
  90. package/styles/schedule/fluent-dark.css +15 -0
  91. package/styles/schedule/fluent-dark.scss +1 -1
  92. package/styles/schedule/fluent.css +15 -0
  93. package/styles/schedule/fluent.scss +1 -1
  94. package/styles/schedule/highcontrast-light.css +15 -0
  95. package/styles/schedule/highcontrast-light.scss +1 -1
  96. package/styles/schedule/highcontrast.css +15 -0
  97. package/styles/schedule/highcontrast.scss +1 -1
  98. package/styles/schedule/material-dark.css +15 -1
  99. package/styles/schedule/material-dark.scss +1 -1
  100. package/styles/schedule/material.css +15 -1
  101. package/styles/schedule/material.scss +1 -1
  102. package/styles/schedule/material3-dark.css +16 -2
  103. package/styles/schedule/material3-dark.scss +1 -1
  104. package/styles/schedule/material3.css +16 -2
  105. package/styles/schedule/material3.scss +1 -1
  106. package/styles/schedule/tailwind-dark.css +15 -1
  107. package/styles/schedule/tailwind-dark.scss +1 -1
  108. package/styles/schedule/tailwind.css +15 -1
  109. package/styles/schedule/tailwind.scss +1 -1
  110. package/styles/tailwind-dark.css +15 -2
  111. package/styles/tailwind.css +15 -2
@@ -35,6 +35,8 @@ const renderCell = 'renderCell';
35
35
  /** @private */
36
36
  const eventClick = 'eventClick';
37
37
  /** @private */
38
+ const eventDoubleClick = 'eventDoubleClick';
39
+ /** @private */
38
40
  const eventRendered = 'eventRendered';
39
41
  /** @private */
40
42
  const dataBinding = 'dataBinding';
@@ -60,6 +62,10 @@ const resizeStop = 'resizeStop';
60
62
  const inlineClick = 'inlineClick';
61
63
  /** @private */
62
64
  const cellSelect = 'cellSelect';
65
+ /** @private */
66
+ const virtualScrollStart = 'virtualScrollStart';
67
+ /** @private */
68
+ const virtualScrollStop = 'virtualScrollStop';
63
69
  /**
64
70
  * Specifies schedule internal events
65
71
  */
@@ -552,7 +558,7 @@ const WORK_HOURS_CLASS = 'e-work-hours';
552
558
  /** @private */
553
559
  const POPUP_OPEN = 'e-popup-open';
554
560
  /** @private */
555
-
561
+ const POPUP_CLOSE = 'e-popup-close';
556
562
  /** @private */
557
563
  const DATE_HEADER_WRAP_CLASS = 'e-date-header-wrap';
558
564
  /** @private */
@@ -2066,8 +2072,7 @@ class KeyboardInteraction {
2066
2072
  const queryStr = '.' + WORK_CELLS_CLASS + ',.' + ALLDAY_CELLS_CLASS + ',.' + HEADER_CELLS_CLASS;
2067
2073
  let target = closest(e.target, queryStr);
2068
2074
  const selectedCells = this.parent.getSelectedCells();
2069
- if (this.parent.activeViewOptions.group.resources.length > 0 && selectedCells.length > 0 &&
2070
- selectedCells[0].getAttribute('data-group-index') !== target.getAttribute('data-group-index')) {
2075
+ if (selectedCells.length > 0 && selectedCells.indexOf(target) === -1) {
2071
2076
  target = selectedCells[selectedCells.length - 1];
2072
2077
  }
2073
2078
  if (this.parent.currentView === 'TimelineYear' && target.classList.contains(OTHERMONTH_CLASS)) {
@@ -3044,15 +3049,35 @@ class Data {
3044
3049
  */
3045
3050
  generateQuery(startDate, endDate) {
3046
3051
  const query = this.query.clone();
3047
- if (this.parent && this.parent.eventSettings.includeFiltersInQuery && startDate && endDate) {
3048
- const dateQuery = this.getStartEndQuery(startDate, endDate);
3049
- const recurrenceQuery = new Predicate(this.parent.eventFields.recurrenceRule, 'notequal', null).and(new Predicate(this.parent.eventFields.recurrenceRule, 'notequal', ''));
3050
- return query.where(dateQuery.or(recurrenceQuery));
3051
- }
3052
- if (startDate) {
3052
+ if (this.parent && startDate && endDate) {
3053
+ if (this.parent.activeViewOptions && this.parent.activeViewOptions.enableLazyLoading &&
3054
+ !isNullOrUndefined(this.parent.activeViewOptions.group.resources) &&
3055
+ this.parent.activeViewOptions.group.resources.length > 0 && this.parent.resourceBase &&
3056
+ this.parent.resourceBase.resourceCollection.length > 0 && this.parent.resourceBase.renderedResources.length > 0) {
3057
+ const resIdCollection = [];
3058
+ this.parent.resourceBase.resourceCollection.forEach(() => resIdCollection.push([]));
3059
+ this.parent.resourceBase.renderedResources.forEach((resource) => {
3060
+ resIdCollection.forEach((resId, index) => {
3061
+ const groupId = resource.groupOrder[parseInt(index.toString(), 10)];
3062
+ if (groupId && resId.indexOf(groupId) < 0) {
3063
+ resId.push(groupId);
3064
+ }
3065
+ });
3066
+ });
3067
+ this.parent.resourceBase.resourceCollection.forEach((resource, index) => {
3068
+ query.addParams(resource.field, resIdCollection[parseInt(index.toString(), 10)].toString());
3069
+ });
3070
+ }
3071
+ if (this.parent.timezone) {
3072
+ startDate = this.parent.tzModule.remove(new Date(+startDate.getTime()), this.parent.timezone);
3073
+ endDate = this.parent.tzModule.remove(new Date(+endDate.getTime()), this.parent.timezone);
3074
+ }
3075
+ if (this.parent.eventSettings.includeFiltersInQuery) {
3076
+ const dateQuery = this.getStartEndQuery(startDate, endDate);
3077
+ const recurrenceQuery = new Predicate(this.parent.eventFields.recurrenceRule, 'notequal', null).and(new Predicate(this.parent.eventFields.recurrenceRule, 'notequal', ''));
3078
+ return query.where(dateQuery.or(recurrenceQuery));
3079
+ }
3053
3080
  query.addParams('StartDate', startDate.toISOString());
3054
- }
3055
- if (endDate) {
3056
3081
  query.addParams('EndDate', endDate.toISOString());
3057
3082
  }
3058
3083
  return query;
@@ -5996,12 +6021,12 @@ class EventBase {
5996
6021
  });
5997
6022
  }
5998
6023
  }
5999
- eventDoubleClick(e) {
6024
+ eventDoubleClick(eventData) {
6000
6025
  if (this.parent.quickPopup) {
6001
6026
  this.parent.quickPopup.quickPopupHide(true);
6002
6027
  }
6003
- if (e.type === 'touchstart') {
6004
- this.activeEventData(e, true);
6028
+ if (eventData.type === 'touchstart') {
6029
+ this.activeEventData(eventData, true);
6005
6030
  }
6006
6031
  this.removeSelectedAppointmentClass();
6007
6032
  this.parent.selectedElements = [];
@@ -6009,14 +6034,19 @@ class EventBase {
6009
6034
  this.parent.activeEventData.element.querySelector('.' + INLINE_SUBJECT_CLASS)) {
6010
6035
  return;
6011
6036
  }
6012
- if (!isNullOrUndefined(this.parent.activeEventData.event) &&
6013
- isNullOrUndefined(this.parent.activeEventData.event[this.parent.eventFields.recurrenceID])) {
6014
- this.parent.eventWindow.openEditor(this.parent.activeEventData.event, 'Save');
6015
- }
6016
- else {
6017
- this.parent.currentAction = 'EditOccurrence';
6018
- this.parent.quickPopup.openRecurrenceAlert();
6019
- }
6037
+ const args = extend(this.parent.activeEventData, { cancel: false, originalEvent: eventData });
6038
+ this.parent.trigger(eventDoubleClick, args, (eventDoubleClickArgs) => {
6039
+ if (!eventDoubleClickArgs.cancel) {
6040
+ if (!isNullOrUndefined(this.parent.activeEventData.event) &&
6041
+ isNullOrUndefined(this.parent.activeEventData.event[this.parent.eventFields.recurrenceID])) {
6042
+ this.parent.eventWindow.openEditor(this.parent.activeEventData.event, 'Save');
6043
+ }
6044
+ else {
6045
+ this.parent.currentAction = 'EditOccurrence';
6046
+ this.parent.quickPopup.openRecurrenceAlert();
6047
+ }
6048
+ }
6049
+ });
6020
6050
  }
6021
6051
  getEventByGuid(guid) {
6022
6052
  return this.parent.eventsProcessed.filter((data) => data.Guid === guid)[0];
@@ -9167,6 +9197,9 @@ class QuickPopups {
9167
9197
  'aria-label': this.parent.getAnnouncementString(eventData)
9168
9198
  }
9169
9199
  });
9200
+ if (eventData[fields.isReadonly]) {
9201
+ addClass([appointmentElement], 'e-read-only');
9202
+ }
9170
9203
  let templateElement;
9171
9204
  if (!isNullOrUndefined(this.parent.activeViewOptions.eventTemplate)) {
9172
9205
  const tempId = this.parent.element.id + '_' + this.parent.activeViewOptions.eventTemplateName + 'eventTemplate';
@@ -10258,7 +10291,7 @@ class EventTooltip {
10258
10291
  cssClass: this.parent.cssClass + ' ' + EVENT_TOOLTIP_ROOT_CLASS,
10259
10292
  target: this.getTargets(),
10260
10293
  beforeRender: this.onBeforeRender.bind(this),
10261
- afterClose: this.onTooltipClose.bind(this),
10294
+ beforeClose: this.onTooltipClose.bind(this),
10262
10295
  enableRtl: this.parent.enableRtl,
10263
10296
  enableHtmlSanitizer: this.parent.enableHtmlSanitizer
10264
10297
  });
@@ -10366,7 +10399,11 @@ class EventTooltip {
10366
10399
  }
10367
10400
  this.parent.renderTemplates();
10368
10401
  }
10369
- onTooltipClose() {
10402
+ onTooltipClose(args) {
10403
+ if (args.element) {
10404
+ removeClass([args.element], POPUP_OPEN);
10405
+ addClass([args.element], POPUP_CLOSE);
10406
+ }
10370
10407
  this.parent.resetTemplates(['tooltipTemplate', 'headerTooltipTemplate']);
10371
10408
  }
10372
10409
  setContent(content) {
@@ -11538,40 +11575,54 @@ class EventWindow {
11538
11575
  };
11539
11576
  if (this.parent.isAdaptive) {
11540
11577
  dialogModel.cssClass = EVENT_WINDOW_DIALOG_CLASS + ' ' + DEVICE_CLASS;
11541
- dialogModel.header = '<div class="e-title-header"><div class="e-back-icon e-icons"></div><div class="e-title-text">' +
11542
- this.l10n.getConstant('newEvent') + '</div><div class="e-save-icon e-icons"></div></div>';
11578
+ if (!this.parent.editorHeaderTemplate) {
11579
+ dialogModel.header = '<div class="e-title-header"><div class="e-back-icon e-icons"></div><div class="e-title-text">' +
11580
+ this.l10n.getConstant('newEvent') + '</div><div class="e-save-icon e-icons"></div></div>';
11581
+ }
11543
11582
  }
11544
11583
  else {
11545
- dialogModel.buttons = [{
11546
- buttonModel: {
11547
- content: this.l10n.getConstant('deleteButton'), cssClass: DELETE_EVENT_CLASS,
11548
- disabled: !this.parent.eventSettings.allowDeleting || this.parent.readonly
11549
- },
11550
- click: this.eventDelete.bind(this)
11551
- }, {
11552
- buttonModel: {
11553
- content: this.l10n.getConstant('saveButton'), cssClass: 'e-primary ' + EVENT_WINDOW_SAVE_BUTTON_CLASS,
11554
- isPrimary: true, disabled: !this.parent.eventSettings.allowAdding || this.parent.readonly
11555
- },
11556
- click: this.eventSave.bind(this)
11557
- }, {
11558
- buttonModel: { cssClass: EVENT_WINDOW_CANCEL_BUTTON_CLASS, content: this.l10n.getConstant('cancelButton') },
11559
- click: this.dialogClose.bind(this)
11560
- }];
11561
- dialogModel.header = '<div class="e-title-text">' + this.l10n.getConstant('newEvent') + '</div>';
11584
+ if (!this.parent.editorFooterTemplate) {
11585
+ this.renderDialogButtons(dialogModel);
11586
+ }
11587
+ if (!this.parent.editorHeaderTemplate) {
11588
+ dialogModel.header = '<div class="e-title-text">' + this.l10n.getConstant('newEvent') + '</div>';
11589
+ }
11562
11590
  }
11563
11591
  this.dialogObject = new Dialog(dialogModel, this.element);
11564
11592
  if (this.dialogObject.element.querySelector('.e-dlg-closeicon-btn')) {
11565
11593
  this.dialogObject.element.querySelector('.e-dlg-closeicon-btn').setAttribute('title', this.l10n.getConstant('close'));
11566
11594
  }
11595
+ this.addEventHandlers();
11567
11596
  addClass([this.element.parentElement], EVENT_WINDOW_DIALOG_CLASS + '-container');
11568
- if (this.parent.isAdaptive) {
11569
- EventHandler.add(this.element.querySelector('.' + EVENT_WINDOW_BACK_ICON_CLASS), 'click', this.dialogClose, this);
11570
- EventHandler.add(this.element.querySelector('.' + EVENT_WINDOW_SAVE_ICON_CLASS), 'click', this.eventSave, this);
11571
- }
11572
11597
  EventHandler.add(this.dialogObject.element, 'keydown', this.preventEventSave, this);
11573
11598
  this.applyFormValidation();
11574
11599
  }
11600
+ renderDialogButtons(dialogButton) {
11601
+ dialogButton.buttons = [{
11602
+ buttonModel: {
11603
+ content: this.l10n.getConstant('deleteButton'), cssClass: DELETE_EVENT_CLASS,
11604
+ disabled: !this.parent.eventSettings.allowDeleting || this.parent.readonly
11605
+ },
11606
+ click: this.eventDelete.bind(this)
11607
+ }, {
11608
+ buttonModel: {
11609
+ content: this.l10n.getConstant('saveButton'), cssClass: 'e-primary ' + EVENT_WINDOW_SAVE_BUTTON_CLASS,
11610
+ isPrimary: true, disabled: !this.parent.eventSettings.allowAdding || this.parent.readonly
11611
+ },
11612
+ click: this.eventSave.bind(this)
11613
+ }, {
11614
+ buttonModel: { cssClass: EVENT_WINDOW_CANCEL_BUTTON_CLASS, content: this.l10n.getConstant('cancelButton') },
11615
+ click: this.dialogClose.bind(this)
11616
+ }];
11617
+ }
11618
+ addEventHandlers() {
11619
+ const backIcon = this.element.querySelector('.' + EVENT_WINDOW_BACK_ICON_CLASS);
11620
+ const saveIcon = this.element.querySelector('.' + EVENT_WINDOW_SAVE_ICON_CLASS);
11621
+ if (this.parent.isAdaptive && !isNullOrUndefined(backIcon) && !isNullOrUndefined(saveIcon)) {
11622
+ EventHandler.add(backIcon, 'click', this.dialogClose, this);
11623
+ EventHandler.add(saveIcon, 'click', this.eventSave, this);
11624
+ }
11625
+ }
11575
11626
  refresh() {
11576
11627
  this.destroy(true);
11577
11628
  this.renderEventWindow();
@@ -11615,6 +11666,23 @@ class EventWindow {
11615
11666
  }
11616
11667
  data = eventObj;
11617
11668
  }
11669
+ if (!isNullOrUndefined(this.parent.editorHeaderTemplate)) {
11670
+ this.parent.resetTemplates(['editorHeaderTemplate']);
11671
+ if (this.parent.isAdaptive && !this.parent.editorFooterTemplate) {
11672
+ this.dialogObject.header = this.createAdaptiveHeaderElement(data);
11673
+ }
11674
+ else {
11675
+ this.dialogObject.header = this.getDialogHeader(data);
11676
+ }
11677
+ }
11678
+ if (!isNullOrUndefined(this.parent.editorFooterTemplate)) {
11679
+ this.parent.resetTemplates(['editorFooterTemplate']);
11680
+ this.dialogObject.footerTemplate = this.getDialogFooter(data);
11681
+ }
11682
+ if (!isNullOrUndefined(this.parent.editorHeaderTemplate) || !isNullOrUndefined(this.parent.editorFooterTemplate)) {
11683
+ this.dialogObject.dataBind();
11684
+ this.addEventHandlers();
11685
+ }
11618
11686
  if (!isNullOrUndefined(this.parent.editorTemplate)) {
11619
11687
  this.renderFormElements(this.element.querySelector('.e-schedule-form'), data);
11620
11688
  }
@@ -11645,6 +11713,65 @@ class EventWindow {
11645
11713
  this.dialogObject.dataBind();
11646
11714
  this.applyFormValidation();
11647
11715
  }
11716
+ setDialogHeader() {
11717
+ if (!isNullOrUndefined(this.parent.editorHeaderTemplate)) {
11718
+ this.parent.resetTemplates(['editorHeaderTemplate']);
11719
+ if (this.parent.isAdaptive && !this.parent.editorFooterTemplate) {
11720
+ this.dialogObject.header = this.createAdaptiveHeaderElement();
11721
+ }
11722
+ else {
11723
+ this.dialogObject.header = this.getDialogHeader();
11724
+ }
11725
+ }
11726
+ else if (this.parent.isAdaptive) {
11727
+ this.dialogObject.header = '<div class="e-title-header"><div class="e-back-icon e-icons"></div><div class="e-title-text">' +
11728
+ this.l10n.getConstant('newEvent') + '</div><div class="e-save-icon e-icons"></div></div>';
11729
+ }
11730
+ else {
11731
+ this.dialogObject.header = '<div class="e-title-text">' + this.l10n.getConstant('newEvent') + '</div>';
11732
+ }
11733
+ this.dialogObject.dataBind();
11734
+ this.addEventHandlers();
11735
+ }
11736
+ setDialogFooter() {
11737
+ if (!isNullOrUndefined(this.parent.editorFooterTemplate)) {
11738
+ this.parent.resetTemplates(['editorFooterTemplate']);
11739
+ this.dialogObject.footerTemplate = this.getDialogFooter();
11740
+ }
11741
+ else if (!this.parent.isAdaptive && isNullOrUndefined(this.parent.editorFooterTemplate)) {
11742
+ this.renderDialogButtons(this.dialogObject);
11743
+ }
11744
+ else if (this.parent.isAdaptive && isNullOrUndefined(this.parent.editorFooterTemplate)) {
11745
+ this.dialogObject.footerTemplate = null;
11746
+ }
11747
+ this.dialogObject.dataBind();
11748
+ }
11749
+ createAdaptiveHeaderElement(data) {
11750
+ const header = createElement('div', { className: 'e-title-header' });
11751
+ const headerBackIcon = createElement('div', { className: 'e-back-icon e-icons' });
11752
+ header.appendChild(headerBackIcon);
11753
+ const headerTemplate = this.getDialogHeader(data);
11754
+ header.appendChild(headerTemplate);
11755
+ const headerSaveIcon = createElement('div', { className: 'e-save-icon e-icons' });
11756
+ header.appendChild(headerSaveIcon);
11757
+ return header;
11758
+ }
11759
+ getDialogHeader(args) {
11760
+ let headerTemplate = [];
11761
+ const headerTemplateId = this.parent.element.id + '_editorHeaderTemplate';
11762
+ const temHeaderDiv = document.createElement('div');
11763
+ headerTemplate = [].slice.call(this.parent.getEditorHeaderTemplate()(args || {}, this.parent, 'editorHeaderTemplate', headerTemplateId, false));
11764
+ append(headerTemplate, temHeaderDiv);
11765
+ return temHeaderDiv;
11766
+ }
11767
+ getDialogFooter(args) {
11768
+ let footerTemplate = [];
11769
+ const footerTemplateId = this.parent.element.id + '_editorFooterTemplate';
11770
+ const temFooterDiv = document.createElement('div');
11771
+ footerTemplate = [].slice.call(this.parent.getEditorFooterTemplate()(args || {}, this.parent, 'editorFooterTemplate', footerTemplateId, false));
11772
+ append(footerTemplate, temFooterDiv);
11773
+ return temFooterDiv;
11774
+ }
11648
11775
  preventEventSave(e) {
11649
11776
  if (this.parent && !this.parent.allowKeyboardInteraction && e.code === 'Enter') {
11650
11777
  this.isEnterKey = true;
@@ -11912,9 +12039,9 @@ class EventWindow {
11912
12039
  const resourceDiv = this.createDivElement(value + '-container' + ' ' + 'e-resources');
11913
12040
  const resourceInput = this.createInputElement(value + ' ' + EVENT_FIELD$1, fieldName);
11914
12041
  resourceDiv.appendChild(resourceInput);
11915
- function resourceTemplate(data) {
12042
+ const resourceTemplate = function (data) {
11916
12043
  return `<div class="e-resource-template"><div class="e-resource-color" style="background-color:${data[resourceData.colorField]}"></div><div class="e-resource-text">${data[resourceData.textField]}</div></div>`;
11917
- }
12044
+ };
11918
12045
  initializeCSPTemplate(resourceTemplate, resourceData);
11919
12046
  if (resourceData.allowMultiple) {
11920
12047
  const listObj = new MultiSelect({
@@ -12258,7 +12385,9 @@ class EventWindow {
12258
12385
  this.renderRepeatDialog();
12259
12386
  }
12260
12387
  this.element.querySelector('.' + FORM_CLASS).removeAttribute('data-id');
12261
- this.element.querySelector('.' + EVENT_WINDOW_TITLE_TEXT_CLASS).innerHTML = this.l10n.getConstant('newEvent');
12388
+ if (isNullOrUndefined(this.parent.editorHeaderTemplate)) {
12389
+ this.element.querySelector('.' + EVENT_WINDOW_TITLE_TEXT_CLASS).innerHTML = this.l10n.getConstant('newEvent');
12390
+ }
12262
12391
  eventObj.Timezone = false;
12263
12392
  this.repeatStartDate = eventObj[this.fields.startTime];
12264
12393
  this.repeatRule = '';
@@ -12495,10 +12624,12 @@ class EventWindow {
12495
12624
  if (!this.parent.eventSettings.allowEditing) {
12496
12625
  return;
12497
12626
  }
12498
- if (!this.parent.isAdaptive) {
12627
+ if (!this.parent.isAdaptive && isNullOrUndefined(this.parent.editorFooterTemplate)) {
12499
12628
  removeClass([this.element.querySelector('.' + DELETE_EVENT_CLASS)], DISABLE_CLASS);
12500
12629
  }
12501
- this.element.querySelector('.' + EVENT_WINDOW_TITLE_TEXT_CLASS).innerHTML = this.l10n.getConstant('editEvent');
12630
+ if (isNullOrUndefined(this.parent.editorHeaderTemplate)) {
12631
+ this.element.querySelector('.' + EVENT_WINDOW_TITLE_TEXT_CLASS).innerHTML = this.l10n.getConstant('editEvent');
12632
+ }
12502
12633
  this.element.querySelector('.' + FORM_CLASS).setAttribute('data-id', eventObj[this.fields.id].toString());
12503
12634
  if (isNullOrUndefined(this.parent.editorTemplate)) {
12504
12635
  eventObj = extend({}, eventObj, null, true);
@@ -13300,7 +13431,7 @@ class EventWindow {
13300
13431
  }
13301
13432
  destroy(isIgnore) {
13302
13433
  if (this.parent && !this.parent.isDestroyed) {
13303
- this.parent.resetTemplates(['editorTemplate']);
13434
+ this.parent.resetTemplates(['editorTemplate', 'editorHeaderTemplate', 'editorFooterTemplate']);
13304
13435
  }
13305
13436
  this.destroyComponents();
13306
13437
  if (this.recurrenceEditor) {
@@ -13343,6 +13474,7 @@ class EventWindow {
13343
13474
  }
13344
13475
  }
13345
13476
 
13477
+ /* eslint-disable @typescript-eslint/no-explicit-any */
13346
13478
  /**
13347
13479
  * Virtual Scroll
13348
13480
  */
@@ -13430,6 +13562,16 @@ class VirtualScroll {
13430
13562
  }
13431
13563
  renderEvents() {
13432
13564
  this.setTabIndex();
13565
+ const dynamicData = this.triggerScrollEvent(virtualScrollStop);
13566
+ if (this.parent.activeViewOptions && this.parent.activeViewOptions.enableLazyLoading && this.parent.crudModule) {
13567
+ if (dynamicData.length > 0) {
13568
+ this.parent.crudModule.refreshProcessedData(true, dynamicData);
13569
+ this.parent.hideSpinner();
13570
+ return;
13571
+ }
13572
+ this.parent.crudModule.refreshDataManager();
13573
+ return;
13574
+ }
13433
13575
  if (this.parent.crudModule) {
13434
13576
  this.parent.crudModule.refreshProcessedData(true);
13435
13577
  }
@@ -13465,7 +13607,7 @@ class VirtualScroll {
13465
13607
  resCollection = this.downScroll(conWrap, firstTDIndex);
13466
13608
  }
13467
13609
  if (!isNullOrUndefined(resCollection) && resCollection.length > 0) {
13468
- this.parent.showSpinner();
13610
+ this.triggerScrollEvent(virtualScrollStart);
13469
13611
  const selectedEle = this.parent.getSelectedCells();
13470
13612
  this.focusedEle = selectedEle[selectedEle.length - 1] || this.focusedEle;
13471
13613
  this.updateContent(resWrap, conWrap, eventWrap, resCollection);
@@ -13492,7 +13634,7 @@ class VirtualScroll {
13492
13634
  this.parent.resourceBase.expandedResources[0] !== resCollection[0] ||
13493
13635
  this.parent.resourceBase.expandedResources[this.parent.resourceBase.expandedResources.length - 1] !==
13494
13636
  resCollection[resCollection.length - 1]) {
13495
- this.parent.showSpinner();
13637
+ this.triggerScrollEvent(virtualScrollStart);
13496
13638
  const colLevels = this.parent.activeView.colLevels.slice(0);
13497
13639
  this.updateHorizontalContent(conWrap, resCollection);
13498
13640
  setStyleAttribute(conWrap.querySelector('table'), { transform: `translateX(${this.translateY}px)` });
@@ -13505,6 +13647,29 @@ class VirtualScroll {
13505
13647
  this.timeValue = window.setTimeout(() => { this.renderEvents(); }, 250);
13506
13648
  }
13507
13649
  }
13650
+ triggerScrollEvent(action) {
13651
+ let dynamicData = [];
13652
+ if (!this.parent.activeView) {
13653
+ return dynamicData;
13654
+ }
13655
+ const eventArgs = {
13656
+ startDate: this.parent.activeView.startDate(),
13657
+ endDate: this.parent.activeView.endDate(),
13658
+ startIndex: this.parent.resourceBase.renderedResources[0].groupIndex,
13659
+ endIndex: this.parent.resourceBase.renderedResources[this.parent.resourceBase.renderedResources.length - 1].groupIndex,
13660
+ resourceData: this.parent.resourceBase.renderedResources.map((x) => x.resourceData),
13661
+ name: action
13662
+ };
13663
+ this.parent.trigger(action, eventArgs, (args) => {
13664
+ if (action === virtualScrollStart) {
13665
+ this.parent.showSpinner();
13666
+ }
13667
+ else if (action === virtualScrollStop && !isNullOrUndefined(args.eventData) && args.eventData.length > 0) {
13668
+ dynamicData = args.eventData;
13669
+ }
13670
+ });
13671
+ return dynamicData;
13672
+ }
13508
13673
  upScroll(conWrap, firstTDIndex) {
13509
13674
  let index = 0;
13510
13675
  index = (~~(conWrap.scrollTop / this.itemSize) + Math.ceil(conWrap.clientHeight / this.itemSize)) - this.renderedLength;
@@ -14019,7 +14184,7 @@ class Crud {
14019
14184
  }
14020
14185
  this.parent.trigger(actionFailure, { error: e }, () => this.parent.hideSpinner());
14021
14186
  }
14022
- refreshProcessedData(isVirtualScrollAction = false) {
14187
+ refreshProcessedData(isVirtualScrollAction = false, dynamicEvents) {
14023
14188
  if (this.parent.dragAndDropModule) {
14024
14189
  this.parent.dragAndDropModule.actionObj.action = '';
14025
14190
  removeClass([this.parent.element], 'e-event-action');
@@ -14042,7 +14207,7 @@ class Crud {
14042
14207
  }
14043
14208
  }
14044
14209
  if (isVirtualScrollAction) {
14045
- this.parent.notify(dataReady, { processedData: this.parent.eventsProcessed });
14210
+ this.parent.notify(dataReady, { processedData: dynamicEvents ? this.parent.eventBase.processData(dynamicEvents) : this.parent.eventsProcessed });
14046
14211
  return;
14047
14212
  }
14048
14213
  const eventsData = this.parent.eventsData || [];
@@ -14198,6 +14363,8 @@ class Crud {
14198
14363
  editParams.changedRecords.push(event);
14199
14364
  promise = this.parent.dataModule.dataManager.update(fields.id, event, this.getTable(), this.getQuery());
14200
14365
  }
14366
+ const cloneEvent = extend({}, saveArgs.changedRecords[saveArgs.changedRecords.length - 1], null, true);
14367
+ this.parent.eventBase.selectWorkCellByTime([this.parent.eventBase.processTimezone(cloneEvent)]);
14201
14368
  const crudArgs = {
14202
14369
  requestType: 'eventChanged', cancel: false,
14203
14370
  data: saveArgs.changedRecords, promise: promise, editParams: editParams
@@ -14325,7 +14492,8 @@ class Crud {
14325
14492
  }
14326
14493
  }
14327
14494
  const promise = this.parent.dataModule.dataManager.saveChanges(editParams, fields.id, this.getTable(), this.getQuery());
14328
- this.parent.eventBase.selectWorkCellByTime(occurrenceArgs.changedRecords);
14495
+ const cloneEvent = extend({}, occurrenceArgs.changedRecords[occurrenceArgs.changedRecords.length - 1], null, true);
14496
+ this.parent.eventBase.selectWorkCellByTime(action === 'EditOccurrence' ? [this.parent.eventBase.processTimezone(cloneEvent)] : [cloneEvent]);
14329
14497
  const crudArgs = {
14330
14498
  requestType: action === 'EditOccurrence' ? 'eventChanged' : 'eventRemoved',
14331
14499
  cancel: false, data: isDeletedRecords ? occurrenceArgs.deletedRecords : occurrenceArgs.changedRecords,
@@ -14395,7 +14563,8 @@ class Crud {
14395
14563
  }
14396
14564
  }
14397
14565
  const promise = this.parent.dataModule.dataManager.saveChanges(editParams, fields.id, this.getTable(), this.getQuery());
14398
- this.parent.eventBase.selectWorkCellByTime(followArgs.changedRecords);
14566
+ const cloneEvent = extend({}, followArgs.changedRecords[followArgs.changedRecords.length - 1], null, true);
14567
+ this.parent.eventBase.selectWorkCellByTime(action === 'EditFollowingEvents' ? [this.parent.eventBase.processTimezone(cloneEvent)] : [cloneEvent]);
14399
14568
  const crudArgs = {
14400
14569
  requestType: action === 'EditFollowingEvents' ? 'eventChanged' : 'eventRemoved',
14401
14570
  cancel: false, data: followArgs.changedRecords, promise: promise, editParams: editParams
@@ -14456,7 +14625,8 @@ class Crud {
14456
14625
  }
14457
14626
  }
14458
14627
  const promise = this.parent.dataModule.dataManager.saveChanges(editParams, fields.id, this.getTable(), this.getQuery());
14459
- this.parent.eventBase.selectWorkCellByTime(seriesArgs.changedRecords);
14628
+ const cloneEvent = extend({}, seriesArgs.changedRecords[seriesArgs.changedRecords.length - 1], null, true);
14629
+ this.parent.eventBase.selectWorkCellByTime(action === 'EditSeries' ? [this.parent.eventBase.processTimezone(cloneEvent)] : [cloneEvent]);
14460
14630
  const crudArgs = {
14461
14631
  requestType: action === 'EditSeries' ? 'eventChanged' : 'eventRemoved',
14462
14632
  cancel: false, data: isDeletedRecords ? seriesArgs.deletedRecords : seriesArgs.changedRecords,
@@ -14510,6 +14680,7 @@ class Crud {
14510
14680
  }
14511
14681
  }
14512
14682
  const promise = this.parent.dataModule.dataManager.saveChanges(editParams, fields.id, this.getTable(), this.getQuery());
14683
+ this.parent.eventBase.selectWorkCellByTime(deleteArgs.deletedRecords);
14513
14684
  const crudArgs = {
14514
14685
  requestType: 'eventRemoved', cancel: false, data: deleteArgs.deletedRecords, promise: promise, editParams: editParams
14515
14686
  };
@@ -14550,6 +14721,8 @@ class Crud {
14550
14721
  }
14551
14722
  }
14552
14723
  const promise = this.parent.dataModule.dataManager.saveChanges(editParams, fields.id, this.getTable(), this.getQuery());
14724
+ const cloneEvent = extend({}, editArgs.changedRecords[editArgs.changedRecords.length - 1], null, true);
14725
+ this.parent.eventBase.selectWorkCellByTime([this.parent.eventBase.processTimezone(cloneEvent)]);
14553
14726
  const crudArgs = { requestType: 'eventChanged', cancel: false, data: editArgs.changedRecords, promise: promise, editParams: editParams };
14554
14727
  this.refreshData(crudArgs);
14555
14728
  }
@@ -15344,6 +15517,7 @@ class ResourceBase {
15344
15517
  nodeClicked: this.resourceClick.bind(this),
15345
15518
  created: this.resourceTreeCreated.bind(this)
15346
15519
  });
15520
+ this.treeViewObj.root = this.parent.root ? this.parent.root : this.parent;
15347
15521
  this.treeViewObj.appendTo(resourceTree);
15348
15522
  this.treeViewObj.expandAll();
15349
15523
  this.treePopup = new Popup(treeWrapper, {
@@ -16188,6 +16362,13 @@ let Schedule = class Schedule extends Component {
16188
16362
  this.renderElements(isSetModel);
16189
16363
  }
16190
16364
  }
16365
+ destroyEditorWindow() {
16366
+ if (this.eventWindow) {
16367
+ this.eventWindow.destroy();
16368
+ this.eventWindow = null;
16369
+ }
16370
+ this.eventWindow = new EventWindow(this);
16371
+ }
16191
16372
  /**
16192
16373
  * Method to render the layout elements
16193
16374
  *
@@ -16354,7 +16535,8 @@ let Schedule = class Schedule extends Component {
16354
16535
  headerRows: this.headerRows,
16355
16536
  orientation: 'Horizontal',
16356
16537
  numberOfWeeks: 0,
16357
- displayDate: null
16538
+ displayDate: null,
16539
+ enableLazyLoading: false
16358
16540
  };
16359
16541
  const viewOptions = this.viewCollections[this.viewIndex];
16360
16542
  const viewsData = extend(scheduleOptions, viewOptions, undefined, true);
@@ -16365,6 +16547,11 @@ let Schedule = class Schedule extends Component {
16365
16547
  viewsData.displayDate = viewsData.displayDate instanceof Date ? new Date(viewsData.displayDate.getTime()) :
16366
16548
  new Date(viewsData.displayDate);
16367
16549
  }
16550
+ if (viewsData.enableLazyLoading && !isNullOrUndefined(viewsData.group.resources) && viewsData.group.resources.length > 0 &&
16551
+ (['Agenda', 'MonthAgenda', 'Year', 'TimelineYear'].indexOf(viewsData.option) === -1 ||
16552
+ (viewsData.option === 'TimelineYear' && viewsData.orientation === 'Vertical'))) {
16553
+ viewsData.allowVirtualScrolling = true;
16554
+ }
16368
16555
  return viewsData;
16369
16556
  }
16370
16557
  initializeDataModule() {
@@ -16426,6 +16613,8 @@ let Schedule = class Schedule extends Component {
16426
16613
  this.headerTooltipTemplateFn = this.templateParser(this.activeViewOptions.group.headerTooltipTemplate);
16427
16614
  this.eventTooltipTemplateFn = this.templateParser(this.eventSettings.tooltipTemplate);
16428
16615
  this.editorTemplateFn = this.templateParser(this.editorTemplate);
16616
+ this.editorHeaderTemplateFn = this.templateParser(this.editorHeaderTemplate);
16617
+ this.editorFooterTemplateFn = this.templateParser(this.editorFooterTemplate);
16429
16618
  this.quickInfoTemplatesHeaderFn = this.templateParser(this.quickInfoTemplates.header);
16430
16619
  this.quickInfoTemplatesContentFn = this.templateParser(this.quickInfoTemplates.content);
16431
16620
  this.quickInfoTemplatesFooterFn = this.templateParser(this.quickInfoTemplates.footer);
@@ -17059,6 +17248,24 @@ let Schedule = class Schedule extends Component {
17059
17248
  getEditorTemplate() {
17060
17249
  return this.editorTemplateFn;
17061
17250
  }
17251
+ /**
17252
+ * Method to process editor header template
17253
+ *
17254
+ * @returns {CallbackFunction} Returns the callback function
17255
+ * @private
17256
+ */
17257
+ getEditorHeaderTemplate() {
17258
+ return this.editorHeaderTemplateFn;
17259
+ }
17260
+ /**
17261
+ * Method to process editor footer template
17262
+ *
17263
+ * @returns {CallbackFunction} Returns the callback function
17264
+ * @private
17265
+ */
17266
+ getEditorFooterTemplate() {
17267
+ return this.editorFooterTemplateFn;
17268
+ }
17062
17269
  /**
17063
17270
  * Method to process quick info header template
17064
17271
  *
@@ -17575,6 +17782,22 @@ let Schedule = class Schedule extends Component {
17575
17782
  this.eventWindow.setDialogContent();
17576
17783
  }
17577
17784
  break;
17785
+ case 'editorHeaderTemplate':
17786
+ if (!isNullOrUndefined(this.editorHeaderTemplate)) {
17787
+ this.editorHeaderTemplateFn = this.templateParser(this.editorHeaderTemplate);
17788
+ }
17789
+ if (this.eventWindow) {
17790
+ this.eventWindow.setDialogHeader();
17791
+ }
17792
+ break;
17793
+ case 'editorFooterTemplate':
17794
+ if (!isNullOrUndefined(this.editorFooterTemplate)) {
17795
+ this.editorFooterTemplateFn = this.templateParser(this.editorFooterTemplate);
17796
+ }
17797
+ if (this.eventWindow) {
17798
+ this.eventWindow.setDialogFooter();
17799
+ }
17800
+ break;
17578
17801
  case 'quickInfoTemplates':
17579
17802
  if (this.quickInfoTemplates.header) {
17580
17803
  this.quickInfoTemplatesHeaderFn = this.templateParser(this.quickInfoTemplates.header);
@@ -18340,13 +18563,17 @@ let Schedule = class Schedule extends Component {
18340
18563
  this.quickInfoTemplatesFooterFn = this.templateParser(this.quickInfoTemplates.footer);
18341
18564
  break;
18342
18565
  case 'editorTemplate':
18343
- if (this.eventWindow) {
18344
- this.eventWindow.destroy();
18345
- this.eventWindow = null;
18346
- }
18347
- this.eventWindow = new EventWindow(this);
18566
+ this.destroyEditorWindow();
18348
18567
  this.editorTemplateFn = this.templateParser(this.editorTemplate);
18349
18568
  break;
18569
+ case 'editorHeaderTemplate':
18570
+ this.destroyEditorWindow();
18571
+ this.editorHeaderTemplateFn = this.templateParser(this.editorHeaderTemplate);
18572
+ break;
18573
+ case 'editorFooterTemplate':
18574
+ this.destroyEditorWindow();
18575
+ this.editorFooterTemplateFn = this.templateParser(this.editorFooterTemplate);
18576
+ break;
18350
18577
  case 'tooltipTemplate':
18351
18578
  case 'headerTooltipTemplate':
18352
18579
  if (this.eventTooltip) {
@@ -18820,6 +19047,12 @@ __decorate([
18820
19047
  __decorate([
18821
19048
  Property()
18822
19049
  ], Schedule.prototype, "editorTemplate", void 0);
19050
+ __decorate([
19051
+ Property()
19052
+ ], Schedule.prototype, "editorHeaderTemplate", void 0);
19053
+ __decorate([
19054
+ Property()
19055
+ ], Schedule.prototype, "editorFooterTemplate", void 0);
18823
19056
  __decorate([
18824
19057
  Complex({}, QuickInfoTemplates)
18825
19058
  ], Schedule.prototype, "quickInfoTemplates", void 0);
@@ -18901,6 +19134,9 @@ __decorate([
18901
19134
  __decorate([
18902
19135
  Event()
18903
19136
  ], Schedule.prototype, "eventClick", void 0);
19137
+ __decorate([
19138
+ Event()
19139
+ ], Schedule.prototype, "eventDoubleClick", void 0);
18904
19140
  __decorate([
18905
19141
  Event()
18906
19142
  ], Schedule.prototype, "eventRendered", void 0);
@@ -18931,6 +19167,12 @@ __decorate([
18931
19167
  __decorate([
18932
19168
  Event()
18933
19169
  ], Schedule.prototype, "resizeStop", void 0);
19170
+ __decorate([
19171
+ Event()
19172
+ ], Schedule.prototype, "virtualScrollStart", void 0);
19173
+ __decorate([
19174
+ Event()
19175
+ ], Schedule.prototype, "virtualScrollStop", void 0);
18934
19176
  __decorate([
18935
19177
  Event()
18936
19178
  ], Schedule.prototype, "dataBound", void 0);
@@ -26982,5 +27224,5 @@ class Print {
26982
27224
  * Export Schedule components
26983
27225
  */
26984
27226
 
26985
- 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, cellSelect, 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, getElementWidthFromClass, getTranslateY, getTranslateX, getWeekFirstDate, getWeekLastDate, firstDateOfMonth, lastDateOfMonth, getWeekNumber, getWeekMiddleDate, setTime, resetTime, getDateInMs, getDateCount, addDays, addMonths, addYears, getStartEndHours, getMaxDays, getDaysCount, getDateFromString, getScrollBarWidth, resetScrollbarWidth, 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 };
27227
+ export { Schedule, cellClick, cellDoubleClick, moreEventsClick, select, hover, actionBegin, actionComplete, actionFailure, navigating, renderCell, eventClick, eventDoubleClick, eventRendered, dataBinding, dataBound, popupOpen, popupClose, dragStart, drag, dragStop, resizeStart, resizing, resizeStop, inlineClick, cellSelect, virtualScrollStart, virtualScrollStop, 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, getElementWidthFromClass, getTranslateY, getTranslateX, getWeekFirstDate, getWeekLastDate, firstDateOfMonth, lastDateOfMonth, getWeekNumber, getWeekMiddleDate, setTime, resetTime, getDateInMs, getDateCount, addDays, addMonths, addYears, getStartEndHours, getMaxDays, getDaysCount, getDateFromString, getScrollBarWidth, resetScrollbarWidth, 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 };
26986
27228
  //# sourceMappingURL=ej2-schedule.es2015.js.map