@syncfusion/ej2-schedule 22.2.12 → 23.1.36

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/ej2-schedule.min.js +2 -2
  3. package/dist/ej2-schedule.umd.min.js +2 -2
  4. package/dist/ej2-schedule.umd.min.js.map +1 -1
  5. package/dist/es6/ej2-schedule.es2015.js +288 -56
  6. package/dist/es6/ej2-schedule.es2015.js.map +1 -1
  7. package/dist/es6/ej2-schedule.es5.js +289 -56
  8. package/dist/es6/ej2-schedule.es5.js.map +1 -1
  9. package/dist/global/ej2-schedule.min.js +2 -2
  10. package/dist/global/ej2-schedule.min.js.map +1 -1
  11. package/dist/global/index.d.ts +1 -1
  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 +4 -0
  20. package/src/schedule/base/constant.js +4 -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 +41 -35
  24. package/src/schedule/base/schedule.d.ts +54 -35
  25. package/src/schedule/base/schedule.js +71 -6
  26. package/src/schedule/models/views-model.d.ts +10 -1
  27. package/src/schedule/models/views.d.ts +9 -1
  28. package/src/schedule/models/views.js +3 -0
  29. package/src/schedule/popups/event-tooltip.js +7 -3
  30. package/src/schedule/popups/event-window.d.ts +7 -0
  31. package/src/schedule/popups/event-window.js +123 -29
  32. package/src/schedule/popups/quick-popups.js +3 -0
  33. package/styles/bootstrap-dark.css +15 -0
  34. package/styles/bootstrap.css +15 -0
  35. package/styles/bootstrap4.css +15 -0
  36. package/styles/bootstrap5-dark.css +15 -0
  37. package/styles/bootstrap5.css +15 -0
  38. package/styles/fabric-dark.css +15 -0
  39. package/styles/fabric.css +15 -0
  40. package/styles/fluent-dark.css +15 -0
  41. package/styles/fluent.css +15 -0
  42. package/styles/highcontrast-light.css +15 -0
  43. package/styles/highcontrast.css +15 -0
  44. package/styles/material-dark.css +15 -1
  45. package/styles/material.css +15 -1
  46. package/styles/material3-dark.css +16 -2
  47. package/styles/material3-dark.scss +1 -1
  48. package/styles/material3.css +16 -2
  49. package/styles/material3.scss +1 -1
  50. package/styles/recurrence-editor/bootstrap-dark.scss +1 -1
  51. package/styles/recurrence-editor/bootstrap.scss +1 -1
  52. package/styles/recurrence-editor/bootstrap4.scss +1 -1
  53. package/styles/recurrence-editor/bootstrap5-dark.scss +1 -1
  54. package/styles/recurrence-editor/bootstrap5.scss +1 -1
  55. package/styles/recurrence-editor/fabric-dark.scss +1 -1
  56. package/styles/recurrence-editor/fabric.scss +1 -1
  57. package/styles/recurrence-editor/fluent-dark.scss +1 -1
  58. package/styles/recurrence-editor/fluent.scss +1 -1
  59. package/styles/recurrence-editor/highcontrast-light.scss +1 -1
  60. package/styles/recurrence-editor/highcontrast.scss +1 -1
  61. package/styles/recurrence-editor/material-dark.css +0 -1
  62. package/styles/recurrence-editor/material-dark.scss +1 -1
  63. package/styles/recurrence-editor/material.css +0 -1
  64. package/styles/recurrence-editor/material.scss +1 -1
  65. package/styles/recurrence-editor/material3-dark.css +0 -1
  66. package/styles/recurrence-editor/material3-dark.scss +1 -1
  67. package/styles/recurrence-editor/material3.css +0 -1
  68. package/styles/recurrence-editor/material3.scss +1 -1
  69. package/styles/recurrence-editor/tailwind-dark.css +0 -1
  70. package/styles/recurrence-editor/tailwind-dark.scss +1 -1
  71. package/styles/recurrence-editor/tailwind.css +0 -1
  72. package/styles/recurrence-editor/tailwind.scss +1 -1
  73. package/styles/schedule/_layout.scss +15 -0
  74. package/styles/schedule/_material3-definition.scss +1 -1
  75. package/styles/schedule/bootstrap-dark.css +15 -0
  76. package/styles/schedule/bootstrap-dark.scss +1 -1
  77. package/styles/schedule/bootstrap.css +15 -0
  78. package/styles/schedule/bootstrap.scss +1 -1
  79. package/styles/schedule/bootstrap4.css +15 -0
  80. package/styles/schedule/bootstrap4.scss +1 -1
  81. package/styles/schedule/bootstrap5-dark.css +15 -0
  82. package/styles/schedule/bootstrap5-dark.scss +1 -1
  83. package/styles/schedule/bootstrap5.css +15 -0
  84. package/styles/schedule/bootstrap5.scss +1 -1
  85. package/styles/schedule/fabric-dark.css +15 -0
  86. package/styles/schedule/fabric-dark.scss +1 -1
  87. package/styles/schedule/fabric.css +15 -0
  88. package/styles/schedule/fabric.scss +1 -1
  89. package/styles/schedule/fluent-dark.css +15 -0
  90. package/styles/schedule/fluent-dark.scss +1 -1
  91. package/styles/schedule/fluent.css +15 -0
  92. package/styles/schedule/fluent.scss +1 -1
  93. package/styles/schedule/highcontrast-light.css +15 -0
  94. package/styles/schedule/highcontrast-light.scss +1 -1
  95. package/styles/schedule/highcontrast.css +15 -0
  96. package/styles/schedule/highcontrast.scss +1 -1
  97. package/styles/schedule/material-dark.css +15 -1
  98. package/styles/schedule/material-dark.scss +1 -1
  99. package/styles/schedule/material.css +15 -1
  100. package/styles/schedule/material.scss +1 -1
  101. package/styles/schedule/material3-dark.css +16 -2
  102. package/styles/schedule/material3-dark.scss +1 -1
  103. package/styles/schedule/material3.css +16 -2
  104. package/styles/schedule/material3.scss +1 -1
  105. package/styles/schedule/tailwind-dark.css +15 -1
  106. package/styles/schedule/tailwind-dark.scss +1 -1
  107. package/styles/schedule/tailwind.css +15 -1
  108. package/styles/schedule/tailwind.scss +1 -1
  109. package/styles/tailwind-dark.css +15 -2
  110. package/styles/tailwind.css +15 -2
@@ -60,6 +60,10 @@ const resizeStop = 'resizeStop';
60
60
  const inlineClick = 'inlineClick';
61
61
  /** @private */
62
62
  const cellSelect = 'cellSelect';
63
+ /** @private */
64
+ const virtualScrollStart = 'virtualScrollStart';
65
+ /** @private */
66
+ const virtualScrollStop = 'virtualScrollStop';
63
67
  /**
64
68
  * Specifies schedule internal events
65
69
  */
@@ -552,7 +556,7 @@ const WORK_HOURS_CLASS = 'e-work-hours';
552
556
  /** @private */
553
557
  const POPUP_OPEN = 'e-popup-open';
554
558
  /** @private */
555
-
559
+ const POPUP_CLOSE = 'e-popup-close';
556
560
  /** @private */
557
561
  const DATE_HEADER_WRAP_CLASS = 'e-date-header-wrap';
558
562
  /** @private */
@@ -2066,8 +2070,7 @@ class KeyboardInteraction {
2066
2070
  const queryStr = '.' + WORK_CELLS_CLASS + ',.' + ALLDAY_CELLS_CLASS + ',.' + HEADER_CELLS_CLASS;
2067
2071
  let target = closest(e.target, queryStr);
2068
2072
  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')) {
2073
+ if (selectedCells.length > 0 && selectedCells.indexOf(target) === -1) {
2071
2074
  target = selectedCells[selectedCells.length - 1];
2072
2075
  }
2073
2076
  if (this.parent.currentView === 'TimelineYear' && target.classList.contains(OTHERMONTH_CLASS)) {
@@ -3044,15 +3047,35 @@ class Data {
3044
3047
  */
3045
3048
  generateQuery(startDate, endDate) {
3046
3049
  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) {
3050
+ if (this.parent && startDate && endDate) {
3051
+ if (this.parent.activeViewOptions && this.parent.activeViewOptions.enableLazyLoading &&
3052
+ !isNullOrUndefined(this.parent.activeViewOptions.group.resources) &&
3053
+ this.parent.activeViewOptions.group.resources.length > 0 && this.parent.resourceBase &&
3054
+ this.parent.resourceBase.resourceCollection.length > 0 && this.parent.resourceBase.renderedResources.length > 0) {
3055
+ const resIdCollection = [];
3056
+ this.parent.resourceBase.resourceCollection.forEach(() => resIdCollection.push([]));
3057
+ this.parent.resourceBase.renderedResources.forEach((resource) => {
3058
+ resIdCollection.forEach((resId, index) => {
3059
+ const groupId = resource.groupOrder[parseInt(index.toString(), 10)];
3060
+ if (groupId && resId.indexOf(groupId) < 0) {
3061
+ resId.push(groupId);
3062
+ }
3063
+ });
3064
+ });
3065
+ this.parent.resourceBase.resourceCollection.forEach((resource, index) => {
3066
+ query.addParams(resource.field, resIdCollection[parseInt(index.toString(), 10)].toString());
3067
+ });
3068
+ }
3069
+ if (this.parent.timezone) {
3070
+ startDate = this.parent.tzModule.remove(new Date(+startDate.getTime()), this.parent.timezone);
3071
+ endDate = this.parent.tzModule.remove(new Date(+endDate.getTime()), this.parent.timezone);
3072
+ }
3073
+ if (this.parent.eventSettings.includeFiltersInQuery) {
3074
+ const dateQuery = this.getStartEndQuery(startDate, endDate);
3075
+ const recurrenceQuery = new Predicate(this.parent.eventFields.recurrenceRule, 'notequal', null).and(new Predicate(this.parent.eventFields.recurrenceRule, 'notequal', ''));
3076
+ return query.where(dateQuery.or(recurrenceQuery));
3077
+ }
3053
3078
  query.addParams('StartDate', startDate.toISOString());
3054
- }
3055
- if (endDate) {
3056
3079
  query.addParams('EndDate', endDate.toISOString());
3057
3080
  }
3058
3081
  return query;
@@ -9167,6 +9190,9 @@ class QuickPopups {
9167
9190
  'aria-label': this.parent.getAnnouncementString(eventData)
9168
9191
  }
9169
9192
  });
9193
+ if (eventData[fields.isReadonly]) {
9194
+ addClass([appointmentElement], 'e-read-only');
9195
+ }
9170
9196
  let templateElement;
9171
9197
  if (!isNullOrUndefined(this.parent.activeViewOptions.eventTemplate)) {
9172
9198
  const tempId = this.parent.element.id + '_' + this.parent.activeViewOptions.eventTemplateName + 'eventTemplate';
@@ -10258,7 +10284,7 @@ class EventTooltip {
10258
10284
  cssClass: this.parent.cssClass + ' ' + EVENT_TOOLTIP_ROOT_CLASS,
10259
10285
  target: this.getTargets(),
10260
10286
  beforeRender: this.onBeforeRender.bind(this),
10261
- afterClose: this.onTooltipClose.bind(this),
10287
+ beforeClose: this.onTooltipClose.bind(this),
10262
10288
  enableRtl: this.parent.enableRtl,
10263
10289
  enableHtmlSanitizer: this.parent.enableHtmlSanitizer
10264
10290
  });
@@ -10366,7 +10392,11 @@ class EventTooltip {
10366
10392
  }
10367
10393
  this.parent.renderTemplates();
10368
10394
  }
10369
- onTooltipClose() {
10395
+ onTooltipClose(args) {
10396
+ if (args.element) {
10397
+ removeClass([args.element], POPUP_OPEN);
10398
+ addClass([args.element], POPUP_CLOSE);
10399
+ }
10370
10400
  this.parent.resetTemplates(['tooltipTemplate', 'headerTooltipTemplate']);
10371
10401
  }
10372
10402
  setContent(content) {
@@ -11538,40 +11568,54 @@ class EventWindow {
11538
11568
  };
11539
11569
  if (this.parent.isAdaptive) {
11540
11570
  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>';
11571
+ if (!this.parent.editorHeaderTemplate) {
11572
+ dialogModel.header = '<div class="e-title-header"><div class="e-back-icon e-icons"></div><div class="e-title-text">' +
11573
+ this.l10n.getConstant('newEvent') + '</div><div class="e-save-icon e-icons"></div></div>';
11574
+ }
11543
11575
  }
11544
11576
  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>';
11577
+ if (!this.parent.editorFooterTemplate) {
11578
+ this.renderDialogButtons(dialogModel);
11579
+ }
11580
+ if (!this.parent.editorHeaderTemplate) {
11581
+ dialogModel.header = '<div class="e-title-text">' + this.l10n.getConstant('newEvent') + '</div>';
11582
+ }
11562
11583
  }
11563
11584
  this.dialogObject = new Dialog(dialogModel, this.element);
11564
11585
  if (this.dialogObject.element.querySelector('.e-dlg-closeicon-btn')) {
11565
11586
  this.dialogObject.element.querySelector('.e-dlg-closeicon-btn').setAttribute('title', this.l10n.getConstant('close'));
11566
11587
  }
11588
+ this.addEventHandlers();
11567
11589
  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
11590
  EventHandler.add(this.dialogObject.element, 'keydown', this.preventEventSave, this);
11573
11591
  this.applyFormValidation();
11574
11592
  }
11593
+ renderDialogButtons(dialogButton) {
11594
+ dialogButton.buttons = [{
11595
+ buttonModel: {
11596
+ content: this.l10n.getConstant('deleteButton'), cssClass: DELETE_EVENT_CLASS,
11597
+ disabled: !this.parent.eventSettings.allowDeleting || this.parent.readonly
11598
+ },
11599
+ click: this.eventDelete.bind(this)
11600
+ }, {
11601
+ buttonModel: {
11602
+ content: this.l10n.getConstant('saveButton'), cssClass: 'e-primary ' + EVENT_WINDOW_SAVE_BUTTON_CLASS,
11603
+ isPrimary: true, disabled: !this.parent.eventSettings.allowAdding || this.parent.readonly
11604
+ },
11605
+ click: this.eventSave.bind(this)
11606
+ }, {
11607
+ buttonModel: { cssClass: EVENT_WINDOW_CANCEL_BUTTON_CLASS, content: this.l10n.getConstant('cancelButton') },
11608
+ click: this.dialogClose.bind(this)
11609
+ }];
11610
+ }
11611
+ addEventHandlers() {
11612
+ const backIcon = this.element.querySelector('.' + EVENT_WINDOW_BACK_ICON_CLASS);
11613
+ const saveIcon = this.element.querySelector('.' + EVENT_WINDOW_SAVE_ICON_CLASS);
11614
+ if (this.parent.isAdaptive && !isNullOrUndefined(backIcon) && !isNullOrUndefined(saveIcon)) {
11615
+ EventHandler.add(backIcon, 'click', this.dialogClose, this);
11616
+ EventHandler.add(saveIcon, 'click', this.eventSave, this);
11617
+ }
11618
+ }
11575
11619
  refresh() {
11576
11620
  this.destroy(true);
11577
11621
  this.renderEventWindow();
@@ -11615,6 +11659,23 @@ class EventWindow {
11615
11659
  }
11616
11660
  data = eventObj;
11617
11661
  }
11662
+ if (!isNullOrUndefined(this.parent.editorHeaderTemplate)) {
11663
+ this.parent.resetTemplates(['editorHeaderTemplate']);
11664
+ if (this.parent.isAdaptive && !this.parent.editorFooterTemplate) {
11665
+ this.dialogObject.header = this.createAdaptiveHeaderElement(data);
11666
+ }
11667
+ else {
11668
+ this.dialogObject.header = this.getDialogHeader(data);
11669
+ }
11670
+ }
11671
+ if (!isNullOrUndefined(this.parent.editorFooterTemplate)) {
11672
+ this.parent.resetTemplates(['editorFooterTemplate']);
11673
+ this.dialogObject.footerTemplate = this.getDialogFooter(data);
11674
+ }
11675
+ if (!isNullOrUndefined(this.parent.editorHeaderTemplate) || !isNullOrUndefined(this.parent.editorFooterTemplate)) {
11676
+ this.dialogObject.dataBind();
11677
+ this.addEventHandlers();
11678
+ }
11618
11679
  if (!isNullOrUndefined(this.parent.editorTemplate)) {
11619
11680
  this.renderFormElements(this.element.querySelector('.e-schedule-form'), data);
11620
11681
  }
@@ -11645,6 +11706,65 @@ class EventWindow {
11645
11706
  this.dialogObject.dataBind();
11646
11707
  this.applyFormValidation();
11647
11708
  }
11709
+ setDialogHeader() {
11710
+ if (!isNullOrUndefined(this.parent.editorHeaderTemplate)) {
11711
+ this.parent.resetTemplates(['editorHeaderTemplate']);
11712
+ if (this.parent.isAdaptive && !this.parent.editorFooterTemplate) {
11713
+ this.dialogObject.header = this.createAdaptiveHeaderElement();
11714
+ }
11715
+ else {
11716
+ this.dialogObject.header = this.getDialogHeader();
11717
+ }
11718
+ }
11719
+ else if (this.parent.isAdaptive) {
11720
+ this.dialogObject.header = '<div class="e-title-header"><div class="e-back-icon e-icons"></div><div class="e-title-text">' +
11721
+ this.l10n.getConstant('newEvent') + '</div><div class="e-save-icon e-icons"></div></div>';
11722
+ }
11723
+ else {
11724
+ this.dialogObject.header = '<div class="e-title-text">' + this.l10n.getConstant('newEvent') + '</div>';
11725
+ }
11726
+ this.dialogObject.dataBind();
11727
+ this.addEventHandlers();
11728
+ }
11729
+ setDialogFooter() {
11730
+ if (!isNullOrUndefined(this.parent.editorFooterTemplate)) {
11731
+ this.parent.resetTemplates(['editorFooterTemplate']);
11732
+ this.dialogObject.footerTemplate = this.getDialogFooter();
11733
+ }
11734
+ else if (!this.parent.isAdaptive && isNullOrUndefined(this.parent.editorFooterTemplate)) {
11735
+ this.renderDialogButtons(this.dialogObject);
11736
+ }
11737
+ else if (this.parent.isAdaptive && isNullOrUndefined(this.parent.editorFooterTemplate)) {
11738
+ this.dialogObject.footerTemplate = null;
11739
+ }
11740
+ this.dialogObject.dataBind();
11741
+ }
11742
+ createAdaptiveHeaderElement(data) {
11743
+ const header = createElement('div', { className: 'e-title-header' });
11744
+ const headerBackIcon = createElement('div', { className: 'e-back-icon e-icons' });
11745
+ header.appendChild(headerBackIcon);
11746
+ const headerTemplate = this.getDialogHeader(data);
11747
+ header.appendChild(headerTemplate);
11748
+ const headerSaveIcon = createElement('div', { className: 'e-save-icon e-icons' });
11749
+ header.appendChild(headerSaveIcon);
11750
+ return header;
11751
+ }
11752
+ getDialogHeader(args) {
11753
+ let headerTemplate = [];
11754
+ const headerTemplateId = this.parent.element.id + '_editorHeaderTemplate';
11755
+ const temHeaderDiv = document.createElement('div');
11756
+ headerTemplate = [].slice.call(this.parent.getEditorHeaderTemplate()(args || {}, this.parent, 'editorHeaderTemplate', headerTemplateId, false));
11757
+ append(headerTemplate, temHeaderDiv);
11758
+ return temHeaderDiv;
11759
+ }
11760
+ getDialogFooter(args) {
11761
+ let footerTemplate = [];
11762
+ const footerTemplateId = this.parent.element.id + '_editorFooterTemplate';
11763
+ const temFooterDiv = document.createElement('div');
11764
+ footerTemplate = [].slice.call(this.parent.getEditorFooterTemplate()(args || {}, this.parent, 'editorFooterTemplate', footerTemplateId, false));
11765
+ append(footerTemplate, temFooterDiv);
11766
+ return temFooterDiv;
11767
+ }
11648
11768
  preventEventSave(e) {
11649
11769
  if (this.parent && !this.parent.allowKeyboardInteraction && e.code === 'Enter') {
11650
11770
  this.isEnterKey = true;
@@ -11912,9 +12032,9 @@ class EventWindow {
11912
12032
  const resourceDiv = this.createDivElement(value + '-container' + ' ' + 'e-resources');
11913
12033
  const resourceInput = this.createInputElement(value + ' ' + EVENT_FIELD$1, fieldName);
11914
12034
  resourceDiv.appendChild(resourceInput);
11915
- function resourceTemplate(data) {
12035
+ const resourceTemplate = function (data) {
11916
12036
  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
- }
12037
+ };
11918
12038
  initializeCSPTemplate(resourceTemplate, resourceData);
11919
12039
  if (resourceData.allowMultiple) {
11920
12040
  const listObj = new MultiSelect({
@@ -12258,7 +12378,9 @@ class EventWindow {
12258
12378
  this.renderRepeatDialog();
12259
12379
  }
12260
12380
  this.element.querySelector('.' + FORM_CLASS).removeAttribute('data-id');
12261
- this.element.querySelector('.' + EVENT_WINDOW_TITLE_TEXT_CLASS).innerHTML = this.l10n.getConstant('newEvent');
12381
+ if (isNullOrUndefined(this.parent.editorHeaderTemplate)) {
12382
+ this.element.querySelector('.' + EVENT_WINDOW_TITLE_TEXT_CLASS).innerHTML = this.l10n.getConstant('newEvent');
12383
+ }
12262
12384
  eventObj.Timezone = false;
12263
12385
  this.repeatStartDate = eventObj[this.fields.startTime];
12264
12386
  this.repeatRule = '';
@@ -12495,10 +12617,12 @@ class EventWindow {
12495
12617
  if (!this.parent.eventSettings.allowEditing) {
12496
12618
  return;
12497
12619
  }
12498
- if (!this.parent.isAdaptive) {
12620
+ if (!this.parent.isAdaptive && isNullOrUndefined(this.parent.editorFooterTemplate)) {
12499
12621
  removeClass([this.element.querySelector('.' + DELETE_EVENT_CLASS)], DISABLE_CLASS);
12500
12622
  }
12501
- this.element.querySelector('.' + EVENT_WINDOW_TITLE_TEXT_CLASS).innerHTML = this.l10n.getConstant('editEvent');
12623
+ if (isNullOrUndefined(this.parent.editorHeaderTemplate)) {
12624
+ this.element.querySelector('.' + EVENT_WINDOW_TITLE_TEXT_CLASS).innerHTML = this.l10n.getConstant('editEvent');
12625
+ }
12502
12626
  this.element.querySelector('.' + FORM_CLASS).setAttribute('data-id', eventObj[this.fields.id].toString());
12503
12627
  if (isNullOrUndefined(this.parent.editorTemplate)) {
12504
12628
  eventObj = extend({}, eventObj, null, true);
@@ -13300,7 +13424,7 @@ class EventWindow {
13300
13424
  }
13301
13425
  destroy(isIgnore) {
13302
13426
  if (this.parent && !this.parent.isDestroyed) {
13303
- this.parent.resetTemplates(['editorTemplate']);
13427
+ this.parent.resetTemplates(['editorTemplate', 'editorHeaderTemplate', 'editorFooterTemplate']);
13304
13428
  }
13305
13429
  this.destroyComponents();
13306
13430
  if (this.recurrenceEditor) {
@@ -13343,6 +13467,7 @@ class EventWindow {
13343
13467
  }
13344
13468
  }
13345
13469
 
13470
+ /* eslint-disable @typescript-eslint/no-explicit-any */
13346
13471
  /**
13347
13472
  * Virtual Scroll
13348
13473
  */
@@ -13430,6 +13555,16 @@ class VirtualScroll {
13430
13555
  }
13431
13556
  renderEvents() {
13432
13557
  this.setTabIndex();
13558
+ const dynamicData = this.triggerScrollEvent(virtualScrollStop);
13559
+ if (this.parent.activeViewOptions && this.parent.activeViewOptions.enableLazyLoading && this.parent.crudModule) {
13560
+ if (dynamicData.length > 0) {
13561
+ this.parent.crudModule.refreshProcessedData(true, dynamicData);
13562
+ this.parent.hideSpinner();
13563
+ return;
13564
+ }
13565
+ this.parent.crudModule.refreshDataManager();
13566
+ return;
13567
+ }
13433
13568
  if (this.parent.crudModule) {
13434
13569
  this.parent.crudModule.refreshProcessedData(true);
13435
13570
  }
@@ -13465,7 +13600,7 @@ class VirtualScroll {
13465
13600
  resCollection = this.downScroll(conWrap, firstTDIndex);
13466
13601
  }
13467
13602
  if (!isNullOrUndefined(resCollection) && resCollection.length > 0) {
13468
- this.parent.showSpinner();
13603
+ this.triggerScrollEvent(virtualScrollStart);
13469
13604
  const selectedEle = this.parent.getSelectedCells();
13470
13605
  this.focusedEle = selectedEle[selectedEle.length - 1] || this.focusedEle;
13471
13606
  this.updateContent(resWrap, conWrap, eventWrap, resCollection);
@@ -13492,7 +13627,7 @@ class VirtualScroll {
13492
13627
  this.parent.resourceBase.expandedResources[0] !== resCollection[0] ||
13493
13628
  this.parent.resourceBase.expandedResources[this.parent.resourceBase.expandedResources.length - 1] !==
13494
13629
  resCollection[resCollection.length - 1]) {
13495
- this.parent.showSpinner();
13630
+ this.triggerScrollEvent(virtualScrollStart);
13496
13631
  const colLevels = this.parent.activeView.colLevels.slice(0);
13497
13632
  this.updateHorizontalContent(conWrap, resCollection);
13498
13633
  setStyleAttribute(conWrap.querySelector('table'), { transform: `translateX(${this.translateY}px)` });
@@ -13505,6 +13640,29 @@ class VirtualScroll {
13505
13640
  this.timeValue = window.setTimeout(() => { this.renderEvents(); }, 250);
13506
13641
  }
13507
13642
  }
13643
+ triggerScrollEvent(action) {
13644
+ let dynamicData = [];
13645
+ if (!this.parent.activeView) {
13646
+ return dynamicData;
13647
+ }
13648
+ const eventArgs = {
13649
+ startDate: this.parent.activeView.startDate(),
13650
+ endDate: this.parent.activeView.endDate(),
13651
+ startIndex: this.parent.resourceBase.renderedResources[0].groupIndex,
13652
+ endIndex: this.parent.resourceBase.renderedResources[this.parent.resourceBase.renderedResources.length - 1].groupIndex,
13653
+ resourceData: this.parent.resourceBase.renderedResources.map((x) => x.resourceData),
13654
+ name: action
13655
+ };
13656
+ this.parent.trigger(action, eventArgs, (args) => {
13657
+ if (action === virtualScrollStart) {
13658
+ this.parent.showSpinner();
13659
+ }
13660
+ else if (action === virtualScrollStop && !isNullOrUndefined(args.eventData) && args.eventData.length > 0) {
13661
+ dynamicData = args.eventData;
13662
+ }
13663
+ });
13664
+ return dynamicData;
13665
+ }
13508
13666
  upScroll(conWrap, firstTDIndex) {
13509
13667
  let index = 0;
13510
13668
  index = (~~(conWrap.scrollTop / this.itemSize) + Math.ceil(conWrap.clientHeight / this.itemSize)) - this.renderedLength;
@@ -14019,7 +14177,7 @@ class Crud {
14019
14177
  }
14020
14178
  this.parent.trigger(actionFailure, { error: e }, () => this.parent.hideSpinner());
14021
14179
  }
14022
- refreshProcessedData(isVirtualScrollAction = false) {
14180
+ refreshProcessedData(isVirtualScrollAction = false, dynamicEvents) {
14023
14181
  if (this.parent.dragAndDropModule) {
14024
14182
  this.parent.dragAndDropModule.actionObj.action = '';
14025
14183
  removeClass([this.parent.element], 'e-event-action');
@@ -14042,7 +14200,7 @@ class Crud {
14042
14200
  }
14043
14201
  }
14044
14202
  if (isVirtualScrollAction) {
14045
- this.parent.notify(dataReady, { processedData: this.parent.eventsProcessed });
14203
+ this.parent.notify(dataReady, { processedData: dynamicEvents ? this.parent.eventBase.processData(dynamicEvents) : this.parent.eventsProcessed });
14046
14204
  return;
14047
14205
  }
14048
14206
  const eventsData = this.parent.eventsData || [];
@@ -14198,6 +14356,8 @@ class Crud {
14198
14356
  editParams.changedRecords.push(event);
14199
14357
  promise = this.parent.dataModule.dataManager.update(fields.id, event, this.getTable(), this.getQuery());
14200
14358
  }
14359
+ const cloneEvent = extend({}, saveArgs.changedRecords[saveArgs.changedRecords.length - 1], null, true);
14360
+ this.parent.eventBase.selectWorkCellByTime([this.parent.eventBase.processTimezone(cloneEvent)]);
14201
14361
  const crudArgs = {
14202
14362
  requestType: 'eventChanged', cancel: false,
14203
14363
  data: saveArgs.changedRecords, promise: promise, editParams: editParams
@@ -14325,7 +14485,8 @@ class Crud {
14325
14485
  }
14326
14486
  }
14327
14487
  const promise = this.parent.dataModule.dataManager.saveChanges(editParams, fields.id, this.getTable(), this.getQuery());
14328
- this.parent.eventBase.selectWorkCellByTime(occurrenceArgs.changedRecords);
14488
+ const cloneEvent = extend({}, occurrenceArgs.changedRecords[occurrenceArgs.changedRecords.length - 1], null, true);
14489
+ this.parent.eventBase.selectWorkCellByTime(action === 'EditOccurrence' ? [this.parent.eventBase.processTimezone(cloneEvent)] : [cloneEvent]);
14329
14490
  const crudArgs = {
14330
14491
  requestType: action === 'EditOccurrence' ? 'eventChanged' : 'eventRemoved',
14331
14492
  cancel: false, data: isDeletedRecords ? occurrenceArgs.deletedRecords : occurrenceArgs.changedRecords,
@@ -14395,7 +14556,8 @@ class Crud {
14395
14556
  }
14396
14557
  }
14397
14558
  const promise = this.parent.dataModule.dataManager.saveChanges(editParams, fields.id, this.getTable(), this.getQuery());
14398
- this.parent.eventBase.selectWorkCellByTime(followArgs.changedRecords);
14559
+ const cloneEvent = extend({}, followArgs.changedRecords[followArgs.changedRecords.length - 1], null, true);
14560
+ this.parent.eventBase.selectWorkCellByTime(action === 'EditFollowingEvents' ? [this.parent.eventBase.processTimezone(cloneEvent)] : [cloneEvent]);
14399
14561
  const crudArgs = {
14400
14562
  requestType: action === 'EditFollowingEvents' ? 'eventChanged' : 'eventRemoved',
14401
14563
  cancel: false, data: followArgs.changedRecords, promise: promise, editParams: editParams
@@ -14456,7 +14618,8 @@ class Crud {
14456
14618
  }
14457
14619
  }
14458
14620
  const promise = this.parent.dataModule.dataManager.saveChanges(editParams, fields.id, this.getTable(), this.getQuery());
14459
- this.parent.eventBase.selectWorkCellByTime(seriesArgs.changedRecords);
14621
+ const cloneEvent = extend({}, seriesArgs.changedRecords[seriesArgs.changedRecords.length - 1], null, true);
14622
+ this.parent.eventBase.selectWorkCellByTime(action === 'EditSeries' ? [this.parent.eventBase.processTimezone(cloneEvent)] : [cloneEvent]);
14460
14623
  const crudArgs = {
14461
14624
  requestType: action === 'EditSeries' ? 'eventChanged' : 'eventRemoved',
14462
14625
  cancel: false, data: isDeletedRecords ? seriesArgs.deletedRecords : seriesArgs.changedRecords,
@@ -14510,6 +14673,7 @@ class Crud {
14510
14673
  }
14511
14674
  }
14512
14675
  const promise = this.parent.dataModule.dataManager.saveChanges(editParams, fields.id, this.getTable(), this.getQuery());
14676
+ this.parent.eventBase.selectWorkCellByTime(deleteArgs.deletedRecords);
14513
14677
  const crudArgs = {
14514
14678
  requestType: 'eventRemoved', cancel: false, data: deleteArgs.deletedRecords, promise: promise, editParams: editParams
14515
14679
  };
@@ -14550,6 +14714,8 @@ class Crud {
14550
14714
  }
14551
14715
  }
14552
14716
  const promise = this.parent.dataModule.dataManager.saveChanges(editParams, fields.id, this.getTable(), this.getQuery());
14717
+ const cloneEvent = extend({}, editArgs.changedRecords[editArgs.changedRecords.length - 1], null, true);
14718
+ this.parent.eventBase.selectWorkCellByTime([this.parent.eventBase.processTimezone(cloneEvent)]);
14553
14719
  const crudArgs = { requestType: 'eventChanged', cancel: false, data: editArgs.changedRecords, promise: promise, editParams: editParams };
14554
14720
  this.refreshData(crudArgs);
14555
14721
  }
@@ -15344,6 +15510,7 @@ class ResourceBase {
15344
15510
  nodeClicked: this.resourceClick.bind(this),
15345
15511
  created: this.resourceTreeCreated.bind(this)
15346
15512
  });
15513
+ this.treeViewObj.root = this.parent.root ? this.parent.root : this.parent;
15347
15514
  this.treeViewObj.appendTo(resourceTree);
15348
15515
  this.treeViewObj.expandAll();
15349
15516
  this.treePopup = new Popup(treeWrapper, {
@@ -16188,6 +16355,13 @@ let Schedule = class Schedule extends Component {
16188
16355
  this.renderElements(isSetModel);
16189
16356
  }
16190
16357
  }
16358
+ destroyEditorWindow() {
16359
+ if (this.eventWindow) {
16360
+ this.eventWindow.destroy();
16361
+ this.eventWindow = null;
16362
+ }
16363
+ this.eventWindow = new EventWindow(this);
16364
+ }
16191
16365
  /**
16192
16366
  * Method to render the layout elements
16193
16367
  *
@@ -16354,7 +16528,8 @@ let Schedule = class Schedule extends Component {
16354
16528
  headerRows: this.headerRows,
16355
16529
  orientation: 'Horizontal',
16356
16530
  numberOfWeeks: 0,
16357
- displayDate: null
16531
+ displayDate: null,
16532
+ enableLazyLoading: false
16358
16533
  };
16359
16534
  const viewOptions = this.viewCollections[this.viewIndex];
16360
16535
  const viewsData = extend(scheduleOptions, viewOptions, undefined, true);
@@ -16365,6 +16540,11 @@ let Schedule = class Schedule extends Component {
16365
16540
  viewsData.displayDate = viewsData.displayDate instanceof Date ? new Date(viewsData.displayDate.getTime()) :
16366
16541
  new Date(viewsData.displayDate);
16367
16542
  }
16543
+ if (viewsData.enableLazyLoading && !isNullOrUndefined(viewsData.group.resources) && viewsData.group.resources.length > 0 &&
16544
+ (['Agenda', 'MonthAgenda', 'Year', 'TimelineYear'].indexOf(viewsData.option) === -1 ||
16545
+ (viewsData.option === 'TimelineYear' && viewsData.orientation === 'Vertical'))) {
16546
+ viewsData.allowVirtualScrolling = true;
16547
+ }
16368
16548
  return viewsData;
16369
16549
  }
16370
16550
  initializeDataModule() {
@@ -16426,6 +16606,8 @@ let Schedule = class Schedule extends Component {
16426
16606
  this.headerTooltipTemplateFn = this.templateParser(this.activeViewOptions.group.headerTooltipTemplate);
16427
16607
  this.eventTooltipTemplateFn = this.templateParser(this.eventSettings.tooltipTemplate);
16428
16608
  this.editorTemplateFn = this.templateParser(this.editorTemplate);
16609
+ this.editorHeaderTemplateFn = this.templateParser(this.editorHeaderTemplate);
16610
+ this.editorFooterTemplateFn = this.templateParser(this.editorFooterTemplate);
16429
16611
  this.quickInfoTemplatesHeaderFn = this.templateParser(this.quickInfoTemplates.header);
16430
16612
  this.quickInfoTemplatesContentFn = this.templateParser(this.quickInfoTemplates.content);
16431
16613
  this.quickInfoTemplatesFooterFn = this.templateParser(this.quickInfoTemplates.footer);
@@ -17059,6 +17241,24 @@ let Schedule = class Schedule extends Component {
17059
17241
  getEditorTemplate() {
17060
17242
  return this.editorTemplateFn;
17061
17243
  }
17244
+ /**
17245
+ * Method to process editor header template
17246
+ *
17247
+ * @returns {CallbackFunction} Returns the callback function
17248
+ * @private
17249
+ */
17250
+ getEditorHeaderTemplate() {
17251
+ return this.editorHeaderTemplateFn;
17252
+ }
17253
+ /**
17254
+ * Method to process editor footer template
17255
+ *
17256
+ * @returns {CallbackFunction} Returns the callback function
17257
+ * @private
17258
+ */
17259
+ getEditorFooterTemplate() {
17260
+ return this.editorFooterTemplateFn;
17261
+ }
17062
17262
  /**
17063
17263
  * Method to process quick info header template
17064
17264
  *
@@ -17575,6 +17775,22 @@ let Schedule = class Schedule extends Component {
17575
17775
  this.eventWindow.setDialogContent();
17576
17776
  }
17577
17777
  break;
17778
+ case 'editorHeaderTemplate':
17779
+ if (!isNullOrUndefined(this.editorHeaderTemplate)) {
17780
+ this.editorHeaderTemplateFn = this.templateParser(this.editorHeaderTemplate);
17781
+ }
17782
+ if (this.eventWindow) {
17783
+ this.eventWindow.setDialogHeader();
17784
+ }
17785
+ break;
17786
+ case 'editorFooterTemplate':
17787
+ if (!isNullOrUndefined(this.editorFooterTemplate)) {
17788
+ this.editorFooterTemplateFn = this.templateParser(this.editorFooterTemplate);
17789
+ }
17790
+ if (this.eventWindow) {
17791
+ this.eventWindow.setDialogFooter();
17792
+ }
17793
+ break;
17578
17794
  case 'quickInfoTemplates':
17579
17795
  if (this.quickInfoTemplates.header) {
17580
17796
  this.quickInfoTemplatesHeaderFn = this.templateParser(this.quickInfoTemplates.header);
@@ -18340,13 +18556,17 @@ let Schedule = class Schedule extends Component {
18340
18556
  this.quickInfoTemplatesFooterFn = this.templateParser(this.quickInfoTemplates.footer);
18341
18557
  break;
18342
18558
  case 'editorTemplate':
18343
- if (this.eventWindow) {
18344
- this.eventWindow.destroy();
18345
- this.eventWindow = null;
18346
- }
18347
- this.eventWindow = new EventWindow(this);
18559
+ this.destroyEditorWindow();
18348
18560
  this.editorTemplateFn = this.templateParser(this.editorTemplate);
18349
18561
  break;
18562
+ case 'editorHeaderTemplate':
18563
+ this.destroyEditorWindow();
18564
+ this.editorHeaderTemplateFn = this.templateParser(this.editorHeaderTemplate);
18565
+ break;
18566
+ case 'editorFooterTemplate':
18567
+ this.destroyEditorWindow();
18568
+ this.editorFooterTemplateFn = this.templateParser(this.editorFooterTemplate);
18569
+ break;
18350
18570
  case 'tooltipTemplate':
18351
18571
  case 'headerTooltipTemplate':
18352
18572
  if (this.eventTooltip) {
@@ -18820,6 +19040,12 @@ __decorate([
18820
19040
  __decorate([
18821
19041
  Property()
18822
19042
  ], Schedule.prototype, "editorTemplate", void 0);
19043
+ __decorate([
19044
+ Property()
19045
+ ], Schedule.prototype, "editorHeaderTemplate", void 0);
19046
+ __decorate([
19047
+ Property()
19048
+ ], Schedule.prototype, "editorFooterTemplate", void 0);
18823
19049
  __decorate([
18824
19050
  Complex({}, QuickInfoTemplates)
18825
19051
  ], Schedule.prototype, "quickInfoTemplates", void 0);
@@ -18931,6 +19157,12 @@ __decorate([
18931
19157
  __decorate([
18932
19158
  Event()
18933
19159
  ], Schedule.prototype, "resizeStop", void 0);
19160
+ __decorate([
19161
+ Event()
19162
+ ], Schedule.prototype, "virtualScrollStart", void 0);
19163
+ __decorate([
19164
+ Event()
19165
+ ], Schedule.prototype, "virtualScrollStop", void 0);
18934
19166
  __decorate([
18935
19167
  Event()
18936
19168
  ], Schedule.prototype, "dataBound", void 0);
@@ -26982,5 +27214,5 @@ class Print {
26982
27214
  * Export Schedule components
26983
27215
  */
26984
27216
 
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 };
27217
+ 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, 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
27218
  //# sourceMappingURL=ej2-schedule.es2015.js.map