@syncfusion/ej2-schedule 25.1.37 → 25.1.39

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 (64) hide show
  1. package/CHANGELOG.md +10 -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 +92 -13
  6. package/dist/es6/ej2-schedule.es2015.js.map +1 -1
  7. package/dist/es6/ej2-schedule.es5.js +101 -17
  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 +12 -12
  13. package/src/schedule/actions/virtual-scroll.d.ts +2 -0
  14. package/src/schedule/actions/virtual-scroll.js +24 -1
  15. package/src/schedule/base/css-constant.d.ts +2 -0
  16. package/src/schedule/base/css-constant.js +2 -0
  17. package/src/schedule/base/interface.d.ts +1 -0
  18. package/src/schedule/base/resource.js +1 -0
  19. package/src/schedule/base/schedule.d.ts +1 -0
  20. package/src/schedule/base/schedule.js +20 -4
  21. package/src/schedule/event-renderer/month.js +1 -2
  22. package/src/schedule/event-renderer/timeline-view.js +17 -5
  23. package/src/schedule/event-renderer/vertical-view.js +11 -1
  24. package/src/schedule/popups/quick-popups.js +3 -1
  25. package/src/schedule/renderer/header-renderer.js +3 -2
  26. package/src/schedule/renderer/renderer.js +1 -0
  27. package/src/schedule/renderer/timeline-year.js +4 -1
  28. package/src/schedule/renderer/vertical-view.js +14 -0
  29. package/src/schedule/renderer/view-base.js +1 -1
  30. package/styles/bootstrap-dark.css +8 -1
  31. package/styles/bootstrap.css +8 -1
  32. package/styles/bootstrap4.css +8 -1
  33. package/styles/bootstrap5-dark.css +8 -1
  34. package/styles/bootstrap5.css +8 -1
  35. package/styles/fabric-dark.css +8 -1
  36. package/styles/fabric.css +8 -1
  37. package/styles/fluent-dark.css +8 -1
  38. package/styles/fluent.css +8 -1
  39. package/styles/highcontrast-light.css +8 -1
  40. package/styles/highcontrast.css +8 -1
  41. package/styles/material-dark.css +8 -1
  42. package/styles/material.css +8 -1
  43. package/styles/material3-dark.css +8 -1
  44. package/styles/material3.css +8 -1
  45. package/styles/schedule/_layout.scss +18 -1
  46. package/styles/schedule/bootstrap-dark.css +8 -1
  47. package/styles/schedule/bootstrap.css +8 -1
  48. package/styles/schedule/bootstrap4.css +8 -1
  49. package/styles/schedule/bootstrap5-dark.css +8 -1
  50. package/styles/schedule/bootstrap5.css +8 -1
  51. package/styles/schedule/fabric-dark.css +8 -1
  52. package/styles/schedule/fabric.css +8 -1
  53. package/styles/schedule/fluent-dark.css +8 -1
  54. package/styles/schedule/fluent.css +8 -1
  55. package/styles/schedule/highcontrast-light.css +8 -1
  56. package/styles/schedule/highcontrast.css +8 -1
  57. package/styles/schedule/material-dark.css +8 -1
  58. package/styles/schedule/material.css +8 -1
  59. package/styles/schedule/material3-dark.css +8 -1
  60. package/styles/schedule/material3.css +8 -1
  61. package/styles/schedule/tailwind-dark.css +8 -1
  62. package/styles/schedule/tailwind.css +8 -1
  63. package/styles/tailwind-dark.css +8 -1
  64. package/styles/tailwind.css +8 -1
@@ -557,6 +557,8 @@ const RTL = 'e-rtl';
557
557
  /** @private */
558
558
  const DEVICE_CLASS = 'e-device';
559
559
  /** @private */
560
+ const ADAPTIVE_CLASS = 'e-adaptive';
561
+ /** @private */
560
562
  const MULTI_DRAG = 'e-multi-drag';
561
563
  /** @private */
562
564
  const ICON = 'e-icons';
@@ -1084,6 +1086,7 @@ class HeaderRenderer {
1084
1086
  });
1085
1087
  this.toolbarObj.root = this.parent.root ? this.parent.root : this.parent;
1086
1088
  this.toolbarObj.appendTo(this.parent.element.querySelector('.' + HEADER_TOOLBAR));
1089
+ this.toolbarObj.element.setAttribute('aria-label', 'Scheduler');
1087
1090
  const prevNavEle = this.toolbarObj.element.querySelector('.e-prev');
1088
1091
  if (prevNavEle) {
1089
1092
  prevNavEle.firstElementChild.setAttribute('title', this.l10n.getConstant('previous'));
@@ -1269,7 +1272,7 @@ class HeaderRenderer {
1269
1272
  switch (item.name) {
1270
1273
  case 'Today':
1271
1274
  tbItem = {
1272
- showAlwaysInPopup: (this.parent.isAdaptive || this.parent.enableAdaptiveUI), prefixIcon: 'e-icon-day',
1275
+ showAlwaysInPopup: (this.parent.isAdaptive || this.parent.enableAdaptiveUI), prefixIcon: 'e-icon-today',
1273
1276
  text: this.l10n.getConstant('today'), cssClass: 'e-today', overflow: 'Show'
1274
1277
  };
1275
1278
  tbItem.align = propItem.align ? propItem.align : item.align;
@@ -1355,7 +1358,7 @@ class HeaderRenderer {
1355
1358
  }
1356
1359
  else {
1357
1360
  items.push({
1358
- align: 'Right', showAlwaysInPopup: (this.parent.isAdaptive || this.parent.enableAdaptiveUI), prefixIcon: 'e-icon-day',
1361
+ align: 'Right', showAlwaysInPopup: (this.parent.isAdaptive || this.parent.enableAdaptiveUI), prefixIcon: 'e-icon-today',
1359
1362
  text: this.l10n.getConstant('today'), cssClass: 'e-today', overflow: 'Show'
1360
1363
  });
1361
1364
  if (this.parent.views.length > 1) {
@@ -6751,6 +6754,14 @@ class VerticalEvent extends EventBase {
6751
6754
  const wrapperElements = [].slice.call(this.parent.element.querySelectorAll('.' + BLOCK_APPOINTMENT_CLASS +
6752
6755
  ',.' + APPOINTMENT_CLASS + ',.' + ROW_COUNT_WRAPPER_CLASS));
6753
6756
  const isDragging = (this.parent.crudModule && this.parent.crudModule.crudObj.isCrudAction) ? true : false;
6757
+ const hideWrapper = (wrapper) => {
6758
+ if (this.parent.isReact && !isNullOrUndefined(this.parent.activeViewOptions.eventTemplate)) {
6759
+ const appWrapper = closest(wrapper, '.' + DAY_WRAPPER_CLASS + ',.' + ALLDAY_APPOINTMENT_WRAPPER_CLASS);
6760
+ if (appWrapper && !appWrapper.classList.contains(APPOINTMENT_WRAPPER_HIDDEN_CLASS)) {
6761
+ addClass([appWrapper], APPOINTMENT_WRAPPER_HIDDEN_CLASS);
6762
+ }
6763
+ }
6764
+ };
6754
6765
  for (const wrapper of wrapperElements) {
6755
6766
  if (isDragging && !(wrapper.classList.contains(ALLDAY_APPOINTMENT_CLASS) ||
6756
6767
  wrapper.classList.contains(ROW_COUNT_WRAPPER_CLASS))) {
@@ -6758,11 +6769,13 @@ class VerticalEvent extends EventBase {
6758
6769
  for (let j = 0, len = this.parent.crudModule.crudObj.sourceEvent.length; j < len; j++) {
6759
6770
  if (groupIndex === this.parent.crudModule.crudObj.sourceEvent[parseInt(j.toString(), 10)].groupIndex ||
6760
6771
  groupIndex === this.parent.crudModule.crudObj.targetEvent[parseInt(j.toString(), 10)].groupIndex) {
6772
+ hideWrapper(wrapper);
6761
6773
  remove(wrapper);
6762
6774
  }
6763
6775
  }
6764
6776
  }
6765
6777
  else {
6778
+ hideWrapper(wrapper);
6766
6779
  remove(wrapper);
6767
6780
  }
6768
6781
  }
@@ -8174,8 +8187,7 @@ class MonthEvent extends EventBase {
8174
8187
  attrs: {
8175
8188
  'role': 'button',
8176
8189
  'tabindex': '0',
8177
- 'aria-label': this.parent.globalize.formatNumber(count) + '&nbsp;'
8178
- + (this.parent.isAdaptive ? '' : this.parent.localeObj.getConstant('more')),
8190
+ 'aria-label': this.parent.globalize.formatNumber(count) + ' ' + this.parent.localeObj.getConstant('moreEvents'),
8179
8191
  'data-count': count.toString(),
8180
8192
  'data-start-date': startDate.getTime().toString(),
8181
8193
  'data-end-date': endDate.getTime().toString()
@@ -8282,8 +8294,16 @@ class TimelineEvent extends MonthEvent {
8282
8294
  const appointments = [];
8283
8295
  for (const app of appointmentsCollection) {
8284
8296
  if (this.renderType === 'day') {
8285
- if ((resetTime(app[this.fields.startTime]).getTime() <= resetTime(new Date(startDate.getTime())).getTime()) &&
8286
- (resetTime(app[this.fields.endTime]).getTime() >= resetTime(new Date(startDate.getTime())).getTime())) {
8297
+ const start = resetTime(startDate).getTime();
8298
+ const end = resetTime(endDate).getTime();
8299
+ const appStart = resetTime(app[this.fields.startTime]).getTime();
8300
+ const appEnd = resetTime(app[this.fields.endTime]).getTime();
8301
+ const isEndOverlap = () => {
8302
+ let endTime = (end - (getDateInMs(endDate) <= 0 ? MS_PER_DAY : 0));
8303
+ endTime = start > endTime ? start : endTime;
8304
+ return appEnd >= endTime && appStart <= endTime;
8305
+ };
8306
+ if (appStart <= start && appEnd >= start || isEndOverlap() || appStart > start && appEnd < end) {
8287
8307
  appointments.push(app);
8288
8308
  }
8289
8309
  }
@@ -9156,7 +9176,7 @@ class QuickPopups {
9156
9176
  renderMorePopup() {
9157
9177
  const moreEventPopup = `<div class="${MORE_EVENT_POPUP_CLASS}"><div class="${MORE_EVENT_HEADER_CLASS}">` +
9158
9178
  `<div class="${MORE_EVENT_CLOSE_CLASS}" title="${this.l10n.getConstant('close')}" tabindex="0" role="button"></div>` +
9159
- `<div class="${MORE_EVENT_DATE_HEADER_CLASS}"><div class="${MORE_EVENT_HEADER_DAY_CLASS}"></div>` +
9179
+ `<div class="${MORE_EVENT_DATE_HEADER_CLASS}"><div class="${MORE_EVENT_HEADER_DAY_CLASS}" id="${this.parent.element.id}_more_popup"></div>` +
9160
9180
  `<div class="${MORE_EVENT_HEADER_DATE_CLASS} ${NAVIGATE_CLASS}" tabindex="0" role="link"></div></div></div></div>`;
9161
9181
  const moreEventWrapper = createElement('div', {
9162
9182
  className: MORE_POPUP_WRAPPER_CLASS + ' e-popup-close',
@@ -9181,6 +9201,8 @@ class QuickPopups {
9181
9201
  viewPortElement: (this.parent.isAdaptive ? document.body : this.parent.element),
9182
9202
  zIndex: (this.parent.isAdaptive ? 1002 : 2)
9183
9203
  });
9204
+ this.morePopup.element.setAttribute('role', 'dialog');
9205
+ this.morePopup.element.setAttribute('aria-labelledby', this.parent.element.id + '_more_popup');
9184
9206
  const closeButton = this.morePopup.element.querySelector('.' + MORE_EVENT_CLOSE_CLASS);
9185
9207
  this.renderButton('e-round', ICON + ' ' + CLOSE_ICON_CLASS, false, closeButton, this.closeClick);
9186
9208
  EventHandler.add(this.morePopup.element.querySelector('.' + MORE_EVENT_HEADER_DATE_CLASS), 'click', this.navigationClick, this);
@@ -13798,6 +13820,27 @@ class VirtualScroll {
13798
13820
  this.itemSize = getElementHeightFromClass(this.parent.activeView.element, WORK_CELLS_CLASS) || this.itemSize;
13799
13821
  }
13800
13822
  }
13823
+ refreshLayout() {
13824
+ const initialHeight = this.parent.uiStateValues.scheduleHeight;
13825
+ this.parent.uiStateValues.scheduleHeight = this.parent.element.offsetHeight;
13826
+ const preRenderedLength = this.renderedLength;
13827
+ if (this.parent.uiStateValues.scheduleHeight !== initialHeight) {
13828
+ if (preRenderedLength < this.getRenderedCount()) {
13829
+ this.isRemoteRefresh = true;
13830
+ }
13831
+ const resWrap = this.parent.element.querySelector('.' + RESOURCE_COLUMN_WRAP_CLASS);
13832
+ const conWrap = this.parent.element.querySelector('.' + CONTENT_WRAP_CLASS);
13833
+ const eventWrap = this.parent.element.querySelector('.' + EVENT_TABLE_CLASS);
13834
+ let firstTDIndex = parseInt(resWrap.querySelector('tbody td').getAttribute('data-group-index'), 10);
13835
+ const endIndex = (firstTDIndex + this.renderedLength);
13836
+ firstTDIndex = (endIndex > this.parent.resourceBase.expandedResources.length) ?
13837
+ (this.parent.resourceBase.expandedResources.length - this.renderedLength) : firstTDIndex;
13838
+ this.parent.resourceBase.renderedResources = this.parent.resourceBase.expandedResources.slice(firstTDIndex, endIndex);
13839
+ if (this.parent.resourceBase.renderedResources.length > 0) {
13840
+ this.updateContent(resWrap, conWrap, eventWrap, this.parent.resourceBase.renderedResources);
13841
+ }
13842
+ }
13843
+ }
13801
13844
  renderEvents() {
13802
13845
  this.setTabIndex();
13803
13846
  const dynamicData = this.triggerScrollEvent(virtualScrollStop);
@@ -13832,7 +13875,9 @@ class VirtualScroll {
13832
13875
  const eventWrap = this.parent.element.querySelector('.' + EVENT_TABLE_CLASS);
13833
13876
  const timeIndicator = this.parent.element.querySelector('.' + CURRENT_TIMELINE_CLASS);
13834
13877
  const conTable = this.parent.element.querySelector('.' + CONTENT_TABLE_CLASS);
13835
- addClass([conWrap], 'e-transition');
13878
+ if (!this.parent.rowAutoHeight) {
13879
+ addClass([conWrap, resWrap], 'e-transition');
13880
+ }
13836
13881
  this.renderedLength = resWrap.querySelector('tbody').children.length;
13837
13882
  const firstTDIndex = parseInt(resWrap.querySelector('tbody td').getAttribute('data-group-index'), 10);
13838
13883
  const scrollHeight = this.parent.rowAutoHeight ?
@@ -14226,6 +14271,7 @@ class Render {
14226
14271
  }
14227
14272
  throw Error('Inject required modules');
14228
14273
  }
14274
+ this.parent.uiStateValues.scheduleHeight = this.parent.element.offsetHeight;
14229
14275
  this.parent.activeView.viewIndex = this.parent.viewIndex;
14230
14276
  this.updateLabelText(viewName);
14231
14277
  this.parent.activeView.addEventListener();
@@ -15914,6 +15960,7 @@ class ResourceBase {
15914
15960
  args = {
15915
15961
  cancel: false, event: (event) ? event.event : null, groupIndex: this.parent.uiStateValues.groupIndex, requestType: 'resourceChanged'
15916
15962
  };
15963
+ this.parent.adaptiveGroupIndex = this.parent.uiStateValues.groupIndex;
15917
15964
  this.parent.trigger(actionComplete, args);
15918
15965
  }
15919
15966
  });
@@ -16570,6 +16617,7 @@ let Schedule = class Schedule extends Component {
16570
16617
  */
16571
16618
  constructor(options, element) {
16572
16619
  super(options, element);
16620
+ this.adaptiveGroupIndex = 0;
16573
16621
  }
16574
16622
  /**
16575
16623
  * Core method that initializes the control rendering.
@@ -16593,6 +16641,12 @@ let Schedule = class Schedule extends Component {
16593
16641
  else {
16594
16642
  removeClasses.push(DEVICE_CLASS);
16595
16643
  }
16644
+ if (this.enableAdaptiveUI) {
16645
+ addClasses.push(ADAPTIVE_CLASS);
16646
+ }
16647
+ else {
16648
+ removeClasses.push(ADAPTIVE_CLASS);
16649
+ }
16596
16650
  if (this.allowMultiDrag) {
16597
16651
  addClasses.push(MULTI_DRAG);
16598
16652
  }
@@ -17194,7 +17248,7 @@ let Schedule = class Schedule extends Component {
17194
17248
  if (this && isNullOrUndefined(this.uiStateValues) || !(this.enablePersistence)) {
17195
17249
  this.uiStateValues = {
17196
17250
  expand: false, isInitial: true, left: 0, top: 0, isGroupAdaptive: false,
17197
- isIgnoreOccurrence: false, groupIndex: 0, action: false, isBlock: false, isCustomMonth: true, isPreventTimezone: false
17251
+ isIgnoreOccurrence: false, groupIndex: this.adaptiveGroupIndex, action: false, isBlock: false, isCustomMonth: true, isPreventTimezone: false
17198
17252
  };
17199
17253
  }
17200
17254
  this.currentTimezoneDate = this.getCurrentTime();
@@ -17686,6 +17740,9 @@ let Schedule = class Schedule extends Component {
17686
17740
  && document.activeElement.classList.contains(SUBJECT_CLASS))) {
17687
17741
  return;
17688
17742
  }
17743
+ if (this.virtualScrollModule && this.activeView.isTimelineView()) {
17744
+ this.virtualScrollModule.refreshLayout();
17745
+ }
17689
17746
  if (this.activeViewOptions.timeScale.enable && this.activeView) {
17690
17747
  this.activeView.highlightCurrentTime();
17691
17748
  }
@@ -17697,7 +17754,12 @@ let Schedule = class Schedule extends Component {
17697
17754
  && !this.activeViewOptions.timeScale.enable) || this.activeView.isTimelineView()) {
17698
17755
  this.activeView.resetColWidth();
17699
17756
  this.notify(scrollUiUpdate, { cssProperties: this.getCssProperties(), isPreventScrollUpdate: true });
17700
- this.refreshEvents(false);
17757
+ let isRemoteRefresh = false;
17758
+ if (this.activeViewOptions.enableLazyLoading && this.virtualScrollModule && this.virtualScrollModule.isRemoteRefresh) {
17759
+ isRemoteRefresh = this.virtualScrollModule.isRemoteRefresh;
17760
+ this.virtualScrollModule.isRemoteRefresh = false;
17761
+ }
17762
+ this.refreshEvents(isRemoteRefresh);
17701
17763
  }
17702
17764
  else {
17703
17765
  this.notify(contentReady, {});
@@ -17880,7 +17942,7 @@ let Schedule = class Schedule extends Component {
17880
17942
  * @private
17881
17943
  */
17882
17944
  getPersistData() {
17883
- return this.addOnPersist(['currentView', 'selectedDate', 'scrollTop', 'scrollLeft']);
17945
+ return this.addOnPersist(['currentView', 'selectedDate', 'scrollTop', 'scrollLeft', 'adaptiveGroupIndex']);
17884
17946
  }
17885
17947
  /**
17886
17948
  * Called internally, if any of the property value changed.
@@ -22881,7 +22943,7 @@ class ViewBase {
22881
22943
  const colWidth = (getElementWidth(contentBody) / (colElements.length / 2));
22882
22944
  if (content.offsetHeight !== content.clientHeight) {
22883
22945
  const resourceColumn = this.parent.element.querySelector('.' + RESOURCE_COLUMN_WRAP_CLASS);
22884
- if (!isNullOrUndefined(resourceColumn)) {
22946
+ if (!isNullOrUndefined(resourceColumn) && resourceColumn.offsetHeight !== content.clientHeight) {
22885
22947
  setStyleAttribute(resourceColumn, { 'height': formatUnit(content.clientHeight) });
22886
22948
  }
22887
22949
  }
@@ -23698,6 +23760,20 @@ class VerticalView extends ViewBase {
23698
23760
  append(tooltipTemplate, ntd);
23699
23761
  }
23700
23762
  ntd.setAttribute('data-date', cellDate.getTime().toString());
23763
+ const skeleton = 'full';
23764
+ if (!this.parent.activeViewOptions.timeScale.enable) {
23765
+ const announcementText = this.parent.globalize.formatDate(tdData.date, { skeleton: skeleton, calendar: this.parent.getCalendarMode() });
23766
+ ntd.setAttribute('aria-label', announcementText);
23767
+ }
23768
+ else {
23769
+ const startDateText = this.parent.globalize.formatDate(cellDate, {
23770
+ type: 'dateTime', skeleton: skeleton, calendar: this.parent.getCalendarMode()
23771
+ });
23772
+ const endDateText = this.parent.globalize.formatDate(this.getEndDateFromStartDate(cellDate), {
23773
+ type: 'dateTime', skeleton: skeleton, calendar: this.parent.getCalendarMode()
23774
+ });
23775
+ ntd.setAttribute('aria-label', startDateText + ' ' + this.parent.localeObj.getConstant('endAt') + ' ' + endDateText);
23776
+ }
23701
23777
  if (!isNullOrUndefined(tdData.groupIndex) || this.parent.uiStateValues.isGroupAdaptive) {
23702
23778
  const groupIndex = this.parent.uiStateValues.isGroupAdaptive ? this.parent.uiStateValues.groupIndex :
23703
23779
  tdData.groupIndex;
@@ -26924,11 +27000,14 @@ class TimelineYear extends Year {
26924
27000
  groupIndex = this.colLevels.slice(-1)[0][parseInt(month.toString(), 10)].groupIndex;
26925
27001
  classList$$1.push(WORKDAY_CLASS);
26926
27002
  }
27003
+ const startDateText = this.parent.globalize.formatDate(date, { type: 'dateTime', skeleton: 'full', calendar: this.parent.getCalendarMode() });
27004
+ const endDateText = this.parent.globalize.formatDate(this.parent.calendarUtil.getMonthEndDate(new Date(monthDate.getTime())), { type: 'dateTime', skeleton: 'full', calendar: this.parent.getCalendarMode() });
26927
27005
  const td = createElement('td', {
26928
27006
  className: WORK_CELLS_CLASS,
26929
27007
  attrs: {
26930
27008
  'aria-selected': 'false',
26931
- 'data-date': date.getTime().toString()
27009
+ 'data-date': date.getTime().toString(),
27010
+ 'aria-label': startDateText + ' ' + this.parent.localeObj.getConstant('endAt') + ' ' + endDateText
26932
27011
  }
26933
27012
  });
26934
27013
  addClass([td], classList$$1);